MC 102 – Algoritmos e programação de computadores Profa ...wmamaral/mc102/files/aula... · Note...

Post on 23-Jul-2020

8 views 0 download

Transcript of MC 102 – Algoritmos e programação de computadores Profa ...wmamaral/mc102/files/aula... · Note...

MC 102 – Algoritmos e programação de computadoresProfa. Wanessa Machado do Amaral

Aula 23 – Registros ou estruturas

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Registos

Um registro é um tipo de variável composta.

É uma variavel que contém diversas variáveis(chamadas de campos), usualmente de tipos diferentes, mas que dentro de um determinado contexto fazem sentido se agrupadas. Exemplos:

● Registro de alunos (nome, RA, medias de provas, medias de labs, etc...)

●Registro de pacientes (Nome, endereco, historico de doencas, etc...)

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Registos

Motivação do uso de registros:

quando há necessidade de guardar informação de vários tipos numa só entidade (ou struct).

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Declaração de um registro

A primeira parte da criação de um registro é declarar seuformato. Isso é feito utilizando a palavra chave struct, daseguinte forma:

struct registroAluno {int ra;int idade;char nome[];float media;

};

Declaração de uma variável do registro

A proxima etapa é declarar uma variavel do tipo struct nome_do_tipo_da_estrutura, que será usada dentro de seu programa, como no exemplo abaixo:

#include <stdio.h>

struct ficha { int ra; float media;

};main () {

struct ficha f;}

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Acessando campos do registro

Podemos acessar individualmente os campos de umdeterminado registro, utilizando a seguinte estrutura:

nome_do_registro.nome_do_campo

Exemplo: struct ficha {

int ra; float media;

};main () {

struct ficha f;f.ra = 012345;

}MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Acessando campos do registro

Ler conteúdo:printf ("Digite o ra do aluno: ");scanf ("%d", &f.ra);

Exibir conteúdo:printf ("O aluno %d tirou media %f\n", f.ra, f.media);

Copiar conteúdo entre dois registros:registro_1 = registro_2

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Inicialização do registro

struct Cliente{char nome[100];char endereco[100];long telefone;} ;

main(){ struct Cliente x = {"Maria José", "Rua 12, nº 2, 3500-089 Campinas", 232456719};

printf("%s %s %ld", x.nome, x.endereco, x.telefone);}

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Diferenças entre vetores e structs

Nos registros, ao contrário dos arrays, os elementos não são necessariamente do mesmo tipo.

Os elementos de um registro não são indexados, como num array. O acesso é feito pelos identificadores (membros) e não por índices.

Ex: f.ra = 012345;

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Registros como parâmetros de funçõesAssim como os outros tipos de dados, float, int, etc... os registros podem ser recebidos como parâmetros de funções:

void incluir(struct Cliente reg, char nome[100]){ strcpy(reg.nome,nome);}

Também é possível uma função retornar um tipo struct:

struct Cliente incluir(struct Cliente reg, char nome[100]){ strcpy(reg.nome,nome); return reg;}

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Registros como parâmetros de funções#include <stdio.h>struct Cliente{char nome[100];char endereco[100];};

struct Cliente incluirRegistro(struct Cliente reg){ strcpy(reg.nome,"Maria"); strcpy(reg.endereco,"Campinas"); return reg;}main(){ struct Cliente x; x = incluirRegistro(x); printf("%s %s", x.nome, x.endereco);} MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Passagem de registros por referênciaAs funções podem receber os registros tanto como valor, como o exemplo anterior, como por referência.

Exemplo:

incluirRegistro(struct Cliente *reg){

strcpy(reg->nome,"Maria"); strcpy(reg->endereco,"Campinas");

}

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Passagem de registros por referência#include <stdio.h>struct Cliente{char nome[100];char endereco[100];};

incluirRegistro(struct Cliente *reg){ strcpy(reg->nome,"Maria"); strcpy(reg->endereco,"Campinas");}

main(){ struct Cliente x; incluirRegistro(&x); printf("%s %s", x.nome, x.endereco);} MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Vetor de registros

Pode ser declarado quando necessitarmos de diversas copias de um registro (por exemplo, para cadastrar todos os alunos de uma mesma turma).

struct ficha { int ra; float media;

};main () {

struct ficha f[5];f[0].ra = 012345;f[0].media = 9.5;

}

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

ExercíciosDada a estrutura de registros de alunos:struct ficha {

long ra; char nome[100];float CR; };

Considere um vetor de registros do tipo ficha:struct ficha alunos[10];

Crie funções (passando parametros por referência) que:1) inclua um novo registro no vetor.2) altere um registro do vetor.3) imprima na tela todos os registros do vetor.

Obs: use somente variáveis locais.Todos os scanfs devem estar na função main.

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

MC 102 – Algoritmos e programação de computadoresProfa. Wanessa Machado do Amaral

Aula 23 – Enumeration

Enumeration

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Enum é um tiop de dados criado pelo programador, com valores pré-definidos por ele.

São utilizados para aumentar a legibilidade do código.

Um enumeration consiste num conjunto de constantes inteiras, chamados de membros, que recebem um nome.

Ex:

enum DAY {saturday, sunday, monday, tuesday, wednesday, thursday, friday } workday;

Enumeration

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Uma variável do tipo enumeration armazena um dos valores inteiros do conjunto, associado a um dos membros.

enum DAY {saturday, sunday, monday, tuesday, wednesday, thursday, friday } workday;

No exemplo acima, por padrão, 0 é o inteiro associado a saturday. Os demais identificadores são numerados automaticamente. Ex: wednesday é associado a 4. Com esta sintaxe, já é declarada uma variável workday do tipo enum DAY.

Enumeration

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Exemplos:

enum cor {red, blue, green, yellow};

enum dia {domingo, 2f, 3f, 4f, 5f, 6f,sabado};

enum fruta {apple, orange=10, lemon};

enum boolean {FALSE, TRUE};

Enumeration

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Declaração e atribuição de uma variável do tipo enumeration:

enum DAY today = wednesday;

Também é possível atribuir o inteiro correspondente à constante, por exemplo:

enum DAY today;today = ( enum DAY ) ( 4);

Enumeration

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Vantagens do uso de enum:

int main(){enum cores corDaJanela = amarela;if (corDaJanela == verde)

...}

Exemplo

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

#include <stdio.h>int main(int argc, char* argv[]){

enum MES { janeiro=1, fevereiro, marco,

abril, maio, junho, julho,agosto, setembro, outubro,novembro, dezembro };

enum MES mesCorrente = dezembro;printf ("%d", mesCorrente);

}// atribui explicitamente valor 1 a janeiro. Por default, janeiro seria 0

Exemplo 2

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

#include <stdio.h>enum boolean {FALSE,TRUE};main(){ enum boolean b; int x=3,y=2; b = x > y; if (b==TRUE) printf("Verdadeiro");}

Enumeration

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Note que os nomes dos membros só são utilizados para facilitar atribuição das variáveis, comparações, e demais operações.

Para imprimir o valor de uma variável enum, você deve tratá-la como um inteiro, usando %d no printf.

Se você quiser imprimir a string correspondente, tem que criar uma função para isso.

Enumeration

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

#include <stdio.h>enum DIAS { domingo, segunda, terca, quarta, quinta, sexta, sabado };

char *tipo_para_string(enum DIAS x) {if (x == domingo)

return "domingo";else if (x == segunda)

return "segunda";}int main(){

enum DIAS hoje = segunda;printf ("%s", tipo_para_string(hoje));

}