Logo Passei Direto
Buscar

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

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?