A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

CES-11 ALGORITMOS E ESTRUTURAS DE DADOS

Apresentações semelhantes


Apresentação em tema: "CES-11 ALGORITMOS E ESTRUTURAS DE DADOS"— Transcrição da apresentação:

1 CES-11 ALGORITMOS E ESTRUTURAS DE DADOS
Capítulo IX Programação Orientada a Objetos

2 Capítulo IX – Programação Orientada a Objetos
9.1 – Classes, objetos e métodos 9.2 – Herança 9.3 – Polimorfismo

3 9.1 – Classes, Objetos e Métodos
9.1.1 – Revendo tipos abstratos de dados Programação Orientada a Objetos (POO) é um paradigma de programação originado do conceito de tipos abstratos de dados (TAD’s) Tal paradigma é usado em linguagens como C++, Java, Delphy, C#, Python, Visual Basic (a partir da versão 4), etc. O MATLAB, a partir da versão 7.6, lançada em 03/2008, tem utilizado princípios de orientação a objetos Este capítulo será ilustrado com a Linguagem C++

4 TAD é um modelo de armazenamento de informações para o qual é definida uma estrutura e uma relação de operadores Por questões de disciplina, operadores fora da relação não podem ser aplicados a esses tipos Tais operadores são implementados em C por funções Numa região do programa, declara-se a estrutura de dados e define-se as funções para os operadores do TAD No resto do programa podem ser declaradas variáveis desse TAD Essas variáveis só podem figurar em chamadas dessas funções-operadoras

5 Exemplo: programa com o TAD lista linear
struct lista { int ultimo, elementos[51]; }; Funções com os operadores de listas lineares lista L, L1, L2; Região de definição do TAD lista Operadores previstos para o TAD lista: Inserir (x, p, L): insere elemento x na posição p da lista L Deletar (p, L): deleta elemento da posição p da lista L Conteudo (p, L): retorna elemento da posição p da lista L Alterar (x, p, L): altera para x o conteúdo da posição p da lista L

6 Exemplo: programa com o TAD lista linear
Operadores: Inserir (x, p, L) Deletar (p, L) Conteúdo (p, L) Alterar (x, p, L) struct lista { int ultimo, elementos[51]; }; Funções com os operadores de listas lineares lista L, L1, L2; Nesta região, a estrutura interna de uma lista deve ser considerada desconhecida

7 Exemplo: programa com o TAD lista linear
Operadores: Inserir (x, p, L) Deletar (p, L) Conteúdo (p, L) Alterar (x, p, L) struct lista { int ultimo, elementos[51]; }; Funções com os operadores de listas lineares lista L, L1, L2; Já que (L.elementos[i] = x;) é proibido, usar Alterar (x, i, L) que muda o conteúdo de L.elementos[i] Já que (L.ultimo = ;) é proibido, usar Inserir (x, i, L) – que provoca acréscimo unitário em L.ultimo, ou Deletar (p, L) – que provoca decréscimo unitário Já que (x = L.elementos[i];) é proibido, usar x = Conteúdo (i, L) que atribui a x o conteúdo de L.elementos[i] Proibido: L.ultimo = ; L.elementos[i] = x; x = L.elementos[i];

8 9.1.2 – Correspondência entre TAD’s e POO
Em Programação Orientada a Objetos: Um TAD corresponde a uma classe Uma variável de tal TAD corresponde a um objeto de tal classe Os campos da estrutura de dados de tal TAD correspondem aos atributos dos objetos de tal classe Uma função-operadora de tal TAD corresponde a um método de tal classe

9 Em vários programas escritos e elaborados em CES-11, foi usado o conceito de TAD’s
O professor exigiu dos alunos a disciplina de impedir que variáveis de certos TAD’s figurassem em operações não definidas para os mesmos O acesso à estrutura de dados de um TAD ficou restrito às funções-operadoras do mesmo Em POO essa disciplina pode ser exigida pelo compilador O programador fica impedido de desobedecê-la Esconder a estrutura de um TAD ou classe é chamado de encapsular

10 9.1.3 – Definições Em POO, combina-se numa única entidade sua estrutura de dados e as funções que operam sobre essa estrutura Tal entidade é denominada objeto Classe é uma categoria de objetos É na declaração de uma classe que se especifica a estrutura de dados e as funções que operam sobre os objetos da mesma Classes correspondem a tipos e objetos correspondem a variáveis

