Estrutura (struct) Estrutura (struct)- declaração Uma struct é uma variável composta heterogênea Visa facilitar manipulação de um conjunto de dados logicamente relacionados, mas de diferentes tipos. Exemplo: Considere um registro de alunos, com RA, nome, CR, sexo, e endereço (composto por rua, número, cidade). RA nome 07234 Monica Santos RA nome 07234 Monica Santos CR sexo endereço 0,73 F R. Dois, 321. Rio Claro CR sexo 0.73 F Passo1: definir a estrutura Forma geral: struct <nome_estrutura> { <tipo_de_dados> <nome da variável>; <tipo_de_dados> <nome da variável>; <tipo_de_dados> <nome da variável>; ... } RA nome Exemplo struct cadastro { 07234 Monica Santos int ra; char nome[50]; float CR; char sexo; char endereço[20]; }; endereço rua no. cidade R. Dois 321 Rio Claro 1 Exemplo struct cadastro { char ra[6]; char nome[50]; float CR; char sexo; char endereco[20]; } aluno, ex_aluno; endereço R. Dois, 321. Rio Claro 2 Estrutura (struct)- declaração Mais uma forma de declaração de uma struct dando nome à struct O mesmo que Typedef struct tipo_data{ int dia, mes, ano; } DATA; struct tipo_data{ int dia, mes, ano; }; typedef struct tipo_data DATA; /* data é o nome do tipo */ Podemos utilizar esse tipo para declarar variáveis int X, Y, Z; 3 Estrutura (struct) - Utilização Cada campo pode ser acessado escrevendo-se: nome da variável, um ponto (.) e o nome do campo. Sintaxe: nome_variável • nome_campo; Considerando a definição: struct cadastro { char ra[6]; char nome[50]; float CR; char sexo; } aluno; F Passo2: declarar as variáveis que terão esta estrutura Forma geral: struct <nome_estrutura> <nome_variável>; Exemplo: struct cadastro aluno, ex_aluno; Estrutura (struct) - declaração • Outra possibilidade de declarar a estrutura e as variáveis em apenas um passo: Forma geral: struct <nome_estrutura> { <tipo_de_dados> <nome da variável>; <tipo_de_dados> <nome da variável>; <tipo_de_dados> <nome da variável>; ... } nome_variável 1, nome variável 2, . . . Nome variável n; CR sexo 0,73 Exemplos.: aluno••CR = 0.75; aluno••sexo = ‘F’; aluno••ra = 71234; /* Para atribuição de string usar a função strcpy da biblioteca string.h */ strcpy(aluno••nome, “Soraya”); OBS: Se o campo char for de mais de um elemento (vetor de strings), cada um dos elementos pode ser acessado pelo seu índice. Exemplos: printf(“%c”, aluno.nome[2]); /* exibe a letra r de Soraya */ aluno.nome[4] = ‘i'; /* troca a letra y pela letra i em Soraya*/ 5 DATA data_nasc; DATA *d; /* d é um ponteiro para uma variável do tipo DATA */ 4 Atribuição de Estruturas - Utilização Variáveis com mesma estrutura podem ser igualadas. Considere como exemplo: struct coordenadas { int x, y, z; } variavel1, variavel2 = {1, 2, 3}; /* variável2 é inicializada*/ Como variavel1 e variavel2 têm a mesma estrutura pode-se atribuir os valores dos campos da variável2 para a variável1, como segue: variavel1= variavel2; Atribuição anterior possui o mesmo efeito que: variavel1.x = variavel2.x; variavel1.y = variavel2.y; variavel1.z = variavel2.z; 6 Exemplo #include <stdio.h> int main () { struct coordenadas { int x, y, z; } variavel1; Vetores de Estruturas Comando de definição de uma estrutura deve aparecer antes da declaração de variáveis struct coordenadas variavel2 = {1, 2, 0}; variavel1 = variavel2; /* Comando de atribuição */ Exemplo: struct cadastro { int ra; char nome[50]; int num_curso, ano_ingresso; float CR; } aluno, alunos[500]; aluno valor para um aluno. Essa variável pode ser usada para guardar o valor de um dos registros alunos valores para vários alunos ra printf ("x= %d y= %d z= %d \n", variavel1.x, variavel1.y, variavel1.z); nome 65432 num curso Ma r a 42 ........ ano ingresso 2006 CR 0.75 0 1 return(0); 2 } 3 Índices alunos 0 1 2 3 índices do nome 7 8 Vetores de Estruturas Exemplo Dadas informações sobre CDs de música, tais como: nome do cantor(a) ou grupo; título do CD; gênero musical; ano de lançamento e dada uma letra listar todas as informações sobre o cantor cujo nome começa com a letra. struct cadastro { int ra; char nome[50]; int num_curso, ano_ingresso; float CR; } aluno, alunos[500]; struct cadastro { char cantor[30]; char titulo[20]; char genero[15]; int ano; } CD[400]; O acesso a um campo da estrutura exige o índice. nome_variável[indice]•nome_campo; Exemplos: 1) aluno.ra=65432; Cantor 2) alunos[0]•ra =73210; 3) strcpy(alunos[0]•nome,“Mara”); /* usar #include<string.h> */ 4) alunos[0]•CR = 0.6; 5) for (i=0;i<10;i++) scanf(“%s”, alunos[i]•nome) 6) for (i=0;i<10;i++) printf(“%s %s %d %d %f”, alunos[i]• ra, alunos[i]•nome, alunos[i]•num_curso, alunos[i]•ano_ingresso, alunos[i]•CR); 9 M a n o titulo e l gênero ano 0 ........ 1 2 Índices do CD 3 0 1 2 3 4 índices do cantor 0 1 2 3 índices do título O valor armazenado em CD[0].cantor[1] é ‘a’ 10 Exemplo (cont) Exemplo Dadas informações sobre CDs de música, tais como: nome do cantor(a) ou grupo; título do CD; gênero musical; ano de lançamento e dada uma letra listar todas as informações sobre o cantor cujo nome começa com a letra. #include <stdio.h> #include <string.h> #include<conio.h> struct cadastro { Índice do struct char cantor[30]; CD Índice do array char titulo[20]; cantor char genero[15]; int ano; }; void Mostrar_informacoes(struct cadastro CD[], int N, char letra[]){ int j; for (j=0; j<N; j++){ if (CD[j].cantor[0]== letra[0]) printf("%s %s %s %d \n", CD[j].cantor, CD[j].titulo, CD[j].genero, CD[j].ano); } } 11 int main() { struct cadastro CD[100]; int i, N,opcao=1; char letra[2]; printf("forneca a quantidade de CDs: "); scanf("%d", &N); for(i=0; i<N ; i++) { scanf("%s %s %s %d", CD[i].cantor, CD[i].titulo, CD[i].genero, &CD[i].ano); } printf("forneca uma letra:"); scanf("%s", letra); Mostrar_informacoes(CD, N, letra); printf("Fim de programa"); return 0; } 12 Estruturas em estruturas -Exemplo Estruturas em estruturas Para criar estruturas dentro de estruturas; Estrutura interna precisa ser declarada antes: struct dados_pessoais { char nome [50]; char sexo; int idade; }; struct cadastro { int ra ; struct dados_pessoais pessoa; float CR; }; •declaração da variável struct cadastro aluno; •acesso um campo da estrutura aluno.ra=52410; aluno.pessoa.sexo=‘F’; RA nome 07234 Monica Santos CR sexo 0.73 F endereço rua no. cidade R. Dois 321 Rio Claro struct Reg_endereço { char rua[50]; int no; char cidade; }; struct cadastro_aluno { int ra; char nome[50]; float CR; char sexo; struct Reg_endereço endereço; } aluno; Exemplo de utilização: scanf(“%d %f %s”, &aluno.ra, &aluno.CR, aluno.endereco.cidade); 13 14