Você está na página 1de 82

Estruturas ou Registros

DCC 119 Algoritmos


Estruturas de Dados Heterogneas

 At agora vimos as estruturas de dados


homogneas: vetores, matrizes e strings.

 Nestas estruturas todos os elementos da


estrutura so de tipos de dados primitivos:
inteiro, real, caractere.

2
Estruturas de Dados Heterogneas

 No entanto, em muitos casos, necessitamos


armazenar um conjunto de informaes
relacionadas, formado por diversos tipos de
dado primitivos.

 Exemplos:
 Endereo

 Fichas com dados pessoais de um cliente

 Fichas com dados de um produto


3
Variveis Compostas Heterogneas

 Quando uma determinada estrutura de dados


for composta por diversos tipos diferentes,
primitivos ou no, temos um conjunto
heterogneo de dados.

 Essas variveis so chamadas de variveis


compostas heterogneas.

 Estas variveis compostas so chamadas de


estruturas (ou structs em C).
4
Definio de Estrutura

 Uma estrutura pode ser definida como uma


coleo de uma ou mais variveis
relacionadas (campos), onde cada varivel
pode ser de um tipo distinto.
Exemplo:
nome

sobrenome
empregado
salrio
(4 campos)
cargo

5
Estruturas (definio)

 Sintaxe para definir uma estrutura com n


campos: usa-se o comando estrutura:

estrutura <nome_estrutura>
{
tipo_1 IDENTIFICADOR_1;
tipo_2 IDENTIFICADOR_2;
..................
tipo_n IDENTIFICADOR_n;
}

6
Estruturas em C

 Sintaxe para definir uma estrutura com n


campos em C:

struct <nome_estrutura>
{
tipo_1 IDENTIFICADOR_1;
tipo_2 IDENTIFICADOR_2;
..................
tipo_n IDENTIFICADOR_n;
};

7
Estruturas (declarao)

 Sintaxe para declarar m varivel do tipo


estrutura:

<nome_estrutura> VAR_1, VAR_2,...,VAR_M;

8
Estruturas (declarao)

 Em C, pode-se criar uma varivel de uma


dada estrutura de duas formas:

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
9
Estrutura

 Veja um exemplo de estrutura que armazenaria


a matricula e o nome de um funcionrio.

estrutura funcionario struct funcionario


Definio

{ {
caracter MATRICULA[15]; char matricula[15];
caracter NOME[100]; char nome[100];
} };
Declarao

... ...
funcionario f1; struct funcionario f1;

10
Estruturas: Definio e Declarao

 Observaes:

 A definio de um tipo estrutura deve ficar fora


do programa (principal) e de qualquer sub-rotina.

 A declarao de uma varivel do tipo estrutura


deve ficar dentro do programa (principal) e/ou
dentro de qualquer sub-rotina.

11
Estruturas: Manipulao
 Campos ou membros de uma estrutura podem
ser usados da mesma forma como as variveis.

 Campos so acessados usando o operador de


acesso ponto (.) entre o nome da estrutura e
o nome do campo.

12
Estruturas: Manipulao
 Para modificar um campo de uma estrutura, basta
usarmos novamente o operador (.). No exemplo
anterior, poderamos ler o nome do funcionrio f1 da
seguinte forma

funcionario f1;
leia(f1.NOME);

 Essa forma de acesso utilizada tanto em


pseudolinguagem quanto em C.

13
Estrutura: Exemplo completo
 Vamos ver agora um cdigo simples que faa uso da
estrutura criada anteriormente. Neste exemplo sero lidos
matrcula e nome de um funcionrio.
estrutura funcionario
{
caracter MATRICULA[15];
caracter NOME[100];
}

principal
{
funcionario f1;
leia(f1.MATRICULA);
leia(f1.NOME);

imprima("Informaes armazenadas:");
imprima(f1.MATRICULA);
imprima(f1.NOME);
}

