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