11 Os elementos que compõem a estrutura de dados de uma classe são denominados atributos dos objetos da mesma As funções que operam nos objetos de uma classe são denominadas métodos dessa classe Exemplo: uma classe com Apenas um atributo Um método (função) para atribuir valor ao atributo Um método (função) para mostrar o atributo no vídeo

12 #include <iostream>
#include <conio.h> using namespace std; class cl { private: int x; public: void AtribValor (int d) {x = d;} void MostraValor () { cout << "Valor = " << x << "\n"; } }; int main () { cl obj1, obj2; obj1.AtribValor (11); obj2.AtribValor (22); obj1.MostraValor (); obj2.MostraValor (); cout << "\n\n"; system("pause"); return 0; Contém os objetos cout e cin Indica que o atributo x é visível apenas dentro da class cl Indica que os métodos AtribValor e MostraValor são visíveis em todo o programa Comando de saída de C++ Mensagem para o objeto obj1 executar o método AtribValor

13 #include <iostream>
#include <conio.h> using namespace std; class cl { private: int x; public: void AtribValor (int d) {x = d;} void MostraValor () { cout << "Valor = " << x << "\n"; } }; int main () { cl obj1, obj2; obj1.AtribValor (11); obj2.AtribValor (22); obj1.MostraValor (); obj2.MostraValor (); cout << "\n\n"; system("pause"); return 0; Resultado Valor = 11 Valor = 22 Pressione ... Tal como para struct’s, usa-se o ponto ‘.’ para acessar os atributos e os métodos de um objeto, de fora de sua classe Dentro da classe não se usa o ponto ‘.’

14 #include <iostream>
#include <conio.h> using namespace std; class cl { private: int x; public: void AtribValor (int d) {x = d;} void MostraValor () { cout << "Valor = " << x << "\n"; } }; int main () { cl obj1, obj2; obj1.AtribValor (11); obj2.AtribValor (22); obj1.MostraValor (); obj2.MostraValor (); cout << "\n\n"; system("pause"); return 0; Por default, atributos e métodos numa classe são private Para encapsular objetos, os atributos de sua classe devem estar em private e os métodos devem estar em public Aqui o comando obj1.x = 40; seria rejeitado pelo compilador Mas não mais seria, se private fosse trocado por public

15 :: é um operador de escopo
#include <iostream> #include <conio.h> using namespace std; class cl { private: int x; public: void AtribValor (int); void MostraValor (void); }; void cl :: AtribValor (int d) { x = d; } void cl :: MostraValor () { cout << "Valor = " << x << "\n"; void main () { } Alternativa para declarar uma classe: Dentro da classe ficam os atributos e os protótipos dos métodos As definições dos métodos podem ficar fora dos limitantes da classe :: é um operador de escopo AtribValor e MostraValor são métodos da classe cl

16 9.1.4 – Programação estruturada versus POO
Programação estruturada: um programa é dividido em funções que se comunicam e trocam dados entre si Dados Globais Dados Função main Função f1 Função f2 Controle

17 Programação orientada a objetos: um programa é dividido em objetos que se comunicam entre si através de chamadas de métodos Método 1 Método 2 atributos Objeto 1 Chamar um método de um objeto pode ser entendido como enviar uma mensagem para esse objeto Método 1 Método 2 atributos Objeto 2 Método 1 Método 2 atributos Objeto 3

18 Na programação estruturada, é difícil estabelecer um elo de ligação entre funções e estruturas de dados com os objetos do mundo real Isso se torna crítico quando os programas são muito grandes Como o mundo real é composto de objetos e não de funções, a POO tem se mostrado melhor modeladora da realidade do que a programação estruturada

19 9.1.5 – Entrada e saída em C++ Além das funções de entrada e saída da linguagem C, a linguagem C++ tem ainda os objetos cin e cout, da biblioteca iostream cin faz entrada pelo teclado e cout faz saída pelo vídeo O operador endl (end line) substitui o caractere ‘\n’ O operador setw faz formatação de saída (espaço de caracteres em que um item será escrito)

