Baixe o app para aproveitar ainda mais
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: ______________
Compartilhar