Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná Linguagem de Programação Estruturada Estruturas 2Prof. Dr. Lucas Ferrari de Oliveira Sumário Introdução; Criando um modelo de Estrutura; Referenciando elementos da estruturas; Atribuição de Estruturas; Matrizes de Estrutura; Exemplo (Lista Postal); 3Prof. Dr. Lucas Ferrari de Oliveira Estruturas Introdução:Introdução: A linguagem C permite a criação tipos de dados de 5 formas diferentes: Estrutura (tipo de dado agregado) Campo de Bit União Enumeração Usando typedef 4Prof. Dr. Lucas Ferrari de Oliveira Estruturas Introdução:Introdução: Uma estrutura é uma coleção de variáveis referenciadas por um nome; Útil quando se deseja agrupar informações (“registros”); Uma definição de estrutura forma um modelo que pode ser usado para criar variáveis de estrutura; As variáveis que formam a estgrutura são chamados membros (ou campos ou elementos). Geralmente, todos os membros de uma estrutura são relacionados 5Prof. Dr. Lucas Ferrari de Oliveira Estruturas Criando um Modelo de Estrutura (lista postal)Criando um Modelo de Estrutura (lista postal) struct end { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; char cep[9]; }; No trecho acima, nenhuma variável foi de fato declarada. Apenas a forma dos dados foi definida. Para declarar uma variável do tipo end, escrever: struct end info; Especificador de tipo Termina com ponto-e-vírgula Elementos 6Prof. Dr. Lucas Ferrari de Oliveira Estruturas Criando um Modelo de Estrutura (lista postal):Criando um Modelo de Estrutura (lista postal): struct end info; Declara uma variável do tipo end chamada info; Quando se define uma estrutura, se está definindo um tipo complexo de variável (mas não uma variável); Porém, o tipo definido somente passa a existir quando for declarada uma variável do seu tipo! 7Prof. Dr. Lucas Ferrari de Oliveira Estruturas Criando um Modelo de Estrutura (lista postal):Criando um Modelo de Estrutura (lista postal): Quando uma variável de estrutura (como end) édeclarada, o compilador C aloca automaticamente memória suficiente para acomodar todos os seus membros. Exemplo (assumindo caracteres com 1 byte e inteiros longos com 4 bytes): Nome (30 bytes) Endereço (40 bytes) Cidade (20 bytes) Estado (3 bytes) CEP (9 bytes) 8Prof. Dr. Lucas Ferrari de Oliveira Estruturas Criando um Modelo de Estrutura (lista postal)Criando um Modelo de Estrutura (lista postal) Também se pode declarar uma ou mais variáveis ao se definir uma estrutura. Exemplo: struct end { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; char cep[9]; } info, info2, info3; 9Prof. Dr. Lucas Ferrari de Oliveira Estruturas Criando um Modelo de Estrutura (lista postal)Criando um Modelo de Estrutura (lista postal) Porém, se somente uma variável estrutura será declarada, então o nome da estrutura não é necessário: struct { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; char cep[9]; } info; 10Prof. Dr. Lucas Ferrari de Oliveira Estruturas Criando um Modelo de Estrutura (lista postal)Criando um Modelo de Estrutura (lista postal) A forma geral de declaração de uma estrutura é: struct identificador { tipo variável_1; tipo variável_2; tipo variável_3; tipo variável_4; ... } variáveis-estrutura; 11Prof. Dr. Lucas Ferrari de Oliveira Estruturas Referenciando Elementos de uma EstruturaReferenciando Elementos de uma Estrutura A forma geral para se acessar um elemento de estrutura é: nome_da_estrutura.nome_do_elemento Nã o e sq ue ce r d o p on to 12Prof. Dr. Lucas Ferrari de Oliveira Estruturas Referenciando Elementos da Estrutura:Referenciando Elementos da Estrutura: Elementos individuais de estruturas são referenciados por meio do operador ponto. Exemplo: info.cep = “96010011”; Atribui o valor “96010011” ao campo cep da variável estrutura info. Para imprimir o CEP na tela, fazer: printf(“%s”, info.cep); 13Prof. Dr. Lucas Ferrari de Oliveira Estrutura Referenciando Elementos de uma EstruturaReferenciando Elementos de uma Estrutura De forma semelhante, a matriz de caracteres info.nome pode ser usada como argumento de fgets(): fgets(info.nome, 29, stdin); Esse comando passa um ponteiro de caracteres para o início do elemento nome; Para acessar os elementos individuais de info.nome, pode-se indexar nome: int i; for(i=0; info.nome[i]; i++) putchar(info.nome[i]); 14Prof. Dr. Lucas Ferrari de Oliveira Estruturas Atribuição de EstruturasAtribuição de Estruturas Em C padrão ANSI o conteúdo de uma estrutura pode ser atribuído a outra estrutura do mesmo tipo. #include <stdio.h> int main(void) { struct { int a; int b; } x,y; x.a = 10; y=x; printf(“d”, y.a); } Atribui uma estrutura a outra (do mesmo tipo) 15Prof. Dr. Lucas Ferrari de Oliveira Estruturas Matrizes de EstruturasMatrizes de Estruturas Talvez este seja o uso mais comum para estruturas... Primeiro definir uma estrutura Depois, declarar uma variável matriz desse tipo struct end info[100]; Cria 100 conjuntos de variáveis, onde cada variável está organizada conforme definido na estrutura end. 16Prof. Dr. Lucas Ferrari de Oliveira Estruturas Exemplo: lista postalExemplo: lista postal Desenvolver uma lista postal simples; Informações a serem armazenadas: nome, rua, cidade, estado e CEP; Iniciar pela definição da estrutura (registro) struct end { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; char cep[9]; } info[MAX]; 17Prof. Dr. Lucas Ferrari de Oliveira Estruturas #include <stdio.h> #include <stdlib.h> #define MAX 100 // definicao da estrutura struct end { char nome[30]; char rua[40]; char cidade[20]; char estado[2]; char cep[9]; } info[MAX]; // prototypes void ini_lista(void), entra(void); void apaga(void), mostra(void); int menu_seleciona(void), encontra_livre(void); 18Prof. Dr. Lucas Ferrari de Oliveira Estruturas int main(void) { int escolha; // inicializa a lista ini_lista(); for( ; ; ) { escolha = menu_seleciona(); switch(escolha) { case 1: entra(); break; case 2: apaga(); break; case 3: mostra(); break; case 4: exit(0); break; } } } Note que: A função main possui apenas chamadas para as demais funções. Isso tende a deixar o código mais claro Há 5 funções sendo chamadas (além de exit() ) Uma sexta função é chamada dentro da função “entra”. 19Prof. Dr. Lucas Ferrari de Oliveira Estruturas Como não se pode “apagar” pedaços da memória do computador, iremos adotar uma convenção para sinalizar que uma posição da estrutura (registro) se encontra disponível; Um registro disponível terá o caractere nulo (‘\0’) na primeira posição de seu campo “nome”; Como no início do programa todas as posições estarão livres, inicializar a matriz de estruturas será colocar um ‘\0’ na primeira posição do campo “nome” de cada estrutura // Funcao que inicializa a lista // colocando um caractere nulo no primeiro byte do campo nome void ini_lista(void) { int i; for( i=0; i<MAX; i++) info[i].nome[0]='\0'; } 20Prof. Dr. Lucas Ferrari de Oliveira Estruturas // Obtem a selecao do usuario int menu_seleciona(void) { char s[2]; int c; prinft("1. Inserir um nome\n"); prinft("2. Excluir um nome\n"); prinft("3. Listar o arquivo\n"); prinft("4. Sair\n"); do{ printf("\nDigite sua escolha:"); scanf(“%s”,s); c = atoi(s); } while(c<0 || c>4); return c; } Esta função solicita ao usuário que digite uma opção válida, retornando esta informação (como um inteiro) para a função que a chamou. Note que não há uma mensagem de erro, caso o usuário digite uma opção inválida 21Prof. Dr. Lucas Ferrari de Oliveira Estruturas // Insere na lista os dados referentes a um usuario void entra(void) { int slot; slot=encontra_livre(); if(slot == -1) { printf("\nLista Cheia!!"); return; } printf(“Digite o nome: “); fgets(info[slot].nome,30,stdin); printf(“Digite a rua: “); fgets(info[slot].rua, 40,stdin); printf(“Digite a cidade: “); fgets(info[slot].cidade,20,stdin); printf(“Digite o estado: “); fgets(info[slot].estado, 3, stdin); printf(“Digite o cep: “); fgets(info[slot].cep, 9, stdin); } Esta função inicia chamando a função “encontra_livre”, a qual retorna o índice da primeira posição livre, a partir da posição 0. Após, ela solicita os dados de um usuário, preenchendo os campos devidos. 22Prof. Dr. Lucas Ferrari de Oliveira Estruturas Esta função retorna o índice da primeira posição livre, a partir da posição 0; Caso todas as posições estejam ocupadas, ela retorna -1. // Encontra a primeira estrutura livre, a partir da posicao 0 // Se todas estruturas estirevem sendo usadas, retorna -1 int encontra_livre(void) { int i; for( i=0; info[i].nome[0] && i< MAX; i++); if( i==MAX) return -1; // todos elementos estao sendo usados return i; } 23Prof. Dr. Lucas Ferrari de Oliveira Estruturas Esta função marca um endereço como disponível, escrevendo ‘\0’ na primeira posição do campo “nome”; Ou seja, os dados não são apagados (pois isso não seria possível). // Apaga um endereco void apaga(void) { int slot; char s[80]; printf("Digite o numero do registro que deseja apagar: "); scanf(“%s”,s); slot = atoi(s); if(slot >=0 && slot < MAX) info[slot].nome[0]='\0'; } 24Prof. Dr. Lucas Ferrari de Oliveira Estruturas Esta função imprime todos os dados de todas as posições da matriz de estruturas, iniciando pelos dados da posição 0 (zero). // Imprime o conteudo da lista na tela void mostra(void) { int i; for( i=0; i<MAX; i++) if(info[i].nome[0]) { printf("%s", info[i].nome); printf("%s", info[i].rua); printf("%s", info[i].cidade); printf("%s\n", info[i].estado); printf("%s\n", info[i].cep); } } 25Prof. Dr. Lucas Ferrari de Oliveira Estruturas Exercício:Exercício: Cadastro de notas dos alunos de P1 de 6 turmas existentes. As notas correspondem às 3 provas realizadas no ano e cada turma tem no máximo 30 alunos. Criar as funções existentes no exemplo de lista postal que funcione com as turmas e os alunos; Fazer uma função de busca de aluno/turma; Monte função para visualizar, editar e apagar um registro (utilize a função busca anterior); Antes do cadastro verifique se a turma ou o aluno já estão cadastrados. Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25