Você está na página 1de 194

LGICA DE

PROGRAMAO

autor
FABIANO DOS SANTOS

1 edio
SESES
rio de janeiro 2015
Conselho editorial regiane burger; roberto paes; gladis linhares

Autor do original fabiano dos santos

Projeto editorial roberto paes

Coordenao de produo gladis linhares

Projeto grfico paulo vitor bastos

Diagramao bfs media

Reviso lingustica bfs media

Reviso de contedo simone markenson

Imagem de capa alexaldo | dreamstime.com

Todos os direitos reservados. Nenhuma parte desta obra pode ser reproduzida ou transmitida
por quaisquer meios (eletrnico ou mecnico, incluindo fotocpia e gravao) ou arquivada em
qualquer sistema ou banco de dados sem permisso escrita da Editora. Copyright seses, 2015.

Dados Internacionais de Catalogao na Publicao (cip)

S237l Santos, Fabiano dos


Lgica de programao / Fabiano dos Santos
Rio de Janeiro: SESES, 2015.
192 p. : il.

isbn: 978-85-5548-154-3

1. Memrias. 2. Linguagem. 3. Vetores. I. SESES. II. Estcio.

cdd 005.133

Diretoria de Ensino Fbrica de Conhecimento


Rua do Bispo, 83, bloco F, Campus Joo Ucha
Rio Comprido Rio de Janeiro rj cep 20261-063
Sumrio

Prefcio 7

1. Introduo Lgica de Programao 9


1.1 Histrico 11
1.2 Organizao de computadores 19
1.2.1 As memrias secundrias 22
1.2.2 A MEMRIA RAM 22
1.2.3 Caches e registradores 24
1.2.4 As memrias somente leitura (ROM) 24
1.2.5 A placa me 24
1.3 Lgica e lgica de programao 25
1.4 Algoritmos e formas de representao 27
1.4.1 Descrio Narrativa 28
1.4.2 Fluxogramas 29
1.4.3 Programao estruturada 36
1.4.3.1 Estrutura sequencial 37
1.4.3.2 A estrutura de seleo 38
1.4.4 A estrutura de repetio 40
1.4.5 Portugus estruturado 41
1.5 Linguagens de programao 42

2. Estrutura Sequencial 49

2.1 Analisando um programa com incio e fim 51


2.2 Entendendo a organizao de um programa 56
2.2.1 Alguns tpicos importantes 57
2.2.1.1 Tipos de dados 57
2.2.1.2 Declarao e inicializao de variveis 59
2.3 Adicionando entradas e sadas 61
2.4 Entendendo como os dados so armazenados 64
2.5 Utilizando o computador para fazer conta 66
2.5.1.1 Operadores aritmticos e de atribuio 67
2.5.1.2 Funes matemticas 69
2.5.1.3 Expresses lgicas e operadores relacionais 69
2.5.1.4 Operadores lgicos 70

3. Estruturas de Deciso 81

3.1 Introduo 83
3.2 Desvio condicional simples 84
3.3 Operadores relacionais 89
3.4 Desvio condicional composto 89
3.5 O operador ternrio 92
3.6 Desvios condicionais encadeados 94
3.7 O comando switch 99
3.8 Operadores lgicos 107

4. Estrutura de Repetio 119

4.1 Por que repetir? 121


4.2 Repetir at quando? Analisando entradas e sadas 122
4.3 Estilos de repetio 124
4.3.1 Repetio controlada por contador 124
4.3.2 Repetio com limite do contador determinado pelo usurio 127
4.3.3 Repetio controlada pelo resultado de uma operao 132
4.3.4 Repetio controlada pelo valor da entrada de dados 134
4.3.5 Repetio controlada pela resposta do usurio 136
4.4 Comparao entre as estruturas de repetio 142
4.5 Depurao de programas 143
5. Mdulos e Vetores 151

5.1 Introduo aos vetores 153


5.1.1Manipulao 154
5.2 Variveis compostas multidimensionais 161
5.2.1 Manipulao 163
5.3 mdulos: funes 173
5.3.1 Argumentos de funes 177
5.3.2 Escopo de variveis 178
5.3.2.1 Variveis Globais 178
5.3.2.2 Variveis Locais 178
5.3.2.3 Parmetros Formais 178
5.3.3 Chamada por valor e chamada por referncia 178
5.3.4 Chamadas por referncia 179
5.3.5 argc e argv 181
5.3.6 O return e retornos de funes 185
5.4 Fim do incio 186

Apndice 187
Prefcio
Prezados(as) alunos(as),

Se estivssemos escrevendo este texto h alguns anos provavelmente seria


em uma sala, com uma mquina de datilografar e cercado por livros e papis
com anotaes e lembretes para colocar no texto.
Hoje fazemos com um computador, conectado na internet o tempo todo (e
ai dela se cair!) e conseguimos acessar links e mais links de referncias e salvar
as anotaes na nuvem.
Steve Jobs, que dispensa apresentao, disse que Todos neste pas deve-
riam aprender a programar um computador pois isto ensina a pensar. E exa-
tamente esta a maior vantagem em saber programar um computador: desen-
volver o raciocnio e pensar abstratamente. No estamos falando que voc deve
se tornar o s da computao, a ideia aqui saber as principais estruturas e
us-las no apenas para programar, mas tambm para poder desenvolver com-
petncias de poder resolver problemas de uma maneira mais rpida e eficiente.
E acredite, programar no difcil! Intimida? Talvez, mas o que no intimi-
da quando no se sabe?, como pergunta o jogador da NBA Chris Bosh.
Saber programar vai abrir vrias oportunidades, no s de empregos, vai
abrir fronteiras de resoluo de problemas, de organizao de informaes, de
criao de novos negcios entre outras coisas.
E este convite que ns fazemos a voc. Vamos experimentar! Voc vai gos-
tar porque divertido! E muito til! Contamos com voc!
Quer saber a opinio de alguns famosos sobre programao?
Clique aqui :-) (use seu celular com leitor de QR Code)

Bons estudos!

7
1
Introduo
Lgica de
Programao
Quando voc estiver navegando na internet, use os mecanismos de pesquisa
para perceber quantos sites ensinam as pessoas a aprender a programao de
computadores gratuitamente.
A programao de computadores est fundamentada em um assunto cha-
mado lgica de programao o qual pode ser aplicado em qualquer rea do
conhecimento, como por exemplo, um engenheiro pode explicar para seus
colegas a descrio de um processo industrial por meio de um algoritmo, um
bioinformata pode discutir um determinado assunto no sequenciamento de
genes usando um algoritmo especfico e vrios outros exemplos. O que apren-
demos na lgica de programao nos ajuda a pensar abstratamente e entender
o mundo real por meio de comandos e procedimentos encadeados.
Alm disso, estamos cada vez mais conectados na internet, no ? Os celu-
lares esto ficando mais acessveis, assim como os planos de dados das opera-
doras facilitam o acesso, na verdade estamos cercados! E conhecer o funciona-
mento dos programas vai facilitar cada vez mais conhecer como os aplicativos
de celulares funcionam.
Nosso trabalho aqui aprender sobre algoritmos. Saber o que , como fun-
ciona, onde e como se aplica. E usar uma linguagem de programao como
suporte, o C/C++, que uma linguagem muito usada atualmente e base para
muitas linguagens atuais.

OBJETIVOS
Identificar os componentes bsicos de um computador
Reconhecer as diferentes representaes da lgica de programao.
Interpretar uma sequncia lgica em diferentes representaes.

10 captulo 1
1.1 Histrico
A histria dos algoritmos se confunde com a histria da computao. O com-
putador na verdade uma mquina, coitada, sem qualquer tipo de inteligncia.
Mas o que as tornam to poderosas, rpidas e temidas? Sua espantosa velocida-
de de fazer contas matemticas.
H alguns anos, um famoso enxadrista chamado Gary Kasparov desafiou
um computador da IBM chamado Deep Blue para um match1. Foi uma rdua
batalha, mas Kasparov conseguiu ganhar de uma mquina que foi especial-
mente preparada para jogar xadrez. A mquina no tinha inteligncia, porm
possua uma programao que aproveitava o excepcional hardware da mqui-
na para analisar milhares de jogadas ao mesmo tempo e escolher a melhor de-
las. Porm, quem fez a programao desta mquina foram pessoas.
Houve uma revanche. A equipe da IBM fez um upgrade no Deep Blue e o
tornou especialista em partidas de xadrez de Kasparov, ou seja, ela foi treinada
para jogar xadrez e mais: jogar contra Kasparov. Quer dizer, os programadores
da IBM tiveram que refazer os algoritmos para incluir jogadas de vrios outros
mestres em xadrez para enfim, conseguir derrot-lo. Ou seja, o computador
venceu por dois grandes motivos: primeiro, tinha um hardware extremamente
rpido e especfico para a tarefa, segundo, o computador foi preparado com jo-
gadas de outros mestres e at do prprio Kasparov para saber quais seriam suas
jogadas no futuro. Isso ocorreu em 1997.

CONEXO
Assista a um clipe sobre o Deep Blue aqui: https://goo.gl/A6IRYa. Embora esteja em ingls,
possvel compreender o que o narrador diz e o seu contexto.

1. Match, no xadrez, um conjunto de partidas com regras bem definidas. Possuem um esquema de melhor de 3, 5
ou 7 partidas a fim de no haver empate

captulo 1 11
Este exemplo serve para mostrar que por trs de qualquer mquina, h a in-
terveno fundamental de um humano. O computador sempre foi uma mqui-
na e para oper-la sempre foi necessrio um humano e um conjunto de regras
e procedimentos para operar a mquina corretamente. E h quem diga que o
que derrotou Kasparov foi um erro, um bug no programa do Deep Blue. O erro
desestabilizou Kasparov emocionalmente e o fez perder o jogo.

CONEXO
Veja o artigo sobre o bug. Disponvel em: <goo.gl/tecTSI>.

A histria da programao de computadores comea h muito tempo e mui-


tos autores citam que na Babilnia antiga, por volta de 3500 AC foi criada a es-
crita cuneiforme2.
Os sumrios, criadores deste tipo de escrita, utilizavam tbuas de argila, veja
a figura 1.1 para escrever sendo que os textos eram compostos basicamente de
poemas e histrias, contratos e acordos, texto sobre astronomia e matemtica.
O descobrimento destas tbuas de argila possibilitou perceber que os babi-
lnios utilizavam um sistema de numerao com base 60 (ns usamos a base
10) para poder representar nmero de ponto flutuante. A numerao babil-
nia influencia nossos dias, pois ainda temos alguns vestgios como a diviso da
hora em 60 minutos, os graus de uma circunferncia, os ngulos internos de
um triangulo equiltero.
A escrita cuneiforme tambm influenciou os algoritmos, pois com ela eram
escritos vrios procedimentos usando linguagem natural, como por exemplo:
Para calcular o volume da cisterna, se o seu raio for 2 e sua altura 7, ento o
volume 3,1 vezes 2 vezes 2 vezes 7.

2 Cuneiforme: forma de cunha.

12 captulo 1
Figura 1.1 Tbua de argila com escrita cuneiforme. Fonte: Wikipedia.

um algoritmo bem arcaico e os nmeros eram usados no lugar das


variveis.
Portanto, a necessidade de documentar processos e transform-los em ins-
trues para serem repetidas muito antiga. Temos que lembrar que os povos
da antiguidade cresciam separadamente e conforme a mistura de culturas foi
aumentando, vrias reas do conhecimento foram sendo desenvolvidas.
Como exemplo, vamos contar um caso ocorrido em Bagd, onde havia um
matemtico, astrnomo, astrlogo, gegrafo e autor persa chamado AbuAbd
Allah Muhammad ibn Musa al-Khwarizmi (780 a 850 dC) , ou melhor, al-Khwa-
rizmi, que apresentou vrias contribuies para a lgebra, equaes lineares
e quadrticas. A palavra algoritmo vem da raiz latina do seu nome, algoritmi.
A forma de apresentao dos seus trabalhos era feita usando linguagem
natural, porm simblica que tem certa semelhana com os algoritmos que
conhecemos atualmente. Um importante estudo foi tambm na rea de nume-
rao, pois os nmeros indo-arbicos, como sabemos, so a base da nossa nu-
merao atual.
O livro original deste trabalho foi perdido, mas a traduo para o latim seria
Algorthmi de nmero Indorum, este trabalho um dos primeiros relatos que
temos sobre algoritmos.

captulo 1 13
Existem outras contribuies da antiguidade para os atuais algoritmos,
como por exemplo:
Euclides (300 AC), o pai da Geometria, descreveu um algoritmo
para calcular o mximo divisor comum (MDC), chamado de Algoritmo de
Euclides (veja a animao do algoritmo em: http://pt.wikipedia.org/wiki/
Algoritmo_de_Euclides)
Alexander de Villa Dei (1175-1240) foi um autor, professor e poeta fran-
cs que escreveu textos de gramtica e aritmtica em latim, todos em verso.
Alexander escreveu Carmen de Algorismo, um poema sobre aritmtica o qual
ensinava os seus alunos a arte do clculo.

claro que no havia um mtodo formal para descrever os algoritmos.


Como percebemos, eram usados a linguagem natural, poemas e at msica.
A descrio dos algoritmos comeou a sofrer maiores influncias com os
trabalhos de Ada Augusta Byron King, Condessa de Lovelace (1815-1852), ou
Ada Lovelace. Ela foi uma matemtica e autora inglesa que reconhecida atu-
almente por ter escrito o primeiro algoritmo para ser processado por uma m-
quina: a mquina analtica de Charles Babbage.

A mquina analtica de Charles Babbage (1791-1871) foi um dos primeiros computa-


dores que conhecemos. Tratava-se de uma mquina conceitual de uso geral que podia
somar, subtrair, dividir e multiplicar de maneira sequencial na razo de 60 operaes
por segundo. Ela tinha muita semelhana em conceito, com os atuais computadores.
Charles Babbage foi um cientista, matemtico, engenheiro mecnico e inventor ingls
o qual morreu antes de ver sua mquina totalmente construda. Veja a mquina na
figura 1.2.

14 captulo 1
Figura 1.2 A mquina analtica de Babbage (Fonte: computerhistory.org)

A contribuio de Ada se deu porque Charles Babbage ministrou uma pa-


lestra sobre sua mquina na Universidade de Turim, na Itlia. Um engenheiro
italiano, ouvinte da palestra, publicou esta em francs a qual foi republicada
em uma revista cientfica da Universidade de Geneva, na Sua. Babbage pediu
ento para Ada traduzir esta publicao para o ingls e adicionar as anotaes
de Ada sobre o tema. A traduo de Ada com suas anotaes foram publica-
das com suas iniciais AAL, pois as mulheres no possuam educao formal
naquela poca, tampouco em matemtica. Ada tinha aulas particulares. Casou
com 19 anos e teve trs filhos seguindo a tradio feminina da poca.
As notas de Ada foram republicadas em 1953, mais de cem anos aps sua
morte. Nesta ocasio, a mquina de Babbage foi reconhecida por ser um com-
putador e as notas de Ada como um software.
H um algoritmo para calcular a Sequncia de Bernoulli, porm nunca che-
gou a ser testado, pois a mquina de Babbage ainda no tinha sido construda,
mas de qualquer forma, considerado o primeiro programa e Ada o nome de
uma linguagem de programao, dado como homenagem.
Em relao s linguagens de programao, Konrad Zuse (1910-1955) teve
uma grande importncia. Ele foi o inventor do primeiro computador eletrome-
cnico o qual fazia clculos e apresentava os resultados em fita perfurada. A pri-
meira verso deste computador, chamada Z1, foi construda na sala de sua casa.

captulo 1 15
O computador na verdade era um baco mecnico controlado por pinos de
metal e correias e programado por fitas perfuradas. Em 1945, Zuse desenvolveu
o projeto de uma linguagem de programao chamada Plankalkul.
Esta linguagem possua vrias contribuies, as quais possibilitaram Zuse
criar vrios programas como ordenao, busca, anlise sinttica etc.

Atribuio, expresses aritmticas, subscritos


Uso do bit como tipo primitivo e tipos mais complexos como inteiro, real,
vetores, etc
Utilizao de laos e comandos condicionais, alm de sub-rotinas

Veja um exemplo desta linguagem. O exemplo de um programa que cal-


cula o valor mximo de 3 variveis usando a funo max definida no programa:

P1 max3 (V0[:8.0],V1[:8.0],V2[:8.0]) => R0[:8.0]


max(V0[:8.0],V1[:8.0]) => Z1[:8.0]
max(Z1[:8.0],V2[:8.0]) => R0[:8.0]
END
P2 max (V0[:8.0],V1[:8.0]) => R0[:8.0]
V0[:8.0] => Z1[:8.0]
(Z1[:8.0] < V1[:8.0]) -> V1[:8.0] => Z1[:8.0]
Z1[:8.0] => R0[:8.0]
END

Como podemos perceber, uma linguagem que no influenciou outras,


dada sua complexidade, porm ainda assim considerada de alto nvel. Ela s
foi amplamente publicada em 1972 e seu compilador em 1998.

Lembre-se que o termo alto nvel usado para linguagens significa que a linguagem
de programao escrita de uma forma que seja compreensvel para o programador.
Baixo nvel usado para linguagens de mquina.

16 captulo 1
Temos que lembrar novamente da tecnologia disponvel na poca: no ha-
via teclado, monitor e mouse para operar um computador. Um computador era
uma mquina que ocupava espaos fsicos muito grandes e era basicamente
composta de fios e vlvulas. Programar na verdade era trocar fios de lugar e
quando era disponvel, furar cartes. Era uma atividade que durava muito tem-
po e no podia haver erros (um erro resultava em uma nova perfurao de car-
tes, imagine ento para descobrir onde estava o erro!).
Em 1949, John Mauchly props a linguagem Short Code. Era uma lingua-
gem de alto nvel que representava expresses matemticas de uma maneira
possvel de ser entendida.
Em 1950, Alick Glennie desenvolveu a Autocode, a qual usava um compi-
lador para converter a linguagem em linguagem de mquina. Esta linguagem
usava o computador Mark I da Universidade de Manchester.
Outra linguagem de programao precursora foi a Flow Matic, desenvolvi-
da por Grace Hooper para o computador UNIVAC entre 1955 e 1959. Esta lin-
guagem foi uma tentativa de evitar que usurios de processamento de dados
lidassem com tanta matemtica na programao de computadores e assim foi
escrita uma especificao para a linguagem e implementado um prottipo no
final dos anos 50. A Flow Matic foi forte influncia para o aparecimento da lin-
guagem COBOL a qual usada at hoje.
A linguagem Fortran foi desenvolvida pela IBM na metade dos anos 50 e foi
a primeira linguagem de alto nvel amplamente utilizada, inclusive at hoje
para previso do tempo, dinmica de fluidos, etc..
O projeto da linguagem na IBM foi liderado por John Backus e o que era
para ter demorado seis meses, demorou dois anos. Com a linguagem Fortran
foi possvel diminuir o nmero de erros dos programadores e alm disso pos-
sua um compilador que gerava um cdigo de qualidade.
Outras linguagens que apareceram nesta poca e ainda so usadas at hoje
so LISP (1958) e COBOL (1959). A Algol 68 foi uma linguagem especial a qual
possua muitas caractersticas que influenciou Niklaus Wirth a desenvolver
a linguagem Pascal em 1969 e publicada em 1970. A linguagem BCPL que foi
base para a criao da linguagem C foi criada em 1967. A linguagem BASIC,
muito famosa e usada na dcada de 80, foi criada em 1964.
A dcada de 80 foi a poca de consolidao das chamadas linguagens dos
paradigmas imperativos, veja o box.

captulo 1 17
Existem vrios paradigmas nas linguagens de programao:

Paradigmas imperativos: compem as linguagens que facilitam a computao por


meio de mudanas de estado. Temos os paradigmas:
Procedural: os programas so executados por meio de chamadas sucessivas a
procedimentos separados. Fortran e Basic so exemplos deste paradigma.
Estrutura de blocos: a maior caracterstica deste paradigma o aninhamento de
escopos como ocorre nas linguagens Algol 60, Pascal e C.
Orientao a objetos: o paradigma que suporta a criao de classes e objetos.
Como exemplo temos o C++, Java, Python, Ruby, C# e outras
Computao distribuda: neste paradigma, uma rotina pode ser dividida em partes
que podem ser executadas independentemente. Exemplo: linguagem Ada.
Paradigmas declarativos: os programas so declarados como uma relao ou funo.
Paradigma funcional: um programa um conjunto de funes como em Lisp,
Scheme e Haskell
Programao Lgica cujo maior exemplo a linguagem Pro

A dcada de 60 e 70 foi muito produtiva em relao ao aparecimento de no-


vas linguagens. A dcada de 80, ao invs de continuar nessa produo de novos
paradigmas, foi uma poca na qual as caractersticas j desenvolvidas foram
melhoradas como o caso da linguagem C++, que veio da linguagem C e adicio-
nou os conceitos de orientao a objetos.
Ainda nesta dcada houve um grande avano na programao de sistemas
em larga escala e em especial com a adoo de mdulos ao invs de programar
todo o sistema. Linguagens como Modula, Ada e ML foram bastante usadas
porque tratavam os mdulos de uma maneira muito eficiente para a poca.
Algumas linguagens que foram desenvolvidas neste perodo incluem: C++
(1980), Ada (1983), Matlab (1984), Objective-C (1986), Perl (1987), TCL (1988) e
outras.
A dcada de 90 conhecida como a era das linguagens da internet. E no po-
dia ser diferente: a internet cresceu rapidamente principalmente no meio dos
anos 90 abrindo uma nova plataforma para desenvolvimento de aplicativos.
Linguagens como Javascript (1995), Python (1991), Visual Basic (1991), Object
Pascal (1995), Java (1995), PHP (1995) e outras apareceram nesta dcada.

18 captulo 1
Todas estas linguagens trazem consigo o paradigma da orientao a obje-
tos e caractersticas como o desenvolvimento rpido de aplicaes (RAD), alm
de possibilidade de desenvolvimento de scripts prprios para Internet. A lin-
guagem Java teve um grande destaque, pois possibilitava ter o seu cdigo fonte
escrito em uma plataforma e ter a aplicao rodando em outras plataformas
diferentes.
Aps a dcada de 90 e incio dos anos 2000, percebe-se que as linguagens
continuam se aperfeioando tanto no mercado quanto na pesquisa. Algumas
tendncias que so encontradas nas atuais linguagens so:
Aumento do suporte programao funcional em linguagens usadas comer-
cialmente. Isto implica em gerao de cdigo mais fcil e maior produtividade
Aumento do suporte programao paralela e concorrente
Mecanismos para adicionar segurana e confiana na linguagem
Desenvolvimento orientado a componentes
Aumento do estudo em mobilidade e distribuio de aplicativos
Integrao com bancos de dados e XML
Aumento do desenvolvimento de ferramentas de cdigo aberto como
ocorre nas linguagens Python, Ruby, PHP e outras
Outras

1.2 Organizao de computadores


A organizao de computadores uma rea da computao que estuda os com-
ponentes fsicos de um computador, ou tambm chamado de hardware. im-
portante estudar a organizao dos computadores para entender como um pro-
grama executado, armazenado e como ele se comunica com as outras partes
do computador.
A cincia da computao no uma rea to velha assim. Considerando o
tpico 1.1 onde vimos que os primeiros computadores datam de 1600, temos
que o computador tem 500 anos e se considerarmos os primeiros computado-
res transistorizados (dcada de 50), temos apenas 60 anos de evoluo.
Mas um elemento permanece fiel s primeiras geraes: sua arquitetura
interna. Embora existam evolues, a arquitetura inicialmente concebida por
John Von Neumann foi adaptada aos nossos dias mas ainda assim utilizada.

captulo 1 19
CONEXO
Conhea um pouco mais sobre Von Neumann neste link da Wikipedia: http://pt.wikipedia.
org/wiki/John_von_Neumann

Von Neumann sugeriu uma forma de organizar o computador por meio dos
seguintes elementos:
Uma memria, dividida em primria e secundria
Uma unidade de controle
Uma unidade lgica e aritmtica (ALU)
Dispositivos de entrada e sada

Memria

Unidade
Aritmtica
Unidade e Lgica
de controle

Acumulador

Entrada Sada

Figura 1.3 Diagrama da arquitetura de Von Neumann (Fonte: http://pt.wikipedia.org/wiki/


Arquitetura_de_von_Neumann)

20 captulo 1
Atualmente os computadores ainda possuem variaes desta organizao.
Basicamente a arquitetura permite que o computador funcione em ciclos onde
em cada ciclo ocorre a busca de novas instrues, a decodificao da instruo
e a sua execuo. Os ciclos so controlados e promovidos pela CPU (Unidade
Central de Processamento), composta pela Unidade de Controle e Unidade
Lgica Aritmtica e tem como principal funo executar os programas que es-
to armazenados na memria principal, buscar as instrues dos programas,
decodific-las e execut-las sequencialmente, veja a figura 1.4.
Portanto, percebemos que a CPU na verdade no um componente unit-
rio. um componente que dividido em vrias partes entre elas a Unidade de
controle, a ULA, o contador de programa e os registradores, que podem ser es-
peciais ou de uso geral, cache de memria e outros componentes mais moder-
nos. Todos esses elementos ficam encapsulados em um nico chip chamado
de processador. Na figura 1.4 tambm so mostrados o aspecto externo de um
processador e uma foto amplificada da sua arquitetura interna.

Inico

Buscar a
prxima
instruo

Interpretar a
instruo
(decodificar)

Executar
instruo

Fim

