51
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 10: Exercício Integrador (parte 1) PCS3111

Laboratório de Programação Orientada a Objetos para ... · Escola Politécnica da Universidade de São Paulo Laboratório de Programação Orientada a Objetos para Engenharia Elétrica

Embed Size (px)

Citation preview

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 10: Exercício Integrador (parte 1)

PCS3111

Agenda

1. Recapitulação dos principais conceitos OO

2. Namespace

3. Templates

4. STL – Standard Template Library

5. Container Vector

6. Exercício Integrador (parte 1)

2

Agenda

1. Recapitulação dos principais conceitos OO

2. Namespace

3. Templates

4. STL – Standard Template Library

5. Container Vector

6. Exercício Integrador (parte 1)

3

Principais Conceitos OO

Classe

• composta por atributos, métodos

• definição (*.h) e implementação (*.cpp) de métodos

• objetos são instâncias de classes, podendo ser estáticos

ou dinâmicos (new e delete)

Hierarquia de classes

• herança

• reuso

Classe abstrata

• só tem definição (*.h) de métodos

• implementação de métodos é realizada nas subclasses

4

Principais Conceitos OO

Métodos e atributos estáticos

• associados à classe e não às instâncias

• permitem definir propriedades e comportamentos globais

Sobrecarga de operadores

• operadores com mesmo nome e assinaturas diferentes,

na mesma classe

Polimorfismo

• operadores com mesmo nome e assinatura, mas com

implementações diferentes em classes diferentes

Tratamento de Exceções

• permite tratar de modo elegante comportamentos

anômalos (try e catch)

5

Agenda

1. Recapitulação dos principais conceitos OO

2. Namespace

3. Templates

4. STL – Standard Template Library

5. Container Vector

6. Exercício Integrador (parte 1)

6

Namespace

Em certas ocasiões, um programa deve ser

dividido em múltiplos arquivos. Isto se deve aos

seguintes fatores:

• Uso de bibliotecas de classes

em linguagens procedurais, fornecedores provêm bibliotecas de

funções;

em linguagens OO, fornecem-se bibliotecas de classes

• Organização de vários programadores trabalhando em

um grande projeto

cada um é responsável por uma funcionalidade

• Projeto conceitual de um programa

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

Namespace

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

• Arquivos de Header

(*.h)

• Diretórios

• Projetos

Namespace Como garantir que desenvolvedores distintos não

usem os mesmos nomes de classes, métodos ?

• Programadores preferem nomes curtos: add, subtract,

find

• Deveriam então aumentar estes nomes?

• Exemplo: PCS3111_João_Silva_Ex01_alarme.dispara ?

Solução: Namespaces

• Nome que se atribui a um pedaço de um código fonte

• Referência ao código deve ser feita através de uma

referência ao respectivo namespace

• Torna os elementos internos invisíveis ao resto do

código

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

Namespace namespace geo

{

const double PI = 3.14159;

double circumf(double radius)

{ return 2 * PI * radius; }

} //end namespace geo

double c = circumf(10); //won’t work here

double c = geo::circumf(10); //OK

using namespace geo;

double c = circumf(10); //OK

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

Namespace //namespace1.cpp

#include <iostream>

namespace geo {

const double PI = 3.14159;

double circumf(double radius)

{ return 2 * PI * radius; }

}

11

int main() {

double c;

// c = circumf(10); //won’t work here

c = geo::circumf(10);

std::cout << c << std::endl;

{ using namespace geo;

c = circumf(10);

std::cout << c << std::endl;

}

using namespace std;

using namespace geo;

c = circumf(10);

cout << c << endl;

}

Namespace //namespace2.cpp

#include <iostream>

using namespace std;

const double PI = 3.14159;

namespace geo {

double circumf(double radius)

{ return 2 * PI * radius; }

}

namespace geo2 {

double circumf(double diam)

{ return PI * diam; }

}

int main() {

double c;

c = geo::circumf(10);

cout << c << endl;

c = geo2::circumf(10);

cout << c << endl;

}

12

Saída:

62.8318

31.4159

Namespace //fileA.h

namespace alpha

{ void funcA(); }

// fileA.cpp

#include "fileA.h"

#include <iostream>

using namespace std;

void alpha::funcA() {

cout << "funcA" << endl;

}

// ou

// namespace alpha {

// void funcA() {

// cout << "funcA" << endl;

// }

// }

13

// fileMain.cpp

#include "fileA.h"

using namespace alpha;

int main() {

funcA();

}

Namespace

Podem-se criar namespaces sem atribuir um

nome a eles

