49
Escola Politécnica da Universidade de São Paulo Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada a Objetos para Engenharia Elétrica Aula 11: Exercício Integrador (parte 2) PCS3111

Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Escola Politécnica da Universidade de São Paulo Escola Politécnica da Universidade de São Paulo

Laboratório de Programação

Orientada a Objetos para

Engenharia Elétrica

Aula 11: Exercício Integrador (parte 2)

PCS3111

Page 2: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Agenda

1. Container List

2. Iterators

3. Container Map

4. Exercício Integrador (parte 2)

2

Page 3: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Agenda

1. Container List

2. Iterators

3. Container Map

4. Exercício Integrador (parte 2)

3

Page 4: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

4

STL – Standard Template Library

Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 5: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

STL – Standard Template Library

Containers • Sequence containers

Vector

List

Deque -> queue / stack

• Associative containers

Set

Multiset

Map (árvore binária balanceada)

Multimap

Várias especializações a partir destes containers padrão

5

Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 6: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Sequence Containers

6

Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 7: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Sequence Containers

7 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 8: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container List Um container List é uma lista duplamente ligada, sendo

que cada elemento tem um ponteiro para o elemento

anterior e para o elemento seguinte

O container guarda o enedereço do início e do final lista,

e assim o acesso é bastante rápido nas duas direções

8 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 9: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container List

9 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 10: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container List

10 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Output: 10 20 30 40

Page 11: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container List

11 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Output: 10 20 30 40

// list.cpp #include <iostream> #include <list> using namespace std; int main() { list<int> ilist; ilist.push_back(30); ilist.push_back(40); ilist.push_front(20); ilist.push_front(10); while (!ilist.empty()) { cout << ilist.front() << " "; ilist.pop_front(); } cout << endl; }

Page 12: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Adapter-Based Containers

12 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

É implementado

como heap.

Page 13: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Agenda

1. Container List

2. Iterators

3. Container Map

4. Exercício Integrador (parte 2)

13

Page 14: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

Podem ser considerados como smart pointers

• Podem ser incrementados ou decrementados,

independentemente da forma de armazenamento dos

dados

• O código acima só pode ser usado se os dados

estiverem armazenados em espaços contíguos de

memória

• Por exemplo, não funcionaria numa lista ligada

14 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 15: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

Podem também ser vistos também como

conectores entre containers e algoritmos

• Determinam que algoritmos podem ser usados com

quais containers

• Por exemplo, o algoritmo sort () necessita de acesso

randômico ao container que deseja ordenar, senão

teria de iterar o container para achar cada elemento

antes de movê-lo, e isto seria ineficiente

• Um outro exemplo seria o algortimo reverse (), que

necessita de iterar o container nas duas direções,

senão também seria muito ineficiente

• Iterators são uma solução elegante para conectar

algoritmos a containers

15 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 16: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

16 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 17: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

17 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 18: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

18 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 19: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

19 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 20: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

20 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 21: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

21 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 22: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

22 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 23: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

23 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Output: 2 4 6 8

Page 24: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators (usando C++11)

24 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Output: 2 4 6 8 //listout.cpp #include <iostream> #include <list> #include <algorithm> using namespace std; int main() { list<int> l{2,4,6,8}; //list<int>::iterator p; for (auto p=l.begin(); p!=l.end(); p++) cout << *p << " "; cout << endl; }

Page 25: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

25 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 26: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

26 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Output: 2 4 6 8 10

Page 27: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

27 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 28: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators

28 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Output: Found 8.

Page 29: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Iterators (usando C++11)

29 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Output: Achei 8.

//iterfind.cpp #include <iostream> #include <list> #include <algorithm> using namespace std; int main() { list<int> l{2,4,6,8,10}; // Procura numero 8 auto p=find(l.begin(), l.end(), 8); if (p==l.end()) cout << "Nao achei 8\n"; else cout << "Achei 8\n"; }

Page 30: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Agenda

1. Container List

2. Iterators

3. Container Map

4. Exercício Integrador (parte 2)

30

Page 31: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Associative Containers

Nos containers sequenciais, os dados são

armazenados um após o outro

• assim, encontrar um dado requer varrer uma a uma

as posições do container

Nos containers associativos, os itens são

armazenados de um modo mais complexo, mas

que permite que sua recuperação seja feita de

modo mais eficiente

• a recuperação é feita através de uma chave

• a chave pode ser um atributo do container, ou então

ela é o próprio container

31 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 32: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Associative Containers

32 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 33: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container Map

33 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 34: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container Map

34 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 35: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container Map

35 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

Page 36: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container Map

36 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

//asso_arr.cpp #include <iostream> #include <string> #include <map> using namespace std; int main() { map<string,int> popul{ {"Wyoming",470}, {"Colorado",2890}, {"Nevada",800}, {"Montana",787} }; for (auto p=popul.begin(); p!=popul.end(); p++) cout << "Estado: " << p->first << ". Populacao: " << p->second*1000 << endl; }

Estado: Colorado. Populacao: 2890000 Estado: Montana. Populacao: 787000 Estado: Nevada. Populacao: 800000 Estado: Wyoming. Populacao: 470000

Page 37: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Container Map

37 Based on: [Lafore 2002]. Lafore, R. Object-Oriented Programming in C++. 4th. Edition, 2002. Ed, SAMS.