Figura 1.4 Ciclo da arquitetura de Von Neumann, um processador Intel I7 e a sua arquitetu-
ra e organizao interna (Fonte: http://tecnologia.hsw.uol.com.br/core-i71.htm)

captulo 1 21
A memria o local onde os dados e programas ficam armazenados para
serem executados. Existem vrios tipos e classificaes de memria, entre elas:
Volteis e no volteis
Quanto sua forma de operao e acesso (Read Only Memory (ROM) me-
mria somente de leitura, Random Access Memory (RAM) memria de acesso
aleatrio)
Velocidade de operao

1.2.1 As memrias secundrias

As memrias secundrias servem para auxiliar a memria RAM quanto ao ar-


mazenamento de dados. Elas tambm so volteis e podem ser escritas e lidas.
Possuem custo mais baixo que as memrias RAM e normalmente podem
armazenar mais informao, chegando a Terabytes atualmente e por isso so
usadas principalmente para armazenamento de programas no ativos (que no
esto sendo executados no momento).
Os maiores exemplos deste tipo de memria so os pendrive (flash drives),
discos rgidos (hard disk HD), cartes SD, MD, etc...

1.2.2 A MEMRIA RAM

A memria RAM do tipo que pode ser lida e gravada, portanto considerada
voltil. Nela so carregados os programas que esto sendo executados naquele
momento pela CPU. Quando a energia cessa, os dados presentes neste tipo de
memria so apagados.
Antes o custo era muito alto, porm com a evoluo dos componentes ele-
trnicos, a memria RAM tem diminudo de preo.
Ela possui alta velocidade, pois suas caractersticas eletrnicas e o barra-
mento que elas utilizam as aproximam da CPU e tornam a comunicao com os
outros componentes mais fcil e mais rpida.
A figura 1.5 mostra vrios tipos de memria RAM e sua evoluo ao longo do
tempo. Atualmente as memrias RAM mais procuradas para os computadores
pessoais so do tipo DDR3.

22 captulo 1
Figura 1.5 Vrios tipos de memria RAM (Fonte: http://pt.wikipedia.org/wiki/RAM)

Ao longo do tempo as memrias RAM foram evoluindo e sofrendo modificaes em


sua arquitetura interna. Essas modificaes ocorreram para acompanhar a arquitetura
das placas-me e para aumentar a capacidade de armazenamento de dados e a taxa
de transferncia. A DDR3 a verso mais nova de uma famlia de memrias RAM,
chamadas de SDRAM que possui um ciclo de trabalho que sincronizado com o clock
do processador.

captulo 1 23
1.2.3 Caches e registradores

So componentes que apareceram para aumentar a velocidade e eficincia de


todo o hardware do computador. Tambm so variaes da memria RAM e fi-
sicamente esto localizados perto do processador para poder ser usadas como
armazenamento temporrio de operaes de dados feitas pelo processador
com mais frequncia.
Por serem variaes da RAM, so volteis e podem ser escritas e lidas.
Possuem desempenho muito superior em relao a velocidade de trocas de
dados mas no possuem grande capacidade de armazenamento.

1.2.4 As memrias somente leitura (ROM)

So representadas atualmente pelos CDs e DVDs (que no sejam regravveis).


Neste tipo de memria, a informao gravada apenas uma vez e no pode ser
sobrescrita guardando assim informaes por bastante tempo.
Em relao a preo, bem mais barata que os outros tipos de memria que
j vimos, porm so muito mais lentas.

1.2.5 A placa me

A placa me (mother board ou main board) o componente que conecta to-


dos os outros elementos do computador anteriores. Alm disso ela contm os
barramentos por onde passam os dados de informaes e controle e tambm
fornece energia eltrica para os componentes.
A figura 1.6 mostra uma arquitetura tpica de uma placa me. Percebemos
que ela contm vrios setores onde so conectados elementos de acordo com
o seu tipo.
Basicamente os principais componentes que todo programador deve saber
sobre um computador so esses. Na verdade, qualquer equipamento micropro-
cessado atualmente possui estes componentes como por exemplo um aparelho
para home theater, receptores de TV a cabo, os smartphones e tantos outros
que encontramos no nosso dia a dia.

24 captulo 1
Slot da Placa
de Vdeo UCP

Clock FSB

Northbridge
Barramento
AGP ou PCI
Express
Slots de memria
Barramento
interno

Southbridge
Controlador E/S
IDE/SATA Placa de Vdeo
USB Onboard
Ethernet
udio
CMOS

Slots PCI Super E/S


Porta serial
Porta paralela
Drive / Mouse
Teclado

ROM
Flash
(BIOS)

Figura 1.6 Arquitetura tpica de uma placa me

1.3 Lgica e lgica de programao


O estudo da lgica bem abrangente pois desde a antiguidade os povos tem
refletido e estudado sobre a lgica. Basicamente, a lgica tem duas definies
principais: o estudo do uso do raciocnio em alguma atividade ou tambm pode
ser entendida nos campos das exatas, cincias e matemtica, ou tambm cha-
mada de lgica matemtica.
Basicamente, a lgica a cincia que estuda as leis e critrios de validade
que regem o pensamento e a demonstrao, ou seja, a cincia dos princpios
formais do raciocnio.
A lgica usada pelos profissionais em geral, especialmente os das cincias
exatas, porque estes possuem como objetivo solucionar problemas e atingir as
metas com eficincia e eficcia usando recursos computacionais ou outros. O
conhecimento na forma de lidar com problemas administrativos, de controle,

captulo 1 25
de planejamento e de estratgia necessita de grande ateno e desempenho de
conhecimento do nosso raciocnio.
A lgica est presente no nosso dia a dia. Veja o exemplo:

A gaveta est fechada.


A agenda est na gaveta.
Logo, para pegar a agenda, preciso abrir a gaveta.

Outro exemplo:

Pedro mais velho que Joo.


Joo mais velho que Tiago.
Logo, Pedro o mais velho e Tiago o mais novo.

Lgico, no?

A lgica na verdade a cincia que nos ajuda a colocar ordem no


pensamento.

Diferena entre eficincia e eficcia: existem algumas definies mais tcnicas


sobre essas duas palavras. Vamos adotar uma mais prtica: eficincia quando um
sujeito atinge os seus objetivos seguindo as normas e procedimentos j pr-definidos,
ou seja, fazer o certo. A eficcia quando o sujeito tambm consegue atingir os
objetivos, porm seguindo os procedimentos estabelecidos de uma maneira parcial e
usa alguns elementos como a criatividade para se chegar no objetivo, ou seja, a coisa
certa. Para quem gosta de futebol, eficincia jogar bonito e ganhar o jogo, eficcia
ganhar o jogo com um gol de bico aos 45 minutos do segundo tempo.

A lgica de programao um campo especfico da lgica matemtica que


envolve o uso da lgica na resoluo de problemas computacionais, especial-
mente na rea de desenvolvimento de algoritmos.
Muitos recursos so usados pelos profissionais para representar o seu ra-
ciocnio lgico como os fluxogramas, os diagramas de bloco e at mesmo a
linguagem natural e variaes da lngua nativa do profissional (no nosso caso,
o portugus). Por meio desses recursos, como por exemplo o fluxograma,

26 captulo 1
possvel representar graficamente a sequncia de operaes a serem feitas por
um programa.
Desta forma, de posse do desenho do raciocnio, possvel codificar o dese-
nho em alguma linguagem de programao por outra pessoa, desde que sejam
adotados padres para o desenho.
Alguns autores afirmam que a tcnica mais importante no projeto da lgica
de programao a chamada programao estruturada, que possui como meta:
Agilizar o desenvolvimento do cdigo fonte
Facilitar a depurao do programa
Verificar possveis erros
Facilitar a manuteno dos programas

Alm disso, a programao estruturada possui quatro etapas essenciais:


1. Criar as instrues e comandos em sequncias interligadas apenas por
estruturas sequenciais, repetitivas ou de seleo
2. Criar instrues em blocos pequenos e combin-las
3. Compartilhar os mdulos do programa entre os vrios participantes da
equipe, sob a superviso de um programador mais experiente
4. Revisar o trabalho em reunies frequentes e previamente programadas.

A seguir vamos apresentar algumas formas de representar os algoritmos e


relacionar os diagramas com a programao estruturada.

1.4 Algoritmos e formas de representao


Basicamente um algoritmo uma sequncia de passos que devem ser executa-
dos ordenadamente para cumprir um determinado objetivo. como uma re-
ceita de bolo: se a receita foi bem escrita e voc segui-la direitinho, seu bolo vai
sair conforme o desejado. claro que alguma experincia indicada na produ-
o de um bolo, mas uma boa receita dar as dicas e demais pegadinhas para
que o bolo seja apreciado por todos.
Outro exemplo de um rob. O rob faz exatamente as tarefas que foi pro-
gramada, nem a mais, nem a menos. Imagine que voc vai program-lo a sair de
So Paulo e ir para o Rio de Janeiro de carro. Muitos vo dizer: s pegar a via
Dutra! e no bem assim. E os pedgios? E a questo dos radares de velocida-
de? E mais outros tantos detalhes.

captulo 1 27
Um algoritmo pode ser representado por muitas maneiras, desde figuras
at textos escritos em portugus. O que une todas essas formas de represen-
tao o significado que eles possuem para quem est lendo e interpretando.
O algoritmo, independente da forma pela qual esteja representado, tem que
ser descrito de uma forma clara e fcil de ser seguida. Desta forma, no caso de
uma depurao, ele ser melhor rastreado e ter seus eventuais erros reparados
mais facilmente.

1.4.1 Descrio Narrativa

A forma mais intuitiva escrever um algoritmo por meio de um texto narrativo.


Uma receita de bolo, como temos usado como exemplo, est escrita na forma
narrativa. Porm, j percebemos que esta forma pode trazer problemas: j co-
mentamos que as receitas de bolo podem ser imprecisas e esconder detalhes
que vo resultar em pessoas insatisfeitas.
A descrio narrativa consiste em entender o problema e propor sua soluo
por meio de uma escrita em linguagem natural. A maior vantagem da descrio
narrativa que no necessrio aprender novas tcnicas e conceitos, consiste
somente em usar a linguagem nativa.
Esta uma desvantagem da narrativa: ser imprecisa e pode gerar ambigui-
dades (vrios tipos de interpretao). Isto acarreta futuramente problemas na
forma de passar o algoritmo para uma linguagem de programao.
Porm, a narrativa forte quando usada como comentrio de um determi-
nado trecho de um algoritmo explicando aquela parte para quem for codific-la.
Vamos estudar um exemplo clssico: trocar um pneu na forma de descri-
o narrativa.

Afrouxe um pouco os parafusos


Levante o carro
Retire os parafusos
Retire o pneu
Coloque o pneu reserva
Aperte os parafusos
Abaixe o carro
Aperte os parafusos completamente

28 captulo 1
Quais so os problemas que voc percebe no Algoritmo 1? Se voc for um
trocador de pneu com certa experincia vai entend-lo perfeitamente, porm se
voc nunca trocou um pneu de carro na vida vai encontrar alguns pontos com-
plicados: como vou levantar um carro?. simples: pegue o macaco!. Que
macaco???. Usando a receita novamente como exemplo, se voc nunca fez um
pudim de leite condensado vai ficar com muita dvida na parte da receita onde
pede para coloca-lo em banho maria! Quem essa Maria?.
O algoritmo est correto, mas gera muitas dvidas para quem no entende
do assunto. A descrio narrativa uma boa alternativa para a elaborao de
algoritmos, mas gera impreciso e falta de confiabilidade no entendimento do
algoritmo. Alm disso, temos muito texto para descrever coisas simples.

1.4.2 Fluxogramas

O fluxograma, ou flowdraw, uma forma grfica de representar algoritmos. O


fluxograma foi muito utilizado para representar algoritmos por muito tempo.
Ainda hoje muitas pessoas usam o fluxograma para desenhar a forma de execu-
o de um processo.
O fluxograma possui algumas caractersticas fundamentais:

Possui smbolos padronizados: cada smbolo representa uma ao ou


funcionalidade e so universais, ou seja, os mesmos smbolos usados no Brasil
so usados internacionalmente.
Os fluxogramas possuem uma sintaxe e uma semntica bem definidas. A
semntica de um fluxograma corresponde ao que cada smbolo significa. Ou
seja, cada instruo possui um smbolo especfico e o comando escrito dentro
do smbolo tem que ser claro o suficiente. Sobre a sintaxe, ela corresponde ao
uso correto dos elementos do fluxograma: cada smbolo permite que um con-
junto de expresses prprias seja usado e as expresses mostram as operaes
a serem realizadas com os dados.
fcil de traduzir para qualquer linguagem de programao: devido aos
padres adotados nos smbolos, possvel fazer uma correspondncia direta
entre os smbolos e os comandos encontrados nas linguagens de programao,
at mesmo as mais atuais, desde que esteja sendo considerada uma sequncia
lgica.

captulo 1 29
Um fluxograma possui algumas regras para que possa representar correta-
mente um determinado processo:
O fluxograma precisa ser claro e muito bem escrito de forma que sua leitu-
ra no leve a gerar dupla interpretao de um determinado comando.
Procure criar desenhos e quebr-los em vrios nveis. Deixe os nveis ini-
ciais para o contexto principal e para as principais ideias. Os diagramas poste-
riores contero o detalhamento na profundidade necessria.
A direo de leitura de um fluxograma sempre de cima para baixo, se-
guindo as setas. Quando o espao fsico no permitir, possvel recomear o
desenho na coluna adjacente esquerda do fluxo atual.
incorreto e proibido cruzar linhas de fluxo de dados

Observe a figura 1.7. Ela mostra um fluxograma simples representando o


processo de trocar o pneu de um carro.

Incio

Afrouxar os parafusos da roda,


um a um

Com o macaco, levante o carro

Termine de afrouxar os parafusos


da roda e os retire

Pegue o macaco

Substitua o pneu

Coloque e aperte os parafusos

Com o macaco, abaixe o carro

Aperte os parafusos
definitivamente

Fim
Figura 1.7 Fluxograma representando o processo de trocar pneu.

30 captulo 1
O fluxograma da figura 1.7 bem comportado, ou seja, percebemos que
ele segue uma estrutura sequencial sem muitos desvios. Existem fluxogramas
bem mais complexos do que o apresentado e isso varia de acordo com a situa-
o que est sendo representada.
Como j vimos, cada figura em um fluxograma possui um significado. A ta-
bela 1.1 mostra os principais elementos de um fluxograma e seu significado.

SMBOLO NOME FUNO

Terminador Representa o incio e o fim de um processo.

Fluxo Mostra o sentido de execuo do processo.

Conector MOstra ligaes com outras partes do fluxograma.

Armazena temporariamente o resultado


Atribuio
de um processamento

Processo Faz o clculo de expresses e/ou executa funes.

Faz a entrada manual de dados,


Leitura de dados
na execuo do algoritmo

Exibio Apresenta os resultados de um processamento

Deciso Avalia uma expresso lgica ou relacional

Subprograma
ou processo Processa chamada de funes ou procedimentos
pr-definido

Tabela 1.1 Smbolos e funes de um fluxograma

Continuando com as regras gerais de um fluxograma, observe as regras a


seguir:
Somente uma linha de fluxo deve sair ou chegar a um terminador:

incio fim

captulo 1 31
O processo permite apenas uma linha de sada de fluxo. Essa regra bem
desobedecida. Quando o programador achar que existem duas sadas, impor-
tante que ele reveja o fluxograma a fim de considerar uma deciso e no um
processo:

processo processo

A deciso permite que apenas uma linha de entrada chegue, mas permite
que duas ou trs linhas de sada sejam possveis:

sim no >0 <0

=0

Ainda:
O texto de que fica dentro de cada elemento deve estar adequado instru-
o a ser executada
Os conectores so usados para reduzir o nmero de linhas de um
fluxograma
Evite cruzar linhas a fim de deixar o fluxograma claro
Normalmente a validao de um fluxograma feito por um conjunto de
testes chamados de teste de mesa

Usando os elementos apresentados, vamos mostrar um fluxograma repre-


sentando um algoritmo para ler dois nmeros, diferentes de zero, e calcular
sua mdia.

32 captulo 1
incio

Digite nmero 1
(n1)

Digite nmero 2
(n2)

Nmeros
no so zeros?

sim

Calcule a
mdia
aritmtica

Mostre o
resultado

fim

Figura 1.8 Fluxograma clculo da mdia entre dois nmeros.

Vamos analisar o fluxograma da figura 1.8:


1. O fluxograma comea com um smbolo indicando o incio do processo.
Observe que sai apenas 1 fluxo dele.
2. O primeiro paralelogramo pede para que o usurio digite (faa a entra-
da de dados) o primeiro nmero o qual ser chamado de n1.
3. O segundo paralelogramo faz o mesmo, chamando o segundo nmero
de n2.

captulo 1 33
4. O losango representa a deciso. Neste momento o programa ter que
avaliar se algum dos nmeros igual a zero. Poderamos ter melhorado a des-
crio deste smbolo, mas da forma como est fica claro que ser feito um teste
nos nmeros.
5. Se algum dos nmeros for zero, o fluxo do programa volta para o incio
da entrada de dados e faz a leitura novamente.
6. Se nenhum for zero, o fluxo avana para o processamento no retngulo
onde ser calculada a mdia aritmtica entre n1 e n2.
7. O trapzio invertido representa a exibio do resultado. Em algumas
notaes de fluxograma, quando a exibio feita em papel, como um relat-
rio, usado outro smbolo, mas basicamente para representar a exibio de da-
dos usamos o trapzio como est mostrado aqui.
8. Seguindo o fluxo, o programa finaliza.

Agora vamos analisar outro exemplo e verificar que os fluxogramas podem


ficar mais complicados a medida que o problema se torna mais complexo. O
exemplo tem como objetivo avaliar e calcular uma equao do segundo grau
lembrando que a forma desta equao ax2 + bx + c = 0. O programa deve calcu-
lar as razes x1 e x2 da equao quando possvel. Isto varia de acordo com a raiz
de delta, onde o delta = b2 4*a*c. Veja o fluxograma da figura 1.9.
O programa de clculo das razes de uma equao do segundo grau mais
complexo que o da mdia aritmtica e percebemos que o desenho visualmente
ocupa um espao fsico maior. J deu para perceber que complexos maiores vo
ocupar mais espao e como normalmente esses desenhos so impressos, veja
que isto pode ser um ponto negativo desta representao de algoritmo. Porm,
observar um processo por meio de um desenho muito eficiente para entender
o processo como um todo.

34 captulo 1
incio

Ler a, b, c

sim

a = 0?

no

delta (D) = b2 4*a*c

Sem razes reais D<0 D = 0? D=0 x = b / 2*a

D>0

x1 = b + sqrt(D) / 4*a

Duas razes
x2 = b sqrt(D) / 4*a reais e iguais

Duas razes reais e distintas

informar o
resultado

fim

Figura 1.9 Fluxograma - clculo das razes de uma equao do segundo grau.

captulo 1 35
Vamos analis-lo:
1. Aps o incio do programa, feita a leitura das 3 variveis a, b, e c da
equao.
2. Em seguida necessrio fazer uma avaliao do valor de a. Se for zero,
a equao no do segundo grau e assim o fluxo volta para o incio, para fazer
a leitura de novos dados.
3. Se a varivel a no for zero, feito o clculo de delta, que foi chamado
D na nossa representao. O sinal do acento circunflexo em b^2 significa uma
exponenciao, neste caso, b elevado ao quadrado.
4. Aps o clculo de delta, ele analisado pois pode assumir trs valores:
igual, menor ou maior que zero.
5. Se delta for menor que zero, a equao no ter razes reais e assim o
programa levado para o final, informando o resultado para o usurio.
6. Se delta for maior que zero, a equao ter duas razes reais e diferen-
tes. O programa prossegue para o clculo das duas razes (x1 e x2), informa o
resultado e finaliza. Observe que neste processo, usamos a funo sqrt() a qual
faz o clculo da raiz quadrada do valor de delta (D). Vamos explicar o uso de
funes em outro captulo.
7. Se delta for igual a zero, o fluxo prossegue para o clculo das duas razes
reais e iguais. O programa calcula as razes, informa o resultado e finaliza.

1.4.3 Programao estruturada

Os fluxogramas so bastante utilizados para um paradigma de programao


que j vimos um pouco chamado programao estruturada. Como o prprio
nome sugere, este tipo de paradigma est baseado em trs estruturas princi-
pais: as estruturas sequenciais, as estruturas de deciso e as estruturas de re-
petio. Toda linguagem de programao que est baseada neste paradigma
possui estas estruturas.
Estas estruturas tem um ponto em comum: possui um ponto de entrada e
um nico ponto de sada e isto pode ser representado por um fluxograma. De
fato, a programao estruturada tem muita compatibilidade com os fluxogra-
mas, por isso que fluxogramas so usados at hoje: porque as linguagens prin-
cipais que so usadas ainda possuem elementos estruturados.

36 captulo 1
Vamos examinar cada uma dessas estruturas a seguir, porm teremos um
captulo dedicado para cada uma delas mais adiante.

1.4.3.1 Estrutura sequencial


Como o nome sugere, trata-se de uma sequncia ou seja, o fluxo de execuo
de um programa executado linearmente com os comandos sendo executados
um aps o outro. Neste caso, deve existir apenas um caminho possvel no con-
junto de instrues de um algoritmo.
Vamos examinar um exemplo de uma estrutura sequencial: o objetivo de-
terminar o valor do saldo no final do 3 ms de uma aplicao financeira, com
investimento inicial de R$100,00, juros de 1% ao ms.

Voc lembra das aulas de fsica quando tinha que calcular o valor da velocidade de um
carro, da distncia percorrida e etc.? Lembra que voc usava frmulas para isso? Por
exemplo, a frmula da velocidade mdia Vmdia = dt/dS, onde dt a variao do
tempo e dS a variao da distncia percorrida. Ou seja, esses elementos so chama-
dos de variveis, ou valores que podem variar em um programa ou, no caso, em uma
equao.

No nosso exemplo teremos algumas variveis:


i: valor do investimento inicial
j: a taxa de juros
p: saldo ao final do 1 ms
s: saldo ao final do 2 ms
t: saldo ao final do 3 ms

O fluxograma para o exemplo mostrado na figura 1.10. Veja o quanto o


fluxograma colabora e nos mostra visualmente o fluxo do processo. Olhando
a figura muito fcil perceber que a estrutura sequencial caracterizada por
uma sequncia ordenada de comandos. No h desvios e nem repeties,
uma sequncia de comandos: um aps o outro, at o fim do processo.

captulo 1 37
incio Incio do algoritmo

i = 100 i (investimento inicial) recebe o valor 100

j = 0.01 A taxa de juros j recebe o valor 0.01

p = i + j* i p recebe o valor do clculo dos juros no final do 1o ms

s = p + j* p s recebe o valor do clculo dos juros no final do 2o ms

t = s + j* s t recebe o valor do clculo dos juros no final do 3o ms

t O valor t informado para o usurio

fim Fim do algoritmo

Figura 1.10 Fluxograma da estrutura sequencial

1.4.3.2 A estrutura de seleo

Existem situaes nas quais o processo precisa fazer uma deciso para poder
continuar. Por exemplo, em uma linha de produo de suco de laranja existe
um sensor que separa as boas das ruins por meio de uma anlise de imagem.
O sensor verifica a imagem e baseado em um padro de uma fruta de boa qua-
lidade analisa a amostra e deixa-a na esteira ou a retira de produo. Ou seja,
feita uma deciso, uma seleo. Esta a caracterstica principal da estrutura de
seleo. Existem muitas situaes parecidas com esta do exemplo.
Como exemplo de um fluxograma que usa esta estrutura, vamos estudar o
clculo do resto da diviso inteira entre dois nmeros inteiros positivos.

38 captulo 1
Novamente vamos usar algumas variveis:
a o valor do dividendo
b o valor do divisor
q o valor do quociente
r o valor do resto

incio

a, b

q=0

a >= b ? r=0

V
r

a=ab

inicio

q=q+1

Figura 1.11 Fluxograma com estrutura de seleo

Assim como a figura 1.10, a figura 1.11 mostra visualmente de uma maneira
muito eficiente como organizada a estrutura de seleo, ou tambm chamada
de estrutura de deciso.
O smbolo desta estrutura em um fluxograma o losango, e como vemos na
figura 1.11, feita uma comparao entre os valores de a e b. Caso o valor seja
positivo, o fluxo toma um determinado caminho, tornando a condio verda-
deira. Caso a condio no seja satisfeita, o que a torna falsa, o fluxo segue por
um caminho diferente.

captulo 1 39
1.4.4 A estrutura de repetio

Como o nome diz, este tipo de estrutura serve para repetir alguma ao at que
ou enquanto uma condio satisfeita. Veremos adiante que existem alguns
detalhes quanto ao controle da repetio.
Basicamente temos as seguintes formas:

sim no
sim

no

Figura 12 Estrutura de repetio "faa ... enquanto".

no

sim

no
sim

Figura 13 Estrutura de repetio "faa ... at que".

A figura 1.12 e a figura 1.13 so bem parecidas. Porm existe uma diferena
fundamental nos diagramas. Veja a posio do sim e no de cada tipo e per-
ceba tambm a forma do desenho. Cada um desses tipos usado em situaes
especficas e mostram o quanto um fluxograma pode contribuir para o proces-
so de descrio do algoritmo.
Basicamente, a repetio funciona com o conhecimento ou no da quanti-
dade de vezes que a ao ser repetida ou se o teste da condio feito no incio
ou no fim da repetio.

40 captulo 1
1.4.5 Portugus estruturado

Outra forma de representao de algoritmos o chamado Portugus Estrutu-


rado. Esta forma a que mais se aproxima da definio de algoritmos como
conhecemos.
O portugus estruturado uma simplificao da nossa linguagem natural
na qual usamos frases simples e estruturas que possuem um significado muito
bem definido. Apesar disso, a aparncia do portugus estruturado muito se-
melhante a uma linguagem de programao tradicional. Possui um conjunto
de palavras e regras que formam as sentenas vlidas e compem a sintaxe da
linguagem.
O portugus estruturado baseado em uma Program Design Language
(PDL). A PDL uma forma de notao muito parecida com a linguagem Pascal
e foi escrita originalmente em ingls. Ela usada como uma referncia gen-
rica para uma linguagem de projeto de programao e ser usada como refe-
rncia para uma implementao em alguma linguagem computacional. Veja
o Algoritmo 3.
O algoritmo a seguir tem como objetivo ler 4 notas do usurio, somar as no-
tas, fazer a mdia aritmtica e apresentar o resultado. Perceba que a forma de
escrever o algoritmo bem parecida com um programa.
A diferena entre uma linguagem de programao de alto nvel (como o C)
e uma PDL que a PDL no pode ser compilada em um computador. Porm, o
programa mostrado no algoritmo[Campo] foi feito usando um programa cha-
mado Visualg o qual possui finalidades didticas e pode executar os algoritmos
e disponibilizar vrias ferramentas para o estudante compreender como o algo-
ritmo est sendo executado.

algoritmo "mdia"
var
nome_aluno : caracter
n1,n2,n3,n4 : real
soma : real
media : real

captulo 1 41
inicio
escreva("Digite o Nome do Aluno: ")
leia(nome_aluno)
escreva("Digite a primeira nota: ")
leia(n1)
escreva("Digite a segunda nota: ")
leia(n2)
escreva("Digite a terceira nota: ")
leia(n3)
escreva("Digite a quarta nota: ")
leia(n4)
soma <-(n1+n2+n3+n4)
media<-(soma/4)
escreva(media)
fimalgoritmo

1.5 Linguagens de programao


A forma que o programador tem para se comunicar com o computador por
meio de uma linguagem de programao. Dizemos que a maneira alto nvel
de linguagem.
Sabemos que atualmente existem muitas linguagens de programao di-
ferentes e para o iniciante chega a ser difcil escolher alguma linguagem para
poder aprender e se especializar. J foi citado que o mais importante conhecer
a lgica e saber as estruturas existentes para poder construir programas, a lin-
guagem chega a ser um fator secundrio.
A figura 1.14 e a figura 1.15 mostram um ranking de linguagens e sua evo-
luo ao longo dos anos de acordo com a empresa Tiobe. Esta empresa lida ba-
sicamente com questes relacionadas qualidade de software e mensalmente
divulga o ranking das figuras. O ranking obtido por meio da coleta de infor-
maes na internet envolvendo o que foi publicado, nmero de pesquisas feitas
nos mecanismos de busca e mostra apenas a quantidade obtida, no trata de
esclarecer qual a melhor linguagem de programao. O ranking serve princi-
palmente para os programadores verificarem o quanto a sua linguagem de uso
est sendo buscada e acessada pela internet. Os dados da figura foram obtidos

42 captulo 1
em 2015 e podemos perceber que as linguagens derivadas do C ainda so muito
comentadas pela internet. Ou seja, estud-las uma boa oportunidade de ter
um bom suporte do mercado.
30

25
Java
C
20 C++
Objective-
Ratings (%)

C#
15
Python
JavaScript
10 Visual Basic .NET
PHP
Visual Basic
5

0
2002 2004 2006 2008 2010 2012 2014

Figura 1.14 Ranking da TIOBE (Fonte: http://www.tiobe.com/index.php/content/


paperinfo/tpci/index.html)

MAY 2015 MAY 2014 CHANGE PROGRAMMING LANGUAGE RATINGS CHANGE


1 2 Java 16.869% 0.04%
>

2 1 C 16.847% 0.08%
>

3 4 C++ 7.875% +1.89


>

4 3 Objective-C 5.393% 6.40%


>

5 6 C# 5.264% +1.52%
> > > >

6 8 Python 3.725% +0.67%


7 9 Javascript 3.127% +1.34%
8 11 Visual Basic .Net 2.968% +1.70%
9 7 PHP 2.720% 0.67%
>
>>

10 Visual Basic 1.893% +1.89%


11 10 Perl 1.820% +0.35%
>
>> > >>

12 33 R 1.444% +1.06%
13 15 Delphi/Object Pascal 1.302% +0.33%
14 19 MATLAB 1.283% +0.57%
15 12 Ruby 1.273% +0.03%
>
>> >> >>

16 27 COBOL 1.169% +0.58%


17 22 PL/SQL 1.127% +0.49%
18 Swift 1.115% +1.12%
19 18 Pascal 0.960% +0.21%
>
>>

20 37 ABAP 0.887% +0.57%

Figura 1.15 Ranking das linguagens, referente figura 1.14

captulo 1 43
Para quem tem mais experincia na rea de informtica, no deixar de notar
que linguagens como Matlab e R (sim, isso mesmo, o nome da linguagem R)
aparece no ranking de uma maneira destacada e ascenso. Particularmente, R
e Matlab esto subindo no ranking porque so muito usadas na rea de bioin-
formtica e como esta rea cada vez mais crescente, essas linguagens crescem
junto. At mesmo o Cobol, que foi muito usada nas dcadas de 70 e 80, ainda
aparece em crescimento. Outra linguagem que vem se destacando segundo o
ndice da Tiobe o Python, que est sendo usada por grandes empresas como
Facebook e Google nos seus sistemas.
As linguagens de programao possuem um pouco de semelhana com as
linguagens escritas e faladas por ns. As linguagens possuem regras sintticas
e semnticas que devem ser respeitadas para a comunicao ser estabelecida
e assim, e de uma maneira muito forte, com as linguagens de programao.
Quando estamos conversando se erramos uma palavra ou outra, at mesmo na
concordncia de verbos, provvel que a outra pessoa entenda, mas o compu-
tador no, as regras precisam ser respeitadas sem nenhum tipo de erro.
Assim como os idiomas, as linguagens de programao possuem os lexe-
mas, que so as unidades bsicas de palavras que compem as regras sintticas
e semnticas de qualquer linguagem. Os lexemas so classificados em tokens
os quais compem o cdigo fonte do programa. O cdigo fonte na verdade o
programa propriamente dito.
Observe o seguinte exemplo. Trata-se de um programa muito simples escri-
to na linguagem Pascal o qual faz uma contagem de 1 a 3 (e nem mostra na tela,
s faz a conta).

program p;
var x: integer;
begin
x:=1;
while (x<3) do
x:=x+1;
end.

O programa possui palavras em ingls, esta devidamente formatado de um


modo tal que qualquer pessoa consegue ler o programa. Por isto que dito es-
tar em alto nvel, pois embora tenha cdigos estranhos na primeira vista, ele

44 captulo 1
possvel de ser lido. As outras linguagens modernas mostradas na figura 1.14 e
figura 1.15 possuem uma aparncia semelhante ao cdigo fonte do exemplo.
Mas o computador no entende o programa desta forma. necessrio ser
convertido para o nico idioma no qual o computador entende: o cdigo de m-
quina. E ai que entra o compilador: ele quem faz esta converso.
O compilador tambm faz a seguinte anlise: ele varre o programa desde
o incio para poder encontrar os tokens e os converter devidamente na lingua-
gem de mquina da plataforma na qual ele est sendo compilado. Se o compila-
dor estiver rodando em um PC com Windows, o programa ser convertido para
esta plataforma. Se estiver rodando em um Mac Book, com IOS, ser compilado
para esta plataforma. Veja a figura 1.16.

incio

Programa
fonte

Anlise lxica
(scanner)

Anlise sinttica
(parser)

Gerador de cdigo
intermedirio

Cdigo intermedirio no
otimizado para a arquitetura X

Otimizao do cdigo
intermedirio

Gerao do cdigo objeto para


arquitetura X

Cdigo de mquina para


arquitetura X

fim

Figura 1.16 Processo de compilao.

captulo 1 45
A figura 1.16 mostra como funciona um compilador de uma maneira geral.
Basicamente o processo consiste em transformar o cdigo fonte em um cdigo
de mquina para a arquitetura na qual desejamos executar o programa e para
isso o programa fonte deve passar por algumas fases.
Percebemos que o programa fonte passa por uma anlise lxica onde os
tokens so identificados e separados. Nesta fase os comentrios do cdigo,
espaos em branco e demais caracteres so descartados do prximo passo, a
anlise sinttica.
A anlise sinttica a parte principal do compilador. Nesta fase o compila-
dor verifica se o que o programador escreveu bate, ou seja, compatvel com
a gramtica da linguagem. Por exemplo, se o programador escreveu o cdigo
fonte na linguagem C, o analisador sinttico verifica se as palavras, comandos,
instrues e demais tokens correspondem s regras gramaticais e sintticas da
linguagem C.
A anlise semntica verifica se o que foi gerado na anlise sinttica conse-
gue gerar resultados executveis e ser avaliados. Nas fases de anlise, o com-
pilador informa ao programador os possveis erros de modo que possam ser
corrigidos e a compilao ser reiniciada.
A partir da anlise sinttica e semntica feita a gerao do cdigo interme-
dirio e depois o cdigo final.
Algumas linguagens so interpretadas. Nestas linguagens no temos um
compilador e sim um interpretador. A diferena bsica nestes dois mtodos
que o interpretador l o cdigo fonte linha por linha e converte em cdigo ob-
jeto (ou tambm chamado de bytecode) medida que o cdigo lido. Outros
interpretadores, dependendo da implementao, leem todo o cdigo para de-
pois execut-lo.
No nosso caso, vamos usar a linguagem C como ferramenta de estudo.
Vamos estudar os algoritmos e depois convert-los para C de forma que voc
entenda as duas partes: o projeto e a execuo.
Vamos usar um programa chamado DevC++. gratuito e roda em ambiente
Windows e facilmente encontrado na internet para download.

46 captulo 1
LEITURA
Algumas sugestes de leituras esto em ingls.
Computer History Museum: excelente site. Vale muito a visita.
Site 1: http://www.computerhistory.org/

Museu do computador: outro site muito bacana que mostra a histria do


computador e o futuro da tecnologia

Site 2: http://museudocomputador.org.br/

A histria da computao e o caminho da tecnologia: livro online de


Cluzio Fonseca Filho. Muito bom. Mostra a computao por outro enfoque,
diferente do tradicional.

Site 3: http://www.pucrs.br/edipucrs/online/historiadacomputacao.pdf

KNUTH, D. E. The Art of Computer Programming: Fundamental


Algorithms. Vol 1, 2 Edio. Addison-Wesley, 1973. um clssico sobre algo-
ritmos. Est em ingls porm um livro excelente.
Animaes de algoritmos: site do livro Algorithm in C++ com vrios algo-
ritmos animados em Java.

Site 4: http://www.ansatt.hig.no/frodeh/algmet/animate.html

47
captulo 1
Dois excelentes livros para se aprofundar no assunto:
WIRTH, N. Algoritmos e estruturas de dados. Rio de Janeiro: LTC, 1989.
ZIVIANI, N. Projeto de algoritmos com implementaes em Java e C++.
So Paulo: Thomson Learning, 2007.

REFLEXO
No incio da computao, a programao era uma arte como diziam. Porm com o passar do
tempo foi mostrado que desenvolver sistemas e programar sem um prvio planejamento no
era possvel. Os algoritmos fazem parte de um projeto de sistema e tambm de vrios outros
tipos de projetos. Com a crescente valorizao dos processos nas empresas e a necessida-
de de control-los, os elementos vistos neste captulo podem ser aliados muito importantes
nestes tipos de atividade.

REFERNCIAS BIBLIOGRFICAS
ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos de programao de computadores. So
Paulo: Pearson Education, 2008.
DASGUPTA, S.; PAPADIMITRIOU, C.; VAZIRANI, U. Algoritmos. So Paulo: McGraw Hill, 2009.
FEOFILOFF, P. Algoritmos em linguagem C. Rio de Janeiro: Campus, 2008.
FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lgica de programao: a construo de algoritmos e
estruturas de dados. So Paulo: Makron Books, 1993.
MANZANO, J. A. N. G.; OLIVEIRA, J. F. D. Algoritmos: lgica para desenvolvimento de programao.
9. ed. So Paulo: rica, 1996.
PUGA, S.; RISSETTI, G. Lgica de programao e estrutura de dados. So Paulo: Pearson
Education, 2003.

48 captulo 1
2
Estrutura
Sequencial
Qualquer que seja a linguagem de programao, desde a mais simples at a
mais moderna ter um sequencia linear de operaes.
H alguns anos apareceu um conceito chamado de programao orientada a
eventos onde linguagens como o Object Pascal (e seu famoso ambiente Del-
phi) e Visual Basic fizeram com que o mercado de desenvolvimento de aplica-
es mudasse para aplicaes voltadas ao Windows e ambientes de janelas.
Basicamente, com poucos movimentos de arrastar e soltar do mouse era pos-
svel ter uma aplicao bem completa funcionando.
Mesmo com toda essa funcionalidade e produtividade, as estruturas bsicas
de programao e principalmente a estrutura sequencial sempre esteve pre-
sente. Os primeiros programas de qualquer iniciante sero com este tipo de
estrutura e vamos comear com ela.
Bons estudos!

OBJETIVOS
Aps o trmino deste captulo voc estar apto a:

Escrever um programa simples com entradas e sada em C++


Identificar e usar os tipos de variveis usados na linguagem C++
Identificar e usar os operadores matemticos e lgicos existentes na linguagem C++
Criar entradas e sadas em C++

50 captulo 2
2.1 Analisando um programa com incio e fim
Nosso primeiro programa tem um objetivo muito simples: calcular a mdia
aritmtica entre quatro notas de um aluno.
Isto feito em C++ de acordo com o cdigo da Listagem 1 a seguir. Para criar
este programa e execut-lo vamos usar o software DevC++. Ele gratuito, fcil
de ser encontrado para download na internet e roda na plataforma Windows.
Recomendamos que voc digite este programa e o execute.

1 int main(int argc, char** argv) {


2 float nota1;
3 float nota2;
4 float nota3;
5 float nota4;
6 float media;
7
8 nota1 = 7;
9 nota2 = 6;
10 nota3 = 9;
11 nota4 = 5;
12
13 media = (nota1+nota2+nota3+nota4)/4;
14
15 return 0;
16 }
Listagem 1: Programa em C++

importante que voc obedea exatamente o que est escrito no programa. Os recuos
nas linhas 4 at 17 podem ser feitos usando a tecla TAB. Outro detalhe: maisculas e
minsculas so interpretadas de maneira diferente pelo C++!

Aps voc ter digitado o programa, o que aconteceu? O que apareceu na


tela? Apareceu alguma janela diferente?
No tenha medo, leia o programa e tente entender o que aconteceu.
Complicado? Nem tanto. Lembre-se que aprender uma linguagem de pro-
gramao como aprender um idioma: precisamos conhecer a estrutura da lin-
guagem, sua sintaxe, suas regras e at mesmo suas manhas. A frase Quero

captulo 2 51
aprender a programar computadores em ingls I want to learn how to pro-
gram computers, em espanhol Quiero aprender a programar computado-
ras, em francs Je veux apprendre programmer les ordinateurs, em ale-
mo: Ich mchte lernen , wie man Computer zu programmieren e em grego
! (Ainda bem que temos
tradutores online!). Ou seja, conhecendo as palavras da linguagem e a forma de
us-las de acordo com as regras, trata-se de uma questo de traduo.
Portanto, por mais que um algoritmo seja simples, a converso dele para
uma linguagem de programao vai depender da linguagem alvo: tem algumas
que vamos escrever mais e outras menos, assim como traduzir uma frase em
portugus para outros idiomas. Algumas vezes a traduo bem fcil e pareci-
da (veja a traduo da frase em portugus para espanhol) e outras vezes mais
difcil e mais longa (veja a traduo para o alemo). E outras mais bonitas (veja
a traduo para o francs!).
Vamos estudar o que o programa faz linha a linha para voc poder entender
o programa do incio ao fim.

1 int main(int argc, char** argv) {

A linha 1 contm qual palavra que nos indica que ela inicia um programa? Se
voc pensou em main, acertou. Main significa principal e, portanto esta linha
indica que estamos iniciando o programa principal. Mas e as outras palavras
que aparecem na linha, o que significam? Por enquanto no hora de tratarmos
delas. Apenas vamos considerar que para comear um programa em C++ preci-
samos escrever o programa principal iniciando tal como est na linha 1.
Antes de continuarmos a explicao linha a linha do programa, observe o
visual da listagem 1. Veja que temos uma parte com uma cor mais clara den-
tro de outra mais escura. A parte escura define todo o programa principal como
j vimos. Esta delimitao do programa principal feita entre os caracteres { e }
(presentes nas linhas 1 e 16. Na digitao do programa, se voc esquecer algum
destes dois caracteres, o programa no compilar.

1 int main(int argc, char** argv) {


2 float nota1;
3 float nota2;
4 float nota3;

52 captulo 2
5 float nota4;
6 float media;
7
8 nota1 = 7;
9 nota2 = 6;
10 nota3 = 9;
11 nota4 = 5;
12
13 media = (nota1+nota2+nota3+nota4)/4;
14
15 return 0;
16 }

Portanto, tudo que estiver aps o abre-chave { e antes do fecha-chave }


compreender um bloco de programao e neste caso, ser o bloco do progra-
ma principal.
Continuando, temos as linhas:

2 float nota1;
3 float nota2;
4 float nota3;
5 float nota4;
6 float media;

Observe que as linhas so bem parecidas. O que voc acha que elas fazem?
Bem, temos que existem 4 variveis chamadas nota (de 1 a 4) e uma varivel
media as quais nos levam a pensar que elas esto relacionadas com os valores
das notas e mdias do aluno.
E alm disso, elas possuem a palavra float acompanhando cada uma delas.
Em uma situao real, o valor de uma nota bimestral de um aluno pode ser um
valor inteiro como por exemplo nota 9, nota 5 ou valores decimais como 7,5
ou 4,25 e em algumas escolas temos at 6,3, 3,8 ou seja, valores diferentes de
mltiplos de 5.

captulo 2 53
No esquea! Em C++, a separao do campo decimal feita com o ponto . e no
com vrgula. Portanto, como exemplo, a constate PI que conhecemos da trigonometria
ter a representao como 3.141592... (observe o ponto no lugar da vrgula!)

Portanto, como podemos trabalhar com valores de notas que contm deci-
mais, vamos usar a palavra float para as variveis. Alm disso, mesmo que os
valores das notas sejam inteiros, a varivel mdia precisa ser de algum tipo de-
cimal, pois a diviso que ser feita para calcular a mdia aritmtica pode gerar
um nmero decimal. Ainda neste captulo vamos estudar com mais detalhes os
tipos existentes na linguagem C++.
Temos aqui uma importante lio sobre a linguagem C++: a criao de vari-
veis. Em C++ toda e qualquer varivel que for usada em um programa precisa
ser declarada. O compilador acusar um erro caso uma varivel for usada no
programa e no ter sido declarada anteriormente. E mais, alm de ser declara-
da, ela precisa ser de um determinado tipo primitivo da linguagem, ou, de um
tipo criado pelo usurio.
Continuando com o programa, o que voc imagina que est acontecendo
nas prximas linhas:

8 nota1 = 7;
9 nota2 = 6;
10 nota3 = 9;
11 nota4 = 5;

No difcil responder, certo? Estas quatro linhas colocam os valores 7, 6, 9


e 5 nas variveis nota1, nota2, nota3 e nota4 respectivamente. A mdia desses
valores ser (7+6+9+5)/4 resultando em 6.75 (viu como pode ser decimal?). Caso
voc deseje alterar o valor de qualquer uma das notas possvel fazer direta-
mente em alguma dessas linhas.
O clculo da mdia feito na linha 13:

13 media = (nota1+nota2+nota3+nota4)/4;

54 captulo 2
O resultado armazenado na varivel mdia. Observe que a atribuio de
valores sempre feita com o sinal = e alm de valores podemos colocar ex-
presses matemticas, como o caso deste clculo.

15 return 0;

A linha 15 pode parecer um pouco estranha. Ela ser devidamente explica-


da no Captulo 5 onde trataremos de funes. Por enquanto vamos usar este
comando em todos os programas como sendo a ltima instruo do programa.
Esta linha faz com que o valor 0 seja devolvido para quem executou o programa,
no caso, o sistema operacional, por meio do compilador. No se preocupe com
isso agora, vamos explicar melhor esta questo mais adiante.

Explicamos anteriormente o papel da IDE. Como estamos trabalhando com o DevC++


e este um ambiente integrado de desenvolvimento, ele possui recursos que alm de
compilar o programa para o usurio, executa o programa tambm com a inteno de
test-lo. Neste caso, a IDE tem um relacionamento com o sistema operacional (no caso,
o Windows) que executa o programa.

E nunca se esquea de fechar o programa principal, como feito na linha 16:

16 }

Lembre-se: estamos fechando o bloco de programa que se refere ao progra-


ma principal e por isso usamos o }.
Neste momento voc pode estar pensando sobre o programa:
ele no tem nenhuma sada na tela
Exatamente. No tem ainda. Nosso objetivo aqui foi estudar um pro-
grama do incio ao fim e o programa cumpre o que promete. Vamos es-
tudar sobre entradas e sadas de dados mais adiante.
e se eu quiser mudar os valores das notas?
Neste caso, a nica forma de fazer isso alterar os valores diretamen-
te nas variveis nas linhas 8 a 11 e compilar o programa novamente.
e se eu quiser repetir o programa?
Neste caso temos que executar o programa manualmente pelo pr-
prio ambiente DevC++.

captulo 2 55
Como voc deve ter percebido, o programa possui algumas linhas em branco e tabu-
laes. As tabulaes so chamadas endentaes e servem para melhorar a leitura do
cdigo por outra pessoa e ser mais fcil de verificar os blocos de programas. alta-
mente recomendado que voc mantenha um padro para as endentaes e espaos
no programa para que desta forma o seu programa, alm de executar corretamente,
seja fcil de ser editado e mantido.

2.2 Entendendo a organizao de um programa


Basicamente a estrutura de um programa em C++ :
declarao de variveis,
depois o incio do programa com as instrues e comandos e
finalizao, apresentando os resultados

Entrada Processamento Sada

Todo algoritmo ou programa tem um objetivo. Este objetivo alcanado por


meio de uma entrada de dados a qual ser processada e resultar em uma sada
a qual ser avaliada.
O problema que se a entrada for ruim, sero processados da maneira cor-
reta e a sada ser ruim (e a culpa cair sobre o sistema, ou o computador, como
sempre!).
Portanto, fazer a correta entrada de dados fundamental. O processo de en-
trada-processamento-sada ocorre o tempo todo. Todo fluxograma obedece a

56 captulo 2
esse processo, o processo de compilao tambm, assim como o processo de
execuo.
A entrada e a sada podem ocorrer de diversas formas em um computador.
Podemos ter uma leitura de um carto de banco em um caixa eletrnico, a di-
gitao da senha, a informao que a senha digitada foi errada como sada, e
vrias outras formas.
Vamos estudar a organizao de um programa comeando pela declarao
de variveis, porm antes disso, vamos entrar em ...

As reticncias so propositais, para dar a ideia de emendar com o tpico abaixo

2.2.1 Alguns tpicos importantes

No captulo anterior comeamos o estudo contando sobre o Deep Blue. Devido


a ele ser um computador exclusivamente para clculos obviamente sabemos
que ele resolvia milhares de equaes rapidamente.
Outro exemplo: quando fazemos um cadastro na internet normalmente in-
serimos nossos dados pessoais e digitamos vrios tipos de caracteres: s letras
para o nome, s nmeros para o CEP e assim por diante.
Quando assistimos um filme em forma de desenho animado ou qualquer
outro que envolva efeitos especiais sabemos que existem computadores que
ajudam os criadores a desenharem e animarem esses efeitos.
Ou seja, para cada tipo de situao temos uma informao diferente. O com-
putador, portanto, um equipamento, uma ferramenta que resolve problemas
que lidam com informaes e essas informaes so divididas de uma maneira
muito geral em dois tipos: dados e instrues.

2.2.1.1 Tipos de dados

Os dados so representados pelas informaes a serem tratadas por um com-


putador. Normalmente usamos trs tipos dados: os dados numricos, que po-
dem ser nmeros inteiros e reais, os dados alfanumricos e os dados lgicos.
Estes tipos so chamados de tipos primitivos:
Inteiros: quando lidamos com nmeros que no possuem casa decimal,
incluindo os negativos. Exemplos: -65, 0, 44, 2030, etc.

captulo 2 57
Reais: nmeros que possuem casas decimais, incluindo os negativos.
Exemplos: -33.5, -128.3, 255.6, 32767.4, etc.
Caracteres: so os dados contendo sequncias de letras, nmeros e sm-
bolos especiais. Este tipo de dado sempre deve estar entre aspas como, por
exemplo: Brasil, Fone: 2001-2002, Rua dos Bobos n 0, R2-D2, 4 (o ca-
ractere 4 diferente do inteiro 4! No possvel somar 4 + 4, veremos isso
mais tarde). Este tipo de dado tambm pode ser conhecido como alfanumrico,
string (quando houver mais de 2 caracteres), literal ou cadeia.
Lgicos: estes tipos de dados s possuem dois valores: verdadeiro (ou
true) e falso (ou false). Nunca podero assumir os dois valores simultaneamen-
te. Este tipo tambm chamado de booleano devido ao matemtico ingls
George Boole ter feito vrios estudos sobre lgica matemtica.

Todas as linguagens de programao possuem um conjunto de tipos pri-


mitivos da linguagem parecidos com os que foram citados. Em C++ temos os
seguintes tipos de dados:
char: de apenas 1 byte, capaz de armazenar apenas 1 caractere
int: capaz de armazenar um inteiro
float: armazena nmeros de ponto flutuante de preciso simples
double: armazena nmeros de ponto flutuante de preciso dupla
void: em ingls, void significa vazio. um tipo que informa ao compilador
que a varivel no ter um tipo definido

Em C++, alm dos tipos temos os modificadores de tipo. Existem quatro


modificadores de tipo na linguagem C: signed, unsigned, long e short. A Tabela
5 mostra os tipos e modificadores de tipo existentes na linguagem C++. Alm
disso, a tabela mostra o intervalo de alcance de cada um dos tipos bem como o
nmero de bits que o tipo ocupa na memria.
Veja que o modificador unsigned retira o sinal do tipo e dobra a capacidade
do tipo no intervalo positivo. Como exemplo, vamos usar o tipo int: original-
mente ele compreende a faixa existente entre os nmeros -32768 e 32767 e por-
tanto possui 65536 nmeros dentro do intervalo. Tirando a parte negativa com
o modificador unsigned, a capacidade do int sobe para 65535 porm comean-
do de 0 (sem a parte negativa). Este mesmo raciocnio serve para os outros tipos
que possuem o modificador unsigned.

58 captulo 2
INTERVALO
TIPO NUM DE BITS
INCIO FIM
CHAR 8 -128 127
UNSIGNED CHAR 8 0 255
SIGNED CHAR 8 -128 127
INT 16 -32.768 32.767
UNSIGNED INT 16 0 65.535
SIGNED INT 16 -32.768 32.767
SHORT INT 16 -32.768 32.767
UNSIGNED SHORT INT 16 0 65.535
SIGNED SHORT INT 16 -32.768 32.767
LONG 32 -2.147.483.648 2.147.483.647
UNSIGNED LONG INT 32 -2.147.483.648 2.147.483.647
SIGNED LONG INT 32 0 4.294.967.295
FLOAT 32 3,4E-38 3,4E+38
DOUBLE 64 1,7E-308 1,7E+308
LONG DOUBLE 80 3.4E-4.932 3.4E+4.932

Tabela 2.1 Tipos da linguagem C++.

2.2.1.2 Declarao e inicializao de variveis

Em C++ obrigatrio que toda varivel usada no programa seja declarada. Em


C++ a sintaxe da declarao de variveis :

tipo_da_varivel lista_de_variveis

Ou seja, toda vez que uma varivel for declarada em C++, preciso que o
seu tipo venha em primeiro lugar e depois a varivel desejada, ou uma lista de
variveis, separada por vrgula.
Portanto, as declaraes abaixo so vlidas:

int a;
char a, b, c;
unsigned int x1, x2, media;

captulo 2 59
Alguns detalhes sobre a linguagem C++:
C++ case sensitive: ou seja, uma letra maiscula diferente de uma letra
minscula. Portanto a varivel a diferente da varivel A. Assim:

int a, A;
float soma, SOMA, Soma, sOMa, somA;

a e A so variveis diferentes, assim como as variveis float declaradas no


exemplo
Uma vez que C++ case sensitive, as palavras chave da linguagem sempre
sero escritas em letras minsculas
Os comentrios na linguagem C devem comear com /* e terminar com */
e servem tanto para uma linha quanto para um bloco de linhas. No C original as
barras // que normalmente so usadas para comentar apenas uma linha, no
existem, porm alguns compiladores aceitam esta forma.
A linguagem C++ possui as seguintes palavras reservadas. Logo, no pos-
svel criar variveis com estas palavras:

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

Os nomes das variveis na linguagem C++ podem comear com uma le-
tra ou um sublinhado _. Os outros caracteres podem ser letras, nmeros ou
sublinhado. No permitido usar caracteres especiais ou outros em nomes de
variveis.
Em relao a nomes de variveis, bom sempre usar letras minscu-
las para obedecer a um padro internacionalmente usado para variveis

Quando criarmos constantes, estas devem ser escritas com todas as letras
em maisculas

60 captulo 2
2.3 Adicionando entradas e sadas
muito importante criar formas de orientar o usurio com relao ao que o
programa necessita para poder funcionar adequadamente. Ou seja, impor-
tante mostrar mensagens na tela e receber informaes do usurio de uma ma-
neira eficiente.
Por exemplo, no programa da Listagem 1 seria mais legal exibir mensagens
como:
Digite a primeira nota
Digite a segunda nota
A mdia para este aluno ____
Isso possvel em C++ e qualquer outra linguagem de programao.
Em C++ o comando que exibe uma mensagem na tela, ou seja faz a sada de
dados, o cout.
Este comando, por incrvel que parea, no faz parte das palavras-chave da
linguagem e sendo assim o compilador no o reconhece. Ele fica definido em
um outro arquivo, chamado iostream, e para ser usado, precisamos incluir (in-
clude) a biblioteca e definir um espao de nomes (namespace) para isso. No se
preocupe com o namespace, apenas use-o nos seus programas para poder usar
as bibliotecas includas.
Sendo assim, as duas primeiras linhas do programa ficaro assim:

1 #include <iostream>
2 using namespace std;

Assim como temos a sada de dados, temos a entrada de dados que feita
com o comando cin. Para voc lembrar com mais facilidade, in significa entra-
da e out, sada.
Vamos retomar o programa da Listagem 1 e torn-lo mais interativo por
meio de mensagens de entrada e sada de dados. Veja agora como ficou a parte
de atribuio de valores s variveis:

11 cout<<"Digite a primeira nota: "<<endl;


12 cin>>nota1;
13 cout<<"Digite a segunda nota: "<<endl;
14 cin>>nota2;

captulo 2 61
15 cout<<"Digite a terceira nota: "<<endl;
16 cin>>nota3;
17 cout<<"Digite a quarta nota: "<<endl;
18 cin>>nota4;

Observe as linhas 11, 13, 15 e 17 e o uso do cout. Veja que aps o comando
temos o operador <<. Tudo que vier aps o << ser impresso na tela. No
caso das linhas citadas, ser impresso a string entre aspas.
Para finalizar, as linhas terminam com <<endl;. Isso diz ao compilador
para pular uma linha aps cada impresso na tela. Se no houvesse esse co-
mando, todo o texto ficaria em uma linha s deixando o texto difcil de ser lido.
Portanto a linha abaixo:

cout<<"Digite a primeira nota: "<<endl;

Significa:
- Compilador: escreva Digite a primeira nota: na tela e depois pule uma
linha
As linhas 12, 14, 16 e 18 fazem a entrada de dados, ou seja, fazem a leitura
do que o usurio digitar pelo teclado. O objeto de entrada de dados (cin) l um
stream de dados usado da seguinte forma:
cin>>_______;
Portanto a linha abaixo:

cin>>nota1;

Significa:
- Compilador: pegue o que o usurio digitar no teclado e coloque o valor na
varivel nota1
Veja que tambm possvel combinar algumas coisas:

20 media = (nota1+nota2+nota3+nota4)/4;
21 cout<<"A media do aluno eh: "<<media<<endl;

62 captulo 2
Calculamos a mdia na linha 20 e combinamos o resultado com uma string
na linha 21. Veja que possvel combinar valores de variveis e strings usando
o operador <<.
O programa da Listagem 1 reescrito com as entradas e sadas ficar assim:

1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 float nota1;
6 float nota2;
7 float nota3;
8 float nota4;
9 float media;
10
11 cout<<"Digite a primeira nota: "<<endl;
12 cin>>nota1;
13 cout<<"Digite a segunda nota: "<<endl;
14 cin>>nota2;
15 cout<<"Digite a terceira nota: "<<endl;
16 cin>>nota3;
17 cout<<"Digite a quarta nota: "<<endl;
18 cin>>nota4;
19
20 media = (nota1+nota2+nota3+nota4)/4;
21 cout<<"A media do aluno eh: "<<media<<endl;
22 return 0;
23 }

E sua execuo resultar na seguinte tela:

captulo 2 63
Figura 2.1 Execuo do programa

2.4 Entendendo como os dados so


armazenados

As variveis so parte fundamental de qualquer programa. Tudo aquilo que


sujeito a alguma variao durante a execuo de um algoritmo, uma varivel.
Usando novamente o exemplo do Deep Blue, a cada nova jogada, milhes de
possibilidades eram analisadas para prever as prximas jogadas, sendo assim,
o computador tinha que processar vrias variveis simultaneamente.
As variveis so armazenadas na memria RAM do computador e devem ter
seu tipo identificado antes do armazenamento. Uma vez armazenado, ele pode
ser usado e manipulado a qualquer momento. Veja a figura 2.2.
Esta figura mostra resumidamente como seria a situao da RAM em um
determinado momento, aps a criao de algumas variveis e atribuio de va-
lores a elas.
A RAM da figura modesta, tem apenas 64Mbytes de capacidade de armaze-
namento. Toda posio na memria possui um endereo em formato hexadeci-
mal e na figura nota-se que eles variam de 0000 a FFFF ( apenas um exemplo,
em uma memria real, existem outros valores e formas de endereamento).

64 captulo 2
Figura 2.2 Representao da memria RAM

Neste caso criamos algumas variveis:


pi : que do tipo real, possui o valor 3.1415 e est na posio 0001
nome: que do tipo caractere, possui o valor Z e est na posio 0002
valido: que do tipo booleano, possui o valor true e est na posio 0003
R2d2: que do tipo caractere, possui o valor rob e est na posio 0004
Endereo: que tambm do tipo caractere, possui o valor Rua dos Bobos
n 0 e est na posio 0005
As outras posies da memria podem ou no estar vazias

Todos os valores que esto armazenados na memria podem sofrer varia-


es ao longo da execuo do programa que usa estas variveis. Por exemplo, a
varivel valido pode ter um valor false ao longo da execuo. A varivel endereo
pode assumir outro valor como Rua Zero, n 123 e assim por diante. Inclusive
a varivel pi. Embora saibamos que ela uma constante, ela pode ser alterada
durante o programa. Quem vai definir que ela uma constante e no pode ser
alterada o programador, durante a elaborao do programa e o compilador
por sua vez, no vai permitir que outro valor seja atribudo a essa varivel.
O nome da varivel usado para identific-la durante todo o programa. Esta
identificao possui algumas regras que devem ser observadas na sua criao:
Os nomes das variveis podem ter um ou mais caracteres. Por exemplo: a,
a1, aa1, aaa1 so nomes vlidos

captulo 2 65
O primeiro caractere do nome da varivel nunca poder ser um nmero
ou um caractere especial.
No permitido criar variveis com espaos em branco. Porm podemos
usar outros caracteres para simular o espao. Por exemplo: codigo_aluno, en-
dereco_cliente, nomeAluno, inicioPeriodoFerias, etc..
No possvel criar variveis com o mesmo nome de palavras reservadas
da linguagem. No caso de portugus estruturado, no poderemos criar uma va-
rivel cujo nome inicio, fim, enquanto, etc..

Uma varivel pode ter seu valor mantido fixo durante todo o programa (isso
perde um pouco o sentido de ser varivel) e neste caso, temos uma constante.
Por exemplo, podemos criar uma varivel chamada pi do tipo real e atribuir a
ela o valor 3.141592. Por questes de padronizao, toda vez que usarmos cons-
tantes comum escrev-las com todas as letras em maisculo. Neste caso, tere-
mos PI = 3.131592.

2.5 Utilizando o computador para fazer conta


Como j vimos, o computador uma grande calculadora. E para isso precisa-
mos dos operadores aritmticos para poder realizar os clculos matemticos
necessrios. Os operadores matemticos podem ser de dois tipos: unrio e bi-
nrio. O operador unrio usado quando temos apenas um operando na ex-
presso, por exemplo, uma inverso de sinal. O binrio possui dois operandos
como por exemplo na adio, subtrao etc. Veja a tabela 2.2.
OPERADOR OPERAO TIPO PRIORIDADE EXEMPLO
+ Manuteno de sinal Unrio 1 +(+1) = +1
Inverso de sinal Unrio 1 (+1) = +1
^ Exponenciao Binrio 2 2^3=8
/ Diviso Binrio 3 4/2 = 2
Multiplicao Binrio 3 4*2 = 8
+ Adio Binrio 4 1+1=2
Subtrao Binrio 4 21=1

Tabela 2.2 Operadores aritmticos

66 captulo 2
A tabela 2.2 mostra os operadores aritmticos que so usados nos algorit-
mos, o tipo dos operadores e sua prioridade em uma avaliao da expresso
matemtica. Alm disso, nota-se que as expresses matemticas computacio-
nais sero escritas de uma maneira diferente da forma como escrevemos em
papel.
Considere os exemplos da tabela 2.3:

FRMULA FORMA ESCRITA FORMA COMPUTACIONAL


base * altura
rea do tringulo S= S < (base * altura ) / 2
2
S < PI * raio ^ 2
rea do crculo S = * raio2 ou S < PI * raio * raio
Considerando PI uma constante

55
Expresso matemtica x = 43 * X < (43 * (55 / ( 30 + 2)))
30 + 2

Tabela 2.3 Exemplos de formas escritas e computacionais

Note que na escrita computacional no possvel escrever em 2 linhas, te-


mos que escrever qualquer expresso matemtica em 1 linha apenas. Outro de-
talhe, o sinal de atribuio, o qual normalmente escrevemos = substitudo
por uma seta, composta pelos caracteres < e - juntos.
Tambm comum usar em algoritmos e programas alguns operadores no
convencionais como:
Mod: resto da diviso, denotado pelo operador %.
Div: quociente da diviso inteira

5 2
1 2

5 mod 2 5 div 2
5%2

2.5.1.1 Operadores aritmticos e de atribuio

Assim como nos algoritmos temos operadores aritmticos na linguagem C++


para desenvolver operaes matemticas. A seguir na tabela 1.4 apresentamos
a lista dos operadores aritmticos do C++.

captulo 2 67
OPERADOR AO
+ Soma (inteira e ponto flutuante)
Subtrao ou troca de sinal (inteira ou ponto flutuante)
* Multiplicao (inteira e ponto flutuante)
/ Diviso (inteira e ponto flutuante)
% Resto de diviso (de inteiros)
++ Incremento (inteiro e ponto flutuante)
Decremento (inteiro e ponto flutuante)

Tabela 1.4 Operadores aritmticos na linguagem C++.

A linguagem C++ tambm possui operadores unrios e binrios. Os unrios


atuam sobre apenas uma varivel, modificando ou no o seu valor e retornam o
seu valor final. Os operadores ++ e --" so unrios e servem para incrementar
e decrementar a varivel que est sendo usada. Assim x++ equivalente a x=x+1.
Idem para x .
Estes operadores podem ser pr ou ps fixados. A diferena que quando
so pr-fixados eles incrementam e retornam o valor da varivel j incrementa-
da. E quando aos ps fixados eles retornam o valor da varivel sem o incremen-
to e depois incrementam a varivel.
Por exemplo:

int a=5, b;
b=a++;

Qual ser o valor de a e b aps a execuo?


Resposta: a = 6, b = 5

E agora, qual o valor de a e b?


int a=5, b;
b=++a;
Resposta: a = 6, b = 6

Quando o operador ps-fixado, o valor da varivel utilizado no comando


e aps a concluso desse comando o valor ser atualizado. Quando o operador
pr-fixado, primeiro a varivel atualizada para ento utilizar o seu valor.

68 captulo 2
2.5.1.2 Funes matemticas

Alm das operaes aritmticas, comum usarmos nos programas outras fun-
es j existentes na linguagem C++ como por exemplo:
sen(x): seno do ngulo x
cos(x): cosseno do ngulo x
tg(x): tangente de x
demais funes trigonomtricas
abs(x): valor absoluto de x
int(x): parte inteira de um nmero fracionrio
frac(x): parte fracionria de x
e outras

Lembrando que x nas funes acima pode ser uma varivel, um nmero,
uma expresso aritmtica ou outra funo matemtica.

2.5.1.3 Expresses lgicas e operadores relacionais

As expresses lgicas so aquelas que envolvem operadores lgicos e/ou rela-


cionais e nas quais os operandos so relaes e/ou variveis e/ou constantes
booleanas.
Os operadores relacionais so usados para fazer comparaes entre dois
operandos do mesmo tipo primitivo. Esses valores so representados por cons-
tantes, variveis ou expresses aritmticas.
OPERADOR DESCRIO
== Igual
> Maior que
< Menor que
!= Diferente
>= Maior ou igual que
<= Maior ou igual que
Tabela 1.5 Operadores relacionais.

A tabela 1.5 mostra os operadores relacionais. Nota-se que no caso do igual


e diferente os operadores tem diferenas quando escritos em algoritmos (por-
tugus estruturado) e na linguagem C. O resultado obtido de uma relao
sempre um valor lgico.

captulo 2 69
Alguns exemplos:
2 vezes 4 igual a 24 dividido por 3 ?
Usando o portugus estruturado:
2 * 4 = 24 /3
8 = 8
Verdadeiro !

O resto da diviso de 15 por 4 menor que o resto da diviso de 19 por 6?


15 % 4 < 19 % 6
3 < 1
Falso!

3 * 5 div 4 <= 3^2/0.5


15 div 4 <= 9/0.5
3 <= 18
Verdadeiro!

2 + 8%7 >= 3*6-15


2+1 >= 18-15
3 >= 3
Verdadeiro!

2.5.1.4 Operadores lgicos

Assim como existem operadores aritmticos que lidam com expresses mate-
mticas, existem tambm os operadores lgicos, que lidam com expresses bo-
oleanas e com a lgica proposicional.

A lgebra de Boole ou lgebra booleana, uma variao da lgebra convencional. Ba-


sicamente ela tem trs pontos diferentes:

Nos valores que as variveis podem assumir, sendo binrias ou seja, s podem assu-
mir dois valores: 0 ou 1 (falso ou verdadeiro)
Nas operaes que se aplicam a esses valores
Nas propriedades dessas operaes, ou seja, s leis que elas obedecem.

70 captulo 2
Na lgebra de Boole temos dois princpios fundamentais:

Princpio da no contradio: uma proposio no pode ser simultaneamente verda-


deira e falsa
Princpio do tereiro excludo: Uma proposio s pode tomar um dos valores poss-
veis: ou verdadeira ou falsa, no sendo possvel uma terceira hiptese.
Basicamente temos os seguintes operadores: e, ou e no, e algumas variaes.

Para poder resumir, basicamente a lgebra e Boole funciona da seguinte


maneira:
Temos uma proposio como: Amanh vai chover?. Vamos atribuir essa
proposio a uma varivel, chamada A. Sendo assim, teremos:
A = Amanh vai chover?
Note que uma pergunta que pode ter vrias respostas: Sim, no, tal-
vez, depende, etc.. Logo, A no uma varivel que faz parte da lgebra de
Boole porque no uma varivel que pode assumir apenas um dos dois valores
sim ou no.
Porm,
A = Braslia a capital do Brasil
B = Buenos Aires um pas da Europa
Percebeu a diferena? Aqui temos somente duas respostas possveis: sim
ou no. Logo, nesse caso, A uma varivel boolena, assim como B. Aqui pode-
mos associar a A o valor lgico verdadeiro (true) e a B o valor lgico falso (false)
e so duas proposies.
Logo, Braslia a capital do Brasil e Buenos Aires no um pas da Europa
tambm uma proposio e podemos associar o valor verdadeiro a ela.
Na lgebra de Boole usamos um recurso chamado tabela verdade para mos-
trar os valores possveis que as variveis lgicas podem assumir. A tabela verda-
de mostra todas as possibilidades combinatrias entre os valores de diversas
variveis lgicas que so encontradas em somente duas situaes e um conjun-
to de operadores lgicos. Nas tabelas verdade a seguir, A e B so proposies.

captulo 2 71
Em C++ os operadores lgicos E e OU so representados pelos smbolos
&& e || respectivamente. Veja suas tabelas verdades:

A B A && B
F F F
F V F
V F F
V V V
A B A||B
F F F
F V V
V F V
V V V

Exemplos:
Proposio A = Se fizer sol
Proposio B = o dia est quente
Se fizer sol E o dia est quente, eu irei praia
Quando eu irei praia?

Pela tabela verdade do operador E, a proposio verificada s ser verdadei-


ra (ou seja, o sujeito s ir praia) quando as proposies A e B forem verdadei-
ras. Qualquer outra situao, a proposio ser falsa (observe a tabela verdade
do E).
Proposio A = Se fizer sol
Proposio B = o dia est quente
Se fizer sol OU o dia est quente, eu irei praia
Quando eu irei praia?

Pela tabela verdade do operador OU, as chances de o sujeito ir praia iro


aumentar bastante pois pela tabela verdade do OU a proposio ser verdadeira
em trs situaes: somente sol, somente dia quente e dia com sol e quente. O
sujeito no ir praia se no estiver fazendo sol nem o dia estiver quente (ob-
serve a tabela verdade do OU).
Vamos terminar o captulo com outro programa um pouco mais complica-
do: calcular razes de uma equao do 2 grau.
Com um projeto criado e um arquivo j definido no DevC++, vamos comear
a escrever.

72 captulo 2
Antes de partirmos para o programa, por mais que seja simples calcular as
razes de uma equao, precisamos entender o que consiste uma equao deste
tipo. O pleno entendimento do problema nos d uma segurana para desenvol-
ver um bom algoritmo e consequentemente um bom programa.
Uma equao do segundo grau uma expresso matemtica que consiste
de incgnitas, coeficientes, expoentes e uma igualdade que pode ser reduzida
ao seguinte formato:

ax2 + bx + c = 0

Onde a, b e c so os coeficientes, x a incgnita e 2 o expoente. Alm disso,


a tem que ser diferente de zero.
A forma de resolver uma equao do segundo grau consiste em descobrir os
valores reais para a incgnita e torne a sentena verdadeira. A frmula para esta
resoluo chamada de Frmula de Bhaskara, apresentada a seguir:

O valor b2 4ac chamado de discriminante e representado pela letra grega


(delta). Logo, delta = b2 4ac. Para simplificar o algoritmo, vamos supor que
estamos lidando com equaes do segundo grau completa e com razes reais.
Ento sendo assim, do que consiste em o programa?
Basicamente em ler os valores a, b e c do usurio e fazer o clculo das razes,
correto? Vamos chamar as razes de x1 e x2.
Vamos l?
Comeamos nosso programa incluindo as bibliotecas que sero usadas.
Isto feito nas linhas 1 a 4.

1 #include <iostream>
2 #include <cstdlib>
3 #include <cmath>
4 using namespace std;

captulo 2 73
Quando comeamos a escrever o programa, bom pensar nas possveis
variveis que iremos usar. No caso da resoluo da equao do segundo grau,
quais as variveis sero utilizadas? Consegue pensar nelas? Quais os possveis
valores que sero usados no programa? Para isso importante conhecer bem
o problema que estamos lidando. Lembrando da frmula de Bhaskara, temos
que sero usados alguns valores que podem ser variveis como a, b, c, delta, x1
e x2. Vamos por hora declarar estas variveis:

7 float x1,x2;
8 float a,b,c;
9 float delta;

Observe que as variveis podem ser declaradas todas em uma mesma linha
ou separadamente. As duas formas esto corretas e voc deve usar a que deixar o
cdigo mais legvel. Como so variveis que vo usar valores de ponto flutuante,
todas sero do tipo float. Ns tambm poderamos propor que os coeficientes
a,b e c fossem inteiros porm vamos deixar como float a fim de simplificao.

Quando declaramos uma varivel que vai ser informada pelo usurio, vamos por en-
quanto admitir que o usurio ser legal e digitar um valor do tipo que o algoritmo
espera. Por exemplo, se a varivel de leitura for inteira, o usurio tem a total liberdade
de digitar a letra a por exemplo. a no um valor inteiro e isso obviamente vai gerar
um erro no algoritmo e no programa. No nosso caso por enquanto, o usurio sempre di-
gitar o valor correto. Esta verificao do valor lido chamada de validao dos dados.

Se houver outras variveis que no foram previstas, estas podem ser declara-
das posteriormente na seo especfica.
Definidas as variveis iniciais vamos prxima etapa: colocar a sequncia
de comandos em ordem para poder fazer o clculo das razes. No esquea:
estamos considerando neste programa que as razes so reais e inteiras (para
simplificar).
Em primeiro lugar, precisamos conhecer os coeficientes a, b e c.

11 cout<<"Digite o coeficiente a"<<endl;


12 cin>>a;
13 cout<<"Digite o coeficiente b"<<endl;

74 captulo 2
14 cin>>b;
15 cout<<"Digite o coeficiente c"<<endl;
16 cin>>c;

Conhecendo os coeficientes, podemos proceder com os clculos do delta


(veja a linha 18:

18 delta = b*b-4*a*c;
19 //calculo das razes

A linha 19 contm uma informao especial. As barras inclinadas // colo-


cadas no incio da linha indicam que esta linha um comentrio.

Um comentrio um texto que explica uma determinada parte do programa ou algorit-


mo. Ele muito usado e uma boa prtica de programao. Colocar comentrios nos
seus cdigos faz com que outras pessoas, ao lerem o que voc codificou entendam
melhor o seu raciocnio ao elaborar o programa ou o algoritmo. As barras duplas //
caracterizam comentrios de uma linha: tudo que for escrito aps estas barras at o fim
da linha ser ignorado pelo algoritmo ou pelo compilador.

Com o delta calculado, vamos para o clculo das razes da equao.


Lembrando que temos duas razes:

b + b
x1 = x2 =
2a 2a

Porm no conseguimos escrever desta forma e temos que usar a forma


computacional:

x1 = ( b+ delta ) / (2 * a)
x2 = ( b delta ) / (2 * a)

A forma computacional ainda apresenta um problema: a raiz quadrada.


No temos como inserir a raiz quadrada na forma de um caractere como feito
com letras e nmeros. A raiz quadrada outro recurso computacional chamado
funo o qual pode ser usado em situaes nas quais temos que abstrair outras

captulo 2 75
tarefas. Por exemplo, neste algoritmo no necessrio saber como uma raiz
quadrada calculada, s precisamos saber para que ela necessria neste caso:
retornar o valor calculado. J vimos um pouco sobre isto no tpico 2.1.4.
Para fazer o clculo da raiz quadrada precisamos usar uma funo que no
faz parte da biblioteca padro do C++. Para isso tivemos que incluir a bibliote-
ca cmath definida no cabealho do programa. A funo a ser usada a sqrt(x),
onde x o argumento (valor desejado) da funo.
Chamamos as duas razes da equao de x1 e x2. Vamos proceder ao cl-
culo. Na listagem a seguir mostrado o clculo e a forma computacional das
expresses.
20 x1=(-b+sqrt(delta))/2*a;
21 x1=(-b-sqrt(delta))/2*a;

E por fim, bom mostrarmos para o usurio o resultado das variveis que
representam as razes calculadas da equao ([Campo]linhas 23 e 24):
23 cout<<"x1 = "<<x1<<endl;
24 cout<<"x2 = "<<x2<<endl;

A execuo do programa est mostrada na Figura 22. Neste caso a equao,


considerando os coeficientes a=1, b=-7 e c=6, a seguinte:
x2 7x + 6 = 0

Figura 2.3 Execuo do algoritmo da equao do segundo grau

76 captulo 2
O programa completo est mostrado na Listagem 1:

1 #include <iostream>
2 #include <cstdlib>
3 #include <cmath>
4 using namespace std;
5
6 int main(void) {
7 float x1,x2;
8 float a,b,c;
9 float delta;
10
11 cout<<"Digite o coeficiente a"<<endl;
12 cin>>a;
13 cout<<"Digite o coeficiente b"<<endl;
14 cin>>b;
15 cout<<"Digite o coeficiente c"<<endl;
16 cin>>c;
17
18 delta = b*b-4*a*c;
19 //calculo das razes
20 x1=(-b+sqrt(delta))/2*a;
21 x1=(-b-sqrt(delta))/2*a;
22
23 cout<<"x1 = "<<x1<<endl;
24 cout<<"x2 = "<<x2<<endl;
25 return 0;
26 }
Listagem 2

captulo 2 77
LEITURA
Algumas sugestes de leituras esto em ingls.
Computer History Museum: excelente site. Vale muito a visita.

Site 1 http://www.computerhistory.org/

Museu do computador: outro site muito bacana que mostra a histria do


computador e o futuro da tecnologia

Site 2 http://museudocomputador.org.br/

A histria da computao e o caminho da tecnologia: livro online de


Cluzio Fonseca Filho. Muito bom. Mostra a computao por outro enfoque,
diferente do tradicional.

Site 3 http://www.pucrs.br/edipucrs/online/historiadacomputacao.pdf

KNUTH, D. E. The Art of Computer Programming: Fundamental


Algorithms. Vol 1, 2 Edio. Addison-Wesley, 1973. um clssico sobre algo-
ritmos. Est em ingls porm um livro excelente.
Animaes de algoritmos: site do livro Algorithm in C++ com vrios algo-
ritmos animados.

78 captulo 2
Site 4 http://www.ansatt.hig.no/frodeh/algmet/animate.html

Dois excelentes livros para se aprofundar no assunto:


WIRTH, N. Algoritmos e estruturas de dados. Rio de Janeiro: LTC, 1989.
ZIVIANI, N. Projeto de algoritmos com implementaes em Java e C++.
So Paulo: Thomson Learning, 2007.

REFLEXO
Iniciamos o aprendizado da linguagem C. Pode parecer difcil, mas no !
como aprender um novo idioma, acredite. questo de caligrafia ou seja, as-
sim como uma criana aprende a escrever usando cadernos de caligrafia, pro-
gramao a gente aprende programando. A linguagem C legal porque mui-
tas coisas do mercado usam esta linguagem como base para os seus produtos
como o Arduino, microcontroladores e at mesmo para criar pequenos robs.

REFERNCIAS BIBLIOGRFICAS
ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos de programao de computadores. So
Paulo: Pearson Education, 2008.
DASGUPTA, S.; PAPADIMITRIOU, C.; VAZIRANI, U. Algoritmos. So Paulo: McGraw Hill, 2009.
FEOFILOFF, P. Algoritmos em linguagem C. Rio de Janeiro: Campus, 2008.
FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lgica de programao: a construo de algoritmos e
estruturas de dados. So Paulo: Makron Books, 1993.
MANZANO, J. A. N. G.; OLIVEIRA, J. F. D. Algoritmos: lgica para desenvolvimento de programao.
9. ed. So Paulo: rica, 1996.
PUGA, S.; RISSETTI, G. Lgica de programao e estrutura de dados. So Paulo: Pearson
Education, 2003.

captulo 2 79
80 captulo 2
3
Estruturas de
Deciso
Nada mais difcil e, portanto, to precioso, do que ser capaz de decidir.
Napoleo Bonaparte

nos momentos de deciso que o seu destino traado.


Anthony Robbins

Como percebemos, tomar deciso muito importante e fazemos isso toda


hora, todo dia, no ? Se estiver chovendo, trocamos o caminho, se estiver nu-
blado avaliamos a possibilidade de chover ou no para poder pegar um guarda-
chuva. E por a vai.
Um algoritmo tambm tem momentos nos quais tem que parar e avaliar as
condies para tomar uma determinada direo. Imagine o rob Curiosity l
em Marte fazendo suas exploraes: ao encontrar um determinado tipo de ma-
terial ele precisa avaliar e tomar alguma deciso. Enfim, a estrutura de deciso
outra fundamental e presente em qualquer linguagem de programao.
E vamos estud-la neste captulo. Bom trabalho!

OBJETIVOS
No final deste captulo voc estar apto a:

Identificar quando necessrio usar uma estrutura de repetio


Aplicar os operadores relacionais
Desenvolver com estruturas compostas

82 captulo 3
3.1 Introduo
At agora vimos os seguintes elementos de programao:

bloco de programao
entrada e sada de dados
variveis
constantes
atribuies
expresses lgicas
expresses relacionais
expresses artimticas
comandos sequenciais

J um bom repertrio para nosso estudo porm para ele ficar mais com-
pleto precisamos estudar alguns comandos que desviam o fluxo sequencial e
natural de um algoritmo e de um programa assim como ocorre na estrada da
figura 3.1.

ANDREW7726 | DREAMSTIME.COM

Figura 3.1 - Que caminho seguir?

Muitos programas se comportam como a estrada acima: necessrio em


certa hora tomar uma deciso baseada em uma condio. E toda deciso leva a
uma consequncia, como na vida real.
Vamos estudar outro exemplo tpico de estrutura de deciso. Voc vai ao
banco e quer fazer um saque de R$100,00. O caixa eletrnico possui um progra-
ma com vrios mdulos, certo? Um programa para extrato, outro para depsito,
outro para pagamento e um para saque. Ele trabalha com uma simples deciso:
se houver saldo suficiente, ento o saque realizado, seno mostrada uma

captulo 3 83
mensagem na tela para o cliente informando saldo insuficiente. J recebeu
uma mensagem Transao no autorizada ao tentar pagar com o seu carto
de dbito? baseada em uma estrutura de deciso.
Quer mais um exemplo para esclarecer? Voc quer ler as notcias mais atu-
ais da sua rede social digital favorita. Mas na tela inicial voc tem que infor-
mar o seu usurio e senha. Se o seu usurio estiver correto e sua senha estiver
correta, ento voc poder fazer o log in no sistema, seno a tela inicial volta a
ser apresentada para voc fazer uma nova tentativa. Se for a terceira tentativa,
ento bloqueia a entrada, seno permite nova tentativa.

Quer assistir um vdeo para ilustrar uma situao de deciso? Que tal esse: https://
www.youtube.com/watch?v=vYXiFMLJ8XU. O piloto percebe que no vai conseguir
pousar o avio na curta pista do aeroporto Santos Dumont no Rio de Janeiro e tomou
a deciso de contornar e fazer outra tentativa. Esta manobra chamada arremetida e
voc vai encontrar vrios vdeos no Youtube sobre este assunto.

Percebeu como temos vrios exemplos do nosso dia a dia que envolvem
decises?
Voc deve lembrar-se do programa que estudamos no Captulo 2, certo?
Aquele que calculava a mdia do aluno. Ele nos ensinou bastante, porm ainda
um pouco sem graa. No seria mais interessante se ele mostrar um resultado
para o usurio informando se o aluno foi aprovado de acordo com sua mdia?
Tente falar em voz alta como seria o programa:

Tenho que ler as duas notas do aluno


Calculo a mdia
SE a nota for maior ou igual a 6 ENTO o aluno est aprovado

3.2 Desvio condicional simples


O programa do clculo da mdia agora vai ter o seguinte cdigo:
1 #include <iostream>
2 using namespace std;
3

84 captulo 3
4 int main(int argc, char** argv) {
5 float nota1;
6 float nota2;
7 float media;
8
9 cout<<"Digite a primeira nota: "<<endl;
10 cin>>nota1;
11 cout<<"Digite a segunda nota: "<<endl;
12 cin>>nota2;
13 media = (nota1+nota2)/2;
14
15 if (media>=6){
16 cout<<"Aprovado"<<endl;
17 }
18 cout<<Execute novamente para calcular outra media<<endl;
19 return 0;
20 }

Antes de explicar o programa, tente entender o que foi feito. Voc vai se sur-
preender que no to difcil quanto parece. Basta lembrar que se em ingls
if e outro fator importante para ser lembrado que todo bloco de programa-
o comea com { e termina com }.
Vamos relembrar alguns pontos do Captulo 2 e explicar o programa parte
por parte.
O problema consiste em calcular a mdia aritmtica entre duas notas bi-
mestrais de um aluno. Estas notas sero informadas pelo usurio e podem ter
valores inteiros como 8, 9, 7 e valores decimais como 8.5, 9.1, 3.5, etc.
Portanto, a pergunta inicial : quais variveis temos que definir para este
problema?
Teremos 2 entradas de dados, portanto, temos 2 variveis e podemos
cham-las de nota1, representando a primeira nota e nota2 representando a se-
gunda. Como as notas podem ser decimais, vamos usar o tipo float. Alm disso,
temos que calcular a mdia aritmtica das 2 notas. Quando somamos 2 floats, o
resultado ser um float. Ento vamos precisar de outra varivel float para a mdia.
1 #include <iostream>
2 using namespace std;

captulo 3 85
As linhas 1 e 2 importam a biblioteca iostream para podermos usar os co-
mandos de entrada e sada que aprendemos. Se no colocarmos esta linha, os
comandos cin e cout no sero reconhecidos pelo compilador e o programa
no funcionar.
No esquea que podemos pular quantas linhas quisermos no cdigo. As
linhas em branco no sero compiladas e servem como um fator esttico e de
legibilidade para o cdigo ficar mais organizado. o que ocorre na linha 3.
A linha 4 inicia o programa principal.
Nas linhas 5, 6 e 7 temos a declarao das variveis que vamos utilizar no
programa.
Com as variveis prontas, vamos passar para a prxima etapa: ler os dados
do usurio:
9 cout<<"Digite a primeira nota: "<<endl;
10 cin>>nota1;
11 cout<<"Digite a segunda nota: "<<endl;
12 cin>>nota2;

Agora as variveis nota1 e nota2 contero os valores informados pelo usu-


rio. A prxima etapa calcular a mdia:
13 media = (nota1+nota2)/2;

Agora entra a parte nova: fazer a avaliao da varivel mdia. Embora seja
um programa simples, esta etapa muito importante, pois se errarmos na con-
dio poderemos comprometer a sada dos resultados.
No nosso caso, a palavra Aprovado vai ser mostrada quando a mdia for
maior ou igual a 6 e sendo assim precisamos usar o operador relacional correto.
Desta forma:
15 if (media>=6){
16 cout<<"Aprovado"<<endl;
17 }

Na linha 15 feito o teste e a avaliao da varivel mdia. O operador rela-


cional que usamos o >=. Logo, comparamos o valor da varivel mdia com
6 e se for maior ou igual, a linha 16 ser executada e a palavra Aprovado ser
mostrada na tela.

86 captulo 3
Um detalhe: veja que s teremos 1 (UM e somente UM) comando aps a li-
nha 15. Quando isso ocorrer, podemos omitir os caracteres de incio e fim de
bloco ({ e }). Mas lembre-se: somente quando tiver UM comando. Dois ou
mais, deve-se colocar os delimitadores de bloco. Portanto, poderamos ter es-
crito assim:
15 if (media>=6)
16 cout<<"Aprovado"<<endl;

E daria o mesmo resultado. recomendvel que os delimitadores de bloco


sejam sempre usados, para deixar o cdigo mais legvel. Preze por isso sempre!
Lembre-se sempre da organizao de um programa: entrada-processamen-
to-sada. At agora fizemos a entrada e o processamento, resta terminar o pro-
grama com a sada dos dados:
18 cout<<Execute novamente para calcular outra media<<endl;

A linha 16 tambm faz parte da sada dos dados afinal, ela mostra o resulta-
do do clculo da mdia.
As linhas restantes finalizam o programa. No esquea delas!
A figura 3.2 mostra a execuo do programa considerando duas hipteses:
quando a condio da linha 15 verdadeira e quando ela falsa.

Figura 3.2 Resultado da execuo do programa

captulo 3 87
Sendo assim, quantos if tem no programa? Um s no ? Logo temos aqui
a estrutura de deciso mais simples que existe: o desvio condicional simples.
Esta estrutura portanto consiste na avaliao de somente uma condio. Se
esta for verdadeira, o comando seguinte executado.
A estrutura possui o diagrama da figura 3.3.

Condio S

Instrues
executadas
quando condio
N verdadeira

Instrues
executadas
quando condio
for falsa ou aps
ser verdadeira

Figura 3.3 Fluxograma da estrutura de deciso simples

Tenha muita ateno na condio! No exemplo da figura 3.2, a condio que a mdia
seja MAIOR OU IGUAL a 6. Lembra das tabelas verdade do Captulo 1? Elas sero
muito utilizadas daqui para frente.

O diagrama da figura 3.3 mostra um desvio de fluxo simples. A deciso


representada pelo losango e dele partem dois fluxos: um com a letra N (no)
que corresponde a uma condio falsa e um S (sim) que corresponde a con-
dio ser satisfeita e, portanto verdadeira e assim, o prximo comando ser
executado.

88 captulo 3
O diagrama finaliza no processo que representa a condio no ser satis-
feita (ser falsa) que o mesmo processo que executado aps o comando da
condio verdadeira ser executado.
Em C++, a estrutura do comando ser:
if (<condio>) {
<comandos quando a condio for verdadeira>
}

3.3 Operadores relacionais


Voc vai perceber que existem decises complexas as quais necessitam de re-
cursos para representar esta complexidade. Estamos nos referindo aos opera-
dores e expresses relacionais.
As expresses relacionais na sua maioria so expresses que comparam
duas partes. No exemplo que estudamos, a comparao feita entre a varivel
mdia e o nmero 6 (media>=6). As expresses relacionais sero usadas tam-
bm na estrutura de repetio, que veremos no prximo captulo.
Para nos auxiliar nas expresses relacionais precisamos lembrar os opera-
dores relacionais que esto mostrados na tabela 3.1:

SMBOLO DESCRIO
= Igual a
!= Diferente de
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
Tabela 3.1 Operadores relacionais

3.4 Desvio condicional composto


Vamos dificultar s um pouco. A estrutura que estudamos no tpico anterior
muito simples e existem situaes que temos que avaliar a condio e depen-
dendo do resultado, executar o conjunto de comandos que correspondem
condio verdadeira ou seno executar os comandos que correspondem con-
dio falsa.

captulo 3 89
J demos alguns exemplos desta situao. Observe o diagrama representa-
do na figura 3.4:

N Condio S

Instrues Instrues
executadas executadas
quando condio quando condio
falsa verdadeira

Figura 3.4 Fluxograma do "se ... ento ... seno"

Compare a figura 3.3 com a figura 3.4. Qual a principal diferena?


A diferena reside que na figura 3.4, caso a condio seja falsa, o fluxo do
algoritmo segue por outro caminho e na figura 3.3 somente a condio verda-
deira desviada para outro fluxo. Portanto agora temos uma bifurcao no
cdigo e um tipo de ao diferente para cada resultado da avaliao da condi-
o. Sendo assim trata-se de um desvio condicional composto.
Em C++, o comando fica desta forma:
if (<condio>) {
<instrues executadas quando condio verdadeira>
}
else {
<instrues executadas quando condio falsa>
}
Agora, vamos praticar um pouco. O prximo exemplo vai reescrever o pro-
grama do clculo da mdia e ensinar outros fundamentos da linguagem C++,
portanto preste ateno!

90 captulo 3
Exemplo 1
Leia duas notas bimestrais de um aluno. Calcule a mdia das notas. Se a
nota for maior ou igual a 6, o aluno estar aprovado, seno estar reprova-
do. O programa deve ainda mostrar qual foi a mdia do aluno.
Antes de comear a escrever o programa, lembre-se que j fizemos uma an-
lise anterior sobre este problema. J sabemos quantas e quais variveis sero
usadas. Portanto, podemos comear o programa da mesma forma que o pro-
grama anterior:
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 float nota1;
6 float nota2;
7 float media;
8
9 cout<<"Digite a primeira nota: "<<endl;
10 cin>>nota1;
11 cout<<"Digite a segunda nota: "<<endl;
12 cin>>nota2;
13 media = (nota1+nota2)/2;

Agora vem a parte nova: avaliar a condio e mostrar a mensagem


correspondente:
15 if (media>=6){
16 cout<<"Media = "<<media<<" - Aprovado"<<endl;
17 }
18 else {
19 cout<<"Media = "<<media<<" - Reprovado"<<endl;
20 }

As linhas 15 a 17 so familiares para ns, pois o mesmo cdigo estudado


anteriormente. Na linha 15 a condio verificada e se for verdadeira, o bloco
entre as linhas 15 e 17 ser executado. Aps a execuo deste bloco o cdigo
passar a ser executado a partir da linha 21. Tudo que fizer parte do else, en-
tre as linhas 18 e 20 ser ignorado, pois a condio do if j foi verificada como
verdadeira.

captulo 3 91
Caso a condio da linha 15 seja falsa, ou seja a mdia um nmero menor
que 6, o bloco do if ser ignorado e o que ser executado o bloco do else que
neste caso est entre as linhas 18 e 20.

Figura 3.5 Execuo do programa

Na figura 3.5 apresentamos 3 execues do programa para testar alguns va-


lores e possveis respostas geradas. Veja a tabela 3.2. Veja que no terceiro teste
inserimos valores bem prximos de 6 e como a mdia ainda ser menor que 6,
o aluno estar reprovado.

NOTA1 NOTA2 MDIA RESULTADO


9 8 8,5 Aprovado
8 4 6 Aprovado
5,9 5,95 5,925 Reprovado

Tabela 3.2 Possveis resultados

3.5 O operador ternrio


Em algumas situaes possvel substituir o if-then-else da linguagem C por
um tipo de operador que envolve trs partes: o operador ternrio.

92 captulo 3
Veja como ele funciona:
(condio>)? verdadeiro : falso ;

Aqui colocamos Aqui vai a expresso quando a


condio condio for falsa, depois do :

Aqui vai a expresso quando a


condio for verdadeira

Figura 3.6 O operador ternrio.

melhor exemplificar. O programa da Listagem 4 muito simples. O pro-


grama pede para o usurio digitar um nmero. Se o nmero for positivo ele ser
incrementado ou se for negativo ser decrementado. Feito isso ser mostrada
uma mensagem para o usurio informando o novo valor.
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 int numero;
6 cout<<"Digite um numero:"<<endl;
7 cin>>numero;
8 (numero>=0)? numero++ : numero--;
9 cout<<"O novo valor do numero eh:"<<numero;
10 return 0;
11 }
Listagem 1 Operador ternrio

A execuo do programa ser conforme a figura 3.7:

Figura 3.7 Execuo mostrando o operador ternrio.

captulo 3 93
O programa bem simples e exceto a linha 8, as outras j foram estudadas.
A linha 8 mostra o exemplo do uso do operador ternrio. A condio a ser
testada (numero>=10). A condio pode ser lida assim: O valor da varivel
numero maior ou igual a 10?. Veja que at temos o ponto de interrogao (?)
no comando. O ? termina a condio.
A prxima parte do comando (numero++) o comando a ser executado
quando a condio for verdadeira. No possvel aqui colocar um bloco de co-
mandos. O operador ternrio s funciona com 1 comando de cada vez.
A seguir, os : limitam at onde vai o comando quando a condio for verda-
deira e o incio do comando quando a condio for falsa. Neste caso, o coman-
do da parte falsa decrementa o valor da varivel nmero (numero--"). E termi-
namos o comando com o ; usual. Veja a figura 3.8 para melhor entendimento.

Figura 3.8 Representao do operador ternrio

3.6 Desvios condicionais encadeados


Nem sempre as coisas so to simples assim. Existem situaes que vrios se
devem ser avaliados. At mesmo no nosso dia a dia precisamos avaliar vrios
se durante o dia:
Se o caminho habitual para o trabalho estiver muito cheio, ento eu pego
o atalho. Se o atalho tambm estiver cheio e eu estiver atrasado ento comeo
a chorar. Se eu no estiver atrasado e o atalho estiver com trnsito bom, ligo o
rdio e escuto as msicas. E segue assim durante todo o dia.
claro que uma situao diria e corriqueira, mas computacionalmente
tambm vamos encontrar situaes semelhantes. Lembra do exemplo do Deep
Blue do captulo inicial? Imagine quantos se existem numa partida de xadrez.

94 captulo 3
Podemos ento encadear, ou aninhar os se. Ou seja, podemos montar um
se dentro de outro. Isto chamado de aninhamento ou encadeamento. A fi-
gura 3.9 mostra este conceito.

N Condio1 S

N Condio 2 S
Instrues executadas
quando condio 1
for verdadeira

Instrues executadas Instrues executadas


quando a condio 1 e a quando a condio 1 for
condio 2 so falsas falsa mas a 2 verdadeira

Figura 3.9 Estrutura condicional composta ou encadeada

Vamos estudar como isso pode ser implementado em C++.

Exemplo 2
Faa um programa que calcule o reajuste do salrio de um empregado. O
empregado deve receber um reajuste de 15% caso seu salrio seja menor que
500, se o salrio for maior ou igual a 500, mas menor ou igual a 1.000, o reajuste
ser de 10%, caso seja maior que 1000, o reajuste dever ser de 5%.
Antes de comear a codificar, vamos entender o problema:
Se o salrio < 500 [Smbolo] reajuste de 15%
Se o salrio estiver entre 500 e 1000, ou seja salrio >=500 e salrio <=1000
[Smbolo] reajuste de 10%
Se o salrio > 1.000 [Smbolo] reajuste de 5%

Para podermos entender melhor o problema, vamos fazer o fluxograma


para visualizar o encadeamento.

captulo 3 95
incio

ler salrio

N salario<500 S

N salario<=1000 S
salario=salario*1.15
salario=salario*1.05 salario=salario*1.10

salario

fim

Figura 3.10 Fluxograma dos ifs aninhados

Esta a lgica do problema. E as variveis? Quais poderemos prever que se-


ro usadas? Basicamente temos por enquanto: salrio e reajuste. E seus tipos?
Neste caso, como vamos trabalhar com salrio e reajuste bom usar um tipo
que permita uma grande variao de nmeros decimais e para este caso o tipo
float adequado.
Vamos comear a escrever o programa:
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 float salario,reajuste;
6
7 cout<<"Digite o salario:"<<endl;
8 cin>>salario;

Como podemos perceber, nenhuma novidade at agora: declaramos as va-


riveis previstas e fizemos a entrada de dados assim como est no fluxograma.

96 captulo 3
A parte nova comea agora:
O primeiro teste que temos que fazer verificar se o salrio menor que
500. Se esta condio for verdadeira, devemos aplicar um reajuste de 15% sobre
o salario (multiplicar o valor do salrio por 1,15).
10 if (salario<500){
11 salario = salario*1.15;
12 }

Se a condio for falsa, vamos verificar se o salrio menor que 1000.


Perceba que isto faz o teste do salrio para verificar se ele est na faixa entre 500
e 1000. Se o salrio for menor que 1000, o reajuste ser de 10%.
13 else {
14 if (salario<=1000){
15 salario=salario*1.10;
16 }

Seno (salrio > 1000), o reajuste ser de 5%:


17 else {
18 salario=salario*1.05;
19 }
20 }

E assim terminamos a parte principal do programa. O cdigo final est mos-


trado a seguir.
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 float salario,reajuste;
6
7 cout<<"Digite o salario:"<<endl;
8 cin>>salario;
9
10 if (salario<500){
11 salario = salario*1.15;
12 }

captulo 3 97
13 else {
14 if (salario<=1000){
15 salario=salario*1.10;
16 }
17 else {
18 salario=salario*1.05;
19 }
20 }
21 cout<<"O novo salario e igual a R$"<<salario<<endl;
22 return 0;
23 }
Listagem 2 Ifs aninhados

A figura 3.11 mostra 3 execues do programa com diferentes valores para


demonstrar o funcionamento.

Figura 3.11 Execuo do programa de ifs aninhados

Preste muita ateno com os sinais de fechamento de bloco (}). uma


