Professional Documents
Culture Documents
BIBLIOGRAFIA ...................................................................................................................... 22
FIGURAS
FIGURA 1 ............................................................................................................................................................................. 1
FIGURA 2 ............................................................................................................................................................................. 2
FIGURA 3 ............................................................................................................................................................................. 2
FIGURA 4 ............................................................................................................................................................................. 2
FIGURA 5 ............................................................................................................................................................................. 3
FIGURA 6 ............................................................................................................................................................................. 3
FIGURA 7 ............................................................................................................................................................................. 5
PROGRAMAÇÃO ESTRUTURADA E PROGRAMAÇÃO
ORIENTADA A OBJETOS
Programação estruturada
Baseia-se nos procedimentos e funções, mantendo o foco nas ações do programa e
em como uma tarefa deve ser executada. Serve para ajudar a controlar o fluxo de execução de
um programa.
Baseia-se em:
Sequência: quando uma tarefa é executada uma após a outra.
Decisão: quando um código, a partir de um teste lógico, é executado ou não.
Laço: quando um código, a partir de um teste lógico, é repetido por n vezes.
Vantagens:
Fácil de entender, por isso, é usada nos cursos iniciais de programação.
Fluxo de execução mais eficaz.
Tem uma execução mais rápida. Para problemas simples é a melhor solução.
Desvantagens:
Os códigos são confusos.
Não há definição de tarefas e, por isso, não há reuso de código.
Não é usado em grandes projetos.
Figura 1
1
Figura 2
Programa Classe
Processos Atributos
Dados
Operações
Figura 3
Classe
Figura 4
2
Programação Estruturada Programação Orientada a Objetos
Método
Dados do ...
objeto
Procedimento Método
Procedimento Método
Dados do ...
Procedimento objeto
Dados gerais Método
. .
. .
. .
Procedimento Método
Dados do
...
objeto
Método
Figura 5
Objeto 2
Objeto 3
Objeto 1
Objeto 5 Objeto 4
Figura 6
3
Conceitos da Programação Orientada a Objetos
Abstração:
A ideia da abstração é representar um objeto real no sistema, de acordo com o que ele
irá realizar.
Por isso, a abstração é a capacidade de concentrar no essencial do programa,
considerando separadamente o contexto, priorizando a essência do problema.
O princípio da abstração é essencial para os demais conceitos da Orientação a
Objetos.
Objetos:
São a representação computacional de algo do mundo real. Assim, os objetos em um
software são, em conceito, semelhantes aos objetos reais. Assim, a abstração é importante para
transformar o real em virtual.
O objeto a ser criado precisa ter uma identidade única, que seria o seu nome, para
não ocorrer conflitos. Precisa também ter determinado as suas propriedades específicas, que
seriam suas características, representadas no programa. E, finalizando, o objeto precisa ter seus
métodos, ou seja, as ações relacionadas a ele.
Em um programa, o objeto seria uma variável.
Assim, cada objeto abstraído para o virtual, possui dados, derivados do seu estado, e
operações, derivados do seu comportamento. Ou, em outras palavras, possui atributos e
métodos.
Por exemplo:
Objeto: cachorro
Atributos: raça, nome, peso, cor, etc.
Métodos: Latir, comer, abanar o rabo, dormir, etc.
Classe:
São um conjunto de objetos com as mesmas características, ou seja, dados e
operações.
Na classe, os dados são chamados atributos e as operações do objeto são chamadas
de serviços. Os objetos são conhecidos como instância de uma classe.
Assim, os objetos são as instâncias de uma classe, ou seja, membros de uma classe.
4
Figura 7
Exemplo:
Classe aluno
Atributos (dados de cada aluno) Métodos (operações do sistema para cada aluno)
Matrícula Incluir Dados
Nome Alterar Dados
Data de Nascimento Matricular
Curso Incluir Nota
Notas Emitir Histórico
Em C++,
class aluno{
private:
int matricula;
char nome[100];
char endereco[100];
char data_nasc[8];
int curso;
float notas[10];
public:
void IncluirDadosPessoais (int mat, char *nom, char *end, char *nas);
void Matricular (int mat, int curs);
5
void AlterarEndereco (char *end);
void IncluirNotas (float *not);
void EmitirHistorico (void);
};
Encapsulamento:
A ideia do encapsulamento é própria da orientação a objetos, ajudando a definir esse
tipo de programação. Para evitar que os objetos de um programa orientado a objetos acessem
toda e qualquer requisição da aplicação, pode-se implementar uma segurança aos atributos e
métodos deixando-os privados ou protegidos ao uso da classe onde estão. Dessa forma, o
programa executa o que está sendo pedido, sem mostrar como a execução está sendo feita e
sem permitir que outro objeto interfira ou use essa mesma ação.
Encapsular significa esconder a estrutura de dados, consistindo na parte privada
(private), protegida (protected) e na parte pública (public).
O encapsulamento consiste na união da ação e da informação em novos tipos de
dados que sabem o que fazer, separando o serviço da sua implementação.
Assim, o encapsulamento protege os atributos de sua classe e os torna acessíveis
através dos seus métodos. Isso faz com que a modificação dos atributos de uma classe (suas
características) só seja feita pela própria classe, e não por quem executa seus métodos.
Para o encapsulamento de uma classe, os atributos devem ser definidos do tipo
private e os métodos do tipo public.
Herança:
A herança é que permite uma das grandes vantagens da programação orientada a
objetos: o reuso dos códigos. O objeto mais abaixo na hierarquia do código, não em ordem de
linhas, mas de acordo com a distribuição das classes, herda as características de os objetos
acima dele.
Uma classe pode ser extensão de outra, assim, permite-se o aproveitamento de
código, evitando a duplicação do mesmo.
As classes compartilham atributos e serviços, evitando que seja implementado um
código já existente. É um mecanismo para organização, construção e uso de classes reusáveis.
Têm-se as superclasses, que geram outras classes e as subclasses, que herdam a
partir de outras classes.
No caso da linguagem C++, ainda temos a herança múltipla, onde pode-se herdar
várias características ao mesmo tempo, ou seja, uma mesma classe pode-se derivar de várias
classes ao mesmo tempo.
Exemplo de herança:
Pessoa
Dados Operações
Nome AtualizarEnd
6
Endereço IncluirDados
Nascimento LerDados
Em C++:
#include <string.h>
#define MAX_DISC 10
#define MAX_STR 100
7
}; //fim da definicao da classe professor
professor::professor (const char *n, const char *e, const char *dn, int g,int
a):pessoa(n,e,dn)
{ grau = g;
area=a;
n_disc=0;;
for (int i=0; i<MAX_DISC; i++) disciplinas[i]=0;
}
void professor:: LerDadosAcademicos (int *g, int *disc, int *a)
{
*g=grau; *a= area;
for (int i=0; i<n_disc; i++) disc[i]=disciplinas[i];
}
aluno::aluno(const char *n, const char *e, const char *dn, int m,int c):pessoa(n,e,dn)
{ matricula = m;
curso = c;
n_disc=0;
for (int i=0; i<MAX_DISC; i++) { disciplinas[i]=0; notas[i] =0;}
}
8
int depto;
int cargo;
public:
funcionario (const char *n, const char *e, const char *dn, float s,int d, int c );
void AlterarSalario (float s) {salario =s;}
void AlterarDepto (int d) {depto =d;}
void AlterarCargo (int c) {cargo = c;}
float LerSalario (void) {return salario;}
int LerDepto (void) {return depto;}
int LerCargo (void) {return cargo;}
} //fim da definicao da classe
funcionario::funcionario (const char *n, const char *e, const char *dn, , float s,int d, int
c):pessoa(n,e,dn)
{ salario = s;
depto = d;
cargo = c;
}
Polimorfismo:
O polimorfismo permite que o interior de um método seja alterado para ser usado por
outros objetos. Assim, há a reutilização do código, mas se cria um adendo virtualizado para a
modificação necessária.
Um mesmo chamado para um método pode invocar vários métodos diferentes. É uma
consequência natural da herança.
Permite que mensagens iguais sejam enviadas a objetos que responderão
diferentemente.
Na linguagem C++, usa-se a palavra chave virtual para o polimorfismo. Assim, o
programa entenderá que não se trata de um conflito, mas de uma modificação em um método já
existente para ser usado por outro objeto.
9
Um resumo:
10
Análise e UML
Antes de escrever o código, é necessário analisar os requisitos do projeto e projetar
uma solução satisfatória.
Uma linguagem gráfica usada para comunicação de qualquer processo de análise e
projeto orientado a objeto é a UML (Unified Modeling Language).
O diagrama de classes é uma representação de estrutura e relações das classes.
Assim, sabemos que uma classe possui atributos, métodos e relações com outras classes. O
diagrama de classes é um retângulo dividido em 3 linhas: Na primeira temos o nome da classe, no
meio os atributos e na última temos os métodos. Para a especificação do acesso, coloca-se +
para o acesso público (public), - para o acesso privado (private) e # para o acesso protegido
(protected).
Classe
-atributos
+operação()
Exemplo:
Circulo
-Raio: double
-Centro: Ponto
+Area(): double
+Circunferencia(): Double
+SetCentro(Ponto)
+SetRaio(double)
Herança:
Trata-se de uma classe, chamada de classe filha, que tem os mesmos atributos de
outra classe, classe mãe, mais alguns atributos diferentes.
Exemplo:
Um círculo possui características que o determinam como uma forma geométrica. E
também possui características próprias que o diferenciam de outras formas geométricas. Sendo
assim, há uma relação de herança, onde o círculo é subclasse de forma.
Circulo é uma subclasse de FormaGeom. E Ponto é uma subclasse de FormaGeom.
FormaGeom
+Desenhar()
+Apagar()
Circulo Ponto
A ideia é a seguinte:
11
Classe X é uma classe Y? Se a resposta for afirmativa, pode-se considerar uma
relação herança. Se for negativa, a relação não poderá ser de herança.
Exemplos:
Suponhamos que Caminhão seja a Classe X e Automóvel seja a Classe Y
Caminhão é um Automóvel? Relação de herança.
Suponhamos que Pessoa seja a Classe X e Automóvel seja a Classe Y
Pessoa é um Automóvel? Não há relação de herança.
Associação:
Uma associação acontece quando as classes são independentes entre si, mas
possuem um eventual relacionamento. O importante é que não há dependência entre elas.
Exemplos:
Uma pessoa pode ser referência em uma revista. Dessa forma, pode-se considerar
que há atributos que unem essas duas classes. Porém, ambas continuam independentes uma da
outra.
Pessoa Revista
A relação entre professor e aluno é independente. Uma classe pode existe sem a
outra. Mas há uma relação entre elas quando pensamos que um aluno pode ter vários professores
e um professor pode ter vários alunos.
Agregação:
Trata-se de uma associação com exclusividade, ou seja, não há dependência, mas há
propriedade.
Exemplos:
Uma classe Pato e uma classe Lagoa são independentes entres si. Porém um pato só
pode estar em uma lagoa por vez, o que faz ele ser parte da lagoa quando ele está lá. Já a lagoa,
pode ter vários patos ao mesmo tempo, não sendo presa a nenhum deles. Sendo assim, Lagoa
contém uma instância da classe Pato. E o * significa que Lagoa possui várias instâncias de Pato.
Lagoa * Pato
A relação de um jogador com o seu time traz independência em suas classes, mas o
jogador só pode estar ligado a um time, ou seja, é propriedade dele. Enquanto o time pode ter
vários jogadores. Há, então uma relação de agregação.
Composição:
Significa que uma classe é parte da outra classe.
Exemplos:
Um círculo contém pontos. Assim, há uma relação de composição pois ponto está
contido em círculo.
Circulo contém Ponto
Circulo Ponto
Todo livro possui um autor. Pode-se criar duas classes distintas, Livro e Autor, onde
cada objeto da classe Livro irá possuir um objeto da classe Autor. Sendo assim, a classe Autor
fará parte da classe Livro, tendo uma relação de composição.
12
Dependência:
A relação de dependência indica que os objetos de uma classe usam os serviços dos
objetos de outra classe. Quando a união é fraca, sem atributos em comum, apenas com
parâmetros de métodos, representa-se com a linha pontilhada. Assim, tem-se uma dependência
Exemplos:
Uma classe que especifica a forma de desenho de uma figura geométrica possui uma
forte relação com a classe de formas geométricas, onde esta última terá um método que depende
das especificações da Classe FormaDesenho, pois retornam esse parâmetro. Sendo assim
FormaGeo não pode ser compilada sem levar a FormaDesenho. Para existir, a Classe FormaGeo
depende da Classe FormaDesenho.
FormaGeo FormaDesenho
+Desenhar(FormaDesenho)
Uma casa, para existir, depende de uma rua. Também depende de um lote. Sem rua e
sem lote, a casa não poderá ser uma casa. Sendo assim, qualquer alteração na rua ou no lote,
afeta também a casa que está nesse lote e nessa rua.
13
LINGAGUEM C++
Vamos implementar um programa que calcule a média de 3 variáveis.
A ideia do programa é:
Início
Declaração das variáveis que serão usadas no processo
Início do loop de quantas vezes o processo se repetirá
Leitura das variáveis de entrada
Cálculo da média
Impressão das variáveis de saída
Fim do loop de repetição
Fim do programa
14
Em Linguagem C, o programa ficaria da seguinte forma:
#include <stdlib.h>
#include<stdio.h>
int main()
{
int x, y, z, a;
float media;
printf("Quantas vezes o processo se repetira? \n");
scanf("%d", &a);
for(int i=0; i<a; i++)
{
printf("\nDigite 3 valores: \n");
scanf("%d", &x);
scanf("%d", &y);
scanf("%d", &z);
media=(x+y+z)/3;
printf("\n --> A media dos 3 numeros: %f \n", media);
}
return(0);
}
Em linguagem C++:
#include<iostream>
using namespace std;
int main()
{
int x, y, z, a;
float media;
cout << "Quantas vezes o processo se repetira? ";
cin >> a;
for(int i=0; i<a; i++)
{
cout << "\nDigite 3 valores: \n";
cin >> x;
cin >> y;
cin >> z;
media=(x+y+z)/3;
cout << "\n --> A media dos 3 numeros: " << media;
}
return(0);
}
15
Para entender melhor o código, vamos por partes:
Código Explicação
#include<iostream> Chamada das bibliotecas que contem os códigos usados no programa.
using namespace std; Declara que esse programa irá acessar códigos que fazem parte do
namespace “std”
int main() Inicia o programa principal, “main”, que retorna a um valor inteiro,
{ indicado pelo “int”.
int x, y, z, a; Declaração das variáveis de entrada e saída que serão usadas no
float media; do programa. “Int” e “float” correspondem ao tipo de variável
(número inteiro e real, respectivamente)
cout << "Quantas vezes o Comando de saída, ou seja, que imprime na tela de execução do
processo se repetira? "; programa a mensagem ou a variável descrita em seu processo.
cin >> a; Comando de entrada, ou seja, na variável o valor digitado pelo
usuário.
for(int i=0; i<a; i++) Início do loop de repetição, usando o comando “for”
{
cout << "\nDigite 3 valores: Processo de execução da operação do programa. Ou seja, há a
\n"; inserção de 3 números nas variáveis especificadas, a conta
cin >> x; aritmética da média e a impressão do resultado na tela.
cin >> y;
cin >> z;
media=(x+y+z)/3;
cout << "\n --> A media dos 3
numeros: " << media;
} Fecha o loop de repetição
return(0); Finaliza o programa principal, indicando o valor 0 como valor de
} retorno, caso tudo ocorra bem na execução do código.
Usando função:
#include<iostream>
using namespace std;
void CalculaMedia (int x, int y, int z)
{
float media;
media=(x+y+z)/3;
cout << "\n A media desses 3 numeros = " << media;
}
int main()
{
int x, y, z, a;
cout << "Quantas vezes: \n";
cin >> a;
for(int i=0; i<a; i++)
{
cout << "\n Coloque 3 numero: \n";
cin >> x;
cin >> y;
cin >> z;
CalculaMedia(x,y,z);
}
return(0);
}
16
Usando classes:
#include<iostream>
using namespace std;
class media3{
private:
int x, y, z;
float media;
public:
void calculo()
{
cin >> x;
cin >> y;
cin >> z;
media=(x+y+z)/3;
cout << "A media dos 3 numeros: " << media;
}
};
int main()
{
int a;
cout << "Quantas vezes: \n";
cin >> a;
for(int i=0; i<a; i++)
{
media3 objetomedia;
objetomedia.calculo();
}
return(0);
}
Outro exemplo:
#include<iostream>
using namespace std;
class Carro {
int rodas, passageiros, malas;
public:
int TrocaRodas(int)
{
cout << "\nQuantas rodas precisam ser trocadas? ";
cin >> rodas;
return(rodas);
}
int QuantPassageiros(int)
{
cout << "\nQuantos passageiros no carro? ";
cin >> passageiros;
return(passageiros);
}
int QuantMalas(int)
{
cout << "\nQuantas malas no carro? ";
cin >> malas;
return(malas);
17
}
};
main ()
{
int x, a;
cout << "Quantos carros? ";
cin >> a;
int vr[a], vp[a], vm[a];
for(int i=1; i<=a; i++)
{
Carro c1;
cout <<"\n -- Carro " << i << " -- ";
vr[i]=c1.TrocaRodas(x);
vp[i]=c1.QuantPassageiros(x);
vm[i]=c1.QuantMalas(x);
}
for(int i=1; i<=a; i++)
{
cout << "\n ** Para o carro " << i;
cout << "\n\nPrecisa de " << vr[i] << " roda(s) nova(s).";
cout << "\nEsta com " << vp[i] << " passageiro(s).";
cout << "\nEsta carregando " << vm[i] << " malas. \n---------------------------- \n";
}
}
#include<iostream>
using namespace std;
class Carro {
int rodas, passageiros, malas;
public:
int TrocaRodas(int)
{
cout << "\nQuantas rodas precisam ser trocadas? ";
cin >> rodas;
return(rodas);
}
int QuantPassageiros(int)
{
cout << "\nQuantos passageiros no carro? ";
cin >> passageiros;
return(passageiros);
}
int QuantMalas(int)
{
cout << "\nQuantas malas no carro? ";
cin >> malas;
return(malas);
}
};
main ()
{
int x, a;
cout << "Quantos carros? ";
cin >> a;
18
int vr[a], vp[a], vm[a];
for(int i=1; i<=a; i++)
{
Carro c1;
cout <<"\n -- Carro " << i << " -- ";
vr[i]=c1.TrocaRodas(x);
vp[i]=c1.QuantPassageiros(x);
vm[i]=c1.QuantMalas(x);
}
for(int i=1; i<=a; i++)
{
cout << "\n ** Para o carro " << i;
cout << "\n\nPrecisa de " << vr[i] << " roda(s) nova(s).";
cout << "\nEsta com " << vp[i] << " passageiro(s).";
cout << "\nEsta carregando " << vm[i] << " malas. \n---------------------------- \n";
}
}
É importante perceber que, tanto na classe Carro, quanto na classe Moto, têm-se
variáveis iguais e métodos iguais. Se criássemos outra classe, de Caminhão, por exemplo,
também teríamos o método TrocaRodas e QuantPassageiros e as variáveis que neles são
usadas. Assim, para este programa, podemos criar uma superclasse Veículo e transformar as
classes Carro, Moto e Caminhão em subclasses. Usando somente as classes Carro e Moto para
exemplo, ficaria da seguinte forma:
#include<iostream>
using namespace std;
#include<stdlib.h>
class Veiculo{
int rodas, passageiros;
public:
int TrocaRodas(int)
{
cout << "\nQuantas rodas precisam ser trocadas? ";
cin >> rodas;
return(rodas);
}
int QuantPassageiros(int)
{
cout << "\nQuantos passageiros no carro? ";
cin >> passageiros;
return(passageiros);
}
};
class Carro: public Veiculo {
int malas;
public:
int QuantMalas(int)
{
cout << "\nQuantas malas no carro? ";
cin >> malas;
return(malas);
}
};
class Moto: public Veiculo{
int classificacao;
public:
19
int ClassificacaoMoto(int)
{
cout << "\nDe 1 a 10, classifique a sua moto: ";
cin >> classificacao;
return(classificacao);
}
};
main ()
{
int x, a, menu;
Carro c1;
Moto m1;
cout << "Quantos cadastros? ";
cin >> a;
int vr[a], vp[a], vm[a], vcl[a];
do{
cout << "\nEscolha: Carro (1) ou Moto (2) ou Finalizar (0) --> ";
cin >> menu;
switch(menu)
{
case 1:
for(int i=1; i<=a; i++)
{
cout <<"\n -- Carro " << i << " -- ";
vr[i]=c1.TrocaRodas(x);
vp[i]=c1.QuantPassageiros(x);
vm[i]=c1.QuantMalas(x);
}
for(int i=1; i<=a; i++)
{
cout << "\n ** Para o carro " << i;
cout << "\n\nPrecisa de " << vr[i] << " roda(s) nova(s).";
cout << "\nEsta com " << vp[i] << " passageiro(s).";
cout << "\nEsta carregando " << vm[i] << " malas. \n;
}
break;
case 2:
for(int i=1; i<=a; i++)
{
cout <<"\n -- Moto " << i << " -- ";
vr[i]=m1.TrocaRodas(x);
vp[i]=m1.QuantPassageiros(x);
vcl[i]=m1.ClassificacaoMoto(x);
}
for(int i=1; i<=a; i++)
{
cout << "\n ** Para a moto " << i;
cout << "\n\nPrecisa de " << vr[i] << " roda(s) nova(s).";
cout << "\nEsta com " << vp[i] << " passageiro(s).";
cout << "\nTem nota " << vcl[i] << "\n ";
}
break;
case 0:
cout << "Finalizando...........";
return(0);
default:
cout << "Numero invalido. Inicie novamente.";
20
break;
}
system("pause");
system("cls");
} while(menu!=0);
}
21
BIBLIOGRAFIA
DEITEL, H. M.; DEITEL, P. J. C++: como programar. ed. São Paulo: Pearson
Education, 2009.
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C++: módulo 1. ed. São
Paulo: Pearson Prentice Hall, 2006.
____. Treinamento em Linguagem C++: módulo 2. ed. São Paulo: Pearson Prentice
Hall, 2009.
22