Você está na página 1de 23

SERVIO PBLICO FEDERAL

MINISTRIO DA EDUCAO
CENTRO FEDERAL DE EDUCAO TECNOLGICA DE MINAS GERAIS










Prof. Cristiano Amaral Maffort











Curso Bsico de
C++




























Av. Amazonas 7675 - Nova Gameleira - Belo Horizonte - MG
Sumrio
Captulo 1: Conceitos bsicos da linguagem C++............................................................................. 3
1.1. C++ Standard Library............................................................................................................ 3
1.2. Ambiente de desenvolvimento C++ tpico............................................................................. 3
1.3. Estrutura bsica de um programa ........................................................................................ 4
1.4. Armazenamento de dados e programas na memria .......................................................... 4
1.5. Bibliotecas................................................................................................................................ 5
1.6. Verificao e validao ........................................................................................................... 5
Captulo 2: Estruturas seqenciais, entrada/sada de dados............................................................. 6
2.1. Variveis .................................................................................................................................. 6
2.1.1. Tipos bsicos...................................................................................................................... 6
2.1.2. Declarao de variveis ..................................................................................................... 6
2.1.3. Variveis com valores indefinidos..................................................................................... 7
2.2. Constantes................................................................................................................................ 7
2.3. Operadores .............................................................................................................................. 8
2.3.1 Operadores Aritmticos ...................................................................................................... 8
2.3.2. Operadores de atribuio ................................................................................................... 8
2.3.3. Operadores relacionais....................................................................................................... 8
2.3.4.Operadores lgicos.............................................................................................................. 9
2.5. Comando de entrada e sada.................................................................................................. 9
2.6. Exerccios ............................................................................................................................... 10
Captulo 3: Abstrao de controle .................................................................................................... 11
3.1. Operador lgico condicional ................................................................................................ 11
3.2. Operador de seleo.............................................................................................................. 12
3.3. Operador de repetio.......................................................................................................... 12
3.3.1. Repetio com teste no incio .......................................................................................... 12
3.3.2. Repetio com varivel de controle no lao .................................................................... 12
3.3.3. Repetio com teste no fim.............................................................................................. 13
3.4. Exerccios ............................................................................................................................... 13
Captulo 4: Abstrao de Dados ....................................................................................................... 15
4.1. Variveis compostas homogneas........................................................................................ 15
4.1.1. Variveis unidimensionais ............................................................................................... 15
4.1.2. Variveis multidimensionais............................................................................................ 15
4.1.3. Exerccios......................................................................................................................... 16
4.2. Variveis compostas heterogneas ...................................................................................... 16
4.2.1. Registros (Struct) ............................................................................................................. 16
4.2.2. Registro de conjuntos....................................................................................................... 17
4.2.3. Conjunto de registros ....................................................................................................... 17
....................................................................................................................................................... 22
Captulo 1: Conceitos bsicos da linguagem C++
A linguagem C++ desenvolveu-se a partir da linguagem C. Foi criada por Bjarne Stroustrup no incio
da dcada de 1980 na Bell Laboratories. A linguagem C++ fornece vrios recursos que aprimoram a
linguagem C, mas, sobretudo, fornece capacidades para desenvolvimento de software baseados no
paradigma de Programao Orientada a Objetos (POO), o qual ser estudado mais adiante.

1.1. C++ Standard Library
Os programas C++ consistem em partes chamadas classes e funes. Um programa em C++
formado a partir da composio dessas partes. A maioria dos programadores em C++ tira proveito das ricas
colees de classes e funes existentes na C++ Standard Library. A utilizao dessas bibliotecas pode
melhorar o desempenho do programa, porque elas so escritas cuidadosamente para executar com
eficincia. Alm disso, elas tanto diminuem o tempo no desenvolvimento de software, atravs de uma
prtica chamada reutilizao de software (fundamental para a programao orientada por objetos), como
tambm melhoram a portabilidade do programa, ou seja, permite escrever programas que podem ser
executados, com pouca ou nenhuma modificao, em uma grande variedade de plataformas e/ou
arquiteturas de computadores.

1.2. Ambiente de desenvolvimento C++ tpico
Em geral, os sistemas C++ consistem em trs partes: um ambiente de desenvolvimento, a
linguagem e a C++ Standard Library. Os programas C++, em geral, passam pelas seguintes fases:

Fase 1: Criando um Programa
Consiste em editar um arquivo com um programa editor onde vc realiza quaisquer alteraes no cdigo-
fonte e o salva em um dispositivo de armazenamento secundrio. Neste curso utilizaremos a IDE Dev-
C++ (disponvel em www.bloodshed.net/devcpp.html) para realizao desta e de outras etapas a seguir.
Fase 2: Pr-processamento
O pr-processador C++ obedece a comandos chamados de diretivas de pr-processador, que indicam
que certas manipulaes devem ser realizadas no programa antes da compilao. Essas manipulaes
incluem outros arquivos de texto a serem compilados e realizam vrias substituies de texto.
Fase 3: Compilao
Quando o programador executa o comando para compilar o programa, o pr-processador
automaticamente chamado. Aps o pr-processamento, o compilador converte o programa C++ em
cdigo de linguagem de mquina (tambm referido como cdigo-objeto).
Fase 4: Linkagem
Em geral, os programas C++ contm referncias a funes e dados definidos em outra parte, como nas
bibliotecas padro. Normalmente, o cdigo-objeto produzido pelo compilador C++ contm lacunas
devido a essas partes ausentes. Um linker vincula o cdigo-objeto com o cdigo das funes ausentes
para produzir uma imagem executvel.
Fase 5: Carregamento
Antes de um programa ser executado, ele deve ser previamente colocado na memria principal. Isso
feito pelo carregador, que pega a imagem executvel do disco e a transfere para a memria.
Componentes adicionais de bibliotecas compartilhadas que suportam o programa tambm so
carregados.
Fase 6: Execuo
Por fim, o computador, sob o controle da CPU, executa o programa.

1.3. Estrutura bsica de um programa
Exemplo padro utilizado como introduo maioria das linguagens de programao. O programa
exibe o texto Ol Mundo! no monitor.
1. #include <iostream> // permite que o programa gere sada de dados na tela
2.
3. int main() // a funo main inicia a execuo do programa
4. {
5. std::cout << "Al mundo!!!"; // exibe a mensagem
6. return 0; // indica que o programa terminou com sucesso
7. } // fim da funo main
A primeira linha do programa uma directiva de pr-processamento #include, que diz ao
compilador para substituir aquela linha pela totalidade do contedo do ficheiro a que a directiva se refere
(neste caso iostream). Assim, o ficheiro padro iostream (que contm os prottipos de funes para
operaes de entrada e sada) ir substituir a linha.
A linha 3 declara uma funo, obrigatria para qualquer programa em C++, denominada main. A
funo main tem um significado especial no algoritmo em C++, pois a funo chamada no incio do fluxo
de execuo do programa, assim que ele comea. Os caracteres { } (linhas 4 e 7) delimitam, neste
caso, a extenso da funo. O termo int define que a funo main retorna um nmero inteiro.
O trecho de cdigo da linha 5 responsvel por executar uma funo de sade de dados para a
tela, chamada cout, a qual responsvel por imprimir a mensagem Al mundo!!!.
O comando return (linha 6) responsvel por interromper o fluxo de execuo da funo e
retornar um resultado, do mesmo tipo definido no corpo da funo, para o mtodo que invocou essa funo.
A linguagem C++ no impe o uso de uma formatao rgida. Nela, o programador escolhe a forma
mais apropriada para escrever seu cdigo. Podemos, por exemplo, escrever vrios comandos em uma
nica linha ou dividir um mesmo comando em diversas linhas. No entanto, para que nossos cdigos tenham
clareza, na maioria das vezes, optamos por escrever cada comando em um linha, sempre que possvel.
Pode-se tambm inserir comentrios no cdigo-fonte, iniciados com //, conforme ilustrado
anteriormente. Comentrios de mltiplas linhas devem ser inicializados com /* e finalizados com */.
Devemos notar tambm que comandos e declaraes em C++ so terminados pelo caractere ponto-e-
vrgula (;)