14
Estrutura: Exemplo Completo
 Cdigo 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("Informaes armazenadas:\n");
puts(f1.matricula);
puts(f1.nome);
return 0;
}

15
Estruturas: Exemplos(2)

estrutura est_endereco
{
caracter RUA[50];
inteiro NUMERO;
Definio

caracter BAIRRO[20];
caracter CIDADE[30];
caracter SIGLA_ESTADO[3];
inteiro CEP;
}

est_endereco ENDERECO; Declarao


16
Estruturas: Exemplos(2) em C
estrutura est_endereco struct est_endereco
{ {
caracter RUA[50]; char rua[50];
inteiro NUMERO; int numero;
caracter BAIRRO[20]; char bairro[20];
caracter CIDADE[30]; char cidade[30];
caracter SIGLA_ESTADO[3]; char sigla_estado[3];
inteiro CEP; int cep;
} };

est_endereco ENDERECO; struct est_endereco end1;

17
Estruturas: Outro exemplo em C

typedef struct est_endereco


{ Pode-se utilizar o
char rua[50]; modificador de tipo na
criao da estrutura
int numero;
Definio

char bairro[20];
char cidade[30]; A estrutura passar a
ser referenciada pelo
char sigla_estado[3]; nome que aparece aqui
int cep;
}endereco; A criao de variveis
fica bastante facilitada
dessa forma
Declarao
endereco end1;
18
Estruturas: Exemplos (3)
Definio de uma estrutura onde um de seus campos outra
estrutura (est_endereco):

estrutura ficha_pessoal
{
caracter NOME[50];
inteiro TELEFONE;
est_endereco END;
}

Declarao de variveis do tipo definido acima:

ficha_pessoal NOME1,NOME2;
19
Estruturas: Exemplos (3) em C
Definio de uma estrutura onde um de seus campos outra
estrutura (endereco):

typedef struct est_ficha_pessoal


{
char nome[50];
int telefone;
endereco end;
}ficha_pessoal;

Declarao de variveis do tipo definido acima:

ficha_pessoal ficha1, ficha2;


20
Estruturas
 Como visto anteriormente, para acessarmos o campo TELEFONE da
varivel NOME1 do tipo ficha_pessoal (tipo estrutura),

estrutura ficha_pessoal
{
caracter NOME[50];
inteiro TELEFONE;
est_endereco END;
}

ficha_pessoal NOME1,NOME2;

devemos usar a seguinte sintaxe:


NOME1.TELEFONE 4921234;

21
Estruturas que possuem campos que
so estruturas
 Para acessar os campos da estrutura interna
(END), podemos fazer da seguinte forma:

Campos da estrutura:

 NOME1. NOME
TELEFONE
END

22
Estruturas que possuem campos que
so estruturas
 Para acessar os campos da estrutura interna
(END), podemos fazer da seguinte forma:
Campos da estrutura:
 NOME1.END. RUA
NUMERO
BAIRRO
CIDADE
SIGLA_ESTADO
CEP

23
Estruturas que possuem campos que
so estruturas
 Para acessar os campos da estrutura interna
(END), podemos fazer da seguinte forma:

Valor:
 NOME1.END.NUMERO 10;

OU
Valor:
 NOME1.END.CEP 31340230;

24
Estruturas que possuem campos que
so vetores
 Em alguns casos o tipo estrutura possui vetores
como um dos seus campos.
estrutura sdados
{
inteiro X[4];
caracter Y[10];
}
sdados REGISTRO;
O acesso a estes campos feito da mesma
maneira como acesso direto a um vetor.
REGISTRO.X[2] 100;
REGISTRO.Y[1] 'x';
25
Atribuio direta entre estruturas
 Uma das vantagens ao utilizarmos estruturas a
possibilidade de copiarmos toda a informao de uma
estrutura para outra do mesmo tipo com uma atribuio
simples:
estrutura coordenadas
{
int X;
int Y;
}
coordenadas PRIMEIRA, SEGUNDA;
PRIMEIRA.X 20;
PRIMEIRA.Y 30;
SEGUNDA PRIMEIRA;
26
Exemplo Completo

 Considere as informaes de um aluno que tem NOME e 4


