Você está na página 1de 234

Programao em C e C++

Universidade Federal de Itajub


Professor: Wandr Nunes de Pinho Veloso
wandreveloso@unifei.edu.br
Etapas para o desenvolvimento de
um programa
Anlise
Estuda-se o enunciado do problema para definir os
dados de entrada, o processamento e os dados de
sada
Algoritmo
Utilizao de ferramentas para descrever o problema
com suas solues
Descrio narrativa
Fluxograma
Portugus estruturado ou Portugol
Codificao
Transformao do algoritmo em cdigos da
linguagem de programao

2
Algoritmo
O que ?
Algoritmo uma sequncia de passos que visa atingir
um objetivo bem definido (FORBELLONE, 1999)
Algoritmo uma sequncia finita de instrues ou
operaes cuja execuo, em tempo finito, resolve
um problema computacional, qualquer que seja sua
instncia (SALVETTI, 1999)
Na Matemtica:
Associa-se a um processo de clculo, ou de resoluo de
um grupo de problemas semelhantes, em que se estipulam,
com generalidade e sem restries, regras formais para a
obteno do resultado, ou da soluo do problema
(MANZANO e OLIVEIRA, 2010)

3
Algoritmo
Exemplo: Trocar uma lmpada
1. Pegar uma lmpada nova
2. Pegar uma escada
3. Posicionar a escada embaixo da lmpada queimada
4. Subir na escada com a lmpada nova na mo
5. Retirar a lmpada queimada
6. Colocar a lmpada nova
7. Descer da escada
8. Testar o interruptor
9. Guardar a escada
10. Jogar a lmpada velha no lixo

4
Construo de algoritmos
a. Ler atentamente o enunciado,
destacando os pontos mais importantes
b. Definir os dados de entrada
c. Definir o processamento (clculos,
restries para os clculos)
d. Definir os dados de sada
e. Construir o algoritmo usando um dos
tipos de algoritmos
f. Testar o algoritmo realizando simulaes

5
Tipos de algoritmos
Narrativa
Usa escrita natural (exemplo: portugus)
No necessrio aprender nenhum
conceito novo
Pode gerar ambiguidades e dvidas
Exemplo: Multiplicar dois nmeros
1. Receber os dois nmeros que sero
multiplicados
2. Multiplicar os nmeros
3. Mostrar o resultado obtido na multiplicao

6
Tipos de algoritmos
Fluxograma
Escrever os passos a serem seguidos para resolver o
problema
Utiliza smbolos grficos predefinidos
Mais fcil entendimento do que a narrativa
necessrio aprender a simbologia e o algoritmo no
apresenta muitos detalhes
Exemplo: Multiplicar dois nmeros

INCIO N1, N2

M = N1 * N2

M FIM

7
Tipos de algoritmos
Fluxograma
Terminal
Define o incio e o fim do fluxo lgico do programa
Entrada manual
Entrada manual de dados, normalmente efetuada
em um teclado
Processamento
Representa a execuo de uma operao que
estabelece o resultado de uma operao lgica ou
matemtica

8
Tipos de algoritmos
Fluxograma
Exibio
Sada visual de dados em um monitor de vdeo ou
impressora
Deciso
Uso de desvios condicionais para outros pontos do
programa de acordo com situaes variveis
Processo predefinido
Definio de um grupo de operaes estabelecidas como
uma sub-rotina de processamento anexa ao diagrama
Conector
Entrada ou sada em outra parte do diagrama

Linha
Ao de vnculo existente entre os vrios smbolos

9
Tipos de algoritmos
Pseudocdigo ou Portugol
Escrever, por meio de regras predefinidas, os passos
para resoluo do problema
Passar do Portugol para qualquer linguagem de
programao quase imediata, bastando conhecer a
sintaxe
necessrio aprender as regras do pseudocdigo
Exemplo: Multiplicar dois nmeros
DECLARE N1, N2, M NUMRICO
ESCREVA "Digite dois nmeros"
LEIA N1, N2
M N1 * N2
ESCREVA "Multiplicao = ", M
FIM

10
Varivel
Representa uma posio de memria e,
todo dado a ser armazenado deve ser
previamente identificado
Possui nome e tipo
Pode variar ao longo do tempo
Uma varivel pode armazenar somente
um valor a cada instante

11
Tipos de dados
Numrico
Inteiros
Positivos ou negativos
Sem parte decimal
Ocupa 2 bytes
Reais
Positivos ou negativos
Possuem parte decimal (separado por ponto e no vrgula)
Ocupa 4 bytes
Lgico ou booleano
Valor verdadeiro ou falso
Ocupa 1 byte
Literal ou caractere
Um nico caractere ou uma cadeia de caracteres
Letras maisculas, minsculas, nmeros (no podem ser usados para
clculos) e caracteres especiais

12
Tipos de dados
Que tipos de dados so esses elementos?
-893
"Mariana"
Falso
"1 + 2 + 3?"
581739.446844
'A'
"wandreveloso@unifei.edu.br"
'8'

13
Identificadores
So os nomes das variveis, das constantes,
das rotinas, das unidades, etc.
Regra de utilizao
Formados de nmeros, letras maisculas e
minsculas e o caractere sublinhado (underline)
O primeiro caractere deve ser uma letra ou o
caractere sublinhado
No so permitidos espaos em branco e caracteres
especiais (!@#$%&*)
No podem ser usadas palavras reservadas, ou seja,
que pertencem linguagem de programao
Exemplo: CASE, SET, IF, THEN, REPEAT, END, BEGIN

14
Identificadores
Esses identificadores podem ser utilizados?
A
Wandr
G
Var X
I98u_Sc
5849H
Case
X(2)
Falso

15
Linguagens C e C++
Evoluo de uma linguagem de chamada B
Padronizado pela ANSI (American National
Standards Institute) em 1983
C++ uma extenso da linguagem C
O conjunto de instrues que faz parte da
linguagem C tambm parte de C++
Os incrementos encontrados no C++ foram
feitos para dar suporte programao orientada
a objetos (classes, objetos, herana,
polimorfismo e sobrecarga)

16
Estrutura bsica de um programa
em C++
Um programa em C++ consiste em uma ou
vrias funes, classes e objetos.
tipo nomeFunc(declarao dos parmetros)
{
instruo_1;
instruo_2;
..............
instruo_n;
return var_tipo;
}
17
Primeiro programa em C++
Usando o compilador Code::Blocks
Disponvel em: http://www.codeblocks.org/downloads/binaries
O arquivo maior que tiver, por volta de 97 MB (com o MinGW, que um
conjunto de ferramentas GNU para desenvolvimento no Windows) -
codeblocks-13.12mingw-setup.exe
Criando um novo projeto
File\New\Project
Console Application
Project title: HelloWorld
Pode ser utilizado o compilador Dev-C++,
caso o Code:Blocks no funcione
perfeitamente
Sempre crie novos projetos em novas pastas

18
Primeiro programa em C++
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "Primeiro programa\n";
system("PAUSE");
return 0;
}
19
Nome das funes
Funo main
Uma funo pode ter qualquer nome, exceto
o nome main, que reservado
Todo programa C++ deve existir uma nica
funo chamada main. Ela marca o ponto de
partida do programa
Se um programa for constitudo de uma nica
funo, esta ser main
O programa termina quando for encerrada a
execuo da funo main

20
Parnteses aps o nome da funo

Sem os parnteses o compilador poderia


pensar que o main do cdigo anterior se
referisse a uma varivel

21
Tipo int
A funo main do cdigo anterior do
tipo int
Significa que ela dever retornar um
nmero inteiro
A instruo return 0; que caracteriza
esse retorno
Quando o programa d algum tipo de erro,
o retorno da funo main pode ser
diferente de 0

22
Chaves
Toda funo C++ deve comear com uma
chave de abertura de bloco { e terminar
com uma de fechamento de bloco }
As chaves delimitam o corpo da funo

23
Espaos em branco
O compilador ignora os espaos em
branco
Podemos colocar diversas instrues em
uma nica linha ou at saltar linhas
diversas
Excees: No usar espaos em textos
escritos entre aspas, nomes de funes,
operadores, comandos de linguagem e
diretivas de pr-processador
Ex: #include <iostream>

24
Instrues do programa
Primeira instruo
cout << "Primeiro programa";
Imprime a frase entre aspas duplas na tela
Segunda instruo
system("PAUSE");
Solicita ao computador uma pausa at que alguma
tecla seja pressionada no teclado
Terceira instruo
return 0;
Solicita funo main que retorne o valor 0 a quem a
chamou (no nosso caso, o sistema operacional ou o
compilador)

25
Instrues do programa
Toda instruo em C++ deve terminar
com um ponto-e-vrgula
Letras maisculas e minsculas so
consideradas distintas (case sensitive)
A funo main deve ser grafada com letras
minsculas
Main mAIN MAIN MAin main

26
Imprimindo com cout
O objeto cout pertence a uma classe de
standard I/O (leitura e impresso)
predefinida em C++
Geralmente o objeto cout est associado
sada-padro do sistema operacional
(geralmente o vdeo)
O operador << chamado de operador de
insero e envia a mensagem a ser
impressa a cout

27
Funo system()
Executa um comando interno do sistema
operacional ou um programa
No nosso caso estamos executando o
comando PAUSE
system("PAUSE");
No Code::Blocks, necessrio realizar a
incluso do arquivo cstdlib para que a
funo system possa ser utilizada

28
Diretivas do pr-processador
No uma instruo da linguagem C++
(no h ponto-e-vrgula no final)
O pr-processador um programa que
examina o programa-fonte em C++ e
executa certas modificaes com base em
instrues chamadas de diretivas
Toda diretiva iniciada pelo smbolo # e
seu texto deve ser escrito em uma nica
linha

29
Diretiva #include
Provoca a incluso de outro arquivo em nosso programa-fonte
Substitui a linha contendo essa diretiva pelo contedo do arquivo
indicado
A substituio feita antes de o programa ser compilado
#include <iostream>
#include <cstdlib>
O arquivo iostream contm as definies e declaraes
necessrias para o uso de objetos stream, no nosso caso cout, e
tambm para o uso da funo system()
O arquivo cstdlib contm funes envolvendo alocao de
memria, controle de processos, converses e outras
Se usarmos os sinais < e > o arquivo procurado somente na
pasta INCLUDE do compilador
Se usarmos aspas duplas, o arquivo procurado primeiramente
na pasta atual e depois, se no for encontrado, na pasta
INCLUDE

30
Os novos arquivos de incluso
Em alguns compiladores mais antigos, devemos
utilizar a extenso .h para os arquivos que
devemos incluir
Os novos arquivos de incluso-padro C++ no
possuem uma extenso em seus nomes
Os arquivos com extenso .h no usam
namespace. Se utilizarmos um compilador
antigo, devemos retirar a diretiva using

31
Diretiva using
O namespace uma regio que agrega um identificador
a todos os nomes declarados dentro dela
Em outras palavras, namespace um sobrenome
O objeto cout est declarado no namespace std
Para usarmos o cout deveramos escrever a instruo
deste modo:
std::cout << "Primeiro programa";
Para que no seja necessrio escrevermos std em
todas as instrues, usamos o comando
using namespace std;

32
Cdigos especiais
O objeto cout no quebra a linha no final da impresso, por isso
devemos utilizar um cdigo que formado pelo sinal \ (barra
invertida) e outros caracteres
\n Nova linha
\t Tabulao
\b Retrocesso
\f Salta pgina
\a Toca o auto-falante (no usar nos computadores da universidade,
seno pode travar)
\r Volta o cursor para o incio da linha
\\ \ (barra invertida)
\0 Zero (Null)
\' Aspas simples
\" Aspas duplas
\xdd Representao hexadecimal de caractere da tabela ASCII