1.4. Armazenamento de dados e programas na memria
A memria do computador dividida em unidades de armazenamento chamadas bytes. Cada
posio de memria tem um endereo nico.
Como veremos nas prximas sees, quando reservamos um espao de memria para armazenar
um determinado valor, esse espao finito, composto de 1 ou mais bytes. Portanto, a faixa de valores e a
peciso com que representamos um valor no computador so finitas, pois temos um nmero finito de bits
para essa representao. Assim, em um espao de 1 byte (8 bits), s podemos representar 2
8
(=256)
valores distintos.
Se s podemos armazenar nmeros na memria do computador, como fazemos para armazenar
um texto (um documento ou uma mensagem)? Para armazenar uma seqncia de caracteres, que
representa o texto, atribui-se a cada caractere um cdigo numrico (por exemplo, pode-se associar ao
caractere A o cdigo 65, ao caractere B o cdigo 66, e da por diante). Se todos os caracteres tiverem
cdigo associados (inclusive os caracteres de pontuao e de formatao), podemos armazenar um texto
na memria do computador como uma seqncia de cdigos numricos.
A mesma estratgia usada para representar um programa na memria do computador. Um
computador s pode executar programas em linguagens de mquina. Cada programa executvel uma
seqncia de instrues que a CPU interpreta, executando as operaes correspondentes. Essa seqncia
de instrues tambm representada como uma seqncia de cdigos numricos. Os programas ficam
armazenados em disco e, para serem executados pelo computador, devem ser carregados (transferidos)
para a memria principal. Uma vez na memria, o computador executa a seqncia de operaes
correspondentes.

1.5. Bibliotecas
A tarefa das bibliotecas permitir que funes de interesse geral estejam disponveis com
facilidade. Nosso exemplo usa a biblioteca de entrada/sada padro de C++, iostream, que oferece
funes para permitir a captura de dados a partir do teclado e a sada de dados para a tela, entre outras.
Alm de bibliotecas preparadas pelo fornecedor do compilador ou por outros fornecedores de software,
podemos ter bibliotecas preparadas por um programador qualquer, que pode empacotar classes e funes
com utilidades relacionadas em uma biblioteca e, dessa maneira, facilitar seu uso em outros programas.

1.6. Verificao e validao
Programas, via de regra, podem conter erros, que precisam ser identificados e corrigidos. Quase
sempre a verificao realizada por meio de testes, que executam o programa a ser testado com diferentes
valores de entrada. Identificado um ou mais erros, o cdigo-fonte corrigido e deve ser novamente
verificado. O processo de edio, compilao, ligao e teste repetido at que os resultados sejam
satisfatrios, e o programa seja considerado validado.
O ciclo de desenvolvimento de um programa pode ser facilitado pela utilizao de um ambiente
integrado de desenvolvimento (Integrated Development Environment). O IDE um programa que oferece
interfaces para a edio, compilao e depurao de programas. Se um IDE estiver disponvel, possvel
criar e testar um programa, tudo em um mesmo ambiente, e todo o ciclo mencionado acontece de maneira
mais confortvel dentro de um mesmo ambiente, de preferncia com uma interface amigvel.
Captulo 2: Estruturas seqenciais, entrada/sada de dados
Nesta seo sero apresentadas as principais operaes e comandos da linguagem C++
indispensveis implementao de programas.

2.1. Variveis
Podemos dizer que uma varivel representa um espao na memria do computador para armazenar
um determinado tipo de dado. Na linguagem C++, todas as variveis devem ser explicitamente declaradas.
Na declarao de uma varivel, devem ser especificados seu tipo e nome: o nome da varivel serve de
referncia ao dado armazenado no espao de memria da varivel e o tipo da varivel determina a natureza
do dado que ser armazenado. S podemos armazenar valores do tipo especificado na declarao da
varivel. Assim, se declaramos uma varivel como sendo do tipo inteiro, s podemos armazenar valores
inteiros no espao de memria correspondente.
2.1.1. Tipos bsicos
A linguagem C++ oferece alguns tipos bsicos. Esses tipos diferem entre si pelo espao de
memria que ocupam e, conseqentemente, pelo intervalo de valores que podem representar. O tipo char,
por exemplo, ocupa 1 byte de memria (8 bits), e pode representar 2
8
(=256) valores distintos. A Tabela 1
ilustra os principais tipos bsicos da linguagem C++.
Tipo Tamanho (bytes) Representatividade
char 1 -128 a 127
unsigned char 1 0 a 255
short int 2 -32.768 a 32.767
unsigned short int 2 0 a 65.535
long int 4 -2.147.483.648 a 2.147.483.647
unsigned long int 4 0 a 4.294.967.295
long long int 8 -9.223.372.036.854.775.808 a
9.223.372.036.854.775.807
unsigned long long int 8 0 a 18.446.744.073.709.551.615
float 4 10
-38
a 10
38

double 8 10
-308
a 10
308

long double 16 10
-4932
a 10
4932

Tabela 1: Tipos bsicos e suas representatividades
Um outro importante tipo da linguagem C++ o tipo int puro, o qual , em geral, mapeado para o
tipo inteiro natural da mquina. Nas maioria das mquinas usadas hoje, que funcionam com processadores
de 32 bits (4 bytes), o tipo int mapeado para o inteiro de 4 bytes (long int).
Alguns desses tipos podem ainda ser modificados para representar apenas valores positivos, o que
pode ser feito precedendo o tipo com o modificador unsigned (sem sinal).
O tipo char freqentemente usado para representar cdigos de caracteres, como veremos nas
sees subseqentes.
A linguagem oferece ainda dois tipos bsicos para a representao de nmeros reais: float e
double. O tipo double recomendado para as situaes nas quais a preciso numrica das operaes
de fundamental importncia. Por exemplo, em aplicaes que fazem simulaes numricas, em geral
precisamos trabalhar com maior preciso.
2.1.2. Declarao de variveis
Para armazenar um dado (valor) na memria do computador, devemos reservar o espao
correspondente ao tipo do dado. A declarao de uma varivel reserva um espao de memria para
armazenar um dado do tipo da varivel e associa o nome da varivel a esse espao de memria.
No fragmento de cdigo a abaixo, so declaradas trs variveis, duas (a e b) para armazenar
valores inteiros (tipo int) e uma (c) para armazenar valores reais (tipo float). Uma vez declaradas as
variveis, podemos armazenar valores dos tipos correspondentes. Isso feito atribuindo-se valores s
variveis. No possvel, por exemplo, armazenar um nmero real numa varivel do tipo int.
int a; /* declara uma varivel do tipo int */
int b; /* declara outra varivel do tipo int */
float c; /* declara uma varivel do tipo float */

a = 5; /* armazena o valor 5 em a */
b = 10; /* armazena o valor 10 em b */
c = 5.3; /* armazena o valor 5.3 em c */
A linguagem permite que variveis de mesmo tipo sejam declaradas juntas. Assim, essas duas
primeiras declaraes poderiam ser substitudas por:
int a, b; /* declara duas variveis do tipo int */
A linguagem permite que as variveis sejam inicializadas na declarao. Podemos, por exemplo,
escrever:
int a = 5, b = 10; /* declara uma varivel do tipo int */
float c = 5.3; /* declara outra varivel do tipo float */