boa ideia fech-los assim que voc abrir um. Desta forma o risco de esquecer
o fechamento menor. Mais uma vez, observe a organizao do cdigo com os
recuos e endentaes. Imagine um programa bem maior e note o quo impor-
tante organizar o cdigo que voc est escrevendo e outra pessoa poder dar
manuteno posteriormente.

98 captulo 3
3.7 O comando switch
Quando se trata de uma estrutura de deciso, sem dvida o comando if que estuda-
mos o mais importante e o mais usado em qualquer linguagem de programao.
Mas existe outro comando que muito til e pode ser usado quando temos
vrios ifs aninhados, trata-se do comando switch. Este comando interessante
ser usado para substituir vrios ifs e deixar o cdigo mais legvel. E tambm
bastante usado em estruturas de menu. Porm temos uma limitao aqui: o
comando no pode ser usado para avaliar expresses relacionais. Ele s fun-
ciona quando comparamos com um valor constante e quando a comparao
verdadeira, um bloco de comandos executado.
O switch tem a seguinte sintaxe:
switch (varivel){
case constante1:
Instrues;
break;

case constante2:
Instrues;
break;

default
Instrues;
}

Veja alguns exemplos:

Exemplo 3
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 int numero;
6
7 cout<<"Digite um numero de 1 a 7:"<<endl;
8 cin>>numero;
9