33
Tabela ASCII

34
Tabela ASCII Estendida

35
Comentrios
Tm a funo de ajudar na documentao do
cdigo-fonte do programa
Existem dois tipos de comentrios
De uma linha
int main() //funo main
De vrias linhas
/*No nosso primeiro programa escrevemos
somente uma frase na tela e esperamos o
usurio apertar alguma tecla*/
No podemos combinar comentrios de vrias
linhas
/* isso no se pode /* fazer*/

36
Constantes numricas
Valor fixo, inaltervel
Pode ser
Decimal
Ex: 2345, 50, 88
Hexadecimal (iniciam com 0x)
Ex: 0x41, 0x1afb, 0x54CA
Octal (iniciam com 0)
Ex: 041, 010, 0754
Caractere (apstrofe)
Ex: '5', 'a', '\n', '\t'
Cadeia de caracteres (aspas)
Ex: "Primeiro programa\n"

37
Imprimindo outros tipos de dados
com cout
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "\nVenus esta a " << 67 << "
milhoes de milhas" << '\n' << "do
sol." << endl;
system("PAUSE");
return 0;
}

38
Imprimindo outros tipos de dados
com cout
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "A letra " << 'J';
cout << " pronuncia-se " << "Jota" <<
'.' << endl;
system("PAUSE");
return 0;
}

39
Variveis
Espao de memria reservado para armazenar
determinado tipo de dado tendo um nome para
se referir ao seu contedo
Para declarar uma varivel, devemos especificar
um tipo e um nome com o qual podemos
acessar o contedo dela
Toda varivel em C++ deve ser declarada antes
de ser usada
O exemplo a seguir cria duas variveis do tipo
int

40
Criao de variveis int
//Cria duas variveis do tipo int
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{ int num1;
num1 = 44;
int num2;
num2 = num1 + 20;
cout << "\no primeiro numero e " << num1;
cout << "\no segundo numero e \"num1 + 20 \" = "<<
num2 << endl;
system("PAUSE");
return 0;
}

41
Tipos de variveis
Informa a quantidade de memria que ela
ocupar e o modo como um valor dever
ser armazenado e interpretado
Cinco tipos bsicos
char
int
float
double
void

42
Tipos de variveis
Tipo Bits Bytes Escala
char 8 1 -128 a 127
int 32 4 -2.147.483.648 a 2.147.483.647
short 16 2 -32.765 a 32.767
long 32 4 -2.147.483.648 a 2.147.483.647
unsigned char 8 1 0 a 255
unsigned 32 4 0 a 4.294.967.295
unsigned long 32 4 0 a 4.294.967.295
unsigned short 16 2 0 a 65.535
float 32 4 3,4 x (10^-38) a 3,4 x (10^38)
double 64 8 1,7 x (10^-308) a 1,7 x (10^308)
long double 80 10 3,4 x (10^-4932) a 3,4 x (10^4932)
void 0 0 nenhum valor
43
Nomes de variveis
importante escolher nomes significativos
para as variveis, para ajudar a entender
o que o programa faz e prevenir erros
O primeiro caractere deve ser uma letra
ou sublinhado
Pode conter letras maisculas,
minsculas, dgitos e o caractere
sublinhado
Lembrando que o C++ case sensitive

44
Criando namespaces
#include <iostream>
#include <cstdlib>
using namespace std;
namespace Silva //definio do namespace deve ser fora de funo
{ int a, b; }
namespace Neves
{ double a; double b; }
int main()
{
Silva::a = 4; Silva::b = 7;
Neves::a = 5.453; Neves::b = 2.13e4;
cout << "Silva::a = " << Silva::a << endl;
cout << "Silva::b = " << Silva::b << endl;
cout << "Neves::a = " << Neves::a << endl;
cout << "Neves::b = " << Neves::b << endl;
system ("PAUSE"); return 0;
}

45
Manipuladores de tamanho de
campo na impresso
O objeto cout permite estabelecer o
tamanho de um campo para impresso
Em geral isso usado para alinhamento e
esttica de um relatrio
Os manipuladores de tamanho de campo
esto definidos no arquivo iomanip

46
Manipuladores de tamanho de
campo na impresso
setw
Seleciona o tamanho do prximo campo a ser
impresso
setprecision
Define o nmero de casas decimais a ser impressas
para um nmero em ponto flutuante
setfill
Seleciona o caractere que dever preencher as
colunas em branco iniciais de um campo
setiosflags
Seleciona o modo de apresentao de um nmero
(com ponto decimal, notao cientfica, etc.)

47
Tamanho de campos com nmeros
inteiros
//Sem tamanho de campo
//Sem manipuladores
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int lapis=45, borrachas=2345, canetas=420, cadernos=8;
cout <<"\n\n\n";
cout <<'\n'<<"Lapis "<< lapis;
cout <<'\n'<<"Borrachas "<< borrachas;
cout <<'\n'<<"Canetas "<< canetas;
cout <<'\n'<<"Cadernos "<< cadernos;
cout << endl; system("PAUSE"); return 0;
}

48
Tamanho de campos com nmeros
inteiros
//Com tamanho de campo e com manipulador setw
#include <iostream>
#include <cstdlib>
#include <iomanip> //para o uso de manipuladores
using namespace std;
int main()
{
int lapis=45, borrachas=2345, canetas=420, cadernos=8;
cout <<"\n\n\n";
cout <<'\n'<<"Lapis "<< setw(12) << lapis;
cout <<'\n'<<"Borrachas "<< setw(12) << borrachas;
cout <<'\n'<<"Canetas "<< setw(12) << canetas;
cout <<'\n'<<"Cadernos "<< setw(12) << cadernos;
cout << endl; system("PAUSE"); return 0;
}

49
Tamanho de campos com nmeros
inteiros
//Com tamanho de campo e com manipuladores setw e setfill
#include <iostream>
#include <cstdlib>
#include <iomanip> //para o uso de manipuladores
using namespace std;
int main()
{
int lapis=45, borrachas=2345, canetas=420, cadernos=8;
cout << setfill('.'); //manipulador
cout <<"\n\n\n";
cout <<'\n'<<"Lapis "<< setw(12) << lapis;
cout <<'\n'<<"Borrachas "<< setw(12) << borrachas;
cout <<'\n'<<"Canetas "<< setw(12) << canetas;
cout <<'\n'<<"Cadernos "<< setw(12) << cadernos;
cout << endl; system("PAUSE"); return 0;
}

50
Tamanho de campos com pontos
flutuantes
Podemos definir o nmero de casas
decimais a ser apresentadas, alm do
tamanho da coluna a ser ocupada pelo
nmero

51
Tamanho de campos com pontos
flutuantes
//Com tamanho de campo
//Com manipuladores setw, setiosflags e setprecision
#include <iostream>
#include <cstdlib>
#include <iomanip> //para o uso de manipuladores
using namespace std;
int main()
{ float lapis=4.875, borrachas=23.542, canetas=42.036, cadernos=8.0;
cout <<"\n\n\n";
cout << setiosflags(ios::fixed) //parte inteira inalterada
<< setiosflags(ios::showpoint) //sempre imprimir o ponto
decimal
<< setprecision(2); //duas casas decimais
cout <<'\n'<<"Lapis "<< setw(12) << lapis;
cout <<'\n'<<"Borrachas "<< setw(12) << borrachas;
cout <<'\n'<<"Canetas "<< setw(12) << canetas;
cout <<'\n'<<"Cadernos "<< setw(12) << cadernos;
cout << endl; system("PAUSE"); return 0; }

52
Tamanho de campos com cadeias
de caracteres
//Com tamanho de campo com cadeias de caracteres
//Usa manipulador setw
#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
int main()
{
cout <<'\n'<<"OBJETO "<< setw(12)<<"CODIGO"<<endl;
cout <<'\n'<<"Lapis "<< setw(12)<<"WQR";
cout <<'\n'<<"Borrachas "<< setw(12)<<"ASO";
cout <<'\n'<<"Canetas "<< setw(12)<<"KPX";
cout <<'\n'<<"Cadernos "<< setw(12)<<"JFI";
cout << endl; system("PAUSE"); return 0;
}

53
Manipuladores de bases numricas
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int n=65;
/*quando coloca-se hex, oct e dec, afirmamos que
desejamos imprimir varivel com essa base
numrica*/
cout <<'\n'<<"Hexadecimal: "<< hex << n;
cout <<'\n'<<"Octal: "<< oct << n;
cout <<'\n'<<"Decimal: "<< dec << n;
cout << endl; system("PAUSE"); return 0;
}

54
Imprimindo caracteres grficos
Todo caractere (letra, dgito, caractere de
pontuao, etc.) representado no
computador por um nmero
O cdigo ASCII dispe de nmeros de 0 a
127 abrangendo esses smbolos j citados
Os computadores usam 128 caracteres
adicionais, com cdigos ASCII de 128 a 255,
que consistem em smbolos de lnguas
estrangeiras e caracteres grficos
Utiliza-se base hexadecimal para
representao desses smbolos
55
Imprimindo caracteres grficos
//Caracteres grficos
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
system("cls"); //limpa a tela
cout << "\n\n";
cout << "\n\t\xDC\xDC\xDB\xDB\xDB\xDB\xDC\xDC";
cout << "\n\t\xDFO\xDF\xDF\xDF\xDFO\xDF";
cout << "\n\n";
cout << "\n\t\xDC\xDC\xDB \xDB\xDB\xDB\xDB\xDB\xDB";
cout << "\n\t\xDFO\xDF\xDF\xDF\xDF\xDFOO\xDF";
cout << "\n\n";
cout << endl;
system("PAUSE");
return 0;
}

56
Exerccios
1.Escreva um programa que contenha
uma nica linha para impresso (usando um
cout) e a seguinte sada:
um
dois
trs

57
Operadores
C++ uma linguagem rica em
operadores, em torno de 50, porm alguns
so mais usados que outros
Veremos alguns deles

58
Operadores
Atribuio: =
O sinal = representa a atribuio da
expresso sua direita varivel
esquerda
Exemplo:
x = 2000;
Atribui o valor 2000 varivel de nome x

A ao executada da direita para a


esquerda

59
Operadores
Atribuio: =
Toda vez que utilizamos um operador, criamos
uma expresso
Toda expresso tem um valor numrico
5 + 2
Valor 7
x = 3
Valor 3
y = (x = 3); ou y = x = 3;
Valor 3
Expresses desse tipo so chamadas de atribuies
mltiplas

60
Operadores
Aritmticos: + - * / %
+
Realiza soma entre dois operandos
-
Realiza subtrao entre dois operandos
Indica troca de sinal algbrico do valor associado (um operando)
Ex: x = -8;
*
Realiza multiplicao entre dois operandos
/
Realiza diviso entre dois operandos
%
Realiza o resto da diviso do inteiro esquerda pelo da direita
17 % 5 // resulta em 2

61
Precedncia
Indica qual operador dever ser
executado primeiro
*, / e % tem a mesma precedncia
+ e tem a mesma precedncia
Quando a precedncia a mesma, segue
a sequncia da esquerda para a direita
Podemos alterar a precedncia colocando
parnteses, que so executados primeiro

62
Lendo com cin
O objeto cin aguarda para que o usurio
escreva alguma coisa utilizando o teclado
e pressione enter, em seguida, por meio
do operador de extrao >>, que coloca a
entrada de dados na varivel que a
conter
As definies necessrias ao uso do cin e
>> esto no arquivo iostream

