Вы находитесь на странице: 1из 25

Lucas Ferrari de Oliveira

Professor Adjunto
Departamento de Informática
Universidade Federal de Pelotas

Estruturas

Programação 1
Programação Estruturada em C
Sumário
Introdução;
Criando um modelo de Estrutura;
Referenciando elementos da estruturas;
Atribuição de Estruturas;
Matrizes de Estrutura;
Exemplo (Lista Postal);

Prof. Dr. Lucas Ferrari de Oliveira 2


Estruturas

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

Prof. Dr. Lucas Ferrari de Oliveira 3


Estruturas

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

Prof. Dr. Lucas Ferrari de Oliveira 4


Estruturas
Criando um Modelo de Estrutura (lista postal)

struct end Especificador
de tipo
{
  char nome[30];
   char rua[40];
   char cidade[20]; Elementos
   char estado[3];
Termina com
   unsigned long int cep;            ula
ponto-e-vírg
};                                
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;
Prof. Dr. Lucas Ferrari de Oliveira 5
Estruturas
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!

Prof. Dr. Lucas Ferrari de Oliveira 6


Estruturas
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 (4 bytes)
Prof. Dr. Lucas Ferrari de Oliveira 7
Estruturas
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];
             unsigned long int cep;
           } info, info2, info3;

Prof. Dr. Lucas Ferrari de Oliveira 8


Estruturas
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];
             unsigned long int cep;
          } info;

Prof. Dr. Lucas Ferrari de Oliveira 9


Estruturas
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;

Prof. Dr. Lucas Ferrari de Oliveira 10


Estruturas
Referenciando Elementos de uma Estrutura

A forma geral para se acessar um elemento de


estrutura é:

nome_da_estrutura.nome_do_elemento

nto
po
do
r
ce
e
qu
es
ão
N

Prof. Dr. Lucas Ferrari de Oliveira 11


Estruturas
Referenciando Elementos da Estrutura:

Elementos individuais de estruturas são referenciados


por meio do operador ponto.
Exemplo:
info.cep = 96010;

Atribui o valor 96010 ao campo cep da variável


estrutura info.
Para imprimir o CEP na tela, fazer:

        printf(“%d”, info.cep);

Prof. Dr. Lucas Ferrari de Oliveira 12


Estrutura
Referenciando Elementos de uma Estrutura
De forma semelhante, a matriz de caracteres
info.nome pode ser usada como argumento de
gets():
gets(info.nome);
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]);

Prof. Dr. Lucas Ferrari de Oliveira 13


Estruturas
Atribuiçã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>
At  int main(void)
rib
ui  {
um
(d
o ae  struct {
m st
es ru     int a;
m tu
o r     int b;
t ip a a
o) ou  } x,y;
tr
a x.a = 10;
 y=x;
 printf(“d”, y.a);
 }

Prof. Dr. Lucas Ferrari de Oliveira 14


Estruturas
Matrizes 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.

Prof. Dr. Lucas Ferrari de Oliveira 15


Estruturas
Exemplo: 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];
  unsigned long int cep;
} info[MAX];

Prof. Dr. Lucas Ferrari de Oliveira 16


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];
  unsigned long int cep;
} info[MAX];
// prototypes
void ini_lista(void), entra(void);
void apaga(void), mostra(void);
int menu_seleciona(void), encontra_livre(void);

Prof. Dr. Lucas Ferrari de Oliveira 17


Estruturas
int main(void)
{ Note que:
 int escolha;
// inicializa a lista
 ini_lista(); A função main possui apenas
 for( ; ; ) chamadas para as demais
  { funções. Isso tende a deixar o
    escolha = menu_seleciona();
    switch(escolha)
código mais claro
    {
      case 1: entra();
Há 5 funções sendo
        break;
      case 2: apaga(); chamadas (além de exit() )
        break;
      case 3: mostra();
        break;
Uma sexta função é chamada
      case 4: exit(0); dentro da função “entra”.
        break;
    }
  }
} Prof. Dr. Lucas Ferrari de Oliveira 18
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';
  }

Prof. Dr. Lucas Ferrari de Oliveira 19


Estruturas
// Obtem a selecao do usuario Esta função solicita ao
int menu_seleciona(void) usuário que digite uma
{
opção válida, retornando
  char s[2];
esta informação (como um
  int c;
inteiro) para a função que
  prinft("1. Inserir um nome\n");
a chamou.
  prinft("2. Excluir um nome\n");
  prinft("3. Listar o arquivo\n");
  prinft("4. Sair\n");
  do{ Note que não há uma
   printf("\nDigite sua escolha:");
mensagem de erro, caso o
    scanf(“%s”,s);
usuário digite uma opção
    c = atoi(s);
inválida
  } while(c<0 || c>4);
  return c;
}

Prof. Dr. Lucas Ferrari de Oliveira 20


Estruturas
// Insere na lista os dados  printf(“Digite a cidade: “);
referentes a um usuario fgets(info[slot].cidade,20,stdin);
void entra(void)                printf(“Digite o estado: “);
{                               fgets(info[slot].estado, 3, stdin);
  int slot;
  char s[80]; printf(“Digite o cep: “);
  slot=encontra_livre(); gets(s);
  if(slot == ­1) info[slot].cep=stroul(s,'\0', 10);
  { }
    printf("\nLista Cheia!!");
Esta função inicia chamando a
    return;
função “encontra_livre”, a qual
  }
retorna o índice da primeira
  printf(“Digite o nome: “);
posição livre, a partir da
  fgets(info[slot].nome,30,stdin);
posição 0.
  printf(“Digite a rua: “); Após, ela solicita os dados de
  fgets(info[slot].rua, 40,stdin); um usuário, preenchendo os
campos devidos.
Prof. Dr. Lucas Ferrari de Oliveira 21
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;
  }

Prof. Dr. Lucas Ferrari de Oliveira 22


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';
  } 23
Prof. 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("%lu\n", info[i].cep);
     }
 } Prof. Dr. Lucas Ferrari de Oliveira 24
Estruturas
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.

Prof. Dr. Lucas Ferrari de Oliveira 25