//asso_arr.cpp #include <iostream> #include <string> #include <map> using namespace std; int main() { map<string,int> popul; popul["Wyoming"]=470; popul["Colorado"]=2890; popul["Nevada"]=800; popul["Montana"]=787; string st="Colorado"; cout << "Populacao de " << st << " e' " << 1000*popul[st] << endl; st="Nevada"; cout << "Populacao de " << st << " e' " << 1000*popul[st] << endl; }

Populacao de Colorado e' 2890000 Populacao de Nevada e' 800000

Page 38: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Agenda

1. Container List

2. Container Map

3. Iterators

4. Exercício Integrador (parte 2)

38

Page 39: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Problema

Como ir de espaço a outro em um local?

• Exemplo: da cozinha para a suíte

Uma solução

Como implementar isso?

39

Sala de

Jantar

Cozinha Sala

Quarto1 Quarto2

Suíte

Banheiro

Banheiro

da Suíte

Corredor

Porta

Page 40: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Grafos

Um local pode ser representado como um grafo

• G = (V, E) V é o conjunto de vértices

• Vértices = Espaços

E é o conjunto de arestas

• Arestas = abertura / portas entre os locais

40

Sala de

Jantar

Sala

SuíteBanheiro da

Suíte

Quarto1

Quarto2

Banheiro

Corredor Cozinha

Espaço

Porta

Page 41: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Implementação

Como implementar isso?

• Uma opção: lista de adjacência

Vetor de tamanho |V| em que cada posição é uma lista

ligada de vértices adjacentes

Como implementar isso em C++?

41

1

2

3

4

2

2

1

1

3 /

3

2

3 /

4 /

4 /

Page 42: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Implementação em C++

Usando a STL

Problema

• Como relacionar a posição 0 ao espaço “Banheiro”?

Uma solução

• Usar um mapa: vértice → lista de vértices

42

// Um array de listas de Vértices std::list<Vertice*> listaDeAdjacencia[NUMERO_DE_VERTICES]; // Um vector de listas de Vértices std::vector<std::list<Vertice*>> listaDeAdjacencia;

std::map<Vertice*, std::list<Vertice*>> listaDeAdjacencia;

Page 43: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Traçar rota

Como traçar uma rota entre um Espaço e outro?

• Uma opção: busca em largura

A partir da origem, analisa todos os vértices adjacentes

Exemplo: da Sala ao Banheiro da Suíte

43

Banheiro

da Suíte Suíte

Sala

Cozinha

Sala de

Jantar Banheiro

Quarto 1

Quarto 2

Corredor

Page 44: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Traçar rota

Algoritmo (visto em PCS 3110)

44

Busca-Em-Largura (G, s) 1. for each vértice i ϵ V[G] – {s} 2. i.cor = BRANCO; 3. i.distancia = ∞ 4. i.predecessor = NIL 5. s.cor = CINZA 6. s.distancia = 0 7. s.predecessor = NIL 8. Seja Q uma nova fila 9. Enqueue (Q, s) 10. while !Queue-Empty(Q) 11. i = Dequeue(Q) 12. for each v ϵ G.Adj[i] 13. if v.cor == BRANCO 14. v.cor = CINZA 15. v.distancia = i.distancia + 1 16. v.predecessor = i 17. Enqueue(Q, j) 18. i.cor = PRETO

Page 45: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Busca em largura em C++

Cada vértice é um objeto

As informações não precisam ser guardadas no

vértice

• Use uma estrutura auxiliar

Simplifique o algoritmo!

• Cor e distância podem ser omitidas

Não são necessários

Use as estruturas da STL para facilitar a

implementação!

45

Page 46: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Exercício

Use o software feito na Aula 10

Entrega 0 (feito em casa)

• Altere o Espaço para usar um vector para armazenar

os Equipamentos

Entrega 1: Mapa (veja como testar)

• Crie uma classe Mapa representando o Grafo

46

class Mapa { public: Mapa(); void adicionarEspaco(Espaco* e); void conectar(Espaco* e1, Espaco* e2); void imprimirCaminho(Espaco* origem, Espaco* destino); private: std::vector<Espaco*> espacos; std::map<Espaco*,std::list<Espaco*>> listaDeAdjacencia; };

Page 47: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Exercício

Entrega 2: classe LeitorDoMapa

• Leia o grafo de um arquivo de configuração

• Formato

Exemplo: mapa.txt para a residência em casa.txt

• Caso um Espaço não esteja no Local, jogue um

ErroDeArquivo

• Veja como testar 47

<Número de Espacos> <Nome do Espaco A> <Nome do Espaco B> ... <Número de arestas> <Nome do Espaco A> <Nome do Espaco B> <Nome do Espaco C> <Nome do Espaco A> ...

Page 48: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Exercício

Entrega 2: classe LeitorDoMapa

• Definição

48

class LeitorDoMapa { public: LeitorDoMapa(Local* local); Mapa* carregar(); Mapa* carregar(std::string arquivo); private: Espaco* encontrar(std::string nome); static const std::string ARQUIVO_PADRAO; Local *local; };

Page 49: Laboratório de Programação Orientada a Objetos para Engenharia … · 2014. 11. 12. · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada

Exercício

Entrega 3: menu

• Altere o main para carregar o Mapa usando o

LeitorDeMapa

• Altere a classe Painel para traçar a rota

Dicas

• Exemplo de saída: rota entre “sala” e “quarto 2”

Sala -> Corredor -> Quarto 2

• Use o predecessor para imprimir a rota

• Use as definições das classes nos .h entregues

49

Leia os detalhes das atividades a serem feitas

no enunciado