63
Lendo com cin
Exemplo:
//Calcula a sua idade em dias
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "\nDigite a sua idade em anos: ";
int anos;
cin >> anos;
cout << "\nA sua idade em dias e: " << (anos*365) <<
endl;
system("PAUSE");
return 0;
} 64
Mltiplas entradas com cin
Podemos ler vrios valores com uma nica chamada a cin
//Mostra o uso de cin com vrias entradas
//Calcula a mdia de 4 notas
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{ cout << "\nDigite as notas das 4 provas: ";
float p1, p2, p3, p4;
cin >> p1 >> p2 >> p3 >> p4;
float media = (p1+p2+p3+p4)/4.0;
cout << "\nMEDIA: " << media << endl;
system("PAUSE");
return 0;
}

65
Operadores de incremento (++) e
decremento (--)
O operador de incremento (++) opera sobre o nome de uma
varivel e adiciona 1 ao valor da varivel operando
A instruo
x = x + 1; //adiciona 1 a x
Equivale a
++x; //adiciona 1 a x
A sintaxe e o modo de uso do operador decremento (--)
idntica do operador de incremento, exceto porque a varivel
decrementada de 1
A instruo
x = x 1; //decrementa 1 de x
Equivale a
--x; //decrementa 1 de x
x++ e ++x so diferentes
n=x++ //sendo x=1, n ser 1 e x ser 2
n=++x //n e x so 2, pois o incremento de x acontece
antes da atribuio a n

66
Operadores relacionais
Operadores relacionais executam
comparaes
> maior
>=maior ou igual
< menor
<=menor ou igual
==igual
!=diferente

67
Operadores lgicos
Operadores lgicos tambm realizam
comparaes
A diferena entre comparaes lgicas e
relacionais est na forma como os operadores
avaliam seus operandos
Operandos lgicos so avaliados como lgicos
(0 ou 1), e no como quantidades numricas
&& lgico E
|| lgico OU
! lgico NO

68
Laos
Comandos usados sempre que uma ou
mais instrues devam ser repetidas
enquanto uma certa condio estiver
sendo satisfeita
for
while
do - while

69
Lao for
Usado quando queremos repetir algo um nmero fixo de vezes
Isso significa que utilizamos um lao for quando sabemos de
antemo o nmero de vezes a repetir
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int i;
for( i=0 ; i < 20 ; i++) //20 vezes
cout << '*';
cout << endl; system("PAUSE"); return 0;
}
Resultado da execuo do programa:
********************

70
Lao for
Sintaxe
Consiste na palavra-chave for seguida de parnteses que contm
trs expresses separadas por ponto-e-vrgulas.
A primeira dessas expresses chamada de inicializao
sempre executada uma nica vez, antes que o lao seja iniciado
A segunda chamada de teste
a condio avaliada como verdadeira ou falsa e controla o lao
Toda vez que o lao iniciado ou reiniciado ela avaliada
Se verdadeira, a instruo do corpo do lao executada
Se o teste for falso, o lao encerrado e o controle passa para a instruo
seguinte ao lao
A terceira chamada de incremento
Define a maneira pela qual a varivel de controle ser alterada cada vez
que o lao for repetido
Essa expresso executada sempre, logo aps a execuo do corpo do
lao
Exemplo:
for( i=0 ; i < 20 ; i++ )

71
Lao for
Exemplo
//Imprime a tabuada do 6
#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
int main()
{
int i;
for( i=1 ; i < 10 ; i++ )
cout << '\n' << setw(4) << i << " x 6 = " <<
setw(4) << (i*6);
cout << endl; system("PAUSE"); return 0;
}

72
Lao for
Criando laos aninhados
#include <iostream> //Imprime a tabuada do 2 ao 9
#include <cstdlib>
#include <iomanip>
using namespace std;
int main()
{
system("cls"); //limpa a tela
for( int k=0 ; k <= 1 ; k++)
{
cout << endl;
for(int i=1 ; i <= 4 ; i++)
cout << "TABUADA DO" << setw(3) << (i+4*k+1) << " ";
cout << endl;
for( int i = 1; i <= 9 ; i++)
{
for( int j=2+4*k; j <=5+4*k; j++)
cout<<setw(3)<<j<<"x"<<setw(3)<<i<<" = "<<setw(3)<<j*i<<"
";
cout << endl;
}
}system("PAUSE"); return 0;
}

73
Lao while
Significa enquanto
primeira vista, o lao while parece simples se comparado ao lao for;
utiliza os mesmos elementos, mas eles so distribudos de maneira
diferente no programa
Exemplo:
//Conta caracteres de uma frase
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
int main()
{
int cont=0; //contador
while(getche() != '\r') //enquanto no [Enter]
cont++; //Corpo do lao
//Fora do lao
cout << "\nO numero de caracteres e " << cont << endl;
system("PAUSE"); return 0;
}

74
Lao while
Sintaxe

Palavra while seguida de uma expresso de


teste entre parnteses
Se a expresso de teste for verdadeira, o corpo
do lao while executado uma vez, e a
expresso de teste avaliada novamente
Esse ciclo de teste e execuo repetido at
que a expresso de teste se torne falsa, ento o
lao termina e o controle do programa passa
para a linha seguinte ao lao

75
Lao while
Sintaxe
Exemplo:
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int i = 0; //Inicializao
while( i < 20 ) //Teste
{
cout << '*';
i++; //Incremento
}
cout << endl;
system("PAUSE"); return 0;
}

76
Lao do-while
Bastante similar ao while e utilizado
em situaes em que necessrio
executar o corpo do lao uma primeira vez
e depois avaliar a expresso de teste e
criar um ciclo repetido

77
Lao do-while
Sintaxe

Consiste na palavra-chave do seguida de um bloco de


uma ou mais instrues entre chaves e terminada pela
palavra-chave while seguida de uma expresso de
teste entre parnteses terminada por ponto-e-vrgula
Primeiro, o bloco de cdigo executado; em seguida, a
expresso de teste entre parnteses avaliada; se
verdadeira, o corpo do lao mais uma vez executado e
a expresso de teste avaliada novamente
O ciclo de execuo do bloco e teste repetido at que
a expresso de teste se torne falsa, ento o lao termina
e o controle do programa passa para a linha seguinte ao
lao

78
Lao do-while
Exemplo
//Testa a capacidade de adivinhar uma letra
#include <iostream>
#include <cstdlib> //para o rand() e o system()
#include <conio.h> //para getch()
using namespace std; int main()
{
do //inicio do lao
{
char adivinha; adivinha = rand() %26 + 'a'; int tentativas = 1;
cout << "\n\nDigite uma letra entre 'a' e 'z': " << endl;
char resp;
while((resp=getch())!=adivinha)
{
cout << resp << " e incorreto. Tente novamente" << endl;
tentativas++;
}
cout << resp << "\n E CORRETO!!" << "\nVoce acertou em " <<
tentativas << " tentativas";
cout << "\nQuer jogar novamente? (s/n): ";
} while(getche()=='s'); //fim do lao
cout << "\nAte logo!" << endl; system("PAUSE"); return 0;
}

79
Comandos de deciso
Permitem determinar qual a ao a ser tomada
com base no resultado de uma expresso
condicional
Isso significa que podemos selecionar entre
aes alternativas dependendo de critrios
desenvolvidos no decorrer da execuo do
programa
if
if else
switch

80
Comando de deciso if
Instrui o computador a tomar uma deciso simples
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "Quantos anos voce tem? " << endl;
int anos;
cin >> anos;
if( anos < 30 ) //Toma deciso caso anos < 30
cout << "Voce e muito jovem!" << endl;
system("PAUSE");
return 0;
}

81
Comando de deciso if
Sintaxe

Consiste na palavra-chave if seguida de uma


expresso de teste entre parnteses
Se a expresso de teste for verdadeira, a
instruo ser executada; do contrrio, nada
ser feito
if ( Expresso de Teste)
{
instruo; //Executa se o teste
instruo; //for verdadeiro
}
82
Comando de deciso if
Exemplo
//Conta zeros
#include <iostream>
#include <cstdlib>
#include <conio.h> //para getche()
using namespace std;
int main()
{
char ch;
int cont=0;
cout << "Digite uma frase" << endl;
while( (ch=getche())!= '\r')
if(ch=='0')
{
cout << "\nZERO detectado" << endl;
cont++;
}
cout << "Voce digitou " << cont << " zeros." << endl;
system("PAUSE");
return 0;
}

83
Comando de deciso if
Exemplo
//calcula o quadrado de um nmero usando soma
//o quadrado de n = soma dos n primeiros nmeros mpares
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{ int n, soma=0;
cout << "Digite um numero>" << endl;
cin >> n;
cout << "O quadrado de " << n << " e ";
if( n < 0 ) n = -n; //se negativo, muda o sinal
for(int i=1 ; n > 0 ; n--)
{ soma +=i;
i += 2; }
cout << soma << endl;
system("PAUSE"); return 0;
}

84
Comando de deciso if-else
uma expanso de um simples comando if
O comando if permite que executemos algo
somente se a sua expresso de teste for
verdadeira, caso contrrio nada ser executado
Suponhamos que voc queira executar uma
coisa se a expresso de teste for verdadeira e
outra se a expresso de teste for falsa
Nesse caso, voc deve usar o comando if -
else

85
Comando de deciso if-else
Sintaxe

Consiste no comando if seguido de uma instruo ou


de bloco de instrues, seguido da palavra-chave else,
seguido de uma instruo ou de bloco de instrues
if ( Expresso de teste)
{
instruo;
instruo;
}
else
{
instruo;
instruo;
}

86
Comando de deciso if-else
Exemplo
#include <iostream> //Conta zeros modificado
#include <cstdlib>
#include <conio.h> //para getche()
using namespace std;
int main()
{
char ch;
int cont=0;
cout << "Digite uma frase" << endl;
while( (ch=getche())!= '\r')
if(ch=='0')
{
cout << "\nZERO detectado" << endl;
cont++;
}
if(cont > 0)
cout << "\nVoce digitou " << cont << " zeros." << endl;
else
cout << "\nVoce nao digitou nenhum zero." << endl;
system("PAUSE"); return 0;
}

87
Comando de deciso if-else
Exemplo
//Imprime um tabuleiro de xadrez
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{ system("cls"); //limpa a tela
for(int lin=1;lin<=8;lin++) //move o cursor para baixo
{
for(int col=1;col<=8;col++) //move o cursor para direita
if((lin+col)%2==0) // nmero par?
cout << "\xdb\xdb";
else
cout << " ";
cout << endl;
}
system("PAUSE"); return 0;
}

88
Comando de deciso if-else
Exemplo
#include <iostream> //Jogo de cara ou coroa
#include <cstdlib> //para o rand() e o system()
using namespace std; int main()
{ int n, perda=0, ganho=0; cout << "Quantas vezes que jogar? "; cin >> n;
for ( int i=0; i < n; i++)
{ int resp; cout << "Escolha: 0=Cara e 1=Coroa: "; cin >> resp;
while ( resp != 0 && resp != 1)
{ cout << "ERRO: entre 0 cara e 1 coroa "; cin >> resp; }
if (rand()%2==resp)
{ ganho++; if(resp==0) cout << "Deu Cara, voce ganhou." << endl;
else cout << "Deu Coroa, voce ganhou." << endl;
}
else
{ perda++; if(resp==0) cout << "Deu Coroa, voce perdeu." << endl;
else cout << "Deu Cara, voce perdeu.";
}
}
cout << "\n\nRelatorio Final:";
cout << "\nNo. de jogos que voce ganhou: " << ganho;
cout << "\nNo. de jogos que voce perdeu: " << perda << endl;
system("PAUSE"); return 0;
}

89
Exerccios
1. Calcular e apresentar o valor do volume de
uma lata de leo, utilizando a frmula
VOLUME = 3.14159*(R^2)*ALTURA
2. Escreva um programa que solicite ao
usurio trs nmeros inteiros a, b e c, onde
a maior do que 1. Seu programa deve
somar todos os inteiros entre b e c que
sejam divisveis por a

