Você está na página 1de 109

Introducao a Programacao Algoritmos

Eduardo Gondo
2015

Sum
ario
1 Introduc
ao

11

1.1

Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.2

Variaveis e comandos de Entrada e Sada . . . . . . . . . . . . 18

1.3

Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2 Estrutura de selec
ao ou decis
ao

25

2.1

Comando condicional se (if) . . . . . . . . . . . . . . . . . . . 26

2.2

Expressao logica . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2.3

Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

3 Estruturas de repetic
ao

49

3.1

while (enquanto) . . . . . . . . . . . . . . . . . . . . . . . . . 50

3.2

do/while (repita/ate) . . . . . . . . . . . . . . . . . . . . . . . 62

3.3

for (para) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

3.4

Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

4 Vetor

73

4.1

Preliminares, definicao e exemplos . . . . . . . . . . . . . . . . 74

4.2

Exerccios: vetores de tipos basicos . . . . . . . . . . . . . . . 82

A Correc
ao dos exerccios da Introduc
ao
3

87

4
B Correc
ao dos exerccios do Capitulo 2

SUMARIO
95

Lista de Figuras
1.1

Jean Jennings Bartik (esq) e Frances Bilas Spence (dir)

. . . 12

1.2

Solucao do Problema 1.2 em VisualG . . . . . . . . . . . . . . 15

1.3

Solucao do Problema 1.2 em Java . . . . . . . . . . . . . . . . 16

1.4

Estrutura de um algoritmo . . . . . . . . . . . . . . . . . . . . 16

1.5

Solucao em VisualG do Problema 1.3 . . . . . . . . . . . . . . 17

1.6

Leitura dos dados de entrada do Problema 1.4 em VisualG . . 20

1.7

Algoritmo do Problema 1.4 com apenas 2 variaveis . . . . . . 21

2.1

Comando se em VisuAlg . . . . . . . . . . . . . . . . . . . . . 26

2.2

Comando if em Java . . . . . . . . . . . . . . . . . . . . . . . 26

2.3

Comando se/senao em VisuAlg . . . . . . . . . . . . . . . . . 27

2.4

Comando if/else em Java . . . . . . . . . . . . . . . . . . . . . 28

2.5

Dividindo 237 por 7 . . . . . . . . . . . . . . . . . . . . . . . . 30

2.6

Algoritmo em Visualg do Problema 2.1 . . . . . . . . . . . . . 30

2.7

Algoritmo em Visualg do Problema 2.1 . . . . . . . . . . . . . 31

2.8

Algoritmo em Java do Problema 2.1 . . . . . . . . . . . . . . . 32

2.9

solucao usando varios comandos se simples em VisuAlg . . . . 41

2.10 solucao usando varios comandos se simples em Java . . . . . . 42


2.11 solucao em VisuAlg com o comando se encadeado . . . . . . . 43
2.12 solucao em Java usando o comandos se encadeado . . . . . . . 44
5

LISTA DE FIGURAS
3.1

Solucao em Java do Problema 3.1 . . . . . . . . . . . . . . . . 51

3.2

Algoritmo em Java do Problema 3.1 . . . . . . . . . . . . . . . 52

3.3

Teste de mesa do Problema 3.1 . . . . . . . . . . . . . . . . . 53

3.4

Obtendo cada um dos dgitos do RM . . . . . . . . . . . . . . 54

3.5

Separando o u
ltimo dgito do RM . . . . . . . . . . . . . . . . 55

3.6

Separando os dois u
ltimos dgitos do RM . . . . . . . . . . . . 56

3.7

Solucao do Problema 3.2 . . . . . . . . . . . . . . . . . . . . . 57

3.8

Teste de mesa do Problema 3.2 . . . . . . . . . . . . . . . . . 58

3.9

Calculando md(24,15) . . . . . . . . . . . . . . . . . . . . . . 59

3.10 Rascunho de algoritmo do Problema 3.3 . . . . . . . . . . . . 60


3.11 Solucao do Problema 3.3 . . . . . . . . . . . . . . . . . . . . . 61
3.12 Teste de mesa do Problema 3.3 . . . . . . . . . . . . . . . . . 62
3.13 Solucao do Problema 3.4 . . . . . . . . . . . . . . . . . . . . . 64
3.14 Tentativa de imprimir os n
umeros de 1 a n . . . . . . . . . . . 66
3.15 Solucao do Problema 3.5 usando for . . . . . . . . . . . . . . . 67
3.16 Solucao do Problema 3.5 usando while . . . . . . . . . . . . . 67
3.17 Solucao do Problema 3.6 usando o for . . . . . . . . . . . . . . 68
3.18 Trecho de boleto bancario do Banco do Brasil . . . . . . . . . 71
4.1

Exemplo de preenchimento do vetor usando o for . . . . . . . 76

4.2

Solucao do Problema 4.2 . . . . . . . . . . . . . . . . . . . . . 77

4.3

Solucao do Problema 4.1 . . . . . . . . . . . . . . . . . . . . . 78

4.4

Solucao do Problema 4.3 . . . . . . . . . . . . . . . . . . . . . 80

4.5

Solucao do Problema 4.4 . . . . . . . . . . . . . . . . . . . . . 82

4.6

Solucao do Problema 4.4 . . . . . . . . . . . . . . . . . . . . . 83

Lista de Tabelas
2.1

Contribuicao do INSS 2014 . . . . . . . . . . . . . . . . . . . . 25

2.2

Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . 36

2.3

Tabela Verdade . . . . . . . . . . . . . . . . . . . . . . . . . . 39

2.4

Contribuicao do INSS 2014 . . . . . . . . . . . . . . . . . . . . 40

4.1

Contribuicao INSS 2014 . . . . . . . . . . . . . . . . . . . . . 85

LISTA DE TABELAS

Resumo
Este documento destina-se a servir como material de auxlio `a disciplina
funde Algoritmos do curso Tecnologia de Desenvolvimento de Sistemas. E
damental sua leitura assim como assistir as aulas e, principalmente, fazer os
exerccios propostos.
Algoritmos e raciocnio logico sao fundamentais para aprender a programar e, na minha opiniao, a programacao esta para o profissional de computacao assim como assentar tijolos esta para o pedreiro. Claro que voce
pode nao trabalhar com programacao ou nao gostar de programar mas voce
tem que saber programar1 .
Boa jornada a Todos nesse ano!

ainda mais pelo curso escolhido

10

LISTA DE TABELAS

Captulo 1
Introduc
ao
A medida que a Humanidade foi evoluindo, houve a necessidade de realizar milhares de operacoes matematicas com precisao e rapidez. Algumas situacoes que esses calculos foram necessarios: navegacao martima, maquinas
a vapor, censo demografico1 , sistema financeiro, decifrar mensagens criptografadas entre outras. Para ajudar o Homem nessas situacoes, algumas
coisasforam criadas: abaco, tabela de logaritmos, calculadora mecanica
ate chegar no computador.
Um dos primeiros computadores, o ENIAC, realizava em 1 segundo: 5000
somas, 357 multiplicacoes ou 38 divisoes. Ele foi construdo com o objetivo
de efetuar calculos balsticos para a Marinha Americana na epoca da 2a
Grande Guerra. Existiu outro computador, o Colossus, que foi construdo
na Inglaterra tambem na epoca da 2a Guerra que decifrava as mensagens
alemas criptografadas pela Enigma. Um dos responsaveis pelo projeto do
Colossus foi o matematico e criptoanalista Alan Turing que e considerado o
Pai da Ciencia da Computacao2 .
1

o censo de 1880 dos EUA demorou 7 anos para ser contabilizado e necessitou de 500
pessoas
2
recomendo voce a procurar informacoes sobre Alan Turing

11


CAPITULO 1. INTRODUC
AO

12

Apesar de terem sido construdos de forma independente, elas tinham


uma coisa em comum: a necessidade de programadores. Para operar (ou
melhor programar) o ENIAC e o Colossus eram necessarias pessoas com
profundo conhecimento sobre o problema e na solucao, lembrem-se que os
computadores eram apenas ferramentas para chegar no objetivo mais rapido.
Na figura 1.1 vemos as fotos de duas programadoras do Eniac.

Figura 1.1: Jean Jennings Bartik (esq) e Frances Bilas Spence (dir)
Daquele tempo ate os dias de hoje, a computacao e o computador tiveram
um grande avanco. Porem, ainda precisamos de pessoas capazes de:
1. entender um problema
2. encontrar e entender a solucao do problema
3. transcrever essa solucao em algoque o computador entenda
4. verificar se a resposta do computador esta correta
muito importante perceber que o computador em si nao resolve um
E
problema, encontrar uma solucao do problema e tarefa do ser humano. Chamamos de Algoritmo essa solucao e o objetivo desta apostila e das aulas e

1.1. ALGORITMO

13

mostrar como desenvolver um algoritmo que possa ser transformado em um


programa de computador.

1.1

Algoritmo

Segundo historiadores, a palavra algoritmo tem origem no sobrenome do


muito provavel que a palavra algarismo
matematico persa Al-Khwarizmi. E
tenha origem nesse mesmo matematico, mas deixando de lado a etimologia,
vamos `a definicao de algoritmo: uma sequencia de instruc
oes que sao executadas de forma finita com o objetivo de resolver um problema ou executar
uma ac
ao. Ou seja, um algoritmo e uma soluc
ao para o problema.
Diariamente, colocamos em pratica diversos algoritmos que aprendemos
com o objetivo de executar algumas tarefas do cotidiano: trocar de roupa,
escovar os dentes, dirigir um carro, vir `a Fiap, etc. Como exemplo, vamos
escrever as acoes para trocar um pneu furado:
Problema 1.1 Trocar um pneu furado.
Solucao
1. pegar o estepe, chave de roda e o macaco
2. afrouxar os parafusos do pneu furado
3. levantar o carro com o macaco
4. remover todos os parafusos do pneu furado e retira-lo
5. colocar o estepe no lugar e fixa-lo com os parafusos
6. abaixar o carro com o macaco


CAPITULO 1. INTRODUC
AO

14
7. apertar os parafusos

8. guardar o macaco, pneu furado e a chave de roda no carro


Trocar um pneu furado nao e um algoritmo que podemos executar no
computador, a seguir veja uma lista de problemas cujos algoritmos iremos
executar em um computador: equacao de 2o grau, somatoria de n
umeros, determinar se um n
umero e primo ou nao, calcular o mdc entre dois n
umeros,
calcular o media aritmetica de um conjunto de n
umeros, buscar um elemento
dentro de um conjunto, ordenar um conjunto de dados, jogo de baralho entre
outros. A maioria dos problemas esta relacionado com operacoes aritmeticas,
mas isso nao deve ser uma surpresa ja que o computador foi inventado exatamente com esse proposito.
O computador sozinho nao resolve nenhum problema, o que ele faz de
melhor e executar rapidamente e corretamente um algoritmo. O algoritmo
que o computador executa sao escritos por uma ou mais pessoas atraves do
que chamamos de linguagem de programac
ao. A linguagem de programacao
consiste de um conjunto de instrucoes que determinam o que o computador
deve fazer. Alguns exemplos de linguagem de programacao sao: Algol, Visual
Basic, Pascal, C, C++, C#, Lisp, Cobol, PHP, VisualG, Java, etc.
Comecaremos usando VisualG e depois passaremos a usar a linguagem
Java no aprendizado de algoritmos. Segue abaixo um exemplo de problema
e a sua solucao usando VisualG.

1.1. ALGORITMO

15

Problema 1.2 Somar dois n


umeros inteiros.
Soluc
ao
1
2
3
4
5
6
7
8
9
10
11

algoritmo " soma2 "


var
n1 , n2 , soma : inteiro
inicio
escreva ( " Informe 1 o n
u mero : " )
leia ( n1 )
escreva ( " Informe 2 o n
u mero : " )
leia ( n2 )
soma <- n1 + n2
escreva ( " A soma vale " , soma )
fimalgoritmo
Figura 1.2: Solucao do Problema 1.2 em VisualG
Agora, o mesmo algoritmo porem escrito na linguagem Java:
Os algoritmos que iremos estudar possuem a seguinte estrutura:
leitura dos dados (input)
processamento dos dados
resposta do problema (output)
A figura 1.4 temos um diagrama que ilustra essa estrutura:
Agora, veremos como devemos tratar os problemas cujos algoritmos queremos encontrar. Vamos ilustrar os passos atraves de um outro problema:
Problema 1.3 Escreva um algoritmo que calcula a area de um triangulo.
1. quais sao as informacoes que preciso para calcular a area de um triangulo,
ou seja, quais sao os dados de entrada
2. que operacoes devo fazer com os dados de entrada


CAPITULO 1. INTRODUC
AO

16
Solucao
1
2
3
4
5
6
7
8
9
10
11
12

...
...
public static void main ( String [] args ) {
Scanner entrada = null ;
entrada = new Scanner ( System . in ) ;
System . out . print ( " Informe 1 o num : " ) ;
int n1 = entrada . nextInt () ;
System . out . print ( " Informe 2 o num : " ) ;
int n2 = entrada . nextInt () ;
int soma = n1 + n2 ;
System . out . println ( " Soma
e " + soma ) ;
}
Figura 1.3: Solucao do Problema 1.2 em Java

Figura 1.4: Estrutura de um algoritmo


3. qual a resposta do problema, ou seja, o que meu algoritmo deve exibir
como resultado
Agora, as respostas dos itens acima:
1. a entrada consiste de duas medidas: a base e a altura
2. para obter a area, multiplico a base pela altura e divido por 2
3. o resultado da operacao anterior e a resposta do problema, basta eu
mostra-la na tela
Veja agora, o algoritmo escrito na linguagem de programacao:
Com base no algoritmo em VisualG podemos fazer algumas observacoes:

1.1. ALGORITMO

17

Soluc
ao
1
2
3
4
5
6
7
8
9
10
11
12

algoritmo " areaTriangulo "


var
base , altura , area : real
inicio
escreva ( " C
a lculo da
a rea do tri^
a ngulo " )
escreva ( " Informe base : " )
leia ( base )
escreva ( " Informe altura : " )
leia ( altura )
area <- base * altura / 2
escreva ( " A
a rea vale " , area )
fimalgoritmo
Figura 1.5: Solucao em VisualG do Problema 1.3
a execucao do algoritmo pelo computador e top-down, ou seja, a
execucao comeca na linha 1 e termina na linha 12
na linha 1 nomeamos nosso algoritmo, sempre use nomes que estejam
relacionados ao problema
na linha 3 temos a declaracao das variaveis que usaremos em nosso
algoritmo, as variaveis servem para armazenar dados
entre as linhas 4 e 12 temos as instrucoes do algoritmo, a maior parte
delas e composta dos comandos escreva e leia
os comandos escreva e leia sao os comandos que fazem a ponte entre
seu alosgoritmo e o usuario
a linha 10 e a instrucao responsavel pelo calculo, ela deve ser interpretada do seguinte modo: primeiro faco a multiplicacao e a divisao (`a
direita do <-) e depois coloco o resultado da operacao na variavel area


