Buscar

Registros em C - Estruturas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1 
LINGUAGEM E TÉCNICA DE PROGRAMAÇÃO I 
 
Profa. Gisele Busichia Baioco 
gisele@ft.unicamp.br 
 
 
Algoritmos Estruturados e 
Linguagem de Programação Estruturada 
 
Registros em C - Estruturas 
1 Variáveis Compostas Heterogêneas – Registros em C 
As Variáveis Compostas Heterogêneas ou Registros são estruturas de dados 
presentes na maioria das linguagens de programação que possibilitam agrupar variáveis de 
tipos de dados distintos. 
Para exemplificar, imagine uma passagem de ônibus que é formada por um conjunto 
de informações, tais como número de passagem (inteiro), origem e destino (caractere), data 
(caractere), horário (caractere), poltrona (inteiro), distância (real), que são componentes do 
registro, também chamados de campos. Logo, um registro é composto por campos que 
especificam cada uma das informações. 
 
 
 
 
 
 
 
 
 
Em C, os registros são conhecidos como Estruturas e os campos são chamados de 
membros. 
A referência ao conteúdo de um dado membro da estrutura será indicada pela seguinte 
notação: 
 
 identificador-da-estrutura.identificador-do-membro 
 
Sintaxe de declaração em C: 
 
1) Definição da estrutura e declaração de variáveis do tipo estrutura feitas simultaneamente: 
 
struct nome-da-estrutura { /* definição da estrutura */ 
 tipo-de-dado membro1; 
 tipo-de-dado membro2; 
 ... 
 tipo-de-dado membroN; 
} lista-de-identificadores; /* declaração de variáveis */ 
 
Número: 00001 
De:_________________________ Para: _______________________ 
Data:_____/_____/______ Horário: ________:________ 
Poltrona: ____________ Distância: ____________________ Km 
 2 
onde: 
nome-da-estrutura: define o nome da estrutura e, neste caso, é opcional; 
tipo-de-dado: é o tipo de dado de cada membro da estrutura; 
membro1, membro2,..., membroN: são os nomes (identificadores) de cada componente 
(membro) da estrutura; 
lista-de-identificadores: são os nomes (identificadores) associados a estrutura declarada, a 
partir dos quais a estrutura será referenciada. Cada identificador da lista deve ser separado por 
vírgula. 
 
Exemplo: Definição de uma estrutura de nome cliente e declaração de uma variável cadastro 
do tipo cliente, que possui a seguinte forma: 
 
 
 
 
 
 
 
 
 struct cliente { 
 char nome[41]; 
 int rua, número; 
 unsigned long int cep; 
 char sexo; 
 unsigned long int fone[3]; 
 char cpf[15]; 
 char nascimento[11]; 
 short int temdep; 
 } cadastro; 
 
 ou então, omitindo o nome da estrutura: 
 
 struct { 
 char nome[41]; 
 int rua, número; 
 unsigned long int cep; 
 char sexo; 
 unsigned long int fone[3]; 
 char cpf[15]; 
 char nascimento[11]; 
 short int temdep; 
 } cadastro; 
 
2) Definição da estrutura e declaração de variáveis do tipo estrutura feitas separadamente: 
 
struct nome-da-estrutura { /* definição da estrutura */ 
 tipo-de-dado membro1; 
 tipo-de-dado membro2; 
 ... 
 tipo-de-dado membroN; 
}; 
 
/* declaração de variáveis */ 
struct nome-da-estrutura lista-de-identificadores; 
 
NOME 
RUA NÚMERO CEP 
CPF 
SEXO FONE1 FONE2 FONE3 
NASCIMENTO 
TEMDEP 
 
 3 
onde: 
nome-da-estrutura: define o nome da estrutura e, neste caso, é obrigatório; 
tipo-de-dado: é o tipo de dado de cada membro da estrutura; 
membro1, membro2,..., membroN: são os nomes (identificadores) de cada componente 
(membro) da estrutura; 
lista-de-identificadores: são os nomes (identificadores) associados a estrutura declarada, a 
partir dos quais a estrutura será referenciada. Cada identificador da lista deve ser separado por 
vírgula. 
 
Exemplo: Definição de uma estrutura de nome cliente e declaração de uma variável cadastro 
do tipo cliente, que possui a seguinte forma: 
 
 
 
 
 
 
 
 
 struct cliente { 
 char nome[41]; 
 int rua, número; 
 unsigned long int cep; 
 char sexo; 
 unsigned long int fone[3]; 
 char cpf[15]; 
 char nascimento[11]; 
 short int temdep; 
 }; 
 
 /* declaração da variável cadastro do tipo struct cliente */ 
 struct cliente cadastro; 
 
 Em uma definição de estrutura, os membros podem ser outras estruturas, ou mesmo 