90
Exerccios
3. Efetuar o clculo da quantidade de litros de combustvel
gasta em uma viagem, utilizando um automvel que faz
12 quilmetros por litro. Para obter o clculo, o usurio
deve fornecer o tempo gasto (varivel TEMPO) e a
velocidade mdia (varivel VELOCIDADE) durante a
viagem. Desta forma, ser possvel obter a distncia
percorrida com a frmula DISTNCIA = TEMPO *
VELOCIDADE. A partir do valor da distncia, basta
calcular a quantidade de combustvel usando
LITROS_USADOS = DISTNCIA/12. O programa deve
apresentar os valores da velocidade mdia, tempo
gasto na viagem, a distncia percorrida e a
quantidade de litros utilizada na viagem.

91
Digite a velocidade Velocidade,
Incio (km/h) e o tempo (h) Tempo
vlidos
SIM
Tempo >= 0 Velocidade >= 0
NO
SIM
Litros_usados Distncia = Tempo
Tempo
= Distncia/12 * Velocidade
invlido
NO
A velocidade mdia O tempo gasto na
, Velocidade viagem ", Tempo

A quantidade de litros usada na A distncia percorrida Velocidade


viagem , Litros_usados , Distncia invlida

Fim 92
3) Viagem automvel
Incio
Declare Tempo, Velocidade, Distncia, Litros_usados Numrico Real;
Escreva("Digite o tempo de viagem (em horas)");
Leia Tempo;
Se (Tempo >= 0)
Escreva("Digite a velocidade mdia(Km/h)");
Leia Velocidade;
Se (Velocidade >= 0)
Distncia = Tempo * Velocidade;
Litros_usados = Distncia/12;
Escreva("A velocidade mdia ", Velocidade);
Escreva("O tempo gasto na viagem ", Tempo);
Escreva("A distncia percorrida ", Distncia);
Escreva("A quantidade de litros usada na viagem ",
Litros_usados);
Seno
Escreva("Velocidade invlida");
Seno
Escreva("Tempo invlido");
Fim

93
Exerccios
4. Efetuar a leitura de dois valores numricos
inteiros representados pelas variveis A e B
e apresentar o resultado da diferena do
maior valor pelo menor valor

94
Exerccios
5. Elabore um programa que receba um
conjunto de valores inteiros positivos e que
calcule e mostre o maior e o menor valor do
conjunto. Considere que para encerrar a
entrada de dados deve ser digitado o valor
zero; para valores negativos deve ser
enviada uma mensagem de erro e solicitado
um novo valor; os valores negativos ou
iguais a zero no entraro no clculo

95
Exerccios
6. Escreva um programa que leia n nmeros
inteiros e determine se cada um deles um
nmero da sequncia de Fibonacci ou no
e, ao final, apresente a seguinte mensagem:
"Dos ..n.... nmeros testados, ..x....
pertenciam a sequncia de Fibonacci".

96
Exerccios
7. Escreva um programa que realize a
operao de potncia (xy) utilizando
somente multiplicaes. O programa no
precisar realizar a potncia de nmeros
cujo expoente seja fracionrio ou negativo e
tambm no precisar realizar potncia de
expoente e base iguais a 0 (ZERO) ao
mesmo tempo (00). Caso seja 00, escrever
"indeterminado".

97
Incio Base, Exp Base == 0

SIM
NO
X=1
Exp == 0 Exp == 0
NO
NO
SIM
X =X * Base

"Indeterminado"

Exp=Exp-1 SIM
Fim

X
98
Comandos break e continue
Devem pertencer ao corpo de um lao
for, while ou do-while
O break causa a sada imediata do lao,
passando o controle para a prxima
instruo aps o lao

99
Comandos break e continue
Exemplo
//Adivinha o nmero que o usurio pensou
#include <iostream>
#include <cstdlib>
#include <conio.h> //para getche()
using namespace std;
int main()
{
cout << "Pense em um numero entre 1 e 99, e responda" << endl;
cout << " =, > ou < para igual, maior ou menor" << endl;
float incr=50.0, adiv=50.0;
while ( incr > 1)
{
char ch; incr/=2;
cout << "\n=, > ou < a " << int (adiv) << "? ";
if((ch=getche())== '=') break;
else if ( ch == '>') adiv += incr;
else adiv -= incr;
}
cout << "\nO numero e " << int(adiv);
cout << "\nCOMO SOU ESPERTO!!!" << endl;
system("PAUSE"); return 0;
}

100
Comandos break e continue
O continue fora a prxima iterao do
lao e pula o cdigo que estiver abaixo

101
Comandos break e continue
Exemplo
//Elimina impresso de dgitos
#include <iostream>
#include <cstdlib>
#include <conio.h> //para getche()
using namespace std;
int main()
{
char ch;
while ((ch=getch())!='X') // termina quando digitado X
{
if( ch >= '0' && ch <= '9') // digito? Se for no imprime
continue; //Execute o teste novamente
cout << ch;
}
cout << endl;
system("PAUSE");
return 0;
}

102
Comando switch
Permite selecionar uma entre vrias aes
alternativas
Substitui os if-else, quando for

necessrio a utilizao de vrias


alternativas
mais limpo e claro

103
Comando switch
Sintaxe
Consiste na palavra-chave switch seguida do nome de uma varivel ou de um valor
numrico constante entre parnteses
O corpo do comando composto de vrios casos que de vem ser rotulados com uma
constante e opcionalmente um caso default
switch ( varivel ou constante) //sem ponto-e-vrgula
{
case constante1: //dois pontos
instruo;
instruo;
break;
case constante2: //no se pode usar varivel ou expresso lgica
instruo;
break;
default: //se nenhuma constante foi igual varivel
instruo;
break;
}

104
Exerccio
1. Escreva um programa que simule uma
calculadora com as quatro operaes bsicas.
O usurio dever digitar o primeiro nmero e apertar
enter. Digita qual operao dever ser executada,
depois enter. Por fim, digita qual o segundo nmero da
operao e, ao apertar enter, aparecer o resultado da
operao

105
Exerccio
2. Escreva um programa que crie um nmero
aleatrio x por meio da funo rand(). O programa
deve solicitar um nmero n ao usurio e compar-lo
com x.
Se n for menor do que x, o programa deve imprimir
"Muito pequeno" e solicitar novamente um nmero para
o usurio.
Se n for maior do que x, o programa deve imprimir
"Muito grande" e solicitar novamente um nmero.
O programa termina quando o usurio adivinhar o
nmero x tomado aleatoriamente, e deve imprimir
"Correto" e o nmero de tentativas at o acerto.

106
Funes
Conjunto de instrues desenhadas para
cumprir determinada tarefa e agrupadas
em uma unidade com um nome para
referi-la
Um programa pode conter uma ou mais
funes
Uma delas deve ser main()

107
Funes
Chamar uma funo o meio pelo qual
solicitamos que o programa desvie o
controle e passe a executar as instrues
da funo e, ao trmino desta, volte o
controle para a posio seguinte da
chamada funo

108
Exemplo
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
int main()
{
cout << "Pressione uma tecla ";
getche();
cout << "\nFIM" << endl;
system("PAUSE");
return 0;
}

109
Funes simples
#include <iostream>
#include <cstdlib>
int celsius(int fahr); //Prottipo
using namespace std;
int main()
{
int c, f; cout << "Digite a temperatura em graus Fahrenheit: ";
cin >> f;
c = celsius(f); //Chamada funo
cout << "Celsius = " << c << endl;
system("PAUSE"); return 0;
}
// celsius() // Definio da funo
int celsius(int fahr)
{ int c; c = (fahr - 32) * 5/9;
return c;
}

110
Componentes de uma funo
Prottipo
Uma funo no pode ser chamada sem antes ter sido declarada
A declarao de uma funo dita prottipo, portanto, deve preceder
sua definio e sua chamada
Permite que o compilador verifique a sintaxe de sua chamada
Tem a mesma forma da primeira linha da definio da funo, exceto
por terminar com ponto-e-vrgula aps o fechamento do parntese
No exemplo anterior: int celsius(int fahr);
O celsius() do tipo int e recebe como argumento um valor int, que ser
armazenado na varivel fahr
Funes definidas antes de serem chamadas no necessitam de
prottipo
Convm deixar a definio das funes para depois do fim da funo
main(), ou seja, sempre bom deixar a definio das funes para
depois do main(), ou seja, sempre usar prottipos

111
Componentes de uma funo
Prottipo
Toda funo tem um tipo, que corresponde ao valor do
retorno desta
Funes int retornam valor int. Quando funes no
retornam nada, o tipo dela void
O tipo de uma funo determinado pelo valor que ela retorna via
comando return, e no pelo tipo de argumentos que ela recebe
O return termina a execuo da funo
No exemplo: pode-se utilizar
return (fahr - 32) * 5/9;
No caso de funes void, o return pode vir desacompanhado de
expresso ou valor, porm o return, nesse caso, no obrigatrio
Pode retornar somente um nico valor para a funo que chama
O valor do retorno pode ser atribudo a uma varivel ou
fazer parte de uma expresso 112
Componentes de uma funo
Definio
Descreve o que a funo faz

tipo nome (declarao dos parmetros)


{
instrues;
}
A primeira linha o cabealho da definio da funo, e tudo o que estiver
entre chaves o corpo da definio da funo
As variveis que recebero as informaes enviadas a uma funo so
chamadas de parmetros
A funo deve declarar essas variveis entre parnteses, no cabealho de sua definio
e podem ser utilizados livremente no corpo da funo
Caso nenhum valor seja passado, deve ser colocar o nome void no prottipo e na
definio
int celsius (int fahr)
{
return (fahr - 32) * 5/9;
}

113
#include <iostream>
#include <cstdlib>
using namespace std;
int abs(int n); // Prottipo
int main()
{
int x=10;
cout << abs(0) << '\t' << abs(-3) << '\t' << abs(x) << endl;
system("PAUSE");
return 0;
}
//abs()
//Calcula o valor absoluto de um nmero
int abs( int n) // recebe tanto uma constante quanto uma varivel, sendo
{
if (n>=0)
{
return n;
}
else return -n; // mesmo que return (n>=0) ? n : -n;
} 114
#include <iostream>
#include <cstdlib>
using namespace std;
void linha(int n); // Prottipo
int main()
{
linha(21); cout << endl;
cout << "* FELIZ ANIVERSARIO *" << endl;
linha(21);
cout << endl; system("PAUSE"); return 0;
}
//linha()
//Desenha uma linha na tela, de tamanho do nmero passado
void linha( int n)
{
for(int i=0; i<n; i++) cout << '*';
}

115
#include <iostream>
#include <cstdlib>
using namespace std;
void retangulo(int largura, int altura); // Prottipo
int main()
{
cout << "Sala" << endl; retangulo(22,12);
cout << "Cozinha" << endl; retangulo(16,16);
cout << "Banheiro" << endl; retangulo(6,8);
cout << "Quarto" << endl; retangulo(12,12); cout << endl;
/* Incremente esse cdigo escrevendo aqui o cdigo correspondente a um usurio
digitar 2 valores e chame a funo passando os dois valores recebidos*/
system("PAUSE"); return 0;
}
void retangulo(int largura, int altura) //retangulo()
{
largura /=2; altura /=4;
for (int j=1; j<= altura; j++)
{
cout << "\t\t"; for (int k=1; k<=largura; k++) cout << '\xDB';
cout << endl;
}
}

116
#include <iostream>
#include <cstdlib>
using namespace std;
float somasqr(float m, float n); // Prottipo
float sqr(float z); // Prottipo
float soma(float m, float n); // Prottipo
int main()
{
float a,b; cout << "Digite dois numeros ";
cin >> a >> b;
cout << "A soma dos quadrados e " << somasqr(a,b) << endl;
system("PAUSE"); return 0;
}
float somasqr(float m, float n)
{
return soma( sqr(m), sqr(n) );
}
float sqr(float z)
{ return z*z; }
float soma(float m, float n)
{ return m+n; }

