do aluno” fim. 1 30 ref. “declarar variáveis” cad_aluno ALUNO; // informação de um aluno inteiro I; // subscrito para leitura do vetor de notas ref. “definir estrutura” inicio ref. “declarar variáveis” ref. “ler os dados de um aluno” ref. “imprimir os dados do aluno” fim. 2 Exemplo Completo 31 ref. “ler dados de um aluno” leia(ALUNO.NOME); para ( I = 0 ; I <= 3; I = I + 1 ) faça { leia(ALUNO.NOTA[I]); } ref. “definir estrutura” inicio ref. “declarar variáveis” ref. “ler os dados de um aluno” ref. “imprimir os dados do aluno” fim. 3 Exemplo Completo 32 ref. “imprimir dados de um aluno” imprima(ALUNO.NOME); para ( I = 0 ; I <= 3; I = I + 1 ) faça { imprima(ALUNO.NOTA[I]); } ref. “definir estrutura” inicio ref. “declarar variáveis” ref. “ler os dados de um aluno” ref. “imprimir os dados do aluno” fim. 4 Exemplo Completo 33 {definição da estrutura} estrutura cad_aluno { caracter NOME[40]; real NOTAS[4]; } principal { {declaração das variáveis} cad_aluno ALUNO; inteiro I; � Juntando todos os refinamentos. {leitura dos dados de um aluno} leia(ALUNO.NOME); para ( I = 0 ; I <= 3; I = I + 1 ) faça { leia(ALUNO.NOTA[I]); } {impressão dos dados do aluno} imprima(ALUNO.NOME); para ( I = 0 ; I <= 3; I = I + 1 ) faça { imprima(ALUNO.NOTA[I]); } } Exemplo Completo 34 #include <stdio.h> #include <stdlib.h> typedef struct cad_aluno { char nome[40]; float nota[4]; }aluno; int main() { aluno aluno1; int i; gets(aluno1.nome); for(i = 0; i <= 3; i++) scanf("%f", &aluno1.nota[i]); puts(aluno1.nome); for(i = 0; i <= 3; i++) printf("%f\n", aluno1.nota[i]); return 0; } Exemplo Completo em C 35 � Como qualquer outra variável, uma variável do tipo estrutura pode ser usada como parâmetro. Também, uma variável do tipo estrutura pode ser passada para uma subrotina por referência ou por valor. estrutura Texemplo { tipot CAMPO1; tipot CAMPO2; } {.............................} real fnc1(Texemplo X) { .... } proc1(ref Texemplo Y) { .... fnc1(Y); .... } {..........................} Texemplo fnc2(inteiro A) { Texemplo V; .................... retorne V; } Definição da estrutura Passagem por valor Passagem por referência Tipo de retorno da função Subrotinas e estruturas 36 � Pode-se criar vetores de estruturas como se criam vetores de tipos primitivos. � Os programas apresentados até o momento só fizeram menção a uma única instância da estrutura. � É necessário possuir uma definição da estrutura antes de declarar um vetor de estrutura. Vetores de Estruturas 37 � Suponha que deseja-se manter um registro de informações relativas a passagens rodoviárias de todos lugares (poltronas) de um ônibus. Declaração de vetor de estrutura 38 � Pode-se utilizar uma estrutura referente a cada poltrona � (passagem) e para agrupar todas elas utiliza-se um vetor de estruturas. � Um ônibus possui 44 lugares numerados de 0 a 43: Nome:__________ Número:__________ De:______________ Para:_____________ Data:____/____/____ Horário:___________ Poltrona:__________ Distância:__________ 0 1 43 Declaração de vetor de estrutura 39 � Declaração: estrutura reg_passagem { caracter NOME[50]; inteiro NUMERO; caracter ORIGEM[20]; caracter DESTINO[20]; caracter DATA[8]; caracter HORARIO[5]; inteiro POLTRONA; real DISTANCIA; } reg_passagem VET_PASSAGEM[44]; Declaração de vetor de estrutura Em C utilizaremos a mesma sintaxe para criar vetores de estruturas 40 Declaração de vetor de estrutura � Acessos: VET_PASSAGEM[3].NUMERO; VET_PASSAGEM[34].DISTANCIA; VET_PASSAGEM[2].ORIGEM; 41 � Outro exemplo mais completo.... � Considere que você está fazendo um programa que leia o nome e as 4 notas escolares de 8 alunos. Declaração de vetor de estrutura 42 Nome:______ 4321 notasNome:______ 4321 notasNome:______ 4321 notasNome:______ 4321 notasNome:______ 4321 notasNome:______ 4321 notasNome:______ 4321 notas Declaração de vetor de estrutura � Esquematicamente: Nome:______ 4321 notas 0 1 2 3 4 5 6 7 Í n d i c e s d o v e t o r Cadastro de notas escolares 43 � Visão esquemática do vetor de estruturas: Declaração de vetor de estrutura Cadastro de notas escolares Nome:______ 4321 notas 0 1 2 3 4 5 6 7 44 Declaração de vetor de estrutura � Definição da estrutura e do vetor de 8 alunos. estrutura cad_aluno { caracter NOME[40]; real NOTAS[4]; } cad_aluno ALUNOS[8]; 45 Leitura de um vetor de estrutura le_vetor_alunos(ref cad_aluno A[8]) { inteiro I,J; para (I = 0; I < 8; I = I + 1) faça { leia(A[I].NOME); para (J = 0; J < 4; J = J + 1) faça { leia(A[I].NOTA[J]); } } } � Procedimento para ler os dados dos alunos: Recebe, por referência, um vetor com oito alunos ( A[8] ) 46 Leitura de um vetor de estrutura le_vetor_alunos(ref cad_aluno A[8]) { inteiro I,J; para (I = 0; I < 8; I = I + 1) faça { leia(A[I].NOME); para (J = 0; J < 4; J = J + 1) faça { leia(A[I].NOTA[J]); } } } � Procedimento para ler os dados dos alunos: Variáveis auxiliares 47 Leitura de um vetor de estrutura le_vetor_alunos(ref cad_aluno A[8]) { inteiro I,J; para (I = 0; I < 8; I = I + 1) faça { leia(A[I].NOME); para (J = 0; J < 4; J = J + 1) faça { leia(A[I].NOTA[J]); } } } � Procedimento para ler os dados dos alunos: Laço para ler os oito alunos 48 Leitura de um vetor de estrutura le_vetor_alunos(ref cad_aluno A[8]) { inteiro I,J; para (I = 0; I < 8; I = I + 1) faça { leia(A[I].NOME); para (J = 0; J < 4; J = J + 1) faça { leia(A[I].NOTA[J]); } } } � Procedimento para ler os dados dos alunos: Para cada aluno, um laço para ler as suas quatro notas 49 Escrita de um vetor de estrutura � O processo de escrita de um vetor de estrutura é similar aos modos de escrita anteriores já vistos. imprime_vetor_alunos(ref cad_aluno A[8]) { inteiro I,J; para (I = 0; I < 8; I = I + 1 faça { imprima(A[I].NOME); para (J = 0; J < 4; J = J + 1) faça { imprima(A[I].NOTA[J]); } } } Todo vetor, quando passado por parâmetro, é passado por referência !!!! 50 Escrita de um vetor de estrutura � O processo de escrita de um vetor de estrutura é similar aos modos de escrita anteriores já vistos. imprime_vetor_alunos(ref cad_aluno A[8]) { inteiro I,J; para (I = 0; I < 8; I = I + 1 faça { imprima(A[I].NOME); para (J = 0; J < 4; J = J + 1) faça { imprima(A[I].NOTA[J]); } } } Variáveis auxiliares 51 Escrita de um vetor de estrutura � O processo de escrita de um vetor de estrutura é similar aos modos de escrita anteriores já vistos. imprime_vetor_alunos(ref cad_aluno A[8]) { inteiro I,J; para (I = 0; I < 8; I = I + 1 faça { imprima(A[I].NOME); para (J = 0; J < 4; J = J + 1) faça { imprima(A[I].NOTA[J]); } } } Laço para imprimir os oito alunos 52 Escrita de um vetor de estrutura � O processo de escrita de um vetor de estrutura é similar aos modos de escrita anteriores já vistos. imprime_vetor_alunos(ref cad_aluno A[8]) { inteiro I,J; para (I = 0; I < 8; I = I + 1 faça { imprima(A[I].NOME); para (J = 0; J < 4; J = J + 1) faça { imprima(A[I].NOTA[J]); } } } Para cada aluno, um laço para imprimir as suas quatro notas 53 Exemplo de vetores de estruturas em C #include <stdio.h> #include <stdlib.h> typedef struct cad_aluno { char nome[40]; float notas[4]; }aluno; void leVetorAlunos(aluno a[], int n) { int i, j; for( i = 0; i < n; i++) { printf("Informe o nome do aluno"); gets(a[i].nome); printf("Informe as 4 notas "); for( j = 0; j < 4; j++) scanf("%f%*c", &a[i].notas[j]); } } void imprimeVetorAlunos(aluno a[], int n) { int i, j; printf("\nAlunos:"); for( i = 0; i < n; i++) { printf("\n%20s ", a[i].nome); for( j = 0; j < 4; j++) printf("%.2f ", a[i].notas[j]); } } int main() { aluno alunos[8]; leVetorAlunos(alunos, 8); imprimeVetorAlunos(alunos, 8); return 0; } 54 1) Defina uma estrutura para