notas como campos de uma estrutura; veja layout abaixo.

Cadastro de notas escolares


Nome................:_________________________

Notas
1 2 3 4

 Desenvolver um algoritmo para ler e imprimir o nome e as


notas de um aluno.
27
Exemplo Completo
 Algoritmo (em pseudocomando) atravs de refinamentos
sucessivos:

ref. definir estrutura 1


inicio
ref. declarar variveis 2
ref. ler os dados de um aluno 3
ref. imprimir os dados do aluno 4
fim.

28
Exemplo Completo
ref. definir estrutura
inicio
1
ref. declarar variveis
ref. ler os dados de um aluno
ref. imprimir os dados do aluno
fim.

ref. definir estrutura


estrutura cad_aluno
{
caracter NOME[40];
real NOTAS[4];
}

29
Exemplo Completo
ref. definir estrutura
inicio
2
ref. declarar variveis
ref. ler os dados de um aluno
ref. imprimir os dados do aluno
fim.

ref. declarar variveis

cad_aluno ALUNO; // informao de um aluno


inteiro I; // subscrito para leitura do vetor de notas

30
Exemplo Completo
ref. definir estrutura
inicio
3
ref. declarar variveis
ref. ler os dados de um aluno
ref. imprimir os dados do aluno
fim.

ref. ler dados de um aluno

leia(ALUNO.NOME);

para ( I  0 ; I 3; I  I + 1 ) faa
{
leia(ALUNO.NOTA[I]);
}

31
Exemplo Completo
ref. definir estrutura
inicio
4
ref. declarar variveis
ref. ler os dados de um aluno
ref. imprimir os dados do aluno
fim.

ref. imprimir dados de um aluno


imprima(ALUNO.NOME);

para ( I  0 ; I 3;  I + 1 ) faa
{
imprima(ALUNO.NOTA[I]);
}

32
Exemplo Completo
 Juntando todos os
{definio da estrutura} refinamentos.
estrutura cad_aluno
{ {leitura dos dados de um aluno}
caracter NOME[40]; leia(ALUNO.NOME);
real NOTAS[4];
para ( I  0 ; I 3; I  I + 1 ) faa
}
{
principal
leia(ALUNO.NOTA[I]);
{
}
{declarao das variveis}
{impresso dos dados do aluno}
cad_aluno ALUNO;
imprima(ALUNO.NOME);
inteiro I;
para ( I  0 ; I 3; I  I + 1 ) faa
{
imprima(ALUNO.NOTA[I]);
}
} 33
Exemplo Completo em C
#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;
} 34
Subrotinas e estruturas
 Como qualquer outra varivel, uma varivel do tipo estrutura pode ser
usada como parmetro. Tambm, uma varivel do tipo estrutura pode
ser passada para uma subrotina por referncia ou por valor.
proc1(ref Texemplo Y)
estrutura Texemplo
Definio da { Passagem por
{
estrutura .... referncia
tipot CAMPO1;
fnc1(Y);
tipot CAMPO2;
....
}
}
{.............................} Tipo de retorno
{..........................}
da funo
real fnc1(Texemplo X)
Texemplo fnc2(inteiro A)
{
{
....
Passagem por Texemplo V;
}
valor ....................
retorne V;
} 35
Vetores de Estruturas
 Pode-se criar vetores de estruturas como se criam
vetores de tipos primitivos.

 Os programas apresentados at o momento s


fizeram meno a uma nica instncia da estrutura.

 necessrio possuir uma definio da estrutura


antes de declarar um vetor de estrutura.

36
Declarao de vetor de estrutura
 Suponha que deseja-se manter um registro
de informaes relativas a passagens
rodovirias de todos lugares (poltronas) de
um nibus.

