Baixe o app para aproveitar ainda mais
Prévia do material em texto
ECT1203 Linguagem de Programação 2014.2 Profa. Caroline Rocha Aula 27 – Tipos Estruturados Universidade Federal do Rio Grande do Norte Escola de Ciências e Tecnologia Hora de silenciar o celular • Manter o celular sempre desligado/silencioso quando estiver em sala de aula • Nunca atender o celular em sala de aula Objetivo da Aula • Responder a seguinte pergunta: ▫ Eu sei como armazenar uma informação de um tipo (variável), sei como armazenar várias informações do mesmo tipo (matrizes)... E se eu quiser armazenar informações de tipos diferentes? • Mostrar o que são tipos estruturados como funcionam e para que servem. Roteiro • Definição de novos tipos com struct • Elementos do struct • Exemplos • Exercícios • Muitas vezes precisamos agrupar informações de tipos diferentes sob um mesmo nome. • Por exemplo, como armazenar o nome, a idade e o salário de um funcionário? Motivação const int MAX = 100; int main(){ char nome[MAX]; int idade; float salario; cout << “Digite o nome do funcionário: ”; cin.getline(nome, MAX); cout << “Digite a idade: ”; cin >> idade; cout << “Digite o salario: ”; cin >> salario; cout << nome << “: ” << idade << “ anos, R$” << salario << endl; return 0; } Tipos Estruturados ou Estruturas de Dados Heterogêneas • Uma estrutura é 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 pois trata um grupo de valores como uma única variável. Uma estrutura é um tipo de dado cujo formato é definido pelo programador. const int MAX = 100; struct Funcionario{ char nome[MAX]; int idade; float salario; }; int main(){ Funcionario novato; cout << “Informe o nome do funcionário: ”; cin.getline(novato.nome, MAX); cout << “Informe a idade: ”; cin >> novato.idade; cout << “Informe o salario: ”; cin >> novato.salario; cout << novato.nome << “: ” << novato.idade << “ anos, R$” << novato.salario << endl; return 0; } Definição de uma estrutura Sintaxe: struct <nome_da_estrutura>{ <tipo> <identificadores>; <tipo> <identificadores>; ... } ; Cada identificador define um membro da estrutura Declarando variáveis de estrutura • Definição de uma estrutura Aluno: • Declaração de variáveis do tipo Aluno: Aluno std1, std2; std1 std2 nome matricula sexo curso nome matricula sexo curso struct Aluno{ char nome[100]; int matricula; char curso[100]; char sexo; }; #include <iostream> using namespace std; const int MAX 100; struct Aluno{ char nome[MAX], curso[MAX]; int matricula; char sexo; }; int main(){ Aluno aluno; cout << “Nome: “; cin.getline(aluno.nome,MAX); cout << “Curso: “; cin.getline(aluno.curso,MAX); cout << “Matricula: “; cin >> aluno.matricula; cout << “Sexo: “; cin >> aluno.sexo; switch(aluno.sex){ case ‘M’: cout << “Sr. ” << aluno.nome <<endl; break; case ‘F’: cout << “Sra. ” << aluno.nome <<endl; } return 0; } Definindo estrutura Declarando variável de estrutura Acessando membros de estrutura struct Data { int dia; int mes; int ano; }; struct contaBancaria{ char nome[100]; char contaNo[10]; double saldo; Data nasc; }; Estruturas aninhadas Estruturas aninhadas struct Ponto{ double x, y; }; struct Linha{ Ponto p1, p2; }; struct Triangulo{ Ponto p1, p2, p3; }; Ponto P; Linha L; Triangulo T; (P.x, P.y) (L.p1.x, L.p1.y) (T.p2.x, T.p2.y) (T.p1.x, T.p1.y) (T.p3.x, T.p3.y) (L.p2.x, L.p2.y) Estruturas aninhadas struct Ponto{ double x, y; }; struct Linha{ Ponto p1, p2; }; Linha L; L p1 yx p2 yx (L.p1.x, L.p1.y) (L.p2.x, L.p2.y) Estruturas aninhadas Utilizando as estruturas anteriores: 1. Declare variáveis para representar cada uma das situações da figura ao lado; 2. Atribua os valores constantes no gráfico às variáveis criadas no item 1; (4, 11) (2, 7) (6, 5) (2, 0) ((8, 3) (10, 9) Estruturas aninhadas (4, 11) (2, 7) (6, 5) (2, 0) ((8, 3) (10, 9) Ponto P; Linha L; Lriangulo 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; #include <iostream> using namespace std; struct Ponto{ double x, y; }; struct Linha{ Ponto p1, p2; }; struct Triangulo{ Ponto p1, p2, p3; }; int main(){ 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; L.p3.x = 8; T.p3.y = 3; cout<< P.x <<“ “<< P.y << endl; cout<< L.p1.x <<“ “<< L.p1.y <<“ “<< L.p2.x <<“ “<< L.p2.y << endl; cout<< T.p1.x <<“ “<< T.p1.y <<“ “<< T.p2.x <<“ “<< T.p2.y<<“ “ <<T.p3.x<<“ “<<T.p3.y<<endl; return 0; } (4, 11) (2, 7) (6, 5) (2, 0) ((8, 3) (10, 9) • Em um programa, queremos armazenar uma lista com o nome, a matricula, o curso e o sexo de vários alunos. • Como podemos fazer isso? Vetor de estruturas #include <iostream> using namespace std; const int MAXSTR 100; const int MAXALUNOS 140; struct Aluno{ char nome[MAXSTR], curso[MAXSTR]; int matricula; char sexo; }; int main(){ Aluno turma[MAXALUNOS]; int nalunos; cin >> nalunos; for (int i=0; i<nalunos; i++){ cout << “Nome: “; cin.getline(turma[i].nome,MAXSTR); cout<<“Curso: “; cin.getline(turma[i].curso,MAXSTR); cout << “Matricula: “; cin >> turma[i].matricula; cout << “Sexo: “; cin >> turma[i].sexo; } ... } Vetor como membro de estrutura struct Ponto{ double x, y; }; struct Quadrado{ Ponto vertice[4]; }; Declare uma variável do tipo Quadrado e atribua valores usando os dados do gráfico. (4, 3) (10, 3) (4, 1) (10, 1) #include <iostream> using namespace std; struct Ponto{ double x, y; }; struct Quadrado{ Ponto vertice[4]; }; int main(){ Quadrado qdo ; qdo.vertice[0].x = 4; qdo.vertice[0].y = 3; qdo.vertice[1].x =10; qdo.vertice[1].y = 3; qdo.vertice[2].x = 4; qdo.vertice[2].y = 1; qdo.vertice[3].x =10; qdo.vertice[3].y = 1; for(int i =0; i < 4; i++){ cout << qdo.vertice[i].x << “ ” << qdo.vertice[i].y << endl; return 0; } (10, 3) (4, 1) (10, 1) (4, 3) Exercício Distância entre pontos: Escreva um programa que, tendo como dados de entrada dois pontos quaisquer no plano, (x1,y1) e (x2,y2), calcule a distância entre eles. Inicialização de estruturas A inicialização de estruturas é semelhante à inicialização de matrizes. struct Data{ int dia; char mes[10]; int ano; }; Data natal = {25,“Dezembro”,2011}; struct Ponto{ double x,y; }; Ponto origem = {0,0}; 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{ string nome; 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. Atribuições entre estruturas Aluno turma[100]; strcpy(turma[98].nome, “Fulano de Tal”); turma[98].matricula = 12345; strcpy(turma[98].curso, “BCT”); turma[98].sexo = ‘M’; turma[0] = turma[98]; . . . 0 1 2 … 98 99 Fulano de Tal 12345 M BCT Criando um sistema para biblioteca Defina o tipo livro, contendo as seguintes informações: código, título e número de páginas const int MAX 200; struct Livro { int id; char titulo[MAX]; int paginas; }; int main() { Livro biblioteca[10]; for (int i=0; i<10; i++) { biblioteca[i].id = i; cout <<“Dados do livro : “ << i+1 << endl; cout <<“ -Titulo: ”; cin.getline(biblioteca[i].titulo,MAX); cout <<“ -Numero de Paginas:”; cin >> biblioteca[i].paginas; } ... return 0; } 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[200]; int paginas; }; struct Estante { Livro prateleiras[5][10]; }; struct Biblioteca{ Estante estantes[10]; }; Sistema biblioteca Como imprimir os dados de todos os livros da biblioteca? 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 imprimeVenda(Venda v){ cout << “VENDA\n”; cout << “Pecas: ” << v.pecas << endl; cout << “Preco: ” << v.preco << endl; } int main(){ Venda abril; ... imprimeVenda(abril); ... return 0; } Passando estruturas por valor A chamada à função imprimeVenda() cria uma variável v para conter a cópias da variável abril, enviada como argumento. Passando estruturas por referência struct Venda{ int pecas; float preco; }; void imprimeVenda(Venda& v){ cout << “VENDA\n”; cout << “Pecas: ” << v.pecas << endl; cout << “Preco: ” << v.preco << endl; } int main(){ Venda abril; ... imprimeVenda(abril); ... return 0; } Na passagem por referência, não há cópias de variáveis, evitando-se o uso desnecessário de espaço. A variável v de imprimeVenda() é uma referência constante para a variável abril de main(). Passando estruturas por referência struct Venda{ int pecas; float preco; }; void imprimeVenda(const Venda& v){ cout << “VENDA\n”; cout << “Pecas: ” << v.pecas << endl; cout << “Preco: ” << v.preco << endl; } void somaVendas(const Venda& x, const Venda& y, Venda& total){ total.pecas = x.pecas + y.pecas; total.preco = x.preco + y.preco; } int main(){ Venda A, B, T; ... somaVendas(A,B,T); listaVenda(T); ... return 0; } 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; }; Venda novaVenda(){ Venda nova; cout << “Nova Venda\n”; cout << “Numero de pecas:”; cin >> nova.pecas; cout << “Preco:”; cin >> nova.preco; return nova; } void imprimeVenda(const Venda& v){ cout<< “VENDA\n”; cout<<“Pecas: ”<<v.pecas<<endl; cout<<“Preco: ”<<v.preco<<endl; } void somaVendas(const Venda& x, const Venda& y, Venda& total){ total.pecas = x.pecas + y.pecas; total.preco = x.preco + y.preco; } int main(){ Venda A, B, T; A = novaVenda(); B = novaVenda(); somaVendas(A,B,T); imprimeVenda(T); return 0; } Exercício Agenda telefônica: Construa um sistema em que o usuário possa cadastrar, alterar, remover, listar e procurar contatos.
Compartilhar