Upload
duongnhi
View
225
Download
0
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