117
#include <iostream>
#include <cstdlib>
using namespace std;
void linha (int n = 20, char ch = '*'); // Prottipo
int main()
{
linha(); cout << endl;
linha(34); cout << endl;
linha(45,'='); cout << endl;
system("PAUSE"); return 0;
}
// linha() Desenha uma linha na tela
void linha(int n, char ch)
{
for(int i=0; i<n; i++) cout << ch;
}
/* linha( , '+'); no funciona, pois se um argumento omitido, todos os
subsequentes devero s-lo*/
/*aps a primeira especificao com valor default todos os parmetros
seguintes devem ser especificados com valores default*/

118
#include <iostream>
#include <cstdlib>
using namespace std;
int cubo (int); //Prottipos
float cubo (float); //isso se chama sobrecarga de funo
double cubo (double); //ou polimorfismo paramtrico ou template
int main()
{
cout << cubo(876) << endl;
cout << cubo(12.34) << endl;
cout << cubo(double(4567.35)) << endl;
system("PAUSE"); return 0;
}
int cubo (int n)
{ return n*n*n; }
float cubo (float n)
{ return n*n*n; }
double cubo (double n)
{ return n*n*n; }

119
Operador unrio de referncia &

Com o operador de referncia podemos montar novos


tipos de dados chamados de referncias
Referncia um outro nome para uma varivel j
existente
int n;
int& A = n;
Informam que A um outro nome para n. Toda

operao em qualquer um dos nomes tem o mesmo


resultado.
A referncia no uma cpia da varivel a que se
refere, a mesma varivel sob nomes diferentes
120
Operador unrio de referncia &
Um dos usos de referncias na passagem de argumentos para
funes
Os exemplos vistos at o momento passam argumentos por valor
Quando argumentos so passados por valor, a funo chamada
cria variveis e copia nelas o valor dos argumentos passados
Dessa forma, a funo no tem acesso s variveis originais da
funo que chamou, portanto ela no poder efetuar qualquer
modificao nelas
A principal vantagem da passagem por referncia a de que a
funo pode acessar as variveis da funo que a chamou
Esse mecanismo possibilita que uma funo retorne mais de um
valor para a funo que chama. Os valores a serem retornados
so colocados em referncias de variveis da funo "chamadora"

121
#include <iostream> //Mostra passagem de argumentos por referncia
#include <cstdlib>
using namespace std;
void reajusta20( float& p, float& r);
int main()
{
float preco, val_reaj;
do
{
cout << "Insira o preco atual ou 0 para terminar: ";
cin >> preco; reajusta20(preco,val_reaj);
cout << "Preco novo = " << preco << endl;
cout << "Aumento = " << val_reaj << endl;
} while( preco != 0.0);
system("PAUSE"); return 0;
}
void reajusta20(float& p, float& r) //Reajusta o preo em 20%
{
r = p * 0.2; p = p * 1.2;
}
Sem a utilizao de referncias, como as informaes de novo preo e valor do reajuste seriam passadas para main?
O return s retorna um valor
No existem referncias em C, apenas em C++

122
#include <iostream>
#include <cstdlib>
using namespace std;
void troca(float& n, float& m);
int main()
{
float n1,n2,n3;
cout << "Digite tres numeros: ";
cin >> n1 >> n2 >> n3;
if(n1 > n2) troca(n1,n2);
if(n1 > n3) troca(n1,n3);
if(n2 > n3) troca(n2,n3);
cout <<"n1="<<n1<<'\t'<<"n2="<<n2<<'\t'<<"n3="<<n3<<endl;
system("PAUSE"); return 0;
}
void troca(float& n, float& m)
{
float temp=n; n = m; m = temp;
}

123
Operador unrio de referncia &
A palavra-chave const pode ser combinada com a
declarao de uma referncia
int n=456
const int& A=n;
Essas declaraes fazem de A um nome "somente
leitura" para n
Nenhuma modificao poder ser feita em A,
somente em n
utilizado quando a funo no necessita alterar
as variveis enviadas como argumentos
O uso de referncias constantes um meio de
economia de memria

124
#include <iostream>
#include <cstdlib>
using namespace std;
void linha(int); void linha(char); void linha(void);
void linha(int, char); void linha(char, int);
int main()
{
linha(); cout << endl; linha(34); cout << endl;
linha(45, '='); cout << endl; linha('+'); cout << endl;
system("PAUSE"); return 0;
}
void linha(int n)
{ for(int i=0; i<n; i++) cout << '*';}
void linha(char ch)
{ for(int i=0; i<20; i++) cout << ch;}
void linha()
{ for(int i=0; i<20; i++) cout << '*';}
void linha(int n, char ch)
{ for(int i=0; i<n; i++) cout << ch;}
void linha(char ch, int n)
{ for(int i=0; i<n; i++) cout << ch;}

125
#include <iostream>
#include <cstdlib>
using namespace std;
void mover(int n, char Orig, char Temp, char Dest);
int main()
{ cout << "Sendo D a haste de Destino e T a Temp.\n");
mover(3, '0', 'T', 'D'); system("PAUSE"); return 0;
}
void mover(int n, char Orig, char Temp, char Dest)
{
if(n==1)
cout<<"Mova o disco 1 da haste " << Orig
<<" para a haste " << Dest << endl;
else
{
mover(n-1,Orig,Dest,Temp);
cout<<"Mova o disco " << n << " da haste " <<
Orig <<" para a haste " << Dest << endl;
mover(n-1,Temp,Orig,Dest);
}
}

126
Exerccio
Escreva uma funo que receba um ano como argumento e retorne dia e ms
em que cai o feriado da Pscoa. Escreva uma funo para cada um dos dados
relativos ao clculo da data. O algoritmo o seguinte:
A=Ano%19
B=Ano/100
C=Ano%100
D=B/4
E=B%4
F=(B+8)/25
G=(B-F+1)/3
H=(19*A+B-D-G+15)%30
I=C/4
K=C%4
L=(32+2*E+2*I-H-K)%7
M=(A+11*H+22*L)/451
Mes=(H+L-7*M+114)/31
Dia=((H+L-7*M+114)%31)+1

127
Exerccio
Utilize a funo do exerccio anterior e
escreva funes que retornem os feriados
mveis
Sexta-feira Santa: Data da Pscoa - 2
Tera-feira de Carnaval: Data da Pscoa - 47
Corpus Christi: Data da Pscoa + 60

128
Matrizes

Tipo de dado em C++ usado para


representar uma coleo de variveis de
mesmo tipo e compartilham o mesmo
nome
Imagine o algoritmo a seguir, porm, com
50 ou 2000 alunos?

129
#include <iostream>
using namespace std;
int main()
{
int nota0, nota1, nota2, nota3;
cout << Digite a nota do aluno 1 ; cin >> nota0;
cout << Digite a nota do aluno 2 ; cin >> nota1;
cout << Digite a nota do aluno 3 ; cin >> nota2;
cout << Digite a nota do aluno 4 ; cin >> nota3;
float media=(nota0+nota1+nota2+nota3)/4;
cout << Media das notas: << media << endl;
return 0;
}

130
Declarao de Matrizes

Uma matriz um conjunto de variveis de


mesmo tipo, referidas por um nico nome,
em que cada varivel diferenciada por
meio de um nmero denominado ndice
Declarao:
int notas[5];
Aloca memria para cinco variveis do tipo int e
anuncia que notas uma matriz de cinco
elementos

131
#include <iostream>
using namespace std;
int main()
{
int notas[5]; float media=0;
for( int i=0; i < 5 ; i++)
{
cout << Digite a nota do aluno << (i+1) << :
;
cin >> notas[i];
media += notas[i];
}
media/=5;
cout << Media das notas: << media << endl;
return 0;
}

132
Declarao de Matrizes

necessrio declarar matrizes, como


quaisquer outras variveis, para conhecer
o tipo dos elementos e reservar espao
de memria para armazenamento
int notas[5]
Informa que a matriz notas formada por
cinco elementos do tipo int

133
Referenciando Itens de Matrizes

Cada um dos elementos da matriz


referido individualmente por meio de um
nmero inteiro, entre colchetes. Esta a
posio do elemento na matriz
notas[2] = 90;
Atribui o valor 90 ao terceiro elemento da
matriz, pois a numerao comea em zero

134
//Altere para receber quantas notas o usurio quiser
//O usurio escolhe quantos alunos sero digitados
#include <iostream>
using namespace std;
int main()
{
float notas[5]; float media=0;
for( int i=0; i < 5 ; i++)
{
cout << Digite a nota do aluno << (i+1) << :
;
cin >> notas[i]; media += notas[i];
}
media/=5;
cout << Media das notas: << media << endl;
return 0;
}
135
//Altere para receber quantas notas o usurio quiser
//Quando a nota for negativa, a mdia ser calculada
#include <iostream>
using namespace std;
int main()
{
float notas[5]; float media=0;
for( int i=0; i < 5 ; i++)
{
cout << Digite a nota do aluno << (i+1) << :
;
cin >> notas[i]; media += notas[i];
}
media/=5;
cout << Media das notas: << media << endl;
return 0;
}
136
Limites de Matrizes

A linguagem C++ no realiza verificao


de limites em matrizes, por isso, nada
impede que v alm do fim de uma matriz
Se voc transpuser o fim da matriz,
durante uma operao de atribuio, os
valores sobressalentes sobreporo outros
dados da memria
Nenhuma mensagem de erro do compilador
avisar o que est ocorrendo
137
Inicializando Matrizes

Pode-se fornecer valores a cada


elemento da matriz na mesma instruo
de sua declarao
A lista de valores colocada entre chaves e
os valores so separados por vrgulas. Estes
so atribudos na sequncia em que so
escritos
int diaspormes[12] = {31, 28, 31, 30, 31, 30, 31,
31, 30, 31, 30, 31}
if(bissexto(ano)==1) diaspormes[1]=29;

138
Inicializando Matrizes

Qual a dimenso da seguinte matriz?


int diaspormes[] = {31, 28, 31, 30, 31,
30, 31, 31, 30, 31, 30, 31}
Se nenhum nmero for fornecido para dimensionar
a matriz, o compilador contar o nmero de valores
inicializadores e o fixar como dimenso da matriz
Se especificar a dimenso da matriz e colocar
menos inicializadores que esse tamanho, os
elementos no inicializados contero zeros

139
Matrizes de mais de uma
dimenso
Para ilustrar esse conceito, ser
apresentado um jogo da velha

