49
MC-102 — Aula 20 Registros e outras estruturas Instituto de Computação – Unicamp Segundo Semestre de 2012

MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Embed Size (px)

Citation preview

Page 1: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

MC-102 — Aula 20Registros e outras estruturas

Instituto de Computação – Unicamp

Segundo Semestre de 2012

Page 2: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Roteiro

1 Introdução

2 Registros

3 Registros em funções

4 Enumerações

5 Apelidos de tipos

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 2 / 23

Page 3: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Armazenando vários dados

Como armazenar os dados (RA, telefone, nome, endereço e data denascimento) de um aluno?

int ra;int telefone;char nome[30];char endereco[100];int dia_nascimento;int mes_nascimento;int ano_nascimento;

scanf("%d%d%s%s%d%d%d", &ra, &telefone, nome, endereco,&dia_nascimento, &mes_nascimento,&ano_nascimento);

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 3 / 23

Page 4: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Armazenando vários dados

Como armazenar os dados (RA, telefone, nome, endereço e data denascimento) de um aluno?

int ra;int telefone;char nome[30];char endereco[100];int dia_nascimento;int mes_nascimento;int ano_nascimento;

scanf("%d%d%s%s%d%d%d", &ra, &telefone, nome, endereco,&dia_nascimento, &mes_nascimento,&ano_nascimento);

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 3 / 23

Page 5: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Copiando os dadosE se quiséssemos copiar os dados do aluno?

int ra, copia_ra;int telefone, copia_telefone;char nome[30], copia_nome[30];char endereco[100], copia_endereco;int dia_nascimento, copia_dia_nascimento;int mes_nascimento, copia_mes_nascimento;int ano_nascimento, copia_ano_nascimento;

int i;

copia_ra = ra;copia_telefone = telefone;

for (i = 0; nome[i] != ’\0’; i++)copia_nome[i] = nome[i];

copa_nome[i] = ’\0’;...

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 4 / 23

Page 6: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Copiando os dadosE se quiséssemos copiar os dados do aluno?

int ra, copia_ra;int telefone, copia_telefone;char nome[30], copia_nome[30];char endereco[100], copia_endereco;int dia_nascimento, copia_dia_nascimento;int mes_nascimento, copia_mes_nascimento;int ano_nascimento, copia_ano_nascimento;

int i;

copia_ra = ra;copia_telefone = telefone;

for (i = 0; nome[i] != ’\0’; i++)copia_nome[i] = nome[i];

copa_nome[i] = ’\0’;...

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 4 / 23

Page 7: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Passando dados por parâmetros

Ou passar os dados como parâmetros de função?

void imprimir_dados(int ra, int telefone, char nome[],char endereco[], int dia_nascimento,int mes_nascimento, int ano_nascimento) {

...}

