Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila C++ PDF
Apostila C++ PDF
Trabalho de Formatura
Vantagens
Possibilidade em programao de alto e baixo nvel.
Alta flexibilidade, portabilidade e consistncia.
Compatilidade com C, resultando em vasta base de cdigos.
Adequado para grandes projetos.
Ampla disponibilidade e suporte, devido principalmente grande base de
desenvolvedores.
No est sob o domnio de uma empresa (em contraste do Java - Sun ou Visual Basic
Microsoft).
Padronizao pela ISO.
Grandes possibilidades para a metaprogramao e programao genrica.
Desvantagens
2.3 DevC++
Aps isto, a instalao ser concluda com sucesso. Para acessar o programa, basta
encontrar o atalho ao programa no menu iniciar sob o nome Bloodsheed Dev-C++ e
clicar para execut-lo.
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 encontra-
se 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.
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.
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.
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
Caso nosso arquivo de cdigo contenha uma ou mais linhas de cdigos com erro, a
compilao interrompida para que estes erros (ou advertncias) sejam verificados pelo
programador. A janela de progresso da compilao fechada, e a janela inferior do
programa maximizada mostrando todos os erros que foram encontrados durante a
compilao do programa.
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
#include <iostream>
using namespace std;
int main()
{
//comandos do programa
int main ( )
Variveis reais servem para armazenar nmeros que possuem partes fracionrias.
0.00098
1.2145
3.1461
8.0
Assim como os inteiros, os nmeros reais em C++ podem ser representados por 3
tipos de variveis com diferentes intervalos. So elas: float, double e long double. Float
o tipo de varivel real natural, aquela com a qual o sistema trabalha com maior
naturalidade. Double e long double so teis quando queremos trabalhar com intervalos
de nmeros reais realmente grandes. Utilizamos nmeros reais geralmente para expressar
preciso atravs do nmero de casas decimais, ento podemos dizer que uma varivel float
menos precisa que uma varivel double, assim como uma varivel double menos
precisa que long double. A tabela abaixo mostra os tipos de variveis reais, seu tamanho
em bits e o intervalo de armazenagem.
As variveis devem ser declaradas, ou seja, devem ser definidos nome, tipo e
algumas vezes seu valor inicial. As variveis so classificadas em variveis locais e
globais.
Variveis globais so aquelas declaradas fora do escopo das funes.
Variveis locais so aquelas declaradas no incio de um bloco e seus escopos esto
restritos aos blocos em que foram declaradas. A declarao de variveis locais deve
obrigatoriamente ser a primeira parte de um bloco, ou seja, deve vir logo aps um caractere
de abre chaves, '{'; e no deve ser intercalada com instrues ou comandos.
UNESP Campus de Ilha Solteira 2007 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;
Outro tipo de valor suportado pela Linguagem C++ o tipo string. Uma string
um conjunto de caracteres entre aspas. Por exemplo, voc um vencedor uma string,
composta pelas vrias letras que formam a frase. No confunda strings com caractere. Uma
constante caractere simples fica entre dois apstrofos, por exemplo a. Entretanto a
uma string que contm somente uma letra.
ch = \t;
printf(Este um teste\n);
3.9 Operadores
a = 10;
b = c * valor + getval(x);
a = b = c = 1;
> Maior
>= maior ou igual
< Menor
<= menor ou igual
== Igual
!= no igual (diferente)
Ateno!
Exemplo de aplicao:
i+= 2; /* equivalente a: i = i + 2 */
j-= 3; /* equivalente a: j = j 3 */
i = i 1; i = --i; --i;
z = a; a = a + 1; z = a++;
z = a; a = a 1; z = a--;
a = a + 1; z = a; z = ++a;
a = a - 1; z = a; z = --a;
x = &var;
var = *x;
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.
Quando atribumos um certo valor para uma varivel cujo tamanho maior do que
o valor atribudo, no h problemas. Porm, quando o tamanho da varivel menor do que
o valor a ser atribudo ela, haver truncamento deste valor e consequente perda de
informao e/ou preciso.
Por isso, preciso tomar cuidado com os tipos e tamanhos de variveis envolvidos
durante uma atribuio de valores, para termos certeza que o valor inserido pode ser
armazenado por aquela varivel.
1. Se algum dos operandos for do tipo long double, o outro operando convertido
para long double tambm.
2. Seno, se algum dos operando for double, o outro operando sera convertido para
double.
3. Seno, se algum dos operandos for float, o outro operando ser convertido para
float.
4. Seno, os operandos so inteiros e promoes inteiras sero feitas.
5. Nesse caso, se algum dos operandos for do tipo unsigned long, o outro operando
sera convertido para unsigned long.
6. Seno, caso um dos operandos seja long int e o outro seja um unsigned int, a
converso depender do tamanho relative entre os dois tipos. Se long conseguir
expressar valores possveis de unsigned int, a varivel unsigne int ser convertida
para long.
7. Seno, ambos os operadores so convertidos para unsigned long.
8. Seno, se algum dos operadores for long, o outro ser convertido para long.
9. Seno, se algum dos operadores for um unsigned int, o outro ser convertido para
unsigned int.
10. Caso o compilador chegue a este ponto na lista, ambos operadores sero int.
e
tipo (varivel_ou_expresso); por exemplo:
int (modelos); int (19.99);
4.1 Funes
A funo acima calcula o cubo de um valor inteiro. Note que podemos declarar
variveis dentro de uma funo; entretanto, estas variveis s podero ser utilizadas dentro
desta mesma funo. O comando return termina a funo e retorna um valor para o
programa.
Note que a funo main do tipo int, e retorna 0. Entretanto, no existe outra
funo acima de main que a tenha chamado, para que ela possa retornar um valor de
resposta. Para que serve este retorno ento? Simples: consideramos que a funo
chamadora de main o prprio sistema operacional. Assim, utilizamos o retorno para
indicar o funcionamento do programa. Caso o programa termine e retorne o valor 0 para o
sistema operacional, sabemos que tudo correu bem e que o programa terminou
normalmente. Um valor retornado diferente de 0 indica que o programa no rodou at o
final (ou seja, at o ponto return 0;) e que aconteceu algum erro. Muitos sistemas
operacionais e programas utilizam esse sistema simples para detectar erros durante a
execuo de seus aplicativos.
medida que as funes vo se tornando mais teis nos programas, muitas delas
requerem que as variveis gerem resultados valiosos. Para usar uma varivel dentro de uma
funo, precisa-se primeiro declarar a varivel, exatamente como feito na funo principal
main. Quando se declara variveis dentro de uma funo, os nomes usados para essas
variveis so exclusivos para a funo.
Portanto, se o programa usa dez funes diferentes e cada funo usa uma varivel
chamada contador, o compilador considerar a varivel de cada funo como distinta. Se
uma funo requer muitas variveis, elas devero ser declaradas no incio da funo,
exatamente como se faria dentro de main.
#include <iostream>
using namespace std;
void valores_locais(void);
void valores_locais(void)
{
int a=1, b=2, c=3;
}
int main (void)
{
cout<<A vale << a <<. B vale << b <<. C vale << c
<<.\n;
system("PAUSE > null");
return 0;
}
void valores_locais(void);
#include <iostream>
using namespace std;
int a = 1, b = 2, c = 3; // Variaveis globais
void valores_globais(void)
{
cout<<"A vale "<< a <<". B vale "<< b <<". C vale "<< c
<<".\n";
}
int main(void)
{
valores_globais();
cout<<"A vale "<< a <<". B vale "<< b <<". C vale "<< c
<<".\n";
system("PAUSE > null");
return 0;
}
#include <iostream>
using namespace std;
Como pode ser visto, as alteraes que a funo faz nas variveis somente so
visveis dentro da prpria funo. Quando a funo termina, as variveis dentro de main
esto inalteradas.
A diferena entre chamada por valor e chamada por referncia que, usando a
chamada por valor, as funes recebem uma cpia do valor de um parmetro. Por outro
lado, com a chamada por referncia, as funes recebem o endereo de memria da
varivel. Portanto, as funes podem alterar o valor armazenado na posio de memria
especfica (em outras palavras, o valor da varivel); alteraes essas que permanecem aps
a funo terminar.
Para usar a chamada por referncia, seu programa precisar usar ponteiros. Por ora
tudo o que precisamos saber que um ponteiro armazena um endereo de memria, assim
como uma varivel armazena um valor. O mdulo 8 dedicado totalmente explicao de
ponteiros e suas aplicaes em C++, incluindo o funcionamento de uma chamada de
funo por referncia.
A linguagem C++ possui uma biblioteca padro com muitas funes teis
previamente implementadas para uso do programador, inclusive incluindo todas as funes
da biblioteca padro de C. A biblioteca padro se divide em vrias bibliotecas ou arquivos
menores, divididos pelos tipos de funo que cada um contm. Por exemplo, a biblioteca
cmath contm as funes matemticas padro da linguagem C e a biblioteca string
contm funes da biblioteca padro de C++ que tratam de strings. Para utilizar uma destas
bibliotecas, preciso avisar ao compilador atravs da diretiva
#include <nome_da_biblioteca>
Para uma linguagem ser recursiva, uma funo deve estar apta a chamar a si
prpria. O exemplo clssico de recursividade mostrado na funo fatorial_recursivo(),
que calcula o fatorial de um nmero inteiro. O fatorial de um nmero N o produto de
todos os nmeros inteiros entre 1 e N. Por exemplo, o fatorial de 3 1 x 2 x 3, ou 6.
#include <iostream>
#include <cstdio>
using namespace std;
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.
mensagem( );
#include <iostream>
#include <cstdio>
using namespace std;
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;
}
Utilizamos cout em conjunto com o operador de insero <<. Note que smbolo <<
tambm utilizado pelo operador de bitwise shift para a esquerda (move bits de uma
varivel para a direo esquerda), entretanto no precisamos nos preocupar com isto: C++
sabe diferenciar quando estamos utilizando um operador ou o outro, atravs do contexto.
O operador << indica ao comando cout que um dado deve ser exibido na tela, alm
de identificar automaticamente qual o tipo deste dado e como ele deve ser formatado para
exibio na tela. Assim, no precisamos informar cout que estamos enviando um inteiro,
um real ou uma string, como fazamos em C: o operador << se encarrega desta
identificao, bastando para o operador indicar o nome da varivel. Abaixo temos a lista de
todos os tipos bsicos de C++ reconhecidos pelo operador de insero:
unsigned char
signed char
char
short
unsigned short
int
unsigned int
long
unsigned long
float
Estas 3 utilizaes de cout exibem as strings de texto na tela. Veremos mais adiante
que toda string possui um caractere de trmino, \0, que indica para o compilador que a
string terminou. Nestes trs casos, o operador de insero orienta-se por este \0 para
terminar a exibio das strings.
Aps utilizar qualquer um destes comandos, sempre que pedirmos para cout exibir
um nmero inteiro na tela, o comando automaticamente converter o nmero para a base
definida previamente. Por exemplo:
Dessa forma, cout exibir na tela no o nmero 10 como estamos acostumados, mas
a letra a, que representa 10 na base hexadecimal. Note que podemos utilizar o operador de
insero duas vezes para deixar o cdigo mais compacto e obter o mesmo resultado:
No se esquea de retornar para a base decimal com cout << dec; aps exibir
valores na base hexadecimal ou octal!
Instrumos o programa a exibir valores reais usando a notao de ponto fixo ( por
exemplo, 3.1214). Da mesma forma, com o comando:
cout.width ( x );;
Onde substitumos x pelo nmero mnino de caracteres a ser exibido na tela. Aps a
utilizao deste mtodo, utilizamos o comando cout para exibir o valor desejado, como no
exemplo abaixo:
Neste exemplo, foi especificado cout.width (5); e o valor a ser exibido 10.
Assim, cout predecer o valor 10 com trs espaos em branco.
cout.fill ( caractere);
Onde substitumos caractere pelo caractere que ser exibido. necessrio utilizar
aspas entre o caractere, para indicar para o compilador que no se trata de uma varivel.
00000010
cout.precision ( valor );
Por default, C++ utiliza 6 casas decimais aps a vrgula. Quando alteramos o valor
UNESP Campus de Ilha Solteira 2007 Pgina 45
da preciso, este novo valor vale para todas as utilizaes futuras de cout.
Assim como cout, cin utiliza um operador (nesse caso, o operador de extrao >> )
para identificar o tipo de varivel onde o valor ser armazenado e encontrar o endereo de
memria correto. Ao contrrio da funo scanf, utilizada na linguagem C, no preciso
especificar qual o tipo de valor ser enviado pelo teclado pois o operador de extrao faz as
converses necessrias. Podemos utilizar cin para ler valores inteiros, reais e strings de
caracteres.
Na maioria dos casos, o comando cin cobre nossas necessidades de entrada de
dados via teclado. Entretanto, quando precisamos ler strings com mais de uma palavra,
como por exemplo frases ou nomes, cin apresenta certos problemas. 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
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.
Para solucionar este problema, utilizamos o mtdo de cin cin.getline.
O mtodo cin.getline muito til para receber strings de caracteres com espaos,
como frases. Este mtodo l uma linha inteira, marcando o fim da entrada de dados pelo
uso da tecla <ENTER> indicando a entrada de uma nova linha. Abaixo temos a sintaxe do
mtodo:
char matriz[60];
cin.getline ( matriz, 50 );
cout >> matriz;
6.2 A declarao if
if (condio)
{
comandos;
}
else
{
comandos;
}
#include <iostream>
int main()
{
int teste;
cout<<"Digite um numero qualquer:\n";
cin>> teste;
if (teste > 50)
{
cout<<"O numero que voce digitou maior que 50";
}
else
{
cout<<"O numero que voce digitou menor que
50";
}
system("PAUSE > null");
return 0;
}
possvel tambm aninhar ifs, ou seja, fazer uma declarao if dentro de outra
declarao if anterior. Este um mtodo muito til em programao, mas preciso tomar
cuidado ao utiliz-lo para saber qual bloco else pertence qual if. Em C++, o else ligado
ao if mais prximo dentro do mesmo bloco de cdigo que j no tenha uma declarao else
associada a ele. Para se certificar de que estamos aninhando os ifs e elses corretamente,
utilizamos chaves para delimitar os diferentes blocos, como pode ser visto no cdigo
abaixo:
if ( x > 10)
{
if ( x == 17)
{
cout<< x maior que 10 e igual a 17;
}
else
{
cout<< x maior que 10 mas no igual a 17;
}
}
else
{
cout << x menor do que 10;
}
Note que a segunda declarao if est totalmente contida pelas chaves da primeira
declarao if. Utilizou-se chaves em todas os blocos de comando, para melhor separar as
condies dos blocos de comandos. Alm disso, note o uso da tabulao para separar
visualmente os diferentes blocos e declaraes: poderamos escrever todo o cdigo sem
usar tabulao, alinhando todas as linhas esquerda, mas isto dificultaria a identificao
das diferentes declaraes.
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
cout<<"O nmero que voc digitou menor que 50\n";
}
else if (teste > 50 && teste <= 100)
{
cout<<"O nmero digitado maior que 50 e menor ou
igual a 100\n";
}
else if (teste > 100 && teste <= 200)
{
cout<<"O nmero digitado maior que 100 e menor ou
igual a 200\n";
}
else
{
cout<<"O numero digitado maior que 200\n";
}
system("PAUSE > null");
return 0;
}
switch ( varivel )
{
case valor1:
comandos;
break;
case valor2:
comandos;
break;
...
case valorx;
comandos;
break;
default:
comandos;
}
A declarao switch testa o valor de uma nica varivel. Note que existem vrios
#include <iostream>
using namespace std;
int main()
{
int option;
cout<<"Digite a opo desejada:\n";
cout<<"1. Opo 1\n";
cout<<"2. Opo 2\n";
cout<<"3. Opo 3\n";
option = 0;
cin>> option;
switch(option)
{
case 1:
cout<<"Voc escolheu a primeira opo\n";
break;
case 2:
cout<<"Voc escolheu a segunda opo\n";
break;
case 3:
cout<<"Voc escolheu a terceira opo\n";
break;
default:
cout<<"Voc escolheu uma opo invlida!\n";
}
system("PAUSE > null");
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int controle;
for ( controle = 0; controle <= 30; controle++)
{
cout << "Esta frase se repetir at que a varivel
controle seja maior do que 30\n";
cout<< "controle = "<<controle<<"\n";
}
system("PAUSE > null");
return 0;
}
#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;
}
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.
Uma outra forma de lao a declarao while. Seu funcionamento muito parecido
com a declarao for que estudamos anteriormente. Ao encontrar um lao while, o
programa testa a condio especificada. Se a condio for verdadeira, efetuar os
comandos contidos no lao. Quando a condio se torna falsa, o lao termina e o programa
passa para o prximo comando. A sintaxe da declarao while a seguinte:
while (condio)
{
comandos;
}
#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;
}
do
{
comandos;
}
while ( condio);
#include <iostream>
using namespace std;
int main()
{
int controle = 1;
do {
Qualquer um dos laos estudados acima pode ser aninhados, ou seja, colocados um
dentro do outro. Esta tcnica pode ser muito til para trabalhar com matrizes
multidimensionais, programas que trabalhem com menus e vrias outras situaes.
Entretanto, preciso ateno para no confundir quais blocos fazem parte de qual lao ou
declarao. Como j dissemos anteriormente, fundamental a utilizao de chaves para
separar corretamente os blocos e laos, e tambm a utilizao de tabulao na escrita do
cdigo para melhor visualizao de cada uma das partes do programa. Tambm
interessante a utilizao de comentrios no cdigo, para melhor identificao.
O programa exemplo abaixo demonstra a utilizao de vrios laos e declaraes
aninhadas, assim como a aplicao de tabulao e comentrios para melhor entendimento
do programa.
#include <iostream>
using namespace std;
int main()
{
int mult1, mult2;
for (mult1 = 1; mult1 <= 10; mult1++)
{
cout<<"Tabuada do numero "<<mult1<<":\n";
for (mult2 = 1; mult2 <= 10; mult2++)
{
cout.width(2);
cout<<mult1<<" X ";
cout.width(2);
cout<<mult2<<" = ";
cout.width(3);
cout<<mult1*mult2<<"\n";
}
}
system("PAUSE > null");
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int opcao;
while (opcao!= 5)
{
cout<<"Escolha uma opo entre 1 e 4. Escolha 5
para sair do programa\n";
cin>>opcao;
if ((opcao> 5) || (opcao< 1))
{
continue; //opo invalida: volta ao inicio
do loop
}
switch (opcao)
{ //incio do switch
case 1:
cout<<"Opo 1 foi escolhida\n";
break;
case 2:
cout<<"Opo 2 foi escolhida\n";
break;
case 3:
cout<<"Opo 3 foi escolhida\n";
break;
case 4:
cout<<"Opo 4 foi escolhida\n";
break;
case 5:
cout<<"Voc saiu do programa\n";
break;
} //fim do switch
} //fim do lao while
Em primeiro lugar, o lao while far com que o programa rode repetidamente at
que a varivel opcao, cujo valor atribudo pelo usurio a cada repetio do programa,
tenha valor igual a 5. A declarao if checa se o valor entrado pelo usurio maior que
cinco ou menor que 1. Caso isto seja verdade, o comando continue interrompe a execuo
de todos os comandos seguintes, fazendo o lao while ser repetido mais uma vez. Caso o
usurio entre um valor entre 1 e 5, o comando continue no executado e o lao while
continua para o prximo bloco de comandos, no caso, a declarao switch. A declarao
switch utilizada para mostrar qual opo o usurio escolheu e, no caso do usurio ter
escolhido o valor 5, indicar que o programa terminou. Quando o valor 5 escolhido, a
condio do lao while torna-se falsa, terminando o programa.
Assim como uma varivel normal, podemos atribuir valores para uma matriz no
momento de sua declarao. Isto feito utilizando o operador de atribuio = seguido
dos valores contidos entre chaves e separados por vrgulas. Por exemplo, considere a
matriz de inteiros teste abaixo:
Tambm podemos atribuir apenas parte dos valores de uma matriz, por exemplo,
Aps criar uma matriz, podemos acessar qualquer valor dentro dela. Cada valor, ou
elemento de uma matriz, possui um nmero prprio. Toda matriz comea no elemento 0.
Precisamos ter isso em mente quando acessamos valores dentro de uma matriz, pois o
primeiro elemento ser o elemento 0, o segundo elemento ser o elemento 1.
Cada elemento de uma matriz tratado como uma varivel separada. Assim,
podemos atribuir valor para um elemento, exib-lo na tela, utiliz-lo em operaes
matemticas e em laos condicionais. O programa abaixo ilustra estas vrias aes:
#include <iostream>
using namespace std;
int main() {
int matriz[5] = {1,2,3,4,5};
cout<<"o primeiro valor da matriz : "<<matriz[0]<<endl;
cout<<"o ltimo valor da matriz : "<<matriz[4]<<endl;
cout<<"Somando o segundo e o quarto elementos da matriz
temos: "<< matriz[1] + matriz[3]<<endl;
matriz[2] = 27;
cout<<"Mudamos o valor do terceiro elemento da matriz para:
"<<matriz[2]<<endl;
system(PAUSE > null);
return 0;
}
Uma das utilizaes mais teis dos laos condicionais o acesso vrios (ou todos)
elementos de uma matriz rapidamente. Podemos utilizar qualquer um dos laos que
estudamos, mas sem dvida o lao for o mais prtico para trabalhar-se com matrizes.
Utilizamos a varivel de controle do lao para acessar cada um dos elementos desejados
(lembre-se que a matriz sempre comea no elemento 0), como vemos no programa abaixo
que percorre os elementos de uma matriz, primeiro preenchendo a matriz com os dados
entrados pelo usurio, depois exibindo estes dados na tela.
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;
}
int tritabela [2] [2] [2] = { {{ 9, 8}, {7,6}} , {{5, 4},{3, 2}} };
Cada elemento de uma matriz multidimensional pode ser acessado individualmente,
indicando a posio exata do valor dentro da matriz. Como vimos anteriormente no caso
das matrizes simples, a utilizao dos laos condicionais facilita o acesso aos vrios
elementos de uma matriz. No caso das matrizes multidimensionais, utilizamos laos
aninhados para acessar cada dimenso de uma vez. O programa abaixo declara a matriz
tridimensional que vimos anteriormente e utiliza uma sucesso de laos for aninhados para
exibir a matriz na tela.
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;
}
#include <iostream>
using namespace std;
int main()
{
const int TAMANHO = 4;
int sequencia[TAMANHO];
int result = 0;
for (int i = 0; i < 4; i++) {
UNESP Campus de Ilha Solteira 2007 Pgina 64
cout << "Entre com o elemento numero "<<(i+1)<<" da
sequencia: ";
cin >> sequencia[i];
cout << endl;
}
result = soma(sequencia, TAMANHO);
cout << "A soma de todos os elementos da matriz e igual a
"<<result<<"."<<endl;
system("PAUSE > null");
return 0;
}
Tambm podemos utilizar funes que trabalhem com matrizes multidimensionais.
Entretanto, ao criar o parmetro da matriz preciso declarar o tamanho de todas as
dimenses da matriz com exceo da primeira. Por exemplo:
A primeira dimenso deixada em branco, para ter seu tamanho definido pelo outro
parmetro elementos. Entretanto, as outras duas dimenses tem seu tamanho definido
respectivamente em 3 e 4. Caso deixssemos estas outras duas dimenses sem um tamanho
definido, o programa no seria compilado.
#include <iostream>
using namespace std;
Para evitar este problema, a linguagem C++ introduz dois novos operadores de
controle de memria. Em primeiro lugar, temos o operador new, que utilizado para
alocar espaos na memria de computador durante a execuo de um programa. Em
segundo lugar, o operador delete, que libera a memria alocada com o operador new aps
sua utilizao. Este tipo de criao e destruio de variveis chamado de alocao
dinmica. Uma matriz criada dessa forma chamada de matriz dinmica.
O acesso aos elementos da nova matriz feito de forma anloga ao de uma matriz
criada do jeito normal: utilizamos o nome da matriz seguido do nmero do elemento
acessado. Como j dito anteriormente, o primeiro elemento de uma matriz sempre o
elemento 0.
delete <nome>;
#include <iostream>
using namespace std;
int main() {
int tamanho = 0;
cout<<"Entre com o tamanho da matriz: ";
cin>>tamanho;
cout<<endl;
int *sequencia = new int[tamanho];
for (int i = 0; i < tamanho; i++) {
cout << "Entre com o elemento "<<(i+1)<<" da matriz: ";
cin>>sequencia[i];
cout<<endl;
}
cout<<"A matriz entrada e: ";
for (int i = 0; i < tamanho; i++) {
cout << sequencia[i]<<" ";
}
cout<<endl;
cout<<"Programa encerrado. A matriz criada ser deletada, e a
memria ser devolvida para o processador.";
delete sequencia;
system("PAUSE > null");
return 0;
}
Todo programa escrito em C++ deve conter a seguinte linha de incluso em seu
cabealho:
#include <string>
Isso faz com que o compilador inclua no programa a biblioteca padro de strings de
C++, que contm todas as definies do tipo string, assim como as funes e facilidades
relacionados este tipo. Assim, o cabealho de um programa tpico envolvendo strings fica
assim:
#include <iostream>
#include <string>
using namespace std;
Uma string declarada desta forma estar vazia at que um valor seja atribudo ela,
Utilizamos cin e cout para ler e escrever strings, assim como fazemos com variveis
Utiliza-se o comando cin para ler strings atravs do teclado. A sintaxe a seguinte:
#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<<" e seu sobrenome
<<sobrenome<<"."<<endl;
system("PAUSE > null");
return 0;
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:
C++ possui uma srie de funes e operaes prprias para strings. A tabela abaixo
resume as operaes mais utilizadas (s uma string qualquer):
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.
#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;
}
#include <cctype>
Assim, o cabealho de um programa que utiliza strings e a biblioteca cctype ficaria
assim:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
A tabela abaixo resume algumas das funes mais teis desta biblioteca (x um
elemento de uma string, por exemplo, sobrenome[4]) :
isalnum (x) Retorna verdadeiro (1) caso x for uma letra ou um nmero.
isalpha (x) Retorna verdadeiro (1) caso x for uma letra.
iscntrl (x) Retorna verdadeiro (1) caso x for um dgito de controle.
isdigit (x) Retorna verdadeiro (1) caso x for um nmero.
isgraph (x) Retorna verdadeiro (1) caso x no for um espao.
islower (x) Retorna verdadeiro (1) caso x for uma letra minscula.
isprint (x) Retorna verdadeiro (1) caso x for um caractere imprimvel.
ispunct (x) Retorna verdadeiro (1) caso x for um caractere acentuado.
isspace (x) Retorna verdadeiro (1) caso x for um esao em branco.
isupper (x) Retorna verdadeiro (1) caso x for uma letra maiscula
isxdigit (x) Retorna verdadeiro (1) caso x for um nmero hexadecimal.
tolower (x) Transforma um caractere maisculo em minsculo.
toupper (x) Transforma um caractere minsculo em maisculo.
#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;
}
&<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;
}
#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;
}
Ponteiros podem ser de qualquer tipo, como int, float, long e at mesmo sem tipo
(void). Abaixo temos alguns exemplos de declarao de ponteiro:
int *referencia;
float *media;
referencia = &valor;
#include <iostream>
using namespace std;
*<nome do ponteiro>;
#include <iostream>
using namespace std;
int main( )
{
int valor = 42;
int * ponteiro;
ponteiro = &valor;
cout << "Endereo apontado pelo ponteiro: ";
cout << ponteiro <<endl;
cout << "Valor guardado por este endereo: ";
cout << *ponteiro <<endl;
cout << Valor atualizado!;
*ponteiro = 12458;
cout << "Novo valor guardado por este endereo: ";
cout << *ponteiro <<endl;
system(PAUSE > null);
return 0;
}
Como vimos no mdulo 4, podemos criar funes que utilizam dois tipos de
chamada de parmetros: a chamada por valor, onde a funo recebe uma cpia do valor de
uma varivel e a varivel em si no alterada pela funo, e a chamada por referncia,
onde a funo recebe o endereo da varivel, que tem seu valor alterado durante a
execuo da funo. Nesta seo explicaremos como feita a chamada de por referncia.
preciso uma srie de cuidados quando criamos funes que usam chamada por
referncia. A primeira delas declarar os ponteiros que sero utilizados como parmetros
no prottipo da funo. Por exemplo:
//corpo da funo
ponteiro endereo
*ponteiro valor
muito importante ter isso em mente ao criar funes que utilizem ponteiros. A
confuso entre o uso de um ponteiro como endereo ou como valor a principal fonte de
erros nestas situaes. O cdigo abaixo o corpo de uma funo que utiliza ponteiros.
Note que utilizamos um ponteiro e uma varivel normal como parmetros. Alm disso,
sempre que utilizamos o valor referenciado pelo ponteiro durante a funo, utilizamos o
asterisco de dereferenciao antes do nome do ponteiro.
if (elevado == 1) return;
Quando utilizamos uma funo deste tipo, preciso que o programa passe um
ponteiro como parmetro desta funo. Isto pode ser feito de duas maneiras: indicando um
ponteiro que contenha um endereo, ou indicando simplesmente o endereo de uma
varivel. Como j vimos, utilizamos o operador & antes do nome de uma varivel para
obter seu endereo. Assim, uma funo que utiliza ponteiros aceita em seu parmetro um
ponteiro ou o endereo de uma varivel ( &varivel ).
O programa abaixo mostra a utilizao de uma funo com chamada por referncia,
tendo em mente os cuidados descritos anteriormente.
#include <iostream>
using namespace std;
int main()
{
int dois = 2;
int j = 5;
potencia( &dois, j);
cout << "dois elevado a "<< j <<" : "<< dois << endl;
system("PAUSE > null");
return 0;
}
Isto acontece porque quando trabalhamos com funes, C++ trata o nome de uma
matriz como o endereo de seu primeiro elemento. Assim:
J sabemos que um ponteiro um valor que aponta para uma posio de memria
especfica. Se somar-se o valor 1 a um ponteiro, o ponteiro apontar para a prxima
posio de memria. Se somar-se 5 ao valor de um ponteiro, o ponteiro apontar para a
posio de memria de cinco posies adiante do endereo atual. No entanto, a aritmtica
de ponteiro no to simples quanto parece. Por exemplo, assuma que um ponteiro
contenha o endereo 1000. Se fosse somado 1 ao ponteiro, poderia se esperar que o
resultado fosse 1001. No entanto, o endereo resultante depende do tipo de ponteiro. Por
exemplo, se fosse somado 1 a um ponteiro do tipo char (que contm 1000), o endereo
resultante ser 1001. Se fosse somado 1 a um ponteiro do tipo int (que requer dois bytes na
memria), o endereo resultante ser 1002. Quando incrementamos um ponteiro de um
determinado tipo, o prprio compilador j faz a converso de tipo para ns. Assim,
podemos utilizar o incremento de um ponteiro para acessar os vrios elementos de uma
matriz de qualquer tipo. O programa abaixo utiliza a aritmtica de ponteiros para acessar
uma matriz. Cria-se um ponteiro que aponta para o endereo do primeiro elemento da
matriz (lembre-se sempre que o nome de uma matriz indica o mesmo endereo de seu
primeiro elemento), e a partir da vamos incrementando este ponteiro para exibir todos os
elementos da matriz. Inicialmente, incrementamos o ponteiro manualmente para ilustrar
melhor o que estamos fazendo, mas podemos facilmente utilizar um lao for para
incrementar o ponteiro e percorrer a matriz toda.
int main()
{
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 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);
Podemos criar funes que retornam ponteiros para o programa que as chamou.
Estas funes so teis, por exemplo, para trabalhar com matrizes e strings, retornando o
endereo da matriz ou string modificada para o programa. Para declarar uma funo que
retorne um ponteiro, preciso declarar o tipo de retorno no prottipo da funo, no se
esquecendo do asterisco. Por exemplo, veja o prottipo de funo abaixo:
int *calculaseno ( );
char *maisculas( );
int (*seno) ( );
int (*integral) ( );
#include <iostream>
using namespace std;
int main()
{
Na verdade, C++ nos permites criar infinitas indirees (ponteiros para ponteiros
para ponteiros...e assim por diante). Mas na prtica, a utilizao de ponteiros para ponteiros
geralmente evitada por causar grande confuso e dificultar a compreenso dos
programas.
#include <iostream>
#include <fstream>
using namespace std;
Note que os nomes das duas bibliotecas so parecidos: ambas contm classes que
trabalham com entrada e sada de dados. No entanto, a biblioteca iostream trabalha apenas
com o fluxo de dados via monitor/teclado/perifricos, enquanto que a biblioteca fstream
trabalha com o fluxo de dados de arquivos. (Na verdade, atualmente a biblioteca fstream
engloba todas as classes contidas em iostream, mas nem todos os compiladores j adotaram
essa modificao).
Explicaremos o uso de cada um deles, cada vez nos aprofundando mais no assunto.
Por enquanto, veremos como criar um arquivo e escrever algumas strings nele utilizando
um objeto ofstream.
UNESP Campus de Ilha Solteira 2007 Pgina 86
10.3 Escrevendo em um arquivo
Podemos resumir assim as etapas necessrias para escrever em um arquivo atravs
de um programa em C++:
- Associa-se este objeto com um arquivo em particular (seja criando ou abrindo um arquivo
j existente).
- Usa-se o objeto para enviar dados para este arquivo, de forma bem parecida como usamos
o comando cout. A diferena que os dados vo para o arquivo, ao invs de serem
exibidos na tela.
Para criar um objeto ofstream, declaramos seu nome de maneira parecida com a
declarao de uma varivel:
Por exemplo:
ofstream escreve;
<objeto>.open(nome do arquivo);
Por exemplo, vamos utilizar o objeto escreve para criar um arquivo chamado
strings.txt. Para fazer isso, utilizamos a funo open da seguinte maneira:
escreve.open(strings.txt);
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
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.
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;
}
<objeto>.close( );
Note que no necessrio especificar o arquivo ser fechado, pois cada objeto s
consegue estar conectado um nico arquivo por vez. No programa acima, por exemplo,
utilizamos o seguinte comando para fechar o arquivo string.txt:
escreve.close( );
ifstream leitura;
leitura.open(string.txt);
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. Lembre-
se 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}
}
Por exemplo
char matriz_chars[80];
leitura.getline( matriz_chars, 80);
#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}
}
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
ou
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.
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;
Formalizando, um membro pblico, seja ele uma varivel ou uma funo pode ser
acessado a qualquer momento durante a execuo de um programa (lido ou alterado no
caso das variveis, executado no caso das funes). Quando tentamos acessar diretamente
um membro privado, geramos um erro pois seu acesso proibido para o
usurio/programador! Assim, a nica forma de acessar um membro privado atravs dos
membros pblicos. Esta separao entre membros pblicos e privados feita na declarao
da classe.
[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.