Baixe o app para aproveitar ainda mais
Leia os materiais offline, sem usar a internet. Além de vários outros recursos!
Prévia do material em texto
Estruturas ou Registros DCC 119 – Algoritmos 2 Estruturas de Dados Heterogêneas � Até agora vimos as estruturas de dados homogêneas: vetores, matrizes e strings. � Nestas estruturas todos os elementos da estrutura são de tipos de dados primitivos: inteiro, real, caractere. 3 Estruturas de Dados Heterogêneas � No entanto, em muitos casos, necessitamos armazenar um conjunto de informações relacionadas, formado por diversos tipos de dado primitivos. � Exemplos: � Endereço � Fichas com dados pessoais de um cliente � Fichas com dados de um produto 4 Variáveis Compostas Heterogêneas � Quando uma determinada estrutura de dados for composta por diversos tipos diferentes, primitivos ou não, temos um conjunto heterogêneo de dados. � Essas variáveis são chamadas de variáveis compostas heterogêneas. � Estas variáveis compostas são chamadas de estruturas (ou structs em C). 5 nome sobrenome salário cargo empregado (4 campos) Definição de Estrutura � Uma estrutura pode ser definida como uma coleção de uma ou mais variáveis relacionadas (campos), onde cada variável pode ser de um tipo distinto. Exemplo: 6 Estruturas (definição) estrutura <nome_estrutura> { tipo_1 IDENTIFICADOR_1; tipo_2 IDENTIFICADOR_2; .................. tipo_n IDENTIFICADOR_n; } � Sintaxe para definir uma estrutura com n campos: usa-se o comando estrutura: 7 Estruturas em C struct <nome_estrutura> { tipo_1 IDENTIFICADOR_1; tipo_2 IDENTIFICADOR_2; .................. tipo_n IDENTIFICADOR_n; }; � Sintaxe para definir uma estrutura com n campos em C: 8 Estruturas (declaração) <nome_estrutura> VAR_1, VAR_2,...,VAR_M; � Sintaxe para declarar m variável do tipo estrutura: 9 Estruturas (declaração) struct <nome_estrutura> VAR_1, VAR_2,...,VAR_M; ou typedef <nome_estrutura> <novo_nome_estrutura>; <novo_nome_estrutura> VAR_1, VAR_2,...,VAR_M; Comando typedef é usado para definir uma novo nome para a estrutura � Em C, pode-se criar uma variável de uma dada estrutura de duas formas: 10 Estrutura � Veja um exemplo de estrutura que armazenaria a matricula e o nome de um funcionário. struct funcionario { char matricula[15]; char nome[100]; }; ... struct funcionario f1; estrutura funcionario { caracter MATRICULA[15]; caracter NOME[100]; } ... funcionario f1; D e f i n i ç ã o D e c l a r a ç ã o 11 Estruturas: Definição e Declaração � Observações: � A definição de um tipo estrutura deve ficar fora do programa (principal) e de qualquer sub-rotina. � A declaração de uma variável do tipo estrutura deve ficar dentro do programa (principal) e/ou dentro de qualquer sub-rotina. 12 Estruturas: Manipulação � Campos ou membros de uma estrutura podem ser usados da mesma forma como as variáveis. � Campos são acessados usando o operador de acesso ponto (.) entre o nome da estrutura e o nome do campo. 13 Estruturas: Manipulação � Para modificar um campo de uma estrutura, basta usarmos novamente o operador (.). No exemplo anterior, poderíamos ler o nome do funcionário f1 da seguinte forma funcionario f1; leia(f1.NOME); � Essa forma de acesso é utilizada tanto em pseudolinguagem quanto em C. 14 Estrutura: Exemplo completo � Vamos ver agora um código simples que faça uso da estrutura criada anteriormente. Neste exemplo serão lidos matrícula e nome de um funcionário. estrutura funcionario { caracter MATRICULA[15]; caracter NOME[100]; }; principal { funcionario f1; leia(f1.MATRICULA); leia(f1.NOME); imprima("Informações armazenadas:"); imprima(f1.MATRICULA); imprima(f1.NOME); } 15 Estrutura: Exemplo Completo � Código do slide anterior em C #include <stdio.h> struct funcionario { char matricula[15]; char nome[100]; }; int main() { struct funcionario f1; gets(f1.matricula); gets(f1.nome); puts("Informações armazenadas:\n"); puts(f1.matricula); puts(f1.nome); return 0; } 16 Estruturas: Exemplos(2) estrutura est_endereco { caracter RUA[50]; inteiro NUMERO; caracter BAIRRO[20]; caracter CIDADE[30]; caracter SIGLA_ESTADO[3]; inteiro CEP; } D e f i n i ç ã o Declaraçãoest_endereco ENDERECO; 17 struct est_endereco { char rua[50]; int numero; char bairro[20]; char cidade[30]; char sigla_estado[3]; int cep; }; struct est_endereco end1; Estruturas: Exemplos(2) em C estrutura est_endereco { caracter RUA[50]; inteiro NUMERO; caracter BAIRRO[20]; caracter CIDADE[30]; caracter SIGLA_ESTADO[3]; inteiro CEP; } est_endereco ENDERECO; 18 typedef struct est_endereco { char rua[50]; int numero; char bairro[20]; char cidade[30]; char sigla_estado[3]; int cep; }endereco; endereco end1; Estruturas: Outro exemplo em C D e f i n i ç ã o Declaração Pode-se utilizar o modificador de tipo na criação da estrutura A estrutura passará a ser referenciada pelo nome que aparece aqui A criação de variáveis fica bastante facilitada dessa forma 19 estrutura ficha_pessoal { caracter NOME[50]; inteiro TELEFONE; est_endereco END; } Estruturas: Exemplos (3) • Definição de uma estrutura onde um de seus campos é outra estrutura (est_endereco): ficha_pessoal NOME1,NOME2; • Declaração de variáveis do tipo definido acima: 20 typedef struct est_ficha_pessoal { char nome[50]; int telefone; endereco end; }ficha_pessoal; Estruturas: Exemplos (3) em C • Definição de uma estrutura onde um de seus campos é outra estrutura (endereco): ficha_pessoal ficha1, ficha2; • Declaração de variáveis do tipo definido acima: 21 Estruturas � Como visto anteriormente, para acessarmos o campo TELEFONE da variável NOME1 do tipo ficha_pessoal (tipo estrutura), devemos usar a seguinte sintaxe: NOME1.TELEFONE ← 4921234; estrutura ficha_pessoal { caracter NOME[50]; inteiro TELEFONE; est_endereco END; } ficha_pessoal NOME1,NOME2; 22 � Para acessar os campos da estrutura interna (END), podemos fazer da seguinte forma: � NOME1. Estruturas que possuem campos que são estruturas NOME TELEFONE END Campos da estrutura: 23 � Para acessar os campos da estrutura interna (END), podemos fazer da seguinte forma: � NOME1.END. Estruturas que possuem campos que são estruturas RUA NUMERO BAIRRO CIDADE SIGLA_ESTADO CEP Campos da estrutura: 24 � Para acessar os campos da estrutura interna (END), podemos fazer da seguinte forma: � NOME1.END.NUMERO ←←←← 10; � NOME1.END.CEP ←←←← 31340230; Estruturas que possuem campos que são estruturas Valor: Valor: OU 25 Estruturas que possuem campos que são vetores � Em alguns casos o tipo estrutura possui vetores como um dos seus campos. O acesso a estes campos é feito da mesma maneira como acesso direto a um vetor. REGISTRO.X[2] ←←←← 100; REGISTRO.Y[1] ←←←← 'x'; estrutura sdados { inteiro X[4]; caracter Y[10]; } sdados REGISTRO; 26 Atribuição direta entre estruturas � Uma das vantagens ao utilizarmos estruturas é a possibilidade de copiarmos toda a informação de uma estrutura para outra do mesmo tipo com uma atribuição simples: estrutura coordenadas { int X; int Y; } coordenadas PRIMEIRA, SEGUNDA; PRIMEIRA.X ←←←← 20; PRIMEIRA.Y ←←←← 30; SEGUNDA ←←←← PRIMEIRA; 27 Exemplo Completo � Considere as informações de um aluno que tem NOME e 4 notas como campos de uma estrutura; veja layout abaixo. � Desenvolver um algoritmo para ler e imprimir o nome e as notas de um aluno. Cadastro de notas escolares Nome................:_________________________ 4321 Notas 28 Exemplo Completo � Algoritmo (em pseudocomando) através de refinamentos sucessivos: ref. “definir estrutura” inicio ref. “declarar variáveis” ref. “ler os dados de um aluno” ref. “imprimir os dados do aluno” fim. 1 2 3 4 29 ref. “definir estrutura” estrutura cad_aluno { caracter NOME[40]; real NOTAS[4]; } Exemplo Completo ref. “definir estrutura” inicio ref. “declarar variáveis” ref. “ler os dados de um aluno” ref. “imprimir os dadosdo 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 pararepresentar as informações de um cartão de crédito. 2) Defina uma estrutura para representar o peso a altura de uma pessoa. 3) Considerando a estrutura do exercício (3) e a inicialização de variáveis abaixo: T_corpo joao, maria; joao.altura ← 1.90; joao.peso ← 98; maria.altura ← 1.50; maria.peso ← 55; Escreva uma instrução que atribua 1.78 à altura de joao; Escreva uma instrução que atribua 75 ao peso de maria. Escreva um conjunto de instruções para imprimir a média das alturas e a média dos pesos de joao e maria. Exercícios 55 4) Faça um programa para leitura, via teclado, dos dados de dois alunos diferentes. Os dados a serem guardados na estrutura aluno são os seguintes: nome, curso, idade. Ao final, imprima estas informações na tela. Crie procedimentos para as operações de leitura e impressão. 5) Considere a mesma estrutura definida anteriormente e a entrada de dados de um único aluno. Acrescente à estrutura um vetor com as notas das três provas feitas pelo aluno, calcule a sua média e diga se ele foi aprovado ou não (media >= 60). Para o cálculo da média e leitura das notas, utilize o comando para (que irá “varrer” o vetor da estrutura). 6) Crie uma estrutura chamada ponto contendo apenas as coordenadas x e y (inteiros) do ponto. Declare 2 pontos, leia as coordenadas x e y de cada um e calcule a distância entre eles. Apresente no final a distância entre os dois pontos. Exercícios 56 7) Faça um programa que permita a entrada de registros com nome, cidade e telefone de 5 pessoas. Imprima ao final os dados armazenados. 8) Faça um programa que receba três nomes de no máximo 100 caracteres cada e as idades das respectivas pessoas em um vetor de estruturas. Após o recebimento, listar os três nomes e idades armazenados neste vetor. 9) Faça um programa que armazene as informações de 11 jogadores de um time de futebol. Cada jogador é identificado pelo número da sua camisa, pelo seu peso, altura e pela inicial do seu nome. O programa deverá ler todas as informações e imprimir ao final a lista completa de jogadores com todas as informações lidas, a inicial do jogador mais baixo e o número do mais pesado. Exercícios 57 10) Faça um programa que permita a entrada de registros com CPF, nome, idade, cidade e telefone de no máximo 100 pessoas. Faça um menu com as seguintes opções: Menu: 1 – Ler as informações de uma pessoa 2 – Imprima por idade 3 – Imprima por inicial 4 – Imprima todos os registros cadastrados O programa deverá ter as seguintes características: � No primeiro item, peça inicialmente o índice do vetor que deseja alterar. � No segundo item, peça a idade mínima e máxima e imprima as pessoas que estão neste intervalo. � Faça funções para realizar as operações de cada um dos itens do menu. � Inicialize o CPF de todos os 100 registros no início do programa com -1. Utilize essa informação no item 4 para definir se um registro foi ou não lido naquela posição específica do vetor. CPF com valor -1 simbolizam posições não lidas do vetor. Exercícios DCC 120 Estruturas 59 � A sintaxe para declaração de uma variável deste tipo é a seguinte: Estruturas: Declaração struct <nome_estrutura> { tipo1 nome1; tipo2 nome2; ... }; struct <nome_estrutura> identif_1,identif_2,...; Ou: struct <nome_estrutura> { tipo1 nome1; tipo2 nome2;... } identificador1,identificador2,..; 60 Estrutura � Veja um exemplo de estrutura que armazenaria a matricula e o nome de um funcionário. D e f i n i ç ã o D e c l a r a ç ã o struct funcionario { char matricula[15]; char nome[100]; }; ... struct funcionario f1; 61 Estruturas: Manipulação � Campos ou membros de uma estrutura podem ser usados da mesma forma como as variáveis. � Campos são acessados usando o operador de acesso ponto (.) entre o nome da estrutura e o nome do campo. 62 Estruturas: Manipulação � Para modificar um campo de uma estrutura, basta usarmos novamente o operador (.). No exemplo anterior, poderíamos ler o nome do funcionário f1 da seguinte forma struct funcionario f1; gets(f1.nome); 63 Estrutura: Exemplo Completo #include <stdio.h> struct funcionario { char matricula[15]; char nome[100]; }; int main() { struct funcionario f1; gets(f1.matricula); gets(f1.nome); puts("Informações armazenadas:\n"); puts(f1.matricula); puts(f1.nome); return 0; } 64 struct endereco { char rua [50]; int numero; char bairro[20]; char cidade[30]; char sigla_estado[3]; int CEP; }end; Estruturas: Outras formas de Declaração 65 struct horario { int horas; int minutos; int segundos; } horario_do_nascimento = { 8, 45, 0 }; Estruturas: Outras formas de Declaração É possivel realizar as operações de definição, declaração e inicialização de estruturas em conjunto: 66 � Permite a definição de um novo nome para um determinado tipo. A sintaxe é: typedef antigo_nome novo_nome; � Exemplos: typedef int inteiro; Typedef typedef struct scoord { int x; int y; }coord; coord primeira,segunda; 67 #include <stdio.h> #include <string.h> typedef struct s_tipo_endereco { char rua [50]; int numero; char bairro [20]; char cidade [30]; char sigla_estado [3]; long int CEP; }tipo_endereco; typedef struct s_ficha_pessoal { char nome [50]; long int telefone; tipo_endereco endereco; }ficha_pessoal; Estruturas: Uso de múltiplas estruturas 68 int main ( ) { ficha_pessoal ficha; strcpy (ficha.nome , "Luiz Osvaldo Silva"); ficha.telefone=4921234; strcpy(ficha.endereco.rua ,"Rua das Flores"); ficha.endereco.numero=10; strcpy(ficha.endereco.bairro ,"Cidade Velha"); strcpy(ficha.endereco.cidade, "Belo Horizonte"); strcpy(ficha.endereco.sigla_estado ,"MG"); ficha.endereco.CEP=31340230; return 0; } Estruturas: Uso 69 Vetores de estruturas � Após a definição da estrutura produto, pode-se � definir um vetor de produtos como: typedef struct sproduto { int codigo; char descricao[120]; }produto; produto estoque[100]; 70 Acesso aos elementos do vetor � Utilizando o exemplo acima, pode-se modificar o campo � código dos dois primeiros produtos da seguinte forma: typedef struct sproduto { int codigo; char descricao[120]; }produto; produto estoque[100]; ... estoque[0].codigo = 10; estoque[1].codigo = 17; 71 Acesso aos elementos do vetor � Ainda fazendo uso do exemplo acima, o fragmento � de código para ler os 100 produtos ficaria assim: typedef struct sproduto { int codigo; char descricao[120]; }produto; produto estoque[100]; ... for(int i = 0; i < 100; i++) { scanf("%d", &estoque[i].codigo); gets(estoque[i].descricao); } 72 Código completo do exemplo #include <stdio.h> #define TAM 100 typedef struct sproduto { int codigo; char descricao[120]; }produto; int main() { int i; produto estoque[TAM]; // Cria vetor de estruturas for( i = 0; i < TAM; i++) { printf("Informe o codigo do produto %d: ", i); scanf("%d%*c", &estoque[i].codigo); // %*c descarta o '\n' printf("Informe a descricao do produto %d: ", i); gets(estoque[i].descricao); } printf("Listagem dos produtos armazenados:\n"); for( i = 0; i < TAM; i++) printf("%3d - %s\n", estoque[i].codigo,estoque[i].descricao); return 0; } 73 Inicialização de um vetor de estruturas � Pode-se inicializar um vetor de estruturas no � momento de sua criação como o código abaixo: typedef struct sproduto { int codigo; char descricao[120]; }produto; produto estoque[3] = {235, "Teclado USB", 245, "Monitor LCD", 515, "Memoria DDR"}; 74 Inicialização de um vetor de estruturas � Pode-se separar os campos da inicialização do � vetor com chaves, como mostra o código abaixo: typedef struct sproduto { int codigo; char descricao[120]; }produto; produto estoque[3] = {{235, "Teclado USB“}, {245, "Monitor LCD"}, {515, "Memoria DDR"}}; 75 Inicializando um vetor de estruturas � Se inicializarmos menos elementos do que os � alocados em memória, o restante do vetor ficará� “zerado” (se numérico) ou vazio (se strings). typedef struct sproduto { int codigo; char descricao[120]; }produto; produto estoque[6] = {235, "Teclado USB", 245, "Monitor LCD", 515, "Memoria DDR"}; � No exemplo acima, os índices 3, 4 e 5 do vetor � terão código 0 e descrição vazia. 76 Funções e vetores de estruturas � Vetores de estruturas podem ser passados como � argumentos de funções como qualquer outro vetor. ... produto estoque[100]; lerProdutos(estoque); ... void lerProdutos( produto estoque[100] ) { for(int i = 0; i < 100; i++) { scanf("%d", &estoque[i].codigo); gets(estoque[i].descricao); } } 77 Estruturas e funções – Exemplo 1/3 #include <stdio.h> #define TAM 4 typedef struct sproduto { int codigo; char descricao[120]; }produto; ................. int main() { produto estoque[TAM]; // Cria vetor de estruturas LerProdutos(estoque); // Chama função de leitura ImprimeProdutos(estoque); // Chama função de impressão return 0; } 78 .......... void LerProdutos( produto estoque[TAM] ) { int i; printf("Listagem dos produtos armazenados:\n"); for( i = 0; i < TAM; i++) { printf("Informe o codigo do produto %d: ", i); scanf("%d%*c", &estoque[i].codigo); // %*c descarta o '\n' printf("Informe a descricao do produto %d: ", i); gets(estoque[i].descricao); } } ............... Estruturas e funções – Exemplo 2/3 79 .......... void ImprimeProdutos( produto estoque[TAM] ) { int i; for( i = 0; i < TAM; i++) printf("%3d - %s\n",estoque[i].codigo, estoque[i].descricao); } ......... Estruturas e funções – Exemplo 3/3 80 Estruturas e funções - Completo #include <stdio.h> #define TAM 4 typedef struct sproduto { int codigo; char descricao[120]; }produto; void LerProdutos( produto estoque[TAM] ) { int i; printf("Listagem dos produtos armazenados:\n"); for( i = 0; i < TAM; i++) { printf("Informe o codigo do produto %d: ", i); scanf("%d%*c", &estoque[i].codigo); // %*c descarta o '\n' printf("Informe a descricao do produto %d: ", i); gets(estoque[i].descricao); } } 81 Estruturas e funções - Completo void ImprimeProdutos( produto estoque[TAM] ) { int i; for( i = 0; i < TAM; i++) printf("%3d - %s\n", estoque[i].codigo,estoque[i].descricao); } int main() { int i; produto estoque[TAM]; // Cria vetor de estruturas LerProdutos(estoque); // Chama função de leitura ImprimeProdutos(estoque); // Chama função de impressão return 0; } � Continuação... 82 Exercícios 1) Faça um programa que leia as informações de N alunos (sendo N definido com a diretiva define). As informações que deverão ser lidas de cada aluno são: matrícula, nome e média final. Ao final, informe os nomes dos alunos que foram aprovados (>= 60). 2) Faça um programa para fazer o cadastro dos veículos de uma empresa. Poderão ser cadastrados no máximo 100 veículos e as informações a serem armazenadas são as seguintes: nome do condutor, placa do veículo e cor do veículo. Armazene também o turno que os veículos são armazenados como sendo m (manhã), t (tarde), n (noite) e i (dia inteiro). Informe ao final a lista completa dos veículos cadastro com todas as informações que forem cadastradas. Utilize funções para fazer a leitura e a escrita dos dados. 3) Faça um programa que gerencie o estoque de uma empresa. Faça a leitura dos produtos que contenham os seguintes campos: nome do produto, quantidade em estoque e preço unitário. Ao final, informe as informações de todos os produtos. Informe também os produtos que tenham o maior e o menor valor em estoque. Calcule este valor multiplicando a quantidade de cada produto pelo seu valor unitário. Utilize funções para realizar operações de leitura e escrita e faça um menu que possibilite ler todos os produtos, ler um produto com um índice específico e imprimir as informações citadas anteriormente. 83 Exercícios 4) Elabore um programa que auxilie no controle de uma fazenda de gado que possua um total de 100 cabeças de gado. O programa deverá conter uma estrutura que comporte: • código: código da cabeça de gado; • leite: número de litros de leite produzido por semana; • alimento: quantidade de alimento ingerida por semana - em quilos; • mês de nascimento; • ano de nascimento; • abate: ‘N”(não) ou ‘S’ (sim). 84 Exercícios 4) continuação... O seu programa deverá conter um menu com as seguintes funcionalidades: (a) Ler a base de dados (código, leite, alimento, nascimento) informados pelo usuário e armazenar em um vetor de estruturas. (b) Preencher o campo abate, considerando que a cabeça de gado irá para o abate caso: • tenha mais de 5 anos, ou; • produza menos de 40 litros de leite por semana, ou; • produza entre 50 e 70 litros de leite por semana e ingira mais de 50 quilos de alimento por dia. (c) Imprimir a quantidade total de leite produzida por semana na fazenda. (d) Imprimir a quantidade total de alimento consumido por semana na fazenda. (e) Imprimir a quantidade total de leite que vai ser produzido por semana na fazenda, após o abate (f) Imprimir a quantidade total de alimento que vai ser consumido por semana na fazenda, após o abate (g) Imprimir número de cabeças de gado que irão para o abate.
Compartilhar