programação científica c++ - ncdd.com.br+/slide9.pdf · tipos estruturados ou estruturas de...

38
Programação científica C++ Slide 9 NIELSEN CASTELO DAMASCENO

Upload: donga

Post on 20-Jan-2019

219 views

Category:

Documents


0 download

TRANSCRIPT

Programação científica C++

Slide 9

NIELSEN CASTELO DAMASCENO

Tipos Estruturados

Definição de novos tipos com structElementos do structExemplosExercícios

Motivação

Muitas vezes precisamos agrupar informações de tipos diferentes sob um mesmo nome.

Tipos Estruturados ou Estruturas de Dados Heterogêneas

Uma estrutura (struct) ou registro em C++ é uma coleção de um ou mais valores (possivelmente de tipos diferentes), agrupados sob um único nome. Estruturas constituem um recurso importante para organizar os dados utilizados por um programa graças à possibilidade de tratar um grupo de valores como uma única variável.

Uma estrutura é um tipo de dado cujo formato é definido pelo programador.

Definição de tipos estrutura

Elementos individuais de uma estrutura são chamados membros;

Membros podem ter tipos diferentes (primitivo, matriz ou struct);

O nome de uma estrutura agrega vários membros, enquanto os membros, individualmente, devem possuir identificadores únicos;

Como definir um tipo estrutura?

Definição de um tipo estrutura

• Sintaxe:struct <Nome da Estrutura>{

<Tipo> <Identificadores>;<Tipo> <Identificadores>;...

} ;

• Exemplo:struct Data {

int dia;int mes;int ano;

} ;

Cada identificadordefine um membrode uma estrutura

A estrutura “Data” possui3 membros: dia, mês e ano

Exemplo de estrutura

struct contaBancaria{char Nome[15];int ContaNo[10];double saldo;Data Niver;

};

struct Estudante{char Nome[15];int Id;char Curso[20];char sexo;

};

A estrutura Estudantetem 4 membros

A estrutura contaBancariatem uma estrutura simples, dois vetores e um tipoprimitivo como membros

Declarando variáveis do tipo estrutura

• Sintaxe:<Nome da Estrutura> <Lista de Identificadores>;

• Exemplo:Estudante std1, std2;

std1 std2Nome

Id Sexo

Curso

Nome

Id Sexo

Curso

Acesso aos elementos

Chan Tai Man

12345 M

COMP

• Os membros de um tipo estrutura são acessados com a utilização do operador ponto(.): <variavel_struct>.<nome_membro>;

• Exemplo:std1.Id = 12345;std1.sexo = 'M';strcpy(std1.Nome, "Chan Tai Man");strcpy(std1.Curso, "COMP");cout << “Estamos falando com o(a): ";switch (std1.sexo){

case 'F': cout << “Sra. "; break;case 'M': cout << “Sr. "; break;

}cout << std1.Nome << endl;

std1

Nome

Id Sexo

Curso

Exemplo para:

1-Definir tipo struct;

2- Declarar variável;

3- Usar variável;

(1)

(2)

(3)

Exercício

1. Distância entre pontos:

Construa um algoritmo que, tendo como dados de entrada dois pontos quaisquer no plano, P(x1,y1) e P(x2,y2), escreva a distância entre eles. A fórmula que efetua tal cálculo é: d=sqrt((x2-x1)²+(y2-y1)²).

Estruturas aninhadas• Exemplos:

struct ponto{ double x, y;

};

struct linha{ponto p1, p2;

};

struct triangulo{ ponto p1, p2, p3;

};

triangulo T;ponto P;linha L;

Estruturas aninhadas

struct linha{ponto p1, p2;

};linha L;

linha

p1 p2

x y x y

Estruturas aninhadas

(4, 11)

(2, 7)(6, 5)

(2, 0)

((8, 3)

Utilizando as estruturas anteriores:

1. Declare variáveis pararepresentar cada uma das situações da figura ao lado, i. e., ponto, linha, triangulo;

2. Atribua os valores constantesno gráfico às variáveis criadasno item 1;

(10, 9)

Estruturas aninhadas

(4, 11)

(2, 7)(6, 5)

(2, 0)

((8, 3)

(10, 9)

ponto P;linha L;triangulo T;P.x = 4;P.y = 11;

L.p1.x = 2;L.p1.y = 7;L.p2.x = 10;L.p2.y = 9;

T.p1.x = 2;T.p1.y = 0;T.p2.x = 6;T.p2.y = 5;T.p3.x = 8;T.p3.y = 3;

(4, 11)

(2, 7)(6, 5)

(2, 0)

((8, 3)

(10, 9)

Exercício

2. Controle de Estacionamento:a) Crie uma estrutura chamada HORAIO, contendo três membros

inteiros: hora, min, seg.b) Crie uma estrutura chamada CARRO para armazenar dados dos

veículos de um estacionamento. Essa estrutura deve ser capaz de armazenar a placa de um carro, o horário de entrada e o horário de saída do mesmo no estacionamento. Utilize a estrutura do item anterior para armazenar os horários.

c) Faça um programa que crie uma variável do tipo CARRO, leia do usuário a placa de um veículo e os horários de entrada e saída do mesmo em um estacionamento. Em seguida armazene os valores lidos na variável criada.