CAPITULO 1. INTRODUC
AO

18

o comando <- faz a atribuicao, ou seja, coloca um valor ou o resultado


de uma operacao em uma variavel
Voce pode notar pelos exemplos, que as operacoes matematicas dentro
da linguagem de programacao sao representadas pelos mesmos smbolos matematicos que ja estamos acostumados. So e preciso relembrar a existencia
de precedencia de operacoes e o agrupamento de operacoes e feito pelos
parenteses (nao use colchetes e nem chaves, apenas parenteses servem para
mudar a precedencia da operacao).
Na proxima secao, falaremos de outro elemento que estarao presentes em
nossos programas que sao as variaveis e os comandos de entrada e sada.

1.2

Vari
aveis e comandos de Entrada e Sada

Podemos dividir o computador em duas partes: software e hardware. De


modo simplificado e dentro do contexto de programacao podemos dizer que
os elementos que compoe o hardware sao: CPUs, memoria RAM, dispositivos de entrada (teclado) e dispositivos de sada (monitor). O software e
o responsavel por controlar os elementos de hardware, vamos utilizar os comandos vistos nos algoritmos anteriores para dar uma ideia do controle do
software sobre o hardware.
O comando escreva(<arg1>,<arg2>,...) e o responsavel por exibir
<arg1>, <arg2>, etc na tela do computador, ou seja, dentro de um algoritmo,
ao executar o comando escreva, tudo que estiver dentro dos parenteses sera
mostrado para o usuario. Os argumentos do comando escreva podem ser
tanto variaveis quanto uma cadeia de caracter (tudo que esta entre aspas).
Quando o computador executa o comando leia(<var>) ele para a execucao
do algoritmo e espera que o usuario informe o dado atraves do teclado. Esse


1.2. VARIAVEIS
E COMANDOS DE ENTRADA E SAIDA

19

dado e atribudo a variavel (<var>) e o computador da continuidade ao algoritmo.


A area de declaracao de variaveis e a que informa ao computador, quanto
da memoria RAM sera utilizada pelo algoritmo. Ate o momento, trabalhamos
com variaveis que apenas armazenam n
umeros, mas ha tambem variaveis que
dever do programador saber
cadeia de caracteres (String) e tipos logicos. E
qual o tipo de variavel que o problema requisita.
Abaixo segue uma lista dos tipos de dados que podemos usar na linguagem
VisuAlg:
inteiro: define variaveis numericas do tipo inteiro, ou seja, sem casas decimais.
real: define variaveis numericas do tipo real, ou seja, com casas decimais.
caractere: define variaveis do tipo string, ou seja, cadeia de caracteres.
logico: define variaveis do tipo booleano, ou seja, com valor VERDADEIRO
ou FALSO.
Vejamos mais um problema para exemplificar os comandos de entrada e
sada quanto a declaracao de variaveis.
Problema 1.4 Uma certa faculdade de informatica, usa tres notas de 0 a 10
com pesos 2, 3 e 5 para compor sua media semestral. Escreva um algoritmo
que dadas as tres notas imprime a media semestral.
Veja que precisamos de tres notas para calcular a media semestral, assim
seu algoritmo devera colocar as instrucoes para pedir que o usuario digite
bem natural pensar que deverao ser declaradas tres variaveis
tres notas. E
para armazenar as tres notas. Veja na figura 1.6 as instrucoes do que foi
discutido ate o momento:


CAPITULO 1. INTRODUC
AO

20
Solucao
1
2
3
4
5
6
7
8
9
10
11

algoritmo " mediaFiap "


var
ps , nac , am : real
inicio
escreva ( " NAC : " )
leia ( nac )
escreva ( " AM : " )
leia ( am )
escreva ( " PS : " )
leia ( ps )
fimalgoritmo
Figura 1.6: Leitura dos dados de entrada do Problema 1.4 em VisualG
Com as tres notas armazenadas nas variaveis vamos declarar mais uma
variavel que armazenara o resultado do calculo da media semestral:

1 algoritmo " mediaFiap "


2 var
3

ps , nac , am , ms : real

4 inicio
5

....

....

ms <- (2* nac + 3* am + 5* ps ) / 10

