MC-102 Aula 20 Registros e outras estruturasra089067/ensino/2016_1/slides_struct.pdf...

Preview:

Citation preview

MC-102 — Aula 20Registros e outras estruturas

Instituto de Computação – Unicamp

Segundo Semestre de 2012

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Recommended