captulo 3 99
10 switch (numero){
11 case 1 :
12 cout<<"Domingo"<<endl;
13 break;
14 case 2 :
15 cout<<"Segunda"<<endl;
16 break;
17 case 3 :
18 cout<<"Tera"<<endl;
19 break;
20 case 4 :
21 cout<<"Quarta"<<endl;
22 break;
23 case 5 :
24 cout<<"Quinta"<<endl;
25 break;
26 case 6 :
27 cout<<"Sexta"<<endl;
28 break;
29 case 7 :
30 cout<<"Sabado"<<endl;
31 break;
32 default :
33 cout<<"Digitou outra coisa!!"<<endl;
34 }
35 return 0;
36 }

O switch compreende as linhas 10 a 34. O valor a ser testado o contedo da


varivel numero. Na linha 10, o valor de numero avaliado.
Caso o valor seja igual a 1 (linha 11), ser impressa na tela a mensagem
Domingo (linha 12) e o switch ser finalizado (linha 13).
Caso o valor seja igual a 2 (linha 14), ser impressa na tela a mensagem
Segunda (linha 15) e o switch ser finalizado (linha 16). E assim por diante.
Porm se o usurio for legal e digitar um valor diferente de 1 a 7, o switch
entre na clusula default na linha 32 e escreve uma mensagem na tela. muito
importante que voc use a clusula default neste comando.

