Académique Documents
Professionnel Documents
Culture Documents
Escola de Informática
Ciência da Computação
Versão: 2.03
Referências Bibliográficas
1. Introdução
O termo Programação Orientação à Objetos (OOP - Object
Oriented Programming) significa organizar um programa de forma
que o mundo real seja representado virtualmente (ou internamente)
como se fosse uma coleção de objetos que incorpora uma estrutura
de dados (variáveis ou atributos) e um conjunto de operações
(funções ou métodos) que manipulam esta estrutura.
1.1 Origens
POO C++
classe classe
objeto objeto
Método função
atributo atributo
mensagem chamada de uma função
sub-classe classe derivada
super-classe classe base
herança derivação
class Pilha
{
TDADOS pilha[max]; // ... atributo do objeto, cada um possui o seu
int topo; // ... atributo do objeto, cada um possui o seu
static int n; // ... atributo da classe, coletivo para todos os objetos
static const float pi; // ... atributo constante da classe, coletivo para todos os objetos
public:
void Cria_Pilha(void); // ... métodos (ou mensagens)
void Push(TDADOS dado); // ... métodos (ou mensagens)
TDADOS Pop(void); // ... métodos (ou mensagens)
TDADOS Consulta_Pilha(void); // ... métodos (ou mensagens)
void Exibe_Pilha(void); // ... métodos (ou mensagens)
};
class Math
{
int x, y; // ... atributo do objeto, cada um possui o seu
static int n; // ... atributo da classe, coletivo para todos os objetos
static const float pi; // ... atributo constante da classe, coletivo para todos os objetos
public:
Math(void) : x(1), y(2) { } // inicialização dos atributos através do construtor
void Exibe(void)
{
cout << x << “ - “ << y << endl;
}
};
int Math :: n = 7; // inicialização do atributo da classe (tem que ser fora da classe)
const float Math :: pi = 3.141516; // inicialização do atributo constante da classe
1.2.2 Abstração
1.2.5 Herança
int main(void)
{
bool ok = true;
bool flag = false;
}
Programa exemplo:
#include <iostream>
int main(void)
{
long long int x = 9223372036854775807ll;
Observação: Sempre que uma operação matemática for realizada e o valor for maior
ou menor que os valores máximo e mínimo, referente a faixa de valores válidos, o
programa rotaciona e coloca o resultado da operação dentro da faixa de valores
válidos. No programa acima, quando o maior valor possível de um inteiro super longo é
acrescido em um, o valor resultante é o menor valor da faixa de valores.
1.2.8 Alguns conceitos básicos em C++
#include <iostream.h> // ... header responsável pelas funções de entrada e saída (cin e cout)
int main(void)
{
cout << "Hello, World ...\n"; // ... imprime na tela
cout << “Tecle <enter> para continuar";
cin.get(); // ... para e espera que uma tecla seja pressionada
return(0);
}
// palavra.cpp
#include <iostream.h>
#include <string.h>
int main(void)
{
char palavra[256];
// nome.cpp
#include <iostream.h>
#include <string.h>
int main(void)
{
char nome[81];
// pausa.cpp
#include <iostream.h>
#include <string> // header do C++, existe também string.h do C padrão
void pausa(void)
{
cin.ignore(5,'\n'); // limpar o buffer de teclado
cin.get(); // espera uma tecla qualquer
}
int main(void)
{
string palavra; // classe string, não precisa inicializar
// ponto.cpp
#include <iostream>
void seta_atributos(int tx, int ty) // método privado, não pode ser chamado pelo main
{ // somente por métodos da classe Ponto
x = tx;
y = ty;
}
public:
void Inicializa(int tx, int ty) // métodos públicos, podem ser chamados pelo main
{
seta_atributos(tx,ty);
}
void Exibe(void)
{
cout << "( x = " << x << " ) ( y = " << y << " )" << endl;
}
void Move(int tam)
{
x = x + tam;
y = y + tam;
}
}; // não esquecer ponto-e-vírgula
int main(void)
{
Ponto pt; // declaração de um objeto pt da classe Ponto
pt.Inicializa(1,2);
pt.Exibe();
pt.Move(10);
pt.Exibe();
}
Resultado do Programa:
(x=1)(y=2)
( x = 11 ) ( y = 12 )
// calc.cpp
#include <iostream>
class Calculadora
{
private:
double x,y,resp;
char op;
bool erro; // bool ... tipo lógico (true ou false)
private:
void Add(void)
{
resp = x + y;
erro = false;
}
void Sub(void)
{
resp = x - y;
erro = false;
}
void Mult(void)
{
resp = x * y;
erro = false;
}
void Div(void)
{
if (y not_eq 0) // not_eq é igual a !=
{
resp = x / y;
erro = false;
}
else
erro = true;
}
public:
void Entrada(void)
{
cout << "Digite um valor: ";
cin >> x;
cout << "Operador [+-*/]: ";
do {
op = cin.get();
} while (not strchr("+-*/",op)); // not é igual a !
cout << "Digite outro valor: ";
cin >> y;
}
void Calcula(void)
{
switch (op)
{
case '+': Add();
break;
case '-': Sub();
break;
case '*': Mult();
break;
case '/': Div();
break;
}
}
void Exibe(void)
{
if (erro)
cout << "ERRO: Divisão por Zero" << endl;
else
cout << "Resposta: " << resp << endl;
}
};
int main(void)
{
Calculadora calc; // Calculadora (classe) – calc (objeto)
calc.Entrada();
calc.Calcula();
calc.Exibe();
}
// ascii.cpp
#include <iostream.h>
int main(void)
{
for (char i = 'A';i <= 'Z';i++) // a variável “i” foi declarada no escopo do comando “for”
cout << i;
cout << endl;
for (char j = 'a';j <= 'z';j++) // a variável “j” foi declarada no escopo do comando “for”
cout << j;
cout << endl;
return(0);
}
// asctable.cpp
#include <iostream>
using namespace std;
int main(void)
{
for (int cod = 32;cod <= 127;cod++)
{
cout << "Código: " << cod << "-> Caracter: " << (char) cod; // cast char
cin.get();
}
}
namespace
Quando o programador escreve um programa pode ocorrer a
repetição de um nome de um método e/ou classe que já existe em
alguma biblioteca padrão. Para evitar esse erro, utiliza-se namespace.
// ascii.cpp
int main(void)
{
for (char i = 'A';i <= 'Z';i++)
std::cout << i;
std::cout << std::endl;
for (char j = 'a';j <= 'z';j++)
std::cout << j;
std::cout << std::endl;
}
// ascii.cpp
#include <iostream>
int main(void)
{
for (char i = 'A';i <= 'Z';i++)
cout << i;
cout << endl;
for (char j = 'a';j <= 'z';j++)
cout << j;
cout << endl;
}
class nome_da_classe
{
atributos e métodos privados; // ... só podem ser acessados por objetos desta classe
public:
atributos e métodos públicos; // ... podem ser acessados por outros objetos
};
Exemplo da declaração de uma classe:
class Fila
{
TDADOS fila[TAM]; // ... atributo privado
int inic, fim; // ... atributos privados
public:
void Cria_Fila(void); // ... método público
void Inclui_Fila(TDADOS dado); // ... método público
TDADOS Exclui_Fila(void); // ... método público
TDADOS Consulta_Fila(void); // ... método público
void Exibe_Fila(void); // ... método público
};
// -------------------------------------- Inclui_Fila
// struct.cpp
#include <iostream>
struct Contador
{
private:
int num;
public:
void init(void)
{
num = 0;
}
void incrementa(void)
{
num = num + 1;
}
int exibe(void)
{
return(num);
}
};
int main(void)
{
Contador c;
c.init();
cout << c.exibe() << endl;
c.incrementa();
cout << c.exibe() << endl;
cin.get();
}
Exemplo:
fila1.Cria_Fila();
fila2.Cria_Fila();
// linear.cpp (Lista_Linear)
#include <iostream>
#include <string>
#include <cctype> // ctype para o C++
// -------------------------------------- Inicializa_Lista
// -------------------------------------- Inclui_Lista
// -------------------------------------- Exclui_Lista
// -------------------------------------- Consulta_Lista
// -------------------------------------- Exibe_Lista
int main(void)
{
Lista lista;
char tecla;
TDADOS valor;
lista.Inicializa_Lista();
do {
lista.Exibe_Lista();
cout << "[I]nclui, [E]xclui, [C]onsulta ou [F]im: ";
do {
tecla = toupper(cin.get());
} while (not strchr("IECF", tecla));
switch (tecla)
{
case 'I': cout << "Valor: ";
cin >> valor;
lista.Inclui_Lista(valor);
break;
case 'E': valor = lista.Exclui_Lista();
if (valor not_eq 0)
cout << "Valor Excluído da Lista: " << valor << endl;
break;
case 'C': valor = lista.Consulta_Lista();
if (valor not_eq 0)
cout << "Valor Consultado: " << valor << endl;
break;
}
} while (tecla not_eq 'F');
}
// Pilha.cpp
#include <iostream>
#include <string>
#include <cctype>
class Pilha
{
TDADOS pilha[tam];
int topo;
public:
void Cria_Pilha(void);
void Push(TDADOS dado);
TDADOS Pop(void);
TDADOS Consulta_Pilha(void);
void Exibe_Pilha(void);
};
// -------------------------------------- Cria_Pilha
// -------------------------------------- Push
// -------------------------------------- Pop
// -------------------------------------- Consulta_Pilha
// -------------------------------------- Exibe_Pilha
int main(void)
{
Pilha pilha;
char tecla;
TDADOS valor;
pilha.Cria_Pilha();
do {
pilha.Exibe_Pilha();
cout << "[P]ush, P[o]p, [C]onsulta ou [F]im: ";
do {
tecla = toupper(cin.get());
} while (not strchr("POCF", tecla));
switch (tecla)
{
case 'P': cout << "Valor: ";
cin >> valor;
pilha.Push(valor);
break;
case 'O': valor = pilha.Pop();
if (valor not_eq 0)
cout << "Valor Excluído da Pilha: " << valor << endl;
break;
case 'C': valor = pilha.Consulta_Pilha();
if (valor not_eq 0)
cout << "Valor Consultado: " << valor << endl;
break;
}
} while (tecla not_eq 'F');
}
// Fila.cpp
#include <iostream>
#include <string>
#include <cctype>
class Fila
{
TDADOS fila[tam];
int inic,fim;
public:
void Cria_Fila(void);
void Inclui_Fila(TDADOS dado);
TDADOS Exclui_Fila(void);
TDADOS Consulta_Fila(void);
void Exibe_Fila(void);
};
// -------------------------------------- Cria_Fila
// -------------------------------------- Inclui_Fila
// -------------------------------------- Exclui_Fila
// -------------------------------------- Consulta_Fila
// -------------------------------------- Exibe_Fila
int main(void)
{
Fila fila;
char tecla;
TDADOS valor;
fila.Cria_Fila();
do {
fila.Exibe_Fila();
cout << "[I]nclui, [E]xclui, [C]onsulta ou [F]im: ";
do {
tecla = toupper(cin.get());
} while (not strchr("IECF", tecla));
switch (tecla)
{
case 'I': cout << "Valor: ";
cin >> valor;
fila.Inclui_Fila(valor);
break;
case 'E': valor = fila.Exclui_Fila();
if (valor not_eq 0)
cout << "Valor Excluído da Fila: " << valor << endl;
break;
case 'C': valor = fila.Consulta_Fila();
if (valor not_eq 0)
cout << "Valor Consultado: " << valor << endl;
break;
}
} while (tecla not_eq 'F');
}
// abs.cpp
#include <iostream>
// ----------------------------- prototypes
int main(void)
{
cout << abs(-10) << endl;
cout << abs(-12.34) << endl;
}
// ----------------------------- abs
int abs(int x)
{
return(x < 0 ? -x : x);
}
// ----------------------------- abs
double abs(double x)
{
return(x < 0 ? -x : x);
}
Operador Ternário:
Sintaxe: condição ? comando1 : comando2;
Exemplo:
// stradd.cpp
#include <iostream>
#include <string>
// --------------------------------- Prototypes
int main(void)
{
char str[80] = "";
stradd(str,"UCPel, ");
stradd(str,2006);
stradd(str," -> ");
stradd(str,123.45);
cout << str << endl;
}
// --------------------------------- stradd
// --------------------------------- stradd
sprintf(tmp,"%d",i);
strcat(s,tmp);
}
// --------------------------------- stradd
sprintf(tmp,"%.2f",d);
strcat(s,tmp);
}
// imprime.cpp
#include <iostream>
// --------------------------------- Prototypes
int main(void)
{
Imprime("Sistema Operacional Linux");
Imprime('A');
Imprime(123);
Imprime(123.45);
}
// --------------------------------- Imprime
void Imprime(char *s)
{
cout << s << endl;
}
// --------------------------------- Imprime
void Imprime(char s)
{
cout << s << endl;
}
// --------------------------------- Imprime
void Imprime(int s)
{
cout << s << endl;
}
// --------------------------------- Imprime
void Imprime(double s)
{
cout << s << endl;
}
// default.cpp
#include <iostream>
using namespace std;
// --------------------------------- Prototypes
int main(void)
{
Imprime_String("Ubuntu 6.06", 3); // ... parâmetro linha foi inserido
Imprime_String("Ubuntu 6.06"); // … parâmetro linha foi suprimido
}
// --------------------------------- Imprime_String
// default.cpp
#include <iostream>
// --------------------------------- Imprime_String
int main(void)
{
Imprime_String("Ubuntu 6.06", 3); // … parâmetro linha foi inserido
Imprime_String("Ubuntu 6.06"); // … parâmetro linha foi suprimido
}
Referências e parâmetros de referência
// pointer.cpp
#include <iostream>
int main(void)
{
int n = 7;
int *p = &n;
// reference.cpp
#include <iostream>
int main(void)
{
int n = 7;
int &ref = n; // … “ref” é uma referência para uma posição de memória
cout << "n é igual " << n << endl; // ... n é igual a 7
cout << "n é igual " << ref << endl; // .. ref é igual a 7
ref++;
cout << "n é igual " << n << endl; // ... n é igual a 8
cout << "n é igual " << ref << endl; // ... ref é igual a 8
}
// troca.cpp
#include <iostream>
// ------------------ Prototypes
int main(void)
{
int x = 3, y = 4;
// ------------------------------ troca
t = x;
x = y;
y = t;
}
// ------------------------------ troca
Especificador inline
#include <iostream>
// ------------------------------------------- Random
int main(void)
{
srand(time(NULL)); // inicializa o gerador de números aleatórios
Random(10); // gera um número aleatório entre 0 e 9
Random(100); // gera um número aleatório entre 0 e 99
Random(1000); // gera um número aleatório entre 0 e 999
}
Especificador const
int main(void)
{
const float pi = 3.1416;
float raio,area;
#include <iostream>
#include <math.h>
int main(void)
{
int x[tam] = {1, 2, 3, 4, 5};
#include <iostream>
using namespace std;
int valor = 1;
int main(void)
{
int valor = 2;
Especificador enum
#include <iostream>
int main(void)
{
enum Dias {Seg, Ter, Qua, Qui, Sex, Sab, Dom};
Dias d;
int i;
do {
cout << "Dia da Semana [0..6] ou [9] Sair: ";
cin >> i;
d = Dias(i);
switch (d)
{
case Seg: cout << "Segunda-feira" << endl;
break;
case Ter: cout << "Terça-feira" << endl;
break;
case Qua: cout << "Quarta-feira" << endl;
break;
case Qui: cout << "Quinta-feira" << endl;
break;
case Sex: cout << "Sexta-feira" << endl;
break;
case Sab: cout << "Sábado" << endl;
break;
case Dom: cout << "Domingo" << endl;
break;
}
} while (i not_eq 9);
}
#include <iostream>
int main(void)
{
enum Dias {Seg, Ter, Qua, Qui, Sex, Sab, Dom};
const char *nome[] = {"Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado",
"Domingo"};
Saída do programa:
0 -> Segunda
1 -> Terça
2 -> Quarta
3 -> Quinta
4 -> Sexta
5 -> Sábado
6 -> Domingo
Exemplo: delete p;
ou
delete [] p; // quando é um vetor
// new.cpp
#include <iostream>
int main(void)
{
int *x = new int;
*x = 100;
cout << *x << endl; // … 100 (conteúdo do ponteiro)
cout << x << endl; // … 0x8fbe0dec (endereço do ponteiro)
delete x;
}
// new2.cpp
#include <iostream>
int main(void)
{
int *x = new int[tam];
Resultado do programa:
0x8fc10db2 -> 0
0x8fc10db4 -> 1
0x8fc10db6 -> 2
0x8fc10db8 -> 3
0x8fc10dba -> 4
0x8fc10dbc -> 5
0x8fc10dbe -> 6
0x8fc10dc0 -> 7
0x8fc10dc2 -> 8
0x8fc10dc4 -> 9
#include <iostream>
int main(void)
{
float *x = new float[tam];
Resultado do programa:
0x8f78124e -> 0
0x8f781252 -> 0.5
0x8f781256 -> 1
0x8f78125a -> 1.5
0x8f78125e -> 2
0x8f781262 -> 2.5
0x8f781266 -> 3
0x8f78126a -> 3.5
0x8f78126e -> 4
0x8f781272 -> 4.5
Especificadores de acesso
public (público)
private (privado)
protected (protegido)
// métodos
};
// heranca1.cpp
#include <iostream>
public:
void Seta(int a, int b)
{
x = a;
y = b;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
}
int Soma(void)
{
cout << "Soma (x+y): " << x+y << endl;
return(x+y);
}
};
public:
Derivada(int x)
{
z = x;
cout << "z = " << z << endl;
}
int Somador(int soma)
{
return(soma+z); // não é possível acessar x e y pois são privados a classe base
}
};
int main(void)
{
Derivada objeto(3); // construtor parametrizado
int resp;
objeto.Seta(1, 2);
resp = objeto.Soma();
cout << "Somador (x+y+z): " << objeto.Somador(resp) << endl;
}
Resultado do Programa:
z=3
x=1
y=2
Soma (x+y): 3
Somador (x+y+z): 6
// heranca2.cpp
#include <iostream>
class Base
{
protected:
int x, y; // atributos protegidos, ou seja, podem ser acessados na classe derivada
public:
void Seta(int a, int b)
{
x = a;
y = b;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
}
void Soma(void)
{
cout << "Soma (x+y): " << x+y << endl;
}
};
public:
Derivada(int x)
{
z = x;
cout << "z = " << z << endl;
}
int Somador(void)
{
return(x+y+z);
}
};
int main(void)
{
Derivada objeto(3); // construtor parametrizado
objeto.Seta(1, 2);
objeto.Soma();
cout << "Somador (x+y+z): " << objeto.Somador() << endl;
}
Resultado do Programa:
z=3
x=1
y=2
Soma (x+y): 3
Somador (x+y+z): 6
// linear.cpp (Lista_Linear)
#include <iostream>
#include <string>
#include <cctype>
class Lista
{
TDADOS lista[tam]; // dados privados (private)
int n;
public:
Lista(void); // construtor (não tem tipo de retorno)
~Lista(void); // destrutor (não tem tipo de retorno)
void Inclui_Lista(TDADOS dado);
TDADOS Exclui_Lista(void);
TDADOS Consulta_Lista(void);
void Exibe_Lista(void);
}; // obrigatório ponto-e-vírgula
// -------------------------------------- Construtor
Lista :: Lista(void)
{
n = 0;
}
// -------------------------------------- Destrutor
Lista :: ~Lista(void)
{
n = 0;
}
// -------------------------------------- Inclui_Lista
// -------------------------------------- Exclui_Lista
// -------------------------------------- Consulta_Lista
// -------------------------------------- Exibe_Lista
int main(void)
{
Lista lista;
char tecla;
TDADOS valor;
do {
lista.Exibe_Lista();
cout << "[I]nclui, [E]xclui, [C]onsulta ou [F]im: ";
do {
tecla = toupper(cin.get());
} while (not strchr("IECF", tecla));
switch (tecla)
{
case 'I': cout << "Valor: ";
cin >> valor;
lista.Inclui_Lista(valor);
break;
case 'E': valor = lista.Exclui_Lista();
if (valor not_eq 0)
cout << "Valor Excluido da Lista: " << valor << endl;
break;
case 'C': valor = lista.Consulta_Lista();
if (valor not_eq 0)
cout << "Valor Consultado: " << valor << endl;
break;
}
} while (tecla not_eq 'F');
}
Programa exemplo (35): O programa demonstra a criação e
manipulação de uma Lista Simplesmente Encadeada.
// Lista Encadeada
#include <iostream>
#include <string>
#include <cctype>
// ----------------------------------------- Definições
#define SUCESSO 0
#define FALTA_DE_MEMORIA 1
#define LISTA_VAZIA 2
typedef struct {
TNODO *primeiro;
} TLISTA;
class Lista
{
TLISTA l;
public:
Lista(void); // construtor
~Lista(void); // destrutor
int Inclui_Lista(TDADOS dado);
int Exclui_Lista(void);
int Consulta_Lista(TDADOS *dado);
void Imprime_Erro(int erro);
void Exibe_Primeiro(void);
void Exibe_Lista(void);
};
// ------------------------------- Construtor
Lista :: Lista(void)
{
l.primeiro = NULL;
}
// ----------------------------------------- Destrutor
Lista :: ~Lista(void)
{
TNODO *p,*q;
if (l.primeiro not_eq NULL)
{
p = l.primeiro;
while (p not_eq NULL)
{
q = p->elo;
delete(p);
p = q;
}
}
l.primeiro = NULL;
}
// ------------------------------- Inclui_Lista
// ------------------------------- Exclui_Lista
if (l.primeiro == NULL)
return(LISTA_VAZIA);
else
{
p = l.primeiro;
l.primeiro = p->elo;
delete(p); // seria free(p);
return(SUCESSO);
}
}
// ------------------------------- Consulta_Lista
if (l.primeiro == NULL)
return(LISTA_VAZIA);
else
{
p = l.primeiro;
*dado = p->dado;
return(SUCESSO);
}
}
// ------------------------------- Imprime_Erro
// ----------------------------------------- Exibe_Primeiro
// ----------------------------------------- Exibe_Lista
int main(void)
{
Lista lista;
TDADOS valor;
int erro;
char tecla;
do {
lista.Exibe_Primeiro();
lista.Exibe_Lista();
cout << "\n[I]nclui, [E]xclui, [C]onsulta ou [F]im: ";
do {
tecla = toupper(cin.get());
} while (not strchr("IECF",tecla));
switch (tecla)
{
case 'I': cout << "Valor: ";
cin >> valor;
erro = lista.Inclui_Lista(valor);
break;
case 'E': erro = lista.Exclui_Lista();
if (not erro)
cout << "Ok, Elemento Excluido";
break;
case 'C': erro = lista.Consulta_Lista(&valor);
if (not erro)
cout << "Valor Consultado: " << valor << endl;
break;
}
if (erro and tecla not_eq 'F') // and é igual a &&
lista.Imprime_Erro(erro);
} while (tecla not_eq 'F');
}
// Dupla.cpp
#include <iostream>
#include <string>
#include <cctype>
#define SUCESSO 0
#define FALTA_DE_MEMORIA 1
#define LISTA_VAZIA 2
typedef int TDados;
typedef struct {
TNodo *primeiro;
int n;
TNodo *ultimo;
} TDupla;
class Dupla
{
TDupla d;
public:
Dupla(void);
~Dupla(void);
int Insere_Direita(TDados dado);
int Insere_Esquerda(TDados dado);
void Imprime_Lista_Esquerda(void);
void Imprime_Lista_Direita(void);
void Imprime_Erro(int erro);
void Exibe_Descritor(void);
};
// ------------------------------- Construtor
Dupla :: Dupla(void)
{
d.primeiro = NULL;
d.n = 0;
d.ultimo = NULL;
}
// ------------------------------- Destrutor
Dupla :: ~Dupla(void)
{
TNodo *p,*q;
p = d.primeiro;
while (p not_eq NULL)
{
q = p;
delete(p);
p = q->posterior;
}
}
// ------------------------------- Insere_Direita
int Dupla :: Insere_Direita (TDados dado)
{
TNodo *p,*q;
p = new TNodo;
if (p == NULL)
return(FALTA_DE_MEMORIA);
else
{
p->dado = dado;
p->posterior = NULL;
if (d.n == 0)
{
d.primeiro = p;
d.n = 1;
d.ultimo = p;
p->anterior = NULL;
}
else
{
q = d.ultimo;
d.ultimo = p;
q->posterior = p;
p->anterior = q;
(d.n)++;
}
return(SUCESSO);
}
}
// ------------------------------- Insere_Esquerda
p = new TNodo;
if (p == NULL)
return(FALTA_DE_MEMORIA);
else
{
p->dado = dado;
p->anterior = NULL;
if (d.n == 0)
{
d.primeiro = p;
d.n = 1;
d.ultimo = p;
p->posterior = NULL;
}
else
{
q = d.primeiro;
d.primeiro = p;
q->anterior = p;
p->posterior = q;
(d.n)++;
}
return(SUCESSO);
}
}
// ------------------------------- Imprime_Lista_Direita
// ------------------------------- Imprime_Lista_Esquerda
void Dupla::Imprime_Lista_Esquerda(void)
{
TNodo *p;
// ------------------------------- Imprime_Erro
// ------------------------------- Exibe_Descritor
int main(void)
{
Dupla dupla;
TDados valor;
int erro;
char tecla;
do {
dupla.Exibe_Descritor();
dupla.Imprime_Lista_Esquerda();
dupla.Imprime_Lista_Direita();
cout << "\nValor: ";
cin >> valor;
if (valor not_eq 0)
{
cout << "[E]squerda ou [D]ireita: ";
do {
tecla = toupper(cin.get());
} while (not strchr("ED",tecla));
switch (tecla)
{
case 'E': erro = dupla.Insere_Esquerda(valor);
break;
case 'D': erro = dupla.Insere_Direita(valor);
break;
}
if (erro)
dupla.Imprime_Erro(erro);
}
} while (valor not_eq 0);
}
#includes
// string1.cpp
#include <iostream>
#include <string>
int main(void)
{
string s = "Couve", r = "-flor";
string t;
// string2.cpp
#include <iostream.h>
#include <string>
int main(void)
{
string s = "Couve", r = "-flor";
string t;
t = s + r;
cout << t << endl;
}
// string3.cpp
#include <iostream>
#include <string>
int main(void)
{
string s = "C++ for Linux";
int n = s.length();
cout << "String: " << s << endl;
cout << "Total de Caracteres: " << n << endl;
}
// string4.cpp
#include <iostream>
#include <string>
int main(void)
{
string s; // pode-se declarar uma string sem inicialização
// string5.cpp
#include <iostream>
#include <string>
// string6.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("universidade");
// string7.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("Couve"), r("-flor"), t; // t é igual a t(“”)
t = s + r;
cout << t << endl;
}
// dia.cpp
#include <iostream>
int main(void)
{
int dia, mes, ano;
int a, b, c;
long int d, e, dj;
char tecla;
double resp;
do {
do {
cout << "Dia [1..31]: ";
cin >> dia;
} while (dia < 1 or dia > 31); // or é igual a ||
do {
cout << "Mes [1..12]: ";
cin >> mes;
} while (mes < 1 or mes > 12);
do {
cout << "Ano [1900..2999]: ";
cin >> ano;
} while (ano < 1900 or ano > 2999);
cout << "Data: " << dia << " de ";
switch (mes)
{
case 1: cout << "Janeiro";
break;
case 2: cout << "Fevereiro";
break;
case 3: cout << "Março";
break;
case 4: cout << "Abril";
break;
case 5: cout << "Maio";
break;
case 6: cout << "Junho";
break;
case 7: cout << "Julho";
break;
case 8: cout << "Agosto";
break;
case 9: cout << "Setembro";
break;
case 10: cout << "Outubro";
break;
case 11: cout << "Novembro";
break;
case 12: cout << "Dezembro";
break;
}
cout << " de " << ano;
if (mes < 3)
{
ano--;
mes += 12;
}
a = ano / 100;
b = a / 4;
c = 2 - a + b;
resp = 365.25 * (ano + 4716);
d = (long int) resp;
resp = 30.6001 * (mes + 1);
e = (long int) resp;
dj = d + e + dia + c - 1524;
int resto = dj % 7;
cout << "\nDia da Semana: ";
switch (resto)
{
case 0: cout << "SEGUNDA-FEIRA";
break;
case 1: cout << "TERÇA-FEIRA";
break;
case 2: cout << "QUARTA-FEIRA";
break;
case 3: cout << "QUINTA-FEIRA";
break;
case 4: cout << "SEXTA-FEIRA";
break;
case 5: cout << "SÁBADO";
break;
case 6: cout << "DOMINGO";
break;
}
do {
cout << "\nNovo Cálculo [S/n]?";
cin >> tecla;
} while (not strchr("SsNn", tecla));
} while (strchr("Ss", tecla));
}
// juliano.cpp
// --------------------------- Prototypes
#include <iostream>
class Data
{
int dia, mes, ano;
public:
void Le_Atributos(void);
void Exibe_Data_Extenso(void);
int Calcula_Dia_Juliano(void);
void Exibe_Dia_Semana(int resto);
};
int main(void)
{
Data data; // definição do objeto “data”
char tecla;
do {
data.Le_Atributos();
data.Exibe_Data_Extenso();
int resto = data.Calcula_Dia_Juliano();
data.Exibe_Dia_Semana(resto);
cout << "\nNovo Cálculo [S/n]?";
do {
cin >> tecla;
} while (not strchr("SsNn", tecla));
} while (strchr("Ss", tecla));
}
if (mm < 3)
{
aa--;
mm += 12;
}
a = aa / 100;
b = a / 4;
c = 2 - a + b;
resp = 365.25 * (aa + 4716);
d = (long int) resp;
resp = 30.6001 * (mm + 1);
e = (long int) resp;
dj = d + e + dd + c - 1524;
int resto = dj % 7;
return(resto);
}
// string.cpp
#include <iostream>
int main(void)
{
char s[81];
cout << "Digite seu nome: ";
cin.getline(s,80);
cout << s << "\nTotal de caracteres: " << strlen(s) << endl;
cout << "Tecle <ENTER> para encerrar";
cin.get();
}
// sort1.cpp
#include <iostream>
int main(void)
{
char nome[tam][41], temp[41];
bool trocou;
int n = -1;
do {
n++;
cout << "Nome: ";
cin.getline(nome[n],40);
} while (strcmp(nome[n],"") not_eq 0 and n < tam); // and é igual a &&
if (strcmp(nome[n],"") == 0)
n--;
int j = n;
cout << "Nomes digitados\n";
for (int i = 0;i <= n;i++)
cout << nome[i] << endl;
do {
trocou = false;
for (int i = 0;i < j;i++)
if (strcmp(nome[i],nome[i+1]) > 0)
{
strcpy(temp,nome[i]);
strcpy(nome[i],nome[i+1]);
strcpy(nome[i+1],temp);
trocou = true;
}
j--;
} while (trocou);
cout << "Nomes Ordenados\n";
for (int i = 0;i <= n;i++)
cout << nome[i] << endl;
}
Programa exemplo (48): O programa permite a entrada de strings
(nomes, máximo 50) até que o usuário digite apenas enter e após
ordena e imprime os nomes em ordem alfabética. Este programa possui
uma função que faz a troca de duas strings.
// sort2.cpp
#include <iostream>
ns = strlen(s);
nr = strlen(r);
ns > nr ? n = ns : n = nr;
char *t = (char *) new char * [n+1];
strcpy(t,s);
strcpy(s,r);
strcpy(r,t);
delete t;
}
int main(void)
{
char nome[tam][41], temp[41];
bool trocou;
int n = -1;
do {
n++;
cout << "Nome: ";
cin.getline(nome[n],40);
} while (strcmp(nome[n],"") not_eq 0 and n < tam);
if (strcmp(nome[n],"") == 0)
n--;
int j = n;
cout << "Nomes digitados\n";
for (int i = 0;i <= n;i++)
cout << nome[i] << endl;
do {
trocou = false;
for (int i = 0;i < j;i++)
if (strcmp(nome[i],nome[i+1]) > 0)
{
troca(nome[i],nome[i+1]);
trocou = true;
}
j--;
} while (trocou);
cout << "Nomes Ordenados\n";
for (int i = 0;i <= n;i++)
cout << nome[i] << endl;
}
2. Classes e Objetos
2.1 Classes
class nome_da_classe
{
// atributos e métodos privadas;
// se for suprimido o especificador de acesso ele é por default: private
especificador_de_acesso:
//atributos e métodos;
.
.
.
especificador_de_acesso:
// atributos e métodos;
} lista_de_objetos;
Observações:
nome_da_classe lista_de_objetos;
// boneco.cpp
#include <iostream>
using namespace std;
class Boneco
{
private:
int n;
private:
void Cabeca(void);
void Corpo(void);
void Braco_Esquerdo(void);
void Braco_Direito(void);
void Perna_Esquerda(void);
void Perna_Direita(void);
public:
void Seta_Atributo(int x)
{
n = x;
}
void Incrementa_Atributo(void)
{
n++;
}
void Desenha_Boneco(void);
};
int main(void)
{
Boneco boneco;
boneco.Seta_Atributo(1);
for (int i = 1;i <= 6;i++)
{
boneco.Desenha_Boneco();
boneco.Incrementa_Atributo();
cin.get();
}
}
// anda.cpp
#include <iostream>
using namespace std;
class Boneco
{
private:
int c;
public:
void Seta_Atributo(int col) { c = col; }
void Incrementa_Atributo(void);
void Desenha_Boneco(void);
void Anda_Boneco(void);
};
int main(void)
{
Boneco boneco;
boneco.Seta_Atributo(10);
boneco.Desenha_Boneco();
for (int i = 1;i <= 70;i++)
{
boneco.Anda_Boneco();
boneco.Incrementa_Atributo();
system("clear");
}
}
Especificadores de acesso:
// public.cpp
#include <iostream>
class Pessoa
{
public:
char nome[81];
int n;
};
int main(void)
{
Pessoa pessoa;
// public2.cpp
#include <iostream>
class Pessoa
{
public:
char nome[81];
int n;
};
int main(void)
{
Pessoa *pessoa;
// friend.cpp
#include <iostream>
class Calc
{
float a, b;
public:
void Inicializa_Atributos(float x, float y)
{
a = x;
b = y;
}
friend float Div(Calc t); // observação: Div não é membro da classe Calc
};
int main(void)
{
Calc calc;
calc.Inicializa_Atributos(3.0,4.0);
cout << "Soma: " << Div(calc) << endl;
}
float Div(Calc t)
{
return(t.a / t.b); // pode acessar a e b pois é uma função amiga
}
// inline.cpp
#include <iostream>
// inline2.cpp
#include <iostream>
int main(void)
{
cout << "Maior: " << (5 > 6 ? 5 : 6) << endl;
cout << "Menor: " << (5 < 6 ? 5 : 6) << endl;
}
#include <iostream>
class Boneco
{
private:
int n;
private:
void Cabeca(void);
void Bracos(void);
void Corpo(void);
void Pernas(void);
public:
Boneco(int x) // construtor parametrizado
{
n = x;
}
void Desenha_Boneco(void);
};
int main(void)
{
Boneco boneco(1); // construtor parametrizado
boneco.Desenha_Boneco();
}
// Arquivo.cpp
#include <iostream>
class Arquivo
{
FILE *fp; // lista de atributos
char nome[81], palavra[31], tecla;
bool aberto; // tipo lógico (boolean)
int main(void)
{
char nome[81], tecla;
// ----------------------------------------------- Destrutor
Arquivo :: ~Arquivo(void)
{
if (aberto)
fclose(fp);
}
// ----------------------------------------------- Cria_Arquivo
// ----------------------------------------------- Abre_Arquivo
// ----------------------------------------------- Erro
// ----------------------------------------------- Tamanho_Arquivo
if (aberto)
{
rewind(fp);
fread(palavra,sizeof(palavra),1,fp);
while (not feof(fp))
{
n++;
fread(palavra,sizeof(palavra),1,fp);
}
}
return(n);
}
// ----------------------------------------------- Grava_Palavra
// ----------------------------------------------- Exibe_Palavras
// ----------------------------------------------- Insere_Palavras
// ----------------------------------------------- Consulta_Palavras
if (aberto)
{
n = Tamanho_Arquivo();
do {
do {
cout << "Posicao [0.." << n << "]: ";
cin >> pos;
} while (pos < 0 or pos > n);
posicao = pos * sizeof(palavra);
fseek(fp,posicao,SEEK_SET);
fread(palavra,sizeof(palavra),1,fp);
cout << "PALAVRA: " << palavra << endl;
do {
cout << "Continua [S/n]? ";
cin >> tecla;
} while (not strchr("SsNn",tecla));
} while (strchr("Ss",tecla));
}
else
cout << "ERRO: [1] Criar ou [2] Abrir um arquivo ... " << endl;
}
// ----------------------------------------------- Ordena_Palavras
if (aberto)
{
n = Tamanho_Arquivo();
rewind(fp);
char vetor[n][31];
fread(&vetor[i],sizeof(vetor[i]),1,fp);
while (not feof(fp))
{
i++;
fread(&vetor[i],sizeof(vetor[i]),1,fp);
}
for (i = 0;i < n-1;i++)
for (j = i + 1;j < n;j++)
if (strcmp(vetor[i],vetor[j]) > 0)
{
strcpy(temp,vetor[i]);
strcpy(vetor[i],vetor[j]);
strcpy(vetor[j],temp);
}
rewind(fp);
for (i = 0;i < n;i++)
fwrite(&vetor[i],sizeof(vetor[i]),1,fp);
cout << "Ok, Arquivo Ordenado ..." << endl;
}
else
cout << "ERRO: [1] Criar ou [2] Abrir um Arquivo ... " << endl;
}
// construtor.cpp
#include <iostream>
class Classe
{
public:
int quem;
Classe(int id);
~Classe(void);
} global1(1), global2(2); // objetos globais
Classe :: ~Classe(void)
{
cout << "Destrutor: " << quem << endl;
}
int main(void)
{
Classe local1(3); // objeto local
Resultado do programa:
Construtor: 1
Construtor: 2
Construtor: 3
main
Construtor: 4
Destrutor: 4
Destrutor: 3
Destrutor: 2
Destrutor: 1
// escopo.cpp
#include <iostream>
int main(void)
{
int var = 4; // variável local
// objeto.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
int i;
public:
Classe (int n); // construtor
void Inicializa_Atributos(int n);
int Retorna_Atributo(void);
};
int main(void)
{
Classe objeto(1);
Exibe(objeto);
cout << "Atributo: " << objeto.Retorna_Atributo() << endl;
}
// ----------------------------------------------- construtor
// ----------------------------------------------- Inicializa_Atributos
// retorno.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
int i;
public:
void Inicializa_Atributos(int n);
int Retorna_Atributo(void);
};
objeto.Inicializa_Atributos(2);
return(objeto); // retorno do objeto
}
int main(void)
{
Classe objeto;
objeto = Exibe();
cout << "Atributo: " << objeto.Retorna_Atributo() << endl;
}
// ----------------------------------------------- Inicializa_Atributos
// ----------------------------------------------- Retorna_Atributo
// atrib.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
int i;
public:
void Inicializa_Atributos(int n);
int Retorna_Atributo(void);
};
int main(void)
{
Classe objeto1, objeto2;
objeto1.Inicializa_Atributos(5);
cout << "Atributo Objeto 1: " << objeto1.Retorna_Atributo() << endl;
objeto2 = objeto1; // atribuição de objetos
cout << "Atributo Objeto 2: " << objeto2.Retorna_Atributo() << endl;
}
// ----------------------------------------------- Inicializa_Atributos
// ----------------------------------------------- Retorna_Atributo
// vetor.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
int i;
public:
void Inicializa_Atributos(int n);
int Retorna_Atributo(void);
};
int main(void)
{
Classe objeto[MAX]; // vetor de três objetos
int i;
// ----------------------------------------------- Inicializa_Atributos
// ----------------------------------------------- Retorna_Atributo
int Classe :: Retorna_Atributo(void)
{
return(i);
}
// vetor2.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
int i;
public:
Classe(int n) { i = n; } // construtor inicializa atributos
int Retorna_Atributo(void);
};
int main(void)
{
Classe objeto[MAX] = {1,2,3}; // vetor de objetos inicializado
int i;
// ----------------------------------------------- Retorna_Atributo
// pointer1.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
int i;
public:
Classe (int n) { i = n; }
int Retorna_Atributo(void);
};
int main(void)
{
Classe objeto(10), *pobj;
pobj = &objeto;
cout << "Atributo Objeto: " << pobj->Retorna_Atributo() << endl;
cout << "Atributo: " << (*pobj).Retorna_Atributo() << endl;
}
// ----------------------------------------------- Retorna_Atributo
// pointer2.cpp
#include <iostream>
using namespace std;
// ----------------------------------------------- Classe
class Classe
{
int i;
public:
Classe (int n) { i = n; }
int Retorna_Atributo(void);
};
int main(void)
{
Classe *pobj, objeto[MAX] = {10, 20, 30};
int i;
pobj = &objeto[0];
for (i = 0;i < MAX;i++)
{
cout << "Atributo Objeto: " << pobj->Retorna_Atributo() << endl;
pobj++;
}
}
// ----------------------------------------------- Retorna_Atributo
// pointer3.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
public:
int i; // atributo público
Classe (int n) { i = n; }
int Retorna_Atributo(void);
};
int main(void)
{
Classe objeto(100);
int *pobj;
// ----------------------------------------------- Retorna_Atributo
// this.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
int x;
public:
Classe Exibe(void)
{
this->x = 2;
return(*this);
}
int Retorna_Atributo(void)
{
return(x);
}
};
int main(void)
{
Classe objeto, objeto_temp;
objeto = objeto.Exibe();
objeto_temp = objeto;
cout << "Atributo: " << objeto_temp.Retorna_Atributo() << endl;
}
// this.cpp
#include <iostream>
// ----------------------------------------------- Classe
class Classe
{
int x,y;
public:
Classe Inicializa_Atributos(int tx, int ty)
{
this->x = tx;
this->y = ty;
return(*this);
}
void Retorna_Atributos(int &a, int &b) // referências
{
a = x;
b = y;
}
void Incrementa_Atributos(int n)
{
x = x + n;
y = y + n;
}
};
int main(void)
{
Classe objeto, temp;
int a, b;
3.4 Referências
Forma geral:
// troca.cpp
#include <iostream>
temp = a;
a = b;
b = temp;
}
temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
int x = 3, y = 4;
cout << "x = " << x << " - y = " << y << endl;
Troca(x, y);
cout << "x = " << x << " - y = " << y << endl;
Troca(&x, &y);
cout << "x = " << x << " - y = " << y << endl;
}
3.4.2 Passando referências a objetos
// ref.cpp
#include <iostream>
class Classe
{
int id;
public:
int i;
Classe(int num);
~Classe(void);
void Negativo(Classe &obj) { obj.i = -obj.i; } // experimente sem o &
};
int main(void)
{
Classe obj(1);
obj.i = 10;
obj.Negativo(obj);
cout << obj.i << endl;
}
Classe :: ~Classe(void)
{
cout << "Destruindo: " << id << endl;
}
// return.cpp
#include <iostream>
int main(void)
{
cout << str << endl;
troca(4) = 'a';
cout << str << endl;
}
char &troca(int i)
{
return(str[i]);
}
Exemplos:
char *s;
int *x;
Classe *obj;
float *f;
Exemplos:
p = new float;
q = new (float);
r = new float[7];
// ptr1.cpp
#include <iostream>
int main(void)
{
int *ptr; // declaração do ponteiro
Resultado do Programa:
// ptr2.cpp
#include <iostream>
int main(void)
{
int *ptr;
int n;
int main(void)
{
int *ptr;
#include <iostream>
class Pessoa
{
int idade;
public:
char nome[41];
void Inicializa_Atributos(char *s, int id);
int Calcula_Ano_Nascimento(int ano_atual);
};
Resultado do programa:
#include <iostream>
class Pessoa
{
int idade;
public:
char nome[41];
public:
Pessoa(char *s, int id);
int Calcula_Ano_Nascimento(int ano_atual);
};
Resultado do programa:
#include <iostream>
class Pessoa
{
int idade;
public:
char *nome; // ponteiro
Pessoa(char *s, int id);
~Pessoa(void);
int Calcula_Ano_Nascimento(int ano_atual);
};
ptr = new Pessoa("Paulo Roberto Gomes Luzzardi", 44); // inicialização dos atributos
do objeto
if (not ptr) // !NULL verdadeiro
{
cout << "ERRO FATAL: Falta de Memória\n";
exit(EXIT_FAILURE);
}
cout << "Ano Atual: ";
cin >> ano_atual;
ano_nascimento = ptr->Calcula_Ano_Nascimento(ano_atual);
cout << ptr->nome << " nasceu em " << ano_nascimento << endl;
delete ptr;
}
Resultado do programa:
// pessoa4.cpp
#include <iostream>
class Pessoa
{
int idade;
public:
char nome[81];
void Inicializa_Atributos(char *s, int id);
int Calcula_Ano_Nascimento(int ano_atual);
};
Resultado do programa:
Exemplo:
Objeto *ptr;
ptr = new Objeto[4];
...
delete [4]ptr;
4. Sobrecarga de Operadores e Funções
4.1 Sobrecarga de operadores
// soma.cpp
#include <iostream>
class Soma
{
double valor;
public:
Soma(void) {}; // construtor é necessário para declarar um objeto temporário Soma
Soma (double val)
{
valor = val;
}
void Exibe(char *mensagem)
{
cout << mensagem << valor << endl;
}
Soma operator+(Soma t) // operator+
{
Soma temp;
int main(void)
{
Soma objeto1(1.23), objeto2(2.34), objeto3(0.0);
// fila.cpp
// Sobrecarga dos operadores '+' e '-' em uma fila em vetor
#include <iostream>
#include <cctype>
class Fila
{
TDADOS fila[TAM];
int inic,fim;
public:
void Cria_Fila(void);
void operator+(TDADOS dado); // insere na fila
void operator-(TDADOS *dado); // retira da fila
TDADOS Consulta_Fila(void);
void Exibe_Fila(void);
};
// -------------------------------------- Cria_Fila
// -------------------------------------- operator+
// -------------------------------------- operator-
// -------------------------------------- Consulta_Fila
// -------------------------------------- Exibe_Fila
int main(void)
{
Fila fila;
char tecla;
TDADOS valor;
fila.Cria_Fila();
do {
fila.Exibe_Fila();
cout << "[I]nclui, [E]xclui, [C]onsulta ou [F]im: ";
do {
tecla = toupper(getchar());
} while (not strchr("IECF", tecla));
switch (tecla)
{
case 'I': cout << "Valor: ";
cin >> valor;
fila+(valor); // Insere na Fila (operador +)
break;
case 'E': fila-(&valor); // Retira da Fila (operador -)
if (valor not_eq 0)
cout << "Valor Excluído da Fila: " << valor << endl;
break;
case 'C': valor = fila.Consulta_Fila();
if (valor not_eq 0)
cout << "Valor Consultado: " << valor << endl;
break;
}
} while (tecla not_eq 'F');
}
Operadores Lógicos:
C C++ Ação
&& and true quando a condição_A e condição_B forem true
|| or true quando a condição_A ou condição_B forem true
! not negação (não) inverte a condição
Operadores Relacionais: !=
C C++ Ação
!= not_eq diferente, ou seja, não igual
C C++ Ação
& bitand (e) true quando bit_A e bit_b forem true (1) and (1)
&= and_eq (e igual)
| bitor (ou) true quando bit_A ou bit_B forem true: (1) ou (0) / (0) ou (1) / (1) ou (1) |-> (0) ou (0)
false
|= or_eq (ou igual)
^ xor (ou exclusivo) somente quando um dos bits for true: (1) ou (0) | (0) ou (1)
^= xor_eq (ou exclusivo igual)
~ compl (complemento de um)
// local.cpp
#include <iostream>
class Local
{
int objeto; // identificação do objeto
int latitude, longitude;
public:
Local(void) {};
Local(int obj, int la, int lo)
{
objeto = obj;
latitude = la;
longitude = lo;
}
void Exibe(void)
{
cout << "Objeto (" << objeto << "): Latitude: " << latitude << " -> Longitude: " <<
longitude << endl;
}
friend Local operator+(Local op1, Local op2); // função amiga
Local operator-(Local op2);
Local operator=(Local op2);
Local operator++(void);
};
int main(void)
{
Local objeto1(1, 10, 20), objeto2(2, 30, 40), objeto3(3, 50, 60);
++objeto1;
objeto1.Exibe();
objeto2.Exibe();
objeto2 = ++objeto1;
objeto1.Exibe();
objeto2.Exibe();
objeto2 = objeto3;
objeto2.Exibe();
}
Resultado do Programa:
// local.cpp
#include <iostream>
class Local
{
int objeto;
int latitude, longitude;
public:
Local(void) {};
Local(int obj)
{
objeto = obj;
}
Local(int obj, int la, int lo)
{
objeto = obj;
latitude = la;
longitude = lo;
}
void Exibe(void)
{
cout << "Objeto (" << objeto << "): Latitude: " << latitude << " -> Longitude: " <<
longitude << endl;
}
Local operator=(Local op2);
friend Local operator++(Local &op2);
friend Local operator--(Local &op2);
};
int main(void)
{
Local objeto1(1, 10, 20), objeto2(2);
objeto1.Exibe();
++objeto1;
objeto1.Exibe();
objeto2.Exibe();
objeto2 = ++objeto1;
objeto1.Exibe();
objeto2.Exibe();
--objeto2;
objeto2.Exibe();
}
Resultado do Programa:
Forma geral:
// heranca1.cpp
#include <iostream>
class Base
{
protected:
int x, y;
private:
void seta_atributos(int tx, int ty)
{
x = tx;
y = ty;
}
public:
void Inicializa(int tx, int ty)
{
seta_atributos(tx,ty);
}
void Exibe(void)
{
cout << "x = " << x << " | y = " << y << endl;
}
};
int main(void)
{
Derivada d;
Resultado do Programa:
x=1|y=2
x = 11 | y = 12
// heranca2.cpp
#include <iostream>
class Base
{
protected:
int x, y;
private:
void seta_atributos(int tx, int ty)
{
x = tx;
y = ty;
}
public:
void Inicializa(int tx, int ty)
{
seta_atributos(tx,ty);
}
void Exibe(void)
{
cout << "x = " << x << " | y = " << y << endl;
}
};
d1.Inicializa(1,2);
d1.Exibe();
d1.Move(10);
d1.Exibe();
d2.Inicializa(2,3);
d2.Exibe();
d2.Move(10);
d2.Exibe();
d2.Retorna(15);
d2.Exibe();
}
Resultado do Programa:
x = 1|y=2
x = 11 | y = 12
x = 2|y=3
x = 12 | y = 13
x = -3 | y = -2
// heranca3.cpp
#include <iostream>
class Base
{
protected:
int x, y;
private:
void seta_atributos(int tx, int ty)
{
x = tx;
y = ty;
}
public:
void Inicializa(int tx, int ty)
{
seta_atributos(tx,ty);
}
void Exibe(void)
{
cout << "x = " << x << " | y = " << y << endl;
}
};
int main(void)
{
Derivada1 d1;
Derivada2 d2;
d1.Inicializa(1,2);
d1.Exibe();
d1.Move(10);
d1.Exibe();
d2.Retorna(15);
}
Resultado do Programa:
x=1|y=2
x = 11 | y = 12
x = -3 | y = -2
// multipla.cpp
#include <iostream>
class Base1
{
protected:
int x;
public:
void Exibe_Atributo_X(void)
{
cout << "x = " << x << endl;
}
};
class Base2
{
protected:
int y;
public:
void Exibe_Atributo_Y(void)
{
cout << "y = " << y << endl;
}
};
int main(void)
{
Derivada d;
d.Seta(1,2); // derivada
d.Exibe_Atributo_X(); // base1
d.Exibe_Atributo_Y(); // Base2
}
5.4 Passando parâmetros para os construtores das classes base
Sintaxe:
// heranca.cpp
#include <iostream>
class Base
{
protected:
int x;
public:
Base(int tx) // construtor
{
x = tx;
cout << "Construtor Base, Ok " << endl;
}
~Base(void) // destrutor
{
cout << "Destrutor Base, Ok" << endl;
}
};
int main(void)
{
Derivada d(3,4);
d.Exibe();
}
Resultado do Programa:
Construtor Base, Ok
Construtor Derivada, Ok
|x=4|y=3|
Destrutor Derivada, Ok
Destrutor Base, Ok
// heranca.cpp
#include <iostream>
class Base1
{
protected:
int x;
public:
Base1(int tx)
{
x = tx;
cout << "Construtor Base1, Ok " << endl;
}
~Base1(void)
{
cout << "Destrutor Base1, Ok" << endl;
}
};
class Base2
{
protected:
int y;
public:
Base2(int ty)
{
y = ty;
cout << "Construtor Base2, Ok " << endl;
}
~Base2(void)
{
cout << "Destrutor Base2, Ok" << endl;
}
};
int main(void)
{
Derivada d(3,4,5);
d.Exibe();
}
Resultado do Programa:
Construtor Base1, Ok
Construtor Base2, Ok
Construtor Derivada, Ok
|x=5|y=4|z=3|
Destrutor Derivada, Ok
Destrutor Base2, Ok
Destrutor Base1, Ok
// heranca.cpp
#include <iostream>
class Base
{
protected:
int x, y;
public:
void Inicializa(int tx, int ty)
{
x = tx;
y = ty;
}
void Exibe(void)
{
cout << "x = " << x << " | y = " << y << endl;
}
};
int main(void)
{
Derivada d;
d.Inicializa(1,2);
d.Exibe();
d.Move(10);
// d.x = 7; ... erro, pois x é protegido, a não ser que seja feito Base :: x; na classe Derivada
d.Exibe();
}
// multipla.cpp
#include <iostream>
class Base
{
public:
int i;
};
int main(void)
{
Derivada3 d3;
Resultado do Programa:
Soma = 10
// multipla.cpp
#include <iostream>
class Base
{
public:
int x;
public:
void Inicializa_Base(int tx)
{
x = tx;
}
void Exibe_Base(void)
{
cout << "x = " << x << " |" << endl;
}
int Retorna_Base(void)
{
return(x);
}
};
class Derivada1 : public Base
{
public:
int y;
public:
void Inicializa(int ty, int tx)
{
y = ty;
Inicializa_Base(tx);
Exibe_Base();
}
void Exibe(void)
{
cout << "y = " << y << " |" << endl;
}
};
int main(void)
{
Derivada1 d1;
Derivada2 d2;
Derivada3 d3;
d1.Inicializa(1,2);
d1.Exibe();
d2.Inicializa(3,4);
d2.Exibe();
d3.soma = d1.Derivada1::x + d2.Derivada2::x; // diferença entre os programas 70 e
71
d3.Exibe();
d3.soma = d3.soma + (d1.y + d2.z);
d3.Exibe();
}
Resultado do Programa:
x=2|
y=1|
x=4|
z=3|
Soma = 6
Soma = 10
// multipla.cpp
#include <iostream>
class Base
{
public:
int i;
};
int main(void)
{
Derivada3 d3;
d3.i = 2;
d3.j = 3;
d3.k = 4;
d3.soma = d3.i + d3.j + d3.k;
d3.Exibe();
}
Resultado do Programa:
Soma = 9
// multipla.cpp
#include <iostream>
class Base
{
public:
int x;
public:
void Inicializa_Base(int tx)
{
x = tx;
}
void Exibe_Base(void)
{
cout << "x = " << x << endl;
}
int Retorna_Base(void)
{
return(x);
}
};
int main(void)
{
Derivada1 d1;
Derivada2 d2;
Derivada3 d3;
d1.Inicializa(1,2);
d1.Exibe();
d2.Inicializa(3,4);
d2.Exibe();
d3.soma = d1.x + (d1.y + d2.z); // Soma = 6
d3.Exibe();
d3.soma = d2.x + (d1.y + d2.z); // Soma = 8
d3.Exibe();
}
Resultado do Programa:
x=2
y=1
x=4
z=3
Soma = 6
Soma = 8
6. Funções Virtuais e Polimorfismo
6.1 Funções virtuais
// virtual.cpp
#include <iostream>
class Base
{
protected:
int x;
public:
Base(int tx)
{
x = tx;
}
virtual void Exibe(void)
{
cout << "x = " << x << " |" << endl;
}
};
int main(void)
{
Base base(1);
Derivada1 d1(4,2); // 2 é um valor para a variável x
Derivada2 d2(5,3); // 3 é um valor para a variável x
base.Exibe();
d1.Exibe();
d2.Exibe();
}
Resultado do Programa:
x=1|
x=2|y=4|
x=3|z=5|
// virtual.cpp
#include <iostream>
class Base
{
protected:
int x;
public:
Base(int tx)
{
x = tx;
}
virtual void Exibe(void)
{
cout << "x = " << x << " |" << endl;
}
};
int main(void)
{
Base *pt, base(1);
Derivada1 d1(4,2);
Derivada2 d2(5,3);
pt = &base;
pt->Exibe();
pt = &d1;
pt->Exibe();
pt = &d2;
pt->Exibe();
}
Resultado do Programa:
x=1|
x=2|y=4|
x=3|z=5|
// virtualpura.cpp
#include <iostream>
class Base
{
protected:
int valor;
public:
Base(int x) { valor = x; }
virtual void Exibe(void) = 0; // função virtual pura
};
int main(void)
{
Hexadecimal hexadecimal(num);
Decimal decimal(num);
Octal octal(num);
hexadecimal.Exibe();
decimal.Exibe();
octal.Exibe();
}
Resultado do Programa:
Valor em Hexadecimal = 1A
Valor em Decimal = 26
Valor em Octal = 32
// abstrata.cpp
#include <iostream>
class Base
{
protected:
double valor, celsius, fahrenheit;
public:
Base(double temperatura) { valor = temperatura; }
void Exibe(void)
{
cout << "Celsius = " << celsius << endl;
cout << "Fahrenheit = " << fahrenheit << endl << endl;
}
virtual void Converte(void) = 0;
};
int main(void)
{
Celsius_Fahrenheit celsius(40.0);
Fahrenheit_Celsius fahrenheit(104.0);
celsius.Converte();
celsius.Exibe();
fahrenheit.Converte();
fahrenheit.Exibe();
}
Resultado do Programa:
Celsius = 40
Fahrenheit = 104
Celsius = 40
Fahrenheit = 104
7. Utilização Básica do Sistema de I/O do
C++
7.1 Fluxos do C++
streambuf: Métodos para buffers de memória. Esta classe base é a de mais baixo
nível, proporcionando operações básicas de entrada e saída para as outras classes
derivadas.
C++ permite a utilização das funções printf e scanf, mas por outro
lado possui duas formas de formatar dados através das funções cin e
cout:
enum
{
skipws = 0x0001;
left = 0x0002;
right = 0x0004;
internal = 0x0008;
dec = 0x0010;
oct = 0x0020;
hex = 0x0040;
showbase = 0x0080;
showpoint = 0x0100;
uppercase = 0x0200;
showpos = 0x0400;
scientific = 0x0800;
fixed = 0x1000;
unitbuf = 0x2000;
stdio = 0x4000;
};
flags Significado
ios::skipws Ignorar espaços em branco na entrada
ios::left Alinhar à esquerda na saída
ios::right Alinhar à direita na saída
ios::internal Preencher após o sinal ou indicador de base
ios::dec Imprimir saída como decimal
ios::oct Imprimir saída como octal
ios::hex Imprimir saída como hexadecimal
ios::showbase Exibir indicador de base na saída
ios::showpoint Exibir ponto decimal (ponto flutuante)
ios::uppercase Exibir saída hex em maiúsculo
ios::showpos Exibir '+' com inteiros positivos
ios::scientific Exibir em notação científica (1.23e+00 ou 1.23E+00 se usar uppercase)
ios::fixed Utilizar a notação em ponto flutuante (123.45)
ios::unitbuf Apagar todos os fluxos após inserção
ios::stdio Apagar os fluxos stdout e stderr após inserção
Exemplo: cout.setf(ios:flag);
// setf.cpp
#include <iostream>
int main(void)
{
cout.setf(ios::uppercase);
cout.setf(ios::hex);
for (int i = 0;i <= 10000;i++)
cout << i << endl;
}
// setprecision.cpp
#include <iostream>
#include <iomanip>
// formata.cpp
#include <iostream>
#include <iomanip>
// right.cpp
#include <iostream>
#include <iomanip>
// hex.cpp
#include <iostream>
#include <iomanip>
O tratamento de exceções especifica uma ou mais soluções para uma situação de
erro quando o programa está sendo executado.
Quando é registrado uma situação de exceção (ou seja, um erro é detectado) ocorre
um desvio para um local que irá tratálo diretamente, cruzando as fronteiras de funções e do
controle do fluxo do programa.
Sintaxe:
try {
// código a ser protegido de um erro;
} catch (variável inteiro) {
// código de tratamento do erro;
}
Observação: Podem haver vários blocos catch para cada comando try.
Podem haver vários comandos throw.
Programa exemplo (104): O programa demonstra a utilização dos
comandos try, throw e catch.
// catch1.cpp
#include <iostream>
#include <limits>
int main(void)
{
float x, y, resp;
try {
cout << "Digite um valor: ";
cin >> x;
cout << "Digite outro valor: ";
cin >> y;
resp = div(x, y);
cout << "Resposta: " << resp << endl;
} catch (int i) {
if (i == 100)
cout << "Erro: Divisão por Zero" << endl;
else
cout << "Erro desconhecido" << endl;
}
}
// catch2.cpp
#include <iostream>
#include <limits>
int main(void)
{
float x, y, resp;
try {
cout << "Digite um valor: ";
cin >> x;
cout << "Digite outro valor: ";
cin >> y;
resp = div(x, y);
cout << "Resposta: " << resp << endl;
} catch (...) { // (...) catch genérico
cout << "Erro: Divisão por Zero" << endl;
}
}
9. Jogo escrito em C++
Para demonstrar a capacidade da linguagem de programação
C++, será mostrado o programa fonte de um jogo da forca escrito em
C++ utilizando a biblioteca ncurses.
// --------------------------------------------------------- includes
#include <iostream>
#include <string>
#include <curses.h>
// --------------------------------------------------------- constantes
// ----------------------------------------------- Palavras
class Janela
{
public:
Janela(void);
~Janela(void);
void clrscr(void);
void gotoxy(int c, int l);
void flushall(void);
int Random(int n);
void randomize(void);
void textcolor(int cor);
void textcolorlight(int cor);
void tempo(int c, int l);
};
// --------------------------------------------------------- Construtor
Janela :: Janela(void)
{
initscr();
keypad(stdscr, TRUE);
(void) nonl();
(void) cbreak();
(void) echo();
if (has_colors())
{
start_color();
init_pair(1,COLOR_RED,COLOR_BLACK);
init_pair(2,COLOR_GREEN,COLOR_BLACK);
init_pair(3,COLOR_YELLOW,COLOR_BLACK);
init_pair(4,COLOR_BLUE,COLOR_BLACK);
init_pair(5,COLOR_CYAN,COLOR_BLACK);
init_pair(6,COLOR_MAGENTA,COLOR_BLACK);
init_pair(7,COLOR_WHITE,COLOR_BLACK);
attrset(COLOR_PAIR(A_BOLD));
}
}
// --------------------------------------------------------- Destrutor
Janela :: ~Janela(void)
{
endwin();
system("clear");
}
// --------------------------------------------------------- tempo
time(&now);
strcpy(s,ctime(&now));
textcolor(COR_RELOGIO);
gotoxy(c,l);
printw("%s",s);
}
class Boneco
{
Janela janela;
int col, lin;
public:
Boneco(int c, int l)
{
col = c;
lin = l;
}
void Monta_Boneco(int erro)
{
switch (erro)
{
case 1: janela.gotoxy(col,lin);
printw(" O");
break;
case 2: janela.gotoxy(col,lin+1);
printw("/|");
break;
case 3: janela.gotoxy(col,lin+1);
printw("/|\\");
break;
case 4: janela.gotoxy(col,lin+2);
printw("/");
break;
case 5: janela.gotoxy(col,lin+2);
printw("/ \\");
break;
}
}
};
class Tela
{
public:
void Monta_Tela(void);
void Relogio(int *h, int *m, int *s);
};
// --------------------------------------------------------- Monta_Tela
janela.textcolor(COR_TITULO);
janela.gotoxy(33,1);
printw("Jogo da Forca",199);
janela.gotoxy(2,22);
printw("[ESC] Abandona");
refresh();
janela.textcolorlight(COR_LETRAS);
janela.gotoxy(16,20);
printw("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
janela.tempo(56,1);
}
// --------------------------------------------------------- Relogio
time(&now);
strcpy(st,ctime(&now));
int x = 0;
for (int i = 11;i <= 12;i++)
{
temp[x] = st[i];
x++;
}
temp[x] = (char) NULL;
*h = atoi(temp);
x = 0;
for (int i = 14;i <= 15;i++)
{
temp[x] = st[i];
x++;
}
temp[x] = (char) NULL;
*m = atoi(temp);
x = 0;
for (int i = 17;i <= 18;i++)
{
temp[x] = st[i];
x++;
}
temp[x] = (char) NULL;
*s = atoi(temp);
}
class Jogo
{
Janela janela;
Tela tela;
public:
void Jogar(void);
};
int main(void)
{
Jogo jogo;
jogo.Jogar();
}
// string8.cpp
#include <iostream>
#include <string>
int main(void)
{
string s; // s foi inicializada com ""
string r("UCPel"); // r foi inicializado com "UCPel"
string t("UCPel",10); // t foi inicializada com "UCPel" , total de 10 caracteres
string w = "Universidade"; // w foi inicializado com "Universidade"
string s1(r); // s1 foi inicializada com "UCPel"
string s2(r.begin(), r.end()); // s2 foi inicializada com "UCPel"
string s3(10,'x'); // s3 foi inicializada com "xxxxxxxxxx"
Resultado do Programa:
flor
flores
UCPel
UCPelUniv
Universidade
UCPel
UCPel
xxxxxxxxxx
// string9.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("Universidade");
Resultado do Programa:
12
12
1073741820
// string10.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("Universdade");
Resultado do Programa:
Universdade
Universidade
Universidades
// string11.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("Universidade");
Universidade
Universo
// string12.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("Universidade");
char st[30]; // vetor de caracteres – string C padrão
Resultado do Programa:
universidade
// string15.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("Universidade");
int i = s.find("a"); // retorna a posição da vogal 'a' (esquerda para direita)
cout << i << endl; // 9
int j = s.rfind("bcd",3); // retorna a posição da primeira destas consoantes (direita para
esquerda)
cout << j << endl; // -1
int k = s.rfind("a"); // retorna a posição da vogal 'a' (direita para esquerda)
cout << k << endl; // 9
}
Resultado do Programa:
9
-1 // fora da faixa
9
// string14.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("Universidade");
int i = s.find_first_of("a"); // retorna a posição da vogal 'a'
cout << i << endl; // 9
int j = s.find_first_of("bcd",3); // retorna a posição da primeira consoante a partir da posição 3
'd'
cout << j << endl; // 8
int k = s.find_first_not_of("a"); // exibe a posição do primeiro caracter que não é "aeio" é 'U'
cout << k << endl; // 0
}
Resultado do Programa:
9
8
0
// string15.cpp
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string s(10, 'a');
Resultado do Programa:
aaaaaaaaaa
10
aaaaaaaaaattttt
15
// string16.cpp
#include <iostream>
#include <string>
int main(void)
{
string s; // string vazia
Resultado do Programa:
// string17.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("Paulo"),r("Roberto");
cout << "s é " << s << " -> r é " << r << endl;
r.swap(s);
cout << "s é " << s << " -> r é " << r << endl;
}
Resultado do Programa:
// string18.cpp
#include <iostream>
#include <string>
int main(void)
{
string s("C++ for Linux");
string r;
Resultado do Programa:
vector: Vetores.
list: Lista duplamente encadeada.
deque: Fila de duas extremidades.
set: Conjunto de chaves sem repetição.
multiset: Conjunto de chaves com repetição.
map: Conjunto de pares [chave, objeto] sem repetições.
multimap: Conjunto de pares [chave, objeto] com repetições.
stack: Pilha.
queue: Fila.
// vector.cpp
#include <iostream>
#include <vector>
// vector2.cpp
#include <iostream>
#include <string>
#include <vector>
Resultado do Programa:
[enter] parar
Palavra: Carla
Palavra: Debora
Palavra: Ana
Palavra: Beatriz
Palavra:
Palavras Digitados:
Carla
Debora
Ana
Beatriz
Número de Palavras: 4
Palavras Ordenadas:
Ana
Beatriz
Carla
Debora
11. Tabela ASCII
ASCII: Americam Standard Code for Information Interchange.
url: http://www.asciitable.com
Função: cout << (char) 14 << (char) cod << (char) 15;
// asctable.cpp
#include <iostream>
int main(void)
{
for (int cod = 32;cod <= 255;cod++)
{
cout << "Código: " << cod << "-> Caracter: " << (char) 14 << (char) cod <<
(char) 15;
cin.get();
}
}
// --------------------------------------------------------- includes
#include <iostream>
#include <string>
#include <curses.h>
// --------------------------------------------------------- constantes
class Janela
{
public:
Janela(void);
~Janela(void);
void clrscr(void);
void gotoxy(int c, int l);
void flushall(void);
int Random(int n);
void randomize(void);
void textcolor(int cor);
void textcolorlight(int cor);
void Moldura(int ci, int li, int cf, int lf, int cor);
};
// --------------------------------------------------------- Construtor
Janela :: Janela(void)
{
initscr();
keypad(stdscr, TRUE);
(void) nonl();
(void) cbreak();
(void) echo();
if (has_colors())
{
start_color();
init_pair(1,COLOR_RED,COLOR_BLACK);
init_pair(2,COLOR_GREEN,COLOR_BLACK);
init_pair(3,COLOR_YELLOW,COLOR_BLACK);
init_pair(4,COLOR_BLUE,COLOR_BLACK);
init_pair(5,COLOR_CYAN,COLOR_BLACK);
init_pair(6,COLOR_MAGENTA,COLOR_BLACK);
init_pair(7,COLOR_WHITE,COLOR_BLACK);
attrset(COLOR_PAIR(A_BOLD));
}
}
// --------------------------------------------------------- Destrutor
Janela :: ~Janela(void)
{
endwin();
system("clear");
}
void Janela :: Moldura(int ci, int li, int cf, int lf, int cor)
{
textcolor(cor);
for (int l = li+1;l < lf;l++)
{
gotoxy(ci,l);ldur
printf("%c%c%c",14,120,15);
gotoxy(cf,l);
printf("%c%c%c",14,120,15);
refresh();
}
for (int c = ci+1;c < cf;c++)
{
gotoxy(c,li);
printf("%c%c%c",14,113,15);
gotoxy(c,lf);
printf("%c%c%c",14,113,15);
refresh();
}
gotoxy(ci,li);
printf("%c%c%c",14,108,15);
gotoxy(cf,li);
printf("%c%c%c",14,107,15);
gotoxy(cf,lf);
printf("%c%c%c",14,106,15);
gotoxy(ci,lf);
printf("%c%c%c",14,109,15);
refresh();
}
// --------------------------------------------------------- main
int main(void)
{
Janela janela;
Tela do Jogo
// TiroAlvo.cpp (Ubuntu 6.06 Dapper- Anjuta)
// Autor: Paulo Roberto Gomes Luzzardi
// Data: 11/08/2006
// --------------------------------------------------------- includes
#include <iostream>
#include <string>
#include <curses.h>
// --------------------------------------------------------- constantes
class Janela
{
public:
Janela(void);
~Janela(void);
void clrscr(void);
void gotoxy(int c, int l);
void flushall(void);
int Random(int n);
void randomize(void);
void textcolor(int cor);
void textcolorlight(int cor);
};
// --------------------------------------------------------- Construtor
Janela :: Janela(void)
{
initscr();
keypad(stdscr, TRUE);
(void) nonl();
(void) cbreak();
(void) echo();
if (has_colors())
{
start_color();
init_pair(1,COLOR_RED,COLOR_BLACK);
init_pair(2,COLOR_GREEN,COLOR_BLACK);
init_pair(3,COLOR_YELLOW,COLOR_BLACK);
init_pair(4,COLOR_BLUE,COLOR_BLACK);
init_pair(5,COLOR_CYAN,COLOR_BLACK);
init_pair(6,COLOR_MAGENTA,COLOR_BLACK);
init_pair(7,COLOR_WHITE,COLOR_BLACK);
attrset(COLOR_PAIR(A_BOLD));
}
}
// --------------------------------------------------------- Destrutor
Janela :: ~Janela(void)
{
endwin();
system("clear");
}
class Tela
{
public:
void Monta_Tela(void);
};
// --------------------------------------------------------- Monta_Tela
janela.textcolor(CYAN);
janela.gotoxy(33,1);
printw("Tiro ao Alvo",199);
janela.gotoxy(2,22);
printw("[ESC] Abandona");
refresh();
}
class Jogo
{
int c, l; // torre
int coluna, linha; // alvo
Janela janela;
public:
Jogo(int col, int lin)
{
c = col;
l = lin;
}
void Jogar(void);
void Insere_Alvo(void);
bool Testa_Alvo(void);
};
// --------------------------------------------------------- Insere_Alvo
int main(void)
{
Janela janela;
Jogo jogo(40,20);
jogo.Jogar();
}
12. Glossário
Objetos: São entidades lógicas que possuem atributos
(variáveis) e métodos (funções) que manipulam estas
propriedades.
Modo Descrição
ios :: app Insere no fim do arquivo.
ios :: ate Abre um arquivo para gravação no fim do arquivo.
ios :: in Abre um arquivo de entrada.
ios :: out Abre um arquivo de saída.
ios :: trunc Elimina o contéudo do arquivo, se ele existe.
ios :: binary Abre um arquivo binário para entrada ou saída.
// gravar.cpp
#include <iostream>
#include <fstream>
#include <string>
// ler.cpp
#include <iostream>
#include <fstream>
#include <string>
// gravar_texto.cpp
#include <iostream>
#include <fstream>
#include <string>
// ler_texto.cpp
#include <iostream>
#include <fstream>
#include <string>
// gravar_string.cpp
#include <iostream>
#include <fstream>
#include <string>
Resultado do Programa:
// ler_string.cpp
#include <iostream>
#include <fstream>
#include <string>
Resultado do Programa:
// gravar_int.cpp
#include <iostream>
#include <fstream>
#include <string>
// ler_int.cpp
#include <iostream>
#include <fstream>
#include <string>
// gravar_float.cpp
#include <iostream>
#include <fstream>
#include <string>
// ler_float.cpp
#include <iostream>
#include <fstream>
#include <string>
// gravar_struct.cpp
#include <iostream>
#include <fstream>
#include <string>
struct REG {
string nome;
int idade;
float mesada;
char sexo; // [M]asculino ou [F]eminino
} reg;
Resultado do Programa:
// lerr_struct.cpp
#include <iostream>
#include <fstream>
#include <string>
struct REG {
string nome;
int idade;
float mesada;
char sexo; // [M]asculino ou [F]eminino
} reg;
Resultado do Programa:
Nome do Arquivo: pessoas.dat
Nome: Paulo Roberto
Idade: 44
Mesada: 1234.56
Sexo: m
Nome: Adriane Maria
Idade: 37
Mesada: 2345.67
Sexo: f
Nome: Paola de Freitas Luzzardi
Idade: 7
Mesada: 12.34
Sexo: f
// gravar_objeto.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
class Data
{
int x,y;
public :
Data(int tx, int ty)
{
x = tx;
y = ty;
}
friend istream &operator >> (istream &file, Data &data);
friend ofstream &operator << (ofstream &file, Data *&data);
};
Resultado do Programa:
// carrega_objeto.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
// Calc.cpp
#include <iostream>
#include <iomanip>
#include <math.h>
#define PI 4*atan(1)
class Calculadora
{
private:
double x,y,resp;
char op;
int erro;
private:
void Add(void)
{
resp = x + y;
erro = 0;
}
void Sub(void)
{
resp = x - y;
erro = 0;
}
void Mult(void)
{
resp = x * y;
erro = 0;
}
void Div(void)
{
if (y not_eq 0)
{
resp = x / y;
erro = 0;
}
else
erro = 1; // Divisão por zero
}
void Raiz(void)
{
if (x >= 0)
{
resp = sqrt(x);
erro = 0;
}
else
erro = 2; // Raiz Negativa
}
void Pot(void)
{
resp = pow(x,y);
erro = 0;
}
void Inv(void)
{
if (x not_eq 0)
{
resp = 1 / x;
erro = 0;
}
else
erro = 1; // Divisão por zero
}
void Sen(void)
{
float rads = x * PI / 180.0; // converte de graus para radianos
resp = sin(rads);
erro = 0;
}
void Cos(void)
{
float rads = x * PI / 180.0;
resp = cos(rads);
erro = 0;
}
void Tan(void)
{
float rads = x * PI / 180.0;
if (x == 90.0 or x == 270.0)
erro = 3; // Tangente Infinita
else
{
resp = tan(rads);
erro = 0;
}
}
public:
void Entrada(void)
{
cout << "Digite um valor: ";
cin >> x;
cout << "Operação:\n[+] Adição\n[-] Subtração\n[*] Multiplicação\n[/] Divisão\n";
cout << "[R] Raiz Quadrada\n[P] Potência\n[I] Inverso\n";
cout << "[S] Seno\n[C] Cosseno\n[T] Tangente\n";
cout << "Qual a sua opção? ";
do {
op = cin.get();
} while (not strchr("+-*/RrPpIiSsCcTt",op));
if (strchr("+-*/Pp",op))
{
cout << "Digite outro valor: ";
cin >> y;
}
}
void Calcula(void)
{
switch (op)
{
case '+': Add();
break;
case '-': Sub();
break;
case '*': Mult();
break;
case '/': Div();
break;
case 'R':
case 'r': Raiz();
break;
case 'P':
case 'p': Pot();
break;
case 'I':
case 'i': Inv();
break;
case 'S':
case 's': Sen();
break;
case 'C':
case 'c': Cos();
break;
case 'T':
case 't': Tan();
break;
}
}
void Exibe(void)
{
if (not erro)
cout << "Resposta: " << setprecision(4) << resp << endl;
else
if (erro == 1)
cout << "ERRO: Divisão por Zero" << endl;
else
if (erro == 2)
cout << "ERRO: Raiz Negativa" << endl;
else
if (erro == 3)
cout << "ERRO: Tangente Infinita" << endl;
}
};
int main(void)
{
Calculadora calc;
char tecla;
do {
calc.Entrada();
calc.Calcula();
calc.Exibe();
cin.ignore(1,'\n');
cout << "Novo Cálculo [S/N]? ";
do {
tecla = cin.get();
} while (not strchr("SsNn",tecla));
} while (strchr("Ss",tecla));
}
Resultado do Programa:
Digite um valor: 45
Operação:
[+] Adição
[-] Subtração
[*] Multiplicação
[/] Divisão
[R] Raiz Quadrada
[P] Potência
[I] Inverso
[S] Seno
[C] Cosseno
[T] Tangente
Qual a sua opção? s
Resposta: 0.7071
Novo Cálculo [S/N]? s
Digite um valor: 45
Operação:
[+] Adição
[-] Subtração
[*] Multiplicação
[/] Divisão
[R] Raiz Quadrada
[P] Potência
[I] Inverso
[S] Seno
[C] Cosseno
[T] Tangente
Qual a sua opção? c
Resposta: 0.7071
Novo Cálculo [S/N]? s
Digite um valor: -16
Operação:
[+] Adição
[-] Subtração
[*] Multiplicação
[/] Divisão
[R] Raiz Quadrada
[P] Potência
[I] Inverso
[S] Seno
[C] Cosseno
[T] Tangente
Qual a sua opção? r
ERRO: Raiz Negativa
Novo Cálculo [S/N]? s
Digite um valor: 90
Operação:
[+] Adição
[-] Subtração
[*] Multiplicação
[/] Divisão
[R] Raiz Quadrada
[P] Potência
[I] Inverso
[S] Seno
[C] Cosseno
[T] Tangente
Qual a sua opção? t
ERRO: Tangente Infinita
Novo Cálculo [S/N]? s
Digite um valor: 2
Operação:
[+] Adição
[-] Subtração
[*] Multiplicação
[/] Divisão
[R] Raiz Quadrada
[P] Potência
[I] Inverso
[S] Seno
[C] Cosseno
[T] Tangente
Qual a sua opção? i
Resposta: 0.5
Novo Cálculo [S/N]? s
Digite um valor: 3
Operação:
[+] Adição
[-] Subtração
[*] Multiplicação
[/] Divisão
[R] Raiz Quadrada
[P] Potência
[I] Inverso
[S] Seno
[C] Cosseno
[T] Tangente
Qual a sua opção? p
Digite outro valor: 2
Resposta: 9
Novo Cálculo [S/N]? n
// juliano.cpp
// --------------------------- Prototypes
#include <iostream>
#include <string>
class Data
{
int dia, mes, ano;
public:
void Entrada_Data(void);
void Exibe_Data_Extenso(void);
int Calcula_Dia_Juliano(void);
void Exibe_Dia_Semana(int resto);
};
int main(void)
{
Data data;
char tecla;
Resultado do Programa:
// cpf.cpp
#include <iostream>
#include <string>
#include <cctype>
class CPF
{
char cpf[15];
int n, final;
public:
void Entrada_CPF(void);
int Valida_CPF(void);
void Exibe_CPF(void);
};
int main(void)
{
CPF cpf;
char tecla;
do {
cpf.Entrada_CPF();
if (cpf.Valida_CPF())
cout << "Status: CPF Válido" << endl;
else
cout << "Status: CPF Inválido" << endl;
cpf.Exibe_CPF();
cout << "Continua [S/n]?";
do {
tecla = cin.get();
} while (not strchr("SsNn",tecla));
cout << endl;
cin.ignore(1,'\n');
} while (strchr("Ss",tecla));
}
Resultado do Programa:
Modo de usar:
class Teste
{
int n;
public:
Teste(int tn)
{
n = tn;
}
void Exibe(void) const // método constante
{
cout << “n = “ << n << endl;
}
};
#include <iostream>
class Math
{
static int n; // ... atributo da classe, coletivo para todos os objetos
public:
static int Consulta(void)
{
return(n);
}
};
int Math :: n = 7; // inicialização do atributo da classe (tem que ser fora da classe)
int main(void)
{
int x;
// ref.cpp
#include <iostream>
int main(void)
{
int n = 7; // variável comum
int *p = &n; // ponteiro aponta para uma variável comum
int &ref_n = n; // referência para uma variável comum
int *&ref_p = p; // referência para ponteiro
Resultado do Programa:
n=7
*p = 7
ref_n = 7
ref_p = 0xbfb35cc8
ref_p = 7
// conio.cpp
#include <iostream>
#include "conio.h" // arquivo conio.h contém as funções citadas acima
#define ESC 27
int main(void)
{
int tecla;
clrscr();
do {
textcolor(BLUE);
gotoxy(10,5);
cout << "Tecla: ";
tecla = getche(); // troque por tecla = getch();
textbackcolor(CYAN);
gotoxy(10,7);
cout << "Código: " << tecla << " -> Caracter: " << tecla;
} while (tecla != ESC);
}
// conio.h
#include <termios.h>
#include <unistd.h>
#include <sys/time.h>
#define BLACK 0
#define RED 1
#define GREEN 2
#define BROWN 3
#define BLUE 4
#define MAGENTA 5
#define CYAN 6
#define DARKGRAY 7
#define SUBLINHA 8
#define black 0
#define red 1
#define green 2
#define brown 3
#define blue 4
#define magenta 5
#define cyan 6
#define darkgray 7
#define sublinha 8
void clrscr(void)
{
printf("\x1B[2J");
}
// ---------------------------- função: gotoxy
int getch(void)
{
struct termios oldt, newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return(ch);
}
int getche(void)
{
struct termios oldt, newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
putchar(ch);
return(ch);
}
int kbhit(void)
{
struct timeval tv;
fd_set read_fd;
tv.tv_sec=0;
tv.tv_usec=0;
FD_ZERO(&read_fd);
FD_SET(0,&read_fd);
if (select(1, &read_fd, NULL, NULL, &tv) == -1)
return(0);
if (FD_ISSET(0,&read_fd))
return(1);
return(0);
}
int random(int n)
{
int t = rand() % n;
return(t);
}
void randomize(void)
{
srand(time(NULL));
}
// cores.cpp
#include <iostream>
#include "conio.h"
int main(void)
{
textcolor(BLACK);
cout << "Black" << endl;
textcolor(RED);
cout <<"Red" << endl;
textcolor(GREEN);
cout << "Green" << endl;
textcolor(BROWN);
cout << "Brown" << endl;
textcolor(BLUE);
cout << "Blue" << endl;
textcolor(MAGENTA);
cout << "Magenta" << endl;
textcolor(CYAN);
cout << "Cyan" << endl;
textcolor(DARKGRAY);
cout << "DarkGray" << endl;
textcolor(SUBLINHA);
cout << "Sublinha" << endl;
textbackcolor(BLACK);
cout << " Black " << endl;
textbackcolor(RED);
cout << " Red " << endl;
textbackcolor(GREEN);
cout << " Green " << endl;
textbackcolor(BROWN);
cout << " Brown " << endl;
textbackcolor(BLUE);
cout << " Blue " << endl;
textbackcolor(MAGENTA);
cout << " Magenta " << endl;
textbackcolor(CYAN);
cout << " Cyan " << endl;
textbackcolor(DARKGRAY);
cout << " DarkGray " << endl;
getchar();
}
// quebra.cpp
#include <iostream>
#include "conio.h"
void Moldura(int ci, int li, int cf, int lf, int cor)
{
for (int c = ci+1;c < cf;c++)
{
Imprime(c,li,113,cor);
Imprime(c,lf,113,cor);
}
for (int l = li+1;l < lf;l++)
{
Imprime(ci,l,120,cor);
Imprime(cf,l,120,cor);
}
Imprime(ci,li,108,cor);
Imprime(cf,li,107,cor);
Imprime(cf,lf,106,cor);
Imprime(ci,lf,109,cor);
}
class Grade
{
private:
int ci, li, cf, lf, grade, numeros;
char vetor[3][3];
int jogadas, tecla;
private:
bool Testa_Jogada(void);
void troca(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
public:
Grade(int c, int l, int cor_grade, int cor_numeros) // construtor
{
ci = c;
li = l;
cf = ci + 12;
lf = li + 6;
grade = cor_grade;
numeros = cor_numeros;
}
void Desenha_Grade(void);
void Sorteia_Numeros(void);
void Exibe_Numeros(void);
void Jogar(int total_jogadas);
void Posiciona_Cursor(int col, int lin);
};
randomize();
for (l = 0;l <= 2;l++)
for (c = 0;c <= 2;c++)
vetor[l][c] = -1;
do {
c = random(3);
l = random(3);
if (vetor[l][c] == -1)
{
vetor[l][c] = n + 48;
n++;
}
} while (n <= 8);
}
textcolor(numeros);
for (int l = 6;l <= 10;l=l+2)
{
for (int c = 12;c <= 20;c=c+4)
{
gotoxy(c,l);
cout << " ";
gotoxy(c,l);
if (vetor[i][j] not_eq '0')
cout << vetor[i][j];
j++;
}
i++;
j = 0;
}
if (Testa_Jogada()) // testa fim do jogo
{
textcolor(BROWN);
gotoxy(12,14);
cout << "Winner";
getch();
exit(0);
}
}
jogadas = total_jogadas;
for (l = 0;l <= 2;l++) // descobrir a posição do ZERO
for (c = 0;c <= 2;c++)
if (vetor[l][c] == '0')
{
col = c;
lin = l;
break;
}
textcolor(MAGENTA);
gotoxy(9,4);
cout << "Quebra Cabeças";
textcolor(numeros);
gotoxy(11,12);
cout << "Jogadas: ";
textcolor(grade);
gotoxy(11,13);
cout << "Tecla: ";
c = col;
l = lin;
do {
textcolor(RED);
gotoxy(20,12);
cout << jogadas;
Posiciona_Cursor(col,lin);
tecla = getch();
gotoxy(18,13);
switch (tecla)
{
case UP: cout << "Up ";
if (l >= 0 and l <= 1)
{
l = lin + 1;
int temp = vetor[lin][col];
vetor[lin][col] = vetor[l][c];
vetor[l][c] = temp;
lin = l;
jogadas--;
Exibe_Numeros();
}
break;
case DOWN: cout << "Down ";
if (l >= 1 and l <= 2)
{
l = lin - 1;
int temp = vetor[lin][col];
vetor[lin][col] = vetor[l][c];
vetor[l][c] = temp;
lin = l;
jogadas--;
Exibe_Numeros();
}
break;
case LEFT: cout << "Left ";
if (c >= 0 and c <= 1)
{
c = col + 1;
int temp = vetor[lin][col];
vetor[lin][col] = vetor[l][c];
vetor[l][c] = temp;
col = c;
jogadas--;
Exibe_Numeros();
}
break;
case RIGHT: cout << "Right";
if (c >= 1 and c <= 2)
{
c = col - 1;
int temp = vetor[lin][col];
vetor[lin][col] = vetor[l][c];
vetor[l][c] = temp;
col = c;
jogadas--;
Exibe_Numeros();
}
break;
}
} while (jogadas != 0);
}
c = 12 + col * 4;
l = 6 + lin * 2;
gotoxy(c,l);
}
int main(void)
{
Grade grade(10, 5, BLUE, CYAN);
clrscr();
Moldura(1,1,32,17,GREEN);
grade.Desenha_Grade();
grade.Sorteia_Numeros();
grade.Exibe_Numeros();
grade.Jogar(99);
}
Tela do Jogo
// template1.cpp
#include <iostream>
cout << "a = 3e b = 4, maior é " << Max <int> (a, b) << endl;
cout << "x = 1.2 e y = 3.4, maior é " << Max <float> (x, y) << endl;
cout << "a = 3e b = 4, maior é " << Min <int> (a, b) << endl;
cout << "x = 1.2 e y = 3.4, maior é " << Min <float> (x, y) << endl;
}
Resultado do Programa:
a =3e b = 4, maior é 4
x = 1.2 e y = 3.4, maior é 3.4
a =3e b = 4, maior é 3
x = 1.2 e y = 3.4, maior é 1.2
// template2.cpp
#include <iostream>
Resultado do Programa:
1 2 3 4 5 6 7 8 9 10
ABCDEFGHIJKLMNOPQRSTUVWXYZ
// template3.cpp
#include <iostream>
Resultado do Programa:
Inteiro: 4
Caracter: a
Caracter: b
// template4.cpp
#include <iostream>
int main(void)
{
const int n1 = 5;
const int n2 = 4;
Vetor <int, n1> inteiro;
Vetor <char, n2> caracter;
inteiro.Gera_Vetor(n1, 1);
inteiro.Exibe_Vetor(n1);
caracter.Gera_Vetor(n2,'a');
caracter.Exibe_Vetor(n2);
}
Resultado do Programa:
12345
abcd
16. Composição
Exemplo:
class Pessoa
{
public:
Pessoa(char *n, int d, int m, int a); // construtor
private:
char *nome;
Data nascimento; // membro-objeto
};
Métodos const
Objetos const
Objetos const só podem executar métodos const, por isto, é necessário
que o objeto declarado como const tenha métodos const e construtores
que inicializem os atributos.
// composicao.cpp
#include <iostream>
class Date
{
private:
int day, month, year;
public:
Date(int dd = 1, int mm = 1, int yy = 1900);
void Print (void) const
{
cout << "Data: " << day << "/" << month << "/" << year << endl;
}
};
class Empregado
{
private:
char first[25],last[25];
const Date dataNasc, dataInic;
public:
Empregado(char *f, char *l, int d, int m, int a, int dd, int mm, int aa) :
dataNasc(d,m,a) , dataInic(dd,mm,aa)
{
int length = strlen(f);
length = (length < 25 ? length : 24);
strncpy(first,f,length);
first[length] = (char) NULL;
length = strlen(l);
length = (length < 25 ? length : 24);
strncpy(last,l,length);
last[length] = (char) NULL;
cout << "Construtor Empregado: " << first << " " << last << endl;
}
void Print(void)
{
cout << "Nome: " << first << " " << last << endl;
cout << "Data da Contratação: ";
dataInic.Print();
cout << "Data de Nascimento: ";
dataNasc.Print();
}
};
int main(void)
{
Empregado empregado("Paulo", "Roberto", 24, 7, 1949, 3, 12, 1988);
empregado.Print();
cin.get();
}