140
unsigned char m[3][3]; const int TRUE =1; const char 0=o, X=x;
cout << Digite coordenadas na forma lin col : << endl;
int lin,col,j=0;
for(lin=0;lin<3;lin++)
for(col=0;col<3;col++)
m[lin][col]=.;
while(TRUE)
{ for(lin=0;lin<3;lin++)
{ for(col=0;col<3;col++)
cout << m[lin][col] << ;
cout << endl;
}
if((m[0][0]==0 && m[0][1]==0 && m[0][2]==0)||
(m[1][0]==0 && m[1][1]==0 && m[1][2]==0)||
(m[2][0]==0 && m[2][1]==0 && m[2][2]==0)||
(m[0][0]==0 && m[1][0]==0 && m[2][0]==0)||
(m[0][1]==0 && m[1][1]==0 && m[2][1]==0)||
(m[0][2]==0 && m[1][2]==0 && m[2][2]==0)||
(m[0][0]==0 && m[1][1]==0 && m[2][2]==0)||
(m[0][2]==0 && m[1][1]==0 && m[2][0]==0))
{ cout << \nVoce ganhou, primeiro jogador!\n;break;} 141
if((m[0][0]==X && m[0][1]==X && m[0][2]==X)||
(m[1][0]==X && m[1][1]==X && m[1][2]==X)||
(m[2][0]==X && m[2][1]==X && m[2][2]==X)||
(m[0][0]==X && m[1][0]==X && m[2][0]==X)||
(m[0][1]==X && m[1][1]==X && m[2][1]==X)||
(m[0][2]==X && m[1][2]==X && m[2][2]==X)||
(m[0][0]==X && m[1][1]==X && m[2][2]==X)||
(m[0][2]==X && m[1][1]==X && m[2][0]==X))
{ cout << \nVoce ganhou, segundo jogador!\n;break;}
if(j==9)
{cout << Empatou! << endl; break;}
cout << Coordenadas: << endl;
cin >> lin >> col;
if(m[lin][col] == .)
{ if(j%2) m[lin][col]=X;
else m[lin][col]=0
j++;
}
}
system(PAUSE); return 0;
142
Digite coordenadas na forma lin col:
. . .
. . .
. . .
Coordenadas: 0 0
o . .
. . .
. . .
Coordenadas: 0 1
o x .
. . .
. . .
Coordenadas: 1 1
o x .
. 0 .
. . .
Coordenadas: 0 2
o x x
. 0 .
. . .
143
Inicializando Matrizes com mais
de uma dimenso
unsigned char m[3][3]= {{o,x,x},{.,o,.},{.,.,o}}
int tresdimensoes[3][2][4]=
{
{
{1,2,3,4},
{5,6,7,8}
},
{
{7,9,3,2},
{4,6,8,3}
},
{
{7,2,6,3},
{0,1,9,4}
}
}; //tresdimensoes[2][1][0] == 0 144
Matrizes como argumento de
funes
#include <iostream>
using namespace std;
const TAMANHO = 50;
float media(float lista[], int tamanho);
int main()
{
float notas[TAMANHO]; int i=0;
do{
cout << Digite a nota do aluno << (i+1) << : ; cin >>
notas[i];
} while( notas[i++] >= 0.0);
i--; float m=media(notas,i);
cout << Media das notas: << m << endl; return 0;}
//Calula a mdia dos valores da matriz
float media(float lista[], int tamanho)
{ float m=0.0; for(int i=0; i<tamanho; i++) m+=lista[i];
return m/tamanho; } 145
Matrizes como argumento de
funes
O nome de uma matriz, desacompanhado
de colchetes, representa o endereo de
memria onde a matriz foi armazenada

146
#include <iostream>
using namespace std;
const TAMANHO = 50
void ordena(int[], int);
int main()
{
int Tab[TAMANHO];
for(int i=0; i<TAMANHO; i++)
{ cout << Digite nmero ou zero para terminar: ;
cin >> Tab[i];
if( !Tab[i] ) break;
}
ordena(Tab, i);
for(int j=0; j < i; j++)
cout << Tab[j] << endl; return 0;
}
void ordena (int lista[], int tamanho)
{ for(int i=0; i < tamanho - 1; i++)
for(int j=i+1; j < tamanho; j++)
if(lista[i] > lista[j])
{ int temp = lista[j]; lista[j]=lista[i]; lista[i]=temp;}
147
}
Strings

Toda string finalizada com \0 (NULL)


Leitura de Strings
cin >> variavel;
L at o primeiro espao ou ENTER
cin >> setw(7) >> variavel;
L at 6 caracteres + \0
gets(variavel);
L at ENTER
#include<stdio.h>
sempre colocar fflush(stdin) antes

148
Inicializao de Strings

char nome[]={A, n, a,
\0};
char nome[]= Ana;

149
Funes para Strings
#include <cstring>
#include <stdio.h>
strlen(variavel)
Retorna o tamanho de uma string
strcat(var1, var2)
Acrescenta uma cadeia de caracteres ao final de
outra (var1=var1+var2 e var2 no altera)
strcmp(var1, var2)
Compara duas cadeias de caracteres (retorna -1 se
var1<var2; retorna 0 se var1==var2; retorna 1 se
var1>var2)
strcpy(var1, var2)
Copia o contedo da segunda string na primeira
150
Funes para Strings

strncat() strncmp() strncpy()


So semelhantes s anteriores, porm,
recebem um argumento a mais: o nmero de
caracteres
strncat() concatena n caracteres da
segunda cadeia na primeira
strncmp() compara n caracteres das
cadeias
strncpy() copia n caracteres da segunda
cadeia na primeira
151
#include <iostream>
#include <conio.h>
using namespace std.
int dsemana( int dia, int mes, int ano);
int main()
{ char diasemana[7][14] = {Domingo, Segunda-feira, Tera-feira,
Quarta-feira, Quinta-feira, Sexta-feira, Sbado};
int dia,mes,ano;
const char ESC = 27;
do{
cout << Digite a data na forma dd mm aaaa: ;
cin >> dia >> mes >> ano;
cout << diasemana [ dsemana(dia,mes,ano)] << endl;
}while(getch()!=ESC); return 0;
}
int dsemana( int dia, int mes, int ano) // retorna 0-dom, 1-seg, 2-ter...
{ int dSemana = ano + dia + 3 * (mes - 1) - 1;
if(mes<3) ano --;
else dSemana -= int(0.4*mes+2.3);
dSemana += int(ano/4) - int((ano/100 + 1)*0,75);
dSemana %= 7; return dSemana; }
152
Classes de armazenamento
Todas as variveis de funes C++ tm um tipo e uma
classe de armazenamento
A classe de armazenamento de uma varivel determina
em que momento ser criada e em que momento ser
destruda, em quais pontos do programa poder ser
acessada, em que parte da memria ser armazenada e
qual ser seu valor inicial
So quatro as classes de armazenamento em C++
auto
extern
static
register

153
Classes de armazenamento
Classe auto

As variveis utilizadas em todos os


exemplos e exerccios at ento esto
confinadas nas funes que as utilizam, ou
seja, so visveis e acessveis somente s
funes em que esto declaradas
Tais variveis so da classe auto

A classe auto default, ou seja, no

necessita ser especificada

154
Classes de armazenamento
Classe auto

As variveis da classe auto so criadas


em tempo de execuo (na sua declarao)
e destrudas ao trmino da execuo do
bloco ao qual pertencem
Quando uma varivel automtica criada,

o programa no inicializa com nenhum valor


especfico. Variveis automticas contero
um valor inicial aleatrio ("lixo")

155
Classes de armazenamento
Classe auto

int main()
{
int n;
...
}
equivalente a
int main()
{
auto int n;
...
}
156
Classes de armazenamento
Classe extern

As variveis externas so declaradas fora de


qualquer funo
O acesso a elas permitido a todas as
funes do programa, e elas existiro enquanto
o programa estiver em execuo
As variveis da classe extern so criadas em
tempo de compilao, especificamente quando
o programa estiver sendo compilado, e so
inicializadas com zero por falta de inicializao
explcita
157
Classes de armazenamento
Classe extern
#include <iostream>
#include <cstdlib>
using namespace std;
//Variveis da classe extern
int i; // Inicializada com zero
int j=234; // Inicializada com 234
void func(void); // Prottipo
int main()
{
cout << i << '\t' << j << endl; func(); cout << i << '\t' << j << endl;
system("PAUSE");
return 0;
}
void func()
{
i=25; j=48;
}

158
Classes de armazenamento
Classe extern
#include <iostream>
#include <cstdlib>
using namespace std;
//Variveis da classe extern
int i; //Inicializada com zero
int j=234; //Inicializada com 234
int main()
{
int i=5, j=10; //Variveis automticas
cout << i << '\t' << j << endl;
system("PAUSE");
return 0;
}
O que este programa imprime?

159
Classes de armazenamento
Classe extern
O operador de escopo ::

As variveis automticas tm precedncia sobre as variveis externas


O exemplo anterior imprimir 5 e 10
Podemos solicitar ao compilador que utilize as variveis externas no lugar das
automticas colocando o operador :: antes do nome da varivei
//Variveis da classe extern
int i; //Inicializada com zero
int j=234; //Inicializada com 234
int main()
{
int i=5, j=10; //Variveis automticas
cout << ::i << '\t' << ::j << endl;
cout << i << '\t' << j << endl;
system("PAUSE"); return 0;
}

160
Classes de armazenamento
Classe extern

A palavra extern no usada para criar


variveis da classe extern, e sim para informar
ao compilador que a varivel em questo foi criada
em outro programa compilado separadamente e
que ser ligado a esse para formar o programa
final
Se uma varivel externa criada em outro
programa for usada em seu fonte, o compilador
apresentar uma mensagem de erro e no
compilar seu programa, caso no seja utilizada a
palavra extern

