Você está na página 1de 22

Programação I

Estrutura (Struct)

Prof. Robson Medeiros


robson.medeiros@ufrpe.br
Introdução

›  Tipos primitivos são tipos básicos:


–  Inteiro, float, char, ...

›  Mas como representar um dado complexo, por exemplo:


–  Um registro da minha agenda telefônica.
Estruturas de dados heterogêneas

›  Vetores e matrizes não podem guardar elementos de tipos


diferentes.
›  Uma struct é uma estrutura que agrupa informações de
diferentes tipos, porém logicamente relacionadas.
›  Os campos especificam as informações que compõem uma
struct.
Estruturas de dados heterogêneas

›  Sintaxe:
–  struct nome_da_estrutura {
elemento1;
elemento2;
...
elementoN;
};

›  São definidas/declaradas antes da função main().


Estruturas de dados heterogêneas

›  Exemplo:

Conta (Estrutura)
struct Conta {
int num_conta; num_conta (Elemento)
char nome[80];
float saldo; nome(80) (Elemento)
};
saldo (Elemento)
Estruturas de dados heterogêneas

›  Podemos tratar uma estrutura como um novo tipo-de-


dados
–  typedef struct Conta ContaTipo;

›  São definidas/declaradas antes da função main().


Estruturas de dados heterogêneas

›  Exemplo (Cont.): Pode-se declarar uma variável do tipo


conta da seguinte forma:

typedef struct Conta ContaTipo;

main()
{
ContaTipo minhaConta;
...
}
Estruturas de dados heterogêneas

›  Uma estrutura pode ser definida como membro de outra


estrutura

struct Data { struct Conta {


int dia; int numConta;
int mes; char nome[80];
int ano; float saldo;
}; struct Data dataAbertura;
};
Estruturas de dados heterogêneas

›  Inicializando os valores de uma estrutura.

main()
{
ContaTipo conta1 = { 1,
“Rodrigo”,
100.00,
{21, 05, 2002}};
...
}
Estruturas de dados heterogêneas

›  O mesmo nome de um elemento pode ser utilizado em


diferentes estruturas para representar diferentes dados

struct primeira { struct segunda {


float a; char a;
int b; float b;
char c; int c;
}; };
Estruturas de dados heterogêneas

›  Acessando elementos de uma estrutura:


–  Os elementos de uma estrutura são normalmente processados
individualmente.
–  Sintaxe:
›  variavel.elemento
›  Onde: variavel refere-se ao nome de uma variável estrutura e elemento
refere-se ao nome de um elemento da estrutura.
Estruturas de dados heterogêneas

struct Data { struct Conta {


int dia; int numConta;
int mes; char nome[80];
int ano; float saldo;
}; struct Data dataAbertura;
};

struct Data d; struct Conta c;

d.dia = 5; c.numConta = 155;


d.mes = 10; c.nome = “Geraldo”;
d.ano = 2009; c.saldo = 400.00;
c.dataAbertura = d;
Estruturas de dados heterogêneas
struct A{ struct C{
int a; struct A a;
int b; int c;
}; };
typedef struct A As;
int main(){
As a;
a.a = 5;
a.b = 6;
struct C c;
c.c = 7;
c.a = a;
printf("Valor de a.a: %d\n",a.a);
printf("Valor de c.a.a: %d\n",c.a.a);
printf("Endereco de A.a: %d\n",&(a.a));
printf("Endereco de C.a.a: %d\n",&(c.a.a));
c.a.a = 20;
printf("Novo valor de c.a.a: %d\n",c.a.a);
printf("Novo valor de a.a: %d\n",a.a);
Exercicio

›  Defina uma estrutura que represente o seguinte registro:


Exercicio

›  Altere a estrutura anterior para que o endereço seja uma


estrutura a parte, usada pela estrutura cliente. Ou seja, os
dados do endereço não ficam armazenados diretamente
na estrutura cliente.
Ponteiro para Estrutura
Ponteiro para Estrutura

›  Como os outros tipos do C, as estruturas podem ser


referenciadas usando ponteiros.
–  Exemplo:

typedef struct {
int numero;
char nome[10];
float saldo;
} tConta;
tConta conta;
tConta *ptr;
ptr = &conta;
Ponteiro para Estrutura

›  Há duas formas para recuperar os valores de uma


estrutura usando o ponteiro:
–  Se st é uma estrutura e ptr é um ponteiro para st, para referenciar
a estrutura usamos:
(*ptr).elemento ou
ptr->elemento
Ponteiro para Estrutura
›  Exemplo

tConta conta, *ptr;


conta.numero = 2;
strcpy(conta.nome, "Maria");
conta.saldo = 482.25;
ptr = &conta;
printf("Numero = %i\n", (*ptr).numero);
printf("Nome = %s\n", (*ptr).nome);
pritnf("Saldo = %.2f\n", (*ptr).saldo);
/* ou */
printf("Numero = %i\n", ptr->numero);
printf("Nome = %s\n", ptr->nome);
pritnf("Saldo = %.2f\n", ptr->saldo);
Ponteiro para Estrutura
›  Exemplo
typedef struct{
char titulo[40];
float preco;
} tLivro;
void main()
{
tLivro livro, *ptr;
gets (livro.titulo);
scanf("%f", &livro.preco);
ptr = &livro;
ptr->preco = ptr->preco * 0.1;
printf("Preco de %s eh %f.", ptr->titulo, ptr->preco);
}
Exercício
›  Implemente um programa que manipula um conjunto de até
100 clientes.
›  No programa, um cliente possui um nome, idade, cpf e
endereço.
›  Um endereço é composto por logradouro, número,
complemento, bairro, cidade, cep e estado.
›  O programa deve permitir que o usuário:
–  insira clientes,
–  busque cliente pelo nome,
–  busque cliente pelo cpf
–  imprima os nomes de todos os clientes.
Dúvidas?

Você também pode gostar