{joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG Prof.: José Eustáquio Rangel de Queiroz [email protected] [email protected] Carga Horária: 60 horas Estruturas em C DSC/CCT/UFCG Estrutura em C Coleção de variáveis referenciada sob um nome (integração de informações afins). de estrutura – criação de variáveis de estruturas (elementos da estrutura). {joseana, rangel}@dsc.ufcg.edu.br Declaração 2 Estruturas em C Exemplo : DSC/CCT/UFCG struct endereco { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; unsigned long int cep; }; {joseana, rangel}@dsc.ufcg.edu.br Nome endereco - etiqueta da estrutura struct endereco info_adr; Declaração da variável info_adr como do tipo estrutura endereco (alocação da memória neste ponto) 3 Estruturas em C DSC/CCT/UFCG Exemplo: {joseana, rangel}@dsc.ufcg.edu.br Alocação da struct endereco { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; unsigned long int cep; }info_adr, binfo, cinfo; memória na declaração da estrutura; Definição de um tipo de estrutura endereco e declaração de variáveis daquele tipo. 4 Estruturas em C DSC/CCT/UFCG Exemplo : struct { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; unsigned long int cep; }info_adr; {joseana, rangel}@dsc.ufcg.edu.br Supressão da etiqueta quando há apenas de uma variável de um determinado tipo; Declaração de uma variável info_adr como definida pela estrutura que a precede; 5 Estruturas em C DSC/CCT/UFCG Forma Geral: {joseana, rangel}@dsc.ufcg.edu.br struct nome_do_tipo_da_estrutura { tipo nome_de_elemento_1; tipo nome_de_elemento_2; tipo nome_de_elemento_3; .. . tipo nome_de_elemento_N; }variáveis_estrutura; Possibilidade de omissão do nome do tipo da estrutura (etiqueta) ou das variáveis da estrutura, mas não de ambos. 6 Estruturas em C DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br Declaração de Estruturas Não reserva espaço Reserva espaço struct exemplo { int rotulo; char letra; char nome[30]; }; struct exemplo { int rotulo; char letra; char nome[30]; } tipostruct; /* Nome “exemplo” denomina-se etiqueta da struct */ 7 Estruturas em C DSC/CCT/UFCG Operador .: Referência dos membros da estrutura nome_da_variável_estrutura.nome_do_elemento {joseana, rangel}@dsc.ufcg.edu.br Exemplo: info_adr.cep=91720260; /* atribui */ printf("%lu", info_adr.cep); /* imprime cep na tela */ printf("%s",info_adr.nome); /* imprime nome */ for(t=0;info_adr.nome[t];++t) putchar(info_adr.nome[t]); /*apresenta caractere por caractere */ 8 Estruturas em C {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG #include <stdio.h> #include <conio.h> void main(void) { struct { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; unsigned long int cep; }info_adr; register int t; clrscr(); printf("Digite um nome\n"); scanf("%s",info_adr.nome); printf("Digite o CEP\n"); scanf("%lu",&info_adr.cep); Exempl o: O que faz o programa ao lado? 9 Estruturas em C DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br printf("O nome e CEP digitados foram %s e %lu\n\n", info_adr.nome, info_adr.cep); for(t=0;info_adr.nome[t];++t){ putchar(info_adr.nome[t]); printf("\n"); } } Exempl o: O que faz o programa ao lado? 10 Estruturas em C DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br Exemplo: Substitua o trecho equivalente de código do programa anterior pelo apresentado abaixo e informe o que faz o programa. register int t; clrscr(); printf("Digite um nome\n"); gets(info_adr.nome); printf("Digite uma rua\n"); gets(info_adr.rua); printf("Digite o CEP\n"); scanf("%lu",&info_adr.cep); printf("O nome, a rua e o CEP digitados foram %s, %s e %lu\n\n", info_adr.nome, info_adr.rua, info_adr.cep); } 11 DSC/CCT/UFCG Estruturas em C Matrizes de Estruturas struct endereco info_adr[100]; /* cria 100 conjuntos de variáveis que sao organizadas como definido na estrutura endereco */ {joseana, rangel}@dsc.ufcg.edu.br printf("%lu", info_adr[2].cep); /* imprime na tela o cep da estrutura 3 da matriz de 100 estruturas */ Comuns em planilhas de cálculo tipo Lotus, nas quais se armazena uma quantidade de dados encadeados. grande 12 Estruturas em C #include <stdio.h> #include <conio.h> DSC/CCT/UFCG #define TMAX void main(void) { O struct { char nome[30]; que faz o char rua[40]; programa ao char cidade[20]; char estado[3]; lado? char cep[30]; for(i=0;i<TMAX;i++) }info_adr[TMAX]; printf("O nome[%d], a rua[%d] e o CEP[%d] digitados foram %s, %s register int t, i; eclrscr(); %s\n", i, i, i, info_adr[i].nome, info_adr[i].rua, info_adr[i].cep); }for(i=0;i<TMAX;i++){ printf("Digite o nome[%d]\n",i); gets(info_adr[i].nome); printf("Digite uma rua[%d]\n",i); gets(info_adr[i].rua); printf("Digite o CEP[%d]\n",i); gets(info_adr[i].cep); } {joseana, rangel}@dsc.ufcg.edu.br Exemplo: 13 Estruturas em C DSC/CCT/UFCG Apontadores e Estruturas I destes 2 tipos simples e geralmente sem problemas Combinação struct coord { float x, y, z; } ponto; // declara a variavel ponto do tipo struct coord {joseana, rangel}@dsc.ufcg.edu.br struct coord *aponto; // apontador para uma variavel qualquer do tipo struct coord aponto = &ponto; // aponto aponta para a variável ponto 14 Estruturas em C DSC/CCT/UFCG Apontadores e Estruturas II Operador acesso direto a membros de uma estrutura via apontador {joseana, rangel}@dsc.ufcg.edu.br aponto -> x = 1.0; aponto -> y = aponto -> -3.1; 15 Estruturas em C DSC/CCT/UFCG Exempl {joseana, rangel}@dsc.ufcg.edu.br o /* TESTE DE ESTRUTURA */ void main() #include <conio.h> { #include <stdio.h> int i,j; #include <stdlib.h> float soma[4]={0,0,0,0}; #include <ctype.h> printf ("\n Notas individuais, medias de cada aluno, typedef struct { de exercicios e geral\n"); char RA[10], nome[40]; for(j=0;j<=3; j=j+1) printf ("\n #\tRA\t Nome Nota1 Nota2 float nota[4]; for(i=0;i<=6; i=i+1) Nota3 Nota4 Media"); } Dados; soma[j]=soma[j]+ aluno[i].nota[j]; for(i=0; i<=6;i=i+1) { Dados printf("\n\n\t Medias poraluno[7]= exercicio: %.1f %.1f %.1f %.1f", printf("\n %d %-10s %-20s%.1f %.1f %.1f { soma[0]/7,soma[1]/7,soma[2]/7,soma[3]/7,(soma[0]+soma[1]+soma[2]+ %.1f %.1f %.1f", "20123081", "Alana Oliveira", 8.8, 8.5, 7.8, 7.6, soma[3])/28); i, aluno[i].RA, aluno[i].nome, "20123077", "Amnon Rodrigues", 7.8, 7.3, 7.2, 7.1, aluno[i].nota[0], aluno[i].nota[1], "20123083", "Ediene Regis", 6.9, 6.8, 6.1, 6.3, printf("\n"); aluno[i].nota[2], aluno[i].nota[3], "20123343", "Helayne Tavares", 5.9, 5.8, 5.4, 5.2, printf("\n Fim. Digite qqr(aluno[i].nota[0]+aluno[i].nota[1]+aluno[i].nota tecla.");getch(); printf(" Feche a janela"); "20213016", "Jacqueline Nunes", 7.7, 7.6, 7.2, 7.1, } [2]+aluno[i].nota[3])/4); "20123050", "Luiz Eduardo Rosado", 8.8, 8.5, 8.3, 8.2, } "29923068", "Nathaly Barbosa", 6.7, 6.4, 6.1, 6.0, }; 16 DSC/CCT/UFCG José Eustáquio Rangel de Queiroz [email protected], [email protected] UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE ENGENHARIA ELÉTRICA E INFORMÁTICA DEPARTAMENTO DE SISTEMAS E {joseana, rangel}@dsc.ufcg.edu.br COMPUTAÇÃO