161
Classes de armazenamento
Classe extern
Alm de passar argumentos por referncia para uma funo, uma referncia a uma varivel
externa pode ser usada como valor retornado de uma funo
//Mostra o retorno por referncia
#include <iostream>
#include <cstdlib>
using namespace std;
int x; int& initx(void);
int main()
{ initx() = 567; //Atribui um valor a x
cout << x << endl;
system("PAUSE); return 0;
}
int& initx()
{ return x;
}

162
Classes de armazenamento
Classe static

Se assemelham s automticas, pois so


conhecidas somente das funes que as
declaram, e de outro lado se assemelham
s externas, pois mantm seus valores
mesmo quando a funo termina
So criadas em tempo de compilao e so

inicializadas com zero por falta de


inicializao explcita

163
Classes de armazenamento
Classe static
#include <iostream>
#include <cstdlib>
using namespace std;
int soma(void);
int main()
{
cout << soma() << endl;
cout << soma() << endl;
cout << soma() << endl;
system("PAUSE"); return 0;
}
int soma()
{
static int k;
k++;
return k;
}

164
#include <iostream>
#include <cstdlib>
using namespace std;
unsigned randn(void);
int main()
{
for(int i=0; i<5; i++)
cout << randn() << endl;
system("PAUSE"); return 0;
}
unsigned randn()
{
static unsigned semente =1;
semente=(semente*25173 + 13849)%65536;
return semente;
}
/*ao rodar o programa, sempre gera os mesmos valores, como fazer para
gerar um novo nmero "aleatrio"?*/

165
Classes de armazenamento
Classe static extern

Cria um mecanismo de "privacidade"


Uma varivel desse tipo tem as mesmas
propriedades de uma varivel externa,
exceto pelo fato de que variveis externas
podem ser usadas em qualquer parte do
programa, enquanto variveis estticas
externas somente podem ser acessadas
pelas funes do mesmo programa-fonte e
definidas abaixo de suas declaraes

166
Classes de armazenamento
Classe static extern
#include <iostream>
#include <cstdlib>
using namespace std;
unsigned randn(void);
void inits(int n);
int main()
{
int s; cout << "Digite a sua semente: "; cin >> s; inits(s);
for(int i=0; i<5; i++)
cout << randn() << endl;
system("PAUSE"); return 0;
}
static int semente;
unsigned randn()
{ static unsigned semente =1; semente=(semente*25173 + 13849)%65536;
return semente; }
void inits(int n)
{ semente=n; }

167
Classes de armazenamento
Toda funo em C++ da classe extern
(visvel a todas as outras)
Toda funo, alm de extern, pode ser

static (acessvel apenas s funes do


mesmo programa-fonte definidas abaixo
dela)

168
Classes de armazenamento
Classe register

Indica que a varivel associada deve ser guardada


fisicamente em uma memria de acesso muito mais
rpido chamada de registrador, se possvel
Pode armazenar um int ou um char
Podem ser declaradas quantas variveis register
forem necessrias, pois o computador ignora a
palavra register se os registradores estiverem
ocupados ou se o ambiente no permitir
Fortes candidatas: variveis de laos e argumentos
de funes

169
Classes de armazenamento
Classe register
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
int main()
{ int i,j; register int m,n; double t; t=clock();
for(j=0;j<50000;j++)
for(i=0;i<50000;i++)
;
cout << "Tempo dos lacos nao register " << (clock()-t) << endl;
t=clock();
for(m=0;m<50000;m++)
for(n=0;n<50000;n++)
;
cout << "Tempo dos lacos register " << (clock()-t) << endl;
system("PAUSE"); return 0;
}

170
Operaes com arquivos

Objetos ou arquivos stream


stream = "fluxo de bytes"
So o ponto central das classes iostream
Exemplos de arquivos
Disco
Teclado (cin)
Vdeo (cout)
Impressora
Portas de comunicao

171
Operaes com arquivos

iostream
Classe usada para impresso em vdeo e
leitura do teclado
fstream
Classe usada para leitura e gravao em
discos
strtream e stdiostr.h
Classe usada para manipulao de bytes na
memria

172
Escrita em arquivos
//Grava strings em arquivo
#include <fstream> //Para as classes de arquivos
using namespace std;
int main()
{
ofstream fout("Teste.txt"); //Cria arquivo em modo
texto
fout << "Esta uma msg que ser gravada no" << endl;
fout << "arquivo. Agora, este texto ser" << endl;
fout << "impresso na mesma linha ou em" << endl;
fout << "quatro linhas distintas?" << endl;
return 0;
}
173
Escrita em arquivos

Foi declarado o objeto fout


Utiliza-se o construtor que inicializa esse objeto
com o nome do arquivo Teste.txt
Aps essa declarao, o arquivo Texte.txt
criado. Se ele j existir, ele ser substitudo
por um arquivo em branco
A inicializao associa o objeto fout ao
arquivo em disco Teste.txt para gravao
Quando o programa termina, o destrutor do
objeto chamado e fecha o arquivo
174
Leitura em arquivos
//L linha a linha do arquivo
#include <fstream> //Para classes de arquivos
#include <iostream> // Para cout
using namespace std;
int main()
{
const int Max=80; char buff[Max];
ifstream fin("Teste.txt"); //Cria obj para leitura de texto
while(! fin.eof()) //Enquanto no terminou o arquivo
{
fin.getline(buff,Max); //L uma linha de texto
cout << buff << endl;
} return 0;
}
175
Leitura em arquivos

Criou-se um objeto da classe ifstream de nome fin


e associa-se esse objeto ao arquivo Teste.txt, criado
no exemplo anterior
Leu-se o arquivo, uma linha por vez, usando o mtodo
getline()
Aceita um terceiro argumento, o valor default ser o caractere '\n'
No exemplo, leu-se caracteres enquanto no encontra o '\n', e
coloca os caracteres lidos na matriz buff
O tamanho mximo da matriz informado no segundo argumento
Se fosse colocado o operador >> ao invs da funo
getline, a funo entenderia o espao em branco
como o fim do arquivo
fin.getline(buff,Max); // fin >> buf;

176
Leitura em arquivos

O fin.getline() pode ser usado da


seguinte maneira:
fin.getline(vetor_char, tamanho, ;)
vetor_char a varivel que ir receber o contedo lido do
arquivo
tamanho a varivel (ou pode ser um nmero) que indica
quantos caracteres sero lidos do arquivo e passados para o
vetor_char
; o separador, ou seja, o getline() ir ler, at tamanho
caracteres ou quando encontrar um ;
12345;Nome e Sobrenome;0123456789
Ao executar o comando, o vetor_char receber
12345 e, a prxima vez que executar, ir receber
Nome e Sobrenome, parando sempre no ;
177
Leitura em arquivos

Toda vez que efetuada a leitura de


arquivo, a varivel que receber deve um
char, pois em um arquivo somente tem
caracteres.
Se o contedo lido de um arquivo for
utilizado para operaes aritmticas
(nmeros), a varivel lida dever ser
convertida de char para int, por
exemplo
178
Converso de char para int

char tmp[255];
int t=0;
fin.getline(tmp, 255);
t = atoi(tmp); //transforma char em int
/*para usar a funo atoi precisa incluir o
arquivo cstdlib
Esta funo converte um vetor de caracteres
para um nmero inteiro. Por exemplo: 123
cento e vinte e trs, e no os trs
algarismos separados*/

179
Detectando o fim de arquivo

Mtodos
eof()
Verdadeiro se encontrado o fim do arquivo
while(fin.good())
Enquanto nenhum erro for encontrado
while(fin)
Enquanto nenhum erro for encontrado
while(fin.getline(buff,Max))

180
Lendo e gravando em arquivo

Para trabalhar um caractere por vez,


utiliza-se os mtodos put() e get()
Exemplo de leitura de um caractere por
vez e gravao no arquivo

181
Lendo e gravando em arquivo
//Grava um caractere por vez num arquivo
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ofstream fout("Teste1.txt");
char ch;
while (cin.get(ch)) //enqto no press. CTRL+Z
fout.put(ch); //grava caractere ch no arquivo
return 0;
}

182
Lendo e gravando em arquivo

Este programa l comando CRTL+Z, que


tem o cdigo \x1A, que indica fim de
arquivo
Para ler o arquivo Teste1.txt, um
caractere por vez, da seguinte maneira

183
Lendo e gravando em arquivo
//L um caractere por vez de um arquivo
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream fin("Teste1.txt");
char ch;
while (fin.get(ch)) //enqto no EOF, l arquivo
cout.put(ch); //escreve o caracter na tela
return 0;
}

184
Modo texto e modo binrio

Cada arquivo lido e gravado de acordo com o


seu contedo
Trs diferenas entre trabalhar com texto ou
binrio
O caractere \n: em texto, o \n convertido para dois
bytes e em modo binrio no
O caractere \x1A: em texto interpretado como fim do
arquivo e em binrio mais um caractere do arquivo
Nmeros: em binrio, so gravados ou lidos exatamente
como se apresentam na memria. Exemplo: 12345
armazenado na memria como short int, ocupando 2
bytes e em modo texto, 5 bytes
185
Modo texto e modo binrio
//Conta caracteres de arquivo em modo texto
#include <fstream>
#include <iostream>
#include <cstdlib> //para o exit()
using namespace std;
int main(int argc, char **argv)
{
ifstream fin; char ch; int cont=0;
if(argc != 2)
{ cout << Forma de uso: C:\\>FileCont nomearq << endl; exit(1); }
fin.open(argv[1]);
while (fin.get(ch)) cont++;
cout << O tamanho do arquivo e << cont << endl; return 0;
}

186
Modo texto e modo binrio
//Conta caracteres de arquivo em modo binrio
#include <fstream>
#include <iostream>
#include <cstdlib> //para o exit()
using namespace std;
int main(int argc, char **argv)
{
ifstream fin; char ch; int cont=0;
if(argc != 2)
{ cout << Forma de uso: C:\\>FileCont nomearq << endl; exit(1); }
fin.open(argv[1], ios::binary); /*mostrar o mesmo tamanho do arquivo
que o DOS mostra*/
while (fin.get(ch)) cont++;
cout << O tamanho do arquivo e << cont << endl; return 0;
}

187
Comandos importantes

fio.seekg(0);
Ao trmino da gravao de um arquivo, se desejamos ler o
arquivo inteiro, do incio (representado pelo 0), devemos
modificar a posio de leitura corrente do arquivo para o seu
incio
fio.seekp(0);
Executa a mesma tarefa do seekg, porm para a posio
corrente de gravao
eof()
Verdadeiro se encontrado o fim do e arquivo
fail()
Verdadeiro se erro de leitura ou gravao
rewind()
Posiciona o arquivo no incio
188
Exerccio

1. Escreva um programa que verifique se,


em um texto de um arquivo, o nmero de
chaves abertas e fechadas igual.
2. Escreva um programa que verifique e
some todos os algarismos de um arquivo
e escreva, em um arquivo denominado
resposta.txt o resultado da soma
dos nmeros pares menos a soma dos
mpares.
189
Pr-processador
O pr-processador C++ um programa que
examina o programa-fonte em C++ e
executa certas modificaes nele antes da
compilao, com base nas instrues
chamadas de diretivas
So usadas para tornar o programa-fonte
mais claro e fcil de manter

190
Pr-processador
Diretivas mais comuns
#define #undef #include #if
#ifdef #ifndef #else #elif
#endif #error
Podem ser colocadas em qualquer lugar do
programa, geralmente escritas no incio do
programa, e so aplicadas do ponto em que
so escritas at o final do programa-fonte

191
Pr-processador
Diretiva #define
Usada para definir constantes com nomes apropriados
#include <iostream>
#include <cstdlib>
#define PI 3.14159265
using namespace std;
float area(float raio);
int main()
{ float raio;
cout << "Digite o raio de uma esfera: "; cin >> raio;
cout << "A area da esfera e de " << area(raio) << endl;
system("PAUSE"); return 0;
}
float area(float raio)
{ return 4.0 * PI * PI * raio; }

192
Pr-processador
Diretiva #define
Quando o compilador encontra a diretiva #define, procura cada
linha abaixo dela a ocorrncia da palavra PI e a substitui por
3.14159265. O nome que se segue palavra #define
chamado de identificador
Por conveno, o identificador escrito em letras maisculas
No se pode escrever mais de uma diretiva em uma mesma linha
No h substituio dentro de cadeias de caracteres nem dentro
de comentrios
Podemos definir textos ou instrues completas com um nome
indicativo
#define ERRO cout <<"\nERRO!!"
...
if (DeuZebra)
ERRO;
...

193
Pr-processador
Diretiva #define

O qualificador const pode ser usado


