programação científica c++ - ncdd.com.br+/slide9.pdf · tipos estruturados ou estruturas de...
Post on 20-Jan-2019
219 Views
Preview:
TRANSCRIPT
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
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
(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;
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
top related