2.1.3. Variveis com valores indefinidos
Um dos erros comuns em programas de computador o uso de variveis cujos valores ainda esto
indefinidos. Se declaramos uma varivel sem explicitamente inicializar seu valor, ele indefinido. Existe um
valor armazenado, representado pela seqncia de bits do espao reservado, mas, como no temos
controle sobre esse valor, no faz sentido utiliz-lo. Costumamos dizer que o valor da varivel lixo. Por
exemplo, o trecho de cdigo a seguir est errado, pois o valor armazenado na varivel b est indefinido e
tentamos us-lo na atribuio a c.
int a, b, c;
a = 5;
c = a + b; /* ERRO: b tem lixo */

Alguns desses erros so bvios (como o ilustrado), e o compilador capaz de nos reportar uma
advertncia. No entanto, muitas vezes o uso de uma varivel no definida difcil de ser identificado no
cdigo. importante ressaltar que esse um erro comum em programas, e uma razo para alguns
programas funcionarem na parte da manh e no funcionarem na parte da tarde (ou funcionarem durante o
desenvolvimento e no funcionarem quando os entregamos ao cliente).
Todos os erros em computao tem lgica. A razo de o programa funcionar uma vez e no
funcionar outra que, como j mencionamos, apesar de indefinido, o valor da varivel existe. No nosso
caso citado anteriormente, pode acontecer de o valor armazenado na memria ocupada por b ser 0,
fazendo com que o programa funcione. Por outro lado, pode acontecer de o valor ser, por exemplo, -29345
e o programa no funcionar conforme esperado.

2.2. Constantes
Tem-se como definio de constante tudo aquilo que e fixo ou estvel, e existiro vrios momentos
em que este conceito dever estar em uso. Em nossos cdigos, usamos tambm valores constantes.
Quando escrevemos a atribuio:
a = b + 123;
sendo a e b variveis supostamente j decladas, deve-se representar internamente tambm a constante
123, para que a operao possa ser avaliada em tempo de execuo.
As constantes tambm podem ser do tipo real. Uma constante real deve ser escrita com um ponto
decimal ou valor de expoente. Sem nenhum sufixo, uma constante real do tipo double. Se quisermos
uma constane real do tipo float, devemos acrescentar o sufixo F ou f. Alguns exemplos de constantes
reais so:
12.45 /* constante real do tipo double */
1245e-2 /* constante real do tipo double */
12.45F /* constante real do tipo float */

Alguns compiladores exibem uma advertncia quando encontram este cdigo:
float x = 12.45;
pois o cdigo, a rigor, armazena um valor double (12.45) em uma varivel do tipo float. Desde que a
constante seja representvel dentro de um float, no precisamos nos preocupar com esse tipo de
advertncia. Todavia, se quisermos evit-lo, podemos representar a constante em preciso de float:
float x = 12.45f;
2.3. Operadores
Tanto variveis como constantes podem ser utilizadas na elaborao de clculos matemticos com
a utilizao de operadores aritmticos. Os operadores aritmticos so classificados em duas categorias,
sendo binrios ou unrios. A Tabela 2 apresenta um resumo dos operadores aritmticos utilizados na
linguagem C++.
Operador Operao Tipo Resultado
+ Manuteno de sinal Unrio -
- Inverso de sinal Unrio -
% Resto de diviso Binrio Inteiro
/ Diviso Binrio Inteiro ou Real
* Multiplicao Binrio Inteiro ou Real
+ Adio Binrio Inteiro ou Real
- Subtrao Binrio Inteiro ou Real
pow(base, expoente) Exponenciao Binrio Real
sqrt(valor numrico) Raiz quadrada Unrio Real
Tabela 2: Principais operadores aritmticos da linguagem C++
Para utilizar as funes pow() e sqrt(), necessrio que a biblioteca cmath seja inicialmente
includa no programa com o comando #include antes da funo principal main(), utilizando a sintaxe:
#include <cmath>.
2.3.1 Operadores Aritmticos
As operaes aritmticas so realizadas na preciso dos operandos. Assim, a expresso 5/2.5, o
valor do operando de menor expressividade (no caso, int) implicitamente convertido para o tipo de maior
expressividade (double), e a operao feita na preciso double.
O operador mdulo (%) no se aplica a valores reais e seus operandos devem ser do tipo inteiro.
Esse operador produz o resto da diviso do primeiro operador pelo segundo.
Os operadores *, / e % tm precedncia maior do que os operadores + e -. O operador unrio -- tem
precedncia maior do que *, / e %. Operadores com a mesma precedncia so avaliados da esquerda para
a direita.
Quando desejamos controlar a ordem na avaliao das operaes podemos utilizar os parnteses.
2.3.2. Operadores de atribuio
A atribuio uma expresso cujo valor resultante correspondente ao valor atribudo. A expresso
a = 5 + 2 resulta no valor 7, alm, claro de armazenar o valor 7 na varivel a. A avaliao das
operaes de atribuio so realizadas da direita para a esquerda. Assim, na avaliao da expresso y =
x = 5, o computador ir avaliar x = 5, armazenando 5 em x, e em seguida, armazena em y o valor
produzido por x = 5, que 5.
2.3.3. Operadores relacionais
Os operadores relacionais so usados para comparar dois valores. A Tabela 3 apresentada os
operadores relacionais da linguagem C++.
Smbolo Significado
== Igual a
!= Diferente de
> Maior que
< Menor que
>= Maior ou igual que
<= Menor ou igual que
Tabela 3: Operadores relacionais da linguagem C++
Esses operadores comparam dois valores. O resultado produzido por um operador relacional zero
ou um. O valor zero interpretado como falso, e qualquer valor diferente de zero considerado verdadeiro.
2.3.4.Operadores lgicos
Os operadores lgicos servem para combinar expresses booleanas. A Tabela 4 apresenta os
operadores lgicos da linguagem C++.
Smbolo Significado
&& Operador binrio E (AND)
|| Operador binrio OU (OR)

^
Operador binrio OU EXCLUSIVO (XOR)
! Operador unrio de NEGAO (NOT)
Tabela 4: Operadores lgicos da linguagem C++

Expresses conectadas por && ou || so avaliadas da esquerda para direita, e a avaliao pra
assim que a veracidade ou falsidade de resultado for conhecida.

2.5. Comando de entrada e sada
Nesta Seo abordaremos apenas aquilo que essencial para implementao dos exerccios
presentes nesta apostila. Quando se tornar necessrio, um detalhamento mais aprofundado ser
apresentado.
A entrada e sada padro de C++ so implementadas na biblioteca iostream. Os objetos de fluxo-
padro so: cin, cout, cerr e clog, os quais so abertos automaticamente pelo sistemas quando da
incluso desta biblioteca.
cin: corresponde entrada padro
cout: corresponde sada padro
cerr: corresponde sada padro de erros, sem bufferizao
clog: corresponde sada padro de erros, com bufferizao
O operador << (operador de deslocamento para a esquerda) permite inserir valores em um fluxo de
sada. J o operador >> (operador de deslocamento para a direita) permite extrair valores de um fluxo de
entrada.
Exemplo 2.1: Elaborar um programa que efetue a apresentao do valor da converso em dlar (US$) de
um valor lido em real (R$). O programa dever solicitar o valor da cotao do dlar e tambm a quantidade
de reais disponvel com o usurio.
#include <iostream>

int main() {


float cotacaoDolar, // valor da cotao do dolar
qteReais, // quantidade de reais disponvel
qteDolares; // quantidade de dolares

std::cout << "Informe a cotacao do dolar: ";
std::cin >> cotacaoDolar;
std::cout << "Informe a quantidade de reais: ";
std::cin >> qteReais;

qteDolares = qteReais/cotacaoDolar;

std::cout << "Total de dolares: " << qteDolares << std::endl;

return 0;
}
O operador << pode ser usado, de forma encadeada, para inserir diversos valores em um mesmo fluxo de
sada.