100 captulo 3
Veja a execuo do programa:

Figura 3.12 Uso do comando switch:

O programa do Exemplo 3 o mesmo programa que o descrito na Listagem


3. Quanta diferena na legibilidade no ?
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 int numero;
6
7 cout<<"Digite um valor de 1 a 7: "<<endl
8 cin>>numero;
9
10 if (numero == 1)
11 cout<<"Domingo"<<endl;
12 else
13 if (numero == 2)
14 cout<<"Segunda"<<endl;
15 else
16 if (numero == 3)
17 cout<<"Tera"<<endl;
18 else
19 if (numero == 4)

captulo 3 101
20 cout<<"Quarta"<<endl;
21 else
22 if (numero == 5)
23 cout<<"Quinta"<<endl;
24 else
25 if (numero == 6)
26 cout<<"Sexta"<<endl;
27 else
28 if (numero == 7)
29 cout<<"Sabado"<<endl;
30 else
31 cout<<"Valor invalido!"<<endl;
32 return 0;
33 }
Listagem 3

Vamos dar uma complicadinha no prximo exemplo. S que no!. S


necessrio um pouco mais de ateno:

Exemplo 4
O programa a seguir simula uma calculadora bem simples. O usurio vai
digitar dois nmeros e depois escolher uma dentre as quatro operaes aritm-
ticas para ter o resultado.
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 int a, b, c, operacao;
6
7 cout <<"Digite o 1o valor: ";
8 cin >> a;
9
10 cout <<"Digite o 2o valor: ";
11 cin >> b;
12

102 captulo 3
13 cout <<"Que operacao deseja realizar?\n1. Adicao\t2.Subtracao\
t3.Multiplicacao\t4.Divisao\n\n=>";
14 cin >> operacao;
15
16 system ("cls");
17 switch (operacao){
18 case 1:
19 c=a+b;
20 cout <<a<<" + "<<b<<" = "<<c<<"\n\n";
21 break;
22 case 2:
23 c=a-b;
24 cout <<a<<" - "<<b<<" = "<<c<<"\n\n";
25 break;
26 case 3:
27 c=a*b;
28 cout <<a<<" * "<<b<<" = "<<c<<"\n\n";
29 break;
30 case 4:
31 c=a/b;
32 cout <<a<<" / "<<b<<" = "<<c<<"\n\n";
33 break;
34 }
35 return 0;
36 }

Neste programa temos algumas novidades:


Na linha 16 usamos uma funo chamada system(cls) para apagar o
contedo da tela em execuo. Vamos aprender sobre as funes no Captulo 5.
Usamos alguns caracteres especiais como o \n e o \t para pular uma
linha e para tabular uma string, na linha 13. Estes caracteres so usados apenas
para formatar a sada de dados.

captulo 3 103
TEXELART | DREAMSTIME.COM

Agora vamos dar uma pausa no exemplo e aprender algumas coisas:


O \n um tipo especial de caractere chamado de sequncia de escape.
Este caractere, assim como outros, usado nas linguagens de programao
para representar algum caractere ou uma sequncia de caracteres que so dif-
ceis de serem representados.
Por exemplo, o \n significa nova linha. Toda vez que o compilador en-
contra este caractere em uma string ele no vai interpretar a barra \ e depois
o n como dois caracteres separados. Eles sero um s e neste caso, vai inserir
uma quebra de linha na string. Assim, a string:
Ol\npessoal\ntudo\nbem?

Ser impressa assim:


Ol
pessoal
tudo
bem?

Existem outros caracteres de escape em C++. Veja outro exemplo: At agora


temos escrito nossas strings assim:
cout<<Ol mundo;
cout<<Este um exemplo de uma string;

Mas e se fosse pedido para escrever a seguinte string:


Castro Alves era conhecido como o Poeta dos Escravos.

104 captulo 3
Fcil! Poderamos fazer com o cout sem problema!
cout<<Castro Alves era conhecido como o Poeta dos Escravos.);

Temos um problema! Observe as aspas nas strings. Sabemos que todo o tex-
to delimitado pelas aspas ser impresso na tela e as aspas no so impressas,
mas agora precisamos que as aspas sejam impressas! E agora?
Vamos verificar o que est ocorrendo:

cout<<Castro Alves era conhecido como o Poeta dos Escravos.;

Figura 3.13 Conferncia das aspas na string

De acordo com o que sabemos sobre strings no comando cout, se deixarmos


desta forma mostrada na figura 3.13 ser impresso:
Castro Alves era conhecido como o

E teramos um erro, pois o cout no vai aceitar o final da string.


Para que a string final seja impressa com as aspas, precisamos novamente
de um caractere de escape. Neste caso o caractere \x22. Desta forma, a string
final ter que ser escrita assim:
cout<<Castro Alves era conhecido como o \x22Poeta dos Escravos\
x22.;

Ainda no caso das aspas, podemos usar outro caractere de escape: \. Esta
forma a mais usada inclusive em outras linguagens. Portanto, podemos escre-
ver a string tambm de acordo com a forma a seguir:
cout<<Castro Alves era conhecido como o \Poeta dos Escravos\.;

captulo 3 105
Veja o Box para outros caracteres de escape:

A seguir apresentamos as principais sequncias de escape na linguagem C:


ESCAPE FUNO
Caracter Nulo
\a Alarme
\b Retrocesso
\f Avanar Pgina
\n Quebra de Linha
\t Tab Horizontal
\v Tab Vertical
\\ Barra Invertida
\' Aspa Simples
\" Aspa Dupla

Voltando ao nosso exemplo ...


TEXELART | DREAMSTIME.COM

Veja que nas linhas 18 a 21, assim como os outros case usamos mais do que
um comando dentro do case. Isto possvel. Mas no se esquea de terminar o
case com um break.
18 case 1:
19 c=a+b;
20 cout <<a<<" + "<<b<<" = "<<c<<"\n\n";
21 break;

Qual o problema que voc encontra neste programa?

Resposta: No temos a clusula default. Se o usurio for "legal" novamente e digitar


5, o programa vai executar incorretamente.

106 captulo 3
3.8 Operadores lgicos
Embora j tenhamos visto, vamos explorar um pouco mais os operadores lgi-
cos, que so os operadores responsveis por estabelecer o relacionamento de
duas ou mais condies ao mesmo tempo na mesma instruo e assim possibi-
litar a realizao de vrios testes simultneos.
Em C temos trs operadores: o operador E, representado pelos caracteres
&&, o operador OU, escrito como || em C e o operador de negao, representado
pelo caractere ! (ponto de exclamao).
Vamos estudar estes operadores por meio de exemplos:

Exemplo 5
Faa um programa que verifique se um nmero informado pelo usurio
est no intervalo entre 50 e 100.
Para resolver este problema temos que considerar que o nmero a ser in-
formado tem que ser maior ou igual a 50 e ser menor ou igual a 100. Portanto,
temos que avaliar duas expresses simultaneamente, observe:
Numero>=50 E Numero<=100, em C: (numero>=50)&&(numero<=100)

Lembre-se que neste caso, a expresso ser verdadeira somente se cada con-
dio for verdadeira, de acordo com a tabela verdade:

CONDIO 1 CONDIO 2 RESULTADO


Falsa Falsa Falsa
Falsa Verdadeira Falsa
Verdadeira Falsa Falsa
Verdadeira Verdadeira Verdadeira

Tabela 3.3 Tabela verdade para o operador E

Vamos ao programa. Por enquanto, sem novidades:


1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 int numero;
6

captulo 3 107
7 cout<<"Digite um numero:"<<endl;
8 cin>>numero;
9

Agora o teste com as duas expresses:


10 if ((numero>=50) && (numero<=100)){
11 cout<<"O numero "<<numero<<" esta dentro do intervalo";
12 }
13 else {
14 cout<<"O numero "<<numero<<" NAO esta dentro do intervalo";
15 }

Perceba que cada expresso est dentro de parnteses e alm disso, toda a
linha fica dentro de parnteses. A linguagem C++ no permite que um if seja
avaliado sem que a expresso toda esteja dentro dos parnteses.
Com o teste feito, partimos para a sada dos dados e finalizao do progra-
ma. A listagem completa est logo abaixo:
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 int numero;
6
7 cout<<"Digite um numero:"<<endl;
8 cin>>numero;
9
10 if ((numero>=50) && (numero<=100)){
11 cout<<"O numero "<<numero<<" esta dentro do intervalo";
12 }
13 else {
14 cout<<"O numero "<<numero<<" NAO esta dentro do intervalo";
15 }
16 return 0;
17 }
Listagem 4 Uso do operador &&

108 captulo 3
A execuo do programa est mostrada na figura 3.14.

Figura 3.14

Exemplo 6
O prximo exemplo sobre o operador OU (||). O objetivo do programa
responder a uma pergunta corretamente e para isso duas condies sero ava-
liadas. De acordo com a tabela verdade para o operador OU, o resultado da ava-
liao da expresso ser verdadeiro quando uma das condies for verdadeira.

CONDIO1 CONDIO2 RESULTADO


Falsa Falsa Falsa
Falsa Verdadeira Verdadeira
Verdadeira Falsa Verdadeira
Verdadeira Verdadeira Verdadeira

Tabela 3.4 Tabela verdade para o operador OU

Vamos ao programa:
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 char resposta;
6
7 cout<<"Cadastro de Clientes - Sexo (m) ou (f)?"<<endl;
8 cin>>resposta;
9
10 if ((resposta=='m')||(resposta=='f')){
11 cout<<"Campo validado!"<<endl;

captulo 3 109
12 }
13 else {
14 cout<<"Voce nao digitou corretamente"<<endl;
15 }
16 return 0;
17 }

Neste programa usamos uma varivel do tipo char. Este tipo admite um con-
tedo de apenas 1 caractere. Um nome, ou um contedo contendo mais de 1 ca-
ractere j considerado uma string e h outra forma de trabalhar com strings
em C. Veremos isso adiante.
Na linha 10 ocorre a comparao com as duas expresses. Note que o ope-
rador == usado. Este operador do tipo relacional e serve para comparar se
um determinado valor igual a outro. Como estamos usando caracteres, faze-
mos a comparao entre a resposta e os caracteres m ou f. Note que quando
estamos nos referindo a um caractere apenas, usamos aspas simples.
A figura 3.15 mostra a execuo do programa.

Figura 3.15 Execuo do programa

E para terminar, vamos ver um exemplo com o operador de negao.

Exemplo 7
Este programa bem simples. O objetivo dele realizar o clculo c=(a+b)*x
somente se o valor da varivel x no for maior que 5. Qualquer valor menor que
5 far o clculo c = (a-b)*x.

110 captulo 3
Programas que envolvem relaes lgicas precisam ser muito bem entendidos pois os
operadores lgicos as vezes podem confundir. A dica ler muito bem a especificao
do problema.

Como j estamos acostumados, quais variveis sero usadas no programa?


Como sero lidos 3 valores inteiros, vamos precisar de 3 variveis inteiras: a, b
e x.
Comeando o programa sem novidades:
1 #include <iostream>
2
3 int main(int argc, char** argv) {
4 int a,b,c,x;
5
6 cout<<"Digite o valor de a:"<<endl;
7 cin>>a;
8
9 cout<<"Digite o valor de b:"<<endl;
10 cin>>b;
11
12 cout<<"Digite o valor de x:"<<endl;
13 cin>>x;

Os valores foram lidos e agora vem a parte importante. Antes de codificar,


vamos testar alguns valores para poder entender melhor o problema. Observe
a tabela 3.5:

CLCULO A
A B X X>5? RESULTADO
SER FEITO
5 1 2 No c=(a+b)*x 12
5 1 6 Sim c=(ab)*x 24

Tabela 3.5 Testes para o exemplo

Se atribuirmos os valores 5, 1 e 2 para a, b e x respectivamente, de acordo com


o enunciado do problema, vamos verificar que o valor de x no maior que 5.
Ento neste caso, o clculo a ser efetuado c=(a+b)*x e o resultado de c ser 12.

captulo 3 111
No outro exemplo se atribuirmos os valores 5, 1 e 6 para a,b e x, o clculo
ser o c=(a-b)*x e o resultado ser 24.
Podemos ento usar o operador de negao neste caso. Vamos ver como isto
pode ser feito:
15 if (!(x>5)) {
16 c = (a+b)*x;
17 }
18 else {
19 c=(a-b)*x;
20 }

A condio ser (x>5), lembre-se sempre dos parnteses, e como queremos


que o clculo com a soma entre a e b seja feito quando o x no maior que 5,
usamos a negao (!) para isso, e novamente colocamos parnteses, como mos-
tra a linha 15.
O else da linha 18 ser executado quando x for maior que 5.
Se voc percebeu, daria para fazer este programa de outra forma sem usar
a negao. Porm, o objetivo deste exemplo foi de mostrar como o operador
usado e o tipo de situao que ele pode ser utilizado.
Para terminar, vamos elaborar um programa final, mais abrangente e com
uma aplicao mais prtica. O objetivo do programa identificar se um dado
tringulo equiltero, issceles ou escaleno. Lembrando das aulas de geome-
tria: um tringulo equiltero possui os 3 lados iguais, o issceles possui 2 lados
iguais e o escaleno no possui lados iguais.

Equiltero Issceles Escaleno

Continuando com a recordao das aulas de geometria, um tringulo uma


forma geomtrica composta por 3 lados onde cada lado menor que a soma

112 captulo 3
dos outros dois lados. Isto no pode ser discutido pois trata da definio de um
tringulo e temos que obedecer a esta regra.
Ento, sendo os lados de um tringulo a, b e c, temos o seguinte:

a < b + c
b < a+ c
c < a + b

Agora temos que criar as formas de resolver o problema.

Para ser um tringulo equiltero, temos que: a = b, b = c e c = a.


Para ser um issceles, a=b ou a=c ou b=c
Para ser escaleno, a!=b, b!=c (lembre-se que != o smbolo para dife-
rente de)

Quais variveis vamos precisar para o problema? Certamente que os lados


a, b e c precisaro ser lidos e sero nossas primeiras variveis. Para facilitar,
vamos considerar apenas valores inteiros.
Comeando o programa, vamos proceder com a leitura dos dados.
1 #include <stdio.h>
2
3 int main(int argc, char** argv) {
4 int a,b,c;
5
6 cout<<"Digite o valor de a:<<endl;
7 cin>>a;
8
9 cout<<"Digite o valor de b:<<endl;
10 cin>>b;
11
12 cout<<"Digite o valor de c:<<endl;
13 cin>>c;

captulo 3 113
Com os dados lidos, precisamos em primeiro lugar verificar se os dados sa-
tisfazem a condio de existncia do tringulo. Isto feito na linha 15.
15 if ((a<b+c) && (b<a+c) && (c<a+b)){
...
27 }
28 else {
29 cout<<"Os dados nao formam um triangulo");
30 }

Veja que neste caso j colocamos a parte do else para tratar a condio falsa.
Sobre a condio, veja que temos 3 expresses que so avaliadas juntas. Se uma
das condies for falsa, toda a expresso ser falsa e no ser caracterizado que
estamos lidando com um tringulo.
Vamos agora escrever o cdigo para quando a expresso da linha 15 verda-
deira. A linha 16 avalia a possibilidade de ser um tringulo equiltero. Para que
isso ocorra, a=b=c:
16 if ((a==b) && (b==c)){
17 cout<<"Triangulo equilatero");
18 }
19 else {
20
26 }

Caso os lados no sejam iguais, temos a possibilidade de estar lidando com


um tringulo issceles ou escaleno. Neste caso, o teste ser feito comparando
dois lados. Se dois lados forem iguais, o tringulo issceles, em caso negativo,
o tringulo s pode ser o escaleno.
20 if ((a==b) || (a==c) || (c==b)){
21 cout<<"Triangulo isosceles");
22 }
23 else {
24 cout<<"Triangulo escaleno");
25 }

114 captulo 3
E sendo assim, finalizamos o programa. O cdigo final do programa est
mostrado na Listagem 7:
1 #include <iostream>
2
3 int main(int argc, char** argv) {
4 int a,b,c;
5
6 cout<<"Digite o valor de a:<<endl;
7 cin>>a;
8
9 cout<<"Digite o valor de b:<<endl;
10 cin>>b;
11
12 cout<<"Digite o valor de c:<<endl;
13 cin>>c;
14
15 if ((a<b+c) && (b<a+c) && (c<a+b)){
16 if ((a==b) && (b==c)){
17 cout<<"Triangulo equilatero");
18 }
19 else {
20 if ((a==b) || (a==c) || (c==b)){
21 cout<<"Triangulo isosceles");
22 }
23 else {
24 cout<<"Triangulo escaleno");
25 }
26 }
27 }
28 else {
29 cout<<"Os dados nao formam um triangulo");
30 }
31 return 0;
32 }
Listagem 5 Cdigo final do programa classificador de tringulos

captulo 3 115
Figura 3.16 Execuo do programa que classifica tringulos

Com este exemplo finalizamos o segundo tipo de estrutura usados na pro-


gramao de computadores: a estrutura de deciso. No deixe de praticar para
podermos avanar para o prximo tipo de estrutura: a de repetio.

LEITURA
Apresentamos alguns livros sobre a linguagem C os quais podem complementar o seu
aprendizado. O destaque fica para o livro de Kernighan e Ritchie, pois esta obra um dos
clssicos sobre a linguagem C++.
FEOFILOFF, P. Algoritmos em linguagem C. So Paulo: Elsevier, 2008.
MIZRAHI, V. V. Treinamento em linguagem C. So Paulo: Prentice Hall Brasil, 2008.
KERNIGHAN, B. W.; RITCHIE, D. M. The C programming language. Prentice Hall, 1989.

REFERNCIAS BIBLIOGRFICAS
O melhor aprendizado na rea de programao programar sempre. J citamos que apren-
der uma linguagem de programao como aprender um novo idioma: quanto mais praticar
mais vai aprender.

116 captulo 3
As estruturas de deciso so muito importantes para a programao em geral e o que
vimos aqui apenas o comeo do seu aprendizado. Voc consegue pensar em exemplos de
uso prtico deste tipo de estrutura?

REFERNCIAS BIBLIOGRFICAS
ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos de programao de computadores. So
Paulo: Pearson Education, 2008.
DASGUPTA, S.; PAPADIMITRIOU, C.; VAZIRANI, U. Algoritmos. So Paulo: McGraw Hill, 2009.
FEOFILOFF, P. Algoritmos em linguagem C. Rio de Janeiro: Campus, 2008.
FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lgica de programao: a construo de algoritmos e
estruturas de dados. So Paulo: Makron Books, 1993.
MANZANO, J. A. N. G.; OLIVEIRA, J. F. D. Algoritmos: lgica para desenvolvimento de programao.
9. ed. So Paulo: rica, 1996.
PUGA, S.; RISSETTI, G. Lgica de programao e estrutura de dados. So Paulo: Pearson
Education, 2003.

captulo 3 117
118 captulo 3
4
Estrutura de
Repetio
"O oposto da vida no a morte: a repetio."
Geraldo Eustquio

"H repetio em todos lugares, e nada encontrado apenas uma vez no


mundo."
Goethe

"Meu maior medo: repetio."


Max Frisch

A ltima estrutura de programao que veremos a estrutura de repetio.


Existem vrios nomes para as repeties: loopings, laos ou malhas de repeti-
o. Assim como as outras estruturas, as repeties so encontradas e essen-
ciais em qualquer linguagem de programao e so muito utilizadas. E na vida
prtica tambm: clculo de folha de pagamento, impresso de boletos de co-
brana, jogos de computador, basicamente em todos os programas vamos en-
contrar algum tipo de repetio.
Os loopings podem ser de vrios tipos e vamos estuda-los neste captulo.
Existem loopings que no sabemos quantas vezes sero executados, outros
conseguimos estabelecer este nmero, outros so controlados por meio de al-
gum resultado de outra expresso, enfim, existem vrios. Vamos estud-los a
partir de j. Bons estudos! E no esquea: pratique, pratique e quando tiver um
tempinho, pratique!

OBJETIVOS
Ao final deste captulo voc estar apto a:

Identificar a necessidade de uso de uma estrutura de repetio


Aplicar os comandos while, do-while e for em diferentes contextos
Construir programas que atendam a diferentes situaes agregando seleo e repetio
Saber como depurar um programa em C++