Vetor de estruturas

• Um vetor de tipos primitivos: um tipo de dado em cadaposição

• Um vetor de estrutura: pode conter diferentes tipos de dados em cada posição do vetor

0 1 2 … 98 99

0 1 2 … 98 99

Vetor de estruturas• Exemplo:

Estudante Classe[100];

strcpy(Classe[98].Nome, "Chan Tai Man");Classe[98].Id = 12345;strcpy(Classe[98].Curso, "COMP");Class[98].Sexo = 'M';

Class[0] = Class[98];

19

. . .

0 1 2 … 98 99

Chan Tai Man

12345 M

COMP

Vetor como membro de estrutura

• Exemplo:

struct quadrado{ponto vertex[4];

};quadrado Sq;

• Assinalar valores para Sq usando os dados do gráfico. Ver código a seguir.

(4, 3) (10, 3)

(4, 1) (10, 1)

x y x y x y x y

Criando um sistema para biblioteca

Defina o tipo livro, utilizando a palavra reservada struct, contendo as seguintes informações:

código, título e número de páginas

Sistema biblioteca

struct livro {

int id;

char titulo[50];

int numero_de_paginas;

};

int main(void) {livro biblioteca[10];for (int i=0; i<10; i++) {

biblioteca[i].id = i; cout<<"Dados do livro ID:<< i <<endl;cout<<“-Nome: ”;gets(biblioteca[i].titulo);cout<<“-Numero de Paginas:”;cin>>biblioteca[i].numero_de_paginas;

}

for (int i=0; i<10; i++) {cout<<"Dados do livro ID:”<< i <<endl;cout<<“-Nome:”;puts(biblioteca[i].titulo);cout<<“-Numero de Paginas:”;cout<<biblioteca[i].numero_de_paginas;cout<<”\n------------------------\n”;

} }

Sistema biblioteca

Como organizar a biblioteca com estantes, as estantes com prateleiras e as prateleiras com livros ?

Sistema biblioteca

struct livro {

int id;

char titulo[50];

int numero_de_paginas;

};

struct estante {

livro prateleiras[5][10];

};

struct biblioteca{

estante estantes[10];

};