vetores e matrizes. 
Exemplo: Outra possibilidade de definição da estrutura cliente é a seguinte: 
 
 struct cliente { 
 char nome[41]; 
 struct ender { 
 int rua, número; 
 unsigned long int cep; 
 } endereco; 
 char sexo; 
 unsigned long int fone[3]; 
 char cpf[15]; 
 char nascimento[11]; 
 short int temdep; 
 } cadastro; 
 
 
NOME 
RUA NÚMERO CEP 
CPF 
SEXO FONE1 FONE2 FONE3 
NASCIMENTO 
TEMDEP 
 
 4 
ou então: 
 
 struct ender { 
 int rua, número; 
 unsigned long int cep; 
 }; 
 
 struct cliente { 
 char nome[41]; 
 struct ender endereco; 
 char sexo; 
 unsigned long int fone[3]; 
 char cpf[15]; 
 char nascimento[11]; 
 short int temdep; 
 }; 
 
 struct cliente cadastro; 
 
 Para referenciar (acessar) o membro cpf da estrutura declarada anteriormente, deve-se 
colocar o identificador da variável estrutura, seguido por um ponto e o nome do membro: 
 
 cadastro.cpf 
 
Para referenciar (acessar) o membro cep da estrutura declarada anteriormente, deve-se 
colocar o identificador da variável estrutura mais externo, seguido pelo endereco e finalmente 
com o cep: 
 
 cadastro.endereco.cep 
 
 Essas referências podem ser utilizadas em comandos de entrada e saída, atribuição, 
enfim, onde seja necessário acessar o conteúdo de um campo individual de uma estrutura. 
Exemplos: 
 gets(cadastro.cpf); 
 cadastro.fone[1] = 35341234; 
 if (cadastro.temdep != 0) 
 ... 
 cadastro.endereco.cep = 13500111; 
 printf(“%d”, cadastro.endereco.rua); 
 ... 
2 Vetores e Matrizes de Estruturas 
Supondo que fosse necessário manter registros de informações relativas a passagens 
rodoviárias de todos os lugares de um ônibus. Para solucionar esse problema pode-se utilizar 
um vetor, onde cada posição do vetor corresponde a um registro referente a informações de 
uma passagem. Assim, supondo que um ônibus tenha 44 lugares, cria-se um vetor no qual 
cada posição é um elemento do tipo registro passagem, tal como mostrado a seguir: 
 5 
 
 
 
0 
 
 
1 
 
 
2 
 
… … 
 
43 
 
 struct { 
 int numero; 
 char origem[31], destino[31]; 
 char data[11], horário[6]; 
 int poltrona; 
 float distancia; 
 } vetpassagem[44]; 
 
 As referências ao conteúdo de um membro do vetor de estruturas devem considerar o 
índice onde se encontra o registro desejado. Por exemplo, no caso do vetpassagem, se fosse 
necessário referenciar a data da passagem que está na posição (índice) 10 faz-se: 
 
 vetpassagem[10].data 
 
 Essa solução pode ser estendida para matrizes de estruturas. Por exemplo, suponha a 
necessidade de manter registros de 44 passagens de ônibus para 10 ônibus distintos. Para 
solucionar esse problema basta criar uma matriz com 10 linhas e 44 colunas, onde cada linha 
corresponde a um ônibus e as colunas correspondem às informações sobre as passagens de 
cada ônibus. A declaração fica: 
 
 struct { 
 int numero; 
 char origem[31], destino[31]; 
 char data[11], horário[6]; 
 int poltrona; 
 float distancia; 
 } matpassagem[10][44]; 
 
 Caso fosse necessário referenciar a data da passagem que está na posição 10 do ônibus 
da posição 5 faz-se: 
 
 matpassagem[5][10].data 
3 Exemplo de Programa 
Fazer um programa C que realiza o cadastro de contas bancárias com as seguintes 
informações: número da conta, nome do cliente e saldo. O banco permitirá o cadastramento 
Número: 00001
De:_________________________ Para: _______________________
Data:_____/_____/______Horário: ________:________
Poltrona: ____________ Distância: ____________________ Km
 
 6 
de apenas 15 contas e não pode haver mais de uma conta com o mesmo número. Criar o menu 
de opções a seguir: 
1. Cadastrar contas 
2. Visualizar todas as contas de um determinado cliente 
3. Excluir a conta com o menor saldo (supondo a não existência de saldos iguais) 
4. Sair 
 
