Prof. Santiago Valdés Ravelo santiago.ravelo@inf.ufrgs.br
programa em C .
Estruturas.
INF01202 Algoritmos e programação.Tipos de dados
I Até o momento diferentes tipos de dados são armazenados isoladamente em variáveis distintas.
I Quando existe uma relação entre os dados, pode ser útil armazená-los juntos.
Problema
Suponha que um programa precisa realizar o senso de um grupo de pessoas, em que cada indivíduo tem:
I Nome
I Sobrenome
I Idade
I Peso
I CPF
Como
representamos
esses
Problema. Representação dos dados
Um indivíduo:
charnome[16], sobrenome[21]; intidade,cpf[11];
floatpeso;
Mil indivíduos:
charnomes [1000][16],sobrenomes[1000][21]; intidades[1000], cpfs[1000][11];
floatpesos[1000];
/* Dificuldade para tratar a informação, de forma separada por indivíduo!! */
Tipos de dados em C Simples: I char I int I long I float I double I void I ponteiros Estruturados: I arranjos I ESTRUTURAS I enumerativos I arquivos
Definição
I TIPO DE DADO que permite AGRUPAR INFORMAÇÕES com características diferentes.
I Elementos com TIPOS DE DADOS DIFERENTES.
I Cada unidade de informação é um CAMPO da estrutura.
Exemplo:Estrutura PESSOA com 5 campos, cada um de tipo diferente. Pessoa
Diferença entre arranjos e estruturas
Arranjo Coleção de dados homogênea:
I Todos os elementos do mesmo tipo.
I Um só nome com índices para identificar cada elemento. I Variável de tipo ponteiro
Estrutura Conjunto de dados heterogêneo:
I Os elementos podem ser de tipos diferentes.
I Cada elemento é identificado através de um nome diferente
(CAMPO).
I Não é um ponteiro, mas pode ter campos que são ponteiro e
Diferença entre arranjos e estruturas
Arranjo
Notas (Nome comum a todos os elementos)
0 1 2 3 4 5 6 7 8
Índices para identificar cada elemento
Estrutura
Pessoa (Nome comum a todos os elementos)
nome sobrenome idade peso cpf
Declaração: 4 formas diferentes I Forma 1 Só o tipo: structpessoa{ charnome[16]; charsobrenome[21]; intidade; floatpeso; intcpf[11]; };
I Forma 2 Associado à variável:
struct { charnome[16]; charsobrenome[21]; intidade; floatpeso; intcpf[11]; } pessoa1, pessoa2;
I Forma 3 Com tipo e variável:
structpessoa{ charnome[16]; charsobrenome[21]; intidade; floatpeso; intcpf[11]; };
structpessoa pessoa1, pessoa2;
I Forma 4 Omitindostructna variável:
structpessoa{ charnome[16]; charsobrenome[21]; intidade; floatpeso; intcpf[11]; };
Definição usando typedef
I Permite definir tipos abstratos: descreve intenção mas não aloca memória.
I Permite estender tipos primitivos com novos tipos do usuário, que possuem semântica própria.
I São declarações GLOBAIS. Sempre visíveis para todo o programa.
Definição usando typedef
typedef structpessoa { char nome[16]; char sobrenome[21]; int idade; float peso; int cpf[11]; }PESSOA;
Pode ser usada da forma:
structpessoa pessoa1, pessoa2;
Ou:
Estrutura de um programa em C
/*Nome e objetivo do programa*/
/*Diretivas para o pré-processador - bibliotecas*/
#include<biblioteca.h>
/*Declaração de constantes*/
#define CONSTANTE VALOR
/*Declaração typedef e de estruturas*/
typedef structnome{· · · }NOME;
/*Declaração de protótipos de funções*/
tiponome_da_função(parâmetros);
/*Declaração de variáveis globais*/
tiponome_da_variável;
/*declaração das funções não prototipadas*/
tiponome_da_função(parâmetros) {
//declaração de variáveis locais //comandos da função
}
/*Função principal*/
intmain() {
//declaração de variáveis locais //comandos da função main
return 0; }
/*escrita das funções declaradas nos protótipos*/
tiponome_da_função(parâmetros) {
//declaração de variáveis locais //comandos da função
Inicialização
typedef structnome_estrutura{ tipocampo_1;
· · ·
tipocampo_n; }NOME_ESTRUTURA;
Pode ser inicializada com valores entre chaves, na mesma ordem que aparecem na declaração:
structnome_estrutura nome_variável = { valor_1, · · · , valor_n};
Ou:
Inicialização. Exemplo
typedef structpessoa{ char nome[16]; char sobrenome[21]; intidade; floatpeso; intcpf[11]; }PESSOA;
structpessoa pessoa1 = {“Santiago”, “Ravelo”, 24, 66, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}};
Ou:
PESSOA pessoa1= {“Santiago”, “Ravelo”, 24, 66, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}};
Acesso aos dados
typedef structnome_estrutura{ tipocampo_1;
· · ·
tipocampo_n; }NOME_ESTRUTURA;
Pode acessar ao dado armazenado no campo_i da estrutura se usa o.
(ponto)
Acesso aos dados. Exemplo
typedef structpessoa{ char nome[16]; char sobrenome[21]; intidade; floatpeso; intcpf[11]; }PESSOA; pessoa1.peso= 65;
scanf(“%s”, pessoa1.sobrenome);
Estrutura com campos tipo estrutura
typedef structdata{ intdia; intmes; intano; }DATA;
typedef structpessoa{ charnome[16]; charsobrenome[21]; DATA nascimento; floatpeso; intcpf[11]; }PESSOA; PESSOA p; · · ·
printf(“Aniversario: %d do %d”, p.nascimento.dia, p.nascimento.mes);
Passagem de parâmetros por valor
typedef structdata{ intdia; intmes; intano; }DATA;
typedef structpessoa{ charnome[16]; charsobrenome[21]; DATA nascimento; floatpeso; intcpf[11]; }PESSOA; voidimprime(PESSOA p){
printf(“Nome: %s ”,p.nome);
printf(“Sobrenome: %s ”,p.sobrenome);
printf(“Aniversaro: %d do %d”, p.nascimento.dia, p.nascimento.mes);
Retorno
typedef structdata{ intdia; intmes; intano; }DATA;
typedef structpessoa{ charnome[16]; charsobrenome[21]; DATA nascimento; floatpeso; intcpf[11]; }PESSOA; PESSOA le(){ PESSOA p;
printf(“Entre o nome: ”);
scanf(“%s”,p.nome);
printf(“Entre o sobrenome: ”);
scanf(“%s”,p.sobrenome);
printf(“Entre o dia, o mes e ano de nascimento: ”);
scanf(“%d %d %d”, &p.nascimento.dia, &p.nascimento.mes, &p.nascimento.ano);
returnp; }
Passagem de parâmetros por referência
typedef structdata{ intdia; intmes; intano; }DATA;
typedef structpessoa{ charnome[16]; charsobrenome[21]; DATA nascimento; floatpeso; intcpf[11]; }PESSOA; voidle(PESSOA*p){
printf(“Entre o nome: ”);
scanf(“%s”, (*p).nome);
printf(“Entre o sobrenome: ”);
scanf(“%s”, (*p).sobrenome);
printf(“Entre o dia, o mes e ano de nascimento: ”);
scanf(“%d %d %d”, &(*p).nascimento.dia, &(*p).nascimento.mes, &(*p).nascimento.ano);
Passagem de parâmetros por referência
Operador: -> (seta)
I ponteiro->campo é uma sintaxe alternativa a
(*ponteiro).campo.
I Indica o ACESSO a um CAMPO da estrutura ATRAVÉS de um PONTEIRO a ela.
Passagem de parâmetros por referência
typedef structdata{ intdia; intmes; intano; }DATA;
typedef structpessoa{ charnome[16]; charsobrenome[21]; DATA nascimento; floatpeso; intcpf[11]; }PESSOA; voidle(PESSOA*p){
printf(“Entre o nome: ”);
scanf(“%s”,p->nome);
printf(“Entre o sobrenome: ”);
scanf(“%s”,p->sobrenome);
printf(“Entre o dia, o mes e ano de nascimento: ”);
scanf(“%d %d %d”, &p->nascimento.dia, &p ->nascimento.mes, &p->nascimento.ano);
Prof. Santiago Valdés Ravelo santiago.ravelo@inf.ufrgs.br