Escolar Documentos
Profissional Documentos
Cultura Documentos
Trabalho de Formatura
Apostila da Linguagem de Programao C++
Sumrio
Mdulo 1 A Linguagem C++....................................................................... 4
1.1 Histria da Linguagem C/C++.............................................................................. 4
1.2 Caractersticas da Linguagem C++....................................................................... 4
1.3 Exemplos de Aplicaes Escritas em C++ ........................................................... 5
1.4 Comparao de C++ com outras linguagens ........................................................ 5
1.5 Paradigmas de Programao: Programao Estruturada e Orientada a Objetos .. 6
Pgina 1
Pgina 2
Pgina 3
C++ desenvolvido para ser o quanto mais compatvel com C possvel, fornecendo
transies simples para cdigo C.
Pgina 4
Grande parte dos programas da Microsoft, incluindo Windows XP, Windows NT,
Windows 9x, Pacote Office, Internet Explorer, Visual Studio e outros.
A lista enorme e poderia se estender por muitas e muitas pginas. Atualmente C++ ,
juntamente com Java, a linguagem de programao comercial mais difundida no mundo.
Pgina 5
Pgina 6
Pgina 7
Mdulo 2 Compiladores
2.1 O que um Compilador
Toda linguagem de programao possui um tradutor de cdigo. Este tradutor pode
ser um compilador ou um interpretador, dependendo da linguagem. Interpretadores so
programas que lem o cdigo-fonte e executam ele diretamente, sem a criao de um
arquivo executvel. Chamamos de compilador o programa que traduz um arquivo escrito
em cdigo de linguagem de programao (arquivo-fonte) para a linguagem do
microprocessador, criando um arquivo capaz de executar as instrues pedidas (arquivo
executvel).
O primeiro passo de um compilador analisar o cdigo presente no arquivo-fonte,
verificando se existem erros de sintaxe. Caso algum erro de sintaxe seja encontrado, a
compilao interrompida para que o programador possa corrijir estes erros. Caso o
cdigo no possua erros o prximo passo do compilador criar um arquivo de cdigoobjeto, que possui as instrues do programa j traduzidas para a linguagem da mquina e
informaes sobre alocao de memria, smbolos do programa (variveis e funes) e
informaes de debug. A partir deste arquivo de cdigo-objeto, o compilador finalmente
cria um arquivo executvel com o programa compilado, que funciona independente do
compilador e realiza as instrues criadas pelo programador.
2.3 DevC++
O Dev-C++ um compilador freeware das linguagens C, C++ e C#. uma opo
muito interessante, pois de fcil utilizao e aprendizado para usurios novos e possui
muitos recursos avanados para usurios experientes. Alm de, claro, seu download ser
gratuito.
Pgina 8
2.3.1 - Instalao
A verso mais recente do DevC++ pode ser baixada atravs da pgina
http://www.bloodshed.net/dev/devcpp.html, no link Download. Utilizou-se, na
elaborao desta apostila, a verso do DevC++ beta 9.2, disponvel diretamente atravs do
link http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe. O arquivo de
instalao possui aproximadamente 9 megas. Aps o fim do download, preciso clicar
duas vezes neste arquivo para comear a instalao.
A instalao do DevC++ bem simples. Utilizaremos nesta apostila a instalao
completa, escolhendo o item full durante a etapa da instalao mostrada na figura 2.1.
Pgina 9
2.3.2 - Interface
Importante: Na primeira vez que iniciamos o Dev-C++, todos os seus menus esto
em ingls. Porm, o programa traduzido para vrias lnguas, inclusive portugus. Para
mudar os menus do programa para a nossa lngua (ou qualquer outra lngua que desejar),
basta acessar o menu Tools -> Enviroment Options. Uma janela se abrir, com vrias
opes referentes ao funcionamento do ambiente de trabalho. Na aba Interface encontrase a opo Language com as vrias linguas em que o programa est disponvel. Basta
procurar a opo portuguese (Brazil) e clicar OK, e o programa j estar traduzido para
nossa lngua.
A tela principal do programa mostrada na figura abaixo.
Pgina 10
Pgina 11
Logo abaixo dos menus, temos as barras de ferramenta com as principais funes e
comandos do programa representados por cones para acesso rpido. Basta posicionar o
mouse sobre qualquer um dos cones para saber sua funo.
Abaixo das barras de ferramentas, esto as duas principais janelas do programa. A
janela da esquerda chamada de Navegador de Classes e Projetos, e serve para acessar
rapidamente os vrios arquivos de cdigo pertencentes um projeto ou ento acessar
rapidamente as vrias classes existentes em um programa. A janela da direita nossa tela
de trabalho, onde digitamos nossos cdigos. Note que caso exista mais de um arquivo
sendo trabalhado ao mesmo tempo, podemos alternar entre eles atravs das pequenas abas
que existem diretamente acima da tela de trabalho, cada uma identificada pelo nome de seu
arquivo.
Finalmente, a janela inferior do programa possui vrias informaes sobre o
processo de compilao e debugagem de um programa. Ela particularmente til para
encontrar erros de compilao, como veremos mais adiante.
2.3.3 - Utilizao
Para iniciarmos um novo arquivo de cdigo, preciso acessar o menu Arquivo ->
Novo -> Arquivo Fonte (como mostra a figura 2.4) ou ento utilizar o atalho CTRL + N.
O novo arquivo ser criado imediatamente e poderemos comear a trabalhar nele.
Figura 2.4 Utilize o comando Arquivo Fonte para criar um novo arquivo em branco.
As funes bsicas do compilador podem ser encontradas no menu Executar, como
mostra a figura 2.5. Os comandos que utilizaremos so: Compilar (atalho: CTRL + F9),
Executar ( CTRL + F10) e Compilar & Executar ( atalho: F9). Utilizamos o comando
Compilar para compilar o arquivo cdigo do programa em que estamos trabalhando e gerar
UNESP Campus de Ilha Solteira 2007
Pgina 12
Figura 2.5 O menu Executar possui todas os comandos necessrios para compilar e
executar os programas que criaremos.
Figura 2.6 Localizao dos comandos bsicos na barra de tarefas. Coloque o mouse
sobre qualquer um dos cones para saber qual sua funo.
2.3.4 Erros
Quando compilamos um arquivo de cdigo no Dev-C++, a janela indicadora do
progresso da compilao automaticamente aberta. Caso o arquivo de cdigo no
contenha nenhum erro, a compilao terminar e a janela de progresso permanecer aberta
para indicar que tudo correu bem (verifique o quadrado da janela chamado status: ele
dever indicar Done aps o fim da compilao). Desta maneira, aps o fim da compilao
UNESP Campus de Ilha Solteira 2007
Pgina 13
Figura 2.8 A janela que indica a posio e o tipo de erros encontrados durante a
compilao do programa.
A figura acima mostra que a janela possui trs colunas: linha, unidade e mensagem.
A coluna linha indica a linha de cdigo onde o erro foi encontrado; a coluna unidade indica
o arquivo onde foi encontrado o erro e a coluna mensagem relata o tipo de erro encontrado.
Um duplo clique em qualquer uma das indicaes de erro nesta janela faz com que a linha
de cdigo onde o erro foi encontrado seja sublinhada em vermelho na janela de edio de
cdigo.
Geralmente, os erros encontrados so erros de digitao do cdigo. Quando
erramos o nome de uma varivel ou mesmo um comando, o Dev-C++ indica que o nome
errado no foi declarado anteriormente (varivel_x undeclared(first use in this
function)), pois ele age como se este nome desconhecido fosse uma varivel no
declaradada e tenta continuar a compilao.
Outro erro bastante comum a falta de ponto-e-vrgula no fim de uma linha de
comando. Neste caso, a mensagem de erro geralmente ; expected before
algum_comando, indicando que o compilador esperava o ponto-e-vrgula antes do
prximo comando ou varivel. A mensagem de erro indica a prxima linha de cdigo, mas
o ponto-e-vrgula ausente est na linha anterior. O compilador tambm indica quando
utiliza-se o ponto-e-vrgula antes da hora, ou seja, quando o compilador espera por uma
UNESP Campus de Ilha Solteira 2007
Pgina 14
Pgina 15
funo main.
Cada programa ter seus prprios comandos, logicamente. Entretanto, o
encerramento de um programa geralmente feito da mesma maneira para todos eles. As
duas ltimas linhas antes do fecha-chaves so dois comandos normalmente utilizados ao
fim de um programa.
A linha system(PAUSE > null) uma chamada de funo prpria de C++. A
funo system( ) recebe argumentos como o PAUSE que na verdade so comandos para o
sistema operacional. Neste caso, ela recebe o comando PAUSE > null para pausar a
execuo do programa at que o usurio aperte uma tecla qualquer. Utilizamos este recurso
para que a tela do programa no seja terminada automaticamente pelo sistema, impedindo
que vejamos os resultados do programa.
Finalmente, o comando return 0 a resposta da funo main para o sistema.
Quase toda funo retorna um valor para o sistema ou programa que a chamou, por
exemplo, uma funo pode retornar o resultado de uma operao matemtica executada
por ela. No caso da funo main, ela retorna um valor para o sistema operacional que
executou o programa. Esse valor interpretado pelo sistema como uma mensagem
indicando se o programa foi executado corretamente ou no. Um valor de retorno 0 indica
que o programa foi executado sem problemas; qualquer outro valor de retorno indica
problemas. Quando o programa executado at o fim, ele retorna 0 ao sistema operacional,
indicando que ele foi executado e terminado corretamente. Quando o programa encontra
algum erro ou terminado antes da hora, ele retorna um valor qualquer ao sistema,
indicando erro durante a execuo.
Pgina 16
auto
char
default
else
bool
class
delete
enum
break
const
do
explicit
case
const_cast
double
export
Pgina 17
extern
goto
mutable
protected
short
struct
true
union
Volatile
false
if
namespace
public
signed
switch
try
unsigned
wchar_t
float
inline
new
register
sizeof
template
typedef
using
while
for
int
operator
reinterpret_cast
static
this
typeid
virtual
friend
long
private
return
static_cast
throw
typename
void
Variveis reais servem para armazenar nmeros que possuem partes fracionrias.
UNESP Campus de Ilha Solteira 2007
Pgina 18
Pgina 19
Para declarar uma varivel somente obrigatrio declarar seu tipo e nome:
<tipo> <nome>;
Por exemplo:
int exemplo;
Alm disso, caso seja necessrio, podemos declarar um valor a esta varivel no
momento de sua declarao, e tambm adicionar um prefixo a ela, da seguinte forma:
<prefixo> <tipo> <nome> = <valor>;
Por exemplo:
unsigned int exemplo = 12;
Pgina 20
0x (um zero seguido de um x), seguido pelo valor em formato hexadecimal. Um valor
octal comea com um zero. Aqui esto alguns exemplos:
hex = 0xFF; /* 255 em decimal */
oct = 011; /* 9 em decimal */
Outra base numrica muito utilizada na programao a base binria. Apesar de
C++ no possuir uma forma especfica de se expressar valores de base binria, podemos
utilizar a notao hexadecimal para esta funo. A tabela abaixo mostra como pode ser
feita a converso de um valor binrio para um valor hexadecimal.
Tabela 3.3 Converso de valor binrio para hexadecimal
Dgito Hexadecimal Equivalente Binrio Dgito Hexadecimal Equivalente Binrio
0
0000
8
1000
1
0001
9
1001
2
0010
A
1010
3
0011
B
1011
4
0100
C
1100
5
0101
D
1101
6
0110
E
1110
7
0111
F
1111
Pgina 21
Usa-se um cdigo de barra invertida exatamente da mesma maneira como usa qualquer
outro caractere. Por exemplo:
ch = \t;
printf(Este um teste\n);
Esse fragmento de cdigo primeiro atribui uma tabulao a ch e, ento, imprime
este um teste na tela, seguido de uma nova linha.
3.9 Operadores
Um operador um smbolo que diz ao compilador para realizar manipulaes
matemticas e lgicas especficas. A linguagem C++ possui trs classes gerais de
operadores: aritmticos, relacionais e lgicos e bit-a-bit.
Pgina 22
Maior
maior ou igual
Menor
menor ou igual
Igual
no igual (diferente)
Ateno!
No existem os operadores relacionais: =<, => e <>.
No confunda a atribuio (=) com a comparao (==).
Pgina 23
->
var op = expr
Pgina 24
i = ++i;
i = i 1;
i = --i;
z = a; a = a + 1;
z = a++;
z = a;
z = a--;
a = a + 1; z = a;
z = ++a;
a = a - 1; z = a;
z = --a;
a = a 1;
++i;
--i;
+
!
~
&
*
sizeof
++
-*
/
/
Pgina 25
%
+
>>
<<
>
>=
<
<=
==
!=
&
|
^
&&
||
=
OP=
resto da diviso
soma
subtrao
shift right
shift left
maior que
maior ou igual a
menor que
menor ou igual a
igual a
diferente de
bitwise AND
bitwise OR
bitwise XOR
logical AND
logical OR
assinalamento
assinalamento
a = b % c;
a = b + c;
a = b c;
a = b >> n;
a = b << n;
a>b
a >= b
a<b
a <= b
a == b
a != b
a = b & c;
a = b | c;
a = b ^ c;
flag1 && flag2
flag1 || flag2
a = b;
a OP= b;
3.11 Expresses
Operadores, constantes e variveis constituem expresses. Uma expresso em C++
qualquer combinao vlida dessas partes. Uma vez que muitas expresses tendem a
seguir as regras gerais da lgebra, estas regras so freqentemente consideradas.
Entretanto, existem alguns aspectos das expresses que esto especificamente relacionadas
com a linguagem C e sero discutidas agora.
Pgina 26
Pgina 27
10
11
12
13
14
^
|
&&
||
=
E-D
E-D
E-D
E-D
D-E
*=
/=
%=
+=
-=
&=
^=
|=
<<=
>>=
15
16
:?
,
D-E
E-D
Pgina 28
Pgina 29
Pgina 30
Pgina 31
Pgina 32
Significado
Os valores so iguais
O primeiro valor maior que o segundo
O segundo valor maior que o primeiro
Como regra, deve-se tentar limitar as funes a usar somente um comando return.
medida que as funes se tornarem maiores e mais complexas, ter muitos comandos
return normalmente tornar as funes mais difceis de compreender. Na maioria dos
casos, pode-se reescrever a funo para que ela use somente um comando return
Pgina 33
Pgina 34
void valores_locais(void)
{
int a=1, b=2, c=3;
cout<<"A vale "<< a <<". B vale "<< b <<". C vale "<< c
<<".\n";
}
int main (void)
{
valores_locais();
system("PAUSE > null");
return 0;
}
Pgina 35
Pgina 36
Pgina 37
Funes matemticas:
#include <cmath>
Funes de string:
#include <cstring>
#include <cstdio>
#include <ctime>
Pgina 38
}
int main()
{
unsigned long f;
int n;
cout<<"Digite um nmero: \n";
cin >> n;
f = fatorial_recursivo(n);
cout<<"O fatorial de "<<n<<" e "<<f<<" \n";
system("PAUSE > null");
return 0;
}
Quando uma funo chama a si prpria, as novas variveis locais e os argumentos
so alocados na pilha, e o cdigo da funo executado com esses novos valores a partir
do incio. Uma chamada recursiva no faz uma nova cpia da funo. Somente os
argumentos e as variveis so novos. Quando cada chamada recursiva retorna, as antigas
variveis locais e os parmetros so removidos da pilha e a execuo recomea no ponto
de chamada da funo dentro da funo.
Tendo em vista que o local para os argumentos de funes e para as variveis locais
a pilha e que a cada nova chamada criado uma cpia destas variveis na pilha,
possvel ocorrer overflow da pilha (stack overflow) e o programa terminar com um erro.
Pgina 39
programa pular para outro ponto na memria do computador, executar a funo e depois
retornar ao ponto onde parou.
Criamos funes inline do mesmo jeito que criamos funes normais: declarando
seu prottipo e sua definio, com parmetros e retorno. S preciso adicionar o prefixo
inline antes do prottipo ou da definio da funo, como mostrado na funo abaixo:
inline int quadrado (long x)
{
x = x * x;
return x;
}
Pgina 40
if (x != 1)
parametro X
if (x == 1)
O parametro
}
int main()
{
int valor;
cout<<"Entre com um valor. Este valor ser repassado para a
funo mensagem automaticamente!\n";
cin>>valor;
mensagem(valor);
cout<<"Agora chamaremos a funo mensagem sem lhe dar um
parametro. Veja o que acontece: \n";
mensagem();
system("PAUSE > null");
return 0;
}
Pgina 41
unsigned char
signed char
char
short
unsigned short
int
unsigned int
long
unsigned long
float
Pgina 42
double
long double
Pgina 43
Pgina 44
Pgina 45
da preciso, este novo valor vale para todas as utilizaes futuras de cout.
Pgina 46
Pgina 47
6.2 A declarao if
Utilizamos a declarao if quando desejamos que o programa teste uma ou mais
condies e execute um ou outro comando de acordo com o resultado deste teste. A sintaxe
de if a seguinte:
if (condio)
{
comandos;
}
else
{
comandos;
}
A declarao if testar a condio expressa entre parnteses. Caso a condio seja
verdadeira, os comandos declarados entre as chaves sero executados.
A declarao else opcional: podemos utiliz-la para determinar um conjunto de
comandos que sero executados caso a condio testada seja falsa. Note que somente um
dos conjuntos de comandos ser executado, nunca os dois: caso a condio seja verdadeira,
o bloco pertencente a if ser executado; caso a condio falhe, o bloco pertencente a else
ser executado.
O programa abaixo ilustra de maneira simples o uso da declarao if-else, obtendo
um nmero do usurio e verificando se este valor maior ou igual a 50.
#include <iostream>
UNESP Campus de Ilha Solteira 2007
Pgina 48
Pgina 49
if (condio)
{
comandos;
}
else if (condio)
{
comandos;
}
else if (condio)
{
comandos;
}
else
{
comandos;
}
Cada bloco else if dever testar uma condio diferente. O programa testar todas
as condies na sequncia, de cima para baixo, at encontrar uma condio verdadeira.
Quando isto acontece, os comandos pertencentes ao bloco verdadeiro sero executados
enquanto todos os outros blocos do encadeamento so ignorados. Caso nenhuma condio
else if seja verdadeira, executa-se o bloco de comandos pertencente ao else final. Note
que o else opcional: Se o else final no estiver presente e todas as outras condies forem
falsas, ento nenhuma ao ser realizada.
Utilizando este encadeamento, ampliaremos o programa anterior para que ele teste
vrias condies sobre um nmero enviado pelo usurio, at encontrar uma condio
verdadeira.
#include <iostream>
using namespace std;
int main()
{
int teste;
cout<<"Digite um numero qualquer:\n";
cin>> teste;
if (teste <= 50)
{
UNESP Campus de Ilha Solteira 2007
Pgina 50
Pgina 51
Pgina 52
varivel
Pgina 53
A varivel controle comea com valor 0. O lao for testa o valor da varivel
continuamente, sempre determinando se ele menor do que 30. Sempre que o valor da
varivel for menor que 30 (condio verdadeira), a varivel de controle incrementada de
1 e os comandos entre as chaves so executados. Quando a varivel controle for maior do
que 30 (condio falsa), o lao termina e o programa volta a ser executado normalmente.
O comando for extremamente flexvel. Podemos atribuir qualquer valor que
quisermos varivel de controle, e tambm podemos increment-la (ou decrement-la da
forma que desejarmos). No exemplo abaixo, utilizamos o lao for de forma inversa ao
exemplo anterior: a varivel de controle comea em 60 e vai sendo decrementada de 2 a
cada repetio.
#include <iostream>
using namespace std;
int main()
{
int controle;
for ( controle = 60; controle >= 0; controle = controle - 2)
{
cout << "Esta frase se repetir at que a varivel
controle seja igual a 0\n";
cout<< "controle = "<<controle<<"\n";
}
system("PAUSE > null");
return 0;
}
Os trs argumentos do lao for so opcionais: podemos omitir qualquer um dos
argumentos, mas precisamos estar atentos s consequncias que isto traz ao programa. Por
exemplo, o cdigo abaixo omite o argumento de incremento da varivel de controle. No
entando, fazemos o incremento da varivel dentro do bloco de comandos do lao for:
for (x = 0; x <= 50; )
{
cout<<x;
x++;
}
Caso no fizssemos o incremento dentro do bloco de comandos, a condio
testada seria sempre verdadeira, e o lao for nunca terminaria. o chamado lao infinito:
for (x = 0; x <= 50; )
{
cout<<x;
}
Laos infinitos geralmente surgem por algum erro de programao. Quando o
programa entra em um lao infinito, pode-se pressionar Ctrl+C no modo MS-DOS para
UNESP Campus de Ilha Solteira 2007
Pgina 54
finalizar o programa.
importante saber que mesmo omitindo um argumento, necessrio incluir o
ponto-e-vrgula correspondente. Podemos omitir tambm a inicializao da varivel de
controle, caso ela tenha sido declarada e inicializada anteriormente no programa.
Tambm podemos criar um lao for nulo, sem um bloco de comandos:
for (x = 0; x == 50; x++)
{
}
Nesse caso, o programa ainda interrompido para a execuo do lao for, e no faz
nada durante este intervalo. Esta tcnica pode ser utilizada para forar uma pausa na
execuo de um programa, porm ela pouco precisa e desperdia recursos do
microprocessador.
Finalmente, podemos utilizar vrias variveis de controle para controlar um mesmo
lao for. Para isto, utilizamos vrgulas para separar as expresses relacionadas a cada
varivel dentro de um mesmo argumento. O cdigo abaixo abaixo ilustra como isto feito:
for (i=0, j=100; i <= 100; i++, j++)
{
cout << i << j;
}
A utilizao de vrias variveis dentro de um mesmo lao for particularmente til
em programas que trabalham com matrizes e vetores.
Pgina 55
varivel de controle no lao while e finalmente modificando esta varivel (incrementandoa ou decrementando-a) aps a execuo dos comandos necessrios. O programa abaixo
demonstra como inserir uma varivel de controle no lao while.
#include <iostream>
using namespace std;
int main()
{
int controle = 0;
while (controle < 20)
{
cout<<"A variavel de controle funcionar se esta frase
se repetir somente 20 vezes: ";
controle++;
cout<<controle<<" \n";
}
system("PAUSE > null");
return 0;
}
Pgina 56
Pgina 57
Pgina 58
Pgina 59
Mdulo 7 Matrizes
7.1 Matrizes
Matrizes so variveis que contm vrios valores de um mesmo tipo. Por exemplo,
podemos criar a matriz notas para armazenar as notas obtidas por 100 alunos em um
exame, ou ento utilizar uma matriz chamada gastos_mensais para anotar nossos gastos
mensais ao longo do ano. Uma matriz armazena vrios valores de um mesmo tipo:
podemos criar matrizes para armazenar qualquer um dos tipos bsicos de variveis, como
int, float e char. Cada valor armazenado separadamente em um elemento da matriz, e
pode ser acessado e modificado a qualquer momento.
Pgina 60
podemos criar uma matriz que comporte 50 valores do tipo float e atribuir apenas 5 valores
ela, deixando para atribuir o restante dos valores no decorrer do programa.
float notas[50] = { 7.65, 8.48, 4.27, 6.78, 9.10 };
A linguagem C++ faz com que toda matriz parcialmente inicializada tenha seus
valores restantes automaticamente transformados em zero. Assim, caso precisemos de uma
matriz que s contenha zeros, podemos atribuir o primeiro elemento da matriz como zero e
deixar que o compilador transforme os elementos restantes em zero, como vemos abaixo:
int zeros[75] = {0};
Pgina 61
#include <iostream>
using namespace std;
int main()
{
int sequencia[4];
for (int i = 0; i < 4; i++) {
cout << "Entre com o elemento numero "<<(i+1)<<" da
sequencia: ";
cin >> sequencia[i];
cout << endl;
}
cout << "A sequencia entrada pelo usuario foi: ";
for (int i = 0; i < 4; i++) {
cout << sequencia[i]<<" ";
}
system("PAUSE > null");
return 0;
}
Importante: como vimos no exemplo anterior, podemos utilizar variveis para
acessar os elementos de uma matriz. Da mesma forma, podemos definir constantes para
indicar o nmero de elementos de uma matriz. Essa tcnica muito til, pois caso
precisemos alterar o nmero de elementos da matriz ao invs de caarmos no cdigo todas
as referncias este nmero, tudo que precisamos fazer alterar o valor da constante.
Assim, veja o mesmo programa anterior reescrito utilizando uma definio de constante.
#include <iostream>
using namespace std;
int main()
{
const int TAMANHO = 4;
int sequencia[TAMANHO];
for (int i = 0; i < 4; i++) {
cout << "Entre com o elemento numero "<<(i+1)<<" da
sequencia: ";
cin >> sequencia[i];
cout << endl;
}
cout << "A sequencia entrada pelo usuario foi: ";
for (int i = 0; i < 4; i++) {
cout << sequencia[i]<<" ";
}
system("PAUSE > null");
return 0;
}
Pgina 62
Pgina 63
#include <iostream>
using namespace std;
int main()
{
int tritabela [2] [2] [2] = {{{ 9, 8}, {7,6}},{{5, 4},{3,
2}}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
cout << tritabela[i][j][k]<<" ";
}
cout<<endl;
}
cout<<endl;
}
system("PAUSE > null");
return 0;
}
Pgina 64
Pgina 65
int main()
{
const int TAMANHO = 4;
int sequencia[TAMANHO] = {27, 12, 42, -8};
cout <<"Sequencia original: ";
for (int i = 0; i < 4; i++) {
cout << sequencia[i]<<" ";
}
cout<<endl;
ordena(sequencia, TAMANHO);
cout <<"Sequencia ordenada: ";
for (int i = 0; i < 4; i++) {
cout << sequencia[i]<<" ";
}
cout<<endl;
system("PAUSE > null");
return 0;
}
Pgina 66
Pgina 67
Mdulo 8 Strings
No falamos at agora de matrizes de caracteres, apesar de j utiliz-las vrias
vezes. Uma matriz de caracteres normalmente chamada de string em linguagem de
programao. Em C++, existem duas maneiras de se criar e trabalhar com strings. Um
deles o mtodo antigo, j utilizado pela linguagem C, de se declarar e trabalhar com uma
matriz de caracteres do mesmo modo que trabalhamos com matrizes numricas. O outro
mtodo utilizar as facilidades da biblioteca padro de C++, que define um tipo de
varivel especfico para strings, com vrias operaes e funes prprias. Nesta apostila
trabalharemos com as strings do tipo C++, por serem elas mais simples e ao mesmo tempo
apresentarem mais recursos do que as strings tipo C.
Pgina 68
string s2 (s1);
Pgina 69
simples. Basicamente, cin e cout tratam strings como se fossem variveis simples,
facilitando sua manipulao e seu uso em programas.
J vimos no programa exemplo anterior que utilizamos cout para exibir strings
inteiras na tela. cout exibe todos os caracteres da string, e detecta automaticamente o fim
dela.
Utiliza-se o comando cin para ler strings atravs do teclado. A sintaxe a seguinte:
cin >> <nome da strin>;
Como j vimos, cin ler os caracteres inseridos atravs do teclado at encontrar um
espao em branco (tecla barra de espao) ou o fim da entrada (tecla Enter). Quando cin
encontra um espao em branco, todos os caracteres aps este espao so ignorados. O
programa abaixo l entradas do teclado para armazenar o nome e sobrenome do usurio
dentro de strings.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string nome;
string sobrenome;
cout<<"Digite seu nome: ";
cin >> nome;
cout<<"Digite seu sobrenome: ";
cin >> sobrenome;
cout << "Seu nome "<<nome<<"
<<sobrenome<<"."<<endl;
system("PAUSE > null");
return 0;
seu
sobrenome
}
Esse programa apresenta alguns problemas quando o usurio possui mais de um
nome ou sobrenome. Por exemplo, caso o nome Jos Ricardo seja inserido, a leitura do
sobrenome ser ignorada e o programa exibir Jos como o nome e Ricardo como
sobrenome. Da mesma forma, no caso da entrada de um sobrenome duplo, somente o
primeiro sobrenome guardado na string sobrenome, sendo o segundo ignorado. Isto
acontece por causa da maneira que C++ trata os espaos em branco em uma entrada via
teclado.
Espaos em branco so considerados fim de entrada pelo comando cin; ao invs de
descartar os caracteres que vierem aps o espao em branco, C++ os guarda em um buffer
(uma espcie de reserva ou pilha de dados). Quando cin for chamado novamente, antes
de ler a nova entrada do teclado, o programa primeiro utiliza os dados que esto nesse
UNESP Campus de Ilha Solteira 2007
Pgina 70
buffer. Assim, temos a impresso que a nova entrada de dados foi descartada pelo
programa, mas na verdade ela foi jogada no buffer, esperando uma nova chamada de cin.
Dessa forma, cin no o mtodo recomendado para ler frases inteiras, com palavras
separadas por espaos. Para este objetivo, utilizamos o mtodo cin.getline, que j
estudamos no mdulo 5, com algumas alteraes.
O mtodo cin.getline l linhas inteiras de entrada atravs do teclado, sem se
importar com os espaos em branco. Mas a sintaxe do mtodo cin.getline um pouco
diferente, quando trabalhamos com strings:
getline ( cin, <nome da string>);
Assim, este mtodo recebe todos os caracteres (incluindo os espaos em branco)
entrados pelo usurio, at que ele aperte a tecla Enter. O programa abaixo uma verso
melhorada do programa anterior, utilizando o mtodo cin.getline para receber os dados
desejados.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string nome;
string sobrenome;
cout<<"Digite seu nome: ";
getline(cin, nome);
cout<<"Digite seu sobrenome: ";
getline(cin, sobrenome);
cout <<"Seu nome "<<nome<<"
"<<sobrenome<<"."<<endl;
system("PAUSE > null");
return 0;
}
seu
sobrenome
s.size ( )
s [n]
Pgina 71
s1 + s2
s1 = s2
s1 == s2
A primeira funo, <string>.empty indica se uma string est vazia ou no. Esta
funo retorna um valor booleano verdadeiro ( true ou 1 ) caso a string esteja vazia, caso
contrrio ela retorna falso (false ou 0).
A funo <string>.size bastante til para trabalhar com strings entradas pelo
usurio. Como no podemos saber exatamente o nmero de caracteres entrados pelo
usurio, til ter uma funo que nos retorne o tamanho de uma string.
Como vemos acima, possvel acessar um elemento individual de uma string do
mesmo modo que fazemos com matrizes. Esse tipo de acesso til quando precisamos
manipular os vrios caracteres de uma string, como por exemplo, identificar as letras
maisculas de uma string e transform-las em minsculas. Para esse tipo de manipulao
caractere caractere, contamos com as diversas funes da biblioteca cctype, que veremos
no item 8.5.
A concatenao de strings particularmente til. Quando utilizamos o sinal de
soma entre duas strings, estamos concatenando elas, ou seja, juntando o comeo da
segunda matriz com o final da primeira. Tambm possvel concatenar strings literais (
frases entre aspas) junto com as variveis string dessa forma. O programa abaixo ilustra a
concatenao de strings.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string nome;
string sobrenome;
cout<<"Digite seu nome: ";
getline(cin, nome);
cout<<"Digite seu sobrenome: ";
getline(cin, sobrenome);
string concatena;
concatena = nome + sobrenome;
cout << "O seu nome completo : " + nome + " " +
sobrenome << endl;
system("PAUSE > null");
UNESP Campus de Ilha Solteira 2007
Pgina 72
return 0;
isalpha (x)
iscntrl (x)
isdigit (x)
isgraph (x)
islower (x)
isprint (x)
ispunct (x)
isspace (x)
isupper (x)
isxdigit (x)
tolower (x)
toupper (x)
Pgina 73
Com exceo das duas ltimas funes que transformam caracteres, todas as outras
testam os caracteres de uma string, retornando valores booleanos ( true ou false, 1 ou 0 ). O
programa abaixo mostra o uso de algumas dessas funes, atravs da leitura de uma string
entrada pelo usurio. Note que tambm feito o uso da funo <string>.size para
determinar o tamanho da string.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string frase;
int letras = 0, maiusculas = 0, minusculas = 0, numeros
= 0;
cout<<"Entre com uma frase qualquer, composta de letras
maiusculas, minusculas e numeros: "<< endl;
getline(cin, frase);
letras = frase.size();
cout<<"Sua frase tem "<< letras<< " letras."<<endl;
for (int i = 0; i < letras; i++)
{
if (isdigit(frase[i])) numeros++;
if (islower(frase[i])) minusculas++;
if (isupper(frase[i])) maiusculas++;
}
cout<<"Sua frase tem "<< numeros<< " numeros."<<endl;
cout<<"Sua
frase
tem
"<<
minusculas<<
"
letras
minusculas."<<endl;
cout<<"Sua
frase
tem
"<<
maiusculas<<
"
letras
maiusculas."<<endl;
system("PAUSE > null");
return 0;
}
Pgina 74
Mdulo 9 Ponteiros
9.1 - Endereos de Memria
J dissemos vrias vezes que as variveis ficam armazenadas em determinados
espaos na memria do computador. Ao trabalhar com uma varivel, geralmente no
precisamos nos preocupar com o endereo desta varivel, pois o compilador cuida destes
detalhes tcnicos. Entretanto, pode ser bastante til saber o endereo de uma varivel.
Em C++, utilizamos o operador de endereo & para acessar o endereo de uma varivel.
Sua sintaxe muito simples, bastando inserir o operador & na frente do nome de uma
varivel:
&<varivel>
O programa abaixo cria uma varivel inteira e utiliza cout para exibir o valor da
varivel e depois seu endereo, utilizando o operador &.
#include <iostream>
using namespace std;
int main( )
{
int valor = 124;
cout << "A variavel armazena o seguinte valor: ";
cout << valor <<endl;
cout << "A variavel esta armazenada no seguinte endereo: ";
cout << &valor <<endl;
system(PAUSE > null);
return 0;
}
O operador de endereo utilizvel tambm em matrizes. Quando utilizamos este
operador em uma matriz, temos o endereo inicial da matriz, que nada mais do que o
endereo do primeiro elemento da matriz. Tambm podemos utilizar o operador & para
acessar os endereos de cada elemento de uma matriz, como vemos no exemplo abaixo:
#include <iostream>
using namespace std;
int main( )
{
int matriz[3] = { 42, 37, 28 };
cout << &matriz[0] << " : " << matriz[0] << endl;
cout << &matriz[1] << " : " << matriz[1] << endl;
cout << &matriz[2] << " : " << matriz[2] << endl;
system(PAUSE > null);
return 0;
}
UNESP Campus de Ilha Solteira 2007
Pgina 75
9.2 Ponteiros
Em linguagem de programao, chamamos de ponteiros as variveis especiais que
armazenam endereos de memria. Como j vimos, as variveis possuem trs atributos
bsicos: seu nome, o valor armazenado por ela e o endereo de memria onde ela est
armazenada. Os ponteiros, ao invs de armazenar valores, armazenam endereos de
memria. Ao utilizar um ponteiro, podemos acessar este endereo e manipular o valor que
est armazenado l dentro.
Ponteiros so utilizados constantemente em C++. Por exemplo, quando trabalhamos
com matrizes sem saber estamos trabalhando com ponteiros: a linguagem C++ ( e a
linguagem C tambm) utiliza ponteiros para acessar as diversas posies de uma matriz.
Pgina 76
int main( )
{
int valor = 124;
int *referencia;
cout << "A variavel armazena o seguinte valor: ";
cout << valor <<endl;
cout << "A variavel esta armazenada no seguinte endereo: ";
referencia = &valor;
cout << referencia <<endl;
system(PAUSE > null);
return 0;
}
Pgina 77
Pgina 78
Pgina 79
trabalhamos com variveis simples. Porm, este cenrio muda quando trabalhamos com
matrizes: a utilizao da chamada por referncia a melhor forma de se criar funes que
trabalham com matrizes.
Pgina 80
#include <iostream>
using namespace std;
int main()
{
int tabela[5] = { 20, 34, 58, 70, 125 };
int *ponteiro = tabela;
cout << *ponteiro << endl;
ponteiro++;
cout << *ponteiro << endl;
for (int i = 2; i < 5; i++){
ponteiro++;
cout << *ponteiro << endl;
}
system("PAUSE > null");
return 0;
}
O programa abaixo ilustra a criao de duas funes que utilizam matrizes. As duas
funes fazem a mesma coisa (organizar uma matriz em ordem crescente), mas a primeira
funo trata a matriz como um ponteiro, enquanto que a segunda trabalha com a matriz do
modo j conhecido. Os dois mtodos so vlidos e tem sua utilidade, mas de modo geral
mais simples e recomendvel utilizar matrizes do modo j estudado.
#include <iostream>
using namespace std;
int ordenamatriz( int matriz[], int tamanho) {
int temp = 0;
for (int i = 0; i < tamanho; i++){
for (int j = i; j < tamanho; j++){
if (matriz[j] < matriz [i]) {
temp = matriz[i];
matriz[i] = matriz[j];
matriz[j] = temp;
}
}
}
}
int ordenaponteiro (int *matriz, int tamanho)
{
int temp = 0;
for (int i =0; i < tamanho; i++) {
for (int j = i; j < tamanho; j++){
if ( *(matriz + j) < *(matriz + i ) ) {
temp = *( matriz + i );
UNESP Campus de Ilha Solteira 2007
Pgina 81
int main()
{
const int TAMANHO = 4;
int sequencia[TAMANHO] = {27, 12, 42, -8};
int sequencia2[TAMANHO] = {21, -27, 1024, 42};
cout<<endl;
ordenamatriz(sequencia, TAMANHO);
ordenaponteiro(sequencia2, TAMANHO);
cout <<"Sequencia ordenada 1: ";
for (int i = 0; i < 4; i++) {
cout << sequencia[i]<<" ";
}
cout<<endl;
cout <<"Sequencia ordenada 2: ";
for (int i = 0; i < 4; i++) {
cout << sequencia2[i]<<" ";
}
cout<<endl;
system("PAUSE > null");
return 0;
}
Pgina 82
Pgina 83
cout << "De forma direta (pela propria variavel): "<< inteiro
<< endl;
cout << "De forma indireta (pelo ponteiro
pontinteiro): "<< *pontinteiro << endl;
para
variavel
Pgina 84
para o sistema.
Apesar da vantagem da economia de memria apresentada pelos operadores new e
delete, preciso saber aonde utiliz-los. Eles so especialmente teis para matrizes cujo
tamanho exato no conhecemos, ocasionando grande economia de memria. Entretanto,
para variveis que sero utilizadas o tempo todo pelo programa, a economia de memria
obtida no to grande, e a alocao/liberao constante de memria pode deixar o
programa at mais lento. Assim, recomenda-se a utilizao da declarao normal de
variveis na maioria dos programas que criamos.
Pgina 85
Pgina 86
Pgina 87
int main(){
string frase;
cout<<"Escreva uma frase para ser escrita no arquivo
string.txt:";
getline(cin, frase);
cout<<"Obrigado. Escrevendo dados no arquivo
strings.txt...\n";
ofstream escreve;
escreve.open("strings.txt");
escreve << "Utilizamos os objetos ofstream para escrever em
arquivos\n";
escreve<< "Note que podemos utilizar os caracteres \\n pra
quebrar a linha, como fazamos em cout\n";
int numero = 100;
escreve<<"Podemos escrever o valor de variaveis numericas: "
<<numero <<"\n";
int matriz[3] = {42, 19, 99};
escreve<<"Podemos tambm escrever matrizes!";
for (int i=0; i < 3; i++){
escreve.width(6);
escreve<<matriz[i]<<" ";
}
escreve<<"\n";
escreve<<"Finalmente, podemos receber dados via cin e
escrever estes dados no arquivo!\n";
escreve<<"A frase que voc digitou durante a execuo do
programa: "<<frase<<"\n";
escreve.close();
cout<<"Dados escritos no arquivo. Fim do Programa!";
system("PAUSE");
return 0;
}
Procure o arquivo strings.txt em seu sistema, e abra ele (ele provavelmente est no
mesmo diretrio onde est o arquivo executvel do programa que compilamos. Por
definio, estes arquivos ficam no diretrio onde est o compilador, a menos que tenhamos
configurado o compilador para salv-los em outro lugar.). Percebeu a semelhana entre a
utilizao do objeto ofstream com o comando cout? Todos os mtodos que vimos com cout
para exibir um dado na tela podem ser utilizado para gravar um dado em um arquivo.
Pgina 88
O cdigo abaixo pode ser utilizado em qualquer programa que utilize leitura e
escrita de arquivos (basta, logicamente, substituir os nomes do objeto e do arquivo) para
checar o estado do objeto. Caso um erro seja encontrado, o programa indica que o arquivo
no pode ser aberto e a execuo terminada. Caso contrrio, o programa continua sua
execuo normalmente.
if(!leitura.is_open( ))
{
cout<<No foi possvel abrir arquivo! Programa ser terminado!\n;
leitura.clear( ); //reseta o objeto leitura, para limpar memria do sistema
return 0;
}
Pgina 89
para o programa). Assim, podemos utilizar qualquer um dos mtodos de leitura que
estudamos para cin, seja para ler caracteres, palavras ou frases inteiras.
Para lermos somente um caractere de um arquivo, por exemplo, nossa melhor
opo utilizar o mtodo .get, que serve justamente para esta funo. Criamos uma
varivel do tipo char para armazenar este caractere, e utilizamos o objeto ifstream da forma
mostrada no exemplo abaixo:
char armazena;
leitura.get( armazena);
O exemplo de cdigo acima utiliza o objeto leitura e o mtodo .get para ler um
caractere de um arquivo, e armazena este caractere na varivel armazena. Poderamos
criar um lao de repetio para obter todos os caracteres do arquivo, como vemos no
exemplo abaixo. O lao while continuar a executar o mtodo .get para ler o arquivo, at
que seja encontrado o fim do arquivo. Quando o fim do arquivo encontrado, o comando
leitura.get(armazena) retorna falso para o lao while, terminando a repetio. Lembrese que o arquivo strings.txt deve estar no mesmo diretrio onde estamos executando o
programa, caso contrrio erros ocorrero!
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
char letra;
ifstream leitura;
leitura.open("strings.txt");
if(!leitura.is_open( ))
{
cout<<"No foi possvel abrir arquivo! Programa ser
terminado!\n";
leitura.clear( ); //reseta o objeto leitura, para limpar
memria do sistema}
}
while (leitura.get(letra)) {cout << letra;}
leitura.close();
system("PAUSE");
return 0;
}
Para lermos uma palavra inteira de um arquivo, ao invs de utilizarmos uma
simples varivel de tipo char, utilizamos uma matriz do tipo char. Da mesma maneira que
o comando cin, o objeto ler todos os caracteres em seu caminho, at que a matriz atinja
seu tamanho mximo especificado OU encontre um espao em branco, uma quebra de
linha ou o fim do arquivo.
UNESP Campus de Ilha Solteira 2007
Pgina 90
char matriz_chars[80];
leitura >> matriz_chars;
Finalmente, para lermos uma linha inteira de um arquivo, utilizamos o mtodo
.getline, que j havamos estudado no mdulo 5. O mtodo getline l uma linha inteira de
entrada, at que o tamanho mximo especificado seja atinjido ou at encontrar uma quebra
de linha ou o fim de arquivo. Relembrando sua sintaxe:
<nome do objeto>.getline ( <matriz_destino>, <limite de caracteres>);
Por exemplo
char matriz_chars[80];
leitura.getline( matriz_chars, 80);
O comando acima leria todos os caracteres de uma linha, at encontrar a quebra da
linha. Como vimos com o mtodo .get, podemos utilizar um lao de repetio para lermos
todas as linhas de um arquivo utilizando o mtodo getline. No exemplo abaixo, cada
repetio uma linha do arquivo ser escrita na tela.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
char depot[300];
ifstream leitura;
leitura.open("strings.txt");
if(!leitura.is_open( ))
{
cout<<"No
foi possvel
abrir
arquivo!
Programa
ser
terminado!\n";
leitura.clear( ); //reseta o objeto leitura, para limpar
memria do sistema}
}
while (leitura.getline(depot, 300)) {cout << depot <<"\n";}
leitura.close();
system("PAUSE");
return 0;
}
Uma pequena diferena que vemos entre esses dois mtodos de ler um arquivo
inteiro, que o mtodo .get l todos os caracteres at o fim de arquivo, incluindo quebras
de linha. O mtodo getline utiliza as quebras de linha para determinar o fim de sua leitura,
e descarta elas. Assim, no exemplo logo acima, tivemos que instruir o programa
UNESP Campus de Ilha Solteira 2007
Pgina 91
adicionar uma quebra de linha aps exibir na tela cada uma das linhas lidas. (Entretanto,
lembre-se que para arquivos grandes, o mtodo getline mais eficiente e mais rpido.
Tenha em mente que cada acesso de um objeto fstream um arquivo demanda um certo
processamento: em um arquivo grande, se temos centenas de linhas, ento temos milhares
de caracteres, o que significa que o mtodo get acessar muito mais vezes o mesmo
arquivo do que o mtodo getline).
Note que um arquivo aberto por um objeto ofstream no necessita que definamos o
modo de arquivo ofstream::out, pois este modo j definido para este tipo de objeto por
definio. O mesmo ocorre com o modo ifstream::in e os objetos ifstream.
Alm disso, por definio, um arquivo aberto por um objeto ofstream ir truncar os
dados j existentes no arquivo, escrevendo os dados novos por cima dos antigos. Porm,
o modo ofstream::app nos permite anexar dados ao final de um arquivo. O exemplo abaixo
utliza o modo ofstream::app para criar uma espcie de agenda simplificada em um
arquivo de texto.
Pgina 92
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
int dia, mes;
char letra[1000];
cout<<"PROGRAMA AGENDA Verso 0.00042\n";
ofstream agenda;
agenda.open("agenda.txt", ofstream::app);
cout<<"Digite o compromisso no espao abaixo (): \n";
cin.getline(letra, 1000);
cout << "Digite o dia do compromisso:\n";
cin >> dia;
cout << "Digite o ms do compromisso:\n";
cin >> mes;
agenda << "Compromisso marcado para dia "<<dia<<" de
"<<mes<<": ";
agenda << letra;
agenda<<"\n";
cout<<"Obrigado! Sua agenda foi atualizada com sucesso!";
agenda.close();
system("PAUSE");
return 0;
}
Pgina 93
Pgina 94
Pgina 95
caractersticas diferentes. Por exemplo, criamos os objetos relgio de pulso e relgiocuco. Os dois so relgios, mas podemos ajust-los em horrios diferentes, com alarmes
diferentes. Cada objeto possui todos os membros pblicos e privados que definimos na
declarao da classe. Assim, utilizamos os membros pblicos para interajir com os objetos,
enquanto que os membros privados so as engrenagens do objeto. Aqui temos um novo
nome para os membros pblicos: chamamos eles de mtodos do objeto. Um mtodo
nada mais do que uma funo que interaja com o objeto, ou seja, so prprios os
membros pblicos que definimos na declarao da classe.
Para termos um exemplo mais concreto, podemos pensar em um programa qualquer
do ambiente Windows. Nas ferramentas de programao Windows, temos vrias classes
que representam os vrios itens que vemos na tela: janelas, menus, cursores, cones.
Quando um programador precisa criar uma janela, ele no precisa ter todo o trabalho para
programar uma janela do zero: ele cria um novo objeto da classe Janela, e define suas
caractersticas atravs das funes pblicas (ou mtodos) da classe. Ele no precisa saber
como a janela desenhada na tela: basta saber quais mtodos definem as caractersticas
que ele necessita para que seu objeto funcione da maneira desejada.
Pgina 96
Pgina 97
Referncias Bibliogrficas
[1] TORRES, Jair Gustavo M. Curso de Linguagem C Ilha Solteira: Faculdade de
Engenharia de Ilha Solteira FEIS UNESP Departamento de Engenharia Eltrica,
2006.
[2] PRATA, Stephen C++ Primer Plus, 4 edio Nova York: Sams Publishing. 2001.
[3] STROUSTRUP , Bjarne - The C++ Programming Language, 3 edio New Jersey:
Addison Wesley. 1997.
[4] LIPPMAN, Stanley B.; LAJOIE, Jose Lajoie; MOO, Barbara E. C++ Primer, 4
edio New Jersey: Addison-Wesley. 2005.
Pgina 98