37
Declarao de vetor de estrutura
 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:

0
Nome:__________ Nmero:__________
1
De:______________ Para:_____________
Data:____/____/____ Horrio:___________
Poltrona:__________ Distncia:__________
43

38
Declarao de vetor de estrutura
 Declarao:
estrutura reg_passagem
{
caracter NOME[50];
inteiro NUMERO;
caracter ORIGEM[20];
caracter DESTINO[20];
caracter DATA[8];
caracter HORARIO[5]; Em C utilizaremos a
inteiro POLTRONA; mesma sintaxe para criar
vetores de estruturas
real DISTANCIA;
}
reg_passagem VET_PASSAGEM[44];

39
Declarao de vetor de estrutura
 Acessos:

VET_PASSAGEM[3].NUMERO;

VET_PASSAGEM[34].DISTANCIA;

VET_PASSAGEM[2].ORIGEM;

40
Declarao de vetor de estrutura

 Outro exemplo mais completo....

 Considere que voc est fazendo um


programa que leia o nome e as 4 notas
escolares de 8 alunos.

41
Declarao de vetor de estrutura
Nome:______
 Esquematicamente: notas
Nome:______
1 2 3 4
notas
Nome:______
Cadastro de notas
1 2 3 4
escolares notas
Nome:______
1 2 3 4 7
notas
Nome:______
notas
1 2 3 4 6
Nome:______
notas
1 2 3 4 5
Nome:______
1 2 3 4 4 tor
notas
Nome:______ ve
1 2 3 4 3 d o
notas e s
2 d i c
1 2 3 4
n
1
0 42
Declarao de vetor de estrutura

 Viso esquemtica do vetor de estruturas:

0
1

Cadastro de notas 2
escolares Nome:______
3
notas
4 1 2 3 4

6
7

43
Declarao de vetor de estrutura

 Definio da estrutura e do vetor de 8 alunos.

estrutura cad_aluno
{
caracter NOME[40];
real NOTAS[4];
}

cad_aluno ALUNOS[8];

44
Leitura de um vetor de estrutura
 Procedimento para ler os dados dos alunos:

le_vetor_alunos(ref cad_aluno A[8])


{ Recebe, por referncia, um
vetor com oito alunos ( A[8] )
inteiro I,J;
para (I  0; I < 8; I  I + 1) faa
{
leia(A[I].NOME);
para (J  0; J < 4; J  J + 1) faa
{
leia(A[I].NOTA[J]);
}
}
}
45
Leitura de um vetor de estrutura
 Procedimento para ler os dados dos alunos:

le_vetor_alunos(ref cad_aluno A[8])


{
Variveis auxiliares
inteiro I,J;
para (I  0; I < 8; I  I + 1) faa
{
leia(A[I].NOME);
para (J  0; J < 4; J  J + 1) faa
{
leia(A[I].NOTA[J]);
}
}
}
46
Leitura de um vetor de estrutura
 Procedimento para ler os dados dos alunos:

le_vetor_alunos(ref cad_aluno A[8])


{
inteiro I,J;
para (I  0; I < 8; I  I + 1) faa
{
Lao para ler os oito alunos
leia(A[I].NOME);
para (J  0; J < 4; J  J + 1) faa
{
leia(A[I].NOTA[J]);
}
}
}
47
Leitura de um vetor de estrutura
 Procedimento para ler os dados dos alunos:

le_vetor_alunos(ref cad_aluno A[8])