120 captulo 4
4.1 Por que repetir?
Voc deve se lembrar das aulas de matemtica e do conceito de fatorial de
um nmero n, certo? O fatorial de n representado por n! e consiste de se en-
contrar o produto de todos os nmeros positivos diferentes de zero e menor
que o nmero. O fatorial importante para expresses estatsticas e de anlise
combinatria.
Como exemplo, vamos fazer um programa em C++ para calcular o fatorial
de 6, ou 6!. O programa bem simples, observe:
1 #include <iostream>
2
3 int main() {
4 int fat;
5
6 fat = 6*6;
7 fat = fat*5;
8 fat = fat*4;
9 fat = fat*3;
10 fat = fat*2;
11 fat = fat*1;
12
13 cout<<"Fatorial de 6 = "<<fat<<endl;
14 return 0;
15 }

O resultado do programa mostrado na linha 13 4.320.


Bem, o resultado est correto, o programa tambm est, mas ficou simples
porque 6 um nmero pequeno. Mas e se fosse para calcular o fatorial de 600?
Teramos que escrever 600 multiplicaes? Seria muito trabalhoso!
Imagine uma pessoa do setor de recursos humanos de uma faculdade. Uma
faculdade uma organizao onde existem vrios tipos de profissionais: aque-
les que ganham por hora, outros por aula, outros possuem um salrio fixo e
ainda outros. Suponha que esta faculdade possua 500 funcionrios. J pensou
o funcionrio do RH na poca de fechamento da folha de pagamento? Fazer o
clculo de um a um dos funcionrios? Que trabalho hein?

captulo 4 121
E a urna eletrnica? Por mais polmica que ela seja, j pensou como seria
contar voto a voto manualmente em uma eleio para presidente do Brasil?
Atualmente o resultado sai em poucas horas mas at bem pouco tempo levava
alguns dias para isso.
O que voc consegue encontrar de comum entre essas situaes? No so
trabalhos repetitivos sendo que a cada repetio temos que fazer algum tipo
de processamento? No melhor usar o computador para fazer esse trabalho
para ns? Ns ficamos cansados, o computador no! Ainda bem que existem
algumas estruturas de programao que quebram esse galho para ns. E na lin-
guagem C++ temos algumas possibilidades de se fazer isso.

Figura 4.1 Loopings.

4.2 Repetir at quando? Analisando entradas


e sadas

Existem vrios tipos de repetio que podemos usar nos nossos programas.
Cada uma delas possui peculiaridades que devem ser observadas a fim de criar-
mos programas mais eficientes.
Em qualquer tipo, a repetio ser comandada por uma expresso que sem-
pre ser avaliada.

122 captulo 4
Se a expresso for verdadeira, a repetio continua.
Se for falsa, a repetio para.
A condio da expresso alterada dentro do bloco de cdigo e se o bloco
no for bem montado e a condio mudada, a repetio no terminar e isso
gerar um termo chamado loop infinito. E isso tudo que no queremos!

A condio
verdadeira

Sim! No!

Figura 4.2 Esquema de uma repetio.

Portanto, o que importante em uma estrutura de repetio controlar


muito bem o incio da repetio e isto feito por meio da entrada de dados, e o
fim da repetio.
Durante a repetio, alguns processamentos vo ser executados e estes pro-
cessamentos vo definir a continuidade da repetio. Logo, a sada de dados vai
controlar tambm a repetio, como j foi dito.
Novamente nos deparamos com aquele conceito de: entrada, processamen-
to e sada. Mas agora, a sada vai controlar a entrada, por exemplo:
Se voc estiver em um caixa eletrnico, voc vai seguir os seguintes passos:
1. Passar o seu carto magntico (entrada de dados)
2. Digitar sua senha (entrada de dados)
3. A mquina vai verificar se sua senha vlida (processamento)
4. Se for vlida, vai apresentar o menu de opes (sada)
5. Se no for, volta ao passo 1 (sada controlando a entrada)

captulo 4 123
Atualmente os bancos possuem um mecanismo de segurana que nova-
mente usa os conceitos de repetio para garantir que este processo no se re-
pita por mais de trs vezes. Na terceira vez se o cliente erra a senha, o carto
bloqueado. Ou seja, analisar a entrada e a sada de dados fundamental para a
continuao da repetio.
Vamos passar agora ao estudo dos tipos de repetio.

Laos, loops ou loopings so formas sinnimas para repetio. Assista este vdeo no
YouTube. Trata-se de um vdeo com estruturas de repetio usando um programa grfico
de aprendizado. Disponvel em: < https://www.youtube.com/watch?v=7pZYh3f9nuE >.

4.3 Estilos de repetio


4.3.1 Repetio controlada por contador

Como o nome sugere, este tipo de estrutura de repetio usa um tipo de va-
rivel para contar o nmero de repeties que um determinado lao ter. Esta
varivel chamada de contador e usado o tipo int para poder implement-la.
Veremos durante este captulo que podemos usar basicamente trs coman-
dos na linguagem C++ para fazer repeties:

O comando for
O comando while
O comando do-while

Todos estes comandos usam contadores para controlar suas repeties.


Vamos comear aprendendo o comando for.
A estrutura que permite controlar o nmero de repeties chamada de
para ou pelo nome do seu comando, for.

124 captulo 4
A sintaxe geral do for
for(inicializao ; condio ; incremento) <comandos>

O comando for em C++ composto por trs partes:


A inicializao: onde declaramos uma varivel do tipo inteiro (sempre) e
atribumos um valor inicial
A condio: uma expresso relacional que determina quando a repeti-
o acaba. Quando a condio se tornar falsa, a execuo do programa conti-
nua no comando seguinte ao for.
O incremento: esta parte configura como a varivel de controle da repeti-
o varia cada vez que a repetio executada. O incremento pode ser positivo
ou negativo.

Exemplificando:
#include <iostream>
1. using namespace std;
2
3 int main(int argc, char** argv){
4 int x;
5
6 for (x=1; x<=10; x++)
7 cout<<x;
8 }

Voc consegue imaginar o que este programa faz? Analise a sintaxe do for, o
programa e o que voc j aprendeu da linguagem C++ at aqui. A execuo est
mostrada na figura 4.3.

Figura 4.3 Execuo do comando for

Alguns detalhes sobre o programa:


Como s existe 1 comando dentro do looping, no necessrio colocar o
abre e fecha chaves ({ e })

captulo 4 125
Lembre-se sempre do valor inicial da repetio e da condio. Se ao invs
do <=10 fosse escrito somente <10, o resultado seria outro.
Veja que usamos a forma abreviada no incremento. Acostume-se a usar o
incremento da forma que est exemplificada aqui.

Portanto, o programa imprime na tela o valor de x, sem pular linha, 10 vezes,


variando de 1 (valor inicial), somando 1 ao x (x++), enquanto o x for menor ou
igual a 10, repetindo a impresso de uma maneira controlada e configurada
pelo programador.
Veja outro exemplo:

Exemplo 1
O programa a seguir poderia ser usado na NASA para lanar foguetes:
#include <iostream>
1 using namespace std;
2
3 int main(int argc, char** argv){
4 int x;
5 for (x=10; x>0; x--)
6 cout<<x<<endl;
7 cout<<"Lanar!";
8 }

Este exemplo bem parecido com o anterior, porm neste caso fizemos
uma contagem decrescente, usando xcomo incremento.

126 captulo 4
4.3.2 Repetio com limite do contador determinado pelo usurio

Este tipo de loop caracterizado por uma estrutura que faz um teste lgico
no looping. Portanto, a expresso avaliada e caso ela seja falsa, todo o bloco
que seria repetido no executado.
Caso a condio seja verdadeira, o bloco executado e aps a execuo, a
condio avaliada novamente.
Se ela for verdadeira, o bloco novamente executado e se for falsa, a repeti-
o para. E assim por diante.
Esta estrutura chamada de enquanto-faa e bem simples de ser enten-
dida: Enquanto a condio for verdadeira, faa o que est dentro do bloco.
Em C++ o comando apropriado para esta estrutura o while e vamos usar um
exemplo para estud-lo.
A sintaxe do comando while em C++ :
while (<condio>) {
<bloco de comandos>
}

O fluxograma para este tipo de repetio mostrado na figura 4.4.

Deciso

Instrues
executadas
enquanto a N
condio
verdadeira

...

Figura 4.4 Enquanto-faa

captulo 4 127
Exemplo 2: Enquanto-faa
Podemos usar como exemplo um programa que mostre a tabuada de qual-
quer nmero, informado pelo usurio.
Vamos comear com o que sempre fazemos: quais so as variveis que po-
dero ser usadas pelo programa? Vamos ter um nmero digitado pelo usurio
que ser a tabuada que queremos mostrar, logo temos nossa primeira varivel,
numero.
Nas estruturas de repetio usaremos o contador. Esta varivel ser a que
vai controlar nossa estrutura de repetio. Ela ser incrementada at que a con-
dio se torne falsa e termine o programa. Voc ver que esta varivel vai ser
usada muitas vezes nos programas que envolvem repetio e claro, ela pode
assumir qualquer nome, desde que faa sentido e que fique claro que ela o
contador da repetio.
E como estamos tratando de tabuada, podemos ter uma varivel chamada
resultado. Esta varivel guarda o resultado da multiplicao.
Antes de tratar do cdigo, vamos entender o que vai acontecer.
Quando estudamos tabuada no colgio, a professora nos ensinava assim
(exemplo com a tabuada do 2):

2x1=2
2x2=4
2x3=6
2x4=8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
2 x 10 = 20

Com base no que voc j aprendeu de programao e tambm com um pou-


co de intuio, observe a tabuada do 2 e tente responder s perguntas:
Qual o nmero que est fixo na tabuada?
Por que ele est fixo?
Como ele apareceu?
O que est repetindo?
Quantas vezes ocorrem as repeties?

128 captulo 4
Por que ocorre esse nmero de repeties?
O que acontece em cada repetio?

Agora veja as possveis respostas para as perguntas na figura 4.5.

Tabuada do 2
Isto o que ser repetido. Cada linha vai ser repetida
2 * 1 = 2 10 vezes e vai compreender a multiplicao do nmero
da tabulada pelo contador atual.
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
2 * 10 = 20
Este o contador. Ele vai ser reponsvel por contar o
nmero de repeties no programa. O contador
comea em 1 e vai at 10.

Este o nmero que vamos informar pelo programa.

Figura 4.5 Explicao da tabuada do 2.

O importante para o programador iniciante conseguir enxergar o que ser


repetido. No nosso exemplo, a repetio ser cada linha da tabuada ou seja,
uma conta bem simples: 2 vezes o valor do contador. O 2 ser lido pelo pro-
grama. E vamos repetir 10 vezes porque normalmente aprendemos a tabuada
de 1 a 10.
Vamos ao cdigo? Iniciando pela declarao de variveis:
1 #include <iostream>
2
3 int main(int argc, char** argv) {
4 int numero;
5 int contador=1;
6 int resultado;

captulo 4 129
Sem novidades no ? Exceto pela linha 5. At agora vimos que apenas de-
claramos as variveis sem inicializa-las, como ocorre nas linhas 4 e 6. Mas na
linha 5 usamos um recurso da linguagem C++, e de outras tambm, que inicia a
varivel com um valor e assim quando formos usar a varivel pela primeira vez,
ela j ter um valor inicial definido, portanto escrever:
int contador = 1;

o mesmo que escrever:


int contador;
contador = 1;

Nas linhas 8 e 10 perguntamos ao usurio qual a tabuada que gostaria de


ser mostrada:
8 cout<<"Qual a tabuada?"<<endl;
9 cin>>numero;

E nas linhas 11 a 15 entra a parte nova:


11 while (contador<=10){
12 resultado = numero*contador;
13 cout<<numero<<" * "<<contador<<" = "<<resultado<<endl;
14 contador = contador+1;
15 }

Na linha 11 est o tipo de repetio que ser usado. De acordo com a sintaxe
do while, a condio deve estar entre parnteses assim como est na linha 11.
Observe que o valor atual de contador 1, sendo assim, a condio satisfeita
e o looping comea.
Na linha 12 feita a conta para ser mostrada na tela. Nmero a varivel
que foi lida na linha 9 e contador a varivel de repetio. Inicialmente temos
os valores 2 e 1 respectivamente, supondo que o usurio escolheu a tabuada do
2 para ser mostrada.
A linha 14 fundamental. Sem ela entraramos em um loop infinito. O re-
sultado de um loop infinito muitas vezes o que chamamos de computador
travado pois a impresso que temos que nada est sendo processado na-
quele momento e dependendo do tamanho da tela, teremos a impresso que o
computador est travado.

130 captulo 4
O loop infinito tambm gerar consumo da memria e do processamento
do processador e dependendo do tamanho do bloco de comandos dentro do lo-
oping e o que est sendo processado, o computador poder ficar sem memria
e as consequncias desse deslize podem comprometer coisas maiores.
Observe na linha 14 que a varivel contador incrementada de 1. Desta for-
ma teremos a progresso da tabuada de 1 em 1. Se o incremento fosse feito em
2 unidades, teramos outros resultados na tela.
Portanto o programa final est mostrado na Listagem 1.
#include <iostream>
1 using namespace std;
2
3 int main(int argc, char** argv) {
4 int numero;
5 int contador=1;
6 int resultado;
7
8 cout<<"Qual a tabuada?"<<endl;
9 cin>>numero;
10
11 while (contador<=10){
12 resultado = numero*contador;
13 cout<<numero<<" * "<<contador<<" = "<<resultado;
14 contador = contador+1;
15 }
16 cout<<"*** FIM ***";
17 return 0;
18 }
Listagem 1 Programa da tabuada.

A figura 4.6 mostra a execuo do programa, tendo como numero o valor 2.

Figura 4.6 Execuo do programa da tabuada.

captulo 4 131
4.3.3 Repetio controlada pelo resultado de uma operao

Um problema que atualmente fcil de ser resolvido porque a tecnologia


permite ter processadores rpidos e memrias minsculas o clculo da raiz
quadrada de um nmero.
H alguns anos este era de fato um problema pois existem algumas formas
diferentes de se obter o resultado. Entre os mtodos, o mais usado o de apro-
ximaes sucessivas de Newton-Raphson. Basicamente ele diz o seguinte:
y
A primeira aproximao para a raiz quadrada de um nmero y x1 = .
2
As demais aproximaes so calculadas por uma frmula de recorrncia
x y
2
x i +1 = x i i .
2x i

Em uma situao real, estas frmulas e mtodos seriam passados a voc,


no se preocupe com a matemtica deste exemplo.
Porm observe que o i que existe na frmula de recorrncia trata-se de
uma repetio e a que voc entra!
Para o clculo da raiz quadrada poderamos usar um nmero razovel de
repeties como 20 ou 30. Mas para ele ficar mais aproximado, temos que usar
uma varivel auxiliar.
Veja o programa a seguir:
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 int i;
6 float y,x,aux;
7
8 i=0;
9 cout<<"Qual o valor de y? "<<endl;
10 cin>>y;
11
12 if (y==0){
13 cout<<"Raiz de y=0"<<endl;
14 }

132 captulo 4
15 else {
16 if (y<0){
17 cout<<"Nao e' possivel fazer o calculo!"<<endl;
18 }
19 else {
20 x=y/2;
21 aux=0;
22 while (x!=aux){
23 aux=x;
24 x=x-(x*x-y)/(2*x);
25 i++;
26 }
27 cout<<"Raiz de y="<<x<<endl;
28 cout<<"Numero de repeticoes: "<<i<<endl;
29 }
30 }
31 return 0;
32 }

Colocamos algumas restries: o valor de y no pode ser 0 ou negativo.


Porm se for positivo, ele entra em um lao presente na linha 22 e vai at a 26.
Veja que quem vai controlar a quantidade de repeties a varivel aux, que
atualizada dentro do lao. Este um exemplo, dentre vrios outros, que mos-
tram que o loop pode ser controlado por uma expresso matemtica.
Veja o resultado da execuo do programa:

captulo 4 133
4.3.4 Repetio controlada pelo valor da entrada de dados

Voc conhece a srie de Fibonacci? No, no uma srie de TV! Ela ficou
muito famosa e popular no livro e filme O cdigo Da Vinci. Na matemtica
ela representada por uma sequncia de nmeros inteiros comeando por 0 ou
1 na qual cada prximo termo da srie equivale a soma dos dois anteriores. Os
nmeros de Fibonacci compem a sequncia:
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,etc..
Para que ela serve?

Anlise de mercados financeiros,


Cincia da computao
Teoria dos jogos
Funes bioestatsticas
Afinao de instrumentos musicais

Figura 4.7 Aplicao da sequncia de Fibonacci na arquitetura. Esta figura tambm co-
nhecida como "assinatura de Deus" pois as conchas dos Nautilus seguem a proporo dos
nmeros da sequncia de Fibonacci.

134 captulo 4
Chega de matemtica!
Vamos supor que voc precise gerar a sequncia para algum a qual ir te
passar quantos termos da sequncia sero necessrio.
Por exemplo, se o usurio pedir 5 termos, a sequncia ser: 1,1,2,3,5. Se pe-
dir 8 termos: 1,1,2,3,5,8,13,21. E assim por diante.
O programa para este problema est representado a seguir:
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 int a,b,auxiliar,i,n;
6
7 a=0;
8 b=1;
9
10 cout<<"Quantos termos da sequencia?"<<endl;
11 cin>>n;
12 cout<<"----------"<<endl;
13 cout<<"Serie de Fibonacci com "<<n<<" termos:";
14
15 for (i=0; i<n; i++){
16 auxiliar = a+b;
17 a=b;
18 b=auxiliar;
19 cout<<auxiliar<<" ";
20 }
21 return 0;
22 }

O lao de repetio est entre as linhas 15 e 20.


Observe que o que determinou quantas vezes o lao ser repetido uma va-
rivel que recebeu um valor o qual o usurio escolheu: a varivel n.
Este apenas um dos vrios exemplos nos quais o usurio determina a
quantidade de repeties de acordo com a entrada que foi feita. A sada do pro-
grama para 9 repeties est mostrada a seguir:

captulo 4 135
Figura 4.8 Srie de Fibonacci.

4.3.5 Repetio controlada pela resposta do usurio

Todos os nossos programas at agora executavam uma vez e terminavam


no ? No mais interessante que fosse feita uma pergunta ao usurio solici-
tando se ele quer continuar ou no? claro que sim, isso natural de qualquer
programa.
Mas como fazer isso? Com o conceito de repetio e refletindo um pouco
voc ter uma resposta.
Vamos tomar o exemplo da tabuada. No final da execuo o programa po-
deria perguntar: Deseja continuar (s/n)?. Se o usurio digitar s o programa
repete e n, o programa termina.
Basicamente o que temos que fazer :
1. Criar uma varivel para ser usada como resposta
2. Enquanto a resposta for s, executar as linhas de 8 a 15 da Listagem 1.
3. Quando a resposta for diferente de s, terminar o programa.

Vamos ao cdigo. Comeamos como o programa da Listagem 1:


#include <iostream>
1 using namespace std;
2
3 int main(int argc, char** argv) {
4 int numero;
5 int contador=1;
6 int resultado;

Agora comea a parte nova. Lembre-se que queremos repetir a execuo


do programa enquanto a resposta do usurio sobre a repetio for s (sim).
Ento temos que ter outra varivel, a qual vamos chamar resposta e iremos
us-la como controle da repetio de execuo do programa. Vamos assumir

136 captulo 4
que ela inicialmente j ter o valor s (lembre-se que quando usamos char, usa-
mos aspas simples).
7 char resposta ='s';

Lembrando que podemos escrever a linha 7 em duas linhas: uma para a de-
clarao, outra para a inicializao do valor.
A parte do clculo da tabuada j foi feito no Exemplo1. Esta parte no muda.
O que temos que fazer agora inserir um looping externo a este para controlar
a execuo do programa. Teremos aqui ento um loop aninhado, assim como
tivemos com os ifs, lembra?
O looping que controlar a repetio ficar da seguinte forma:
9 while (resposta=='s'){
10 contador = 1;
11 //Aqui entra o programa do Exemplo 1
19
20 cout<<"Deseja continuar (s/n)?"<<endl;
21 cin>>resposta;
22 }

Basicamente a forma do while bem parecida com o while do Exemplo 1.


Porm neste caso, no temos um contador para controlar este looping, temos
aqui uma varivel que receber um valor a cada iterao do looping. Esta vari-
vel ser a resposta que ser lida na linha 21. Lembre-se que para a primeira
execuo do looping, a varivel j recebeu o valor inicial para poder entrar no
looping da linha 9. Daqui a pouco comentaremos sobre a varivel contador pre-
sente na linha 10.
O cdigo final do programa est mostrado na Listagem 2.
#include <iostream>
1 using namespace std;
2
3 int main(int argc, char** argv) {
4 int numero;
5 int contador;
6 int resultado;
7 char resposta ='s';
8

captulo 4 137
9 while (resposta=='s'){
10 contador = 1;
11 cout<<"Qual a tabuada? "<<endl;
12 cin>>numero;
13
14 while (contador<=10){
15 resultado = numero*contador;
16 cout<<numero<<" * "<<contador<<" = "<<resultado;
17 contador = contador+1;
18 }
19
20 cout<<"Deseja continuar (s/n)?"<<endl;
21 cin>>resposta;
22 }
23 cout<<"*** FIM ***";
24 return 0;
25 }
Listagem 2 Repetio controlada pelo usurio

Observe que agora temos um looping (entre as linhas 14 e 18) dentro de ou-
tro (entre as linhas 9 e 22). Vamos estudar esta situao com um pouco mais de
detalhe no tpico 4.3.7.
Preste muita ateno agora: vamos supor que seja a primeira execuo do
programa. O cdigo final da Listagem 2 um pouquinho diferente do progra-
ma da Listagem 1, verifique!
Sendo assim, qual o valor da varivel contador agora? No d para saber,
certo? Declaramos a varivel na linha 5 e tiramos a inicializao na declarao.
O programa inicia com a varivel resposta valendo s e entra no looping da
linha 9. Na linha 10 temos a varivel contador sendo inicializada. Novamente
vamos deixar pra l por enquanto, apenas guarde que ela contm o valor 1
nesta linha.
O programa prossegue nas linhas 11 e 12 perguntando ao usurio qual ser
a tabuada a ser mostrada.
As linhas 14 a 18 j foram estudadas durante o Exemplo 1, certo? Porm
agora a pergunta : qual o valor da varivel contador ao final do looping da ta-
buada? Ou melhor, qual o valor da varivel contador quando o programa chegar
na linha 19? Se voc respondeu 11, acertou.

138 captulo 4
O programa prossegue nas linhas 19 e 20 perguntando ao usurio se ele
quer continuar a execuo do programa. Se o usurio responder s, a varivel
resposta receber este valor, o looping chegar na linha 22 e voltar para a linha
9 onde a varivel resposta ser avaliada novamente. Como ela ter o valor s, o
looping voltar a ser iniciado, o usurio informar a tabuada e etc.
Agora vamos responder o motivo do contador receber o valor 1 na linha
10. Como acabamos de citar, se nada for feito, o valor de contador ser 11 e
assim numa prxima execuo do looping, nunca entrar na parte da tabuada
(porque a condio do looping da tabuada (contador <= 10). Se ele valer 11, a
condio nunca ser verdadeira). Por isso, tiramos a inicializao da declarao
da varivel como est na Listagem 1 e colocamos na linha 9 desta forma, corri-
gindo o cdigo para funcionar do jeito que planejamos.
Entendendo as repeties aninhadas
Voc sabia que a palavra tabuada tem relao com tbua? Sim, isso mes-
mo, a tbua de madeira que conhecemos. Esta palavra usada porque o mate-
mtico Pitgoras usou uma tabela escrita em uma tbua para poder explicar a
multiplicao.
A tabuada de Pitgoras tinha aproximadamente as seguintes informaes:

* 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 2 4 6 8 10 12 14 16 18
3 3 6 9 12 15 18 21 24 27
4 4 8 12 16 20 24 28 32 36
5 5 10 15 20 25 30 35 40 45
6 6 12 18 24 30 36 42 48 54
7 7 14 21 28 35 42 49 56 63
8 8 16 24 32 40 48 56 64 72
9 9 18 27 36 45 54 63 72 81

E agora, como desenvolver essa tbua em C++? J vimos anteriormente


como repetir nmeros de 1 a 10, ou 1 ao 9, mas como fazer isso para aplicar em
duas dimenses? A resposta : temos que fazer uma repetio dentro da outra,
ou trabalhar com uma repetio aninhada. Veja o seguinte programa:
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char** argv) {
5 cout<<"Tabuada de Multiplicacao"<<endl;
6 cout<<"\t1\t2\t3\t4\t5\t6\t7\t8\t9"<<endl;

captulo 4 139
7 cout<<"\t-\t-\t-\t-\t-\t-\t-\t-\t-"<<endl;
8 for (int linha=1; linha<=9; linha++){
9 cout<<linha<<"\t";
10 for(int coluna=1; coluna<=9; coluna++){
11 cout<<linha*coluna<<"\t";
12 }
13 cout<<"\n";
14 }
15 return 0;
16 }
Listagem 3

Veja que temos um for dentro do outro nas linhas 8 e 10. Outro detalhe:
lembra dos caracteres de escape, principalmente o de tabulao \t e o nova
linha \n? Estamos usando eles neste exemplo para poder formatar a sada de
dados.
O for da linha 8 se encarrega de representar as linhas da tabela de tabuada e
o for da linha 10 se encarrega das colunas.
Desta forma, podemos aninhar os dois laos e o resultado no fica muito
bonito, mas representa corretamente a tabela de tabuada do Pitgoras:

Figura 4.9 Tbua de Pitgoras.

Exemplo 3
H alguns anos, um famoso apresentador da TV tinha um programa chama-
do Domingo no Parque. Neste programa, o apresentador chamava as crian-
as para um desafio no qual elas tinham que contar de 1 a 40, mas nos nmeros

140 captulo 4
que faziam parte da tabuada do 4, ao invs de falar o nmero, a criana falava
PIM e continuava assim, at 40. Quem chegava at o 40 ganhava um prmio.
Portanto, para ganhar o prmio a criana teria que falar assim: 1, 2, 3, PIM,
5, 6, 7, PIM, 9, 10, 11, PIM, 13, 14, 15, PIM, 17, 18, 29, PIM, 21, 22, 23, PIM, 25,
26, 27, PIM, 29, 30, 31, PIM, 33, 34, 35, PIM, 37, 38, 39, PIM. Tente fazer isso,
bem fcil de confundir.
Como voc faria um programa para fazer a mesma coisa em C++?
Veja que uma repetio controlada pois vai de 1 a 40. Alm disso, durante
a contagem de 1 a 40, se o nmero for da tabuada do 4, ele no ser impres-
so, ser impresso PIM. Mas, como saber se um nmero da tabuada do 4?
Perceba que muitas vezes o problema no o algoritmo em sim, e sim saber ou-
tros assuntos de uma maneira bem detalhada para poder resolver o problema.
Voltando ao problema, um nmero de uma tabuada qualquer quando ele
for divisvel pelo nmero da tabuada. Ou seja, neste caso, divisvel por 4. E como
saber se o nmero divisvel? Simples! Quando o resto da diviso, no caso, por
4 for zero. Lembre-se que temos um operador em C que faz este trabalho para
voc. Est vendo como uma coisa puxa a outra?
Vamos l!
Neste programa tambm vamos dar a possibilidade para o usurio rodar o
programa mais uma vez, sendo assim, o do-while pergunta se ele quer continu-
ar ser utilizado.
A parte principal o looping que vai de 1 at 40, com incremento de 1 e a
cada repetio o nmero, na verdade o prprio contador, impresso na tela.
Vamos usar um for isso pois sabemos o nmero de repeties.
A cada repetio, antes do nmero ser impresso na tela, verificamos se o
contador divisvel por 4, se for, imprimimos PIM no lugar do contador. Veja
a Listagem 4 e as linhas de 10 a 15.
#include <iostream>
1 using namespace std;
2
3 int main(int argc, char** argv){
4 int numero;
5 int contador;
6 int resultado;
7 char resposta ='s';
8

captulo 4 141
9 do {
10 for (contador=1; contador<=40; contador++){
11 if (contador%4==0)
12 cout<<"PIM ! "<<endl;
13 else
14 cout<<contador<<endl;
15 }
16
17 cout<<"Deseja continuar (s/n)?"<<endl;
18 cin>>resposta;
19 } while (resposta=='s');
20 return 0;
21 }
Listagem 4 Programa do "PIM"

4.4 Comparao entre as estruturas de


repetio

Existem alguns postulados a respeito das estruturas de repetio:


Toda estrutura feita com while pode ser convertida para do-while e
vice-versa
Toda estrutura for pode ser convertida em while, mas nem toda estrutura
while pode ser convertida em for

A tabela 4.1 faz uma comparao entre as estruturas de repetio de acordo


com suas caractersticas.

Estrutura Condio Quantidade de execues Condio de existncia


while Incio Indefinido Condio verdadeira
do-while Fim Mnimo 1 Condio falsa
De acordo com
for No tem Valor inicial < Valor final
o programador

Tabela 4.1 Comparao entre estruturas de repetio.

142 captulo 4
Sabe quem est explicando sobre estruturas de repetio neste vdeo? Mark Zucke-
nberg, o criador do Facebook. Assista o vdeo e relaxe um pouco:
https://www.youtube.com/watch?v=BlXtMr7ge9Q

4.5 Depurao de programas


Muitas vezes necessrio executar o programa passo a passo para verificar
erros e corrigir possveis falhas durante o desenvolvimento. Os exemplos que
temos estudado so simples e curtos, alm disso, assim como outras IDEs, o
DevC++ aponta o nmero da linha com o erro que ocorreu. Isto j ajuda mas
no suficiente.
Em muitas situaes ser necessrio pausar o programa, verificar o valor de
uma determinada varivel, entre outras necessidades. Isto chamado de de-
purao ou debug. Vrias IDEs oferecem esse recurso e deve ser muito bem
explorado pelos programadores.

Quando os computadores ainda ocupavam grandes espaos fsicos e funcionavam


com vlvulas, a execuo de um programa e sua depurao eram atividades extre-
mamente complicadas. Certa vez, um determinado programa no estava rodando e
os programadores no descobriam o motivo. Foram verificar e encontraram um inseto
(bug, em ingls) dentro dos circuitos e este estava impedindo o computador funcionar.
Da surgiu o termo bug de computador, usado quando existe algum tipo de erro e con-
sequentemente o debug, que o processo de depurao.