int main() {...imprimir_dados(ra, telefone, nome, endereco, dia_nascimento,

mes_nascimento, ano_nascimento);...

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 5 / 23

Page 8: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Passando dados por parâmetros

Ou passar os dados como parâmetros de função?

void imprimir_dados(int ra, int telefone, char nome[],char endereco[], int dia_nascimento,int mes_nascimento, int ano_nascimento) {

...}

int main() {...imprimir_dados(ra, telefone, nome, endereco, dia_nascimento,

mes_nascimento, ano_nascimento);...

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 5 / 23

Page 9: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Juntando os dados relacionadosMas se existisse um tipo com todos todos os dados juntos em uma sóestrutura struct ficha_aluno?

void imprimir_dados(struct ficha_aluno ficha) {...

}int main() {

struct ficha_aluno ficha, copia_ficha;

// lendoficha = ler_ficha();

// copiandocopia_ficha = ficha;

// passando por parâmetroimprimir_dados(ficha);

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 6 / 23

Page 10: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Juntando os dados relacionadosMas se existisse um tipo com todos todos os dados juntos em uma sóestrutura struct ficha_aluno?

void imprimir_dados(struct ficha_aluno ficha) {...

}int main() {

struct ficha_aluno ficha, copia_ficha;

// lendoficha = ler_ficha();

// copiandocopia_ficha = ficha;

// passando por parâmetroimprimir_dados(ficha);

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 6 / 23

Page 11: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Registro — Definição

RegistroRegistro é uma coleção de variáveis relacionadas de vários tipos,organizadas em uma única estrutura e referenciadas por um nome comum.

CaracterísticasCada variável é chamada de membro do registroCada membro é acessado per um nome na estruturaCada estrutura define um novo tipo, com as mesmas característicasde um tipo padrão da linguagem

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 7 / 23

Page 12: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Registro — Definição

RegistroRegistro é uma coleção de variáveis relacionadas de vários tipos,organizadas em uma única estrutura e referenciadas por um nome comum.

CaracterísticasCada variável é chamada de membro do registroCada membro é acessado per um nome na estruturaCada estrutura define um novo tipo, com as mesmas característicasde um tipo padrão da linguagem

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 7 / 23

Page 13: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Registro — Definição

RegistroRegistro é uma coleção de variáveis relacionadas de vários tipos,organizadas em uma única estrutura e referenciadas por um nome comum.

CaracterísticasCada variável é chamada de membro do registroCada membro é acessado per um nome na estruturaCada estrutura define um novo tipo, com as mesmas característicasde um tipo padrão da linguagem

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 7 / 23

Page 14: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Registro — Definição

RegistroRegistro é uma coleção de variáveis relacionadas de vários tipos,organizadas em uma única estrutura e referenciadas por um nome comum.

CaracterísticasCada variável é chamada de membro do registroCada membro é acessado per um nome na estruturaCada estrutura define um novo tipo, com as mesmas característicasde um tipo padrão da linguagem

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 7 / 23

Page 15: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Declaração de estruturas e registros

Declarando uma estrutura com n membrosstruct identificador {

tipo1 membro1;tipo2 membro2;...tipoN membroN;

};

Declarando um registrostruct identificador nome_registro;

Em C:Declaramos um tipo de uma estrutura apenas uma vezPodemos declarar vários registros da mesma estrutura

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 8 / 23

Page 16: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Declaração de estruturas e registros

Declarando uma estrutura com n membrosstruct identificador {

tipo1 membro1;tipo2 membro2;...tipoN membroN;

};

Declarando um registrostruct identificador nome_registro;

Em C:Declaramos um tipo de uma estrutura apenas uma vezPodemos declarar vários registros da mesma estrutura

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 8 / 23

Page 17: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Declaração de estruturas e registros

Declarando uma estrutura com n membrosstruct identificador {

tipo1 membro1;tipo2 membro2;...tipoN membroN;

};

Declarando um registrostruct identificador nome_registro;

Em C:Declaramos um tipo de uma estrutura apenas uma vezPodemos declarar vários registros da mesma estrutura

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 8 / 23

Page 18: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Exemplo de estrutura

Ficha de dados cadastrais de um alunostruct ficha_aluno {

int ra;int telefone;char nome[30];char endereco[100];int dia_nascimento;int mes_nascimento;int ano_nascimento;

};

As variáveis dia_nascimento, mes_nascimento e ano_nascimentosão relacionadas.Também podemos agrupá-las em uma estrutura!

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 9 / 23

Page 19: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Exemplo de estrutura

Ficha de dados cadastrais de um alunostruct ficha_aluno {

int ra;int telefone;char nome[30];char endereco[100];int dia_nascimento;int mes_nascimento;int ano_nascimento;

};

As variáveis dia_nascimento, mes_nascimento e ano_nascimentosão relacionadas.Também podemos agrupá-las em uma estrutura!

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 9 / 23

Page 20: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Exemplo de estrutura

Ficha de dados cadastrais de um alunostruct ficha_aluno {

int ra;int telefone;char nome[30];char endereco[100];int dia_nascimento;int mes_nascimento;int ano_nascimento;

};

As variáveis dia_nascimento, mes_nascimento e ano_nascimentosão relacionadas.Também podemos agrupá-las em uma estrutura!

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 9 / 23

Page 21: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Estruturas aninhadas

Datastruct data {

int dia;int mes;int ano;

};

Ficha de dados cadastrais de um alunostruct ficha_aluno {

int ra;int telefone;char nome[30];char endereco[100];struct data nascimento;

};

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 10 / 23

Page 22: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Estruturas aninhadas

Datastruct data {

int dia;int mes;int ano;

};

Ficha de dados cadastrais de um alunostruct ficha_aluno {

int ra;int telefone;char nome[30];char endereco[100];struct data nascimento;

};

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 10 / 23

Page 23: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Usando um registro

Acessando um membro do registroregistro.membro

Imprimindo o nome de um alunostruct ficha_aluno aluno;...printf("Nome: %s\n", aluno.nome);

Imprimindo o aniversáriostruct ficha_aluno aluno;...printf("Aniversario: %d/%d\n", aluno.nascimento.dia,

aluno.nascimento.mes);

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 11 / 23

Page 24: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Usando um registro

Acessando um membro do registroregistro.membro

Imprimindo o nome de um alunostruct ficha_aluno aluno;...printf("Nome: %s\n", aluno.nome);

Imprimindo o aniversáriostruct ficha_aluno aluno;...printf("Aniversario: %d/%d\n", aluno.nascimento.dia,

aluno.nascimento.mes);

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 11 / 23

Page 25: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Usando um registro

Acessando um membro do registroregistro.membro

Imprimindo o nome de um alunostruct ficha_aluno aluno;...printf("Nome: %s\n", aluno.nome);

Imprimindo o aniversáriostruct ficha_aluno aluno;...printf("Aniversario: %d/%d\n", aluno.nascimento.dia,

aluno.nascimento.mes);

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 11 / 23

Page 26: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Exemplo completo: média das notas#include <stdio.h>#define NUM_ALUNOS 60

struct ficha_notas {int ra;float p1, p2;

};int main() {

struct ficha_notas notas[NUM_ALUNOS];float soma = 0;int i;for (i = 0; i < NUM_ALUNOS; i++) {

printf("Digite o RA e as notas: ");scanf("%d%f%f", &notas[i].ra, &notas[i].p1, &notas[i].p2);

}for(i = 0; i < NUM_ALUNOS; i++)

soma += notas[i].p1 + notas[i].p2;

printf("Média da nota final: %f \n", soma / NUM_ALUNOS);return 0;

}(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 12 / 23

Page 27: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Registros em funções

Registros em funçõesRegistros podem ser usados como qualquer outro tipo.

Por padrão, são passados por valor em parâmetrosEstruturas podem ser usadas como tipo de retorno de uma função

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 13 / 23

Page 28: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Registros em funções

Registros em funçõesRegistros podem ser usados como qualquer outro tipo.

Por padrão, são passados por valor em parâmetrosEstruturas podem ser usadas como tipo de retorno de uma função

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 13 / 23

Page 29: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Registros em funções

Registros em funçõesRegistros podem ser usados como qualquer outro tipo.

Por padrão, são passados por valor em parâmetrosEstruturas podem ser usadas como tipo de retorno de uma função

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 13 / 23

Page 30: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Registros em funções – Exemplo#include <stdio.h>

struct retangulo {char cor[10];float largura, altura;

};

struct retangulo ler_retangulo() {struct retangulo ret;scanf("%f%f%s", &ret.largura, &ret.altura, ret.cor);return ret;

};float area_retangulo(struct retangulo ret) {

return ret.largura * ret.altura;}int main () {

struct retangulo ret;ret = ler_retangulo();printf("A área é %f.\n", area_retangulo(ret) );

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 14 / 23

Page 31: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Passando registros em funções por referênciaDevemos usar parênteses para evitar ambiguidades.

#include <stdio.h>

struct retangulo {char cor[10];float largura, altura;

};

void girar_retangulo(struct retangulo *ret) {float aux;aux = (*ret).largura;(*ret).largura = (*ret).altura;(*ret).altura = aux;

}int main () {

struct retangulo ret;ret = ler_retangulo();girar_retangulo(&ret);

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 15 / 23

Page 32: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Passando registros em funções por referênciaDevemos usar parênteses para evitar ambiguidades.

#include <stdio.h>

struct retangulo {char cor[10];float largura, altura;

};

void girar_retangulo(struct retangulo *ret) {float aux;aux = (*ret).largura;(*ret).largura = (*ret).altura;(*ret).altura = aux;

}int main () {

struct retangulo ret;ret = ler_retangulo();girar_retangulo(&ret);

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 15 / 23

Page 33: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Passando registros em funções por referênciaPodemos também usar uma notação alternativa sinônima.

#include <stdio.h>

struct retangulo {char cor[10];float largura, altura;

};

void girar_retangulo(struct retangulo *ret) {float aux;aux = ret->largura;ret->largura = ret->altura;ret->altura = aux;

}int main () {

struct retangulo ret;ret = ler_retangulo();girar_retangulo(&ret);

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 16 / 23

Page 34: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumeração

Em C, como podemos representar um conjunto conhecido de elementos,como os meses do ano ou um certo conjunto de cores?

EnumeraçãoPodemos enumerar os elementos, isto é, escrevê-los em uma listaEntão podemos atribuir um número a cada um deles

Tabela de cores#define VERMELHO 0#define VERDE 1#define AZUL 2#define MARROM 3#define ROXO 4#define AMARELO 5

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 17 / 23

Page 35: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumeração

Em C, como podemos representar um conjunto conhecido de elementos,como os meses do ano ou um certo conjunto de cores?

EnumeraçãoPodemos enumerar os elementos, isto é, escrevê-los em uma listaEntão podemos atribuir um número a cada um deles

Tabela de cores#define VERMELHO 0#define VERDE 1#define AZUL 2#define MARROM 3#define ROXO 4#define AMARELO 5

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 17 / 23

Page 36: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumeração

Em C, como podemos representar um conjunto conhecido de elementos,como os meses do ano ou um certo conjunto de cores?

EnumeraçãoPodemos enumerar os elementos, isto é, escrevê-los em uma listaEntão podemos atribuir um número a cada um deles

Tabela de cores#define VERMELHO 0#define VERDE 1#define AZUL 2#define MARROM 3#define ROXO 4#define AMARELO 5

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 17 / 23

Page 37: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumeração

Em C, como podemos representar um conjunto conhecido de elementos,como os meses do ano ou um certo conjunto de cores?

EnumeraçãoPodemos enumerar os elementos, isto é, escrevê-los em uma listaEntão podemos atribuir um número a cada um deles

Tabela de cores#define VERMELHO 0#define VERDE 1#define AZUL 2#define MARROM 3#define ROXO 4#define AMARELO 5

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 17 / 23

Page 38: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumeração – Exemplo

Em C, podemos usar uma enumeração para representar esses casos demaneira mais simples:

Enumeração de coresenum cores {

VERMELHO,VERDE,AZUL,MARROM,ROXO,AMARELO

};

Uma enumeração atribui um inteiro a cada uma das constantes,começando do 0. Por exemplo, VERMELHO vale 0 e AZUL vale 2.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 18 / 23

Page 39: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumeração – Exemplo

Em C, podemos usar uma enumeração para representar esses casos demaneira mais simples:

Enumeração de coresenum cores {

VERMELHO,VERDE,AZUL,MARROM,ROXO,AMARELO

};

Uma enumeração atribui um inteiro a cada uma das constantes,começando do 0. Por exemplo, VERMELHO vale 0 e AZUL vale 2.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 18 / 23

Page 40: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumerações – UsoPodemos usar uma variável inteira ou uma enumeração explicitamente.

Enumeração de coresenum cores cor1 = AZUL;int cor2 = VERDE;

printf("Azul é uma cor ");switch(cor1) {

case AZUL: case VERMELHO: case AMARELO:printf("primária. ");break;

default:printf("derivada. ");

}

printf("O código do verde é %d.", cor2);

Imprimirá: Azul é uma cor primária. O código do verde é 1.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 19 / 23

Page 41: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumerações – UsoPodemos usar uma variável inteira ou uma enumeração explicitamente.

Enumeração de coresenum cores cor1 = AZUL;int cor2 = VERDE;

printf("Azul é uma cor ");switch(cor1) {

case AZUL: case VERMELHO: case AMARELO:printf("primária. ");break;

default:printf("derivada. ");

}

printf("O código do verde é %d.", cor2);

Imprimirá: Azul é uma cor primária. O código do verde é 1.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 19 / 23

Page 42: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Enumerações – UsoPodemos usar uma variável inteira ou uma enumeração explicitamente.

Enumeração de coresenum cores cor1 = AZUL;int cor2 = VERDE;

printf("Azul é uma cor ");switch(cor1) {

case AZUL: case VERMELHO: case AMARELO:printf("primária. ");break;

default:printf("derivada. ");

}

printf("O código do verde é %d.", cor2);

Imprimirá: Azul é uma cor primária. O código do verde é 1.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 19 / 23

Page 43: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Mudando o valor inicialPara mudar o valor inicial de uma enumeração, basta usar o operador = .

Meses do anoenum meses {

JANEIRO = 1,FEVEREIRO,MARCO,ABRIL,MAIO,JUNHO,JULHO,AGOSTO,SETEMBRO,OUTUBRO,NOVEMBRO,DEZEMBRO

};

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 20 / 23

Page 44: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Nomeando tipos de dados

ApelidosRepresentamos os vários dados usando os tipos primários:

Às vezes, dados diferentes têm o mesmo tipo: nota, alturaTambém podemos criar novos tipos de dados ou enumeraçõesPara explicitar o significado de cada tipo, podemos dar apelidos paratipos de dados primários, estruturas, ou enumerações.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 21 / 23

Page 45: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Nomeando tipos de dados

ApelidosRepresentamos os vários dados usando os tipos primários:

Às vezes, dados diferentes têm o mesmo tipo: nota, alturaTambém podemos criar novos tipos de dados ou enumeraçõesPara explicitar o significado de cada tipo, podemos dar apelidos paratipos de dados primários, estruturas, ou enumerações.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 21 / 23

Page 46: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Nomeando tipos de dados

ApelidosRepresentamos os vários dados usando os tipos primários:

Às vezes, dados diferentes têm o mesmo tipo: nota, alturaTambém podemos criar novos tipos de dados ou enumeraçõesPara explicitar o significado de cada tipo, podemos dar apelidos paratipos de dados primários, estruturas, ou enumerações.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 21 / 23

Page 47: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Nomeando tipos de dados

ApelidosRepresentamos os vários dados usando os tipos primários:

Às vezes, dados diferentes têm o mesmo tipo: nota, alturaTambém podemos criar novos tipos de dados ou enumeraçõesPara explicitar o significado de cada tipo, podemos dar apelidos paratipos de dados primários, estruturas, ou enumerações.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 21 / 23

Page 48: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

O comando typedefComando typedeftypedef tipo_existente apelido;

typedef enum {VERMELHO, VERDE, AZUL

} Cor;

typedef float Medida;

typedef struct {Medida altura, largura;Cor cor_face, cor_linha;

} Retangulo;

int main() {Retangulo ret;ret.cor_linha = VERMELHO;ret.largura = 7.5;

}

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 22 / 23

Page 49: MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf Armazenandováriosdados Comoarmazenarosdados(RA,telefone,nome,endereçoedatade nascimento)deumaluno?

Exercícios

1 Escreva uma estrutura para representar um triângulo que contém ospontos correspondentes aos três vértices.

2 Escreva uma função que receba um triângulo e devolva a área.3 Escreva uma função que desloque um triângulo à direita de uma

distância d .4 Escreva uma função que retorne o tipo de um triângulo (escaleno,

isósceles ou equilátero). Use uma enumeração para representar o tipo.

(Instituto de Computação – Unicamp) MC-102 — Aula 20 Segundo Semestre de 2012 23 / 23