2.6. Exerccios
1) Elaborar um programa que efetue a leitura de trs valores inteiros (representados pelas variveis, A, B e
C) e apresente como resultado a soma, a mdia e o produto dessas trs variveis.
2) Ler uma temperatura em graus Celsius e apresent-la convertida em graus Fahrenheit. A frmula de
converso : F (9* C+160)/5, sendo F a temperatura em Fahrenheit e C a temperatura em Celsius.
3) Ler dois valores para as variveis A e B, efetuar a troca dos valores de forma que a varivel A passe a
possuir o valor da varivel B e a varivel B passe a possuir o valor da varivel A. Apresentar os valores
trocados.
4) Elaborar um programa que efetue a apresentao do valor da converso em real (R$) de um valor lido
em dlar (US$). O programa dever solicitar o valor da cotao do dlar e tambm a quantidade de
dlares disponvel com o usurio.
5) Efetuar o clculo de quantidade de litros de combustvel gastos em uma viagem, utilizando-se um
automvel que faz 12 Km por litro. Para obter o clculo, o usurio dever fornecer o tempo gasto e a
velocidade mdia durante viagem. Desta forma, ser possvel obter a distncia percorrida com a
frmula DISTNCIA TEMPO * VELOCIDADE. Tendo o valor da distncia, basta calcular a quantidade
de litros de combustvel utilizada na viagem com a frmula: LITROS_USADOS DISTNCIA/12. O
programa dever apresentar os valores da velocidade mdia, o tempo gasto na viagem, a distncia
percorrida e a quantidade de combustvel gasto.
6) Em uma eleio sindical concorreram ao cargo de presidente trs candidatos (A, B, C).
Durante a apurao dos votos foram computados votos nulos e votos em branco, alm dos votos
vlidos para cada candidato. Deve ser criado um programa de computador que efetue a leitura da
quantidade de votos vlidos para cada candidato, alm de efetuar tambm a leitura de votos nulos e
votos em branco. Ao final o programa deve apresentar o nmero total de eleitores, considerando votos
vlidos, votos nulos e em branco; o percentual correspondente de votos vlidos em relao
quantidade de eleitores; o percentual correspondente de votos vlidos do candidato A relao
quantidade de eleitores; o percentual correspondente de votos vlidos do candidato B em relao
quantidade de eleitores; o percentual correspondente de votos vlidos do candidato C em relao
quantidade de eleitores; o percentual correspondente de votos nulos em relao em relao
quantidade de eleitores; e por ltimo o percentual correspondente de votos em branco em relao
quantidade de eleitores.
Captulo 3: Abstrao de controle
Na seo anterior os programas eram formados apenas por seqncias simples de comandos. Para
construo de programas mais elaborados, precisamos ter acesso a mecanismos que permitam controlar o
fluxo de execuo dos comandos. Por exemplo, fundamental ter meios para tomar decises que se
baseiem em condies avaliadas em tempo de execuo. Tambm precisamos de mecanismos para a
construo de procedimentos iterativos, isto , procedimentos que repetem a execuo de uma seqncia
de comandos um determinado nmero de vezes.
Nesta Seo, discutiremos os principais mecanismos para abstrao de controle oferecidos pela
linguagem C++. Ela prov as construes fundamentais de controle de fluxo necessrias para programas
bem estruturados: agrupamento de comandos, tomadas de deciso (operadores lgicos condicionais),
seleo de um caso entre um conjunto de casos possveis (operador de seleo) e laos de repetio com
teste de encerramento no incio, no fim, e com variavl de controle.

3.1. Operador lgico condicional
O comando if o comando bsico para codificar tomada de deciso em C++. Sua sintaxe bsica
ilustrada abaixo.
a) b)
if (expr) { if (expr) {
comando 1; bloco de comandos 1;
comando 2; }
... else {
comando n; bloco de comandos 2;
} }
Em b, se a avaliao de expr resultar em um valor diferente de 0 (isto , se o valor for verdadeiro), o
bloco de comandos 1 ser executado. A incluso do else requisita a execuo do bloco de comandos 2 se
a expresso resultar no valor 0 (falso). Cada bloco de comandos deve ser delimitado por uma chave aberta
e uma fechada. No entanto, se dentro de um bloco tivermos apenas um nico comando a ser executado, as
chaves podem ser omitidas (a rigor, deixamos de ter um bloco).
Em C++, um else associado ao ltimo if que no tiver seu prprio else. Para os casos em que
a associao entre if e else no est clara, recomendo a criao explcita de blocos, mesmo contendo
um nico comando. No trecho de cdigo ilustrado abaixo, o resultado para o valor 5 seria a mensagem
Temperatura muito quente. Isto , o programa est incorreto.
#include <iostream>

int main() {
int temp;
std::cout << "Digite a temperatura: ";
std::cin >> temp;
if (temp < 30)
if (temp > 20)
std::cout << "Temperatura agradavel.\n";
else
std::cout << "Temperatura muito quente.\n";
return 0;
}

Se reescrevermos o programa, podemos obter o efeito desejado.
#include <iostream>

int main() {
int temp;
std::cout << "Digite a temperatura: ";
std::cin >> temp;
if (temp < 30) {
if (temp > 20)
std::cout << "Temperatura agradavel.\n";
}
else
std::cout << "Temperatura muito quente.\n";
return 0;
}

3.2. Operador de seleo
Alm da construo if-else, C++ prov um comando (switch) para selecionar um entre um
conjunto de casos possveis. Sua forma geral :
switch (expr) {
case op1:
... /* comandos executados se expr == op1 */
break;
case op2:
... /* comandos executados se expr == op2 */
break;
...
case opN:
... /* comandos executados se expr == opN */
break;
default:
... /* executados se expr for diferente de todos */
break;
}
op
i
deve ser um nmero inteiro ou um caractere. Se expr resultar no valor op
i
, os comandos seguintes ao
caso op
i
so executados at encontrar um break. Se o comando break for omitido, a execuo do caso
continua com os comandos do caso seguinte. Se o valor de expr for diferente de todos os casos
enumerados, o bloco de comandos associado a default executado. O bloco default normalmente
colocado por ltimo e no obrigatrio.