#include <stdio.h> 
#include <string.h> 
#define MAX 15 
main() 
{ 
 /* Declaração de variáveis */ 
 struct { 
int num; 
char nome[41]; 
float saldo; 
} conta[MAX]; 
 int i, op, pos, achou, num_conta; 
 char nome_cliente[41]; 
 /* inicialização das contas */ 
for (i = 0; i < MAX; i++) 
 { 
 conta[i].num = 0; 
 strcpy(conta[i].nome, “\0”); 
 conta[i].saldo = 0; 
 } 
 do { 
 printf(“Menu\n”); 
 printf(“1. Cadastrar contas\n”); 
 printf(“2. Visualizar todas as contas de determinado cliente\n”); 
 printf(“3. Excluir a conta com o menor saldo\n”); 
 printf(“4. Sair\n”); 
 printf(“Digite sua opção: ”); 
 scanf(“%d”, &op); 
 /* Entrada de Dados específicos e processo */ 
 switch(op) 
 { 
 case 1: 
achou = 0; 
 printf(“Digite o numero da conta: ”); 
 scanf(“%d”, &num_conta); 
 /* Verifica se a conta já está cadastrada */ 
for (i = 0; i < MAX && achou == 0; i++) 
 if (conta[i].num == num_conta) 
achou = 1; 
if (achou == 1) 
 printf(“Conta ja existente\n”); 
else { 
/* Encontra uma posição vazia */ 
pos = -1; /* posição inválida */ 
i = 0; 
while (i < MAX) 
 if (conta[i].num == 0) 
 { 
 pos = i; 
 i = MAX; /* finaliza o loop */ 
 } 
 7 
 else i++; 
if (pos == -1) /* vetor já preenchido */ 
 printf(“Impossível cadastrar novas contas\n”); 
else { /* cadastra a conta */ 
 printf(“Digite o nome: ”); 
 scanf(“%s”, conta[pos].nome); 
 printf(“Digite o saldo:”); 
 scanf(“%f”, &conta[pos].saldo); 
 conta[pos].num = num_conta; 
 printf(“Conta cadastrada com sucesso.\n”); 
} 
 } 
 break; 
 case 2: 
printf(“Digite o nome do cliente: “); 
 scanf(“%s”, nome_cliente); 
 achou = 0; 
for(i = 0; i < MAX; i++) 
 if (strcmp(conta[i].nome,nome_cliente) == 0) 
 { 
printf(“%d %f\n”,conta[i].num, conta[i].saldo); 
achou = 1; 
 } 
if (achou == 0) 
 printf(“Não existe contas para este cliente.\n”); 
 break; 
case 3: 
/* busca o saldo da primeira conta cadastrada */ 
i = 0; 
achou = 0; 
while (i < MAX && achou == 0) 
 if (conta[i].num != 0) 
 { 
achou = 1; 
pos = i; 
 } 
 else i++; 
if (achou == 0) 
 printf(“Nenhuma conta foi cadastrada.\n”); 
else { /* busca pela conta de menor saldo */ 
 for(i = pos+1; i < MAX; i++) 
 if (conta[i].saldo < conta[pos].saldo 
 && conta[i].num != 0) 
 pos = i; 
 /* exclui a conta de menor saldo */ 
 conta[pos].num = 0; 
 strcpy(conta[pos].nome,“\0”); 
 conta[pos].saldo = 0; 
 printf(“Conta excluida com sucesso.\n”); 
 } 
break; 
 default: 
 if (op != 4) 
 printf(“Opção invalida\n”); 
 } 
 } while (op != 4); 
} 
 8 
4 Exercício de Fixação 
Uma determinada biblioteca possui obras de ciências exatas, ciências humanas e 
ciências biomédicas, totalizando no máximo 150 volumes, sendo 50 de cada área. O 
proprietário resolveu informatizá-la e, para tal, agrupou as informações sobre cada livro de 
acordo com a seguinte estrutura: 
 
 
 
 
 
 
Construa um programa C que: 
a) declare tal estrutura e reúna todas as informações de todas as obras em três vetores distintos 
para cada área; 
b) crie um menu com as seguintes opções: 
1. Cadastrar obras 
2. Consulta às informações de uma obra 
3. Alteração das informações de uma obra 
4. Excluir uma obra 
5. Sair 
 
A funcionalidade de cada opção está descrita a seguir: 
 opção 1: cadastra (insere) uma obra de uma determinada área, desde que essa obra já 
não esteja previamente cadastrada, ou seja, desde que não exista uma obra da mesma área 
com o mesmo código já cadastrada. Considerar que as posições vazias para novos cadastros 
tem o código da obra com valor 0. Considerar também que só é possível o cadastro de no 
máximo 50 obras de cada área; 
 opção 2: consulta às informações a partir do código da obra e a sua área fornecidos 
pelo usuário: existindo tal obra, informa seus campos; caso contrário, envia uma mensagem 
de aviso “OBRA INEXISTENTE”; 
 opção 3: alteração das informações de um registro. Para tal, o usuário fornece o 
código, a área e, se a obra existir (pesquisar pelo código e área), as demais informações sobre 
a obra; 
 opção 4: realiza a exclusão do registro de uma obra existente a partir do código e área 
fornecidos pelo usuário. Uma obra excluída tem o código com valor 0; 
 opção 5: finaliza a execução do programa, ou seja, enquanto não for escolhida a opção 
5 o programa deve mostrar o menu de opções e executar as funcionalidades da opção 
escolhida. 
Código de Catalogação: ___________ 
Nome da Obra: ______________________________________________ 
Nome do Autor: ______________________________________________ 
Editora: __________________________ Nº de Páginas: ______________

Outros materiais