int main(void) {

biblioteca zilamamede;

int i;

for (i=0; i<10; i++) {

livro l;

l.id = i;

cout << "Dados do livro ID: “ << i ;

cout << " - Nome:”;

cin >> l.titulo;

cout << " - Numero de Paginas:";

cin >> l.numero_de_paginas;

zilamamede.estantes[0].prateleiras[0][i] = l;

}

for (i=0; i<10; i++) {

livro l;

l = zilamamede.estantes[0].prateleiras[0][i];

cout << "Dados do livro ID: “ << i;

cout << " - Nome: “ << l.titulo;

cout << " - Numero de Paginas: “ << l.numero_de_paginas;

cout << “\n------------------------\n";

}

return 0;

Exercício

3. Agenda telefônica:Construir um sistema em que o usuário possa cadastrar, alterar, remover, listar e procurar contatos.

Inicialização de estruturas

struct Ponto{

double x,y;

};

Ponto origem = {0,0};

struct Data{int dia;char mes[10];int ano;

};

Data natal = {25, “Dezembro”, 2011};

A inicialização de estruturas é semelhante àinicialização de matrizes.

Inicialização de vetores de estruturas

struct Ponto{

double x,y;

};

Ponto trapezio[] = { {5,5}, {5,10}, {10,5}, {10,13} };

Inicialização de estruturas aninhadas

struct Ponto{

double x,y;

};

struct Linha{Ponto p1, p2;

};

Linha l = {{1.0,2,0}, {3.5,4.8}};

struct Data{int dia;char mes[10];int ano;

};

struct Pessoa{char nome[50];Data nasc;

};

Pessoa chico = { “Francisco”,

{10, “Maio”, 1970} };

Atribuições entre estruturas

Data natal = {25, “Dezembro”, 2011};

Data feriado = natal;

• A informação contida em uma variável de uma estrutura pode ser atribuída a outra variável. • O bloco de memória associado à variável original é todo (todos os campos) copiado para a variável destino.• A atribuição só é permitida entre variáveis de mesmo tipo.

Passando estruturas para funções

• As estruturas podem ser passadas para funções da mesma forma que variáveis simples.• A passagem pode ser feita por valor ou referência.

struct Venda{int pecas;float preco;

};void listaVenda(Venda, Venda);

int main(){Venda A, B;cout << “Venda A\n”;cout << “Numero de pecas:”;cin >> A.pecas;cout << “Preco:”;cin >> A.preco; cout << “Venda B\n”;cout << “Numero de pecas:”;cin >> B.pecas;cout << “Preco:”;cin >> B.preco;

listaVenda(A,B);return 0;

}

void listaVenda(Venda X, Venda Y){

cout << “VENDA TOTAL\n”;cout << “Pecas: ” <<

(x.pecas+y.pecas) << endl;cout << “Preco: ” <<

(x.preco+y.preco) << endl;}

Passando estruturas por valor

A chamada à função listaVenda() cria novas variáveis X e Y para conter as cópias dos valores das variáveis A e B da função main(), enviadas como argumento.

Passando estruturas por referência

struct Venda{int pecas;float preco;

};void listaVenda(Venda&, Venda&);

int main(){Venda A, B;cout << “Venda A\n”;cout << “Numero de pecas:”;cin >> A.pecas;cout << “Preco:”;cin >> A.preco; cout << “Venda B\n”;cout << “Numero de pecas:”;cin >> B.pecas;cout << “Preco:”;cin >> B.preco;

listaVenda(A,B);return 0;

}

void listaVenda(Venda& X, Venda& Y){

cout << “VENDA TOTAL\n”;cout << “Pecas: ” <<

(x.pecas+y.pecas) << endl;cout << “Preco: ” <<

(x.preco+y.preco) << endl;}

Na passagem por referência, não há cópias de variáveis, evitando-se o uso desnecessário de espaço.As variáveis X e Y de listaVenda() são referências para as variáveis A e B de main().

Passando estruturas por referência

struct Venda{int pecas;float preco;

};void totalVendas(Venda&, Venda&, Venda &);

int main(){Venda A, B, T;cout << “Venda A\n”;cout << “Numero de pecas:”;cin >> A.pecas;cout << “Preco:”;cin >> A.preco; cout << “Venda B\n”;cout << “Numero de pecas:”;cin >> B.pecas;cout << “Preco:”;cin >> B.preco;

totalVendas(A,B,T);

cout << “VENDA TOTAL\n”;cout<<“Pecas:”<< T.pecas <<endl;cout<<“Preco:”<< T.preco <<endl;

return 0;}

void totalVendas(Venda& X, Venda& Y, Venda& total){

total.pecas = X.pecas+Y.pecas;total.preco = x.preco+Y.preco;

}

A variável T de main() é modificada dentro função totalVendas() através da referência total.

Funções que retornam uma estrutura

struct Venda{int pecas;float preco;

};void totalVendas(Venda&, Venda&, Venda&);Venda novaVenda();void imprimeVenda(Venda&);

int main(){Venda A, B, T;A = novaVenda();B = novaVenda();totalVendas(A,B,T);return 0;

}void totalVendas(Venda& X, Venda& Y, Venda& total){

total.pecas = X.pecas+Y.pecas;total.preco = x.preco+Y.preco;imprimeVenda(total);

}

Venda novaVenda(){Venda nova;cout << “Nova Venda\n”;cout << “Numero de pecas:”;cin << nova.pecas;cout << “Preco:”;cin << nova.preco;return nova;

}

void imprimeVenda(Venda& X){cout << “VENDA\n”;cout<<“Pecas:”<< X.pecas <<endl;cout<<“Preco:”<< X.preco <<endl;

}

Uma estrutura completa é retornada por novaVenda() através do comando return.O conteúdo da variável nova é copiado para as variáveis A e B, membro a membro, após cada chamada à função novaVenda().

Mensagem final da disciplina

Programar é uma atividade que:Faz você passar várias madrugadas acordado.

Faz com você passe menos tempo com os amigos.

Rouba várias horas do seu tempo de lazer.

Stress.

Por que eu devo programar?Programar é uma ferramenta que transforma suas ideias em realidade.

“Conhecimento é poder”.

“Grandes poderes trazem grandes responsabilidades”.

Logo:

“Grandes conhecimentos trazem grandes responsabilidades”.

Sem a programação esse vídeo não existiria e teríamos um pedaço de papel com ideias bem bonitas.

http://www.nature.com/nature/journal/v485/n7398/extref/nature11076-s5.mov