3.3. Operador de repetio
Em programas computacionais, procedimentos iterativos so muito comuns, isto , procedimentos
que devem ser executados em vrios passos. Como exemplo, vamos considerar o clculo do valor do
fatorial de um nmero inteiro no negativo.
n! = n * (n-1) * (n-2) * ... * 2 * 1 | n >= 0, f(0) = 1
Para calcular o fatorial de um nmero com um programa de computador, normalmente utilizamos
um processo iterativo, em que o valor da varivel varia de 1 a n, avaliando o produtrio dos valores nesse
intervalo.
A linguagem C++ oferece diversas construes possveis para a realizao de laos iterativos.
3.3.1. Repetio com teste no incio
Na linguagem C++, o operador de repetio com teste de parada no incio o comando while. Sua
forma geral :
while (expr_de_parada) {
bloco de comandos
}
Se a avaliao da expresso de parada (expr_de_parada) resultar em verdadeiro, o bloco de
comando executado. Ao final do bloco, a expresso volta a ser avaliada e, enquanto a expresso de
parada resultar em verdadeiro, o bloco de comandos executado repetidamente. Quando a expresso de
parada for avaliada em falso, o bloco de comandos deixa de ser executado, e a execuo do programa
prossegue com a execuo dos comandos subseqentes ao bloco.
3.3.2. Repetio com varivel de controle no lao
Uma segunda forma de construo de laos em C++, mais compacta e amplamente utilizada, o
operador de repetio for. Sua forma geral :
for (expr_inicial; expr_de_parada; expr_de_incremento) {
bloco de comandos
}
A construo com for equivalente ao uso do while, com a ordem de avaliao das expresses
ilustradas a seguir:
expr_inicial;
while (expr_de_parada) {
bloco de comandos
...
expr_de_incremento;
}
Isto , a expresso inicial avaliada uma nica vez antes da execuo do lao. Em seguida, a
expresso de parada, que controla a execuo do lao, avaliada e, enquanto for verdadeira, o bloco de
comandos executado. Imediatamente aps cada execuo do bloco de comandos, a expresso de
incremento avaliada, o lao se completa e a expresso de parada volta a ser avaliada.
3.3.3. Repetio com teste no fim
Tanto a construo com while como a construo com for avaliam a expresso de parada, que
caracteriza o teste de encerramento, no nicio do lao. Assim, se essa expresso for falsa, quando for
avaliada pela primeira vez, os comandos do corpo do bloco no sero executados nem uma vez.
A linguagem C++ prov um outro operador de repetio para a construo de laos cujo teste de
encerramento avaliado no final. Esse operador o do-while, cuja forma geral :
do{
bloco de comandos
} while (expr_de_parada);

3.4. Exerccios
1. Ler trs valores para os lados de um tringulo, considerando lado como: A, B e C. Verificar se os lados
fornecidos formam realmente um tringulo, e se for esta condio verdadeira, dever se indicado qual
tipo de tringulo foi formado: issceles, escaleno ou eqiltero.
2. Construa uma calculadora convencional que efetua as quatro operaes bsicas (+, -, *, /). Faa uma
verso desse programa usando comando de deciso e uma verso usando comando de seleo.
3. Efetuar a leitura de trs valores (variveis A, B e C) e efetuar o clculo da equao de segundo grau,
apresentando as duas razes, se para os valores informados for possvel efetuar o referido clculo.
4. Efetuar a leitura de trs nmeros inteiros e identificar o maior e o menor valor.
5. Efetuar a leitura de trs valores (variveis A, B e C) e apresentar os valores dispostos em ordem
crescente.
6. Elabore um programa que leia um valor numrico positivo ou negativo e apresentar o valor lido como
sendo um valor positivo.
7. Faa um programa que leia o ano de nascimento de uma pessoa, calcule e mostre sua idade e,
tambm, verifique e mostre se ela j tem idade para votar (16 anos ou mais) e para conseguir a
Carteira de Habilitao (18 anos ou mais).
8. Elabore um programa que calcule o que deve ser pago por um produto, considerando o preo normal
de etiqueta e a escolha da condio de pagamento. Utilize os cdigos da tabela a seguir para ler qual a
condio de pagamento escolhida e efetuar o clculo adequado.

Cdigo Condio de pagamento
1. vista em dinheiro ou cheque, recebe 10% de desconto
2. vista no carto de crdito, recebe 5% de desconto
3. Em duas vezes, preo normal da etiqueta sem juros
4. Em trs vezes, preo normal de etiqueta mais juros de 10%

9. Elabore um programa que leia 2 valores numricos inteiros e apresente o resultado da diferena do
maior valor pelo menor valor.
10. Imagine uma brincadeira entre dois colegas, na qual um pensa um nmero e o outro deve fazer chutes
at acertar o nmero imaginado. Como dica, a cada tentativa dito se o chute foi alto ou baixo. Elabore
um algoritmo dentro deste contexto, que leia o nmero imaginado e os chutes, ao final mostre quantas
tentativas foram necessrias para descobrir o nmero.
11. Construa um programa que permita fazer um levantamento do estoque de vinhos de uma adega, tendo
como dados de entrada tipos de vinho, sendo: T para tinto, B para branco e R para ros. Apresente
a porcentagem de cada tipo sobre o total geral de vinhos; a quantidade de vinhos desconhecida.
12. Faa um programa que efetue a soma de todos os nmeros mpares que so mltiplos de 3 e que se
encontram no conjunto dos nmeros de 1 at 500.
13. Prepare um programa capaz de inverter um nmero qualquer fornecido pelo usurio. Ou seja, se o
nmero informado pelo usurio for 123456789, o programa deve exibir o nmero 987654321.
14. Construa um programa que seja capaz de dar a classificao olmpica de 3 pases informados. Para
cada pas informado o nome, a quantidade de medalhas de ouro, prata e bronze. Considere que cada
medalha de ouro tem peso 3, cada prata tem peso 2 e cada bronze, peso 1.
15. Elabore um programa que obtenha o mnimo mltiplo comum (MMC) entre dois nmeros fornecidos.
16. Construa um programa que gere os 20 termos sucessores da srie de Fibonacci a partir de 2 primeiros
termos fornecidos pelo usurio.
17. Construa um programa que leia um conjunto de dados contento altura e sexo (M para masculino e F
para feminino) de 50 pessoas, e depois, calcule e escreva:
A maior e a menor altura do grupo;
A mdia de altura das mulheres;
O nmero de homens;
A diferena percentual entre os homens e as mulheres;

18. Anacleto tem 1,50 metros e cresce 2 centmetros por ano, enquanto Felisberto tem 1,10 metros e
cresce 3 centmetros por ano. Construa um algoritmo que calcule e imprima quantos anos sero
necessrios para que Felisberto seja maior que Anacleto.
19. Apresentar o total da soma dos cem primeiros nmeros inteiros: (1+2+3+4+5+6+7+...+97+98+99+100).
20. Fazer um programa que, a partir de um nmero de CPF informado pelo usurio, verifique se o nmero
informado vlido ou no.
Captulo 4: Abstrao de Dados
Apesar da grande quantidade de tipos de dados primitivos vistos na Seo 2.1.1., os quais
representam apenas alguns dos principais tipos primitivos da linguagem C++, em muitos casos esses tipos
no so suficientes para representar toda e qualquer informao que possa surgir. Portanto, em muitas
situaes esses recursos de representaes so escassos, o que poderia ser suprido se existissem mais
tipos de dados ou, ainda melhor, se esses tipos pudessem ser criados medida que se fizessem
necessrios.