para substituir definies de constantes
com #define
Principal vantagem: const representa uma
localizao de memria semelhante a uma
varivel e reconhecida pelo compilador (
reconhecida e interpretada pelo compilador,
enquanto a #define no reconhecida)

194
Pr-processador
Diretiva #define (macros)
#include <iostream>
#include <cstdlib>
#define PRN(n) cout << n << endl
using namespace std;
int main()
{
int n1,n2;
n1=1416;
n2=n1/2;
PRN(n1); //Chamada macro
PRN(n2);
system("PAUSE"); return 0;
}

195
Pr-processador
Diretiva #define (macros)
#include <iostream>
#include <cstdlib>
#define SOMA(x,y) x + y
using namespace std;
int main()
{
int z;
z= 10 * SOMA(3,4);
cout << z << endl;
system("PAUSE");
return 0;
}
// O que ser impresso? 70?

196
Pr-processador
Diretiva #define (macros)
#include <iostream>
#include <cstdlib>
#define PI 3.14159265
#define SQR(x) ((x)*(x))
#define AREA(x) ((4)*(PI)*SQR(x))
using namespace std;
int main()
{ float raio;
cout << "Digite o raio de uma esfera: ";
cin >> raio;
cout << "A area da esfera e " << AREA(raio) << endl;
system("PAUSE");return 0;
}

197
Pr-processador
Diretiva #undef
Remove a mais recente definio criada com #define
#define GRANDE 3
#define ENORME 8
#define SOMA(x,y) (x)+(y)
...
#undef GRANDE //Cancela a definio de GRANDE
#define ENORME 10 //ENORME agora vale 10
...
#undef ENORME //ENORME volta a valer 8
#undef SOMA //Cancela a definio de SOMA
No se deve colocar a lista de argumentos para remover
uma macro, somente o nome

198
Pr-processador
Diretiva #include

Causa a incluso de outro arquivo no programa-fonte


O compilador substitui a diretiva #include do
programa pelo contedo do arquivo indicado, antes
de compilar o programa
Quando usamos os sinais de < e >, o arquivo
procurado somente no diretrio INCLUDE. Quando
usamos aspas, o arquivo procurado primeiro no
diretrio atual e depois, se no encontrado, no
diretrio INCLUDE
Os arquivos de cabealho (ou arquivos de incluso)
podem ser criados e includos no programa-fonte por
meio da diretiva #include

199
Pr-processador
Diretiva #include
Arquivo "areas.h"
#include <iostream>
#include <cstdlib>
#define PI 3.14159265
#define SQR(x) ((x)*(x))
#define AREA(x) ((4)*(PI)*SQR(x))
Arquivo "main.cpp"
#include "areas.h"
using namespace std;
int main()
{ float raio;
cout << "Digite o raio de uma esfera: ";
cin >> raio;
cout << "A area da esfera e " << AREA(raio) << endl;
system("PAUSE"); return 0;
}

200
Exerccio

Tradutor.h

201
Pr-processador
Diretivas #if #ifdef #ifndef #elif #else #endif

Existem diretivas que permitem a compilao


condicional de um programa
Elas facilitam o desenvolvimento do programa e a
escrita de cdigos com maior portabilidade de uma
mquina para outra ou de um ambiente a outro
Cada diretiva #if deve terminar com a diretiva #endif
Entre #if e #endif pode ser colocado qualquer
nmero de #elif, mas somente uma nica #else
#else opcional, porm, se estiver presente, deve ser
a ltima antes da #endif

202
Pr-processador
Diretivas #if #ifdef #ifndef #elif #else #endif

#define DEBUG
...
#if DEBUG == 1
cout << "\nERRO = " << erro1;
#elif DEBUG == 2
cout << "\nERRO = " << erro2;
#else
cout << "\nERRO nao documentado";
#endif

203
Pr-processador
Diretivas #if #ifdef #ifndef #elif #else #endif
#if CORES > 5
#define SOMBRA 1
#if COR_FUNDO == 1
#include "corfundo.h"
#else
#include "semfundo.h"
#endif
#else
#define SOMBRA 0
#if CGA == 1
#include "cga.h"
#else
#include "mono.h"
#endif
#endif
204
Pr-processador
Diretivas #if #ifdef #ifndef #elif #else #endif

#define VERSAO_DEMO
...
#ifdef VERSAO_DEMO
#define NUM_REC 20
#else
#define NUM_REC MAXINT
#endif

205
Pr-processador
Diretivas #if #ifdef #ifndef #elif #else #endif

#ifndef WINDOWS
#define VERSAO "Versao Unix"
#else
#define VERSAO "Versao Windows"
#endif

/*#ifndef verifica a no definio


da constante*/

206
Pr-processador
Operador defined
Uma alternativa ao uso do #ifdef e #ifndef o
operador defined
#if defined(UNIX) && !defined(INTEL)
...
#endif
Diretiva #error
Provoca uma mensagem de erro do compilador em
tempo de compilao
#if TAMANHO > TAMANHO1
#error "Tamanho incompativel"
#endif

207
Struct

A linguagem C++ oferece 4 meios de


criao de tupos de dados
Matrizes
Estruturas
Unies
Classes
Os tipos de dados char, int, float,
double e void representam um nico
item de informao
208
Criando tipos de dados com struct

Por meio da palavra struct definimos


um novo tipo de dado
Significa informar ao compilador o seu nome,
tamanho e maneira de armazenamento e
recuperao

209
Criando tipos de dados com struct

//Aluno.cpp
//Cria uma estrutura para armazenar dados de um aluno
#include <iostream>
using namespace std;
struct Aluno
{ int nmat; //nmero de matrcula
float nota[3]; //notas
float media; //media
}
int main()
{ Aluno Jose; //declara varivel do tipo Aluno
Jose.nmat = 456; Jose.nota[0] = 7.5; Jose.nota[1] - 5.2;
Jose.nota[2] = 8.4;
Jose.media = (Jose.nota[0] + Jose.nota[1] + Jose.nota[2])/3.0;
cout << "Matricula: " << Jose.nmat << endl << "Media: " << Jose.media;
system("PAUSE"); return 0; 210
}
Definindo uma estrutura

Palavra-chave Nome do tipo

struct Aluno
Chaves {
int nmat;
float nota[3]; Membros
float media;
Chaves };
211
Definindo uma estrutura

A palavra struct indica que um novo tipo


de dado est sendo definido e a palavra
Aluno ser o seu nome
No exemplo, o tipo Aluno foi definido
antes da main(), o que permite um
acesso gloabal a todas as funes
definidas no programa
Estrutura (struct) um tipo de dado cujo
formato definido pelo programador
212
Declarando uma varivel do tipo
definido
A instruo
Aluno Jose;
declara uma varivel de nome Jose e do
tipo Aluno, ou seja, reserva espao de
memria suficiente para armazenar todos
os membros da estrutura
Observe a semelhana:
Aluno Jose;
int variavel; 213
Acessando os membros da estrutura

Utiliza-se o operador ponto


Jose.nmat = 456;
Atribui o valor 456 ao primeiro membro da
varivel Jose
O operador ponto conecta o nome de
uma varivel estrutura a uma membro
dela
Jose.nmat o nome de uma varivel do
tipo int e pode ser utilizada em todo lugar
onde podemos usar variveis do tipo int
214
Combinando declaraes

No exemplo anterior, definimos a


estrutura e declaramos a varivel em
duas instrues distintas
struct Aluno
{ int nmat;
float nota[3];
float media;
} Jose; //Declarao da varivel
215
Combinando declaraes

struct Aluno
{ int nmat;
float nota[3];
float media;
} Jose, Ana, Joao;
//Separados por vrgulas

216
Inicializando estruturas

Semelhante a matrizes
struct Data
{ int dia;
char mes[10];
int ano;
};
Data natal = {25,"Dezembro",2014};
Data aniversario = {01,"Janeiro",1990};

217
Atribuies entre estruturas

Data aniversario = {01,"Janeiro",1990};


Data Ana;
Ana = aniversario
Todos os valores dos membros da
estrutura esto sendo atribudos, de uma
nica vez, aos correspondentes membros
da outra estrutura

218
Operaes entre estruturas

struct Venda
{ int pecas;
float preco;
};
Venda A = {20, 110.0}, B = {3, 16.5},
Total
]
Total = A + B; //ERRADO
Total.pecas = A.pecas + B.pecas;
Total.preco = A.preco + B.preco.
219
Estruturas aninhadas

Semelhante ao fato de podermos ter


matrizes em que cada elemento outra
matriz, podemos definir estruturas com
membros que sejam outras estruturas

220
#include <iostream>
using namespace std;
struct Data
{ int dia; char mes[10]; int ano;
};
struct Venda
{ int pecas; float preco; Data diavenda;
}
int main()
{ Venda A={20,110.0,{7,"Novembro",2000} };
cout << "Pecas: " << A.pecas << endl;
cout << "Preco: " << A.preco << endl;
cout << "Data: " << A.diavenda.dia << " de " <<
A.diavenda.mes << " de " << A.diavenda.ano << endl;
system("PAUSE"); return 0;
}
221
Estruturas aninhadas

Adicionamos um membro do tipo Data


estrutura Venda, e criamos uma varivel
A do tipo Venda
A varivel A tem trs membros, sendo
que um deles uma estrutura do tipo
Data, portanto A.diavenda o nome
de uma varivel estrutura do tipo Data

222
Inicializando estruturas aninhadas

Venda A = {20, 110.0, {7, "Novembro",2000} };


Observe que o membro diavenda, por ser
uma estrutura, inicializado colocando seus
membros entre chaves e separando-os por
vrgulas

223
Estruturas e funes

Podem ser passadas como argumento de


funes da mesma maneira que variveis
simples

224
#include <iostream>
using namespace std;
struct Venda
{ int pecas; float preco
};
void listavenda( Venda C, venda D);
int main()
{ Venda A,B;
cout << "Insira as pecas e o preco da Venda A";
cin >> A.pecas >> A.preco;
cout << "Insira as pecas e o preco da Venda B";
cin >> B.pecas >> B.preco;
listavenda(A,B); //Estruturas como argumento
cout << endl; system("PAUSE"); return 0;
} //continua no prximo slide

225
void listavenda(Venda C, Venda D)
{ cout << "\n\nVenda total";
cout << "\nTotal de pecas: " << (C.pecas+D.pecas);
cout << "\nPreco total : " << (C.preco+D.preco);
}
Sada do programa:
Insira as pecas e o preco da Venda A: 58
123.4
Insira as pecas e o preco da Venda B: 350
45678.9

Venda Total
Total de Pecas: 408
Preco total : 45802.3

226
Estruturas e funes

A funo cria novas variveis C e D para


conter cpia dos valores das variveis A e
B de main(), enviadas como argumento,
como faria com qualquer tipo de variveil
simples passada por valor
Ento, as variveis C e D no so as
mesmas das de main() a funo poderia
alter-las sem, contudo, alterar as
originais
227
Estruturas e funes

A sintaxe da passagem de estrutura para


funes por referncia a mesma da
passagem de variveis simples por
referncia
void listavenda(Venda& C, Venda& D)
{ cout << "\n\nVenda total";
cout << "\nTotal de pecas: " <<
(C.pecas+D.pecas);
cout << "\nPreco total : " <<
(C.preco+D.preco);
}
228
Estruturas e funes

Pode-se retornar uma estrutura a partir


de funes, como uma varivel simples
Venda novavenda() //note que do tipo Venda
{ Venda X; //Venda uma estrutura
cout << "Insira o numero de pecas: ";
cin >> X.pecas;
cout << "Insira o preco: ";
cin >> X.preco;
return X; //Retorna uma estrutura
}

229
Matrizes de estruturas

Uma lista de peas e preos composta por


vrias vendas
Cada venda descrita por uma varivel do
tipo Venda
Para tratar de vrias vendas,
perfeitamente correto pensar em uma matriz
de estruturas
O exemplo a seguir cria uma matriz de
estruturas em que cada elemento da matriz
representa uma venda
230
#include <iostream>
#include <iomanip>
#include <cstdlib> //Para o atoi(), atof() e exit()
#include <cstdio> //Para o gets
#include <conio.h> //Para getch
using namespace std;
struct Data
{ int dia; char mes[10]; int ano; };
struct venda
{ Data diavenda; int pecas; float preco; };
void listavenda(void);
void novavenda(void);
Venda vendas[50];//Cria a matriz de estruturas
Venda Total={{0,"",0}0,0,0};//Cria varivel tipo Venda
int n=0; const TRUE=1; const char ESC=27;
//continua no prximo slide 231
int main()
{ char ch;
while(TRUE)
{ cout << "Digite E para entrar numa venda"<< endl;
cout << " L para listar as vendas" << endl;
cout << " ESC para terminar"<<endl;
ch=getch();
switch(ch)
{ case 'E':
novavenda();
break;
case 'L':
listavenda();
break;
case ESC: exit(0);
//continua no prximo slide 232
default:
cout << "Opcao invalida!!" << endl;
}//fecha chaves do switch
}//fecha chaves do while
system("PAUSE"); return 0;
}//fecha chaves da main
void novavenda()
{ char temp[80]; cout << "Dia: "; fflush(stdin);
gets(temp); vendas[n].diavenda.dia=atoi(temp);
cout << "Mes: "; fflush(stdin);
gets(vendas[n].diavenda.mes); cout << "Ano: ";
fflush(stdin); gets(temp);
vendas[n].diavenda.ano=atoi(temp);
cout << "Pecas: "; gets(temp);
vendas[n].pecas=atoi(temp);
//continua no prximo slide 233
cout << "Preco: "; gets(temp);
vendas[n].preco=atof(temp);//converte para float
Total.pecas += vendas[n].pecas;
Total.preco += vendas[n].preo;
n++;
}
void listavenda()
{ if(!n)
{ cout << "Lista vazia"

234