20 Exemplo: seja o seguinte programa
#include <iostream> #include <iomanip> #include <conio.h> using namespace std; int main () { int x, m, n; cout << endl << "TABELA DE POTENCIAS" << endl << endl ; cout << "\tDigite o intervalo da tabela: "; cin >> m >> n; cout << endl << endl; cout << setw(5) << "x" << setw(10) << "x^2" << setw(15) << "x^3" << endl; cout << " " << endl; for (x = m; x <= n; x++) cout << setw(5) << x << setw(10) << x*x << setw(15) << x*x*x << endl; cout << endl << endl; system("pause"); return 0; } Contém o operador setw Vai duas vezes para o início da linha seguinte Escreve a cadeia “x^2” num espaço de 10 caracteres, justaposta à direita

21 Resultado: #include <iostream> #include <iomanip>
#include <conio.h> using namespace std; int main () { int x, m, n; cout << endl << "TABELA DE POTENCIAS" << endl << endl ; cout << "\tDigite o intervalo da tabela: "; cin >> m >> n; cout << endl << endl; cout << setw(5) << "x" << setw(10) << "x^2" << setw(15) << "x^3" << endl; cout << " " << endl; for (x = m; x <= n; x++) cout << setw(5) << x << setw(10) << x*x << setw(15) << x*x*x << endl; cout << endl << endl; system("pause"); return 0; } Resultado: TABELA DE POTENCIAS Digite o intervalo da tabela: 7 12 x x^ x^3 Pressione ...

22 Exemplo: soma de dois números complexos lidos
#include <iostream> using namespace std; class complexo { private: double real, imag; public: void Ler (void); void Escrever (void); void Soma (complexo, complexo); };