4.1. Variveis compostas homogneas
Uma varivel pode ser interpretada como um elemento, e uma estrutura de dados como um
conjunto. Quando uma determinada estrutura de dados composta de variveis com o mesmo tipo
primitivo, temos um conjunto homogneo de dados. Podemos considerar que uma varivel composta
homognea seja como uma alcatia, e seus elementos (variveis) sejam como lobos (que so da mesma
espcie).
4.1.1. Variveis unidimensionais
Uma matriz de uma dimenso, comumente chamada de vetor, representada por seu nome,
tamanho (dimenso) e seu tipo, tendo a seguinte sintaxe:
tipo NOME[dimenso];
Onde:
tipo: ............. o tipo de dado a ser armazenado no vetor;
NOME: ........ o nome atribudo ao vetor, o qual ser utilizado para manipular os valores nele contidos;
dimenso: ...Refere-se ao tamanho do vetor, ou seja, capacidade de armazenamento de dados no vetor,
em nmero de elementos.
Assim, a declarao int v[10]; cria um vetor de inteiros dimensionado com 10 elementos, isto
, reserva-se um espao de memria contnuo para armazenar 10 valores inteiros. Desta forma, se cada
int ocupa 4 bytes, a declarao reserva um espao de memria de 40 bytes. Alm disso, o acesso a cada
elemento do vetor feito por meio de uma indexao da varivel v. No entanto, deve-se atentar para o fato
de que a indexao de um vetor em C++ realizada apenas por nmeros inteiros positivos. Ou seja,
suponha um vetor v de tamanho N, nesse caso os ndices de v variam no intervalo de 0 a N-1.
Assim, para a declarao do vetor v de 10 posies ilustrado anteriormente, a entrada v[10]
resultaria na indexao de uma posio invlida do vetor, e conseqentemente numa invazo de memria.
importante no confundir o ndice com o elemento. ndice o endereo de alocao de uma
unidade do vetor, enquanto elemento o contedo armazenado em um determinado endereo.
Vetores tambm podem ser inicializados na declarao:
int v[] = {1, 2, 3, 4, 5};
Observe que o compilador dimensiona o vetor de acordo com o nmero de elementos especificados
na inicializao.
4.1.2. Variveis multidimensionais
A linguagem C++ permite a criao de vetores bidimensionais, declarados estaticamente. Esse tipo
de vetor comumente chamado de matriz e relaciona-se diretamente com problemas que envolvam
estruturas de dados homogneas, mas que podem ser organizadas em forma de tabela.
Uma matriz declarada de forma semelhante a um vetor, sendo representada pelo seu nome,
tamanho (agora definidos atravs de duas dimenses) e seu tipo, tendo a seguinte sintaxe:
tipo NOME[dimenso_1][dimenso_2];
Onde:
tipo: ............... o tipo de dado a ser armazenado na matriz;
NOME: .......... o nome atribudo matriz, o qual ser utilizado para manipular os valores nela contidos;
dimenso_1: . Refere-se ao tamanho da matriz em nmero de linhas.
dimenso_2: . Refere-se ao tamanho da matriz em nmero de colunas.
Podemos declarar uma matriz de valores reais com 4 linhas e 3 colunas da seguinte forma:
float m[4][3];
Essa declarao reserva um espao de memria necessrio para armazenar os 12 elementos da
matriz, que so armazenados de maneira contnua, organizados linha a linha.
Os elementos da matriz so acessados com indexao dupla: mat[l][c]. O primeiro ndice, l,
acessa a linha, e o segundo, c, acessa a coluna.
Da mesma forma que os vetores, as matrizes tambm podem ser inicializadas na declarao:
int matriz[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
Ou ainda podemos inicializar seqencialmente:
int matriz[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12};
O nmero de elementos por linha pode ser omitido numa inicializao, mas o nmero de colunas
deve ser sempre fornecido:
int matriz[][3] = {1,2,3,4,5,6,7,8,9,10,11,12};
4.1.3. Exerccios
1. Ler 8 elementos em um vetor A. Construir um vetor B da mesma dimenso contendo os elementos do
vetor A multiplicados por 5.
2. Ler um vetor com 15 elementos. Construir um vetor B de mesmo tipo, sendo que cada elemento do vetor
B seja o fatorial do elemento correspondente do vetor A.
3. Ler 20 elementos em uma matriz qualquer, considerando que ela tenha o tamanho de 4 linhas por 5
colunas, em seguida apresentar a matriz.
4. Ler duas matrizes A e B, cada uma de duas dimenses com 5 linhas e 3 colunas. Construir uma matriz C
de mesma dimenso, que seja formada pela soma dos elementos da matriz A com os elementos da
matriz B. Apresentar os elementos da matriz C.
5. Num frigorfico existem 90 bois. Cada boi traz, preso em seu pescoo, um carto contendo o seu nmero
de identificao (inteiro) e seu peso (real). Fazer um algoritmo que:
imprima os nmeros e respectivos pesos dos bois mais gordos e dos bois mais magros.
imprima os nmeros e respectivos pesos dos dois bois mais gordos e dos dois bois mais magros.
6. Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para isso,
montou uma ficha (uma para cada mercadoria) com o nome, o preo de compra e o preo de venda das
mesmas. Fazer um programa que:
Determine e escreva quantas mercadorias proporcionam:
lucro < 10%
10% <= lucro <= 20%
lucro > 20%
Determine e escreva o valor total de compra e de venda de todas as mercadorias, assim como o lucro
total.

4.2. Variveis compostas heterogneas
Nas sees anteriores foram apresentadas tcnicas de programao que envolveram o uso de tipos
primitivos e de estruturas de dados homogneas. Nesses casos, somente foi possvel trabalhar com um tipo
de dado nas variveis compostas (vetores e matrizes). Essa restrio induz a utilizao de mltiplas
matrizes para alocar valores de diferentes tipos. Alm disso, conduz o programador a adotar tcnicas de
programao que dificultam a legibilidade do cdigo.
4.2.1. Registros (Struct)
Registros so estruturas de dados que encapsulam mltiplos dados de tipos diferentes em um novo
tipo de dado. Por esta razo, este tipo de dado considerado heterogneo.
No exerccio 5 da seo anterior era solicitado, para cada boi, o cadastro do seu identificador
(expresso como um nmero inteiro) e do seu respectivo peso (expresso como um nmero real). Essa
diversidade de tipos obrigou a utilizao de dois vetores, um para armazenar o identificador do animal e
outro para armazenar seu peso. Isso criou uma soluo com foco na manipulao das estruturas de dados,
e no nos elementos fundamentais do problema, que so os animais. Imagine como seria mais fcil agrupar
os dois tipos de dados em uma mesma estrutura, a qual descreve especificamente os dados de um
elemento do mundo real, nesse caso, o boi. Em programas mais complexos, os registros fornecem uma
maneira mais abstrata para representar os dados.
A linguagem C++ oferece mecanismos para estruturar dados heterogneos, nos quais as
informaes so compostas por diversos campos. Essas estruturas servem, basicamente, para agrupar
diversas variveis dentro de um nico contexto. Para ilustrar, vamos considerar o desenvolvimento do
exerccio descrito no ltimo pargrafo. Nesse caso, cada boi pode ser representado por dois valores, um
inteiro e um real. A sintaxe para a definio de uma estrutura esta:
struct boi {
int id;
float peso;
};
Dessa maneira, a estrutura boi passa a ser um tipo, e podemos ento declarar variveis desse tipo
da seguinte forma:
boi b;
A linha de cdigo acima declara b como sendo uma varivel do tipo boi. Os elementos de uma
estrutura podem ser acessados usando o operador de acesso ponto (.). Assim vlido escrever:
b.id = 1263;
b.peso = 513.84;
Manipulamos os elementos de uma estrutura da mesma forma que manipulamos variveis simples.
Podemos acessar seus valores, atribuir-lhes novos valores etc.
4.2.2. Registro de conjuntos
Vimos anteriormente que possvel alocar mltiplos tipos de dados no interior de um registro. Alm
disso, em C++ possvel definir um vetor, ou mesmo uma matriz, dentro de um registro, para no ser
necessrio utilizar somente os tipos primitivos de dados.
Vamos considerar, como exemplo, um sistema de cadastro de notas escolares. Nesse caso h a
necessidade de se criar um registro denominado aluno, nos quais sero registradas as notas obtidas pelo
aluno nos quatro bimestres do ano. Alm disso, deve ser registrado o nmero de matrcula do aluno e o seu
nome. O trecho de cdigo abaixo ilustra a implementao desse registro:
struct aluno {
int matricula;
string nome;
float nota[4];
};
Como descrito anteriormente, os campos da estrutura so acessados usando o operador de acesso
ponto(.). E ento manipulados de acordo com o contexto em que so utilizados. Assim, vlido escrever:
aluno a;
a.matricula = 12345;
a.nome = "Aelerson";
a.nota[0] = 12.5;
a.nota[1] = 17.2;
a.nota[2] = 20.0;
a.nota[3] = 19.7;
4.2.3. Conjunto de registros
Com as tcnicas de programao anteriormente apresentadas, passou-se a ter uma flexibilidade
bastante grande, podendo-se trabalhar de uma forma mais adequada com diversos problemas,
principalmente os que envolvem a utilizao de dados heterogneos, facilitando a construo de programas
mais organizados. Porm, os exemplos apresentados at aqui com a utilizao de registros, s fizeram
meno leitura e escrita de um nico registro.
Em C++ possvel fazer a manipulao de registros como conjuntos, a partir da criao de vetores
e matrizes de registros. A declarao de um conjunto de registros feita de forma semelhante declarao
de um vetor ou matriz, onde o nome do registro especificado na posio destinada ao nome do tipo de
dado. O trecho de cdigo abaixo ilustra a declarao de um vetor de alunos contendo 90 posies:
aluno a[90];
O acesso s posies do conjunto de registros realizado de forma semelhante ao acesso aos
elementos de um conjunto de tipos primitivos. Assim, vlido escrever:
a[0].matricula = 12345;
a[0].nome = "Aelerson";
a[0].nota[0] = 12.5;
a[0].nota[1] = 17.2;
a[0].nota[2] = 20.0;
a[0].nota[3] = 19.7;

4.3. Outros tipos de dados
Alm dos tipos de dados descritos anteriormente, a linguagem C++ possui contrutores para
definio de outros tipos de dados.
4.3.1. Cadeia de caracteres (string)
Um texto representado por uma seqncia de caracteres. A representao dessa seqncia de
caracteres de fundamental importncia para o desenvolvimento de sistemas computacionais. Em qualquer
tipo de cadastro necessrio informar cadeias de caracteres, como descrio de produtos, nomes de
pessoas etc.
Efetivamente, a linguagem C++ no oferece um tipo caractere. Como j discutimos, os caracteres
so representados internamente na memria do computador por cdigos numricos. A linguagem C++
oferece ento o tipo char, que pode armazenar valores inteiros de 1 byte, 8 bits, podendo assim
representar 256 (2
8
) valores distintos. Como os cdigos associados aos caracteres da tabela ASCII esto
dentro desse intervalo, usamos o tipo char para representar caracteres. Embora a tabela ASCII seja a mais
usada, diferentes mquinas podem usar diferentes tabelas de cdigos. Por isso deve-se evitar o uso
explicito de cdigos referentes a uma determinada tabela, ou seja, deve-se usar char C = A no
lugar de char C = 65.
Em C++, a diferena entre caracteres e inteiros est apenas na maneira como so tratados. Por
exemplo, podemos imprimir o mesmo valor de duas formas diferentes, a partir de formatos diferentes.
Vamos analisar o trecho de cdigo abaixo:
unsigned char I;
for(I=1; I<255; I++)
std::cout << (int)I << " - " << I << "\n";
Nesse caso, a varivel I, que foi inicializada com o valor 1, representa os caracteres da tabela da
mquina na qual a aplicao est sendo executada. O objeto cout imprime o contedo da varivel I em
dois formatos distintos: a representao numrica do caractere onde utiliza-se um casting para forar a
impresso numrica; o formato de caractere onde ser impresso o caractere associado ao cdigo
numrico.
Cadeias de caracteres em C++ so representadas por vetores do tipo char terminadas,
obrigatoriamente, pelo caractere nulo (\0). Portanto, para armazenar uma cadeia de caracteres,
devemos reservar uma posio adicional para o caractere de fim da cadeia.
O cdigo a seguir ilustra a representao de uma cadeia e caracteres. Como queremos representar
a palavra CEFET, composta por 5 caracteres, declaramos um vetor com dimenso 6 (um elemento
adicional para armazenarmos o caractere nulo no final da cadeia). O cdigo abaixo preenche os elementos
do vetor, incluindo o caractere \0, e imprime a palavra na tela.
int main() {
char instituicao[6];
instituicao [0] = C;
instituicao [1] = E;
instituicao [2] = F;
instituicao [3] = E;
instituicao [4] = T;
instituicao [5] = \0;
std::cout << instituicao;
return 0;
}
Se o caractere \0 no fosse colocado, o objeto cout poderia ser executado de forma errada,
pois no conseguiria identificar o final da cadeia.
Como cadeias de caracteres so vetores, podemos reescrever o cdigo anterior com a inicializao
dos valores dos elementos do vetor na declarao:
char instituicao[] = {C, E, F, E, T, \0};
A inicializao de cadeias de caracteres to comum em cdigo C++ que a linguagem permite que
elas sejam inicializadas escrevendo-se os caracteres entre aspas duplas. Nesse caso, o caractere nulo
representado explicitamente. O cdigo anterior pode ser reescrito da seguinte forma:
char instituicao[] = CEFET;

4.3.2. Definio de novos tipos
A linguagem C++ permite criar nomes de tipos. Por exemplo, se escrevemos:
typedef float Real;
Podemos usar o nome Real como um mnemnico para o tipo float. O uso de typedef muito
til para abreviar nomes de tipos e para tratar tipos complexos. Alguns exemplos vlidos de typedef:
typedef int Integer;
typedef char String[256];
4.3.3. Tipo pr-processado
Um cdigo C++, antes de ser compilado, passa por um pr-processador. Esse pr-processador
reconhece determinadas diretivas e altera o cdigo para, ento, envi-lo ao compilador.
Uma diretiva muito comum, e j utilizada nos nossos exemplos, a diretiva #include. Ela seguida
por um nome de arquivo, e o pr-processador a substitui pelo corpo do arquivo especificado. como se o
texto do arquivo includo fizesse parte do cdigo-fonte.
Outra diretiva de pr-processamento bastante usada a diretiva de definio, denominada #define.
Por exemplo, uma funo para calcular a rea de um crculo pode ser escrita da seguinte forma:
#define PI 3.14159F
int main() {
float area, r;
cin >> r;
AREA = PI * r * r;
cout << "Area: " << area;
return 0;
}
Nesse caso, antes da compilao, toda ocorrncia da palavra PI (desde que no esteja envolvida
em aspas) ser trocada pelo nmero 3.14159F. O uso de diretivas de difinio para representar constantes
simblicas fortemente recomendvel, pois facilita a manuteno e acrescenta clareza ao cdigo.
4.3.4. Tipo enumerao
Uma enumerao um conjunto de constantes inteiras com nomes que especifica os valores
possveis para uma varivel daquele tipo. uma forma mais elegante de organizar valores constantes.
Como exemplo, consideremos a criao de um tipo booleano. Para isso, podemos enumerar os valores que
um determinado tipo pode assumir. Isso pode ser feito da seguinte forma:
enum bool {
TRUE = 1,
FALSE = 0
};
A declarao de uma varivel do tipo criado pode ser realizada por:
bool resultado;
resultado = FALSE;

4.3.5. Exerccios
1. Num frigorfico existem no mximo 90 bois. Cada boi traz, preso em seu pescoo, um carto contendo o
seu nome, nmero de identificao (inteiro) e seu peso (real). Fazer um algoritmo que:
imprima dados do boi mais gordo e do boi mais magro.
imprima a soma dos pesos dos bois.
Obs:
-> somente uma funo poder ser executada por vez, e a escolha do usurio.
-> somente o usurio poder encerrar a aplicao
2. Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para isso,
montou uma ficha (uma para cada mercadoria) com o nome, o preo de compra e o preo de venda das
mesmas. Fazer um programa que:
Determine e escreva quantas mercadorias proporcionam:
lucro < 10%
10% <= lucro <= 20%
lucro > 20%
Determine e escreva o valor total de compra e de venda de todas as mercadorias, assim como o lucro
total.
Captulo 5: Modularizao de algoritmos
Para a construo de programas estruturados, sempre prefervel dividir as grandes tarefas de
computao em tarefas menores e utilizar seus resultados parciais para compor o resultado final desejado.
Na linguagem C++, a criao de funes o mecanismo adequado para codificar tarefas especficas. Um
programa estruturado em C++ deve ser composto por diversas funes pequenas. Essa estratgia de
codificao traz dois grandes benefcios: primeiro, facilita a codificao, pois codificar diversas funes
pequenas, que resolvem problemas especficos, mais fcil do que codificar uma nica funo maior;
segundo, funes especficas podem ser facilmente reutilizadas em outros cdigos. De fato, a criao de
funes pode evitar a repetio de cdigo, de modo que um procedimento repetido deve ser transformado
em uma funo que, ento, ser chamada diversas vezes.
importante destacar que as funes so independentes entre si. As variveis locais definidas
dentro do corpo de uma funo (includo os parmetros das funes) no existem fora dela. Cada vez que a
funo executada, as variveis locais so criadas, e, quando sua execuo termina, as variveis deixam
de existir.

5.1. Declarao de funes
A forma geral para definir uma funo :
tipo_retornado nome_da_funo ( lista de parmetros... ) {
corpo da funo
}

5.2. Passagem de parmetros por valor
A passagem de parmetro por valor ocorre quando feita uma cpia dos valores contidos nas
variveis, ou valores constantes, para os parmetros formais do mtodo chamado. Dessa forma, qualquer
modificao que ocorra nas variveis locais ao mtodo invocado no afeta o valor de qualquer varivel
usada como parmetro desse mtodo, ou seja, o processamento executado somente dentro do mtodo,
ficando o resultado obtido preso dentro da subrotina.
Para ilustrar a criao de funes, consideremos o clculo do fatorial de um nmero inteiro.
Podemos escrever uma funo que, dado um determinado nmero inteiro no negativo n, imprime o valor
de seu fatorial.
// funo que calcula e retorna o valor do fatorial
int fatorial(int n) {
int i;
int f = 1;
for(i = n; i > 1; i--)
f = f * i;
return f;
}

int main( ) {
int n, f;
cin >> n;
f = fatorial(n);
cout << Fatorial de << n << eh << f;
getch();
return 0;
}
Uma funo pode ou no ter um valor de retorno associado. Para ilustrar a possibilidade de uma
funo no retornar um valor, vamos reescrever o cdigo anterior da seguinte forma.
// funo que calcula e retorna o valor do fatorial
void fatorial(int n) {
int i;
int f = 1;
for(i = n; i > 1; i--)
f = f * i;
cout << Fatorial de << n << eh << f;
}

int main( ) {
int n;
cin >> n;
fatorial(n);
getch();
return 0;
}
Observe que, nesse caso, a funo fatorial no retorna valor algum.

5.3. Passagem de parmetros por referncia
Conforme ilustrado anteriormente, uma funo pode retornar um tipo de valor. No entanto, a
possibilidade de retornar um valor nem sempre satisfatria. Muitas vezes, precisamos retornar mais do
que um resultado para o ponto de execuo que chama uma funo, e isso no pode ser feito com o
retorno explcito de valores, pois dessa forma possvel retornar apenas um valor.
A linguagem C++ permite o armazenamento e a manipulao de valores de endereos de memria.
Para cada tipo existente, h um tipo ponteiro capaz de armazenar endereos de memria em que existem
valores do tipo correspodente armazenados.
A linguagem C no reserva uma palavra especial para a declarao de ponteiros; usamos a mesma
palavra do tipo com os nomes das variveis precedidos pelo caractere *. Ento, podemos escrever:
int *p;
Nesse caso, declaramos uma varivel de nome p que pode armazenar endereos de memria em
que existe um inteiro armazenado.
Para atribuir e acessar endereos de memria, a linguagem C oferece dois operadores unrios. O
operador uninrio & (endereo de), aplicado a variveis, resulta no endereo da posio da memria
reservada para a varivel. O operador unrio * (contedo de), aplicado a variveis do tipo ponteiro, acessa
o contedo do endereo de memria armazenado pela varivel ponteiro. Para exemplificar, observe o
trecho de cdigo abaixo:
int a = 15;
int *b = &a;
printf("%d\n", a);
printf("%d\n", &a);
printf("%d\n", *&a);
printf("%d\n", b);
printf("%d\n", &b);
printf("%d\n", *&b);
Os valores impressos sero:
15
endereo da varivel a
15
endereo da varivel a
endereo da varivel b
endereo da varivel a

Podemos utilizar ponteiros para alterar valores de variveis ao acess-las indiretamente. Para tanto,
se passarmos para uma funo os valores dos endereos de memria em que suas variveis esto
armazenadas, essa funo pode alterar, indiretamente, os valores das variveis situadas no ponto de
execuo que realizou a chamada funo.
Para ilustrar, vamos considerar agora uma funo para realizar a troca de valores entre duas
variveis. Assim, para que os valores possam ser trocados precisamos passar os endereos das variveis
para a funo. O cdigo a seguir ilustra essa implementao.
// funo que troca os valores entre duas variveis
void troca(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
}

int main( ) {
int a = 5, b=7;
printf(Antes da troca: x=%d ; y=%d\n, a, b);
troca(&a, &b);
printf(Depois da troca: x=%d ; y=%d\n, a, b);
getch();
return 0;
}

5.4. Variveis globais
Outra forma de fazer a comunicao entre funes atravs de variveis globais. As variveis
globais so declaradas fora do corpo das funes. Uma varivel global visvel a todas as funes
subseqentes. Assim, qualquer uma dessas funes pode acessar e/ou alterar o valor da varivel
diretamente.
As variveis globais no so armazenadas na pilha de execuo, portanto no deixam de existir
quando a execuo de uma funo termina; elas existem enquanto o programa estive sendo executado.

5.5. Exerccios
1. Implemente uma funo para testar se um nmero inteiro primo ou no. Se o valor retornado pela
funo for 1, ento o nmero primo, se o valor for 0, ento o nmero no primo.
2. Implemente uma funo que retorne a soma dos n primeiros nmeros naturais mpares.
3. Implemente uma funo que calcule as razes de uma equao do segundo grau, do tipo ax
2
+ bx + c =
0.
Essa funo deve ter como valor de retorno o nmero de razes reais e distintas da equao. Se
existirem razes reais. Alm disso, deve ser possvel a impresso das razes da equao a partir do fluxo
de execuo principal.
4. Implemente uma funo que calcule a rea da superfcie e o volume de uma esfera de raio r.
A rea da superfcie e o volume so dados, respectivamente, por 4r
2
e 4r
3
/3.
5. Crie uma funo capaz de inverter um nmero qualquer fornecido pelo usurio. Ou seja, se o nmero
informado pelo usurio for 123456789, o programa deve exibir o nmero 987654321.
6. Elabore uma funo que obtenha o mnimo mltiplo comum (MMC) entre dois nmeros fornecidos.
7. Crie uma funo que, a partir de um nmero informado pelo usurio, efetue o clculo do dgito
verificador usando o algoritmo Mdulo 10.
8. Faa uma funo que calcule o Mximo Divisor Comum entre dois nmeros.

Referncias:
CELES, W. e CERQUEIRA, R. e RANGEL, J. L. Introduo a estruturas de
dados. 1 ed. Rio de Janeiro. Campus, 2004.
SINTES, Anthony. Aprenda Programao Orientada a Objetos: em 21 dias. So
Paulo: Pearson Education do Brasil. 2002.
DEITEL, H. M.; DEITEL, P. J. C++: como programar. So Paulo: Pearson
Prentice-Hall, 2006.

Você também pode gostar