MC 102 – Algoritmos e programação de computadores Profa ...wmamaral/mc102/files/aula... · Note...
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));
}