23 void complexo :: Ler () {
cin >> real >> imag; } void complexo :: Escrever () { cout << "[(" << real << ")+j(" << imag << ")]"; void complexo :: Soma (complexo a, complexo b) { real = a.real + b.real; imag = a.imag + b.imag;

24 int main () { complexo a, b, r; char c; cout << "Adicao de complexos? (s/n): "; cin >> c; while (c == 's' || c == 'S') { cout << endl << "\tDigite os dois operandos: "; a.Ler(); b.Ler(); r.Soma(a, b); cout << endl << "\t"; a.Escrever(); cout << " + "; b.Escrever(); cout << " = "; r.Escrever(); cout << endl << endl; } return 0; Adicao de complexos? (s/n): s Digite os dois operandos: [(2.3)+j(-7.1)] + [(-1.2)+j(4.3)] = [(1.1)+j(-2.8)] Adicao de complexos? (s/n): n Process returned 0 (0x0) execution time : s Press any key to continue. Exercício: estender este programa para fazer subtração, multiplicação e divisão de complexos

25 Exemplo: leitura das coordenadas de um ponto
#include <iostream> #include <conio.h> using namespace std; typedef char logic; const logic TRUE = 1, FALSE = 0; class ponto { private: int abscissa, ordenada; public: void Setar (int, int); int PegarAbscissa (void); int PegarOrdenada (void); };

26 void ponto :: Setar (int abs, int ord) {
logic ok; ok = abs >= 0 && abs <= 100 && ord >= 0 && ord <= 100; abscissa = ok ? abs : 0; ordenada = ok ? ord : 0; } int ponto :: PegarAbscissa () { return abscissa; int ponto :: PegarOrdenada () { return ordenada;

27 cout << "Digite as coordenadas de um ponto: ";
int main () { ponto a; int abs, ord; cout << "Digite as coordenadas de um ponto: "; cin >> abs >> ord; a.Setar(abs, ord); cout << endl << "\tPonto digitado: "; cout << "[" << a.PegarAbscissa() << ", " << a.PegarOrdenada() << "]"; cout << endl << endl; system("pause"); return 0; } Digite as coordenadas de um ponto: 3 8 Ponto digitado: [3, 8] Pressione ... Resultado:

28 9.1.6 – Construtores e destrutores
A declaração de um objeto de uma determinada classe aloca tal objeto na memória Isso é feito por um método invisível de tal classe: Tem o mesmo nome da classe, não tem tipo nem parâmetros O método que aloca um objeto é chamado de construtor de sua classe Construtores podem ser programados

29 Exemplo: contas bancárias
#include <iostream> #include <conio.h> using namespace std; class conta { private: int saldo; public: conta (void); conta (int); void Creditar (int); int PegaSaldo (void); }; conta :: conta () { saldo = 0; } conta :: conta (int inic) { saldo = inic; void conta :: Creditar (int quant) { saldo += quant; int conta :: PegaSaldo () { return saldo; Quando um construtor alternativo é programado, o construtor padrão também deve ser

30 cout << "Saldos iniciais:";
int main () { conta c1, c2 = conta(200); cout << "Saldos iniciais:"; cout << endl << endl << "\tSaldo da conta c1: " << c1.PegaSaldo(); cout << endl << endl << "\tSaldo da conta c2: " << c2.PegaSaldo(); c1.Creditar (500); c2.Creditar (800); cout << endl << endl << "Saldos finais:"; cout << endl << endl; system("pause"); return 0; } c1 é inicializada pelo construtor padrão c2 é pelo outro construtor Saldos iniciais: Saldo da conta c1: 0 Saldo da conta c2: 200 Saldos finais: Saldo da conta c1: 500 Saldo da conta c2: 1000 Pressione ... Resultado:

31 O método que desaloca um objeto é chamado de destrutor de sua classe
A desalocação de um objeto é feita por outro método invisível de sua classe Tem o mesmo nome da classe, precedido do caractere ‘~’, não tem tipo nem parâmetros O método que desaloca um objeto é chamado de destrutor de sua classe Destrutores podem ser programados e são usados quando se deseja desalocar alocações dinâmicas class Exemplo { private: int dado; public: Exemplo () {dado = 0;} ~Exemplo () {} }; Exemplo:

32 9.1.7 – Atributos estáticos Até agora, os atributos vistos pertencem ao conjunto particular de cada objeto de uma classe No entanto pode haver atributos pertencentes à classe como um todo Esses atributos devem ser declarados com a palavra reservada static Eles existem independentemente de haver objetos declarados de tal classe

33 Exemplo: atributos estáticos
#include <iostream> #include <conio.h> using namespace std; class ccc { private: static int atr; public: ccc (void); void SomarAtr (void); int PegaAtr (void); }; ccc :: ccc () { atr = 0; } void ccc :: SomarAtr () { atr++; int ccc :: PegaAtr () { return atr; int ccc :: atr; O atributo atr deve ser definido globalmente

34 cout << endl << "atr = " << c1.PegaAtr();
int main () { ccc c1, c2, c3; cout << endl << "atr = " << c1.PegaAtr(); cout << endl << "atr = " << c2.PegaAtr(); cout << endl << "atr = " << c3.PegaAtr(); c1.SomarAtr (); c2.SomarAtr (); c3.SomarAtr (); cout << endl << endl; system("pause"); return 0; } atr = 0 atr = 1 atr = 2 atr = 3 Pressione ... Resultado:

35 9.1.8 – Classe pilha para cadeias espelhadas
Seja o seguinte conjunto infinito de cadeias: “k”, “aka”, “bkb”, “abkba”, “bakab”, “abbkbba”, “abakaba”, “aabkbaa”, Especificação de cadeia típica: wkwr, onde w contém uma sequência qualquer de ‘a’s e ‘b’s, que pode até ser vazia, e wr é a sequência inversa a w Exemplo: se w = “abb”, wr = “bba” Fazer um algoritmo que leia uma cadeia qualquer x e, usando uma pilha, determine se x é do tipo wkwr

36 Percorrer a cadeia empilhando os ‘a’s e ‘b’s iniciais
Método: Percorrer a cadeia empilhando os ‘a’s e ‘b’s iniciais Se o primeiro caractere diferente de ‘a’ e ‘b’ for um ‘k’, avançar; se não for, a cadeia não é wkwr Comparar cada caractere da cadeia com o topo da pilha: Se forem iguais, desempilhar Senão, a cadeia não é wkwr A seguir, o programa

37 /* Diretivas de pre-processamento */
#include <iostream> #include <stdlib.h> #include <conio.h> using namespace std; /* Definicao do tipo logic e suas constantes */ typedef char logic; const logic TRUE = 1, FALSE = 0; /* Definicao do tipo noh */ typedef struct noh noh; struct noh { char elem; noh *prox; };

38 /* Classe Pilha */ class pilha { private: noh *topo; public: void Inicializar (void); void Empilhar (char); void Desempilhar (void); char Topo (void); logic Vazia (void); }; void pilha :: Inicializar () {topo = NULL;}

39 void pilha :: Empilhar (char x) {
noh *temp; temp = topo; topo = (noh *) malloc (sizeof (noh)); topo->elem = x; topo->prox = temp; } void pilha :: Desempilhar () { if (! Vazia()) { temp = topo; topo = topo->prox; free (temp); } char pilha :: Topo () { if (! Vazia()) return topo->elem; else return '\0';} logic pilha :: Vazia () { if (topo == NULL) return TRUE; else return FALSE;

40 /* Classe cadeia */ class cadeia { private: char str[200]; int cursor; public: void Ler (void); void Inicializar (void); char GetNext (void); void Escrever (void); };

41 void cadeia :: Inicializar () {
cursor = -1; } char cadeia :: GetNext () { cursor++; return str[cursor]; void cadeia :: Ler () { cin >> str; void cadeia :: Escrever () { cout << str;

42 /* Funcao main: Verifica se uma cadeia eh espelhada */
int main ( ) { pilha P; cadeia cad; char wkwr, c; cout << "Digite a cadeia: "; cad.Ler(); P.Inicializar(); wkwr = TRUE; /* Percorre a primeira parte da cadeia */ cad.Inicializar(); c = cad.GetNext(); while (c == 'a' || c == 'b') { P.Empilhar(c); c = cad.GetNext(); }

43 /* Verifica se a segunda parte eh espelho da primeira */
if (c != 'k') wkwr = FALSE; else { while (P.Vazia() == FALSE && wkwr == TRUE) { c = cad.GetNext (); if (c != P.Topo()) wkwr = FALSE; else P.Desempilhar(); } if (wkwr == TRUE) { c = cad.GetNext(); if (c != '\0') wkwr = FALSE;

44 /* Emite o resultado da verificacao */
cout << endl << "\t"; cad.Escrever(); cout << ": cadeia "; if (wkwr) cout << "aceita"; else cout << "rejeitada"; cout << endl << endl; system("pause"); return 0; }

45 9.1.9 – Sobrecarga de métodos
Sobrecarga é a possibilidade de vários métodos de uma mesma classe terem o mesmo nome, porém com protótipos ligeiramente diferentes Variações na quantidade ou no tipo dos argumentos e no tipo de retorno #include <math> class Logaritmo { public: double logaritmo(double x); double logaritmo(double x, double b); }; double Logaritmo::logaritmo(double x) { return log(x); } double Logaritmo::logaritmo(double x, double b) { return (log(x)/log(b)); Exemplo:

46 Capítulo IX – Programação Orientada a Objetos
9.1 – Classes, objetos e métodos 9.2 – Herança 9.3 – Polimorfismo

47 9.2 – Herança Herança permite criar novas classes a partir de classes existentes A classe existente se chama classe base A nova classe se chama classe derivada

48 Classe derivada (filha) Classe derivada (filha)
Classe base (pai) Classe derivada (filha) Classe derivada (filha)

49 Um exemplo: class Pessoa { private: char nome[50]; int idade; public:
bool ehResponsavel(); Pessoa(char *nome, int idade); }; bool Pessoa::ehResponsavel() { if(idade >= 18 )return true; else return false; } Pessoa::Pessoa(char *nome, int idade){ strcpy(this->nome,nome); this->idade=idade; class Funcionario: public Pessoa { int depto; public: Funcionario(char *nome, int idade, int depto); }; Funcionario::Funcionario(char *nome, int idade, int depto) :Pessoa(nome,idade) { this->depto = depto; }

50 9.3 – Polimorfismo Na herança, os objetos da classe derivada herdam os atributos e os métodos da classe base Além disso, uma classe derivada pode sobrescrever os métodos da sua classe base, isto é, ter uma versão particular dessas operações Consequentemente, a execução de um mesmo método, se realizada por objetos de classes distintas (base e derivada, por exemplo), pode gerar diferentes ações

51 Exemplo: Possibilita sobrescrita class Pessoa { private:
char nome[50]; int idade; public: virtual bool ehResponsavel(); Pessoa(char *nome, int idade); char *getNome(); }; char *Pessoa::getNome() { return nome; } bool Pessoa::ehResponsavel() { if (idade >= 18) return true; else return false; Pessoa::Pessoa(char *nome, int idade) { strcpy(this->nome,nome); this->idade=idade; Possibilita sobrescrita

52 Uma classe derivada: class Casado: public Pessoa { public: bool ehResponsavel(); Casado(char *nome,int idade): Pessoa(nome,idade) { } }; bool Casado::ehResponsavel() { return true; }


Carregar ppt "CES-11 ALGORITMOS E ESTRUTURAS DE DADOS"

Apresentações semelhantes


Anúncios Google