{
inteiro I,J; Para cada aluno, um lao para
ler as suas quatro notas
para (I  0; I < 8; I  I + 1) faa
{
leia(A[I].NOME);
para (J  0; J < 4; J  J + 1) faa
{
leia(A[I].NOTA[J]);
}
}
}
48
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])
{ Todo vetor, quando passado
por parmetro, passado por
inteiro I,J; referncia !!!!
para (I  0; I < 8; I  I + 1 faa
{
imprima(A[I].NOME);
para (J  0; J < 4; J  J + 1) faa
{
imprima(A[I].NOTA[J]);
}
}
}
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])
{
Variveis auxiliares
inteiro I,J;
para (I  0; I < 8; I  I + 1 faa
{
imprima(A[I].NOME);
para (J  0; J < 4; J  J + 1) faa
{
imprima(A[I].NOTA[J]);
}
}
}
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])
{ Lao para imprimir os oito
inteiro I,J; alunos

para (I  0; I < 8; I  I + 1 faa


{
imprima(A[I].NOME);
para (J  0; J < 4; J  J + 1) faa
{
imprima(A[I].NOTA[J]);
}
}
}
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 faa
{ Para cada aluno, um lao para
imprima(A[I].NOME); imprimir as suas quatro notas

para (J  0; J < 4; J  J + 1) faa


{
imprima(A[I].NOTA[J]);
}
}
}
52
Exemplo de vetores de estruturas em C
#include <stdio.h> void imprimeVetorAlunos(aluno a[], int n)
#include <stdlib.h> {
int i, j;
typedef struct cad_aluno printf("\nAlunos:");
{ for( i = 0; i < n; i++)
char nome[40]; {
float notas[4]; printf("\n%20s ", a[i].nome);
}aluno; for( j = 0; j < 4; j++)
printf("%.2f ", a[i].notas[j]);
void leVetorAlunos(aluno a[], int n) }
{ }
int i, j;
for( i = 0; i < n; i++) int main()
{ {
printf("Informe o nome do aluno"); aluno alunos[8];
gets(a[i].nome); leVetorAlunos(alunos, 8);
printf("Informe as 4 notas "); imprimeVetorAlunos(alunos, 8);
for( j = 0; j < 4; j++) return 0;
scanf("%f%*c", &a[i].notas[j]); }
}
}
53
Exerccios
1) Defina uma estrutura para representar as informaes de um
carto de crdito.

2) Defina uma estrutura para representar o peso a altura de uma


pessoa.

3) Considerando a estrutura do exerccio (2) e a inicializao


de variveis abaixo:
pessoa joao, maria;
joao.altura 1.90; joao.peso 98;
maria.altura 1.50; maria.peso 55;
Escreva uma instruo que atribua 1.78 altura de joao;
Escreva uma instruo que atribua 75 ao peso de maria.
Escreva um conjunto de instrues para imprimir a mdia
das alturas e a mdia dos pesos de joao e maria.

54
Exerccios
4) Faa um programa (funo principal) para leitura, via teclado, dos
dados de um aluno. Os dados a serem guardados na estrutura
aluno so os seguintes: nome, curso, idade. Ao final, imprima estas
informaes na tela.

5) Considere a mesma estrutura definida anteriormente. Acrescente


estrutura um vetor com as notas das trs provas feitas pelo aluno,
calcule a sua mdia e diga se ele foi aprovado ou no (media >=
60). Para o clculo da mdia e leitura das notas, utilize o comando
para (que 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 distncia entre eles.
Apresente no final a distncia entre os dois pontos.

55
Exerccios

7) Faa um programa que permita a entrada de registros com


nome, cidade e telefone de 5 pessoas. Imprima ao final os
dados armazenados.

8) Faa um programa que receba trs nomes de no mximo 100


caracteres cada e as idades das respectivas pessoas em um
vetor de estruturas. Aps o recebimento, listar os trs nomes
e idades armazenados neste vetor.

9) Faa um programa que armazene as informaes de 11


jogadores de um time de futebol. Cada jogador identificado
pelo nmero da sua camisa, pelo seu peso, altura e pela
inicial do seu nome. O programa dever ler todas as
informaes e imprimir ao final a lista completa de jogadores
com todas as informaes lidas, a inicial do jogador mais
baixo e o nmero do mais pesado.