• São criados automaticamente pelo compilador

• É atribuído um nome local, restrito ao arquivo

• A visibilidade é restrita a qualquer parte do próprio

arquivo

14

Agenda

1. Recapitulação dos principais conceitos OO

2. Namespace

3. Templates

4. STL – Standard Template Library

5. Container Vector

6. Exercício Integrador (parte 1)

15

Templates Suponha que desejemos implementar uma função que

retorna o valor absoluto de um inteiro:

int abs(int n) //absolute value of ints

{ return (n<0) ? -n : n; //if n is negative, return –n }

Se precisarmos para um long:

long abs(long n) //absolute value of longs

{ return (n<0) ? -n : n; //if n is negative, return –n }

Se precisarmos para um float:

float abs(float n) //absolute value of floats

{ return (n<0) ? -n : n; //if n is negative, return –n }

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

Templates Suponha que desejemos implementar uma função que

retorna o valor absoluto de um inteiro:

int abs(int n)

{ if (n<0) n=-n; return n; }

Se precisarmos para um long:

long abs(long n)

{ if (n<0) n=-n; return n; }

Se precisarmos para um float:

float abs(float n)

{ if (n<0) n=-n; return n; }

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

Templates

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

Templates #include <iostream>

using namespace std;

template <class T> //function template

T abs(T n)

{ return (n < 0) ? -n; n; }

int main()

{

int int1 = 5; int int2 = -6;

long lon1 = 70000L; long lon2 = -80000L;

double dub1 = 9.95; double dub2 = -10.15;

//calls instantiate functions

cout << “\nabs(“ << int1 << “)=” << abs(int1);

cout << “\nabs(“ << int2 << “)=” << abs(int2);

cout << “\nabs(“ << lon1 << “)=” << abs(lon1);

cout << “\nabs(“ << lon2 << “)=” << abs(lon2)

cout << “\nabs(“ << dub1 << “)=” << abs(dub1);

cout << “\nabs(“ << dub2 << “)=” << abs(dub2);

cout << endl;

return 0; }

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

Here’s the output of

the program:

abs(5)=5

abs(-6)=6

abs(70000)=70000 abs(-

80000)=80000 abs(9.95)=9.95

abs(-10.15)=10.15

Templates #include <iostream>

using namespace std;

template <class T>

//OU template <typename T>

T abs(T n)

{ if (n<0) n=-n;

return n;

}

int main() {

int int1 = 5; int int2 = -6;

long lon1 = 70000L; long lon2 = -80000L;

double dub1 = 9.95; double dub2 = -10.15;

//calls instantiate functions

cout << abs(int1) << endl;

cout << abs(int2) << endl;

cout << abs(lon1) << endl;

cout << abs(lon2) << endl;

cout << abs(dub1) << endl;

cout << abs(dub2) << endl;

}

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

Here’s the output of

the program:

5

6

70000

80000

9.95

10.15

Templates

Quando o compilador lê a palavra template no

código fonte, não gera código pois não sabe

ainda qual o tipo de argumento

Quando a função é invocada (no exemplo, em

cout << … abs(lon1) … << “) , o compilador

sabe que o argumento é do tipo long e neste

momento instancia o template, isto é, gera o

código com o tipo correspondente

Isto é repetido para cada vez em que a função é

invocada.

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

Templates

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

Templates

#include <iostream.h>

using namespace std;

const int MAX = 100; //size of array

template <class Type>

class Stack

{

private:

Type st[MAX]; //stack: array of any type

int top; //number of top of stack

public:

Stack() { top = -1; } //constructor

void push(Type var) //put number on stack

{ st[++top] = var; }

Type pop() //take number off stack

{ return st[top--]; }

};

23

Templates int main()

{

Stack<float> s1; //s1 is object of class Stack<float>

s1.push(1111.1F); //push 3 floats, pop 3 floats

s1.push(2222.2F);

s1.push(3333.3F);

cout << “1: “ << s1.pop() << endl;

cout << “2: “ << s1.pop() << endl;

cout << “3: “ << s1.pop() << endl;

Stack<long> s2; //s2 is object of class Stack<long> s2.push(123123123L); //push 3 longs, pop 3 longs s2.push(234234234L);

s2.push(345345345L);

cout << “1: “ << s2.pop() << endl;

cout << “2: “ << s2.pop() << endl;

cout << “3: “ << s2.pop() << endl;

return 0; } 24

Templates

25

//stack.cpp

#include <iostream>

using namespace std;

const int MAX = 100;

template <typename Type>

class Stack {

private:

Type st[MAX];

int top;

public:

Stack() { top = -1; }

void push(Type var) {

st[++top] = var;

}

Type pop() {

return st[top--];

}

};

int main() {

Stack<float> s1;

s1.push(1111.1F);

s1.push(2222.2F);

s1.push(3333.3F);

cout << "1: " << s1.pop() << endl;

cout << "2: " << s1.pop() << endl;

cout << "3: " << s1.pop() << endl;

Stack<long> s2;

s2.push(123123123L);

s2.push(234234234L);

s2.push(345345345L);

cout << "1: " << s2.pop() << endl;

cout << "2: " << s2.pop() << endl;

cout << "3: " << s2.pop() << endl;

}

Agenda

1. Recapitulação dos principais conceitos OO

2. Namespace

3. Templates

4. STL – Standard Template Library

5. Container Vector

6. Exercício Integrador (parte 1)

26

STL – Standard Template Library

Biblioteca padrão que fornece classes para

representar e manipular estruturas de dados

que usualmente são utilizadas por diversas

aplicações

Várias entidades, sendo três as principais:

• Containers: modos como os dados são organizados

na memória do computador (ex: plihas, listas ligadas)

• Algoritmos: procedimentos aplicados aos containers

para processar seus dados (ex: busca, classificação)

• Iteradores: generalização de ponteiros, para que se

refiram a elementos dos containers

27

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

28

STL – Standard Template Library

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

STL – Standard Template Library

Containers • Sequence containers

Vector

List

Deque

• Associative containers

Set

Multiset

Map

Multimap

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

29

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

STL – Standard Template Library

30

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

STL – Standard Template Library

31

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

STL – Standard Template Library

32

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

STL – Standard Template Library

Podem-se criar Containers Adapters

• Criam containers de propósito especial, cujas interfaces são

mais simples que as originais

• Na STL, são fornecidos 3 containers de propósito especial:

pilhas, filas e filas de prioridade.

33

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

STL – Standard Template Library

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

Agenda

1. Recapitulação dos principais conceitos OO

2. Namespace

3. Templates

4. Biblioteca Padrão

5. Container Vector

6. Exercício Integrador (parte 1)

35

Container Vector Um Vector é um arranjo (Array) dinâmico de tamanho

dinâmico, sendo que o programador não precisa se

preocupar em alocar e desalocar memória

O container expande e contrai o tamanho do vetor à

medida que dados são inseridos ou retirados do mesmo

Pode usá-lo como um Array, acessando elementos

através do operador []. O acesso neste modo é muito

rápido

Também se pode adicionar (push) um novo item no final

(back) do vetor de modo bastante eficiente. Ao realizar

esta operação, o tamanho do vetor é automaticamente

incrementado

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

Container Vector // vector.cpp

// demonstrates push_back(), operator[], size()

#include <iostream>

#include <vector>

using namespace std;

int main() {

vector<int> v; //create a vector of ints

v.push_back(10); //put values at end of array

v.push_back(11);

v.push_back(12);

v.push_back(13);

v[0] = 20; //replace with new values

v[3] = 23;

for(int j=0; j<v.size(); j++)

cout << v[j] << ' '; //20 11 12 23

cout << endl;

}

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

Container Vector // vector2.cpp

#include <iostream>

#include <vector>

using namespace std;

vector<int> f(vector<int>& v)

// Devolve vector de forma eficiente.

// Passagem de parametro funciona normalmente

{ vector<int> t(v.size());

for (int i=0; i<v.size(); i++)

t[i]=v[i]+1;

return t;

}

int main() {

vector<int> v(3); // Cria vetor com 3 elementos

v[0]=0;

v[1]=1;

v[2]=2;

vector<int> w=f(v);

for (int j=0; j<w.size(); j++)

cout << w[j] << ' ';

cout << endl;

}

38

Agenda

1. Recapitulação dos principais conceitos OO

2. Namespace

3. Templates

4. Biblioteca Padrão

5. Container Vector

6. Exercício Integrador (parte 1)

39

Contexto

Sistema de automação residencial

40

Equipamentos

Ventilador

Lâmpada

Ar Condicionado

Chuveiro Máquina de

lavar roupa

Sensores

Sensor de

presença Sensor de

temperatura

Contexto

Local e Espaço

• Espaços possuem equipamentos

41

Sala de

Jantar

Cozinha Sala

Quarto1 Quarto2

Suíte

Banheiro

Banheiro

da Suíte

Corredor

Espaço

Local

Espaço

Ar Condicionado

Lustre (lâmpada) Abajur (lâmpada)

Contexto

Cada espaço possui 1 sensor de temperatura e

1 sensor de presença

• Os sensores são monitorados por alguns tipos de

equipamentos

• Exemplo

Se a temperatura estiver mais alta que um limite superior,

liga-se o ventilador que está no espaço

O usuário pode:

• Ver o estado de todos os sensores e equipamentos

• Configurar um equipamento específico

Exemplo: ligar, desligar e alterar velocidade do ventilador

• Pedir para os equipamentos se “controlarem”

Em um sistema real isso seria feito automaticamente 42

Software

Representação de Local, Espaço, Equipamento

e Sensor

• Classes

Leitura de um arquivo de configuração

• Classe LeitorDeConfiguração

Painel de acesso às informações

• Classe Painel

O software funciona! Teste-o

43

Equipamentos

Classes relativas aos equipamentos

• Namespace equipamentos

• (Só o nome dos

métodos novos)

44

ligarestaLigadodesligar

Equipamento

setTemperatura

ArCondicionado

Ventilador SensorDePresenca

getVelocidadegetVelocidadeMaximaaumentarVelocidadediminuirVelocidade

EquipamentoDeVentilacao

Lâmpada Chuveiro MáquinaDeLavarRoupa

SensorDeTemperatura1

monitora

1

monitora

getNomecontrolarexibir

ItemControlável

Qualquer coisa

que é controlada

(classe abstrata)

Classe abstrata

que representa

um equipamento

Equipamentos de

ventilação monitoram o

sensor de temperatura

Monitora o

sensor de

presença (mas

ainda não faz

nada)

Local e Espaço

Classes Local e Espaço

• Sem namespace (global)

45

getNomecontrolarexibir

ItemControlável

SensorDeTemperatura

SensorDePresenca

1possui

1possui

adicionarEspacogetEspacogetQuantidadeDeEspacos

LocalgetEquipamentogetQuantidadeDeEquipamentosadicionarArCondicionadoadicionarLampadaadicionarVentiladoradicionarChuveiroadicionarMáquinaDeLavarRoupa

Espaco

*

Equipamento

*

possui

Painel

1

controla

Também são

filhas de

ItemControlável

Espaço tem 1 de

cada sensor

Espaço tem

vários (um vetor)

de Equipamentos

Painel de

controle

(IHC)

Sensores

Classes de relativas ao sensor

• Namespace sensores

46

geIdalarmeAcionadolerexibir

Sensor

getTemperaturagetLimiteInferiorgetLimiteSuperior

SensorDeTemperatura

SensorDePresenca

Controle

Método controlar é chamado em cada classe

local, espaço e equipamento

• Chamada manual (menu no console)

(Em um sistema real ela seria chamada de tempos em tempos) 47

Casa:Local :Espaco :Equipamento

Usuário

paineCentral:Painel

Controlar residênciacontrolar()

[para cada Espaço]loop controlar()

[para cada Equipamento]loop

controlar()

Menu no console

Outros detalhes

Classe LeitorDeConfiguracao carrega um

arquivo de configuração

• Formato similar ao usado na aula passada

• residencia.txt

Exceções (namespace erros)

• ErroDeArquivo

Erro ao ler o arquivo

• ErroDeCadastro

Erro ao cadastrar um item

• ErroDeControle

Erro durante o controle de um Equipamento

48

Problema

Economia de água!

1. Horário de economia de água

Qualquer equipamento que usa água deve

• Ser desligado após o horário de economia

• Não pode ser ligado após o horário de economia

• Altere o menu para permitir definir o horário de economia

2. Chuveiro

Deve ser desligado caso o SensorDePresença monitorado

não detecte presença no Espaço

3. Máquina de lavar roupa

Adicionar um modo de ligar que informa o programa e o nível

de água

49

Leia os detalhes das atividades a serem feitas

no enunciado

Problema

Para casa

• Altere a classe Espaço para guardar os Equipamentos

usando um vector

Classes que devem ser alteradas

• Chuveiro, MáquinaDeLavarRoupa, Painel e Espaço

Existem várias decisões a serem tomadas

• Analise se outras classes devem ser criadas

• Analise onde criar alguns métodos

50

A avaliação considerará o bom uso dos conceitos da OO

Dicas

Execute o programa para entender o seu

funcionamento

As classes Chuveiro e MáquinaDeLavarRoupa já

existem e são carregadas no arquivo de

configuração

• (Não é preciso alterar a leitura do arquivo)

Veja o enunciado para ver como acessar a hora

do computador

• Para testar, altere o horário de economia e não a hora

do computador

51