No caso do DevC++ o depurador muito simples de ser usado.


A tela inicial do DevC++ mostrada na figura 4.10, observe a flecha que indi-
ca onde o depurador acionado. Vamos estudar o depurador com o programa
da Listagem 5.

captulo 4 143
A figura 4.11 mostra os detalhes da tela do Depurador aps o acionamento
do boto Depurador na tela inicial.
Para o Depurador ser executado de fato, o programa precisa ser recompilado
para que cdigos de depurao sejam anexados ao programa a ser gerado. Note
que na tela da figura 4.11 h um boto chamado Depurar. Quando o usurio
clica neste boto, se for a primeira vez que estiver sendo usado no projeto, vai
aparecer um dilogo dizendo que o projeto no possui cdigos de depurao e
pergunta ao usurio se ele deseja depurar o programa. Confirmando esta op-
o, o programa ser compilado novamente com os novos cdigos e executado.

Figura 4.10 Tela inicial do DevC++.

Figura 4.11 Tela do depurador.

144 captulo 4
Observe na tela da figura 4.11 que existe um boto chamado Adicionar
marcador. Os outros botes ainda esto desabilitados porque apesar do pro-
grama estar compilado agora com os cdigos de depurao, ainda precisamos
habilitar algumas funes de depurao.
No programa da Listagem 5 existem 3 variveis declaradas: inicio, fim e i.
A depurao muito til para verificar a execuo de loopings passo a passo.
Vamos criar 3 marcadores, um para cada varivel.Veja o resultado da adio
desses marcadores na figura 4.12.

Figura 4.12 Aba dos marcadores adicionados ao projeto.

Agora temos condies de executar o programa passo a passo e a cada passo


poderemos verificar o estado de cada uma dessas variveis. Em projetos maio-
res, o uso dos marcadores e da depurao sero extremamente importantes
para o bom desenvolvimento do software.
Falta um pequeno detalhe para iniciarmos a depurao: no programa digi-
tado, o programador precisa selecionar a linha na qual deseja iniciar a execu-
o passo a passo e marc-la como breakpoint. Como o nome sugere, estamos
inserindo um ponto de parada. Portanto, o depurador vai executar o programa
e ao encontrar o breakpoint, vai parar e esperar o usurio tomar alguma ao.
Quando marcamos uma linha como breakpoint, a linha toda fica destacada em
vermelho.

captulo 4 145
Neste momento estamos prontos para acionar o boto Depurar e verificar
o funcionamento do programa passo a passo. Veja como fica a tela do programa
na figura 4.13. Preste ateno na aba do Depurador onde encontramos as vari-
veis inicio, com valor 1, fim, tambm com valor 0 e i com valor 0. Acabamos de
executar o programa pela primeira vez, ento natural esperar estes valores na
primeira execuo. Observe tambm que os outros botes que estavam desabi-
litados, agora esto habilitados.
Na tela do programa, a linha a ser executada est marcada em azul com uma
pequena flecha indicando que ao acionarmos o boto Prxima linha, ela
que ser executada.

Figura 4.13 Depurando o programa

A depurao consiste em executar passo a passo e verificar o estado e con-


tedo das variveis. Em algumas IDEs o depurador oferece ferramentas mais
detalhes as quais permitem verificar o estado da memria e registradores. No
caso do DevC++ possvel acessar uma tela para ver o estado da CPU durante a
depurao conforme mostra a figura 4.14.

146 captulo 4
Figura 4.14 Visualizao da CPU

interessante usar o boto Prxima linha. Desta forma, o programa ser


executado passo a passo. Veja como ficou o estado das variveis na figura 4.15
aps inserir o valor 40 para a varivel incio.

Figura 4.15 Depurando o programa

Aps algumas execues passo a passo e depois de entrar no looping do for,


temos a seguinte configurao das variveis, mostrada na figura 4.15. Observe o
valor da varivel i e como ela varia conforme o looping executado.

captulo 4 147
Enquanto isso, na tela de execuo do programa, as mensagens de impres-
so na tela continuam normalmente. Veja a figura 4.16.

Figura 4.16 Depurando o programa.

Figura 4.17 Tela de execuo do programa enquanto est em depurao.

E assim o programa prossegue at o final. A depurao no deve ser feita ra-


pidamente. Como um trabalho de investigao para saber onde que o erro est
ocorrendo, um trabalho que deve ser feito com cuidado e detalhadamente.
O grande segredo escolher os melhores marcadores para avaliar as vari-
veis e colocar os breakpoints em locais estratgicos do cdigo. possvel inserir
vrios breakpoints no programa para melhorar a depurao.
No caso de o erro j ter sido descoberto, ou pelo menos encontrado um pon-
to suspeito, possvel clicar no boto Continuar para terminar a depurao.
Os outros botes encontrados no Depurador tambm so encontrados em
outras IDEs com pequenas variaes no nome.

148 captulo 4
Prxima linha: executa a prxima linha em relao ao cursor. O cursor de
depurao caracterizado por uma seleo azul na linha atual e uma pequena
seta ao lado da linha.
Prxima instruo:
Parar execuo: para a execuo do depurador
Visualizar janela da CPU: este boto abre uma tela contendo o estado atu-
al da CPU. Mostra a alocao do programa na memria e o estado de alguns
registradores
Passar por dentro:
Pular funo:
Ir a instruo:
Continuar: este boto faz com que o depurador avance at o prximo
breakpoint.

REFLEXO
Neste captulo vimos a ltima estrutura de controle de fluxo para a programao. Com estes
elementos j possvel programar em muitas linguagens de programao. Mas ainda exis-
tem alguns elementos que vamos estudar no prximo captulo.

REFERNCIAS BIBLIOGRFICAS
ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos de programao de computadores. So
Paulo: Pearson Education, 2008.
DASGUPTA, S.; PAPADIMITRIOU, C.; VAZIRANI, U. Algoritmos. So Paulo: McGraw Hill, 2009.
FEOFILOFF, P. Algoritmos em linguagem C. Rio de Janeiro: Campus, 2008.
FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lgica de programao: a construo de algoritmos e
estruturas de dados. So Paulo: Makron Books, 1993.
MANZANO, J. A. N. G.; OLIVEIRA, J. F. D. Algoritmos: lgica para desenvolvimento de programao.
9. ed. So Paulo: rica, 1996.
PUGA, S.; RISSETTI, G. Lgica de programao e estrutura de dados. So Paulo: Pearson
Education, 2003.

captulo 4 149
150 captulo 4
5
Mdulos e Vetores
At agora vimos as situaes mais comuns que sero encontradas na pro-
gramao bsica de computadores. A linguagem C muito poderosa e nos-
so objetivo geral da disciplina introduzi-lo na programao desta grande
linguagem.
Porm, se pensarmos um pouco, ainda faltam alguns recursos que pode-
riam facilitar ainda mais a programao. Por exemplo, quando tratamos uma
varivel, tratamos de uma maneira unitria e falta as vezes a possibilidade de
tratar um conjunto de variveis do mesmo tipo. Ou seja, ser que no seria pos-
svel usar um conjunto de nmeros inteiros para guardar os meses do ano, por
exemplo? Isso facilitaria muito em algumas ocasies como no clculo de uma
folha de pagamento, etc.
Nossos programas e exemplos possuem efeitos didticos, mas na vida real
os programas so bem maiores. Quando tratamos sobre o que um projeto no
captulo 2 citamos que um programa de grande porte composto de mdulos
e outras partes, alm dos programas fonte. Porm, precisamos aprender como
dividir os programas em partes, assim, cada parte pode ser reaproveitada em
outros programas.
Uma vez que voc j sabe programar com as estruturas de controle, neste
captulo vamos introduzir dois assuntos importantes: os vetores e os mdulos,
muito usados na linguagem C e outras linguagens tambm.
Vamos l?

OBJETIVOS
Ao final deste captulo voc estar apto a:

Desenvolver programas utilizando vetores


Implementar as operaes bsica em vetores
Elaborar programas complexos utilizando funes.

152 captulo 5
5.1 Introduo aos vetores

Figura 5.1 Um arquivo

Voc j deve ter visto uma gaveta de um arquivo de ao como est mostrado
na figura 5.1. Vamos tentar descreve-la?
Trata-se de uma gaveta, contendo vrias fichas (de um cliente, aluno, fun-
cionrio, contribuinte, etc) numeradas de acordo com um ndice. Embora seja
possvel, a gaveta contm fichas do mesmo tipo: pessoas. Se aparecer uma ficha
de um imvel, um carro, ou outra coisa, este elemento est errado e no perten-
ce a este conjunto. Resumindo, temos elementos (fichas) do mesmo tipo, or-
denadas ou no, porm indexadas. Basicamente isso o mesmo que um vetor!
Um vetor, ou array, ou varivel composta unidimensional uma estrutura
de dados contendo um conjunto de dados, todos do mesmo tipo, indexados por
um valor. Graficamente podemos representa-lo assim:
0 1 2 3 4 5 6 7 8
x a I g o r i t m o

Figura 5.2 Um tpico vetor

A figura 5.2 mostra um tpico vetor: todos os elementos so do mesmo tipo


(char), indexado por nmeros (comeando do 0 e vai at o 7) e possui um
nome (x).
Em C, para se declarar um vetor usamos a seguinte sintaxe:
tipo nome_vetor[tamanho]

captulo 5 153
Ento, o vetor da figura 5.2 declarado assim:
char v[8];

Preste ateno! Anteriormente usamos a mesma sintaxe para criar um string! Agora
faz sentido! Quer dizer que uma string um vetor de caracteres? Na linguagem C . Em
outras linguagens isto diferente, mas em C e outras linguagens como C++, Java e
outras, uma string um vetor de caracteres!

Portanto, como vimos no box, a string linguagem C um vetor de caracte-


res com 11 posies (no esquea do espao em branco, pois o espao tambm
um caractere).
Outro detalhe que voc tem que tomar cuidado que na linguagem C, todo
vetor comea com um ndice 0 e se voc declarar um vetor assim:
int x[10];

teremos um vetor de inteiros com 10 posies, com ndices que variam de


0 a 9.

5.1.1 Manipulao

possvel fazer vrias operaes com vetores e estas operaes so chama-


das de manipulaes.

154 captulo 5
Da mesma forma que criamos e declaramos outros tipos de variveis como
int, double, float, etc, criamos e declaramos um vetor. Portanto, eles tm um
identificador (um nome).
A posio de um elemento dentro de um vetor feita por meio de uma cons-
tante numrica chamada ndice. Lembre-se da figura do fichrio no incio des-
ta seo, exatamente a mesma ideia e concepo.
Ento em um vetor abc de inteiros com 10 posies, para que o valor 10 seja
atribudo na posio 5, faremos o seguinte:
abc[4] = 10;//lembre-se que o vetor comea no ndice 0, por isso a posio 3
est no ndice 2
O vetor ficaria assim:

Figura 55

Tome cuidado! O vetor abc tem 10 posies e os ndices vo de 0 a 9! Se voc


tentar colocar um elemento na posio cujo ndice 11 (abc[11]), o compilador
gerar um erro cuja mensagem Index Out of Bounds que significa que uma
tentativa de acessar um ndice inexistente foi feita.
Uma vez que podemos atribuir valores s posies dos vetores, como voc
faria para preencher um vetor de inteiros com 100 posies e todas as posies
com o nmero 1? Use um loop:
1 #include <stdio.h>
2
3 int main() {
4 int vetor[100];
5 int i;
6
7 for (i=0; i<100; i++){
8 vetor[i]=1;
9 }
10 return 0;
11 }
Listagem 1 Atribuio de valores em um vetor

captulo 5 155
A Listagem 1 mostra um programa simples o qual nos ensina bastante. Na
linha 4 temos a declarao e criao do vetor. Nas linhas 7 a 9 criamos um loop
que percorre o vetor posio por posio e para cada uma, insere o valor 1. Isto
feito usando o ndice com o contador do loop. Este recurso muito usado em
vrios programas.
Tambm podemos fazer operaes aritmticas com os ndices e valores, por
exemplo:

v[2] + v[3]: o valor de v[2] 8, o valor de v[3] 3, sendo assim v[2]+v[3]=11


v[2+3] = v[5] = 16
2*v[7]: o valor de v[7] 21, logo 2*v[7] = 2*21 = 42

Vamos fazer um exemplo prtico:

Exemplo 1: Aplicao de vetor


O objetivo do programa a seguir calcular a mdia aritmtica geral de uma
classe com 10 alunos. O programa deve imprimir a quantidade de notas acima
da mdia.
Vamos analisar o problema como sempre fazemos antes de comear a pro-
gramar. Inicialmente temos que prever quais variveis sero usadas no progra-
ma. Como estamos craques em calcular mdia, j sabemos que vamos usar as
variveis soma e media.
Agora temos que analisar o que vai acontecer com a lgica do problema:

Temos que criar um loop para ler a mdia de cada aluno. Cada valor ser
atribudo uma varivel e o total ser atribudo na varivel soma. Depois disso,
teremos o total das notas
Fazer a mdia fcil. simplesmente calcular a expresso media=soma/10.
Agora falta a parte nova no problema: saber quantas notas esto acima da
mdia. Para isto teremos que recuperar o valor de cada nota e verificar uma a
uma qual delas est acima da mdia. Mas como vamos recuperar? Lembre-se
que estamos aprendendo uma estrutura de dados que pode guardar estes valo-
res para serem usados posteriormente.

156 captulo 5
Um vetor pode ser usado nesta situao. Ele pode ser declarado com 10 po-
sies para que cada uma guarde a mdia de cada aluno. Ele deve ser percorrido
para fazer a soma das mdias inicialmente. Vamos chamar o vetor de notas.
Depois temos que percorrer o vetor posio por posio e verificar se o valor
lido da posio maior que a mdia. Se for, teremos que criar uma varivel para
guardar e acumular quantas notas so maiores que a mdia. Vamos chamar
esta varivel de notasAcima.

A varivel notasAcima est escrita em uma forma de notao chamada CamelCase.


Esta uma forma em ingls para escrever palavras compostas ou frases, onde cada
palavra iniciada com maisculas e unidas sem espaos. A maioria das linguagens
atuais adota esta prtica a fim de padronizar o modo de escrever e nomear variveis.

Figura 5.3 Notao CamelCase (https://pt.wikipedia.org/wiki/CamelCase)

0 1 2 3 4 5 6 7 8 9
notas

Figura 5.4 vetor para guardar as mdias

A figura 5.4 representa o vetor notas que ser usado para a soluo deste
exemplo. Ele receber os valores das mdias e ser percorrido algumas vezes
para os outros processamentos necessrios no programa.
Vamos comear o cdigo do programa com a declarao de variveis. A
maior diferena em relao aos exemplos que j vimos a declarao e criao
do vetor na linha 8.

captulo 5 157
1 #include <stdio.h>
2
3 int main() {
4 float soma=0;
5 float media;
6 int i;
7 int notasAcima=0;
8 float notas[10];
9

Com as variveis criadas, passamos para a entrada de dados. Como agora


vamos usar um vetor para armazenar os valores lidos, vamos usar um looping
para fazer a entrada de dados. O looping consiste em posicionar um cursor na
primeira posio do vetor, ler o valor, avanar o cursor para a prxima posio,
fazer a soma da mdia e repetir o processo at o fim do vetor. Veja a representa-
o deste processo na figura 5.5.

0 1 2 3 4 5 6 7 8 9
notas 1. Posiciona o curso na posio

0 1 2 3 4 5 6 7 8 9
notas 8 2. L o valor da mdia

Soma = soma + notas(i) 3. Faz a soma


0 1 2 3 4 5 6 7 8 9
notas 8 4. Passa para a prxima posio

Figura 5.5

Neste caso, como sabemos a quantidade de vezes que o looping ser repeti-
do, usaremos o for. Aps o fim do looping, calculamos a mdia:
10 for (i=0;i<10;i++){
11 cout<<Digite a media do aluno <<i+1<<endl);
12 cin>>notas[i];
13 soma = soma + notas[i];
14 }
15
16 media = soma/10;
7

158 captulo 5
Estamos quase terminando, at agora teremos um vetor carregado com va-
lores e com a mdia calculada. Como exemplo, podemos ter o vetor da Figura
59 no final da linha 16 e com o valor da varivel soma igual a 66 e a media igual
a 6,6.
0 1 2 3 4 5 6 7 8 9
notas 8 7 6,5 9 4 7 4,5 6 8 6

Figura 5.6

Agora para finalizar teremos que percorrer o vetor novamente para verificar
quantas notas esto acima do valor da mdia. A varivel notasAcima ser usada
para fazer a contagem das notas. Veja a figura 5.7.

0 1 2 3 4 5 6 7 8 9
notas 8 7 6,5 9 4 7 4,5 6 8 6 se notas[1] > 6,6 ento
notasAcima++
notasAcima=1
0 1 2 3 4 5 6 7 8 9
notas 8 7 6,5 9 4 7 4,5 6 8 6 avana o cursor

Figura 5.7

18 for (i=0; i<10; i++){


19 if (notas[i]>media){
20 notasAcima++;
21 }
22 }
23 cout<<"Existem "<<notasAcima<<" notas acima da media";
24 return 0;
25 }

Aps a finalizao do looping, o programa termina com a impresso de uma


mensagem na tela. O programa completo est mostrado na Listagem 14 e a exe-
cuo do programa est mostrada na Figura 61.
1 #include <stdio.h>
2
3 int main() {

captulo 5 159
4 float soma=0;
5 float media;
6 int i;
7 int notasAcima=0;
8 float notas[10];
9
10 for (i=0;i<10;i++){
11 cout<<"Digite a media do aluno "<<i+1<<endl;
12 cin>>notas[i];
13 soma = soma + notas[i];
14 }
15
16 media = soma/10;
17
18 for (i=0; i<10; i++){
19 if (notas[i]>media){
20 notasAcima++;
21 }
22 }
23 cout<<Existem<<notasAcima<< notas acima da media;
24 return 0;
25 }
Listagem 2

Figura 5.8 Execuo do programa

160 captulo 5
5.2 Variveis compostas multidimensionais
Muitas vezes no d para resolver os problemas com vetores de apenas uma
dimenso. Existem vrias situaes que ficam claras que se tivssemos um ve-
tor com 2 ou mais dimenses ficaria mais fcil de resolver um problema. Veja a
figura 5.9, nossa conhecida.
As fichas formam um conjunto pertencente a uma mesma gaveta em um
arquivo de ao. Esta gaveta poderia guardar todas as fichas que comeam pelo
nmero 1 por exemplo. As fichas so os vetores que j aprendemos.

4 3 7 5 3 8 9 12 11 4

Figura 5.9

Porm o arquivo contm vrias gavetas. Na figura s aparecem 4, mas po-


deramos ter vrios arquivos com gavetas numeradas. Portanto, se o arquivo
possui gavetas e estas gavetas esto numeradas, temos outro vetor, em outra
dimenso, que armazena outros vetores. Esta situao est ilustrada na figura
5.10.

captulo 5 161
4 3 7 5 3 8 9 12 11 4 1

2
2
4 3 7 5 3 8 9 12 11 4

3
3

4 3 7 5 3 8 9 12 11 4
4
4

4 3 7 5 3 8 9 12 11 4

Figura 5.10

Usando um diagrama para ilustrar a Figura 68 teramos o seguinte:

Figura 5.11

Portanto, como podemos perceber, agora teremos 2 ndices para poder in-
dexar a estrutura. No exemplo da Figura 5.11 o nome da estrutura, e consequen-
temente da varivel, arquivo.
Esta estrutura, assim como os vetores possui vrios nomes: estrutura com-
posta homognea multidimensional, matriz, arranjo bidimensional, array bi-
dimensional ou vetor bidimensional. Neste caso temos 2 dimenses mas po-
demos criar estruturas com mais dimenses de acordo com a necessidade do
programa. As matrizes permitem a manipulao de um conjunto de informa-
es de um mesmo tipo primitivo.

162 captulo 5
Para exemplificar a estrutura com exemplos prticos podemos citar:
Tabelas nas planilhas eletrnicas (como o Microsoft Excel)
O jogo batalha naval
O jogo da velha
O teclado do computador, do celular, da calculadora
Jogo de Xadrez, Dama
E outras formas tabulares

Este vdeo muito interessante e mostra vrios exemplos de matrizes. Disponvel em:
< https://www.youtube.com/watch?v=ks-q6gKoQKs >.

5.2.1 Manipulao

Assim como foi feito com os vetores, ou estruturas compostas homogne-


as unidimensionais, possvel manipular os ndices e valores das matrizes. Na
maioria das linguagens de programao existentes, as notaes para matrizes
so feitas da seguinte forma:
Matriz [dimenso1][dimenso2]...[dimenso n]

Desta forma, uma matriz bidimensional poderia ser anotada assim:


Matriz[linha][coluna]

captulo 5 163
Veja a figura 5.12. Temos um exemplo de manipulao de ndices e valores
da mesma forma como foi feito com os vetores unidimensionais.

inteiro: A, B; M 0 1 2 3
M [ 1, 2 ] 5;
M [ 2, 1 ] 6; 0 7 12
M [ 0, 1 ] 7;
A 3; 1 10 5
B 2;
M [ A, B ] 8; 2 6 11
M [ A, B2 ] 9;
M [ A2, B2 ] 10; 3 9 8
M [ B, A ] 11;
M [ B2, A ] 12;
Figura 5.12

Em C, a Figura 70 seria implementada da seguinte forma:


int m[4][4];
int a, b;

m[1][2]=5; m[a][b]=8;
m[2][1]=6; m[a][b-2]=9;
m[0][1]=7; m[a-2][b-2]=10;
a=3; m[b][a]=11;
b=2; m[b-2][a]=12;

hora de programar um pouco.

Exemplo 2: Loteria esportiva - jogo mais marcado


Espero que este exemplo te ajude a ganhar na loteria!
A Loteca um tipo de loteria existente no Brasil que baseada nos resulta-
dos de jogos de futebol. A aposta consiste em adivinhar o ganhador (ou empate)
de 14 jogos do campeonato. Por exemplo, no jogo entre Palmeiras e Flamengo,
o apostador deve adivinhar se o Palmeiras que ser o vencedor, ou o Flamengo,
ou ir empatar.
Na figura 5.13 temos um diagrama representando um carto de aposta da
Loteca (da Caixa Econmica Federal) na parte esquerda. Note que existem 3
quadrados que devem ser pintados para indicar a aposta. Na parte central foi
feito um exemplo do que seria um carto de apostas com os jogos e a correspon-
dncia dos espaos para preenchimento. Mais direita representamos nossa
abstrao do problema: uma matriz com 14 linhas e 3 colunas onde poderemos

164 captulo 5
anotar os resultados nesta estrutura de dados. Chamaremos a matriz de loteria.
Ainda, possvel marcar em um mesmo jogo:
Uma vitria
Um empate
Uma vitria E um empate (chamado de duplo)
As trs colunas, chamado de triplo.

Observao: No carto real da Loteca, existem outras colunas como mostra-


do na Figura 66 (Colunas D e T). Para simplificar no vamos us-las.

Jg Coluna 1 Ept Coluna 2 Loteria


1 Santos Corinthians
2 Flamengo Fluminense
3 Palmeiras So Paulo
4 Vasco Botafogo
5 Portuguesa XV de Ja
6 So Caetano XV de Piracicaba
7 Grmio Internacional
8 Hava Figueirense
9 Coritiba Atltico-PR
10 Paysand Juventude
11 Atltico-MG Cruzeiro
12 Brasiliense Ponte Preta
13 Fortaleza Gois
14 Esportivo Londrina

Figura 5.13 Loteca da Caixa Economica Federal.

O objetivo deste exemplo identificar o jogo mais marcado, ou seja, o pro-


grama vai procurar jogo por jogo (linha por linha) e verificar qual aquele que
tem mais marcaes (veja a figura 5.14).

Loteria
Jogo 1 x Vitria time 1
Jogo 2 x x Duplo: Empate ou Vitria time 2
Jogo 3 x x x Triplo: Vitria time 1 ou Empate ou Vitria time 2 Mais marcado
... ... ... ...
Jogo 14 x Empate

Figura 5.14

Portanto, da mesma forma que percorremos os vetores, temos que percor-


rer a matriz para poder procurar o jogo mais marcado. Isto feito linha a linha,
coluna por coluna, ou seja, fixa-se a linha e varre-se a coluna para somar as
marcaes.

captulo 5 165
Vamos ao cdigo. Iniciamos pela criao das variveis:

Uma varivel para a matriz, chamada loteria com 14 linhas e 3 colunas


2 contadores, chamados i e j para percorrer as linhas e colunas
respectivamente
3 variveis para acumular as contagens e tarefas auxiliares maisMarca-
do (maior nmero de marcaes encontrado), nJogo (nmero do jogo com
mais marcaes) e marLin (nmero de marcaes numa linha). Lembre-se do
CamelCase.