56
Exerccios
10) Faa um programa que permita a entrada de registros com CPF,
nome, idade, cidade e telefone de no mximo 100 pessoas. Faa
um menu com as seguintes opes:
Menu:
1 Ler as informaes de uma pessoa
2 Imprima por idade
3 Imprima por inicial
4 Imprima todos os registros cadastrados
O programa dever ter as seguintes caractersticas:
 No primeiro item, pea inicialmente o ndice do vetor que
deseja alterar.
 No segundo item, pea a idade mnima e mxima e imprima
as pessoas que esto neste intervalo.
 Faa funes para realizar as operaes de cada um dos
itens do menu.
 Inicialize o CPF de todos os 100 registros no incio do
programa com -1. Utilize essa informao no item 4 para
definir se um registro foi ou no lido naquela posio
especfica do vetor. CPF com valor -1 simbolizam posies
no lidas do vetor. 57
Estruturas
DCC 120
Estruturas: Declarao
 A sintaxe para declarao de uma varivel deste tipo a seguinte:

struct <nome_estrutura>
{
tipo1 nome1;
tipo2 nome2; ...
};
struct <nome_estrutura> identif_1,identif_2,...;

Ou:

struct <nome_estrutura>
{
tipo1 nome1;
tipo2 nome2;...
} identificador1,identificador2,..;
59
Estrutura

 Veja um exemplo de estrutura que armazenaria


a matricula e o nome de um funcionrio.

struct funcionario
Definio

{
char matricula[15];
char nome[100];
};
Declarao

...
struct funcionario f1;

60
Estruturas: Manipulao
 Campos ou membros de uma estrutura podem
ser usados da mesma forma como as variveis.

 Campos so acessados usando o operador de


acesso ponto (.) entre o nome da estrutura e
o nome do campo.

61
Estruturas: Manipulao

 Para modificar um campo de uma estrutura,


basta usarmos novamente o operador (.). No
exemplo anterior, poderamos ler o nome do
funcionrio f1 da seguinte forma

struct funcionario f1;


gets(f1.nome);

62
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("Informaes armazenadas:\n");
puts(f1.matricula);
puts(f1.nome);
return 0;
}

63
Estruturas: Outras formas de Declarao

struct endereco
{
char rua [50];
int numero;
char bairro[20];
char cidade[30];
char sigla_estado[3];
int CEP;
}end;

64
Estruturas: Outras formas de Declarao

possivel realizar as operaes de definio, declarao e


inicializao de estruturas em conjunto:

struct horario
{
int horas;
int minutos;
int segundos;
} horario_do_nascimento = { 8, 45, 0 };

65
Typedef
 Permite a definio de um novo nome para um
determinado tipo. A sintaxe :
typedef antigo_nome novo_nome;
 Exemplos:
typedef int inteiro;

typedef struct scoord


{
int x;
int y;
}coord;
coord primeira,segunda;
66
Exemplo de uso do typedef
#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;
}
67
Vetores de estruturas
typedef struct sproduto
{
int codigo;
char descricao[120];
}produto;

 Aps a definio da estrutura produto, pode-se


definir um vetor de produtos como:

produto estoque[100];

68
Acesso aos elementos do vetor
typedef struct sproduto
{
int codigo;
char descricao[120];
}produto;

 Utilizando o exemplo acima, pode-se modificar o


campo cdigo dos dois primeiros produtos da
seguinte forma:
produto estoque[100];
...
estoque[0].codigo = 10;
estoque[1].codigo = 17;

69
Acesso aos elementos do vetor
typedef struct sproduto
{
int codigo;
char descricao[120];
}produto;

 Ainda fazendo uso do exemplo acima, o fragmento


de cdigo para ler os 100 produtos ficaria assim:

produto estoque[100];
...
for(int i = 0; i < 100; i++)
{
scanf("%d", &estoque[i].codigo);
gets(estoque[i].descricao);
}
70
Cdigo 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;
}

71
Inicializao de um vetor de estruturas

typedef struct sproduto


