Buscar

Aprendendo Lógica com a Linguagem

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 91 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 91 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 91 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Material de Apoio às aulas de “Linguagem de Programação 1”
Aprendendo Lógica com a Linguagem
de Programação C++
Prof. MSc. Claudia Akemi Izeki
Bacharelado em Ciência da Computação
26 de Fevereiro de 2007
Sumário
1 Introdução à Linguagem C++ 1
1.1 Lógica de Programação, Algoritmo, Linguagem de programação e Compilador . . . . 1
1.1.1 Lógica de Programação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2 Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.3 Linguagem de programação e Compilador . . . . . . . . . . . . . . . . . . . . 2
1.2 Ambiente de programação Borland C++ 3.1 . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Estrutura básica de um programa em C++ . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Primeiro programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5 Instruções de programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.6 Comandos iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6.1 cout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6.2 cin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6.3 clrscr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6.4 getch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6.5 Caracter que imita a tecla [ENTER] . . . . . . . . . . . . . . . . . . . . . . . . 6
1.7 Uso de comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.8 Teste de mesa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.9 Exerćıcios de Lógica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2 Variáveis e tipos de dados 10
2.1 Declaração de variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2 Tipos de dados variáveis (ou tipos de dados) . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.1 Análise e implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
i
2.3.2 Verificação do programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4 Declaração de valores constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5 Exerćıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 Operadores 16
3.1 Operador de atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.1 Precedência de operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . 17
3.3 Operadores de incremento e de decremento . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 Operadores aritméticos de atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5 Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.6 Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.6.1 Precedência de operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . 24
3.7 Precedência entre os operadores aritméticos, relacionais e lógicos . . . . . . . . . . . 25
3.8 Exerćıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4 Estruturas Condicionais 26
4.1 Estrutura condicional simples: if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2 Estrutura condicional composta: if - else . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.1 Exemplos utilizando estrutura condicional composta . . . . . . . . . . . . . . 29
4.3 Alternativa de estrutura condicional composta: switch . . . . . . . . . . . . . . . . . 31
4.3.1 Exemplos utilizando switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.4 Exerćıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5 Estruturas de Repetição 37
5.1 O laço for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.1.1 Exemplo – Cálculo e impressão da tabuada do 4 . . . . . . . . . . . . . . . . 38
5.2 O laço while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2.1 Exemplos utilizando o laço while . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.3 O laço do - while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.3.1 Exemplo usando o laço do - while . . . . . . . . . . . . . . . . . . . . . . . 42
5.4 Exerćıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
ii
6 Vetores 46
6.1 Exerćıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7 Strings 50
7.1 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.2 Exerćıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
8 Matrizes 55
8.1 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
8.2 Exerćıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
9 Funções 59
9.1 Escopo de variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
9.2 Protótipo de função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
9.3 Chamada de função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
9.4 Definição de função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
9.5 Retorno de função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
9.6 Funções com passagem de parâmetro . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
9.6.1 Passagem de parâmetro por valor . . . . . . . . . . . . . . . . . . . . . . . . . 64
9.6.2 Passagem de parâmetro por referência . . . . . . . . . . . . . . . . . . . . . . 64
9.7 Exerćıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
10 Registros 68
Referências Bibliográficas 70
A Erros comuns na programação usando o ambiente Borland C/C++ 3.1 71
A.1 Erros comuns na compilação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
A.2 Erros comuns de lógica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
B Boas práticas de programação 75
C Revisão de conceitos matemáticos muito utilizados 83
iii
Lista de Exemplos
2.1 Declaração de uma variável do tipo inteiro . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2 Declaração de mais de uma variável do tipo inteiro . . . . . . . . . . . . . . . . . . . 10
3.1 Um caso de uso do operador maior ou igual que (>=). . . . . . . . . . . . . . . . . . 20
3.2 Precedência de operador aritmético sobre relacional. . . . . . . . . . . . . . . . . . . 21
3.3 Um caso de uso do operador lógico E . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Um caso de uso do operador lógico OU . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5 Um caso de uso do operador lógico NÃO . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.1 Trecho de código que utiliza a condicional simples sem chaves. . . . . . . . . . . . . . 27
4.2 Trecho de código que utiliza a condicional simples com chaves. . . . . . . . . . . . . 27
4.3 Trecho de código que utiliza seqüencialmente várias condicionais simples sem chaves. 28
6.1 Exemplo de vetor de números reais com cinco posições. . . . . . . . . . . . . . . . . 47
6.2 Alguns acessos de elementos do vetor notas. . . . . . . . . . . . . . . .. . . . . . . 47
8.1 Alguns acessos de elementos da matriz mat. . . . . . . . . . . . . . . . . . . . . . . . 55
iv
Licença e uso da obra
Este material trata-se de uma obra derivada de várias outras obras existentes a respeito da
área de Lógica e Linguagem de Programação. O mesmo é utilizado em disciplinas ministradas pela
autora.
Este material foi produzido usando o formatador de textos LATEX(versão MikTEX2
a) no sistema opera-
cional Microsoft Windows com o editor TEXnicCenter
b. O autor disponibiliza a obra no formato PDF
e os arquivos-fonte compactados em um arquivo ZIP. Qualquer mudança ou uso deste material deve
ser informado ao autor pelo e-mail: cizeki@hotmail.com.
aO compilador MikTEXpode ser obtido no endereço: http://www.miktex.org.
bO editor de texto LATEXTEXnicCenter pode ser obtido no endereço http://www.toolscenter.org/.
v
CAṔITULO
1
Introdução à Linguagem C++
1.1 Lógica de Programação, Algoritmo, Linguagem de programação e Compi-
lador
1.1.1 Lógica de Programação
Pode-se pensar em lógica como a “arte de bem pensar” ou “a ordem correta do pensamento”.
No dia-a-dia utiliza-se lógica para organizar os pensamentos, como:
1. A gaveta está fechada.
O grampeador está dentro da gaveta.
Assim, deve-se abrir a gaveta para pegar o grampeador.
ou, ainda,
2. Luciane é mais velha que Claudia.
Claudia é mais velha que Marcos.
Portanto, Luciane é mais velha que Marcos.
Já a lógica na programação envolve o uso correto do racioćınio objetivando o desenvolvimento
de técnicas que cooperem para a produção de soluções logicamente válidas e coerentes, resolvendo
com qualidade os problemas que se deseja programar.
Da mesma forma que um mesmo racioćınio pode ser respresentado em diversos idiomas, a lógica
de programação independe da linguagem utilizada, sendo, portanto, empregado o uso de algoritmos.
1.1.2 Algoritmo
Para resolver um problema computacional utiliza-se algoritmo, que é uma seqüência finita de
passos para atingir um objetivo bem definido. No dia-a-dia, algoritmos são utilizados constante-
mente em situações como trocar pneu de um carro, fazer uma omelete, buscar as crianças na escola,
etc.
1
Na elaboração de um algoritmo devem ser especificados passos claros e precisos, que partindo
de um estado inicial, após um peŕıodo de tempo finito, produzem um estado final previśıvel e bem
definido.
A descrição de um algoritmo pode ser feita através de pseudocódigo – linguagem semelhante
à natural, com algumas regras comuns às linguagens de programação – ou de fluxogramas – re-
presentados por desenhos. A implementação de um algoritmo é chamado de programa, ou seja, a
codificação de um algoritmo em alguma linguagem de programação.
1.1.3 Linguagem de programação e Compilador
Da mesma forma que nós, seres humanos, precisamos de uma linguagem para nos comunicar,
uma linguagem de programação serve de comunicação entre o indiv́ıduo que deseja resolver um
determinado problema e o computador escolhido para ajudá-lo na solução.
Entretanto, o computador entende apenas a linguagem de máquina, dita de baixo ńıvel, que
consiste de seqüências de zeros e uns. Assim, programar em uma linguagem de baixo ńıvel é mais
dif́ıcil e trabalhoso para o programador.
Atualmente, as linguagens de programação mais utilizadas são aquelas ditas de alto ńıvel,
consideradas mais próximas da linguagem humana, sendo, portanto, mais fáceis que linguagens de
baixo ńıvel. C++ é um exemplo de linguagem de alto ńıvel.
Todavia, linguagem de alto ńıvel não é a linguagem que o computador entende. Assim, o
programador deve usar um compilador para converter o programa feito em linguagem de alto ńıvel
para código em linguagem de máquina. Caso existam erros de sintaxe no programa, a conversão
não é realizada.
1.2 Ambiente de programação Borland C++ 3.1
É um ambiente de desenvolvimento de programas em linguagem C++. Com ele, pode-se editar
um programa, compilá-lo e executá-lo. Um programa é uma seqüência de instruções codificadas
em uma linguagem de programação e para ser executado precisa ser armazenado na memória do
computador.
A seguir são apresentados os passos básicos para a execução de um programa escrito em lin-
guagem C++ no ambiente Borland C++ 3.1.
1. Abra o ambiente de programação pelo ı́cone no desktop ou pelo Menu Iniciar.
2. Caso queira que o ambiente ocupe todo o espaço da tela, pressione Alt+Enter.
3. Crie um novo arquivo pelo Menu File⇒New.
4. Salve-o dando um nome de no máximo 8 caracteres. A extensão de um arquivo C++ é .cpp.
Tenha o hábito de sempre salvar o arquivo pelo Menu File⇒Save ou tecla F2.
5. Edite-o.
6. Compile-o e execute-o pelo Menu Run⇒Run ou Ctrl+F9.
Se houver erros na compilação, serão apresentadas a quantidade de erros, a linha e a descrição
do posśıvel erro, conforme as Figuras 1.1 e 1.2.
2
Figura 1.1: Informações de erros no programa. Pressionando-se qualquer tecla, são apresentados
os erros do programa conforme especificados na Figura 1.2. Fonte: captura de tela.
Figura 1.2: Apresentação de erros na janela Message. Verifique que há indicação do número da
linha do erro e o que o ocasionou, a fim de que possa corrigi-lo. Fonte: captura de tela.
3
1.3 Estrutura básica de um programa em C++
Um programa C++ consiste na definição de uma ou mais funções. Em Listing 1.1 é apresentada
a forma geral de definição de função, que possui um tipo de dado e um nome acompanhado de
parênteses. A seguir, deve-se inserir uma chave de abertura de bloco ({), escrever as instruções no
corpo da função e terminar com uma chave de fechamento de bloco (}).
Listing 1.1: Forma geral de definição de função C++
t ipo nome da funç ão ( )
{
i n s t r u ç ã o 1 ;
i n s t r u ç ã o 2 ;
. . .
i n s t ru ç ã o n ;
}
Todo programa C++ deve possuir uma função chamada main – do inglês “principal” (Listing
1.2), na qual a execução se inicia com a chave de abertura e, após executar as instruções contidas
no corpo da função, termina quando é encontrada a chave de fechamento. Verifique que no ińıcio
do programa há inclusão de biblioteca, que é um arquivo necessário para a execução de comandos
utilizados no decorrer do programa. Caso haja mais de uma biblioteca, deve-se inclui-la com
#include<nome da biblioteca>.
Listing 1.2: Estrutura básica de um programa em C++
#include <nome de uma b i b l i o t e c a >
void main ( )
{
i n s t r u ç ã o 1 ;
i n s t r u ç ã o 2 ;
. . .
i n s t ru ç ã o n ;
}
1.4 Primeiro programa
Em Listing 1.3 é apresentado o primeiro exemplo de programa, cuja finalidade é calcular e
imprimir a soma de dois números inteiros passados pelo usuário.
Listing 1.3: Primeiro programa
1 #include <i o s t ream . h>
2 #include <con io . h>
3
4 void main ( )
5 {
6 c l r s c r ( ) ;
7
8 int num1 , num2 , soma ;
4
9
10 cout << "Soma de dois numeros" ;
11
12 cout << "Entre com o primeiro numero: " ;
13 c in >> num1 ;
14
15 cout << "Entre com o segundo numero: " ;
16 c in >> num2 ;
17
18 soma = num1 + num2 ;
19
20 cout << "A soma é: " ;
21 cout << soma ;
22
23 getch ( ) ;
24 }
Pode-se digitar o código e salvá-lo com o nome “soma.cpp” – sem as aspas. O sufixo .cpp
indica programa-fonte em C plus plus – do inglês “C mais mais”.
O programa acima possui apenas uma definição de função, a main(). O nome de uma função
pode ser qualquer um, com exceção de main(), reservado para a função que inicia a execução do
programa. Se um programa for constitúıdo de uma única definição de função, esta será main(). O
programa termina quando for encerrada a execução dessa função.
A função main() do programa apresentado é do tipo void, que indica que a função não possui
valor de retorno, ou seja, não retorna nada.
1.5 Instruções de programa
Geralmente, as instruções C++ terminam em um ponto-e-v́ırgula (;). O primeiro programa
possui várias instruções e sãoexecutadas na ordem em que são escritas:
i. A execução do programa se inicia pela função main. A chave de abertura na linha 5 indica
o ińıcio da função main.
ii. A chamada à função clrscr() na linha 6 faz com que a tela de sáıda seja limpa.
iii. Na linha 8 são declaradas três variáveis inteiras (tipo int).
iv. Na linha 10 o comando cout seguido de “<<” imprime na tela tudo o que está entre aspa
dupla, ou seja, a frase “Soma de dois números”.
v. Na linha 12 é impressa uma frase que pede ao usuário um número inteiro.
vi. Na linha 13 o comando cin seguido de “>>” e do nome da variável num1 espera o usuário
entrar com algum dado, que é colocado na variável indicada.
vii. As instruções das linhas 15 e 16 seguem a mesma explicação das linhas 12 e 13.
viii. Na linha 18, como as variáveis num1 e num2 possuem valores passados pelo usuário, é realizada
a soma, inserindo o resultado na variável soma.
5
ix. Na linha 20 é impressa a frase “A soma é: ”.
x. Na linha 21 é impresso o valor que está na variável soma. Perceba que neste caso não foi
utilizada aspas, foi apenas escrito o nome da variável. Caso se utilizassem as aspas, seria
impressa a palavra soma e não o valor que está na variável soma.
xi. A chamada à função getch() faz com que se espere a digitação de alguma tecla para continuar
a execução do programa, ou seja, faz com que o usuário consiga ver o resultado na tela.
xii. A chave na linha 24 denota o fim da função main, ou seja, o fim da execução do programa.
1.6 Comandos iniciais
1.6.1 cout
cout (pronuncia-se C out – sáıda) está associado à sáıda padrão, geralmente o v́ıdeo. O operador
“<<” conecta a mensagem a ser impressa à cout. As definições e declarações necessárias para seu
uso estão contidas na biblioteca iostream.h que também contém os elementos necessários para a
execução de operações de leitura e impressão (I/O – Input/Output).
1.6.2 cin
cin (pronuncia-se C in – entrada) manipula toda a entrada do teclado por meio do operador
“>>” que conecta a entrada de dados à variável que a conterá. As definições necessárias ao uso de
cin e “>>” estão na biblioteca iostream.h.
1.6.3 clrscr()
A chamada à função clrscr() faz com que a tela seja limpa. Caso não seja invocada, a tela
aparecerá com caracteres impressos anteriormente. Deve-se incluir a biblioteca conio.h.
1.6.4 getch()
A chamada à função getch() faz com que se espere a digitação de alguma tecla para continuar
a execução do programa, ou seja, faz com que o usuário consiga ver o resultado na tela. Caso a
função não seja chamada, o usuário não conseguirá ver a sáıda pois a janela é fechada. Também
está definida na biblioteca conio.h.
1.6.5 Caracter que imita a tecla [ENTER]
Além da tecla [ENTER], vários outros caracteres não podem ser digitados do teclado para dentro
do programa. Esses caracteres que não podem ser obtidos diretamente do teclado são codificados
em C++ por meio da combinação do sinal \ (barra invertida) com outros caracteres. Para imitar
a tecla [ENTER], use o caracter ‘\n’.
6
1.7 Uso de comentários
Comentários são textos que podem ser inseridos em programas com o objetivo de documentá-lo.
Os comentários não são analisados pelo compilador.
Os comentários podem ocupar uma ou várias linhas, podendo ser utilizados de duas formas:
1. A região de comentários é aberta pelos śımbolos “//” e é encerrada automaticamente ao final
da linha
2. A região de comentários é aberta com os śımbolos “/*” e é encerrada com os śımbolos “*/”
A seguir é apresentado o primeiro programa utilizando as duas formas de comentários.
Listing 1.4: Primeiro programa comentado
/ ∗
P r o g r a m a d o r : C l a u d i a A . I z e k i
D a t a : 7 / 1 2 / 2 0 0 5
D e s c r i ç ã o : P r o g r a m a q u e c a l c u l a a s oma d e d o i s n ú m e r o s i n t e i r o s
p a s s a d o s p e l o u s u á r i o .
∗ /
/ / I n c l u s ã o d e b i b l i o t e c a s
#include <i o s t ream . h> / / P a r a o u s o d e c i n e c o u t
#include <con io . h> / / P a r a o u s o d e c l r s c r ( ) e g e t c h ( )
/ / F u n ç ã o p r i n c i p a l
void main ( )
{
c l r s c r ( ) ; / / F u n ç ã o q u e l i m p a a t e l a
/ / D e c l a r a ç ã o d e v a r i á v e i s
int num1 , num2 , soma ;
/ / I m p r i m e a f i n a l i d a d e d o p r o g r a m a a o u s u á r i o
cout << "Soma de dois numeros" ;
/ / P e d e um n ú m e r o a o u s u á r i o
cout << "Entre com o primeiro numero: " ;
c in >> num1 ; / / O q u e o u s u á r i o d i g i t a r é i n s e r i d o em num1
/ / P e d e a o u s u á r i o o u t r o n ú m e r o
cout << "Entre com o segundo numero: " ;
c in >> num2 ; / / O q u e o u s u á r i o d i g i t a r é i n s e r i d o em num2
/ / C a l c u l a a s oma
soma = num1 + num2 ;
/ / I m p r i m e a s oma
cout << "A soma é: " ;
cout << soma ;
7
/ / E s p e r a o p r e s s i o n a m e n t o d e a l g u m a t e c l a . Com i s s o , o
/ / u s u á r i o c o n s e g u e v i s u a l i z a r o r e s u l t a d o
getch ( ) ;
}
1.8 Teste de mesa
Um recurso muito utilizado para verificar erros de lógica em um algoritmo é a simulação ou teste
de mesa. Segundo Salvetti e Barbosa (1998), a partir de dados escolhidos com resposta conhecida
simula-se a execução do algoritmo e compara-se a resposta obtida com a resposta esperada. Se não
houver coincidência está detectado um erro, embora a rećıproca não seja verdadeira.
Saber escolher os dados para os testes é de muita importância na simulação. Assim, deve-se
escolher amostras de dados de forma que provoquem a execução de todas as instruções presentes
no algoritmo, testando todas as diferentes possibilidades de sáıda.
Para realizar o teste de mesa são listadas todas as variáveis utilizadas no algoritmo e registrados
todos os valores assumidos pelas variáveis, na ordem em que ocorrem.
Para localizar facilmente a variável que foi definida ou alterada em um dado momento, é con-
veniente identificar com um número cada uma das instruções contidas no algoritmo.
Na Tabela 1.1 é apresentado um teste de mesa do primeiro programa (Listing 1.3 – pág. 4).
Verifique que o śımbolo # indica a ordem de execução das instruções; [] indica o número da
instrução sendo executada; o sublinhado indica valor definido ou modificado; o pontilhado indica
impressão e a sáıda é alguma impressão com o comando cout.
Tabela 1.1: Teste de mesa do primeiro programa apresentado em Listing 1.3. Suponha que os
valores entrados pelo usuário para as variáveis num1 e num2 sejam, respectivamente, 12 e 7.
Variáveis Sáıda
# [ ] num1 num2 soma
1 8 lixo lixo lixo
2 10 lixo lixo lixo Soma de dois números
3 12 lixo lixo lixo Entre com o primeiro número
4 13 12 lixo lixo
5 15 12 lixo lixo Entre com o segundo número
6 16 12 7 lixo
7 18 12 7 19
8 20 12 7 19 A soma é:
9 21 12 7 19 19
10 23 12 7 19 Espera o pressionamento de alguma tecla...
1.9 Exerćıcios de Lógica
1. Elabore um algoritmo que mova três discos de uma Torre de Hanói, que consiste em três
hastes (a, b, c), sendo que a haste a serve de suporte para três discos de tamanhos diferentes
(1, 2, 3), os menores sobre os maiores. A haste b serve de intermediária. Pode-se mover
8
um disco de cada vez para qualquer haste, contanto que nunca seja colocado um disco maior
sobre um menor. O objetivo é transferir os três discos para a haste c.
2. Um homem precisa atravessar um rio com um barco que possui capacidade apenas para
carregar ele mesmo e mais uma de suas três cargas, que são: um lobo, um bode e um maço
de alfafa. O que o homem deve fazer para conseguir atravessar o rio sem perder suas cargas?
Escreva um algoritmo mostrando a resposta, ou seja, indicando todas as ações necessárias
para efetuar uma travessia segura. Note que: o lobo come o bode, e este come alfafa quando
o homem não está por perto.
3. Três jesúıtas e três canibais precisamatravessar um rio; para tal, dispõem de um barco com
capacidade para duas pessoas. Por medida de segurança, não se deve permitir que em alguma
margem a quantidade de jesúıtas seja inferior à de canibais. Qual a solução para efetuar a
travessia com segurança? Elabore um algoritmo mostrando a resposta, indicando as ações
que concretizam a solução deste problema.
9
CAṔITULO
2
Variáveis e tipos de dados
Variáveis são os aspectos fundamentais de qualquer linguagem de computador. Segundo Mizrahi
(1994), uma variável em C++ é um espaço de memória reservado para armazenar um certo tipo de
dado e possui um nome para referenciar seu conteúdo. Uma variável pode conter, a cada tempo,
valores diferentes.
Na Seção 1.4 (4) foi apresentado um programa com três variáveis do tipo inteiro: num1, num2 e
soma, utilizadas para armazenar, respectivamente, as entradas do usuário e o resultado da adição.
2.1 Declaração de variáveis
Antes de começar a armazenar dados em uma variável, deve-se declará-la escrevendo-se seu tipo
seguido por um ou mais espaços, um nome e um ponto-e-v́ırgula.
Exemplo 2.1 Declaração de uma variável do tipo inteiro
int num;
Pode-se criar mais de uma variável do mesmo tipo em uma instrução escrevendo-se o tipo e
então os nomes das variáveis separados por v́ırgulas e um ponto-e-v́ırgula no final.
Exemplo 2.2 Declaração de mais de uma variável do tipo inteiro
int num1, num2, soma;
É boa prática de programação utilizar nomes significativos para variáveis, tornando-as fáceis de
entender – o que facilita a manutenção do programa.
O nome de uma variável é utilizado para sua identificação e posterior uso dentro de um pro-
grama. Assim, é necessário estabelecer algumas regras de utilização das mesmas:
1. O primeiro caracter do nome da variável deve ser sempre uma letra ou o caracter ‘ ’ (subli-
nhado);
2. Nomes de variáveis podem conter letras, números e o caracter ‘ ’;
3. Nomes de variáveis não podem ser iguais às palavras reservadas da linguagem;
10
4. A linguagem C++ distingue as letras maiúsculas e minúsculas, ou seja, é case sensitive. Por
exemplo, ABC e abc são diferenciadas pela linguagem.
2.2 Tipos de dados variáveis (ou tipos de dados)
O tipo de uma variável informa a quantidade de memória, em bytes, que a variável ocupará e
a forma como um valor deverá ser armazenado e interpretado.
1. Tipos de dados inteiros: são dados numéricos positivos e negativos. Não podem ser fra-
cionários e são representados pelo tipo int. Por exemplo, idades de pessoas podem ser
consideradas do tipo inteiro, como 18, 25 e 68.
2. Tipos de dados reais: são dados numéricos positivos e negativos. Podem ser fracionários e
são representados pelos tipos float e double. Por exemplo, saldos de contas de banco são
do tipo real, como -120.45, 0.0 e 345.98; alturas de pessoas também são do tipo real, como
1.0 e 1.54.
3. Tipos de dados caracter: relacionado a um único caracter ou a uma seqüência de caracteres.
É representado pelo tipo char. Exemplos de caracteres: letras, números, sinais de pontuação
e caracteres especiais. Uma seqüência de caracteres é chamada de string. Para diferenciar um
caracter de uma string, usa-se apóstrofo para o primeiro e aspa para o segundo. Exemplo:
‘s’ é um caracter; “Hello World!” é uma string.
Na Tabela 2.1 são apresentados alguns tipos de dados em C++. Pode-se considerar que os cinco
primeiros tipos são os básicos da linguagem; os demais utilizam os modificadores unsigned, long
e short. O modificador unsigned significa que se pode armazenar somente números positivos. O
modificador short normalmente se refere a um inteiro de 2 bytes e o long mais freqüentemente a
um inteiro de 4 bytes, mas nenhum desses é certo. A linguagem exige apenas que um short seja
mais curto ou igual a um inteiro, e que um inteiro seja mais curto ou igual a um long.
Tabela 2.1: Alguns tipos de dados em C++.
Tipo Tamanho Valores (aproximados)
int 2 bytes -32.768 a 32.767
char 1 byte 256 valores de caracteres
float 4 bytes 3,4e-38 a 3,4e38
double 8 bytes 1,7e-308 a 1,7e308
void 0 Nenhum valor
unsigned int 2 bytes 0 a 65.535
short int 2 bytes -32.768 a 32.767
unsigned short int 2 bytes 0 a 65.535
long int 4 bytes -2.147.483.648 a 2.147.483.647
unsigned long int 4 bytes 0 a 4.294.967.295
2.3 Exemplo
Um produto sofrerá um aumento de 10%. Faça um programa que peça ao usuário o preço de
um produto, calcule e mostre qual será o valor do aumento e o valor reajustado do produto.
11
2.3.1 Análise e implementação
Para resolver esse e outros problemas, deve-se ter em mente os seguintes passos:
1. Quais são as entradas do programa – geralmente são pedidas ao usuário, mas também podem
vir de outras fontes como um banco de dados ou um arquivo.
2. Qual é o processamento: o que se deve fazer com essas entradas – verificar, calcular, modificar,
etc.
3. Quais são as sáıdas.
Neste exemplo, a entrada do programa é o preço de um produto – no enunciado do exerćıcio:
“...peça ao usuário o preço de um produto...”. De que tipo ele é para se fazer a declaração? Preço
é um número real, assim, utiliza-se o tipo float.
O que se deve fazer com a entrada? Calcular o aumento de 10% e o preço reajustado – no
enunciado: “calcule ... qual será o valor do aumento e o valor reajustado do produto”. Como fazer
isso? Pode-se empregar a regra de três:
prod→ 100 (2.1)
aum← 10 (2.2)
aum× 100 = prod× 10 (2.3)
aum =
prod× 10
100
(2.4)
aum = prod× 0, 10 (2.5)
Assim, pode-se chegar à equação 2.4:
aum = (prod*10)/100;
ou simplesmente à equação 2.5:
aum = 0.10 * prod;
Perceba que na equação 2.5 foi utilizado o ponto no lugar da v́ırgula em 0.10. Assim, toda vez
que for utilizar número fracionário, não use v́ırgula, use o ponto.
Tendo-se o valor do aumento é só somá-lo com o valor do produto que se encontra o preço
reajustado. Os nomes de variáveis utilizadas para armazenar esses valores, foram, respectivamente:
aum, prod e preco reaj.
Por último, é só imprimir o que o exerćıcio pede; no enunciado: “mostre qual será o valor do
aumento e o valor reajustado do produto”.
Analise como esse problema foi solucionado em Listing 2.1.
Listing 2.1: Resolução do problema de reajuste de preço de um produto.
1 #include <i o s t ream . h>
2 #include <con io . h>
3
12
4 void main ( )
5 {
6 c l r s c r ( ) ;
7
8 f loat prod , aum, p rod r ea j ;
9
10 cout << "Entre com o valor do produto: " ;
11 c in >> prod ;
12
13 aum = prod ∗ 0 . 1 0 ;
14
15 prod r ea j = prod + aum;
16
17 cout << "Valor do aumento: " << aum;
18 cout << "Valor do produto reajustado: " << prod r ea j ;
19
20 getch ( ) ;
21 }
2.3.2 Verificação do programa
A execução do programa segue os seguintes passos, mas pode ser observada no teste de mesa
da Tabela 2.2. Suponha que o usuário tenha entrado com o valor 55.3 para o preço de produto.
i. Limpa a tela.
ii. Quando ocorre a declaração de variáveis na função main, estas estão com valor de lixo, ou
seja, estão com algum valor que estão naquelas posições de memória.
iii. Imprime na tela: “Entre com o valor do produto: ”.
iv. O usuário deve entrar com algum valor, por exemplo: 55.3. Lembre-se que o usuário deverá
entrar com o ponto ao invés da v́ırgula.
v. Calcula-se o aumento: aum ficará com o valor 5.53. Como há uma atribuição, o produto
substitui o valor de lixo que existia anteriormente em aum.
vi. Calcula-se o valor do preço reajustado, inserindo-o na variável prod reaj, que armazenará o
valor 60.83.
vii. A seguir, são impressos os valores contidos nas variáveis aum e prod reaj.
13
Tabela 2.2: Teste de mesa do programa apresentado em Listing 2.1. Suponha que o usuário tenha
entrado com o valor 55.3 para o preço de produto.
Variáveis Sáıda
# [ ] prod aum prod reaj
1 8 lixo lixo lixo
2 10 lixo lixo lixo Entre com o valor do produto:
3 11 55.3 lixo lixo
4 13 55.3 5.53 lixo
5 15 55.3 5.53 60.83
6 17 55.35.53 60.83 Valor do aumento: 5.53
7 18 55.3 5.53 60.83 Valor do produto reajustado: 60.83
8 20 55.3 5.53 60.83 Espera pressionamento de alguma tecla...
2.4 Declaração de valores constantes
A palavra-chave const é utilizada para declarar valores constantes. Ela assegura que a variável
associada não será alterada em todo o programa. Em Listing 2.2 é apresentado um exemplo.
A sintaxe de declaração de valores constantes é:
const tipodaconstante nomedaconstante = valor ;
Listing 2.2: Exemplo de declaração e uso de constante para representar o valor de pi.
1 / / D e s c r i ç ã o d o p r o g r a m a : C a l c u l a a á r e a d e um c ı́ r c u l o e o p e r ı́ m e t r o
2 / / d e s u a c i r c u n f e r ê n c i a .
3
4 void main ( )
5 {
6 c l r s c r ( ) ;
7
8 const f loat pi =3.141592;
9 f loat area , r a i o ;
10
11 cout << "Cálculo da área de um cı́rculo e do perı́metro "
12 << "de sua circunferência." ;
13 cout << "Por favor, entre com o raio: " ;
14 c in >> r a i o ;
15
16 area = pi ∗ r a i o ∗ r a i o ;
17
18 comp = 2 ∗ pi ∗ r a i o ;
19
20 cout << "A área do cı́rculo é: " << area ;
21 cout << "O comprimento de sua circunferência é: " << comp ;
22
23 getch ( ) ;
24 }
Verifique que na linha 8 foi declarado o valor 3.141592 para pi. Assim, pode-se utilizá-lo em
várias partes do programa, como nas linhas 16 e 18. Como pi é uma constante, não se pode
14
modificá-lo no decorrer no programa.
2.5 Exerćıcios
1. Faça um programa que calcule a média aritmética entre 4 notas bimestrais quaisquer forneci-
das por um aluno (usuário).
2. Em um curso semestral de uma instituição de ensino, a média final é composta por três notas
e é ponderada, ou seja, possui peso 2 para a primeira nota, peso 1 para a segunda e peso 3
para a terceira. Faça um programa que peça as notas para o usuário e calcule a média final.
3. Seja a seguinte fórmula de cálculo de média final em um curso: Mf = (N1 + 2.N2)/3, na
qual o aluno deverá obter no mı́nimo 5, 0 para passar direto. Sabendo-se a N1, quanto no
mı́nimo o aluno deverá tirar na N2 para passar direto? Assim, faça um programa que peça
ao usuário a N1 e calcule a nota mı́nima que o aluno deverá tirar na N2 para passar direto.
4. Faça um programa que receba o salário de um funcionário e o percentual de aumento. Calcule
o valor do aumento e do novo salário.
5. Um trabalhador recebeu seu salário e o depositou em sua conta corrente bancária. Esse
trabalhador emitiu dois cheques e agora deseja saber seu saldo atual. Sabe-se que cada
operação bancária de retirada paga CPMF de 0,38% e o saldo inicial da conta está zerado.
6. O ı́ndice de massa corporal (IMC) é uma fórmula que indica se um indiv́ıduo está acima do
peso, se está obeso ou abaixo do peso ideal considerado saudável. A fórmula para calcular o
IMC é dividir o peso, medido em quilos, pelo quadrado da altura, em metros. Assim, faça
um programa que peça ao usuário um peso e uma altura, calcule e mostre o IMC. Imprima
as informações da tabela para o usuário verificar o significado do valor de seu IMC. Não se
preocupe com a impressão dessas informações; apenas utilize o caracter ‘\n’ para melhorar a
visualização.
IMC Significa
Menos de 18,5 Abaixo do peso
De 18,5 a menor que 25 Peso ideal
De 25 a menor que 30 Sobrepeso
Maior ou igual a 30 Obesidade
15
CAṔITULO
3
Operadores
3.1 Operador de atribuição
Em C++, o sinal de igual não tem a interpretação dada em matemática. Representa a atribuição
da expressão à sua direita à variável à sua esquerda. Por exemplo:
x = 0;
atribui o valor zero à variável de nome x. A ação é executada da direita para a esquerda. Lê-se:
“x recebe o valor zero”.
Mesmo em expressões mais complexas, como em delta = b*b-4*a*c, primeiro é realizado
cálculo da expressão à direita do operador de atribuição para depois atribuir o resultado à variável
delta.
3.2 Operadores aritméticos
C++ oferece cinco operadores aritméticos binários (que operam sobre dois operandos) e um
operador aritmético unário (que opera sobre um operando). São eles:
Binários
+ Soma
- Subtração
* Multiplicação
/ Divisão
% Módulo
Unário
- Menos unário
O operador módulo opera somente com operandos inteiros e dá como resultado o resto da
divisão do inteiro à sua esquerda pelo inteiro à sua direita. Por exemplo:
17 % 5
16
possui o valor 2, pois quando se divide 17 por 5, resta o valor 2.
O operador menos unário é usado somente para indicar a troca do sinal algébrico do valor.
Pode também ser pensado como o operador que multiplica seu operando por −1. Por exemplo:
x = -8;
x = -x;
Depois destas duas instruções, o conteúdo de x será 8.
3.2.1 Precedência de operadores aritméticos
Tabela 3.1: Precedência entre operadores aritméticos
Prioridade Operadores
1a parênteses mais internos
2a ∗ / %
3a + −
Os operadores que possuem a mesma prioridade devem ser executados da esquerda para a
direita. Para alterar a prioridade da tabela devem-se utilizar parênteses mais internos.
Exemplos
1. Suponha que se deseje calcular o valor final de uma compra de acordo com a fórmula a seguir.
Os valores dos produtos e do desconto são, respectivamente, 23.50, 14.00, 5.00 e 2.00. Como
existem apenas os operadores de soma e de subtração, que possuem a mesma precedência, a
execução começará da esquerda para a direita.
valor final compra = valor produto1 + valor produto2 + valor produto3− desconto;
valor final compra = 23.50 + 14.00︸ ︷︷ ︸
37.50
+5.00− 2.00;
valor final compra = 37.50 + 5.00︸ ︷︷ ︸
42.50
−2.00;
valor final compra = 42.50− 2.00︸ ︷︷ ︸
40.50
;
valor final compra = 40.50;
2. Sejam 1, 6 e 8 os valores de a, b e c, respectivamente. Na fórmula de delta existem os
operadores de subtração e de multiplicação, este último tendo precedência sobre o primeiro.
Assim, a última operação a ser realizada é a subtração, e todas as multiplicações são resolvidas
da esquerda para a direita.
delta = b ∗ b− 4 ∗ a ∗ c;
delta = −6 ∗ −6︸ ︷︷ ︸
36
−4 ∗ 1 ∗ 8;
delta = 36− 4 ∗ 1︸︷︷︸
4
∗8;
delta = 36− 4 ∗ 8︸︷︷︸
32
;
delta = 4;
17
3. Seja a seguinte fórmula que calcula a nota que um aluno deverá tirar no exame, onde Ma é a
média anual. Suponha que Ma seja 4.0. Verifique que os operadores com maior precedência
são o da multiplicação e o da divisão. Note ainda que há parênteses, o que indica que o que
está em seu interior deve ser resolvido primeiro.
E = (50− 6 ∗Ma)/4;
E = (50− 6 ∗ 4.0︸ ︷︷ ︸
24.0
)/4;
E = (50− 24.0︸ ︷︷ ︸
26.0
)/4;
E = 26.0/4︸ ︷︷ ︸
6.5
;
E = 6.5;
3.3 Operadores de incremento e de decremento
O operador de incremento ++ é um operador unário que adiciona 1 à variável operando. O
operador de incremento pode ser usado de duas formas: pré-fixado quando aparece antes do
nome da variável e pós-fixado quando aparece em seguida ao nome da variável.
A instrução
x = x + 1;
adiciona 1 ao valor de x e é equivalente a
++x; // pré-fixado
que é equivalente a
x++; // pós-fixado
A diferença entre as operações executadas pelo operador pré-fixado e pós-fixado aparece em
instruções que fazem mais do que somente incrementar a variável operando. Por exemplo:
n = 5 ;
x = ++n ;
cout << "O valor de n é: " << n ;
cout << "O valor de x é: " << x ;
A sáıda será:
O va lo r de n é : 6
O va lo r de x é : 6
O operador de incremento pré-fixado incrementa a variável operando antes de executar a ins-
trução em que ele aparece. Desta forma, n terá seu valor incrementado de 1 antes de ser atribúıdo
a x.
18
Observe agora o próximo exemplo:
n = 5 ;
x = n++;
cout << "O valor de n é: " << n ;
cout << "O valor de x é: " << x ;
A sáıda será:
O va lo r de n é : 6
O va lo r de x é : 5
O operador de incremento pós-fixado incrementa a variável operando logo após a instrução em
que ele aparece. Desta forma, n é atribúıdo a x e depois seu valor é incrementado de 1.
Quando o operador de incremento aparecesozinho em uma instrução não faz diferença o uso
pré-fixado ou pós-fixado.
A sintaxe e modo de uso do operador de decremento (--) pré-fixado e pós-fixado é idêntica à
do operador de incremento, exceto porque a variável é decrementada de 1.
3.4 Operadores aritméticos de atribuição
Esses operadores são binários e combinam as operações aritméticas com atribuição. O operando
da esquerda é sempre o nome de uma variável e o da direita, uma expressão qualquer. A operação
consiste em atribuir um novo valor à variável que dependerá do operador e da expressão à direita.
Como regra geral, se x é uma variável, exp uma expressão e op um operador aritmético, então
x op= exp equivale a x = x op (exp)
As expressões com estes operadores são mais compactas e normalmente muito usadas em C++.
Tabela 3.2: Exemplos de operadores aritméticos de atribuição
i += 2; equivale a i = i + 2;
x *= y + 1; equivale a x = x * (y+1);
t /= 2.5; equivale a t = t / 2.5;
p %= 5; equivale a p = p % 5;
d -= 3; equivale a d = d - 3;
3.5 Operadores relacionais
Operadores relacionais são utilizados para fazer comparações conforme apresentados na Tabela
3.3, sempre necessitando de dois operandos. Uma atenção especial (Exemplo 3.1) é dada quanto
ao uso dos operadores maior ou igual que (>=) e menor ou igual que (<=).
19
Tabela 3.3: Operadores relacionais. Sejam op1 e op2 operandos.
Operador relacional com os operandos Significado
op1 == op2 op1 é igual a op2?
op1 != op2 op1 é diferente de op2?
op1 > op2 op1 é maior que op2?
op1 < op2 op1 é menor que op2?
op1 >= op2 op1 é maior ou igual que op2?
op1 <= op2 op1 é menor ou igual que op2?
Exemplo 3.1 Um caso de uso do operador maior ou igual que (>=).
Suponha que seja de interesse verificar se a média final (Mf) é no mı́nimo 7, 0. Isso significa que
Mf deve ser igual ou maior que 7, 0. Sejam três situações com os seguintes valores para Mf : 7.0,
8.5 e 6.8.
Mf >= 7.0
7.0 >= 7.0
Verdadeiro
Mf >= 7.0
8.5 >= 7.0
Verdadeiro
Mf >= 7.0
6.8 >= 7.0
Falso
Atenção: Os operadores aritméticos têm precedência sobre os operadores relacionais. No
Exemplo 3.2 é verificado se n é um número par.
(continua na próxima página...)
20
Exemplo 3.2 Precedência de operador aritmético sobre relacional.
Suponha duas situações em que os valores para n sejam 13 e 8. Deseja-se checar se n é um número
par. Verifique que primeiro é feito o cálculo do resto e depois a checagem de igualdade.
n % 2 == 0
13 % 2 == 0
1 == 0
Falso
n % 2 == 0
8 % 2 == 0
0 == 0
Verdadeiro
3.6 Operadores lógicos
Operadores lógicos também fazem comparações. A diferença entre comparações lógicas e rela-
cionais está na forma como os operadores avaliam seus operandos. Operandos de operadores lógicos
são avaliados como lógicos (falso ou verdadeiro) e não como numéricos. C++ oferece três operadores
lógicos:
• && : significa E lógico
• || : significa OU lógico
• ! : significa NÃO lógico
Se e1 e e2 são duas expressões, então:
• e1 && e2: resulta verdadeiro somente se e1 e e2 forem verdadeiras. Em qualquer outra
situação, resulta falso. Verifique a Tabela 3.4 e o Exemplo 3.3.
Tabela 3.4: Tabela-verdade do E lógico
Expressão lógica Resultado
V && V V
V && F F
F && V F
F && F F
(continua na próxima página...)
21
Exemplo 3.3 Um caso de uso do operador lógico E
Suponha que se deseje verificar se a nota de um aluno é maior ou igual a 7,0 mas abaixo de 8,0.
Para nota com valor 8, 0:
nota >= 7.0 && nota < 8.0
8.0 >= 7.0 && 8.0 < 8.0
V && F
F
Para nota com valor 7, 0:
nota >= 7.0 && nota < 8.0
7.0 >= 7.0 && 7.0 < 8.0
V && V
V
Para nota com valor 6, 5:
nota >= 7.0 && nota < 8.0
6.5 >= 7.0 && 6.5 < 8.0
F && V
F
• e1 || e2: resulta falso somente se e1 e e2 forem falsas. Em qualquer outra situação, resulta
verdadeiro. Verifique a Tabela 3.5 e o Exemplo 3.4.
Tabela 3.5: Tabela-verdade do OU lógico
Expressão lógica Resultado
V || V V
V || F V
F || V V
F || F F
(continua na próxima página...)
22
Exemplo 3.4 Um caso de uso do operador lógico OU
Suponha que se deseje verificar se sexo é válido. Sexos válidos são ‘f’ (de feminino) e ‘m’ (de
masculino).
Para sexo com valor ‘f’:
sexo == ‘f’ || sexo == ’m’
‘f’ == ‘f’ || ‘f’ == ’m’
V || F
V
Para sexo com valor ‘m’:
sexo == ‘f’ || sexo == ‘m’
‘m’ == ‘f’ || ‘m’ == ‘m’
F || V
V
Para sexo com valor ‘p’:
sexo == ‘f’ || sexo == ‘m’
‘p’ == ‘f’ || ‘p’ == ‘m’
F || F
F
• !e1: resulta verdadeiro somente se e1 for falsa e vice-versa. Verifique a Tabela 3.6 e o Exemplo
3.5.
Tabela 3.6: Tabela-verdade do NÃO lógico
Expressão lógica Resultado
!V F
!F V
(continua na próxima página...)
23
Exemplo 3.5 Um caso de uso do operador lógico NÃO
Suponha que se deseje encontrar o nome de uma pessoa em uma lista telefônica e que exista uma
variável chamada achou que possa ter os valores 0 ou 1, o primeiro indicando que não encontrou a
pessoa e o segundo indicando que a encontrou. Suponha também que interessa saber se a pessoa
não foi encontrada.
Para achou com valor 0:
!achou
!0
V
Para achou com valor 1:
!achou
!1
F
Atenção: na linguagem C++, 0 (zero) representa o valor booleano falso, e tudo que for diferente
de 0 é verdadeiro.
Segundo Forbellone e Eberspächer (2005), tabela-verdade é o conjunto de todas as possibili-
dades combinatórias entre os valores de diversas variáveis lógicas, as quais se encontram em apenas
duas situações (V ou F), em um conjunto de operadores lógicos.
Como exemplos mais elucidativos dos operadores E e OU podem-se citar:
1. Se tiver febre e dor no corpo vou ao médico.
Quando vou ao médico?
Observa-se na tabela-verdade do E que “vou ao médico” quando os termos “tiver febre” e
“tiver dor no corpo” forem simultaneamente verdade.
2. Se tiver febre ou dor no corpo vou ao médico.
Quando vou ao médico?
Observa-se na tabela-verdade do OU que as possibilidades de “vou ao médico” se tornam
maiores, pois será verdadeiro em três situações: somente “ter febre”, somente “ter dor no
corpo” e “ter febre e dor no corpo”.
3.6.1 Precedência de operadores lógicos
Tabela 3.7: Precedência entre os operadores lógicos
Prioridade Operadores
1a N~AO: !
2a E: &&
3a OU: ||
24
3.7 Precedência entre os operadores aritméticos, relacionais e lógicos
Tabela 3.8: Precedência entre os operadores aritméticos, relacionais e lógicos
Prioridade Operadores
1a parênteses mais internos
2a operador lógico N~AO: !
3a operadores aritméticos
4a operadores relacionais
5a operadores lógicos E: && e OU: ||
3.8 Exerćıcios
1. Seja a seguinte expressão: n = z + y ∗ x;
Se desejarmos somar z com y e depois multiplicar seu resultado com x, o que devemos
acrescentar na expressão acima?
2. Escreva e verifique expressões genéricas utilizando variáveis que representem as seguintes
situações:
(a) idade inválida, ou seja, negativa ou igual a zero;
(b) idade válida;
(c) sexo inválido, ou seja, diferente de ‘f’ e de ‘m’;
(d) sexo válido;
(e) idade ou sexo inválidos;
(f) idade e sexo válidos;
(g) idade a partir de 18;
(h) idade de 20 a 30 anos;
(i) número par;
(j) número ı́mpar;
(k) número diviśıvel por 9;
(l) número diviśıvel por 5.
3. Idade e sexo válidos é representado em C++ como:
(idade > 0 && (sexo == ‘F’ || sexo == ‘M’)).
Por que essa expressão não é equivalente à
(idade > 0 && sexo == ‘F’ || sexo == ‘M’)?
4. De acordo com a sua experiência no jogo da forca, responda:
(a) quando é que o jogo termina?
(b) quando é que o jogo continua?
25
CAṔITULO
4
Estruturas Condicionais
As estruturas condicionais permitem determinar qual é a ação a ser tomada com base no resul-
tado de uma expressão condicional. Por exemplo, em um curso de ciência da computação a média
final (Mf) para se passar em uma disciplina é 7, 0. Caso o aluno não a alcance, vai para exame e
terá que tirar no mı́nimo (50− 6×Mf)/4. Caso não passe no exame irá para recuperação, tendo
que tirar pelo menos10 −Mf . Neste exemplo, dependendo do resultado da verificação, a ação a
ser tomada pode ser uma dentre várias; assim, é necessário o uso de estruturas condicionais.
C++ oferece três estruturas condicionais:
1. if: estrutura condicional simples.
2. if - else: estrutura condicional composta.
3. switch: alternativa de estrutura condicional composta, mas possui algumas limitações em
relação à estrutura if - else.
4.1 Estrutura condicional simples: if
Na estrutura condicional simples sem chaves, cuja forma geral é apresentada em Listing 4.1,
a instrução no corpo do if só será executada se a expressão condicional for verdadeira. Uma
expressão condicional é uma comparação que possui dois valores posśıveis: verdadeiro ou falso.
Verifique o Exemplo 4.1.
Listing 4.1: Forma geral da estrutura condicional simples sem chaves
i f ( expres s ã o c ond i c i ona l )
i n s t ru ç ã o ; / / c o r p o d o i f
26
Exemplo 4.1 Trecho de código que utiliza a condicional simples sem chaves.
Suponha que se deseje parabenizar as mulheres pelo seu dia (8 de março). Caso não seja o dia das
mulheres ou o usuário seja homem, não emite mensagem.
if(sexo_usuario==‘f’ && dia==8 && mes==3)
cout << "Parabens, mulher, pelo seu dia!";
Para imprimir a frase de congratulações, o sexo deverá ser ‘f’, o dia 8 e o mês 3, resultando em
verdadeira a expressão condicional.
Em C++, é obrigatória a utilização de chaves quando houver mais de uma instrução a ser
executada quando a expressão condicional for verdadeira. A forma geral da estrutura condicional
simples com chaves é apresentada em Listing 4.2. As instruções entre as chaves { e }, que fazem
parte do corpo do if, só serão executadas se a expressão condicional for verdadeira. A chave de
abertura indica ińıcio do bloco (corpo) que será executado se a expressão condicional for verdadeira.
A outra chave indica o fim do bloco (corpo). Verifique o Exemplo 4.2.
Listing 4.2: Forma geral da estrutura condicional simples com chaves
i f ( expres s ã o c ond i c i ona l )
{
/ / c o r p o d o i f ( i n s t r u ç ã o 1 a i n s t r u ç ã o n )
i n s t ru ç ã o 1 ;
i n s t ru ç ã o 2 ;
in s t ru ç ã on ;
}
Exemplo 4.2 Trecho de código que utiliza a condicional simples com chaves.
Seja o exemplo anterior e suponha que se deseje calcular e imprimir a quantidade de mulheres que
acessaram o sistema no dia 8 de março.
if(sexo_usuario==‘f’ && dia==8 && mes==3)
{
cout << "Parabéns, mulher, pelo seu dia!";
cout << "Você é a " << cont + 1 << "a. mulher a acessar o sistema hoje.";
cont++; // ou cont = cont + 1. Inicialmente, cont receberá o valor 0.
}
Verifique que há três instruções no corpo da instrução if: dois cout e um incremento de variável
contadora. Assim, devem-se utilizar as chaves.
Atenção: Um contador é uma variável que, dado um valor inicial (geralmente zero), é incre-
mentada (somada) a um valor constante, geralmente 1.
No Exemplo 4.3 é apresentado problema que utiliza contador em uma seqüência de estruturas
condicionais simples.
27
Exemplo 4.3 Trecho de código que utiliza seqüencialmente várias condicionais simples sem chaves.
Suponha que se deseje verificar quantas notas de um total de quatro são maiores que 9.0.
cont = 0;
if (N1 > 9.0)
cont++; // cont = cont + 1
if (N2 > 9.0)
cont++; // cont = cont + 1
if (N3 > 9.0)
cont++; // cont = cont + 1
if (N4 > 9.0)
cont++; // cont = cont + 1
cout << "A quantidade de notas maiores que 9,0 é: " << cont;
Verifique que há a necessidade de se verificar cada uma das notas, que sendo maior que 9,0,
incrementa-se a variável contadora.
4.2 Estrutura condicional composta: if - else
A forma geral da estrutura condicional composta sem chaves é apresentada em Listing 4.3. Se
a expressão condicional for verdadeira, será executada a instrução 1; caso contrário – a expressão
condicional é falsa, será executada a instrução 2.
Listing 4.3: Forma geral da estrutura condicional composta sem chaves
i f ( expres s ã o c ond i c i ona l )
i n s t ru ç ã o 1 ; / / c o r p o d o i f
else
i n s t ru ç ã o 2 ; / / c o r p o d o e l s e
Já a forma geral da estrutura condicional composta com chaves é apresentada em Listing 4.4.
Se a expressão condicional for verdadeira, as instruções 1 e 2 (corpo do if) serão executadas; caso
contrário, as instruções 3 e 4 (corpo do else) serão executadas.
Listing 4.4: Forma geral da estrutura condicional composta com chaves
i f ( expres s ã o c ond i c i ona l )
{
/ / c o r p o d o i f
i n s t ru ç ã o 1 ;
i n s t ru ç ã o 2 ;
}
else
{
/ / c o r p o d o e l s e
i n s t ru ç ã o 3 ;
i n s t ru ç ã o 4 ;
}
28
4.2.1 Exemplos utilizando estrutura condicional composta
1. Programa que faz a divisão de dois números inteiros passados pelo usuário. Lembre-se que é
imposśıvel fazer divisão por zero. Emita uma mensagem caso isso ocorra.
Listing 4.5: Programa que faz a divisão de dois números inteiros.
1 void main ( )
2 {
3 int dividendo , d i v i s o r ;
4 f loat quoc i ente ;
5
6 cout << "Entre com o dividendo e o divisor, respectivamente: " ;
7 c in >> div idendo >> d i v i s o r ;
8
9 i f ( d i v i s o r != 0)
10 {
11 quoc i ente = ( f loat ) d iv idendo / d i v i s o r ;
12 cout << "O quociente é: " << quoc i ente ;
13 }
14 else
15 cout << "Impossı́vel fazer a divis~ao. O divisor é igual a zero." ;
16
17 getch ( ) ;
18 }
Neste exemplo, deve-se verificar se o divisor é diferente de zero, pois só assim é posśıvel fazer a
divisão. Um dado importante é que o quociente da divisão entre números inteiros pode ser um
número real. Assim, mesmo declarando a variável quociente como float, é necessário que
se converta o valor do dividendo ou do divisor para um número real. Isso é feito colocando-se
o tipo float entre parênteses antes da variável, neste caso dividendo.
Note que há duas instruções (nas linhas 11 e 12 ) que serão executadas caso o divisor seja
diferente de zero. Assim, as chaves devem ser utilizadas.
Nas Tabelas 4.1 e 4.2 são apresentados dois testes de mesa para o programa da divisão.
Tabela 4.1: Teste de mesa do programa de divisão utilizando dividendo 21 e divisor 0.
Variáveis Comparação Sáıda
# [ ] dividendo divisor quociente divisor != 0
1 3 lixo lixo
2 4 lixo lixo lixo
3 6 lixo lixo lixo Entre com o dividendo e o divisor...
4 7 21 0 lixo
5 9 21 0 lixo Falso
6 15 21 0 lixo Imposśıvel fazer a divisão. O divisor ....
7 17 21 0 lixo Espera o pressionamento de alguma tecla
29
Tabela 4.2: Teste de mesa do programa de divisão utilizando dividendo 21 e divisor 4.
Variáveis Comparação Sáıda
# [ ] dividendo divisor quociente divisor != 0
1 3 lixo lixo
2 4 lixo lixo lixo
3 6 lixo lixo lixo Entre com o dividendo e o divisor...
4 7 21 4 lixo
5 9 21 4 lixo Verdadeiro
6 11 21 4 5.25
7 12 21 4 5.25 O quociente é: 5.25
8 17 21 4 5.25 Espera o pressionamento de alguma tecla
2. Programa de uma calculadora de 4 operações aritméticas: adição, subtração, multiplicação e
divisão. A entrada segue o seguinte formato: operando operador operando. Exemplo: se o
usuário entrar com 5∗7 será impresso “O resultado da multiplicação é: 35”. Caso o operador
seja inválido, emita uma mensagem.
Listing 4.6: Programa que simula uma calculadora de 4 operações aritméticas.
1 void main ( )
2 {
3 f loat n1 , n2 , r e s ;
4 char op ;
5
6 cout << "Digite NUMERO OPERADOR NUMERO: " ;
7 c in >> n1 >> op >> n2 ;
8
9 i f ( op == ’+’ )
10 {
11 r e s = n1 + n2 ;
12 cout << "O resultado da soma é: " << r e s ;
13 }
14 else i f ( op == ’-’ )
15 {
16 r e s = n1 − n2 ;
17 cout << "O resultado da subtraç~ao é: " << r e s ;
18 }
19 else i f ( op == ’/’ )
20 {
21 r e s = n1 / n2 ;
22 cout << "O resultado da divis~ao é: " << r e s ;
23 }
24 else i f ( op == ’*’ )
25 {
26 r e s = n1 ∗ n2 ;
27 cout << "O resultado da multiplicaç~ao é: " << r e s ;
28 }
29 else
30 cout << "Operador inválido!" ;
31
32 getch ( ) ;
33 } / / f i m ma i n
Nesteexemplo, existem várias expressões condicionais que, a partir do momento em que uma
é verdadeira, não há a necessidade de se verificar as demais, pois a variável op só pode ser
30
um dos operadores aritméticos ou um operador inválido (diferente dos demais). Assim, a
construção mais adequada para a resolução deste problema é o uso de estruturas condicionais
compostas encadeadas if - else. Por exemplo, se op é o caracter ‘#’ (teste de mesa na
Tabela 4.3), a expressão condicional da linha 9 resulta em falsa. Dáı a execução vai para
a linha 14, na qual é verificada outra expressão condicional, que também resulta em falsa.
Como op não é igual aos caracteres ‘/’ e ‘∗’, chega-se ao último else, no qual é impresso que
o operador é inválido.
Tabela 4.3: Teste de mesa da calculadora utilizando n1 igual a 15, n2 igual a 6 e op igual a ‘#’.
Variáveis Comparações Sáıda
# [ ] n1 n2 res op op == ‘+’ op == ‘-’ op == ‘/’ op == ‘+’
1 3 lixo lixo lixo
2 4 lixo lixo lixo lixo
3 6 lixo lixo lixo lixo Digite NUMERO ...
4 7 15 6 lixo ‘#’
5 9 15 6 lixo ‘#’ Falso
6 14 15 6 lixo ‘#’ Falso
7 19 15 6 lixo ‘#’ Falso
8 24 15 6 lixo ‘#’ Falso
9 29 15 6 lixo ‘#’
10 30 15 6 lixo ‘#’ Operador inválido!
11 32 15 6 lixo ‘#’ Espera o pressionamento...
Caso op seja o caracter ‘-’ (teste de mesa na Tabela 4.4), a expressão condicional da linha
9 resulta em falsa. Dáı a execução vai para a instrução de linha 14, na qual resulta em
verdadeira. Assim, como as demais instruções possuem else, a execução do programa vai
para a próxima instrução após eles, o getch(), que está na linha 32.
Tabela 4.4: Teste de mesa da calculadora utilizando n1 igual a 15, n2 igual a 6 e op igual a ‘-’.
Variáveis Comparações Sáıda
# [ ] n1 n2 res op op == ‘+’ op == ‘-’ op == ‘/’ op == ‘+’
1 3 lixo lixo lixo
2 4 lixo lixo lixo lixo
3 6 lixo lixo lixo lixo Digite NUMERO ...
4 7 15 6 lixo ‘-’
5 9 15 6 lixo ‘-’ Falso
6 14 15 6 lixo ‘-’ Verdadeiro
7 16 15 6 9 ‘-’
8 17 15 6 9 ‘-’ O resultado da subtração...
9 32 15 6 9 ‘-’ Espera o pressionamento...
4.3 Alternativa de estrutura condicional composta: switch
Embora construções if - else possam executar testes para escolha de uma entre várias alter-
nativas, muitas vezes são deselegantes. O comando switch tem um formato limpo e claro. Sua
forma geral é apresentada em Listing 4.7.
31
Listing 4.7: Forma geral da estrutura condicional switch
switch (nome da va r i á v e l )
{
case constante1 :
i n s t ru ç ã o 1 ;
i n s t ru ç ã o 2 ;
. . .
break ;
case constante2 :
i n s t ru ç ã o 3 ;
i n s t ru ç ã o 4 ;
. . .
break ;
default :
i n s t ru ç ã o 5 ;
i n s t ru ç ã o 6 ;
. . .
}
O comando switch possui as seguintes regras:
• O corpo de um switch deve estar entre chaves;
• Pode haver nenhuma, uma ou mais instruções seguindo cada caso. Geralmente, a última
instrução de um caso é break, que causa a sáıda imediata de todo o corpo do switch. Na
falta dele, todas as instruções após o caso escolhido serão executadas, mesmo as que pertencem
aos casos seguintes;
• switch testa a variável que deve ser do tipo int ou char;
• Não se pode usar uma variável ou expressão lógica como rótulo de caso (que vem após o
case). É apenas permitido constantes do tipo int ou char;
• Cada um dos cases pode ser considerado um if;
• Um caso default é opcional. Pode ser encarado como o else de todos os ifs. Ou seja, se
nenhum caso for satisfeito e existir um caso default, a execução começará nele.
4.3.1 Exemplos utilizando switch
1. Resolução da calculadora (Exemplo 2 da Seção 4.2.1 – pág. 30) utilizando switch.
Listing 4.8: Programa da calculadora de 4 operações aritméticas utilizando switch.
1 void main ( )
2 {
3 f loat n1 , n2 , r e s ;
4 char op ;
5
6 cout << "Digite NUMERO OPERADOR NUMERO: " ;
7 c in >> n1 >> op >> n2 ;
8
32
9 switch ( op )
10 {
11 case ’+’ :
12 r e s = n1 + n2 ;
13 cout << "O resultado da soma é: " << r e s ;
14 break ;
15 case ’-’ :
16 r e s = n1 − n2 ;
17 cout << "O resultado da subtraç~ao é: " << r e s ;
18 break ;
19 case ’/’ :
20 r e s = n1 / n2 ;
21 cout << "O resultado da divis~ao é: " << r e s ;
22 break ;
23 case ’*’ :
24 r e s = n1 ∗ n2 ;
25 cout << "O resultado da multiplicaç~ao é: " << r e s ;
26 break ;
27 default :
28 cout << "Operador inválido!" ;
29 } / / f i m s w i t c h
30
31 getch ( ) ;
32 } / / f i m ma i n
Os operadores são caracteres, por isso estão entre apóstrofos. Se a variável a ser analisada fosse
do tipo inteiro, não se deveria colocar apóstrofos entre as constantes. Verifique o comando
break após cada caso. Verifique também o default como última alternativa, ou seja, caso
op não seja igual a nenhum dos caracteres anteriores.
2. Suponha que se deseje permitir que o usuário do programa da calculadora utilize o sinal * ou
x para indicar multiplicação e o sinal / ou \ para indicar divisão.
Listing 4.9: Programa da calculadora de 4 operações aritméticas utilizando switch com alguns
casos sem break.
1 void main ( )
2 {
3 f loat n1 , n2 , r e s ;
4 char op ;
5
6 cout << "Digite NUMERO OPERADOR NUMERO: " ;
7 c in >> n1 >> op >> n2 ;
8
9 switch ( op )
10 {
11 case ’+’ :
12 r e s = n1 + n2 ;
13 cout << "O resultado da soma é: " << r e s ;
14 break ;
15 case ’-’ :
16 r e s = n1 − n2 ;
17 cout << "O resultado da subtraç~ao é: " << r e s ;
33
18 break ;
19 case ’\\’ :
20 case ’/’ :
21 r e s = n1 / n2 ;
22 cout << "O resultado da divis~ao é: " << r e s ;
23 break ;
24 case ’x’ :
25 case ’*’ :
26 r e s = n1 ∗ n2 ;
27 cout << "O resultado da multiplicaç~ao é: " << r e s ;
28 break ;
29 default :
30 cout << "Operador inválido!" ;
31 } / / f i m s w i t c h
32
33 getch ( ) ;
34 } / / f i m ma i n
Neste exemplo, alguns casos devem executar as mesmas instruções, dáı a construção de casos
sem break (linhas 19 e 24 ).
4.4 Exerćıcios
1. Faça um programa que apresente o menu de opções a seguir, permita ao usuário escolher a
opção desejada, receba os dados necessários para executar a operação e mostre o resultado.
Verifique a possibilidade de opção inválida e não se preocupe com restrições como salário
negativo. Faça duas soluções diferentes, uma com e outra sem switch.
Menu de opç~oes:
1. Imposto
2. Novo Salário
3. Classificaç~ao
Digite a opç~ao desejada
Na opção 1, receba o salário de um funcionário e calcule o valor do imposto usando as regras
a seguir:
Salários Percentual do imposto
Menor que R$500,00 5,00%
De R$500,00 a R$850,00 10,00%
Acima de R$850,00 15,00%
Na opção 2, receba o salário de um funcionário e calcule o valor do novo salário, usando as
regras a seguir:
34
Salário Aumento
Maiores que R$1500,00 R$ 25,00
De R$750,00 a R$1500,00 R$ 50,00
Abaixo de R$750,00 a R$450,00 R$ 75,00
Menores que R$450,00 R$ 100,00
Na opção 3, receba o salário de um funcionário e mostre sua classificação usando a tabela a
seguir:
Salário Classificação
Até R$700,00 Mal remunerado
Superior a R$700,00 Bem remunerado
2. A nota final de uma disciplina é calculada a partir de três notas atribúıdas respectivamente
a uma avaliação bimestral, a um trabalho de laboratório e a um seminário. A média das três
notas mencionadas anteriormente obedece aos pesos a seguir, respectivamente: 5, 3 e 2.
Faça um programa que receba as três notas, calcule e mostre a média ponderada e o conceito
que segue a tabela abaixo:
Média Ponderada Conceito
De 8,0 a 10,0 A
Abaixo de 8,0 até 7,0 B
Abaixo de 7,0 até 6,0 C
Abaixo de 6,0 até 5,0 D
Abaixo de 5,0 E
3. Nos cursos seqüenciais da Barão de Mauá a média final (MF ) de uma disciplina é calculada da
seguinte forma: MF = (NP +2×NE)/3, onde NP é a nota da prova e NE a nota do exame.
Para passar direto na disciplina a MF deverá ser no mı́nimo 5,0. Caso contrário, o aluno vai
para recuperação necessitando tirar pelo menos 5,0 pontos. Assim, faça um programa que
peça ao usuário o valor da NP , calcule e imprima a nota mı́nima que o aluno deverátirar na
NE. Em seguida, peça ao usuário a NE e verifique se o aluno está de recuperação ou não,
emitindo as mensagens correspondentes.
4. Uma definição precisa do peso ideal deve levar em conta vários fatores, como o sexo, a idade, a
atividade f́ısica e a constituição do organismo da pessoa. Existe, no entanto, um cálculo mais
simples, indicado pela Organização Mundial da Saúde, que é chamado de Índice de Massa
Corporal, ou IMC, que relaciona o peso e a altura do indiv́ıduo. Para chegar a esse número,
deve-se dividir o peso, medido em quilos, pelo quadrado da altura, em metros. Conforme o
valor de IMC, pode-se fazer parte de quatro faixas de peso. Uma delas indica o peso ideal,
que proporciona mais saúde.
(continua na próxima página...)
35
IMC Significa
Menos de 18,5 Abaixo do peso
De 18,5 a menor que 25 Peso ideal
De 25 a menor que 30 Sobrepeso
Maior ou igual a 30 Obesidade
Assim, faça um programa que calcule o IMC de dados passados pelo usuário, imprimindo a
qual faixa pertence.
5. Denomina-se equação do segundo grau a que possui a forma ax2 + bx + c, com coeficientes
numéricos a, b e c com a 6= 0. A fórmula do delta é: ∆ = b2 − 4ac. Após verificar a tabela
de exemplos e de propriedades, faça um programa que resolva equações do 2o grau pedindo
ao usuário os coeficientes e mostrando os devidos resultados. Para resolver raiz quadrada,
utilize a função sqrt(numero) da biblioteca math.h.
Tabela 4.5: Exemplos de coeficientes para equação do 20 grau.
Equação a b c
x2 + 2x + 1 1 2 1
5x− 2x2 − 1 5 -2 -1
Tabela 4.6: Propriedades
∆ = 0 Duas ráızes reais e iguais: x′ = x′′ = −b/(2a)
∆ < 0 Nenhuma raiz real
∆ > 0 Duas ráızes reais e diferentes: x′ = (−b +
√
∆)/(2a), x′′ = (−b−
√
∆)/(2a)
6. Faça um programa que, a partir de um mês fornecido (número inteiro de 1 a 12), apresente
o nome dele por extenso ou uma mensagem de mês inválido.
7. Faça um programa que seja capaz de dar a classificação oĺımpica de 3 páıses informados. Para
cada páıs é informada a quantidade de medalhas de ouro, prata e bronze. Considere que cada
medalha de ouro tem peso 3, cada prata tem peso 2 e cada bronze, peso 1.
36
CAṔITULO
5
Estruturas de Repetição
Existem situações em que é necessário repetir um determinado trecho de programa um número
de vezes ou até que algo aconteça. Veja os seguintes exemplos:
1. Suponha que um usuário deseje verificar a área de um número não determinado de triângulos.
O problema é que não se sabe a quantidade exata de triângulos. Se fosse implementado um
programa que verificasse a área de apenas um triângulo, o usuário teria que executá-lo quantas
vezes fosse necessário, saindo e entrando novamente no programa. Assim, será que é posśıvel
implementar um programa que repetisse a verificação enquanto o usuário desejasse, fazendo-
lhe uma pergunta como “Deseja verificar área de outro triângulo?”.
2. Suponha que o objetivo de um programa seja calcular e imprimir a tabuada do 4. Verifique
que existem repetições, como a impressão “4×” e o cálculo da multiplicação. Se fosse im-
plementado um programa com o conhecimento até agora adquirido, seria repetido 11 vezes
(4× 0,..., 4× 10) o mesmo código da multiplicação.
3. Suponha que se deseje calcular a soma de idades de um número indeterminado de pessoas em
que o usuário digita uma idade inválida (0 ou um número negativo) quando deseja encerrar
a entrada das idades. Assim, repetem-se a entrada e o cálculo da soma, terminando quando
o usuário digita uma idade inválida.
Assim, toda vez que se identifica um comportamento de repetição, seja expĺıcito ou não, devem-
se utilizar as estruturas de repetição para generalizar tal comportamento, utilizando, assim, uma
correta lógica de programação. Caso o programador não utilize essas estruturas, estará repetindo
trechos de códigos várias vezes, o que é trabalhoso, deselegante e muitas vezes inviável.
C++ possui três tipos de estruturas de repetição, também chamadas de loops ou laços:
1. for: recomendado quando há um número determinado de repetições.
2. while: recomendado quando há um número indeterminado de repetições.
3. do - while: também é recomendado quando há um número indeterminado de repetições,
mas possui diferença em relação ao while.
Apesar de cada laço ter a sua recomendação, todo problema pode ser resolvido com qualquer
laço. Existem diferenças entre eles, como na sintaxe e em seu próprio uso.
37
5.1 O laço for
Engloba três expressões em uma única e é útil principalmente quando se quer repetir algo um
número fixo de vezes.
Listing 5.1: Forma geral do laço for
for ( i n i c i a l i z a ç ã o ; expres s ã o c ond i c i ona l ; in /decremento )
i n s t ru ç ã o ; / / c o r p o d o l a ç o
Devem-se usar chaves se o corpo do laço tiver mais de uma instrução. Os parênteses seguindo
a palavra-chave for contêm três expressões separadas por pontos-e-v́ırgulas:
1. Inicialização: em sua forma mais simples, é uma instrução de atribuição (i = 0 em Listing
5.2) e é sempre executada uma única vez antes do laço ser iniciado.
2. Expressão condicional: é uma instrução de condição que controla o laço (i<=10 em Listing
5.2). Essa expressão é avaliada como verdadeira ou falsa toda vez que o laço for iniciado ou
reiniciado. Se verdadeira (diferente de zero), o corpo do laço é executado. Quando a expressão
tornar-se falsa (igual a zero), o laço é terminado e o controle passa para a instrução seguinte
ao laço.
3. in/decremento: define a maneira como a variável de controle do laço será alterada cada vez
que o laço é repetido (i++ em Listing 5.2), que pode ser um incremento ou decremento. Essa
instrução é executada, toda vez, imediatamente após a execução do corpo do laço.
5.1.1 Exemplo – Cálculo e impressão da tabuada do 4
Esse é um problema em que o laço for se adequa melhor: existe um número fixo de repetições.
Perceba que a tabuada pode ser generalizada para 4 × i, onde i varia de 0 a 10. Na Tabela 5.1 é
apresentado seu teste de mesa.
Listing 5.2: Resolução da tabuada do 4.
1 void main ( )
2 {
3 int i , prod ;
4
5 cout << "Tabuada do 4" ;
6 for ( i =0; i <=10; i++)
7 {
8 prod = 4 ∗ i ;
9 cout << "4 x " << i << " = " << prod ;
10 }
11 getch ( ) ;
12 }
38
Tabela 5.1: Teste de mesa para o programa da tabuada do 4 utilizando o laço for.
Variáveis Condição Sáıda
# [ ] i prod i <= 10
1 3 lixo lixo
2 5 lixo lixo Tabuada do 4
3 6 0 lixo V
4 8 0 0
5 9 0 0 4 x 0 = 0
6 6 1 0 V
7 8 1 4
8 9 1 4 4 x 1 = 4
9 6 2 4 V
10 8 2 8
11 9 2 8 4 x 2 = 8
... ... ... ... ... ...
6 10 36 V
8 10 40
9 10 40 4 x 10 = 40
6 11 40 F
11 11 40 Espera o pressionamento de alguma tecla...
5.2 O laço while
Se a expressão condicional for verdadeira (diferente de zero), o corpo do laço while é executado
uma vez e a expressão de teste é avaliada novamente. Quando há uma única instrução no corpo do
laço while, não é necessário o uso de chaves; porém, quando há mais de uma instrução é obrigatório
seu uso.
Listing 5.3: Forma geral do laço while
while ( expres s ã o c ond i c i ona l )
i n s t ru ç ã o ; / / c o r p o d o l a ç o
O ciclo de teste e execução é repetido até que a expressão de teste se torne falsa (igual a zero).
Então, o laço termina e o controle do programa passa para a linha seguinte ao laço.
O laço while pode utilizar os mesmos elementos do laço for, mas eles são distribúıdos de
maneira diferente no programa. Em geral, um laço while pode substituir um laço for da seguinte
forma:
Listing 5.4: Como o laço while pode substituir o laço for
i n i c i a l i z a ç ã o ;
while ( expres s ã o c ond i c i ona l )
{
. . .
in /decremento ;
. . .
}
39
5.2.1 Exemplos utilizando o laço while
1. O exemplo da tabuada do 4 resolvido com o laço while.
Listing 5.5: Programa da tabuada do 4 utilizando o laço while.
1 void main ( )
2 {
3 int i , prod ;
45 cout << "Tabuada do 4" ;
6 i =0; / / i n i c i a l i z a ç ã o
7 while ( i <=10) / / e x p r e s s ã o c o n d i c i o n a l
8 {
9 prod = 4 ∗ i ;
10 cout << "4 x " << i << " = " << prod ;
11 i++; / / i n c r e m e n t o
12 }
13 getch ( ) ;
14 }
Tabela 5.2: Teste de mesa para o programa da tabuada do 4 que utiliza while.
Variáveis Condição Sáıda
# [ ] i prod i <= 10
1 3 lixo lixo
2 5 lixo lixo Tabuada do 4
3 6 0 lixo
4 7 0 lixo V
5 9 0 0
6 10 0 0 4 x 0 = 0
7 11 1 0
8 7 1 0 V
9 9 1 4
10 10 1 4 4 x 1 = 4
11 11 2 4
... ... ... ... ... ...
7 10 36 V
9 10 40
10 10 40 4 x 10 = 40
11 11 40
7 11 40 F
13 11 40 Espera o pressionamento de alguma tecla...
2. A solução do terceiro exemplo do ińıcio deste caṕıtulo: “Suponha que se deseje calcular a
soma de idades de um número indeterminado de pessoas em que o usuário digita uma idade
inválida (0 ou um número negativo) quando deseja encerrar a entrada das idades”.
Listing 5.6: Programa que resolve o problema das idades.
1 void main ( )
2 {
3 int idade , soma ;
40
4
5 cout << "Entre com uma idade: " ;
6 c in >> idade ;
7
8 soma = 0 ;
9
10 while ( idade > 0)
11 {
12 soma = soma + idade ;
13
14 cout << "Entre com outra idade: " ;
15 c in >> idade ;
16 }
17
18 cout << "A soma das idades é: " << soma ;
19 getch ( ) ;
20 }
Verifique que na linha 12 foi utilizada a variável acumuladora soma para somar as idades
válidas. Note que há uma semelhança muito grande com contadores. A única diferença é
que na acumulação o valor adicionado pode variar (variável idade, no exemplo), enquanto
que na contagem o valor adicionado é constante (geralmente 1).
Foram realizados dois testes de mesa para esse programa nas Tabelas 5.3 e 5.4.
Tabela 5.3: Teste de mesa do programa das idades com as entradas 12, 20, 18 e 0, nesta ordem.
Variáveis Condição Sáıda
# [ ] idade soma idade > 0
1 3 lixo lixo
2 5 lixo lixo Entre com uma idade:
3 6 12 lixo
4 8 12 0
5 10 12 0 V
6 12 12 12
7 14 12 12 Entre com outra idade:
8 15 20 12
9 10 20 12 V
10 12 20 32
11 14 20 32 Entre com outra idade:
12 15 18 32
13 10 18 32 V
14 12 18 40
15 14 18 40 Entre com outra idade:
16 15 0 40
17 10 0 40 F
18 18 0 40 A soma das idades é: 40
19 19 0 40 Espera o pressionamento de alguma tecla...
41
Tabela 5.4: Teste de mesa do programa das idades com uma única entrada: zero.
Variáveis Condição Sáıda
# [ ] idade soma idade > 0
1 3 lixo lixo
2 5 lixo lixo Entre com uma idade:
3 6 0 lixo
4 8 0 0
5 10 0 0 F
18 18 0 0 A soma das idades é: 0
19 19 0 0 Espera o pressionamento de alguma tecla...
5.3 O laço do - while
É bastante similar ao while. O laço do - while cria um ciclo repetido até que a expressão de
teste seja falsa (igual a zero).
A diferença entre os dois laços é que no laço do - while o teste de condição é avaliado depois
do corpo do laço ser executado. Assim, o corpo do laço do - while é executado pelo menos uma
vez.
Listing 5.7: Forma geral do laço do - while
do{
/ / c o r p o d o l a ç o
i n s t ru ç ã o ;
}while ( expres s ã o c ond i c i ona l ) ;
Atenção: Não esqueça do ponto-e-v́ırgula após o fechamento de parêntese.
5.3.1 Exemplo usando o laço do - while
Suponha o primeiro exemplo do ińıcio deste caṕıtulo: “Suponha que um usuário deseje verificar
a área de um número não determinado de triângulos...”.
1 void main ( )
2 {
3 c l r s c r ( ) ;
4 f loat area , base , a l t u r a ;
5 char re sp ;
6
7 cout << "Calculo da area de triangulo\n" ;
8
9 do{
10 cout << "\nEntre com a base:" ;
11 c in >> base ;
12 cout << "Entre com a altura:" ;
13 c in >> a l tu r a ;
14
15 area = ( base ∗ a l tu r a ) / 2 ;
16
42
17 cout << "Resultado: " << area ;
18
19 cout << "\n\nDeseja calcular a area de outro triangulo?" ;
20 c in >> re sp ;
21 }while ( re sp == ’s’ ) ;
22
23 getch ( ) ;
24 }
Verifique que o corpo do laço do - while é executado pelo menos a primeira vez antes da
verificação da condição do laço. Acompanhe seu teste de mesa na Tabela 5.5.
Tabela 5.5: Teste de mesa para o programa de área de triângulos.
Variáveis Condição Sáıda
# [ ] area base altura resp resp == ‘s’
1 4 lixo lixo lixo
2 5 lixo lixo lixo lixo
3 7 lixo lixo lixo lixo Calculo da area de triangulo
4 10 lixo lixo lixo lixo Entre com a base:
5 11 lixo 10 lixo lixo
6 12 lixo 10 lixo lixo Entre com a altura:
7 13 lixo 10 5 lixo
8 15 25 10 5 lixo
9 17 25 10 5 lixo Resultado: 25
10 19 25 10 5 lixo Deseja calcular a area de outro triangulo?
11 20 25 10 5 s
12 21 25 10 5 s V
13 10 25 10 5 s Entre com a base:
14 11 25 20 5 s
15 12 25 20 5 s Entre com a altura:
16 13 25 20 3 s
17 15 30 20 3 s
18 17 30 20 3 s Resultado: 30
19 19 30 20 3 s Deseja calcular a area de outro triangulo?
20 20 30 20 3 n
21 21 30 20 3 n F
22 23 30 20 3 n Espera o pressionamento de alguma tecla...
43
5.4 Exerćıcios
1. Faça um programa que leia um número inteiro e calcule e mostre a tabuada desse número.
2. Faça um programa que leia a altura de 5 pessoas. Calcule e mostre a média das alturas
fornecidas pelo usuário. Faça duas soluções diferentes, uma com o laço for e outra com o
laço while.
3. Faça um programa que verifique e mostre quantos e quais números de 1000 a 2000 são diviśıveis
por 4.
4. Faça um programa que leia a idade e o sexo de um número não determinado de pessoas. A
digitação de entradas termina quando a idade ou o sexo for inválido. Idade inválida é aquela
negativa ou igual a zero. Sexo inválido é aquele diferente de ‘f ’ e de ‘m’. Calcule e mostre:
(a) a média de idade de todas as pessoas;
(b) a média de idade das mulheres;
(c) a média de idade dos homens.
5. Faça um programa que permita calcular a média final em uma disciplina de um número
não determinado de alunos. O programa deverá ser executado até que o usuário não deseje
mais verificar médias, aceitando como resposta válida ‘s’ ou ‘S’. A fórmula da média final é
ponderada e possui apenas duas notas, com pesos 1 e 2, respectivamente.
6. Faça um programa que apresente o seguinte menu ao usuário:
Menu:
1 verificar se numero é par ou ı́mpar
2 verificar se número é divisı́vel por 5 e por 7 ao mesmo tempo
3 - sair
O programa só será finalizado quando o usuário entrar com a opção 3. Caso a opção seja
inválida, emita uma mensagem.
7. Faça um programa que receba números inteiros, um por vez, calcule e mostre:
(a) a média dos números digitados;
(b) o maior número digitado;
(c) o menor número digitado;
(d) a média dos números pares.
A última entrada, que não entrará nos cálculos, contém valor superior a 1000 ou menor que
1.
8. Faça um programa que leia um número não determinado de pares de valores [m,n] inteiros,
um par de cada vez e calcule e mostre a soma de todos os números de m a n. A digitação de
pares termina quando m for maior ou igual a n.
9. Faça um programa que mostre as tabuadas dos números de 2 a 10.
10. Em um campeonato de futebol existem cinco times e cada time possui onze jogadores. Faça
um programa que leia a idade, o peso e a altura de cada um dos jogadores. Calcule e mostre:
(a) a quantidade de jogadores com idade inferior a 18 anos;
44
(b) a média das idades dos jogadores de cada time;
(c) a média das alturas de todos os jogadores do campeonato;
(d) a porcentagem de jogadores com mais de 80 quilos entre todos os jogadores do campe-
onato.
11. Imagine uma brincadeira entre dois colegas, na qual um pensa um número e o outro deve
fazer chutes até acertar o número imaginado. Como dica, a cada tentativa é dito se o chute
foi alto ou foi baixo. Faça um programa dentro deste contexto, que leia o número imaginado
e os chutes, ao final mostre quantas tentativas foram necessárias para descobrir o número.
12. Faça um programa que permita fazer um levantamento do estoque de vinhos de uma adega,
tendo como dados de entrada tipos de vinho, sendo: ‘T’ para tinto, ‘B’ para branco e ‘R’ para
rosê. Especifique a porcentagem de cada tipo sobre o total geral de vinhos; a quantidade de
vinhos

Mais conteúdos dessa disciplina