1 #include <stdio.h>
2
3 int main() {
4 char loteria[14][3];
5 int i,
6 j,
7 maisMar=0,
8 nJogo,
9 marLin;

Agora temos um problema: como vamos fazer para ler os jogos? Ou seja,
para o programa funcionar, temos que ter a matriz preenchida ento sendo as-
sim temos uma deciso a tomar: ou pedimos para o usurio informar os da-
dos para preenchermos a matriz pelo programa ou partimos de uma matriz j
preenchida.
Vamos optar neste exemplo pelo mais simples: matriz preenchida. E vamos
supor que o preenchimento ser conforme a figura 5.15 (a seta aponta para o
jogo mais marcado). O cdigo direita mostra o preenchimento da matriz em C.

166 captulo 5
0 1 2
Jogo 1 0 x
Jogo 2 1 x
Jogo 3 2 x x
Jogo 4 3 x
Jogo 5 4 x
Jogo 6 5 x
Jogo 7 6 x
Jogo 8 7 x
Jogo 9 8 x
Jogo 10 9 x x x
Jogo 11 10 x x
Jogo 12 11 x
Jogo 13 12 x
Jogo 14 13 x x

Figura 5.15 Exemplo de preenchimento

11 loteria[0][0]='x';
12 loteria[1][1]='x';
13 loteria[2][1]='x';
14 loteria[2][2]='x';
15 loteria[3][1]='x';
16 loteria[4][0]='x';
17 loteria[5][1]='x';
18 loteria[6][2]='x';
19 loteria[7][1]='x';
20 loteria[8][0]='x';
21 loteria[9][0]='x';
22 loteria[9][1]='x';
23 loteria[9][2]='x';
24 loteria[10][0]='x';
25 loteria[10][1]='x';
26 loteria[11][1]='x';
27 loteria[12][2]='x';
28 loteria[13][0]='x';
29 loteria[13][1]='x';

captulo 5 167
Variveis criadas, matriz preenchida, vamos prosseguir com o processa-
mento dos dados. Vamos criar o looping externo para percorrer as linhas em
primeiro lugar (linha 31 linha 42) e o looping interno (linhas 33 41) para
percorrer as colunas e acumular a contagem quando o contedo da coluna for
igual a x:
31 for (i=0;i<14;i++){
32 marLin = 0;
33 for(j=0;j<3;j++){
34 if (loteria[i][j]=='x'){
35 marLin++;
36 }
37 }
38 if (marLin>maisMar){
39 maisMar = marLin;
40 nJogo=i;
41 }
42 }

uma boa ideia usar o depurador do DevC++ para executar o programa passo a passo
e verificar como os loopings e variveis se comportam durante o processamento do
programa.

O cdigo final do programa est mostrado na Listagem 13. Em seguida mos-


tramos a execuo do programa.
1 include <stdio.h>
2
3 int main() {
4 char loteria[14][3];
5 int i,j,maisMarcado=0,nJogo,marLin;
6
7 loteria[0][0]='x';
8 loteria[1][1]='x';
9 loteria[2][1]='x';
10 loteria[2][2]='x';

168 captulo 5
11 loteria[3][1]='x';
12 loteria[4][0]='x';
13 loteria[5][1]='x';
14 loteria[6][2]='x';
15 loteria[7][1]='x';
16 loteria[8][0]='x';
17 loteria[9][0]='x';
18 loteria[9][1]='x';
19 loteria[9][2]='x';
20 loteria[10][0]='x';
21 loteria[10][1]='x';
22 loteria[11][1]='x';
23 loteria[12][2]='x';
24 loteria[13][0]='x';
25 loteria[13][1]='x';
26
27 for (i=0; i<14; i++){
28 marLin = 70;
29 for(j=0;j<3;j++){
30 if (loteria[i][j]=='x'){
31 marLin++;
32 }
33 }
34 if (marLin>maisMarcado){
35 maisMarcado = marLin;
36 nJogo=i;
37 }
38 }
39 marcado:<<nJogo<<,com<<maisMarcado;
40 return 0;
41 }
Listagem 3

captulo 5 169
Exemplo 3: Loteria esportiva coluna mais marcada
Neste exemplo vamos usar a loteria esportiva do exemplo anterior como
base para poder descobrir qual a coluna mais marcada: se a coluna 1, a coluna
dos empates ou a coluna 2.
Desta vez, precisamos descobrir quantas marcaes existem em cada co-
luna e verificar qual dos trs valores o maior. Portanto, uma inverso do
modo de percorrer a matriz em relao ao exemplo anterior: verificamos todas
as linhas primeiro e depois as colunas, ou seja, fixamos a coluna e variamos as
linhas.
O programa e o modo de resoluo muito parecido com o exemplo ante-
rior com apenas algumas modificaes simples. O que muda essencialmente
so os algoritmos de repetio para tratar as colunas e linhas.
A figura 5.16 mostra a matriz que iremos considerar neste exemplo. Na ver-
dade, a mesma matriz do exemplo anterior, porm a figura mostra a coluna
que contm o maior nmero de marcaes.
Neste exemplo, iremos substituir as variveis nlogo e marLin pelas vari-
veis nColuna (para guardar o nmero da coluna com mais marcaes) e marCol
(para guardar o nmero de marcaes numa coluna).
Como j detalhamos o primeiro exemplo de matrizes, vamos apresentar di-
retamente o cdigo final neste exemplo. Perceba as diferenas e semelhanas
entre eles.

170 captulo 5
0 1 2
Jogo 1 0 x
Jogo 2 1 x
Jogo 3 2 x x
Jogo 4 3 x
Jogo 5 4 x
Jogo 6 5 x
Jogo 7 6 x
Jogo 8 7 x
Jogo 9 8 x
Jogo 10 9 x x x
Jogo 11 10 x x
Jogo 12 11 x
Jogo 13 12 x
Jogo 14 13 x x

Coluna mais marcada

Figura 5.16

1 #include <stdio.h>
2
3 int main() {
4 char loteria[14][3];
5 int i,j,maisMar=0,nColuna,marCol;
6
7 loteria[0][0]='x';
8 loteria[1][1]='x';
9 loteria[2][1]='x';
10 loteria[2][2]='x';
11 loteria[3][1]='x';
12 loteria[4][0]='x';
13 loteria[5][1]='x';
14 loteria[6][2]='x';
15 loteria[7][1]='x';
16 loteria[8][0]='x';
17 loteria[9][0]='x';
18 loteria[9][1]='x';
19 loteria[9][2]='x';

captulo 5 171
20 loteria[10][0]='x';
21 loteria[10][1]='x';
22 loteria[11][1]='x';
23 loteria[12][2]='x';
24 loteria[13][0]='x';
25 loteria[13][1]='x';
26
27 for (j=0; j<3; j++){
28 marCol = 0;
29 for(i=0;i<14;i++){
30 if (loteria[i][j]=='x'){
31 marCol++;
32 }
33 }
34 if (marCol>maisMar){
35 maisMar = marCol;
36 nColuna = j;
37 }
38 }
39 cout<<"Coluna mais marcada: "<<nColuna<<endl;
40 cout<<"Numero de marcacoes: <<maisMar<<endl;
41 return 0;
42 }

172 captulo 5
5.3 mdulos: funes
No exemplo da loteria tivemos que escolher entre trabalhar com uma matriz j
pr-preenchida ou ler os dados a partir de entradas do usurio. Se a opo fosse
por ler os dados do usurio, o programa ficaria maior e mais difcil de ser lido.
Alm disso, o programa ficaria mais interessante se pudssemos imprimir
na tela a matriz preenchida, como se fosse um carto preenchido da vida real,
no ?
E se esses processamentos mencionados pudessem ficar em outro arquivo
separado ou at mesmo em outra parte do programa? Ficaria mais organizado
no ?
Situaes como essa ocorrem na maioria dos programas. Conforme os pro-
blemas ficam mais complexos e mostram maior variedade de situaes, temos
que resolver diversos pequenos problemas cujas solues comporo o conjun-
to de respostas finais.
Muitas vezes, essa grande quantidade de pequenos problemas pode afetar
a legibilidade e clareza do programa, fazendo com que uma consulta ou manu-
teno futura dessa lgica seja uma atividade difcil de ser feita. Usamos ento
uma estrutura chamada mdulo, que responsvel por evitar essa confuso
da lgica.
Ou seja, modularizar significa quebrar o problema em partes menores as
quais sero responsveis pela realizao de uma etapa do problema.
Em C os mdulos so chamados de funes. As funes formam uma das
mais importantes partes da linguagem C++.
A forma geral de uma funo em C/C++ :
Tipo_da_funo nome_da_funo(lista_de_parmetros){
Corpo da funo
}

Tipo da funo: configura um valor que a funo retornar quando termi-


nar. O valor enviado ao mdulo que chamou a funo. Caso o tipo da funo
no seja especificado, o compilador assumir que o tipo retornado int.
Lista de parmetros: a relao de variveis e seus tipos.

captulo 5 173
Veja o exemplo de uma funo bem simples. A figura 5.18 mostra um pro-
grama com uma funo chamada quadrado sendo usada. A funo tem o obje-
tivo de receber um nmero e elev-lo ao quadrado. A figura tambm mostra a
tela de sada do programa.
1 #include <iostream>
2 using namespace std;
3 cout<<x<<quadrado(x);
4 int quadrado(int n);
5
6 int main(int argc, char** argv) {
7 int x=10;
8 cout<<x<<quadrado(x);
9 return 0;
10 } int quadradi(int n){
11 int ret;
12 int quadrado(int n){ ret = n*n;
13 int ret; return ret;
14 ret = n*n; }
15 return ret;
16 }

Figura 5.18

Vamos estudar o que est ocorrendo no programa da figura 5.18.


Como sabemos, o objetivo do programa calcular o quadrado de um nme-
ro informado pelo prprio programa. O programa principal comea na linha 5
e na linha 6 temos a declarao e a atribuio de um valor para a varivel x.
Na linha 8 temos o comando de impresso na tela usual, porm veja que
ele vai imprimir o valor x, seguido de um comando chamado quadrado(x). Por
mais que seja bvio que quadrado(x) v calcular o quadrado de x, quadrado no
um comando conhecido pelo compilador. uma funo que foi definida pelo
programador.
A definio da funo est entre as linhas 11 e 14. Veja que um subpro-
grama. A funo recebe do programa principal um valor que ser copiado para
a varivel n (veja a figura). A varivel n ser modificada dentro do subprograma
e devolvido para o programa principal na linha 13. A palavra-chave return faz
com que o valor da varivel seja atribudo a quem chamou a funo. Porm para

174 captulo 5
tudo isso funcionar, o prottipo da funo precisa ser declarado e isto feito na
linha 3 do programa.
Toda funo que for usada no programa tem que ser prototipada inicialmen-
te seno o compilador no ir reconhec-la ao compilar o resto do programa.
Vamos analisar outros exemplos.

Exemplo 4
Vamos fazer uma funo para verificar se um determinado nmero primo.
Um nmero primo quando possui somente dois divisores diferentes: o 1 e ele
mesmo. Antes de mais nada, precisamos saber como verificar se um nmero
primo em C++.
Observe o programa abaixo, suponha que estamos verificando se a varivel
num um nmero primo:
23 for(int i = 2; i<=(num/2); i++){
24 if(num%i==0){
25 return false; //no primo
26 }
27 }
28 return true; // primo

Este subprograma poderia ser chamado pelo programa principal toda vez
que fosse necessrio calcular um nmero primo. Observe que o subprograma
fica genrico. Qualquer nmero que desejarmos verificar se primo basta subs-
tituir o valor do nmero pela varivel num do subprograma acima.
Vamos chamar este subprograma de primo (bem original !), e para ele fun-
cionar necessrio receber do chamador um valor inteiro que chamaremos
num. O cdigo ficar assim:
22 bool primo(int num){
23 for(int i = 2; i<=(num/2); i++){
24 if(num%i==0){
25 return false;
26 }
27 }
28 return true;
29 }

captulo 5 175
Observe que o resultado desta funo um valor booleano. A funo retorna
se o valor num (true) ou no (false) um nmero primo.
Vamos inserir esta funo em um programa. Veja a linha 13:
1 #include <cstdlib>
2 #include <iostream>
3
4 using namespace std;
5
6 bool primo(int);
7
8 int main(int argc, char *argv[]){
9 int numero;
10 cout << "Digite um valor inteiro: ";
11 cin >> numero;
12
13 if(primo(numero)){
14 cout << "O numero informado e primo\n" << endl;
15 }
16 else{
17 cout << "O numero informado NAO e primo\n" << endl;
18 }
19 return 0;
20 }
21
22 bool primo(int num){
23 for(int i = 2; i<=(num/2); i++){
24 if(num%i==0){
25 return false;
26 }
27 }
28 return true;
29 }
Listagem 4

Observando o programa podemos perceber que existe um caminho de exe-


cuo o qual desviado para a funo e depois retorna para o programa princi-
pal. A figura 5.19 mostra esse fluxo.

176 captulo 5
Pensando na execuo do programa pelo computador, o processador para
de executar o programa principal, guarda o estado do programa principal em
uma rea da memria reservada para isso e chama a funo. A funo ento
executada e depois que termina volta para o programa principal.
Podem existir vrias funes em um programa. Os exemplos que estamos
usando apresentam apenas uma funo por programa, mas muito comum
que em um programa tenha dezenas, centenas de funes.

Programa principal Funo

Comando Comando

Comando Comando

Funo Comando

Comando

Comando

Comando

Figura 5.19

5.3.1 Argumentos de funes

Quando uma funo usa argumentos, ela deve declarar as variveis que
vo aceitar os valores dos argumentos. Estas variveis so chamadas de par-
metros formais. Elas so como qualquer outra varivel do programa, porm s
existem dentro da funo, o programa que as chamou no tem conhecimen-
to sobre elas. Este conhecimento sobre as variveis chamado de escopo de
variveis.
No exemplo do nmero primo anterior temos um caso de apenas um par-
metro: int num. Uma funo pode ter mais de um parmetro. importante que
os argumentos usados para chamar uma funo tenham os mesmos tipos dos
seus parmetros caso contrrio, o compilador gerar um erro e o programa no
ser compilado.

captulo 5 177
5.3.2 Escopo de variveis

As variveis podem ser declaradas de algumas maneiras diferentes: dentro


de uma funo, fora de uma funo, e como parmetro de uma funo. Essas
3 maneiras de declarao definem trs tipos de escopo de variveis: locais, glo-
bais ou parmetros formais.

5.3.2.1 Variveis Globais

As variveis globais so visveis durante toda a execuo do programa e po-


dem ser usadas por qualquer funo. Elas so declaradas fora de qualquer fun-
o, inclusive do main(), e no incio de um programa.

5.3.2.2 Variveis Locais


A varivel local s visvel e existente dentro da funo ou bloco que a decla-
rou. Outras funes no a reconhecem e s pode ser usada dentro do bloco no
qual est declarada. Uma varivel local criada quando a funo comea a ser
executada e removida no final da execuo da funo.

5.3.2.3 Parmetros Formais


Embora j citados anteriormente, os parmetros formais so variveis lo-
cais em uma funo que so inicializadas no momento da chamada desta fun-
o e s existem dentro da funo onde foram declarados. Mesmo sendo usa-
das como inicializao da funo, elas podem ser usadas como qualquer outra
varivel local dentro do bloco de funo onde esto.

5.3.3 Chamada por valor e chamada por referncia

Existem duas formas basicamente para se passar argumentos para uma


funo. Por meio de uma chamada por valor ou por meio de uma chamada por
referncia.
A chamada por valor quando feita uma cpia do valor de um argumento
no parmetro formal da funo. Desta forma, as alteraes feitas nos parme-
tros dentro do subprograma no tero nenhum efeito nas variveis usados para
cham-lo.

178 captulo 5
A chamada por referncia diferente. Neste caso, o endereo de memria
de um argumento copiado no parmetro. Neste caso, todas as alteraes que
so feitas no parmetro afetaro a varivel que foi usada para chamar o subpro-
grama, pois dentro da funo o endereo de memria ser usado para acessar
o argumento real usado na chamada. A chamada por referncia feita usando
um tipo de varivel especial chamada ponteiro.
A chamada por valor est exemplificada na Figura 75 (programa do qua-
drado). Naquele caso, o valor do argumento (10) copiado no parmetro n.
Quando ocorre a atribuio n=n*n, apenas a varivel local n modificada. A
varivel x, que foi usada para chamar a funo quadrado() permanecer com o
valor 10. Lembre-se que uma cpia do valor do argumento que passada para
a funo. O que ocorre l dentro da funo, fica l dentro.

5.3.4 Chamadas por referncia

Na passagem de parmetros, o padro da linguagem C++ por valor, mas


em algumas situaes preciso fazer uma passagem por referncia passando
um ponteiro para o argumento.

Lidar com ponteiros e saber us-los corretamente no uma tarefa fcil. No nosso
contexto estudar os ponteiros aqui, porm saiba que ponteiro um tipo especial de
varivel que armazena endereos de memria. Um ponteiro pode ter o valor NULL
quando no aponta para nada (nenhum endereo) ou outro valor. Quando um ponteiro
tem um valor diferente de NULL, ento *p o valor do endereo apontado por p. Por
exemplo se x uma varivel e p igual a &i ento *p=i.

90533 -10 -10


8164 90553 p
Um ponteiro p, armazenado no Representao esquemtica da situao
endereo 8164, contm o endereo
de um inteiro
int main () {
int num = -10;
int *p;
Como fazemos para obter o endereo de memria
p = &num;
return 0; correspondente ao dado armazenado em uma varivel?
} Usamos o operador address-of (&).

captulo 5 179
Observe o programa da Listagem 5. Temos um exemplo de passagem por
referncia. A funo troca() tem como objetivo receber dois parmetros, x e y, e
trocar os seus valores. At a tudo bem, o detalhe que o que for feito dentro da
funo, alterar os valores das variveis a e b que foram usadas para chamar a
funo. Rode este programa no Depurador para voc ver como isso ocorre.
Na linha 17, salvo o valor no endereo x. Na linha 18, o valor de y colocado
em x. E na linha 19 feita a troca: o x colocado em y. Na chamada da funo, na
linha 10, os endereos de a e b so passados como argumentos.
1 #include <iostream>
2
3 void troca(int *x, int *y);
4
5 int main(int argc, char** argv) {
6 int a, b;
7
8 a=10;
9 b=20;
10 troca(&a,&b);
11 return 0;
12 }
13
14 void troca(int *x, int *y){
15 int temp;
16
17 temp=*x;
18 *x=*y;
19 *y=temp;
20 }
Listagem 5 Chamada por referncia

A passagem por referncia tambm til quando uma matriz usada como
argumento para uma funo. Neste caso, apenas o endereo da matriz passa-
da e no uma cpia da matriz inteira.
1 #include <iostream>
2 #include<cstdlib>
3

180 captulo 5
4 void mostra(int num[10]);
5
6 using namespace std;
7
8 int main(int argc, char** argv) {
9 int a[10], i;
10
11 for(i=0;i<10;i++)
12 a[i]=i;
13 mostra(a);
14 return 0;
15 }
16
17 void mostra(int num[10]){
18 int i;
19
20 for(i=0;i<10;i++)
21 std::cout<<num[i]<<endl;
22 }

5.3.5 argc e argv

Voc deve ter notado que o programa principal que sempre usamos nos
exemplos tem a mesma sintaxe de uma funo. E na verdade uma funo!
Sendo assim, todo programa em C++ pode receber parmetros e retornar valor
para quem o chamou.

captulo 5 181
Mas, como fazer isso?
Lembre-se que o processo de compilao completo consiste em transfor-
mar um arquivo texto em um arquivo executvel. Quando criamos um proje-
to no DevC++, chamado contagemregressiva.cpp, e a compilao realizada
com sucesso, teremos um arquivo executvel chamado contagemregresiva.exe.
Sendo assim, poderemos na linha de comando chamar o programa assim:

Neste caso, o valor 20 ser passado para o parmetro argv da funo main.
Se fosse necessrio passar outros valores, eles devem ser separados por um es-
pao (porm isto pode variar de acordo com o compilador ou sistema operacio-
nal, mas no Windows com espao).
O parmetro argc contm o nmero de argumentos da linha de comando e
um inteiro. Sempre ser no mnimo 1 porque o prprio nome do programa j
considerado o primeiro argumento.
O parmetro argv um ponteiro para uma matriz de ponteiros para caracte-
re. Cada componente desta matriz aponta para argumento da linha de coman-
do, e lembre-se que todos os elementos da linha de comando so string e se
houver algum nmero que ser usado dentro do main, ele dever ser convertido
para o tipo adequado.
Vamos estudar o programa da Listagem 6. Voc vai ver que vamos usar v-
rias funes de bibliotecas (strcmp(), exit(), atoi() )da linguagem C++ para nos
ajudar com o cdigo. Para saber mais sobre estas e outras funes preciso
estudar a documentao da linguagem.

Voc pode encontrar as bibliotecas mais usadas em C++, suas especificaes e for-
mas de uso em: http://goo.gl/HQn2fq

182 captulo 5
1 #include <iostream>
2 #include <cstdlib>
3 #include <stdio.h>
4 #include <string.h>
5 using namespace std;
6
7 int main(int argc, char** argv) {
8 int contador;
9 bool mostra;
10
11 if(argc<2){
12 std::cout<<"Voce deve digitar o valor a contar na linha de
comando. Tente de novo"<<endl;
13 exit(1);
14 }
15
16 if (argc==3 && !strcmp(argv[2],"mostra"))
17 mostra=true;
18 else
19 mostra=false;
20
21 for(contador=atoi(argv[1]); contador;--contador){
22 if(mostra)
23 std::cout<<contador<<endl;
24 }
25 std::cout<<"FIM!"<<endl;
26 return 0;
27 }
Listagem 6

As linhas de 1 a 5 inserem as bibliotecas mencionadas na compilao do


programa. Funes e comandos como strcmp(), atoi() no fazem parte da bi-
blioteca iostream que sempre usamos e para poder us-los precisamos das bi-
bliotecas auxiliares.
O programa comea na linha 7 e em seguida temos a declarao de variveis.

captulo 5 183
Na linha 11 at a linha 14 feita uma verificao para checar se a contagem
de parmetros na linha de comando menor que 2. Se for, significa que o usu-
rio cometeu algum erro ao chamar o programa e uma mensagem de alerta
mostrada para ele. A linha 13 usa a funo exit() com o argumento 1 para sair do
programa e no gerar nenhuma mensagem de erro (cada valor de argumento
na funo exit() gera um comportamento diferente).
A execuo do programa precisa estar na seguinte forma na linha de
comando:

se o programa no for chamado desta forma, inclusive com a palavra mos-


tra, ele no ser executado corretamente. Esta checagem feita nas linhas 16
a 19. O if testa se a quantidade de argumentos igual a 3 e se o terceiro argu-
mento na chamada a palavra mostra. Se for, a varivel mostra recebe o valor
true, caso contrrio, recebe false. Se for false, o programa encerrar nas linhas
25 e 26.
As linhas 21 a 24 se encarregam de fazer o looping. Observe o uso da funo
atoi(). Neste caso ela recebe o valor do segundo argumento da linha de coman-
do (lembre-se que os argumentos so passados para o main em um array de
caracteres e sendo assim o primeiro argumento o nome do programa (ndice
0 do vetor) e o prximo, no ndice 1, ser o segundo argumento) e converte o
valor para um nmero inteiro, que ser usado no for e servir como incio da
contagem regressiva. Observe na figura 5.20 o que ocorre com outras formas
de executar o programa.
Para finalizar, no obrigatrio usar os nomes argc e argv em seus progra-
mas. Eles so usados assim por questes tradicionais. Porm eles podem sofrer

184 captulo 5
variaes em alguns compiladores e inclusive ter outros argumentos para o
main mas, neste caso, bom consultar o manual do usurio do compilador.

AGORA SIM!

Figura 5.20

5.3.6 O return e retornos de funes

Na programao em geral, quando tratamos de mdulos podemos tratar de


duas formas: funes, que estamos vendo neste captulo e procedimentos, que
tambm uma funo, mas no retorna valor algum para o chamador.
Quando h retorno da funo, usamos a palavra-chave return, que pode ter
duas funes: sair de uma funo foradamente ou pode ser usado para retor-
nar um valor para o programa chamador.
Observe os cdigos que usamos por todo este livro. Observe que todas as
funes main() dos nossos programas tem a seguinte forma: int main(...).
Como estudamos, o tipo int antes da palavra main significa que h um retorno.
E por isso que usamos return 0 no final dos nossos cdigos.
E quando no necessrio fazer um retorno na funo (procedimento)?
Usamos a palavra-chave void. Podemos inclusive us-la no programa main da
seguinte forma: void main(void) e desta forma o programa principal no ter
retorno nem poder receber nenhum argumento, como o argc e argv.

captulo 5 185
5.4 Fim do incio
Procuramos escrever aqui o que necessrio para voc comear a apren-
der a programar. A linguagem C++ muito legal e muito usada mundialmente.
Porm o que temos aqui o fim de um incio de outros estudos que apronduro
seus conhecimentos e agora com voc.

LEITURA
Voc pode aprofundar os seus conhecimentos em C++ de uma maneira muito variada. Na
internet existem dezenas de exemplos, tutorias, guias e demais formas de aprender progra-
mao. Alm disso, o YouTube tambm possui vdeo aulas e cursos que voc pode assistir.
Algumas faculdades internacionais e sites oferecem cursos gratuitos de linguagem C++
inclusive com emisso de certificado. Faa uma pesquisa na internet sobre isso. So cursos
acessveis e relativamente fceis de serem seguidos.
Sobre livros, existem vrios tambm. Sugerimos alguns ao longo dos captulos. Procure
tambm livros no formato eletrnico. Como a linguagem C++ muito popular, voc encon-
trar com facilidade.
E bons estudos!

REFLEXO
O uso de funes um grande desafio. No no sentido tcnico, isto relativamente fcil, pois
estudando se aprende, mas no sentido de arquitetura de software. Modularizar programas
significa criar mini-programas que podem ser aproveitados em outras situaes e economi-
zar tempo e dinheiro em uma equipe de desenvolvimento. O bom arquiteto de software vai
procurar por novas formas e modelos de tornar o desenvolvimento produtivo e prtico para
sua equipe.
Neste captulo vimos a ltima estrutura de controle de fluxo para a programao. Com
estes elementos j possvel programar em muitas linguagens de programao.

186 captulo 5
REFERNCIAS BIBLIOGRFICAS
ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos de programao de computadores. So
Paulo: Pearson Education, 2008.
DASGUPTA, S.; PAPADIMITRIOU, C.; VAZIRANI, U. Algoritmos. So Paulo: McGraw Hill, 2009.
FEOFILOFF, P. Algoritmos em linguagem C. Rio de Janeiro: Campus, 2008.
FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lgica de programao: a construo de algoritmos e
estruturas de dados. So Paulo: Makron Books, 1993.
MANZANO, J. A. N. G.; OLIVEIRA, J. F. D. Algoritmos: lgica para desenvolvimento de programao.
9. ed. So Paulo: rica, 1996.
PUGA, S.; RISSETTI, G. Lgica de programao e estrutura de dados. So Paulo: Pearson
Education, 2003.

Apndice: o Devc++

Vamos comear nossas atividades por meio de um exemplo. Vamos criar um


programa para calcular a mdia de quatro notas bimestrais de um aluno.
Portanto, antes de partirmos para o cdigo, vamos estudar o que foi pedido.
Basicamente temos que entender quais so as entradas, o que ser processado
e a sada do programa.
Quais so as entradas do programa? Bem, para o computador escrever o seu
nome, ele deve ser informado sobre o seu nome antes de qualquer coisa, por-
tanto bom criar uma varivel para armazenar isso.
Antes de comearmos a programar, vamos conhecer o nosso ambiente e fer-
ramenta de trabalho, o DevC++.

O DevC++ pode ser encontrado facilmente na internet. O link principal para baixa-lo :
http://goo.gl/5mlHNc

captulo 5 187
O DevC++ um software gratuito especfico para o desenvolvimento de apli-
caes na linguagem C ou C++. Ele muito utilizado para o aprendizado devido
sua simplicidade e praticidade nas tarefas bsicas de desenvolvimento.
O DevC++ faz parte de uma categoria de softwares chamados IDEs (Integrated
Development Environment Ambiente de desenvolvimento integrado).
Um cdigo fonte em C ou C++ pode ser feito no mais simples editor de texto
que voc possuir. Porm para compilar um programa em C e depois gerar o seu
executvel so necessrios outros programas para estas tarefas e caber ao usu-
rio a tarefa de salvar o cdigo fonte, fazer a compilao e depois a linkedio,
manualmente e isso pode gerar alguns erros e at mesmo falhas de procedi-
mento, alm de ser feito basicamente em linha de comando.
Uma IDE um programa que faz estas tarefas para o usurio. Alm disso, a
IDE possui outras ferramentas que podem ajudar o programador a criar o cdi-
go, depurar o cdigo, criar verses dos programas e outras.
Para ter uma ideia de como desenvolver com um editor simples e com uma
ideia, faa um teste. No Windows, crie um cdigo simples na linguagem C e de-
pois abra um prompt de comandos do DOS para compilar o programa e gerar o
executvel. Depois faa a mesma experincia usando o DevC++. S o fato de edi-
tar o texto voc ver que diferente pois as palavras chave ficam em uma cor, as
strings em outra, as constantes em outra e etc. Desta forma, visualmente o pro-
gramador fica mais a vontade com o cdigo e mais confortvel com o ambiente.
A figura A1 mostra a tela principal do Dev C++.
Na figura percebe-se que existe uma aba chamada Projeto e este um termo
que encontrado em praticamente todas as IDEs existentes, independente da
linguagem.
Um projeto uma forma de organizar um conjunto de arquivos os quais fu-
turamente daro origem a uma aplicao. At agora vimos somente arquivos.
cpp que so os cdigos fonte na linguagem C++ que digitamos.
Um programa em C++ de grande escala no possui somente cdigos-fonte.
Alis, nem cdigo-fonte uma aplicao final possuir, ela vai possuir apenas os
executveis e outros arquivos como imagens em formato jpg, png, bmp, cones
com formato .gif, .ico, bibliotecas como as dlls, .lib e vrios outros arquivos.
Por exemplo, vamos supor que voc est desenvolvendo uma apli-
cao grfica, como se fosse o Paint do Windows. Neste programa

188 captulo 5
possvel desenhar figuras geomtricas e preenche-las com uma determinada
cor. Matematicamente falando isso significa calcular a rea da figura e preen-
cher esta rea com a cor desejada.
Sendo assim, no mais inteligente criar um programa que armazena as
frmulas matemticas do clculo da rea do crculo, do retngulo, etc, e dei-
xar este programa disponvel para qualquer outro que precise destas frmulas,
como se fosse uma biblioteca? Portanto, essa uma das grandes vantagens de
se utilizar uma IDE!

Figura A1 Tela inicial do DevC++

A instalao do DevC++ muito fcil e tradicional. o famoso next-next-


next-finish. Aps a instalao, precisamos ter uma pequena noo do progra-
ma para comear a escrever os nossos cdigos.
Clique em Arquivo, depois em Novo e Projeto. Ir aparecer a tela da
figura A2.

captulo 5 189
Figura A2 Tela de criao de um novo projeto

A tela da figura A2 permite que o usurio escolha vrios tipos de projetos:


Windows Application: Este tipo de aplicao usa o Windows e seu sistema
de janelas como plataforma de execuo. Neste caso, a IDE preparada e confi-
gurada para receber programas e mdulos especficos para usar a biblioteca de
interface grfica. Normalmente usada para projetos na linguagem C++.
Console Application: Como o nome sugere, este tipo de aplicao de-
senvolvida para rodar no prompt do DOS, quando o sistema operacional for
Windows. Na verdade, uma aplicao para console rodar em um terminal so-
mente texto e neste caso, possvel desenvolver programas para outros siste-
mas operacionais diferentes do Windows.
Static library: neste tipo de projeto possvel desenvolver bibliotecas para
serem usadas posteriormente em outros programas. Uma biblioteca, como j
vimos pode ser um conjunto de rotinas, funes externas, definies de cons-
tantes e variveis que so usadas na compilao de outros programas.
DLL (Dynamic Linked Library): uma DLL a implementao da Microsoft
das Static Library citada no item anterior.
Empty Project: neste caso, criado um projeto vazio, sem nenhum tipo de
arquivo ou estrutura previamente criada.
Alm disso, a tela da figura A2 permite que o usurio escolha entre criar um
projeto na linguagem C ou na linguagem C++. O checkbox para Linguagem
Padro serve para indicar se o projeto ser criado no padro ANSI (veremos
isso posteriormente, por hora, pode deixar desmarcado).
Estas opes esto na aba Basic. Perceba que ainda temos as abas
Multimedia, Win3 e Consol. Cada uma dessas abas guarda tipos de projetos
agrupados.

190 captulo 5
No nosso caso, vamos criar uma aplicao para console e na linguagem C++.
Aps colocar um nome, clique no boto Ok para criar o projeto. Em seguida ir
aparecer uma tela com a localizao da criao do arquivo de projeto (o projeto
possui a extenso .dev). Escolha um local de sua preferncia e salve o projeto.

Dica: interessante que voc crie uma pasta para os seus projetos. Embora o DevC++
use uma pasta padro, ter uma pasta especfica para os projetos que voc desenvolve
faz com que um backup seja providenciado futuramente para esta pasta. Ter uma pasta
para os projetos e organiza-los uma boa prtica de programao.

A tela da figura A3 mostra a configurao do DevC++ aps a criao do proje-


to. O projeto possui o nome LogicaDeProgramacao e ao ser criado, o DevC++
j cria um arquivo chamado main.cpp o qual podemos comear a escrever o
nosso cdigo.
D uma olhada geral na IDE. Veja que temos vrias opes para gerenciar
nossos programas. Falando nisso, veja que o cdigo fonte que j foi criado est
colorido, com cada tipo de elemento possuindo uma cor diferente.
Por enquanto, nosso projeto s tem 1 componente: o arquivo main.c. No
faz parte do nosso escopo criar projetos muito grande portanto, quando formos
testar algum cdigo, este procedimento pode ser usado para nossos propsitos.

Figura A3 Projeto criado

191
captulo 5
Iremos usar a linguagem C++ neste aprendizado. A linguagem C++ foi
criada em 1983 por Bjarne Stroustrup nos laboratrios da Bell Labs (famosa
empresa de telecomunicaes dos EUA). Ela foi criada para implementar uma
verso distribuda do ncleo do sistema operacional UNIX.
A linguagem C++ muito popular e muito utilizada. Qualquer platafor-
ma operacional atual possui compiladores para a linguagem. uma linguagem
que permite fcil acesso memria do computador e possui facilidades para
trabalhar com hardware, alm de ser orientada a objetos.

Existe uma plataforma de cdigo aberto para desenvolvimento de componentes ele-


trnicos muito popular chamada Arduino. Ela tem o propsito de ser acessvel para
qualquer pessoa poder criar os seus componentes. Alm da parte eletrnica, o usurio
precisa usar uma linguagem de programao para codificar os programas e normal-
mente a linguagem C ou C++ usada para isso.

Assista este vdeo a respeito de uma breve histria do C++. Trata-se de uma palestra
proferida pelo Bjarne Stroustrup. Est em ingls mas com ateno bem compreens-
vel. https://www.youtube.com/watch?v=86xWVb4XIyE

192 captulo 5