{
int codigo;
char descricao[120];
}produto;

 Pode-se inicializar um vetor de estruturas no


momento de sua criao como o cdigo abaixo:

produto estoque[3] =
{235, "Teclado USB",
245, "Monitor LCD",
515, "Memoria DDR"};

72
Inicializando um vetor de estruturas
typedef struct sproduto
{
int codigo;
char descricao[120];
}produto;

 Se inicializarmos menos elementos do que os


alocados em memria, o restante do vetor ficar
zerado (se numrico) ou vazio (se strings).
produto estoque[6] =
{235, "Teclado USB",
245, "Monitor LCD",
515, "Memoria DDR"};

 No exemplo acima, os ndices 3, 4 e 5 do vetor


tero cdigo 0 e descrio vazia.
73
Funes e vetores de estruturas
 Vetores de estruturas podem ser passados como
argumentos de funes 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);
}
}
74
Estruturas e funes 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 funo de leitura
ImprimeProdutos(estoque); // Chama funo de impresso
return 0;
}

75
Estruturas e funes Exemplo 2/3
..........
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);
}
}
...............

76
Estruturas e funes Exemplo 3/3
..........

void ImprimeProdutos( produto estoque[TAM] )


{
int i;
for( i = 0; i < TAM; i++)
printf("%3d - %s\n",estoque[i].codigo, estoque[i].descricao);
}

.........

77
Estruturas e funes - 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);
}
}

78
Estruturas e funes - Completo
 Continuao...
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 funo de leitura
ImprimeProdutos(estoque); // Chama funo de impresso
return 0;
}

79
Exerccios
1) Faa um programa que leia as informaes de N alunos (sendo N definido
com a diretiva define). As informaes que devero ser lidas de cada
aluno so: matrcula, nome e mdia final. Ao final, informe os nomes dos
alunos que foram aprovados (>= 60).

2) Faa um programa para fazer o cadastro dos veculos de uma empresa.


Podero ser cadastrados no mximo 100 veculos e as informaes a
serem armazenadas so as seguintes: nome do condutor, placa do veculo
e cor do veculo. Armazene tambm o turno que os veculos so
armazenados como sendo m (manh), t (tarde), n (noite) e i (dia inteiro).
Informe ao final a lista completa dos veculos cadastro com todas as
informaes que forem cadastradas. Utilize procedimentos para fazer a
leitura e a escrita dos dados.

3) Faa um programa que gerencie o estoque de uma empresa. Faa a


leitura dos produtos que contenham os seguintes campos: nome do
produto, quantidade em estoque e preo unitrio. Ao final, informe as
informaes de todos os produtos. Informe tambm os produtos que
tenham o maior e o menor valor em estoque. Calcule este valor
multiplicando a quantidade de cada produto pelo seu valor unitrio. Utilize
funes para realizar operaes de leitura e escrita e faa um menu que
possibilite ler todos os produtos, ler um produto com um ndice especfico e
imprimir as informaes citadas anteriormente. 80
Exerccios

4) Elabore um programa que auxilie no controle de uma fazenda de gado


que possua um total de 100 cabeas de gado. O programa dever
conter uma estrutura que comporte:
cdigo: cdigo da cabea de gado;
leite: nmero de litros de leite produzido por semana;
alimento: quantidade de alimento ingerida por semana - em quilos;
ms de nascimento;
ano de nascimento;
abate: N(no) ou S (sim).

81
Exerccios
4) continuao...
O seu programa dever conter um menu com as seguintes
funcionalidades:
(a) Ler a base de dados (cdigo, leite, alimento, nascimento) informados
pelo usurio e armazenar em um vetor de estruturas.
(b) Preencher o campo abate, considerando que a cabea 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 semana.
(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, aps o abate
(f) Imprimir a quantidade total de alimento que vai ser consumido por
semana na fazenda, aps o abate
(g) Imprimir nmero de cabeas de gado que iro para o abate.
(h) Inclua uma opo para sair do menu.
82