escreva ( " A m
e dia semestral vale " , ms )

9 fimalgoritmo
Imagine a situacao que a media semestral e composta por mais de tres
notas, sera que precisaramos criar o mesmo n
umero de variaveis para cada
nota que compoe a media semestral? Veja abaixo outro algoritmo do Problema 1.4 que usa menos variaveis.
Com relacao a este algoritmo podemos observar:

1.3. EXERCICIOS

21

Soluc
ao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

algoritmo " mediaFiap "


var
soma , nota : real
inicio
soma <- 0
escreva ( " NAC : " )
leia ( nota )
soma <- soma + nota * 2
escreva ( " AM : " )
leia ( nota )
soma <- soma + nota * 3
escreva ( " PS : " )
leia ( nota )
soma <- soma + nota * 5
nota <- soma / 10
escreva ( " A m
e dia semestral vale " , nota )
fimalgoritmo
Figura 1.7: Algoritmo do Problema 1.4 com apenas 2 variaveis
independente do n
umero de notas que irao compor a media, as variaveis
necessarias serao apenas soma e nota
nas linhas 8, 11 e 14 do algoritmo estamos somando as notas ponderadas
pelo peso, essa instrucao representa um acumulador e o seu uso e
muito frequente nos algoritmos

1.3

Exerccios

Recomendo que voce resolva os problemas primeiro no papel, ou seja,


certifique-se que voce determinou todas as variaveis e seus respectivos tipo
e entendeu todas as operacoes que deverao ser realizada antes de escrever o
algoritmo usando VisualG.


CAPITULO 1. INTRODUC
AO

22

1. Instale o VisualG no seu computador.


2. Digite os algoritmos desta apostila no VisualG e execute-os, nao recomendo usar Ctrl-c e Ctrl-v.
3. Escreva um algoritmo que recebe um n
umero x ele imprime x2 . Lembrese que x2 = x x.
4. Escreva um algoritmo que calcula a area e o permetro do crculo, use
3, 14 como valor de .
5. Alem das 4 operacoes matematicas, as linguagens de programacao possuem o operador resto da divisao. O resto da divisao e uma operacao
que envolve apenas n
umeros inteiros e, na linguagem VisualG, e representada pelo operador % ou o mod. Vejamos um exemplo:
1 a <- 47
2 b <- 7
3 x <- a % 3
4 escreva ( x )
5 x <- 63 % b
6 escreva ( x )
7 x <- a % b
8 escreva ( x )
Este algoritmo mostrara na tela os seguintes valores respectivamente:
2, 0 e 5.
Sua tarefa e desenvolver um algoritmo que recebe um n
umero inteiro
de 0 a 99 e imprime o dgito das dezenas e o dgito das unidades desse
n
umero. Dica: usando papel e lapis faca a divisao do n
umero por 10
mas nao coloque vrgula e nem acrescente 0 na divisao.

1.3. EXERCICIOS

23

6. Uma pessoa tem em seu guarda roupa x camisas, y calcas e z pares


de sapato. Escreva um algoritmo que calcula de quantas maneiras
diferentes ele pode se vestir. Seu algoritmo devera ler o n
umero de
camisas, o n
umero de calcas e o n
umero de pares de sapato.
7. Dados o preco de um produto e um percentual de desconto, escreva um
algoritmo que calcula e mostra o valor do desconto e o novo preco do
produto dado o percentual. E se, ao inves de um desconto, fosse um
aumento. O que muda no seu algoritmo?
8. Usain Bolt e o recordista mundial dos 100 metros rasos com o tempo de
9,58 segundos. Escreva um algoritmo que calcula a velocidade media
em m/s e em km/h de um corredor, seu algoritmo recebe como dados
de entrada a distancia em metros e o tempo em segundos.
9. Neste mes, Joao recebeu um aumento no salario, porem ele nao sabe
calcular o percentual de aumento. Voce devera escrever um algoritmo
que recebe 2 n
umeros reais representando os salarios antes e depois do
aumento e devera calcular e exibir o percentual de aumento que Joao
obteve.
10. O RM de um aluno da FIAP e composto por 5 dgitos. Sua tarefa
e escrever um algoritmo que recebe um RM e retorna a somatoria de
todos os dgitos do RM. Por exemplo, suponha que o aluno tenha o RM
56395, seu algoritmo devera imprimir como sada 28 = 5 + 6 + 3 + 9 + 5.
Dica: realize varias divisoes e restos de divisoes por 10.

24

CAPITULO 1. INTRODUC
AO

Captulo 2
Estrutura de selec
ao ou decis
ao
muito frequente no desenvolvimento de algoritmos nos encontrarmos
E
em um ponto de decisao. Ou seja, em algumas situacoes queremos fazer
uma verificacao em nosso algoritmo. Tal verificacao pode ser uma validacao
sobre os dados de entrada, por exemplo, se ha um algoritmo que pede para
o usuario digitar um salario sabemos que o salario nao pode ser negativo.
Outro tipo de uso da instrucao de selecao pode ser da propria natureza
do problema. Por exemplo, o desconto do INSS do trabalhador e calculado
com base na faixa salarial de acordo com a Tabela 2.1.
Assim, se um programador ganha 3.000,00 ele se encontra na alquota de
11% e sera descontado no valor de R$ 330,00 para fins de contribuicao ao
INSS. Outro exemplo, suponha que um analista de sistemas receba o salario
Tabela 2.1: Contribuicao do INSS 2014
salario contribuicao (em R$)

alquota (em %)

ate 1.317,07
de 1.317,08 a 2.195,12
de 2.195,13 a 4.390,24
acima de 4.390,24

8,00
9,00
11,00
R$ 482,92
25

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

26

de 5.000,00 ele devera contribuir com o valor de R$ 482,92 ao INSS.


Em um sistema de Departamento Pessoal, fatalmente sera necessario implementar um algoritmo para o desconto em folha do INSS do trabalhador.
E, dentro deste algoritmo, sera necessario verificarmos em qual faixa salarial
o trabalhador se encontra. Usaremos o comando condicional se/senao para
esta finalidade.

2.1

Comando condicional se (if )

Em nossos algoritmos aplicamos o comando se (if) de tres formas:


se simples
se/senao
se/senao encadeado
Vejamos a sintaxe de cada uma das formas em VisuAlg e em Java:

se simples
1 se ( < condicao >) entao
2
// bloco de instru
c~
o es
3 fimse
Figura 2.1: Comando se em VisuAlg

1 if ( < condicao >) {


2
// bloco de instru
c~
o es
3 }
Figura 2.2: Comando if em Java

2.1. COMANDO CONDICIONAL SE (IF)

27

Voce pode interpretar o comando se do seguinte modo: se a condic


ao for
verdadeira, executo as instrucoes que estao dentro do bloco de instruc
oes.
A <condicao> e uma expressao logica cujo resultado e verdadeiro ou
falso. E o bloco de instrucoes e o conjunto de instrucoes que estao subjugadas
ao comando se. No VisuAlg, o bloco de instrucoes esta determinado entre
o comando se e o fimse, ja na sintaxe do Java o bloco de instrucoes e
delimitado pelas chaves: { e }.
Note que, o comando se funciona como um desvio no seu codigo, ou seja,
algumas vezes as instrucoes dentro do bloco se serao executadas, outras vezes
nao serao, tudo dependera do resultado da <condicao>.

se/senao
1 se ( < condicao >) entao
2
// bloco de instru
c~
o es quando
3
// < condicao >
e verdadeira
4 senao
5
// bloco de instru
c~
o es quando
6
// < condicao >
e falsa
7 fimse
Figura 2.3: Comando se/senao em VisuAlg
A combinacao se/senao (if/else) implica que, pelo menos, um dos
blocos de instrucoes serao executados. Quando a expressao logica (<condicao>)
e verdadeira executa-se os as instrucoes que estao entre os comandos se e
senao, caso contrario as instrucoes executadas serao as que estao entre o
senao e o fimse. Tal combinacao e u
til quando e necessario executar instrucoes distintas de acordo com o resultado da expressao logica.
Note que o comando senao (else) somente vem apos um comando se
(if). A sintaxe nao permite um comando senao (else) sozinho.

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

28
1
2
3
4
5
6
7
8

if ( < condicao >) {


// bloco de instru
c~
o es quando
// < condicao >
e verdadeira
}
else {
// bloco de instru
c~
o es quando
// < condicao >
e falsa
}
Figura 2.4: Comando if/else em Java

se/senao encadeados
1 se ( < condicao1 >) entao
2

// bloco de instru
c~
o es quando

// < condicao1 >


e verdadeira

4 senao
5

se ( < condicao2 >) entao

// bloco de instru
c~
o es quando

// < condicao2 >


e verdadeira

8
9
10
11

senao
// bloco de instru
c~
o es quando
// < condicao1 > e < condicao2 > s~
a o falsas
fimse

12 fimse

2.1. COMANDO CONDICIONAL SE (IF)

29

1 if ( < condicao1 >) {


2

// bloco de instru
c~
o es quando

// < condicao1 >


e verdadeira

4 }
5 else if ( < condicao2 >) {
6

// bloco de instru
c~
o es quando

// < condicao2 >


e verdadeira

8 }
9 else {
10

// bloco de instru
c~
o es quando

11

// < condicao1 > e < condicao2 > s~


a o falsas

12 }
Nao ha limites na quantidade de comandos se que podemos encadear,
porem em uma situacao onde ha muitas condicoes coloque as que tem maior
probabilidade de serem verdadeiras no comeco; isso fara com que haja menos
comparacoes a serem executadas.

Exemplos
Veremos alguns exemplos ilustrango algumas situacoes de uso do comando
se, se/senao e se encadeado:
Problema 2.1 Dados dois n
umeros inteiros dividendo e divisor, escreva
um algoritmo que retorna o quociente e o resto do resultado da divisao entre
o dividendo e o divisor.
Vamos tomar um exemplo, considere dividendo = 237 e divisor = 7, veja
o resultado na Figura 2.5:

30

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

Figura 2.5: Dividindo 237 por 7


Porem, quando o divisor e igual a zero, nao e possvel efetuar a divisao.
Nessa situacao, nosso algoritmo somente deveria efetuar a divisao quando o
divisor e diferente de 0. Veja na Figura 2.6 a solucao em Visualg.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

algoritmo " divisao "


var
divisor , dividendo , resto , quociente : integer
inicio
escreva ( " dividendo : " )
leia ( dividendo )
escreva ( " divisor : " )
leia ( divisor )
se ( divisor <> 0) entao
quociente <- dividendo div divisor
resto <- dividendo mod divisor
escreva ( " Q = " , quociente , " R = " , resto )
fimse
fimalgoritmo
Figura 2.6: Algoritmo em Visualg do Problema 2.1
A linha 09 do algoritmo deve ser interpretada como: se divisor e diferente
de 0 entao calculo o quociente e o resto da divisao e mostro na tela. Se

2.1. COMANDO CONDICIONAL SE (IF)

31

voce testar para os n


umeros do exemplo, vera que o resultado e exatamente
conforme o esperado. Mas e se o usuario digitar o 0 no valor do divisor, nosso
programa nao mostrara nada. Vamos alterar o algoritmo colocando o senao,
veja como fica nosso programa na Figura 2.7:
1 algoritmo " divisao "
2 var
3
divisor , dividendo , resto , quociente : inteiro
4 inicio
5
escreva ( " dividendo : " )
6
leia ( dividendo )
7
escreva ( " divisor : " )
8
leia ( divisor )
9
se ( divisor <> 0) entao
10
quociente <- dividendo div divisor
11
resto <- dividendo mod divisor
12
escreva ( " Q = " , quociente , " R = " , resto )
13
senao // divisor
e igual a 0
14
escreva ( " Divisor igual a 0 , imposs
vel fazer a
divis~
ao ")
15
fimse
16 fimalgoritmo
Figura 2.7: Algoritmo em Visualg do Problema 2.1

Observe que o comando se sozinho pode ser interpretado como um desviodentro do algoritmo, ou seja, o quociente e o resto da divisao serao apenas
calculados se o divisor for diferente de zero. Caso o divisor seja zero, nada
sera calculado. Ja na segunda situacao, com o comando se combinado com
o senao, podemos interpretar como sendo uma bifurcacaodentro do algoritmo, ou seja, ou eu calculo o quociente e o resto ou eu mostro a mensagem
que e impossvel fazer a divisao.
Agora, veremos na Figura 2.8, a solucao do Problema 2.1 na linguagem
Java:

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

32

1 import java . util . Scanner ;


2
3 public class Divisao {
4
5
public static void main ( String args []) {
6
Scanner tec = new Scanner ( System . in ) ;
7
System . out . print ( " dividendo : " ) ;
8
int dividendo = tec . nextInt () ;
9
System . out . print ( " divisor : " ) ;
10
int divisor = tec . nextInt () ;
11
if ( divisor != 0) {
12
int quoc = dividendo / divisor ;
13
int resto = dividendo % divisor ;
14
System . out . println ( " Q = " + quoc + " R = " + resto ) ;
15
}
16
else {
17
System . out . println ( " Divis~
a o por 0 " ) ;
18
}
19
}
20 }
Figura 2.8: Algoritmo em Java do Problema 2.1
Vamos ver mais um exemplo de problema que testa a paridade de um
n
umero inteiro.
Problema 2.2 Dado um n
umero inteiro, escreva um algoritmo que verifica
se o n
umero e par.
Apenas coloquei a parte principal do algoritmo, declaracao de variaveis e
entrada de dados foram omitidas.
1 resto <- numero mod 2 // poderia ser numero % 2
2 se ( resto = 0) entao
3

escreva ( numero , "


e par " )

4 fimse

2.1. COMANDO CONDICIONAL SE (IF)

33

5
6 resto <- numero % 2;
7 if ( resto == 0) {
8

System . out . println ( numero + "


e par " ) ;

9 }

Se um n
umero nao e par as instrucoes nao mostram nada na tela. Porem,
combinando com o senao podemos colocar uma instrucao quando o n
umero
e mpar. Veja o complemento do exemplo:
1 se ( numero mod 2 = 0) entao
2

escreva ( numero , "


e par " )

3 senao
4

escreva ( numero , "


e
mpar " )

5 fimse
6
7 if ( numero % 2 == 0) {
8

System . out . println ( numero + "


e par " ) ;

9 }
10 else {
11

System . out . println ( numero + "


e
mpar " ) ;

12 }

Note que adicionamos `a condicao uma operacao aritmetica calculando


o resto da divisao, e possvel utilizar desse tipo de construcao, mas apenas
recomendo nos casos em que a operacao aritmetica e bem simples. A ordem
de execucao e primeiro a operacao aritmetica e depois e feita a comparacao
com o 0.

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

34

No problema da paridade de um n
umero inteiro, temos duas possibilidades
a decidir (par ou mpar), mas quando temos situacoes onde ha mais de dua
possibilidades? Nessa situacao usamos o comando se encadeado. O problema
que verifica se um certo n
umero e positivo, negativo ou nulo e um exemplo
dessa situacao.
Problema 2.3 Dado um n
umero real qualquer, escreva um algoritmo que
decida se o n
umero e positivo, negativo ou zero.
1 algoritmo " positivo "
2 var
3

numero : real

4 inicio
5

escreva ( " digite um n


u mero : " )

leia ( numero )

se ( numero > 0) entao

8
9
10
11
12
13
14
15

escreva ( numero , "


e positivo " )
senao
se ( numero < 0) entao
escreva ( numero , "
e negativo " )
senao
escreva ( numero , "
e nulo " )
fimse
fimse

16 fimalgoritmo
Vejamos mais alguns exemplos de uso do comando se:
Problema 2.4 Escreva um algoritmo que recebe o valor de um produto e
mostra o valor parcelado e o valor para pagamento `a vista com boleto. A loja

2.1. COMANDO CONDICIONAL SE (IF)

35

parcela em 6x sem juros e para pagamento `a vista com boleto da desconto


de 15%. Se o usuario informar um valor negativo, mostre uma mensagem
informando o problema.
Vamos ver a solucao em VisuAlg:
1 algoritmo " parcela "
2 var
3

valor , parcela , avista : real

4 inicio
5

escreva ( " Valor do produto : " )

leia ( valor )

se ( valor < 0) entao

escreval ( " Valor negativo ! " )

escreva ( " Imposs


vel calcular ! " )

10

senao

11

parcela <- valor / 6

12

avista <- valor - valor * 0.15

13

escreval ( " Valor parcelado : " , parcela )

14

escreva ( " Boleto : " , avista )

15

fimse

16 fimalgoritmo
Agora, o mesmo algoritmo em Java:
1 public static void main ( String args []) {
2

Scanner tec = new Scanner ( System . in ) ;

System . out . print ( " Valor produto : " ) ;

double valor = tec . nextDouble () ;

if ( valor < 0) {

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

36
6

System . out . println ( " Valor negativo ! " ) ;

System . out . println ( " Imposs


vel calcular ! " ) ;

else {

10

double parcela = valor / 6;

11

double avista = valor - valor * 0.15;

12

System . out . println ( " Parcela : " + parcela ) ;

13

System . out . println ( " Boleto : " + avista ) ;

14

15 }

2.2

Express
ao l
ogica

As expressoes logicas sao como expressoes aritmeticas porem, ao inves de


n
umeros como resultado elas retornam verdadeiro ou falso. Uma expressao
logica tem como objetivo relacionarmos dois ou mais elementos e, para essa
finalidade, utilizamos os operadores relacionais. A Tabela 2.2 contem os
operadores relacionais que utilizaremos para comparar as informacoes.
Tabela 2.2: Operadores relacionais
operador
VisuAlg
=
<
>
<>
<=
>=

Veja alguns exemplos:

operador
Java
==
<
>
!=
<=
>=

significado
igual
menor
maior
diferente
menor ou igual
maior ou igual

LOGICA

2.2. EXPRESSAO

37

1 soma > 0
2 num <> 1
3 valor = 23
4 nome <> " Joao "
5 area <= perimetro
6 x >= y
Ainda podemos combinar uma ou mais expressoes logicas utilizando os
operadores logicos: nao, e e ou (!, && e ||, respectivamente, em Java). O
operador logico nao e um operador unario, ou seja, ele e usado para inverter
o resultado de uma expressao logica. Ja os operadores e e ou sao operadores
binarios, ou seja, eles sao utilizados para combinar duas ou mais expressoes
com o objetivo de formar uma outra express
ao logica mais complexa. Vejamos
alguns exemplos:
1 soma > 0 e parcela <> 0
2 num <> 1 ou num <> 0
3 valor = 23 ou valor = 45
4 nome <> " Joao " e sobrenome = " Dias "
5 area <= perimetro e volume > dimensao
6 x >= y e y >= z ou z <> 10
Observe o exemplo da linha 6 que mistura o conector e com o ou. Ha uma
precedencia entre os conectores, primeiro deve ser resolvido o nao, e e depois
o ou. Quando utilizamos o comando se, em nossos algoritmos, pelo menos
uma expressao logica estara presente. Normalmente, essa expressao logica
realiza comparacoes entre variaveis e valores fixos ou apenas entre variaveis.
O Problema 2.5 nos mostra um exemplo de uso dos operadores logicos.
Problema 2.5 Escreva um algoritmo que calcula o salario lquido de um

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

38

trabalhador. Seu algoritmo recebe o salario bruto e o total de descontos e


devera mostrar o salario lquido. Note que, salario e descontos sao n
umeros
reais positivos, faca a validac
ao dos dados e avise ao usuario se ele colocar
um valor invalido.
Solucao em VisuAlg:
1 algoritmo salarioLiquido
2 var
3

salBruto , desconto , salLiquido : real

4 inicio
5

escreva ( " Digite o sal


a rio bruto : " )

leia ( salBruto )

escreva ( " Digite o total de descontos em R$ : " )

leia ( desconto )

se ( salBruto > 0 e desconto > 0) entao

10

salLiquido <- salBruto - desconto

11

escreva ( " Sal


a rio l
quido
e " , salLiquido )

12
13
14

senao
escreva ( " Informe um valor positivo do sal
a rio " )
fimse

15 fimalgoritmo
Solucao em Java:
1 public class Salario {
2
3

public static void main ( String args []) {

Scanner tec = new Scanner ( System . in ) ;

System . out . print ( " Sal


a rio bruto : " )

LOGICA

2.2. EXPRESSAO

39

double salBruto = tec . nextDouble () ;

System . out . print ( " Desconto : " )

double desconto = tec . nextDouble () ;

if ( salBruto > 0 && desconto > 0) {

10

double salLiquido = salBruto - desconto ;

11

System . out . println ( " Sal


a rio l
quido : " +
salLiquido ) ;

12

13

else {

14

System . out . println ( " Informe um valor positivo


do sal
a rio " ) ;

15

16

17 }
Na linha 09 dos dois algoritmos temos um exemplo de uma expressao
logica complexa utilizando o operador e. Note que, para que o resultado da
expressao logica complexa seja verdadeira, as duas expressoes logicas internas
devem ser verdadeiras. Considere que X e Y sejam duas expressoes logicas,
a Tabela 2.3 mostra um resumo de todas as combinacoes entre X e Y com
seu respectivo resultado.
Tabela 2.3: Tabela Verdade
X
V
V
F
F

Y
V
F
V
F

nao X (!X)
F
F
V
V

X e Y (X && Y) X ou Y (X || Y)
V
V
F
V
F
V
F
F

Para cada expressao logica abaixo, julgue verdadeiro ou falso. Considere

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

40

a = 5, b = 7, c = 4 e d = 81 :
1. (a b) e (b < d)
2. (a = b) ou (c = b)
3. (d > a) e (c b)
4. (a b) ou (c d)
5. ((b > c) ou (c < a)) e (d b)
Vamos voltar ao exemplo do incio do captulo:
Problema 2.6 Escreva um algoritmo que le o salario de um funcionario
e calcula o desconto aplicado para sua contribuic
ao ao INSS. Use a tabela
abaixo para determinar a alquota de contribuic
ao.
Tabela 2.4: Contribuicao do INSS 2014

salario contribuicao (em R$)

alquota (em %)

ate 1.317,07
de 1.317,08 a 2.195,12
de 2.195,13 a 4.390,24
acima de 4.390,24

8,00
9,00
11,00
R$ 482,92

Gabarito: V, V, F, V, F

LOGICA

2.2. EXPRESSAO

41

Solucao em VisuAlg:
1 algoritmo " previdencia "
2 var
3
// nunca use acento ou espa
c o nos nomes das
vari
a veis
4
salario , contribuicao : real
5 inicio
6
escreva ( " Digite o sal
a rio : " )
7
leia ( salario )
8
se (( salario >= 0) e ( salario <= 1317.07) ) entao
9
contribuicao <- salario * 0.08
10
fimse
11
se (( salario >= 1317.08) e ( salario <= 2195.12) )
entao
12
contribuicao <- salario * 0.09
13
fimse
14
se (( salario >= 2195.13) e ( salario <= 4390.24) )
entao
15
contribuicao <- salario * 0.11
16
fimse
17
se ( salario > 4390.24) entao
18
contribuicao <- 4390.24 * 0.11
19
fimse
20
escreval ( " O desconto do INSS ser
a de R$ " ,
contribuicao )
21 fimalgoritmo
Figura 2.9: solucao usando varios comandos se simples em VisuAlg

42

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO
Solucao em Java:

1 import java . util . Scanner ;


2
3 public class Previdencia {
4
5
public static void main ( String [] args ) {
6
Scanner tec = new Scanner ( System . in ) ;
7
System . out . print ( " Digite o sal
a rio : " ) ;
8
double salario = tec . nextDouble () ;
9
double contribuicao = 0;
10
if ( salario >= 0 && salario <= 1317.07) {
11
contribuicao = salario * 0.08;
12
}
13
if ( salario >= 1317.08 && salario <= 2195.12) {
14
contribuicao = salario * 0.09;
15
}
16
if ( salario >= 2195.13 && salario <= 4390.24) {
17
contribuicao = salario * 0.11;
18
}
19
if ( salario > 4390.24) {
20
contribuicao = 4390.24 * 0.11;
21
}
22
System . out . println ( " O desconto INSS ser
a de " +
contribuicao ) ;
23
}
24 }
Figura 2.10: solucao usando varios comandos se simples em Java
Note que as solucoes usando o comando se simples implicam no teste
de todas as condicoes mesmo quando o salario se encontra na 1a faixa de
contribuicao. Se usarmos o comando se de forma encadeada as condicoes
que serao testadas serao apenas as necessarias para encontrar a faixa de
contribuicao do trabalhador.

LOGICA

2.2. EXPRESSAO

43

Solucao em VisuAlg usando o comando se encadeado.


1 algoritmo " previdencia "
2 var
3
// nunca use acento ou espa
c o nos nomes das
vari
a veis
4
salario , contribuicao : real
5 inicio
6
escreva ( " Digite o sal
a rio : " )
7
leia ( salario )
8
se (( salario >= 0) e ( salario <= 1317.07) ) entao
9
contribuicao <- salario * 0.08
10
senao
11
se ( salario <= 2195.12) entao
12
contribuicao <- salario * 0.09
13
senao
14
se ( salario <= 4390.24) entao
15
contribuicao <- salario * 0.11
16
senao
17
contribuicao <- 4390.24 * 0.11
18
fimse
19
fimse
20
fimse
21
escreval ( " O desconto do INSS ser
a de R$ " ,
contribuicao )
22 fimalgoritmo
Figura 2.11: solucao em VisuAlg com o comando se encadeado

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

44

Solucao em Java usando o comando se encadeado:


1 import java . util . Scanner ;
2
3 public class Previdencia {
4
5
public static void main ( String [] args ) {
6
Scanner tec = new Scanner ( System . in ) ;
7
System . out . print ( " Digite o sal
a rio : " ) ;
8
double salario = tec . nextDouble () ;
9
double contribuicao = 0;
10
if ( salario >= 0 && salario <= 1317.07) {
11
contribuicao = salario * 0.08;
12
}
13
else if ( salario <= 2195.12) {
14
contribuicao = salario * 0.09;
15
}
16
else if ( salario <= 4390.24) {
17
contribuicao = salario * 0.11;
18
}
19
else {
20
contribuicao = 4390.24 * 0.11;
21
}
22
System . out . println ( " O desconto INSS ser
a de " +
contribuicao ) ;
23
}
24 }
Figura 2.12: solucao em Java usando o comandos se encadeado

2.3

Exerccios

Voce pode resolver os exerccios usando a linguagem VisuAlg ou a linguagem Java.


1. Faca um algoritmo que receba um n
umero e mostre uma mensagem
caso este n
umero seja maior que 10.

2.3. EXERCICIOS

45

2. Escrever um algoritmo que leia dois valores inteiro distintos e informe


qual e o maior ou se houve um empate.
3. Determine a sada de cada um dos codigos abaixo SEM EXECUTAR no computador, sabendo que A <- 5, B <- 3 e C <- 1. Dica:
primeiro resolva a expressao aritmetica dentro do argumento do comando escreva e depois mostre o resultado.
(a) se ( A >= 5) entao
se ( B < 10) entao
escreva ( A + B + C )
senao
escreva ( B + C )
fimse
senao
escreva ( A + B )
fimse

46

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO
(b) se ( A < 2) entao
se ( C > 2) entao
escreva ( A + B + C )
senao
escreva ( B + C )
fimse
senao
se ( B = 4) entao
escreva ( A * 2)
senao
escreva ( C * 5)
fimse
fimse

4. Escreva um algoritmo para ler o nome de 2 times e o n


umero de gols
marcados em uma partida. Escrever o nome do vencedor. Caso nao
haja vencedor devera ser impresso a palavra EMPATE.
5. A jornada de trabalho semanal e de 40 horas. O funcionario que trabalhar mais de 40 horas recebera hora extra, cujo valor e o valor da hora
regular com um acrescimo de 50%. Escreva um algoritmo que leia o
n
umero de horas trabalhadas em um mes, o salario por hora e escreva
o salario total do funcionario (considere que o mes possua 4 semanas
exatas).
6. Faca um programa para ler dois n
umeros inteiros A e B e informar se
A e divisvel por B.
7. A raiz quadrada e uma operacao que apenas aceita n
umeros positivos.

2.3. EXERCICIOS

47

Escreva um algoritmo que le um n


umero qualquer e retorna a raiz
quadrada desse n
umero se possvel. Use a funcao RaizQ(numero) para
calcular a raiz quadrada em VisuAlg ou Math.sqrt(numero) para Java.
8. Escreva um algoritmo que recebe a idade de um nadador e mostra sua
categoria conforme a tabela a seguir:
Categoria
Infantil
Juvenil
Adolescente
Adulto
Senior

Idade
5a7
8 a 10
11 a 15
16 a 30
acima de 30

9. Uma equacao de 2o grau e da forma: ax2 + bx + c = 0, onde a = 0.


Escreva um algoritmo que recebe os tres coeficientes da equacao, calcula
e imprime as razes reais se for possvel. Use a seguinte formula para
resolver a equacao:

= b2 4ac

b +
x1 =
2a
b
x2 =
2a

OU DECISAO

CAPITULO 2. ESTRUTURA DE SELEC


AO

48

10. Escreva um algoritmo que calcule o que deve ser pago por um produto,
considerando o preco normal de etiqueta e a escolha da condicao de pagamento. Utilize os codigos da tabela a seguir para ler qual a condicao
de pagamento escolhida e efetuar o calculo adequado.
codigo
1
2
3
4

condicao de pagamento
A vista em dinheiro ou cheque, recebe 10% de desconto
A vista no cartao de credito, recebe 5% de desconto
Em duas vezes, preco normal de etiqueta sem juros
Em quatro vezes, preco normal de etiqueta mais juros de 7%

11. Faca um algoritmo que leia as medias semestrais obtidas por um aluno
na disciplina de Algoritmos, o n
umero de aulas ministradas e o n
umero
de aulas assistidas por este aluno nesta disciplina. Calcule e mostre a
media final deste aluno e diga se ele foi aprovado ou reprovado ou esta
de exame segundo os criterios da FIAP inclusive levando-se em conta
a frequencia.
12. Desenvolva um algoritmo que informe se uma data e valida ou nao. O
algoritmo devera ler 2 n
umeros inteiros, que representem o dia e o mes
e informar se e um dia do mes valido. Desconsidere os casos de ano
bissexto, ou seja, fevereiro tem 28 dias.
13. Escreva um algoritmo que recebe tres n
umeros inteiros e imprime eles
em ordem crescente.

Captulo 3
Estruturas de repetic
ao
A man provided with paper,
pencil, and rubber, and subject
to strict discipline, is in eect a
universal machine.
Alan Mathison Turing

Estruturas de repeticao sao recursos da linguagem de programacao que


permitem que um conjunto de instrucoes sejam executadas repetidas vezes.
Os comandos de repeticao, tambem conhecidos por lacos, sao os responsaveis
por repetir um determinado conjunto de instrucoes determinada por uma
condic
ao 1 . Sao tres comandos de repeticao existentes na linguagem Java:
while (enquanto), for (para) e do/while (repita/ate).
Neste captulo apresentaremos a sintaxe basica desses tres comandos,
mostraremos seu uso atraves de exemplos de problemas e tambem havera
exerccios de fixacao. A partir deste captulo, usaremos a linguagem Java
como ferramenta principal para desenvolver os algoritmos. O VisuAlg sera
apenas utilizado para apresentar a sintaxe dos comandos de repeticao.
1

a mesma do comando if

49


CAPITULO 3. ESTRUTURAS DE REPETIC
AO

50

3.1

while (enquanto)

O comando while e o comando mais generico dentre os comandos de


repeticao, ou seja, qualquer algoritmo onde e necessario o uso de comandos
de repeticao pode ser resolvido com o while. Segue abaixo a sintaxe basica
do comando while.
1 while ( < condicao >) {
2
// coloque aqui as instru
c~
o es
3
// que ser~
a o executadas enquanto
4
// a < condicao > for verdadeira
5 }

A interpretacao do comando while: enquanto a <condicao> for verdadeira, executo as instrucoes dentro do bloco2 . Como a 1a acao do comando
while e testar a condicao, e possvel que as instrucoes dentro do bloco podem
nunca ser executadas, para isso basta que a condicao seja falsa. Vejamos a
forma de utilizacao do while em VisuAlg.
1 enquanto ( < condicao >) faca
2
// coloque aqui as instru
c~
o es
3
// que ser~
a o executadas enquanto
4
// a < condicao > for verdadeira
5 fimenquanto

No VisuAlg, o bloco de instrucoes sao definidos pelas palavras reservadas enquanto e fimenquanto. Vamos trabalhar o comando while com um
problema que ja foi visto em sala de aula.
Problema 3.1 Dados uma sequencia de 5 n
umeros inteiros. Calcule a soma
de todos os n
umeros da sequencia.
2

em Java o bloco de instrucoes sao delimitados por chaves: { e }

3.1. WHILE (ENQUANTO)

51

Segue abaixo um algoritmo, ja apresentado em sala de aula, desse problema. Observe que nos eslaides ele foi resolvido em VisuAlg mas dessa vez
apresentaremos em Java:
1 import java . util . Scanner ;
2
3 public class Soma5 {
4
5
public static void main ( String [] args ) {
6
Scanner tec = new Scanner ( System . in ) ;
7
int soma = 0;
8
int num ;
9
System . out . println ( " Digite n
u mero : " ) ;
10
num = tec . nextInt () ;
11
soma = soma + num ;
12
System . out . println ( " Digite n
u mero : " ) ;
13
num = tec . nextInt () ;
14
soma = soma + num ;
15
System . out . println ( " Digite n
u mero : " ) ;
16
num = tec . nextInt () ;
17
soma = soma + num ;
18
System . out . println ( " Digite n
u mero : " ) ;
19
num = tec . nextInt () ;
20
soma = soma + num ;
21
System . out . println ( " Digite n
u mero : " ) ;
22
num = tec . nextInt () ;
23
soma = soma + num ;
24
System . out . println ( " O valor
e " + soma ) ;
25
}
26 }
Figura 3.1: Solucao em Java do Problema 3.1
Observe as 5 repeticoes das instrucoes:
1
2
3

System . out . println ( " Digite n


u mero : " ) ;
num = tec . nextInt () ;
soma = soma + num ;


CAPITULO 3. ESTRUTURAS DE REPETIC
AO

52

Essa e uma situacao onde poderamos colocar tais instrucoes dentro de um


while (enquanto) e controlar, atraves da condicao, a quantidade de vezes que
as instrucoes sao executadas. A Figura 3.2 ilustra a codificacao do algoritmo.
1 public static void main ( String [] args ) {
2
Scanner tec = new Scanner ( System . in ) ;
3
int soma = 0;
4
int num ;
5
int qtd = 1;
6
while ( qtd <= 5) {
7
System . out . println ( " Digite n
u mero : " ) ;
8
num = tec . nextInt () ;
9
soma = soma + num ;
10
qtd = qtd + 1;
11
}
12
System . out . println ( " O valor
e " + soma ) ;
13 }
Figura 3.2: Algoritmo em Java do Problema 3.1
Adicionei a variavel qtd que funcionara como um contador controlando a
quantidade de vezes que as instrucoes serao executadas, note a inicializacao
dela antes do comando while e sua atualizacao em uma unidade na linha 10
dentro do bloco de repeticao. A variavel qtd e o que chamamos de contador.
Tambem chamamos de iterac
ao 3 a cada execucao das instrucoes contidas no
bloco do while.
A Figura 3.3 mostra o Teste de mesa do algoritmo. Utilizamos a sequencia
de 5 n
umeros: 3, 4, 2, 1 e 2 para ilustrar a execucao do algoritmo.

pode soar estranho mas e iteracao mesmo

3.1. WHILE (ENQUANTO)

53

(a) Valor inicial das variaveis

(b) 1a iteracao

(c) 2a iteracao

(d) 3a iteracao

(e) 4a iteracao

(f) 5a iteracao

Figura 3.3: Teste de mesa do Problema 3.1

Na 5a e u
ltima iteracao da repeticao, a variavel qtd assume o valor 6 que


CAPITULO 3. ESTRUTURAS DE REPETIC
AO

54

torna a expressao booleana qtd <= 5 falsa. A execucao do algoritmo sai do


laco while e mostra 8 como resposta que e o valor da variavel soma.
Vamos pegar um outro problema que ja foi visto no 1o Captulo.
Problema 3.2 O RM de um aluno da FIAP e composto por 5 dgitos. Sua
tarefa e escrever um algoritmo que recebe um RM e retorna a somatoria
de todos os dgitos do RM. Por exemplo, suponha que o aluno tenha o RM
56395, seu algoritmo devera imprimir como sada 28 = 5 + 6 + 3 + 9 + 5.
Dica: realize varias divisoes e restos de divisoes por 10.
A Figura 3.4 representa a solucao do Problema 3.2 feita no papel. Note
que, para obter cada um dos dgitos do RM e feito uma sequencia de divisoes
por 10 onde sao armazenados o resto e o quociente. O resto e o dgito do RM
que sera acumulado e o quociente torna o proximo n
umero a ser dividido.
Esse processo para quando o n
umero a ser divido e zero.

Figura 3.4: Obtendo cada um dos dgitos do RM


Ao inves de pensar no processo completo ja com o comando de repeticao,
tentarei resolver o problema de separa apenas o u
ltimo dgito do RM, veja
na Figura 3.5 o codigo para essa finalidade.
Na linha 09 do algoritmo a operacao executada e a divisao inteira4 pois
4

o div do VisuAlg

3.1. WHILE (ENQUANTO)

55

1 public class RM {
2
3
public static void main ( String args []) {
4
// objeto que l^
e informa
c~
o es do teclado
5
Scanner tec = new Scanner ( System . in ) ;
6
int resto ;
7
System . out . println ( " Digite o RM : " ) ;
8
int rm = tec . nextInt () ;
9
resto = rm % 10;
10
rm = rm / 10;
11
System . out . println ( " D
gito : " + resto ) ;
12
System . out . println ( " RM restante : " + rm ) ;
13
}
14 }
Figura 3.5: Separando o u
ltimo dgito do RM
tanto o numerador e denominador sao n
umeros inteiros, alem disso, aproveito
a mesma variavel rm para armazenar o quociente da divisao. Se executarmos
esse codigo para a entrada 56395 serao impressos as informacoes:
D
gito: 5
RM restante: 5639
Melhorando o algoritmo anterior, poderamos mostrar os dois u
ltimos
dgitos do RM, veja na Figura 3.6 a solucao e note a repeticao das instrucoes
das linhas 10 a 13 com as linhas 15 a 18.


CAPITULO 3. ESTRUTURAS DE REPETIC
AO

56

1 public class RM {
2
3
public static void main ( String args []) {
4
// objeto que l^
e informa
c~
o es do teclado
5
Scanner tec = new Scanner ( System . in ) ;
6
int resto ;
7
System . out . println ( " Digite o RM : " ) ;
8
int rm = tec . nextInt () ;
9
10
11
resto = rm % 10;
12
rm = rm / 10;
13
System . out . println ( " D
gito : " + resto ) ;
14
System . out . println ( " RM restante : " + rm ) ;
15
16
resto = rm % 10;
17
rm = rm / 10;
18
System . out . println ( " D
gito : " + resto ) ;
19
System . out . println ( " RM restante : " + rm ) ;
20
}
21 }
Figura 3.6: Separando os dois u
ltimos dgitos do RM
Faca o teste de mesa e certifique-se que a sada do algoritmo sera:
D
gito: 5
RM restante: 5639
D
gito: 9
RM restante: 563

Para imprimir todos os dgitos do RM temos que executar mais vezes


as instrucoes que se repetem. Ate que momento devemos executa-las? Elas
serao executadas ate que o valor da variavel rm seja igual a 0, ou seja, enquanto rm != 0 continuo a execucao das mesmas.
Note que, caso o usuario digite 0 no RM, nenhuma instrucao dentro do
bloco do while sera executada pois a condicao e falsa. Contudo, ainda

3.1. WHILE (ENQUANTO)

57

assim o algoritmo mostra a resposta correta. Veja na Figura 3.7 a solucao ja


acumulando os dgitos do RM.
1 public class RM {
2
3
public static void main ( String args []) {
4
Scanner tec = new Scanner ( System . in ) ;
5
int resto ;
6
System . out . println ( " Digite o RM : " ) ;
7
int rm = tec . nextInt () ;
8
int soma = 0;
9
while ( rm != 0) {
10
resto = rm % 10;
11
soma = soma + resto ;
12
rm = rm / 10;
13
}
14
System . out . println ( " Soma do RM : " + soma ) ;
15
}
16 }
Figura 3.7: Solucao do Problema 3.2
Vamos fazer o teste de mesa do algoritmo supondo que o RM digitado
e 56395. A Figura 3.8 mostra o incio do algoritmo e as varias iteracoes do
while.

58

CAPITULO 3. ESTRUTURAS DE REPETIC


AO

(a) Valor inicial das variaveis

(b) 1a iteracao

(c) 2a iteracao

(d) 3a iteracao

(e) 4a iteracao

(f) 5a iteracao

Figura 3.8: Teste de mesa do Problema 3.2

Problema 3.3 Dados dois n


umeros inteiros a e b, escreva um algoritmo que
calcula o maximo divisor comum entre a e b.

3.1. WHILE (ENQUANTO)

59

Antes de construir o algoritmo vamos relembrar como e calculado o maximo


divisor comum entre dois n
umeros, como exemplo, vamos calcular o mdc de
24 e 15. As figuras abaixo demonstram o processo de calculo.

(a) 1a divisao

(b) 2a divisao

(c) 3a divisao

(d) 4a divisao

(e) 5a divisao

Figura 3.9: Calculando md(24,15)

60

CAPITULO 3. ESTRUTURAS DE REPETIC


AO
Na 1a linha da grade temos os quocientes das divisoes que nao serao

utilizados no processo. Na 2a linha temos os n


umeros que serao os dividendos
e divisores, enquanto na 3a linha temos os restos das divisoes. Observe que os
restos das divisoes sao fundamentais no processo de calculo. Na imagem (a)
temos a 1a divisao entre 24 e 15, como o resto e 9 (= 0) e necessario uma 2a
divisao. Nessa 2a divisao o divisor da 1a torna-se o dividendo e o resto vira
o divisor, observe na imagem (b) a divisao do 15 por 9 cujo resto e 6. Esse
processo continua ate que o resto da divisao chegue em 0, quando atingimos
o resto igual a 0 o maximo divisor comum e o u
ltimo n
umero da 2a linha
(
ultimo divisor) que pode ser visto na imagem (e).
Na Figura 3.10 temos um esboco do algoritmo para calcular o mdc entre
dois n
umeros na linguagem Java.
1 resto = dividendo % divisor ;
2 // supondo que resto != 0 , precisamos atualizar
dividendo e divisor
3 // o divisor anterior vira o dividendo e o resto
anterior vira o novo divisor
4
5 dividendo = divisor ;
6 divisor = resto ;
7 resto = dividendo % divisor ;
8
9 // supondo que resto != 0 , ...
10 dividendo = divisor ;
11 divisor = resto ;
12 resto = dividendo % divisor ;
13 ...
14 // o algoritmo termina quando resto == 0
Figura 3.10: Rascunho de algoritmo do Problema 3.3
Note as instrucoes repetidas nas linhas 5 a 7 e nas linhas 10 a 12, podemos
coloca-las dentro de um comando while, lembrando que as divisoes serao

3.1. WHILE (ENQUANTO)

61

realizadas enquanto o resto for diferente de zero. A Figura 3.11 ilustra o


algoritmo para calculo do mdc entre dois n
umeros inteiros.
1 public class Mdc {
2
3
public static void main ( String [] args ) {
4
Scanner tec = new Scanner ( System . in ) ;
5
System . out . print ( " Digite a : " ) ;
6
int a = tec . nextInt () ;
7
System . out . print ( " Digite b : " ) ;
8
int b = tec . nextInt () ;
9
10
int dividendo = a ;
11
int divisor = b ;
12
int resto = dividendo % divisor ;
13
while ( resto != 0) {
14
dividendo = divisor ;
15
divisor = resto ;
16
resto = dividendo % divisor ;
17
}
18
System . out . println ( " O mdc ( " + a + " ," + b + " )
= " + divisor ) ;
19
}
20 }
Figura 3.11: Solucao do Problema 3.3


CAPITULO 3. ESTRUTURAS DE REPETIC
AO

62

A Figura 3.12 ilustra o teste de mesa do algoritmo que calcula o mdc


usando o metodo de Euclides.

(a) Antes do comando while

(b) 1a iteracao

(c) 2a iteracao

(d) 3a iteracao

Figura 3.12: Teste de mesa do Problema 3.3

3.2

do/while (repita/ate)

Vimos que o comando while primeiro testa a condicao e so executa as


instrucoes dentro do bloco se a condicao for verdadeira. Podemos concluir
que as instrucoes dentro do while podem ser executadas 0 ou mais vezes.
Ja o do/while possui uma caracterstica diferente pois a condicao e testada
apenas ao final das instrucoes do bloco. Ou seja, as instrucoes sao executadas

3.2. DO/WHILE (REPITA/ATE)

63

ao menos uma vez.


Veja a sintaxe basica do comando while em Java e depois em VisuAlg.
1 do {
2
// coloque aqui as instru
c~
o es
3
// que ser~
a o executadas enquanto
4
// a < condicao > for verdadeira
5 } while ( < condicao >) ;

1 repita
2
// coloque aqui as instru
c~
o es
3
// que ser~
a o executadas enquanto
4
// a < condicao > for verdadeira
5 ate que < condicao >

A interpretacao do comando do/while: execute as instruc


oes dentro do
bloco enquanto a <condicao> for verdadeira. No VisuAlg, a interpretacao e
repita as instrucoes ate que a <condicao> seja verdadeira. Vamos trabalhar
alguns problemas usando o do/while.
Problema 3.4 O valor do salario-famlia sera de R$ 37.18, por filho de ate
14 anos incompletos ou invalido, para quem ganhar ate R$ 725.02. Ja para
o trabalhador que receber de R$ 725.02 ate R$ 1089.72, o valor do salariofamlia por filho de ate 14 anos de idade ou invalido de qualquer idade sera
de R$ 26.20. Escreva um algoritmo que recebe como entrada o salario e
o n
umero de filhos de acordo com as restric
oes acima e calcula o valor do
salario famlia do trabalhador.
Validar informacoes fornecidas ao programa e parte da logica do algoritmo, para resolver o problema do salario famlia devemos garantir que o
salario e o no de filhos sejam nao negativos.

64

CAPITULO 3. ESTRUTURAS DE REPETIC


AO

1 public class Departamento {


2
3
public static void main ( String [] args ) {
4
Scanner tec = new Scanner ( System . in ) ;
5
double salario ;
6
int filhos ;
7
do {
8
System . out . print ( " Digite sal
a rio : " ) ;
9
salario = tec . nextDouble () ;
10
} while ( salario < 0) ;
11
12
do {
13
System . out . print ( " Digite n o filhos : " ) ;
14
filhos = tec . nextInt () ;
15
} while ( filhos < 0) ;
16
17
double salarioFamilia = 0;
18
if ( salario <= 725.02) {
19
salarioFamilia = filhos * 37.18;
20
}
21
else if ( salario <= 1089.72) {
22
salarioFamilia = filhos * 26.20;
23
}
24
System . out . println ( " O sal
a rio fam
lia ser
a de "
+ salarioFamilia ) ;
25
}
26 }
Figura 3.13: Solucao do Problema 3.4
De acordo com a Figura 3.13, vemos que os comandos de repeticao controlam as informacoes de entrada, ou seja, a menos que os dados de entrada
sejam n
umeros validos o pedido de digitacao do salario e do no de filhos sao
executados continuamente.

3.3. FOR (PARA)

3.3

65

for (para)

Castigo por jogar avioes na sala de aula


O comando de repeticao for e utilizado quando sabemos a quantidade
de vezes que um conjunto de instrucoes serao executadas. Segue abaixo a
sintaxe basica do comando for:
1 for ( < inicial >; < condicao >; < atualizacao >) {
2
// coloque aqui as instru
c~
o es
3
// que ser~
a o executadas enquanto
4
// a < condicao > for verdadeira
5 }

O comando for pode ser interpretado do seguinte modo:


1. <inicial> declaro e inicializo a variavel de controle
2. <condicao> enquanto condicao e verdadeira, executo as instrucoes do
bloco; se a condicao e falsa saio do for
3. <atualizacao> atualizo a variavel de controle (pode ser um incremento
ou decremento)
4. apos a <atualizacao> volto para testar a <condicao>


CAPITULO 3. ESTRUTURAS DE REPETIC
AO

66

1 para <var > de < inicio > ate < limite > passo <
atualizacao > faca
2
// coloque aqui as instru
c~
o es
3
// que ser~
a o executadas enquanto <var >
4
// n~
a o ultrapassar < limite >
5 fimpara

Vejamos a instrucao equivalente no VisuAlg:


Vamos trabalhar com um problema bem simples para exemplificar o uso
do comando for
Problema 3.5 Escreva um algoritmo que recebe um n
umero inteiro positivo
n e imprime todos os n
umeros de 1 ate n.
Vamos fazer um esboco da solucao para ilustrar as instrucoes que serao
colocadas dentro de um comando de repeticao.
1 public class Imprime {
2
3
public static void main ( String args []) {
4
Scanner tec = new Scanner ( System . in ) ;
5
System . out . print ( " Digite n : " ) ;
6
int n = tec . nextInt () ;
7
System . out . println (1) ;
8
System . out . println (2) ;
9
System . out . println (3) ;
10
...
11
System . out . println (n -1) ;
12
System . out . println ( n ) ;
13
}
14 }
Figura 3.14: Tentativa de imprimir os n
umeros de 1 a n
Note a repeticao das instrucoes das impressoes, podemos substitu-las por
um comando de repeticao. Segue a solucao usando o comando for:

3.3. FOR (PARA)

67

1 public class Imprime {


2
3
public static void main ( String args []) {
4
Scanner tec = new Scanner ( System . in ) ;
5
System . out . print ( " Digite n : " ) ;
6
int n = tec . nextInt () ;
7
for ( int i = 1; i <= n ; i ++) {
8
System . out . println ( i ) ;
9
}
10
}
11 }
Figura 3.15: Solucao do Problema 3.5 usando for
No incio do comando for e inicializado a variavel i com 1 e depois testado
a condicao i <= n. Caso a expressao booleana seja falsa as instrucoes dentro
do bloco sao ignoradas. Caso a expressao seja verdadeira executa-se as
instrucoes dentro do bloco e no final e executada o incremento da variavel i
(i++).
Como dissemos na secao anterior, o comando while e o comando de
repeticao mais generico. Veja na Figura 3.16 a solucao do Problema 3.5
usando o comando repeticao while.
1
2
3
4
5
6
7
8
9
10

public static void main ( String args []) {


Scanner tec = new Scanner ( System . in ) ;
System . out . print ( " Digite n : " ) ;
int n = tec . nextInt () ;
int i = 1;
while ( i <= n ) {
System . out . println ( i ) ;
i ++;
}
}
Figura 3.16: Solucao do Problema 3.5 usando while


CAPITULO 3. ESTRUTURAS DE REPETIC
AO

68

Vamos ver um outro exemplo de problema que utiliza um comando de


repeticao.

Problema 3.6 Escreva um algoritmo que recebe um n


umero inteiro n > 0
e calcula a seguinte soma:
1 + 2 + 3 + + (n 1) + n
Por exemplo, se n = 6 seu algoritmo devera calcular 1 + 2 + 3 + 4 + 5 + 6 e
mostrar o resultado 21.
A ideia para resolver este problema e acumular uma parcela da adicao a
cada iteracao do comando de repeticao. Usaremos nosso velho e conhecido
comando soma = soma + num para essa finalidade. A Figura 3.17 ilustra a
solucao usando o comando for.
1 import java . util . Scanner ;
2
3 public class SomaNatural {
4
5
public static void main ( String args []) {
6
Scanner tec = new Scanner ( System . in ) ;
7
System . out . println ( " Digite inteiro positivo " ) ;
8
int n = tec . nextInt () ;
9
int soma = 0;
10
for ( int num = 1; num <= n ; num ++) {
11
soma = soma + num ;
12
}
13
System . out . println ( " A somat
o ria vale " + soma ) ;
14
}
15 }
Figura 3.17: Solucao do Problema 3.6 usando o for

3.4. EXERCICIOS

3.4

69

Exerccios

1. Dada uma sequencia de n


umeros inteiros onde o u
ltimo elemento e
o 0, escreva um algoritmo que calcula a soma dos n
umeros pares da
sequencia.
2. Dados o n
umero n de alunos de uma turma de Algoritmos e suas notas
da primeira prova, determinar a media das notas dessa turma. Considere que o usuario digite as informacoes corretamente.
3. Altere o algoritmo anterior para, alem da media, contar os alunos que
tiraram entre 0 e 5, 0 (0 nota < 5, 0) e acima de 5, 0 (nota 5, 0).
4. Dados n um inteiro positivo e uma sequencia de n n
umeros reais, escreva um algoritmo que conta e imprime a quantidade de n
umeros
positivos e a quantidade de n
umeros negativos.
5. Escreva um algoritmo que, dados um n
umero inteiro positivo n, imprime na tela a contagem de todos os divisores positivos de n.
6. Em uma prova de concurso com 70 questoes haviam 20 pessoas concorrendo. Sabendo que cada questao vale 1 ponto, escreva um algoritmo
que le a pontuacao da prova obtida de cada um dos candidatos e calcula:
(a) a maior e a menor nota
(b) o percentual de candidatos que acertaram ate 20 questoes, o percentual que acertaram de 21 a 50 e o percentual que acertou acima
de 50 questoes
7. Um n
umero inteiro positivo n e denominado primo se existirem apenas


CAPITULO 3. ESTRUTURAS DE REPETIC
AO

70

dois divisores inteiros positivos dele: o 1 e o proprio n. Escreva um


algoritmo que recebe um inteiro n e verifica se n e primo ou nao.
8. Dados um montante em dinheiro inicial d, uma taxa de juros mensal j
e um perodo de tempo em meses t, escreva um algoritmo que calcula
o valor final em dinheiro se d ficar aplicado a taxa de juros j durante t
meses.
9. Escreva um algoritmo que recebe um inteiro positivo n e calcula n! =
123 . . .(n1)n. Por exemplo, se n = 6, entao 6! = 123456 = 720.
10. No problema de verificar se um n
umero e primo ou nao resolvemos
contando o n
umero de divisores. Tambem podemos pensar em resolver
este problema encontrando um divisor diferente de 1. Se tal divisor for
o proprio n, significa que n e primo, caso contrario, dizemos que ele
nao e primo. Pensando nessa ideia, escreva um algoritmo que verifica
se n e primo ou nao. Ao inves do comando for use o comando while
11. Se Fn e o n-esimo n
umero da sequencia de Fibonacci, podemos calculala atraves da seguinte formula de recorrencia:

Fn =

se n = 1 ou n = 2;

F
n1 + Fn2

se n > 2

Vamos mostrar os 10 primeiros n


umeros da sequencia de Fibonacci:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55

Escreva um algoritmo que dado n, calcula o n-esimo n


umero da sequencia
de Fibonacci.

3.4. EXERCICIOS

71

12. Uma das maneiras de evitar erros na digitacao de n


umeros como conta
corrente, CPF, boleto bancario e a utilizacao de um ou mais dgitos de
controle. Um dos metodos de calculo e a utilizacao do metodo modulo
10. Segue a descricao do algoritmo: Dado um n
umero inteiro n devemos pegar cada dgito desse n
umero comecando pela casa das unidades
e multiplicar, alternadamente, por 2 e por 1. Caso o resultado da multiplicacao seja um n
umero maior ou igual a 10 devemos simplificar esse
valor somando os dois dgitos. Apos feitas as multiplicacoes e as simplificacoes devemos somar todos os valores e calcular o resto da divisao
dessa soma por 10. Se o resto for 0 o dgito de controle e zero, caso
contrario o dgito de controle sera 10 menos o resto.
A Figura 3.18 pode servir de exemplo para o algoritmo moduto 10.

Figura 3.18: Trecho de boleto bancario do Banco do Brasil

Por exemplo vamos pegar o n


umero do meio do boleto, o n
umero corresponde a n = 246421501 e o dgito de controle sera 7. Vamos efetuar
os seguintes calculos:
12 = 2
01 = 0
5 2 = 10
11 = 1
22 = 4

72

CAPITULO 3. ESTRUTURAS DE REPETIC


AO
41 = 4
6 2 = 12
41 = 4
22 = 4

Da somamos 2 + 0 + 1(1 + 0) + 1 + 4 + 4 + 3(1 + 2) + 4 + 4 = 23. O


resto da divisao de 23 por 10 e 3 e como ele e diferente de zero o dgito
de controle de 246421501 sera 7 (10 3).
Escreva um algoritmo que le um n
umero inteiro positivo e calcula o seu
dgito de controle usando o metodo do modulo 10.

Captulo 4
Vetor
Any fool can write code that a
computer can understand. Good
programmers write code that
humans can understand.
Martin Fowler

Processamento de grandes quantidades de informacoes sempre foi um dos


objetivos de estudos da Ciencia da Computacao. Todos os dias ouvimos falar
de uma nova ferramenta de BI, uma maneira de trabalhar com BIG Data ou
um novo software para Mineracao de Dados, todas essas tecnologias comprovam a importancia de aprender a trabalhar com conjunto de informacoes.
Neste captulo sera introduzido o vetor que e um recurso presente nas linguagens de programacao que permite a representacao, o armazenamento e a
manipulacao de conjunto de informacoes dentro dos algoritmos.
73

CAPITULO 4. VETOR

74

4.1

Preliminares, definic
ao e exemplos

Antes de definirmos vetores, vamos ilustrar a necessidade do seu uso


atraves de um problema:
Problema 4.1 O Prof Eduardo corrigiu a NAC de uma turma de Algoritmos. Ele gostaria de gerar algumas estatsticas: a menor nota, a maior nota
e a media aritmetica da turma. Alem disso, ele tambem gostaria de saber
quantos alunos ficaram abaixo da media e quantos alunos ficaram acima ou
igual a media. Sua tarefa e escrever um algoritmo que recebe a quantidade de
alunos e le as notas de NAC de todos os alunos e faz os calculos estatsticos
especificados.
Para calcular a menor, a media e a maior nota precisamos ler e processar
todas as notas da turma. Porem como a media e calculada somente apos
a leitura da u
ltima nota, nao temos condicao de contar o no de alunos que
ficaram abaixo e acima da media. Para resolver esse problema, poderamos
adotar duas solucoes:
1. todas as notas teriam que ser digitadas novamente ou
2. armazenar todas as notas digitadas dentro do algoritmo
Claramente a 2a solucao e mais adequada, porem nao podemos usar as
variaveis do jeito que conhecemos. Precisamos de variaveis que representam
um conjunto de n
umeros e e nesse contexto que os vetores serao u
teis.
Definic
ao 4.1 Vetor e uma estrutura de dados que armazena uma sequencia
de informacoes, todas do mesmo tipo, com o mesmo identificador e alocadas
em posicoes consecutivas da memoria RAM.

E EXEMPLOS
4.1. PRELIMINARES, DEFINIC
AO

75

Ou seja, um vetor representa um conjunto de variaveis de um mesmo tipo


e com o mesmo identificador. Mas como podemos acessar cada uma dessas
variaveis ja que elas possuem o mesmo identificador? O que distingue cada
uma das variaveis e um ndice que e responsavel por indicar a localizacao da
variavel dentro da estrutura.
O codigo int[] v = new int[10]; declara e instancia um vetor v de
n
umeros inteiros com 10 posicoes. Cada uma das posicoes sao inicializadas
com o 0 que e o valor default do tipo int. A figura abaixo e a representacao
grafica do vetor v:
0 1 2 3 4 5
0 0 0 0 0 0

6 7 8 9
0 0 0 0

Cada uma dos quadrados representa uma variavel e o n


umero acima representa o ndice daquela variavel. Veja algumas caractersticas dos vetores:
os ndices dos vetores em Java sao n
umeros inteiros que comecam do 0
para acessar uma variavel do vetor colocamos o nome do vetor e o
ndice entre colchetes
em Java todos os vetores sao objetos, note o new utilizado para instanciar o vetor
Veja abaixo algumas instrucoes exemplificando o uso do vetor v:
1
2
3
4

v [0]
v [7]
v [4]
v [6]

=
=
=
=

1;
-3;
2;
5

e a figura abaixo demonstra o que ocorre no vetor apos a execucao das


instrucoes:

CAPITULO 4. VETOR

76
0
1

1 2 3 4 5
0 0 0 2 0

6
5

7 8 9
-3 0 0

Note que o acesso a cada uma das posicoes pode ser feito de forma independente, bastando saber o ndice da posicao. Uma das maneiras mais
utilizadas para trabalhar com vetores e usar uma variavel inteira para percorrer os ndices e, consequentemente, todas as suas posicoes. Veja na Figura 4.1 um algoritmo que preenche um vetor com capacidade de armazenar
20 n
umeros inteiros com informacoes digitadas pelo usuario.
1 import java . util . Scanner ;
2
3 public class PreencheVetor {
4
5
public static void main ( String args []) {
6
Scanner tec = new Scanner ( System . in ) ;
7
int [] conjunto = new int [20];
8
for ( int i = 0; i < conjunto . length ; i ++) {
9
System . out . print ( " Digite inteiro : " ) ;
10
conjunto [ i ] = tec . nextInt () ;
11
}
12
}
13 }
Figura 4.1: Exemplo de preenchimento do vetor usando o for
Na linha 08 a palavra reservada new que e utilizada para instanciar um
objeto. Por essa razao todas as posicoes do vetor sao inicializadas com o
valor default do tipo do vetor. Por se tratar de um objeto, o vetor possui o
atributo length que indica a capacidade do vetor, na linha 08 do algoritmo
a instrucao conjunto.length devolve o valor 20 que representa o tamanho
do vetor.
Veja mais um exemplo:

E EXEMPLOS
4.1. PRELIMINARES, DEFINIC
AO

77

Problema 4.2 Escreva um algoritmo que recebe um inteiro n > 0, instancia


um vetor de n
umeros inteiros com n posic
oes, preenche o vetor com n
umeros
pares comecando do 0 ate a u
ltima posic
ao do vetor e depois imprime o
resultado na tela da u
ltima posicao para a primeira. Por exemplo, suponha
n = 9 o vetor resultante do algoritmo devera ser preenchido da seguinte
forma:
0 1 2 3 4
0 2 4 6 8

5 6 7 8 9
10 12 14 16 18

1 import java . util . Scanner ;


2
3 public class PreenchePares {
4
5
public static void main ( String args []) {
6
Scanner tec = new Scanner ( System . in ) ;
7
System . out . print ( " Digite n : " ) ;
8
int n = tec . nextInt () ;
9
int [] numeros = new int [ n ];
10
for ( int i = 0; i < numeros . length ; i ++) {
11
numeros [ i ] = 2 * i ;
12
}
13
14
int i = numeros . length - 1;
15
while ( i >= 0) {
16
System . out . println ( numeros [ i ]) ;
17
i - -;
18
}
19
}
20 }
Figura 4.2: Solucao do Problema 4.2
Agora, vamos resolver o Problema 4.1 proposto no incio do captulo.

78

CAPITULO 4. VETOR

1 public class Estatistica {


2
3
public static void main ( String args []) {
4
Scanner tec = new Scanner ( System . in ) ;
5
System . out . print ( " Quantidade de alunos : " ) ;
6
int qtd = tec . nextInt () ;
7
double [] notas = new double [ qtd ];
8
double soma = 0;
9
for ( int i = 0; i < conjunto . length ; i ++) {
10
System . out . print (( i +1) + " o aluno : " ) ;
11
notas [ i ] = tec . nextDouble () ;
12
soma = soma + notas [ i ];
13
}
14
double media = soma / conjunto . length ;
15
double maiorNota , menorNota ;
16
maiorNota = notas [0];
17
menorNota = notas [0];
18
int acimaMedia , abaixoMedia , i = 0;
19
while ( i < conjunto . length ) {
20
if ( notas [ i ] < media ) {
21
abaixoMedia ++;
22
}
23
else {
24
acimaMedia ++;
25
}
26
if ( notas [ i ] > maiorNota ) {
27
maiorNota = notas [ i ];
28
}
29
if ( notas [ i ] < menorNota ) {
30
menorNota = notas [ i ];
31
}
32
i ++;
33
}
34
System . out . println ( " A m
e dia foi " + media ) ;
35
System . out . println ( " Maior nota : " + maiorNota ) ;
36
System . out . println ( " Menor nota : " + menorNota ) ;
37
System . out . println ( " Mais ou igual a m
e dia : " +
acimaMedia ) ;
38
System . out . println ( " Menos da m
e dia : " +
abaixoMedia ) ;
39
}
40 }
Figura 4.3: Solucao do Problema 4.1

E EXEMPLOS
4.1. PRELIMINARES, DEFINIC
AO

79

Nos dois algoritmos anteriores instanciamos o vetor com a capacidade


de armazenamento necessaria para resolver o problema. Porem, uma vez
instanciado nao podemos aumentar ou diminuir sua capacidade. Nem todos
os problemas antecipam a quantidade de informacoes que serao fornecidas,
quando isso acontece declaramos um vetor com uma capacidade que achamos
adequada para resolver o problema. Veja uma exemplo disso no Problema 4.3:
Problema 4.3 Dada uma sequencia de nomes onde o u
ltimo nome dessa
sequencia e a string vazia (""). Escreva um algoritmo em Java que le todos
os nomes e imprime todos os nomes na ordem inversa de leitura. Exemplo,
suponha que a sequencia de nomes seja: Joaquim, Manoel, Pedroe ;
seu algoritmo devera mostrar na tela (um em cada linha): Pedro, Manoel e
Joaquim.
Para este problema, devermos armazenar todos os nomes antes de imprimir na tela. Ou seja, devemos usar um vetor de String mas com qual
capacidade? Veja a solucao na Figura 4.4.

CAPITULO 4. VETOR

80

1 import java . util . Scanner ;


2
3 public class NomesInvertidos {
4
5
public static void main ( String args []) {
6
Scanner tec = new Scanner ( System . in ) ;
7
// Espero que 100 nomes seja suficiente
8
String [] nomes = new String [100];
9
int qtd = 0;
10
System . out . print ( " Digite um nome : " ) ;
11
String n = tec . nextLine () ;
12
while ( qtd < nomes . length && ! n . equals ( " " ) ) {
13
nomes [ qtd ] = n ;
14
qtd ++;
15
System . out . print ( " Digite um nome : " ) ;
16
String n = tec . nextLine () ;
17
}
18
if ( qtd > nomes . length && ! n . equals ( " " ) ) {
19
System . out . println ( " Overflow ! Estouro na
capacidade do vetor ! " ) ;
20
System . exit (1) ;
21
}
22
23
// vamos usar o comando for a partir do valor
qtd -1 at
e chegar no zero
24
for ( int i = qtd - 1; i >= 0; i - -) {
25
System . out . println ( nomes [ i ]) ;
26
}
27
}
28 }
Figura 4.4: Solucao do Problema 4.3

Na linha 18 verifico se a sada do comando de repeticao se deu por conta


termino da sequencia ou se todas as posicoes foram usadas. Se o tamanho
do vetor nao for suficiente para armazenar todos os nomes, e exibida uma
mensagem e o algoritmo termina.

E EXEMPLOS
4.1. PRELIMINARES, DEFINIC
AO

81

Algumas vezes, precisamos executar nosso programas com dados aleatorios


e, na maioria das linguagens, ha geradores de n
umeros aleatorios. Na linguagem Java nao e diferente, temos o metodo Math.random() que gera n
umeros
aleatorios entre 0 e 1 ou a classe Random que possui mais metodos para
geracao de n
umeros aleatorios. Ilustraremos um pouco o uso da classe Random atraves do proximo problema.
Problema 4.4 Escreva um algoritmo que recebe um n
umero n inteiro positivo, cria um vetor de n
umeros inteiros com n posic
oes, preenche todas as
posic
oes do vetor com n
umeros aleat
orios entre 0 e 999. Depois de criado
e preenchido o vetor, faca um clone deste vetor e mostre todos os n
umeros
deste vetor na tela.

CAPITULO 4. VETOR

82
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

import java . util . Random ;


import java . util . Scanner ;
public class Aleatorio {
public static void main ( String [] args ) {
Scanner tec = new Scanner ( System . in ) ;
System . out . print ( " Digite n : " ) ;
int n = tec . nextInt () ;
int [] vetor = new int [ n ];
Random rand = new Random () ;
for ( int i = 0; i < n ; i ++) {
vetor [ i ] = rand . nextInt (1000) ;
}
int [] vetorClonado = new int [ n ];
for ( int i = 0; i < n ; i ++) {
vetorClonado [ i ] = vetor [ i ];
}
for ( int i = 0; i < n ; i ++) {
System . out . println ( vetorClonado [ i ]) ;
}
}
}
Figura 4.5: Solucao do Problema 4.4
Vamos mostrar alguns exemplos envolvendo metodos:
Problema 4.5 Escreva um metodo que clona um vetor. Seu metodo recebe
como parametro um vetor de n
umeros inteiros e retorna um outro vetor com
a mesma capacidade e com o mesmo conte
udo.

4.2

Exerccios: vetores de tipos b


asicos

1) Faca um programa que preencha com 10 n


umeros inteiros um vetor e
depois de preenchido o vetor devera calcular e mostrar a quantidade de


4.2. EXERCICIOS: VETORES DE TIPOS BASICOS

83

1 public class Doly {


2
3
public int [] clone ( int [] vetor ) {
4
int [] aux = new int [ vetor . length ];
5
for ( int i = 0; i < vetor . length ; i ++) {
6
aux [ i ] = vetor [ i ];
7
}
8
return aux ;
9
}
10
11
public static void main ( String [] args ) {
12
int [] v = {2 , 4 , 6 , 7 , 20 , 40};
13
Doly d = new Doly () ;
14
int [] colecao = d . clone ( v ) ;
15
for ( int i = 0; i < colecao . length ; i ++) {
16
System . out . println ( colecao [ i ]) ;
17
}
18
}
19 }
Figura 4.6: Solucao do Problema 4.4
n
umeros negativos e a soma dos n
umeros positivos desse vetor.
2) Dados um n
umero inteiro n e uma sequencia de n n
umeros reais, escreva
um algoritmo que armazena os n n
umeros no vetor e depois encontra
o maior e o menor n
umero.
3) Dados um inteiro n e uma sequencia de n n
umeros reais, escreva um
algoritmo que armazena os n n
umeros no vetor e depois calcula a somatoria dos n
umeros que estao apenas nos ndices pares do vetor.
4) Escreva um algoritmo que pede para o usuario digitar 10 caracteres.
Depois que o usuario informa-los voce devera imprimi-los na ordem
inversa de entrada. Use vetores para armazenar os caracteres.

CAPITULO 4. VETOR

84

5) Dados n e uma sequencia de n n


umeros inteiros, escreva um algoritmo
que armazena os n n
umeros no vetor v e depois imprime as seguintes
somas: v[0] + v[n 1], v[1] + v[n 2], v[2] + v[n 3], ...; ate que eles
se encontrem no meio do vetor.
6) Crie tres vetores de: String, int e double, cada um com 10 posicoes.
Nesses tres vetores voce devera armazenar o nome do aluno (vetor
de String), o rm (vetor de int) e a media final (vetor de double) da
disciplina de algoritmos. Depois de armazenado, imprima o nome e
o RM dos alunos que foram reprovados em algoritmos (m
edia < 4),
ficaram de exame (4 < m
edia < 6) e foram aprovados (m
edia >= 6).
E se fosse resolver usando orientacao a objetos, o que voce faria?
7) Crie uma classe Estatistica, dentro dela, escreva o metodo mediaAritmetica
que recebe um vetor de n
umeros reais e retorna a media aritmetica dos
n
umeros contidos no vetor. Faca um metodo main para testar esse
metodo.
8) Acrescente na classe anterior o metodo desvioPadrao que recebe um
vetor de n
umeros reais e retorna o desvio padrao desses n
umeros. O
desvio padrao que, normalmente, e representado por pode ser calculado atraves da seguinte formula:

x)2
n1

n1
i=0 (x[i]

(4.1)

onde x representa o vetor, n e o tamanho de x e x e a media dos


n
umeros do vetor.
9) Escreva um algoritmo que le um inteiro n que representa o n
umero de
funcionarios de uma empresa e preenche um vetor com cada um dos n


4.2. EXERCICIOS: VETORES DE TIPOS BASICOS

85

salarios mensais. Depois de preenchido o vetor, devera ser calculado o


valor de contribuicao ao INSS de cada funcionario. O INSS calculado
devera ser armazenado em um outro vetor. Segue abaixo a tabela que
indica o calculo do INSS.
salario contribuicao
ate R$ 1.317,07
de R$ 1.317,08 ate R$ 2.195,12
de R$ 2.195,13 ate R$ 4.390,24
acima de R$ 4.390,24

alquota/valor
8%
9%
11%
11% sobre R$ 4.390,24

Tabela 4.1: Contribuicao INSS 2014

10) Escreva um metodo que recebe como parametro 2 vetores a e b de


n
umeros reais e devera retornar um terceiro vetor contendo todos os
n
umeros contidos no vetor a e todos os n
umeros contidos no vetor b.
Faca um metodo main que devera chamar o metodo criado e imprimir
todo o conte
udo do terceiro vetor.
11) Escreva um metodo chamado intercala que recebe como parametro
2 vetores a e b de n
umeros reais ordenados em ordem crescente. Seu
metodo devera retornar um terceiro vetor contendo todos os elementos
de a e b ordenados em ordem crescente. Faca um metodo main para
testar o metodo intercala.

86

CAPITULO 4. VETOR

Ap
endice A
Correc
ao dos exerccios da
Introduc
ao
3. Escreva um algoritmo que recebe um n
umero x ele imprime x2 . Lembrese que x2 = x x.
1 algoritmo " quadrado "
2 var
3

x , pot : real

4 inicio
5

escreva ( " Digite n o " )

leia ( x )

pot = x * x

escreva ( " Sa
da : " , pot )

9 fimalgoritmo
4. Escreva um algoritmo que calcula a area e o permetro do crculo, use
3, 14 como valor de .
1 algoritmo " circulo "
87


DOS EXERCICIOS DA INTRODUC

88 APENDICE
A. CORREC
AO
AO
2 var
3

raio , area , perimetro : real

4 inicio
5

escreva ( " Digite raio " )

leia ( raio )

area = raio * raio * 3.14

perimetro = 2 * 3.14 * raio

escreval ( "
A rea : " , area )

10

escreval ( " Per


metro : " , perimetro )

11 fimalgoritmo
5. Alem das 4 operacoes matematicas, as linguagens de programacao possuem o operador resto da divisao. O resto da divisao e uma operacao
que envolve apenas n
umeros inteiros e, na linguagem VisualG, e representada pelo operador % ou o mod. Vejamos um exemplo:
1 a <- 47
2 b <- 7
3 x <- a % 3
4 escreva ( x )
5 x <- 63 % b
6 escreva ( x )
7 x <- a % b
8 escreva ( x )
Este algoritmo mostrara na tela os seguintes valores respectivamente:
2, 0 e 5.
Sua tarefa e desenvolver um algoritmo que recebe um n
umero inteiro
de 0 a 99 e imprime o dgito das dezenas e o dgito das unidades desse

89
n
umero. Dica: usando papel e lapis faca a divisao do n
umero por 10
mas nao coloque vrgula e nem acrescente 0 na divisao.
1 algoritmo " divisao "
2 var
3

num : inteiro

dezena : inteiro

unidade : inteiro

6 inicio
7

// entrada de dados

escreva ( " Digite um n


u mero entre 0 e 99: " )

leia ( num )

10

dezena <- num div 10

11

unidade <- num mod 10

12

escreval ( " Dezena : " , dezena )

13

escreva ( " Unidade : " , unidade )

14 fimalgoritmo

6. Uma pessoa tem em seu guarda roupa x camisas, y calcas e z pares


de sapato. Escreva um algoritmo que calcula de quantas maneiras
diferentes ele pode se vestir. Seu algoritmo devera ler o n
umero de
camisas, o n
umero de calcas e o n
umero de pares de sapato.
1 algoritmo " divisao "
2 var
3

x , y , z : inteiro

4 inicio
5

escreva ( " Digite o n o de camisas : " )

leia ( x )


DOS EXERCICIOS DA INTRODUC

90 APENDICE
A. CORREC
AO
AO
7

escreva ( " Digite o n o de cal


c as : " )

leia ( y )

escreva ( " Digite o n o de pares de sapatos : " )

10

leia ( z )

11

escreva ( " Voc^


e pode se vestir de " , x * y * z
, " modos diferentes )

12 fimalgoritmo

7. Dados o preco de um produto e um percentual de desconto, escreva um


algoritmo que calcula e mostra o valor do desconto e o novo preco do
produto dado o percentual. E se, ao inves de um desconto, fosse um
aumento. O que muda no seu algoritmo?
1 algoritmo " desconto "
2 var
3

preco , percentual : real

desconto , novopreco : real

5 inicio
6 // Se
c~
a o de Comandos
7

escreva ( " digite preco : " )

leia ( preco )

escreva ( " digite desconto %: " )

10

leia ( percentual )

11
12

desconto <- preco * percentual / 100

13

novopreco <- preco - desconto

14
15

escreval ( " O desconto ser


a de " , desconto )

91
16

escreval ( " O novo pre


co
e de " , novopreco )

17 fimalgoritmo

8. Usain Bolt e o recordista mundial dos 100 metros rasos com o tempo de
9,58 segundos. Escreva um algoritmo que calcula a velocidade media
em m/s e em km/h de um corredor, seu algoritmo recebe como dados
de entrada a distancia em metros e o tempo em segundos.
1 algoritmo " cemmetros "
2 var
3

espaco , tempo : real

velocidade , velocidadeKM : real

5 inicio
6

escreva ( " Digite a metragem da corrida " )

leia ( espaco )

escreva ( " Digite o tempo ( s ) : " )

leia ( tempo )

10
11

velocidade <- espaco / tempo

12

velocidadeKM <- velocidade * 3.6

13
14

escreval ( " V = " , velocidade , " m / s " )

15

escreva ( " V = " , velocidadeKM , " km / h " )

16 fimalgoritmo

9. Neste mes, Joao recebeu um aumento no salario, porem ele nao sabe
calcular o percentual de aumento. Voce devera escrever um algoritmo
que recebe 2 n
umeros reais representando os salarios antes e depois do


DOS EXERCICIOS DA INTRODUC

92 APENDICE
A. CORREC
AO
AO
aumento e devera calcular e exibir o percentual de aumento que Joao
obteve.
1 algoritmo " percentual "
2 var
3

salAntes , salDepois : real

relativo , percent : real

5 inicio
6

escreva ( " Digite sal


a rio antes do aumento : " )

leia ( salAntes )

escreva ( " Digite sal


a rio depois do aumento : " )

leia ( salDepois )

10
11

relativo <- salDepois / salAntes

12

percent <- ( relativo - 1) * 100

13

escreva ( " O percentual de aumento foi " ,


percent , " % " )

14 fimalgoritmo

10. O RM de um aluno da FIAP e composto por 5 dgitos. Sua tarefa


e escrever um algoritmo que recebe um RM e retorna a somatoria de
todos os dgitos do RM. Por exemplo, suponha que o aluno tenha o RM
56395, seu algoritmo devera imprimir como sada 28 = 5 + 6 + 3 + 9 + 5.
Dica: realize varias divisoes e restos de divisoes por 10.
1 algoritmo " somaRM "
2 var
3

rm , resto : inteiro

soma : inteiro

93
5 inicio
6

escreva ( " Digite RM : " )

leia ( rm )

soma <- 0

9
10

resto <- rm mod 10

11

rm <- rm div 10

12

soma <- soma + resto

13
14

resto <- rm mod 10

15

rm <- rm div 10

16

soma <- soma + resto

17
18

resto <- rm mod 10

19

rm <- rm div 10

20

soma <- soma + resto

21
22

resto <- rm mod 10

23

rm <- rm div 10

24

soma <- soma + resto

25
26

resto <- rm mod 10

27

rm <- rm div 10

28

soma <- soma + resto

29
30

escreva ( " A soma dos digitos vale " , soma )

31 fimalgoritmo


DOS EXERCICIOS DA INTRODUC

94 APENDICE
A. CORREC
AO
AO

Ap
endice B
Correc
ao dos exerccios do
Capitulo 2
1. Faca um algoritmo que receba um n
umero e mostre uma mensagem
caso este n
umero seja maior que 10.
1 algoritmo " ex1 "
2 var
3

numero : real

4 inicio
5

escreva ( " Digite n o : " )

leia ( numero )

se ( numero > 10)

8
9

escreva ( numero , "


e maior que 10 " )
fimse

10 fimalgoritmo

2. Escrever um algoritmo que leia dois valores inteiro distintos e informe


qual e o maior ou se houve um empate.
95

96

DOS EXERCICIOS DO CAPITULO 2


APENDICE
B. CORREC
AO
1 algoritmo " ex2 "
2 var
3

num1 , num2 : real

4 inicio
5

escreva ( " Digite 1 o n


u mero : " )

leia ( num1 )

escreva ( " Digite 2 o n


u mero : " )

leia ( num2 )

se ( num1 > num2 )

10

escreva ( num1 , "


e maior que " , num2 )

11

senao

12

se ( num1 < num2 )

13

escreva ( num1 , "


e maior que " , num2 )

14

senao

15

escreva ( " EMPATE " )

16

fimse

17

fimse

18 fimalgoritmo

4. Escreva um algoritmo para ler o nome de 2 times e o n


umero de gols
marcados em uma partida. Escrever o nome do vencedor. Caso nao
haja vencedor devera ser impresso a palavra EMPATE.
1 algoritmo " exe4 "
2 var
3

timeCasa , timeVisitante : caracter

golCasa , golVisitante : inteiro

5 inicio

97
6

// Se
c~
a o de Comandos

escreva ( " Time da casa : " )

leia ( timeCasa )

escreva ( " Time visitante : " )

10

leia ( timeVisitante )

11

escreva ( " Gols da casa : " )

12

leia ( golCasa )

13

escreva ( " Gols visitante : " )

14

leia ( golVisitante )

15
16
17
18
19

se golCasa > golVisitante entao


escreval ( " Time da casa venceu ! " )
senao
se golCasa < golVisitante entao

20
21

escreval ( " Time visitante venceu ! " )


senao

22
23

escreval ( " Houve empate " )


fimse

24

fimse

25

escreva ( timeCasa , " " , golCasa , " X " ,


golVisitante , " " , timeVisitante )

26 fimalgoritmo

5. A jornada de trabalho semanal e de 40 horas. O funcionario que trabalhar mais de 40 horas recebera hora extra, cujo valor e o valor da hora
regular com um acrescimo de 50%. Escreva um algoritmo que leia o
n
umero de horas trabalhadas em um mes, o salario por hora e escreva

98

DOS EXERCICIOS DO CAPITULO 2


APENDICE
B. CORREC
AO
o salario total do funcionario (considere que o mes possua 4 semanas
exatas).
1 algoritmo " exe5 "
2 var
3

horasTrabalhadasMes : real

salarioHora : real

horaExtra : real

salario : real

7
8 inicio
9

escreva ( " Digite horas trabalhadas mes " )

10

leia ( horasTrabalhadasMes )

11

escreva ( " Sal


a rio hora : " )

12

leia ( salarioHora )

13
14

horaExtra <- horasTrabalhadasMes - 160

15
16
17

se horaExtra > 0 entao


salario <- 160 * salarioHora + horaExtra
* salarioHora * 1.5

18
19

senao
salario <- horasTrabalhadasMes *
salarioHora

20

fimse

21
22

escreva ( " Ele vai receber " , salario )

23 fimalgoritmo

99
6. Faca um programa para ler dois n
umeros inteiros A e B e informar se
A e divisvel por B.
1 algoritmo " semnome "
2 var
3

a , b , resto : inteiro

4 inicio
5

escreva ( " Digite dividendo : " )

leia ( a )

escreva ( " Digite divisor : " )

leia ( b )

resto <- dividendo mod divisor

10

se ( resto = 0) entao

11
12

escreva (a , "
e divisivel por " , b )
fimse

13 fimalgoritmo

7. A raiz quadrada e uma operacao que apenas aceita n


umeros positivos.
Escreva um algoritmo que le um n
umero qualquer e retorna a raiz
quadrada desse n
umero se possvel. Use a funcao RaizQ(numero) para
calcular a raiz quadrada em VisuAlg ou Math.sqrt(numero) para Java.
1 algoritmo " semnome "
2 var
3

numero , resultado : real

4 inicio
5

// Se
c~
a o de Comandos

escreva ( " Digite um n


u mero : " )

leia ( numero )


DOS EXERCICIOS DO CAPITULO 2
100 APENDICE
B. CORREC
AO
8

se ( numero < 0) entao

escreva ( " N
u mero negativo . Imposs
vel
calcular raiz quadrada " )

10

senao

11

resultado <- RaizQ ( numero )

12

escreva ( " Raiz quadrada de " , numero , "


e ",
resultado )

13

fimse

14 fimalgoritmo

8. Escreva um algoritmo que recebe a idade de um nadador e mostra sua


categoria conforme a tabela a seguir:
Categoria
Infantil
Juvenil
Adolescente
Adulto
Senior

Idade
5a7
8 a 10
11 a 15
16 a 30
acima de 30

1 algoritmo " semnome "


2 var
3

idade : inteiro

4 inicio
5

// Se
c~
a o de Comandos

escreva ( " Digite a idade do nadador : " )

leia ( idade )

se ( idade < 0) entao

9
10

escreva ( " Imposs


vel idade negativa " )
fimalgoritmo

101
11
12

senao
se ( idade < 5) entao

13

escreva ( " Abaixo de 5 anos , n~


a o h
a
categoria " )

14
15
16

senao
se ( idade < 7) entao
escreva ( " Infantil " )

17
18

senao
se ( idade < 10) entao

19
20

escreva ( " Juvenil " )


senao

21

se ( idade < 15) entao

22

escreva ( " Adolescente " )

23

senao

24

se ( idade < 30) entao

25

escreva ( " Adulto " )

26

senao

27

escreva ( " S^
e nior " )

28

fimse

29
30
31

fimse
fimse
fimse

32

fimse

33

fimse

34 fimalgoritmo

9. Uma equacao de 2o grau e da forma: ax2 + bx + c = 0, onde a = 0.


DOS EXERCICIOS DO CAPITULO 2
102 APENDICE
B. CORREC
AO
Escreva um algoritmo que recebe os tres coeficientes da equacao, calcula
e imprime as razes reais se for possvel. Use a seguinte formula para
resolver a equacao:

= b2 4ac

b +
x1 =
2a
b
x2 =
2a

1 algoritmo " semnome "


2 var
3

a , b , c : real

delta , x1 , x2 : real

5 inicio
6

// leitura dos dados

escreva ( " Digite a : " )

leia ( a )

escreva ( " Digite b : " )

10

leia ( b )

11

escreva ( " Digite c : " )

12

leia ( c )

13
14

// processamento

15

se ( a = 0) entao

16
17

escreva ( " N~
ao
e equa
c~
a o de 2 o grau " )
senao

103
18

delta <- b * b - 4 * a * c

19

se ( delta < 0) entao

20

escreva ( " Impossivel calcular ra


zes
reais " )

21

senao

22

x1 <- ( - b + RaizQ ( delta ) ) / (2 * a )

23

x2 <- ( - b - RaizQ ( delta ) ) / (2 * a )

24

escreval ( " x1 = " , x1 )

25

escreva ( " x2 = " , x2 )

26

fimse

27

fimse

28 fimalgoritmo
10. Escreva um algoritmo que calcule o que deve ser pago por um produto,
considerando o preco normal de etiqueta e a escolha da condicao de pagamento. Utilize os codigos da tabela a seguir para ler qual a condicao
de pagamento escolhida e efetuar o calculo adequado.
codigo
1
2
3
4

condicao de pagamento
A vista em dinheiro ou cheque, recebe 10% de desconto
A vista no cartao de credito, recebe 5% de desconto
Em duas vezes, preco normal de etiqueta sem juros
Em quatro vezes, preco normal de etiqueta mais juros de 7%

1 algoritmo " semnome "


2 var
3

preco : real

formaPgto : inteiro

5
6 inicio


DOS EXERCICIOS DO CAPITULO 2
104 APENDICE
B. CORREC
AO
7

escreva ( " Pre


c o do produto : " )

leia ( preco )

escreva ( " Forma pagto (1 ,2 ,3 ,4) : " )

10

leia ( formaPgto )

11

se ( formaPgto = 1) entao

12

escreva ( " Valor do produto : " , preco *


0.9)

13
14

senao
se ( formaPgto = 2) entao

15

escreva ( " Valor do produto : " , preco *


0.95)

16

senao

17

se ( formaPgto = 3) entao

18

escreva ( " Valor do produto : 2 x " ,


preco /2)

19

senao

20

escreva ( " Valor do produto : 4 x " ,


preco *1.07/4)

21
22
23

fimse
fimse
fimse

24 fimalgoritmo

11. Faca um algoritmo que leia as medias semestrais obtidas por um aluno
na disciplina de Algoritmos, o n
umero de aulas ministradas e o n
umero
de aulas assistidas por este aluno nesta disciplina. Calcule e mostre a
media final deste aluno e diga se ele foi aprovado ou reprovado ou esta

105
de exame segundo os criterios da FIAP inclusive levando-se em conta
a frequencia.
1 algoritmo " semnome "
2 var
3

media1sem , media2sem : real

mediaFinal : real

aulasMinistradas , aulasAssistidas : integer

frequencia : real

7 inicio
8

escreva ( " M
e dia 1 o semestre : " )

leia ( media1sem )

10

escreva ( " M
e dia 2 o semestre : " )

11

leia ( media2sem )

12
13

se ( media1sem < 0) ou ( media1sem > 10) ou (


media2sem < 0) ou ( media2sema > 10) entao

14

escreva ( " notas inv


a lidas , execute
novamente o programa " )

15

fimalgoritmo

16

fimse

17

mediaFinal <- ( media1sem + media2sem ) / 2

18
19

escreva ( " Digite quantidade de aulas


ministradas : " )

20

leia ( aulasMinistradas )

21

escreva ( " Digite quantidade de aulas


assistidas : " )


DOS EXERCICIOS DO CAPITULO 2
106 APENDICE
B. CORREC
AO
22

leia ( aulasAssistidas )

23
24

se ( aulasMinistradas < 0) ou (
aulasAssistidas < 0) entao

25

escreva ( " notas inv


a lidas , execute
novamente o programa " )

26
27

fimalgoritmo
fimse

28
29

// frequencia maior ou igual a 75% para


aprova
c~
ao

30

frequencia <- aulasAssistidas /


aulasMinistradas

31

se ( frequencia >= 0.75) entao

32

se ( mediaFinal >= 6) entao

33

escreva ( " Aprovado : " , mediaFinal )

34

senao

35

se ( mediaFinal >= 4) entao

36

escreva ( " Exame : " , mediaFinal )

37

senao

38

escreva ( " Retido : " , mediaFinal )

39
40
41
42
43

fimse
fimse
senao
escreva ( " Retido por falta " )
fimse

44 fimalgoritmo

107
12. Desenvolva um algoritmo que informe se uma data e valida ou nao. O
algoritmo devera ler 2 n
umeros inteiros, que representem o dia e o mes
e informar se e um dia do mes valido. Desconsidere os casos de ano
bissexto, ou seja, fevereiro tem 28 dias.
1 algoritmo " semnome "
2 var
3

dia , mes : inteiro

4 inicio
5

escreva ( " Informe o dia " )

leia ( dia )

escreva ( " Informe o m^


es " )

leia ( mes )

9
10

se ( dia < 1) ou ( dia > 31) entao

11

escreva ( " Data invalida " )

12

fimalgoritmo

13

fimse

14
15

se ( mes < 1) ou ( mes > 12) entao

16

escreva ( " Data invalida " )

17

fimalgoritmo

18

fimse

19
20

se ( dia = 31) e (( mes = 4) ou ( mes =6) ou (


mes =9) ou ( mes =11) ) entao

21

escreva ( " Data invalida " )

22

fimalgoritmo


DOS EXERCICIOS DO CAPITULO 2
108 APENDICE
B. CORREC
AO
23

fimse

24
25

se ( mes = 2) e ( dia > 28) entao

26

escreva ( " Data invalida " )

27

fimalgoritmo

28

fimse

29
30

escreva ( " Data valida " , dia , " / " , mes )

31 fimalgoritmo

13. Escreva um algoritmo que recebe tres n


umeros inteiros e imprime eles
em ordem crescente.
1 algoritmo " semnome "
2 var
3

a , b , c : inteiro

4 inicio
5

// Se
c~
a o de Comandos

escreva ( " Digite a : " )

leia ( a )

escreva ( " Digite b : " )

leia ( b )

10

escreva ( " Digite c : " )

11

leia ( c )

12
13
14
15

se ( a <= b ) e ( b <= c ) entao


escreva (a , " " , b , " " , c )
senao

109
16

se ( a <= c ) e ( c <= b ) entao

17
18

escreva (a , " " , c , " " , b )


senao

19

se ( b <= a ) e ( a <= c ) entao

20

escreva (b , " " , a , " " , c )

21

senao

22

se ( b <= c ) e ( c <= a ) entao

23

escreva (b , " " , c , " " , a )

24

senao

25

se ( c <= a ) e ( a <= b ) entao

26

escreva (c , " " , a , " " , b )

27

senao

28

escreva (c , " " , b , " " , a )

29

fimse

30
31
32

fimse
fimse
fimse

33 fimalgoritmo