Apostila de algoritmo - Basico + Exercicios
-
Upload
vinicius-lima -
Category
Documents
-
view
86 -
download
12
description
Transcript of Apostila de algoritmo - Basico + Exercicios
-
Introduc~ao a Programac~ao | Algoritmos
Eduardo Gondo
2015
-
2
-
Sumario
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 Express~ao 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, denic~ao e exemplos . . . . . . . . . . . . . . . . 74
4.2 Exerccios: vetores de tipos basicos . . . . . . . . . . . . . . . 82
A Correc~ao dos exerccios da Introduc~ao 87
3
-
4 SUMARIO
B Correc~ao dos exerccios do Capitulo 2 95
-
Lista de Figuras
1.1 Jean Jennings Bartik (esq) e Frances Bilas Spence (dir) . . . 12
1.2 Soluc~ao do Problema 1.2 em VisualG . . . . . . . . . . . . . . 15
1.3 Soluc~ao do Problema 1.2 em Java . . . . . . . . . . . . . . . . 16
1.4 Estrutura de um algoritmo . . . . . . . . . . . . . . . . . . . . 16
1.5 Soluc~ao 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 soluc~ao usando varios comandos se simples em VisuAlg . . . . 41
2.10 soluc~ao usando varios comandos se simples em Java . . . . . . 42
2.11 soluc~ao em VisuAlg com o comando se encadeado . . . . . . . 43
2.12 soluc~ao em Java usando o comandos se encadeado . . . . . . . 44
5
-
6 LISTA DE FIGURAS
3.1 Soluc~ao 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 ultimo dgito do RM . . . . . . . . . . . . . . . . 55
3.6 Separando os dois ultimos dgitos do RM . . . . . . . . . . . . 56
3.7 Soluc~ao 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 Soluc~ao do Problema 3.3 . . . . . . . . . . . . . . . . . . . . . 61
3.12 Teste de mesa do Problema 3.3 . . . . . . . . . . . . . . . . . 62
3.13 Soluc~ao do Problema 3.4 . . . . . . . . . . . . . . . . . . . . . 64
3.14 Tentativa de imprimir os numeros de 1 a n . . . . . . . . . . . 66
3.15 Soluc~ao do Problema 3.5 usando for . . . . . . . . . . . . . . . 67
3.16 Soluc~ao do Problema 3.5 usando while . . . . . . . . . . . . . 67
3.17 Soluc~ao 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 Soluc~ao do Problema 4.2 . . . . . . . . . . . . . . . . . . . . . 77
4.3 Soluc~ao do Problema 4.1 . . . . . . . . . . . . . . . . . . . . . 78
4.4 Soluc~ao do Problema 4.3 . . . . . . . . . . . . . . . . . . . . . 80
4.5 Soluc~ao do Problema 4.4 . . . . . . . . . . . . . . . . . . . . . 82
4.6 Soluc~ao do Problema 4.4 . . . . . . . . . . . . . . . . . . . . . 83
-
Lista de Tabelas
2.1 Contribuic~ao do INSS 2014 . . . . . . . . . . . . . . . . . . . . 25
2.2 Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . 36
2.3 Tabela Verdade . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.4 Contribuic~ao do INSS 2014 . . . . . . . . . . . . . . . . . . . . 40
4.1 Contribuic~ao INSS 2014 . . . . . . . . . . . . . . . . . . . . . 85
7
-
8 LISTA DE TABELAS
-
Resumo
Este documento destina-se a servir como material de auxlio a disciplina
de Algoritmos do curso Tecnologia de Desenvolvimento de Sistemas. E fun-
damental sua leitura assim como assistir as aulas e, principalmente, fazer os
exerccios propostos.
Algoritmos e raciocnio logico s~ao fundamentais para aprender a progra-
mar e, na minha opini~ao, a programac~ao esta para o prossional de com-
putac~ao assim como assentar tijolos esta para o pedreiro. Claro que voce^
pode n~ao trabalhar com programac~ao ou n~ao gostar de programar mas voce^
tem que saber programar1.
Boa jornada a Todos nesse ano!
1ainda mais pelo curso escolhido
9
-
10 LISTA DE TABELAS
-
Captulo 1
Introduc~ao
A medida que a Humanidade foi evoluindo, houve a necessidade de reali-
zar milhares de operac~oes matematicas com precis~ao e rapidez. Algumas si-
tuac~oes que esses calculos foram necessarios: navegac~ao martima, maquinas
a vapor, censo demograco1, sistema nanceiro, decifrar mensagens crip-
tografadas entre outras. Para ajudar o Homem nessas situac~oes, algumas
"coisas"foram criadas: abaco, tabela de logaritmos, calculadora meca^nica
ate chegar no computador.
Um dos primeiros computadores, o ENIAC, realizava em 1 segundo: 5000
somas, 357 multiplicac~oes ou 38 divis~oes. 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
alem~as criptografadas pela Enigma. Um dos responsaveis pelo projeto do
Colossus foi o matematico e criptoanalista Alan Turing que e considerado o
Pai da Cie^ncia da Computac~ao2.
1o censo de 1880 dos EUA demorou 7 anos para ser contabilizado e necessitou de 500pessoas
2recomendo voce^ a procurar informac~oes sobre Alan Turing
11
-
12 CAPITULO 1. INTRODUC ~AO
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 soluc~ao, lembrem-se que os
computadores eram apenas ferramentas para chegar no objetivo mais rapido.
Na gura 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 computac~ao e o computador tiveram
um grande avanco. Porem, ainda precisamos de pessoas capazes de:
1. entender um problema
2. encontrar e entender a soluc~ao do problema
3. transcrever essa soluc~ao em "algo"que o computador entenda
4. vericar se a resposta do computador esta correta
E muito importante perceber que o computador em si n~ao resolve um
problema, encontrar uma soluc~ao do problema e tarefa do ser humano. Cha-
mamos de Algoritmo essa soluc~ao 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
matematico persa Al-Khwarizmi. E muito provavel que a palavra algarismo
tenha origem nesse mesmo matematico, mas deixando de lado a etimologia,
vamos a denic~ao de algoritmo: uma seque^ncia de instruc~oes que s~ao exe-
cutadas de forma nita 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 ac~oes para trocar um pneu furado:
Problema 1.1 Trocar um pneu furado.
Soluc~ao
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 xa-lo com os parafusos
6. abaixar o carro com o macaco
-
14 CAPITULO 1. INTRODUC ~AO
7. apertar os parafusos
8. guardar o macaco, pneu furado e a chave de roda no carro
Trocar um pneu furado n~ao e um algoritmo que podemos executar no
computador, a seguir veja uma lista de problemas cujos algoritmos iremos
executar em um computador: equac~ao de 2o grau, somatoria de numeros, de-
terminar se um numero e primo ou n~ao, calcular o mdc entre dois numeros,
calcular o media aritmetica de um conjunto de numeros, buscar um elemento
dentro de um conjunto, ordenar um conjunto de dados, jogo de baralho entre
outros. A maioria dos problemas esta relacionado com operac~oes aritmeticas,
mas isso n~ao deve ser uma surpresa ja que o computador foi inventado exa-
tamente com esse proposito.
O computador sozinho n~ao resolve nenhum problema, o que ele faz de
melhor e executar rapidamente e corretamente um algoritmo. O algoritmo
que o computador executa s~ao escritos por uma ou mais pessoas atraves do
que chamamos de linguagem de programac~ao. A linguagem de programac~ao
consiste de um conjunto de instruc~oes que determinam o que o computador
deve fazer. Alguns exemplos de linguagem de programac~ao s~ao: 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 soluc~ao usando VisualG.
-
1.1. ALGORITMO 15
Problema 1.2 Somar dois numeros inteiros.
Soluc~ao
1 algoritmo "soma2"2 var3 n1, n2 , soma: inteiro4 inicio5 escreva("Informe 1 o numero: ")6 leia(n1)7 escreva("Informe 2 o numero: ")8 leia(n2)9 soma
-
16 CAPITULO 1. INTRODUC ~AO
Soluc~ao
1 ...2 ...3 public static void main(String [] args) {4 Scanner entrada = null;5 entrada = new Scanner(System.in);6 System.out.print("Informe 1 o num: ");7 int n1 = entrada.nextInt ();8 System.out.print("Informe 2 o num: ");9 int n2 = entrada.nextInt ();10 int soma = n1 + n2;11 System.out.println("Soma e " + soma);12 }
Figura 1.3: Soluc~ao 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 operac~ao anterior e a resposta do problema, basta eu
mostra-la na tela
Veja agora, o algoritmo escrito na linguagem de programac~ao:
Com base no algoritmo em VisualG podemos fazer algumas observac~oes:
-
1.1. ALGORITMO 17
Soluc~ao
1 algoritmo "areaTriangulo"2 var3 base , altura , area: real4 inicio5 escreva("Calculo da area do tria^ngulo")6 escreva("Informe base: ")7 leia(base)8 escreva("Informe altura: ")9 leia(altura)10 area
-
18 CAPITULO 1. INTRODUC ~AO
o comando
-
1.2. VARI AVEIS E COMANDOS DE ENTRADA E SAIDA 19
dado e atribudo a variavel () e o computador da continuidade ao al-
goritmo.
A area de declarac~ao 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 numeros, mas ha tambem variaveis que
cadeia de caracteres (String) e tipos logicos. E dever do programador saber
qual o tipo de variavel que o problema requisita.
Abaixo segue uma lista dos tipos de dados que podemos usar na linguagem
VisuAlg:
inteiro: dene variaveis numericas do tipo inteiro, ou seja, sem casas deci-
mais.
real: dene variaveis numericas do tipo real, ou seja, com casas decimais.
caractere: dene variaveis do tipo string, ou seja, cadeia de caracteres.
logico: dene variaveis do tipo booleano, ou seja, com valor VERDADEIRO
ou FALSO.
Vejamos mais um problema para exemplicar os comandos de entrada e
sada quanto a declarac~ao de variaveis.
Problema 1.4 Uma certa faculdade de informatica, usa tre^s notas de 0 a 10
com pesos 2, 3 e 5 para compor sua media semestral. Escreva um algoritmo
que dadas as tre^s notas imprime a media semestral.
Veja que precisamos de tre^s notas para calcular a media semestral, assim
seu algoritmo devera colocar as instruc~oes para pedir que o usuario digite
tre^s notas. E bem natural pensar que dever~ao ser declaradas tre^s variaveis
para armazenar as tre^s notas. Veja na gura 1.6 as instruc~oes do que foi
discutido ate o momento:
-
20 CAPITULO 1. INTRODUC ~AO
Soluc~ao
1 algoritmo "mediaFiap"2 var3 ps , nac , am: real4 inicio5 escreva("NAC: ")6 leia(nac)7 escreva("AM: ")8 leia(am)9 escreva("PS: ")10 leia(ps)11 fimalgoritmo
Figura 1.6: Leitura dos dados de entrada do Problema 1.4 em VisualG
Com as tre^s 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 ....
6 ....
7 ms
-
1.3. EXERCICIOS 21
Soluc~ao
1 algoritmo "mediaFiap"2 var3 soma , nota: real4 inicio5 soma
-
22 CAPITULO 1. INTRODUC ~AO
1. Instale o VisualG no seu computador.
2. Digite os algoritmos desta apostila no VisualG e execute-os, n~ao reco-
mendo usar Ctrl-c e Ctrl-v.
3. Escreva um algoritmo que recebe um numero x ele imprime x2. Lembre-
se 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 operac~oes matematicas, as linguagens de programac~ao pos-
suem o operador resto da divis~ao. O resto da divis~ao e uma operac~ao
que envolve apenas numeros inteiros e, na linguagem VisualG, e repre-
sentada pelo operador % ou o mod. Vejamos um exemplo:
1 a
-
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 numero de
camisas, o numero de calcas e o numero 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 dista^ncia em metros e o tempo em segundos.
9. Neste me^s, Jo~ao recebeu um aumento no salario, porem ele n~ao sabe
calcular o percentual de aumento. Voce^ devera escrever um algoritmo
que recebe 2 numeros reais representando os salarios antes e depois do
aumento e devera calcular e exibir o percentual de aumento que Jo~ao
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 divis~oes e restos de divis~oes por 10.
-
24 CAPITULO 1. INTRODUC ~AO
-
Captulo 2
Estrutura de selec~ao ou decis~ao
E muito frequente no desenvolvimento de algoritmos nos encontrarmos
em um ponto de decis~ao. Ou seja, em algumas situac~oes queremos fazer
uma vericac~ao em nosso algoritmo. Tal vericac~ao pode ser uma validac~ao
sobre os dados de entrada, por exemplo, se ha um algoritmo que pede para
o usuario digitar um salario sabemos que o salario n~ao pode ser negativo.
Outro tipo de uso da instruc~ao de selec~ao 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 ns de contribuic~ao ao
INSS. Outro exemplo, suponha que um analista de sistemas receba o salario
Tabela 2.1: Contribuic~ao do INSS 2014
salario contribuic~ao (em R$) alquota (em %)
ate 1.317,07 8,00de 1.317,08 a 2.195,12 9,00de 2.195,13 a 4.390,24 11,00acima de 4.390,24 R$ 482,92
25
-
26 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
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 im-
plementar um algoritmo para o desconto em folha do INSS do trabalhador.
E, dentro deste algoritmo, sera necessario vericarmos em qual faixa salarial
o trabalhador se encontra. Usaremos o comando condicional se/senao para
esta nalidade.
2.1 Comando condicional se (if)
Em nossos algoritmos aplicamos o comando se (if) de tre^s 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 () entao2 // bloco de instruc~oes3 fimse
Figura 2.1: Comando se em VisuAlg
1 if () {2 // bloco de instruc~oes3 }
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 instruc~oes que est~ao dentro do bloco de instruc~oes.
A e uma express~ao logica cujo resultado e verdadeiro ou
falso. E o bloco de instruc~oes e o conjunto de instruc~oes que est~ao subjugadas
ao comando se. No VisuAlg, o bloco de instruc~oes esta determinado entre
o comando se e o fimse, ja na sintaxe do Java o bloco de instruc~oes e
delimitado pelas chaves: { e }.
Note que, o comando se funciona como um desvio no seu codigo, ou seja,
algumas vezes as instruc~oes dentro do bloco se ser~ao executadas, outras vezes
n~ao ser~ao, tudo dependera do resultado da .
se/senao
1 se () entao2 // bloco de instruc~oes quando3 // e verdadeira4 senao5 // bloco de instruc~oes quando6 // e falsa7 fimse
Figura 2.3: Comando se/senao em VisuAlg
A combinac~ao se/senao (if/else) implica que, pelo menos, um dos
blocos de instruc~oes ser~ao executados. Quando a express~ao logica ()
e verdadeira executa-se os as instruc~oes que est~ao entre os comandos se e
senao, caso contrario as instruc~oes executadas ser~ao as que est~ao entre o
senao e o fimse. Tal combinac~ao e util quando e necessario executar ins-
truc~oes distintas de acordo com o resultado da express~ao logica.
Note que o comando senao (else) somente vem apos um comando se
(if). A sintaxe n~ao permite um comando senao (else) sozinho.
-
28 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
1 if () {2 // bloco de instruc~oes quando3 // e verdadeira4 }5 else {6 // bloco de instruc~oes quando7 // e falsa8 }
Figura 2.4: Comando if/else em Java
se/senao encadeados
1 se () entao
2 // bloco de instruc~oes quando
3 // e verdadeira
4 senao
5 se () entao
6 // bloco de instruc~oes quando
7 // e verdadeira
8 senao
9 // bloco de instruc~oes quando
10 // e s~ao falsas
11 fimse
12 fimse
-
2.1. COMANDO CONDICIONAL SE (IF) 29
1 if () {
2 // bloco de instruc~oes quando
3 // e verdadeira
4 }
5 else if () {
6 // bloco de instruc~oes quando
7 // e verdadeira
8 }
9 else {
10 // bloco de instruc~oes quando
11 // e s~ao falsas
12 }
N~ao ha limites na quantidade de comandos se que podemos encadear,
porem em uma situac~ao onde ha muitas condic~oes coloque as que tem maior
probabilidade de serem verdadeiras no comeco; isso fara com que haja menos
comparac~oes a serem executadas.
Exemplos
Veremos alguns exemplos ilustrango algumas situac~oes de uso do comando
se, se/senao e se encadeado:
Problema 2.1 Dados dois numeros inteiros dividendo e divisor, escreva
um algoritmo que retorna o quociente e o resto do resultado da divis~ao entre
o dividendo e o divisor.
Vamos tomar um exemplo, considere dividendo = 237 e divisor = 7, veja
o resultado na Figura 2.5:
-
30 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
Figura 2.5: Dividindo 237 por 7
Porem, quando o divisor e igual a zero, n~ao e possvel efetuar a divis~ao.
Nessa situac~ao, nosso algoritmo somente deveria efetuar a divis~ao quando o
divisor e diferente de 0. Veja na Figura 2.6 a soluc~ao em Visualg.
1 algoritmo "divisao"2 var3 divisor , dividendo , resto , quociente: integer4 inicio5 escreva("dividendo: ")6 leia(dividendo)7 escreva("divisor: ")8 leia(divisor)9 se (divisor 0) entao10 quociente
-
2.1. COMANDO CONDICIONAL SE (IF) 31
voce^ testar para os numeros 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 n~ao mostrara nada. Vamos alterar o algoritmo colocando o senao,
veja como ca nosso programa na Figura 2.7:
1 algoritmo "divisao"2 var3 divisor , dividendo , resto , quociente: inteiro4 inicio5 escreva("dividendo: ")6 leia(dividendo)7 escreva("divisor: ")8 leia(divisor)9 se (divisor 0) entao10 quociente
-
32 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
1 import java.util.Scanner;23 public class Divisao {45 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~ao 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
numero inteiro.
Problema 2.2 Dado um numero inteiro, escreva um algoritmo que verica
se o numero e par.
Apenas coloquei a parte principal do algoritmo, declarac~ao de variaveis e
entrada de dados foram omitidas.
1 resto
-
2.1. COMANDO CONDICIONAL SE (IF) 33
5
6 resto
-
34 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
No problema da paridade de um numero inteiro, temos duas possibilidades
a decidir (par ou mpar), mas quando temos situac~oes onde ha mais de dua
possibilidades? Nessa situac~ao usamos o comando se encadeado. O problema
que verica se um certo numero e positivo, negativo ou nulo e um exemplo
dessa situac~ao.
Problema 2.3 Dado um numero real qualquer, escreva um algoritmo que
decida se o numero e positivo, negativo ou zero.
1 algoritmo "positivo"
2 var
3 numero: real
4 inicio
5 escreva("digite um numero: ")
6 leia(numero)
7 se (numero > 0) entao
8 escreva(numero ," e positivo")
9 senao
10 se (numero < 0) entao
11 escreva(numero ," e negativo")
12 senao
13 escreva(numero ," e nulo")
14 fimse
15 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 soluc~ao em VisuAlg:
1 algoritmo "parcela"
2 var
3 valor , parcela , avista: real
4 inicio
5 escreva("Valor do produto: ")
6 leia(valor)
7 se (valor < 0) entao
8 escreval("Valor negativo!")
9 escreva("Impossvel calcular!")
10 senao
11 parcela
-
36 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
6 System.out.println("Valor negativo!");
7 System.out.println("Impossvel calcular!");
8 }
9 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 logica
As express~oes logicas s~ao como express~oes aritmeticas porem, ao inves de
numeros como resultado elas retornam verdadeiro ou falso. Uma express~ao
logica tem como objetivo relacionarmos dois ou mais elementos e, para essa
nalidade, utilizamos os operadores relacionais. A Tabela 2.2 contem os
operadores relacionais que utilizaremos para comparar as informac~oes.
Tabela 2.2: Operadores relacionais
operador operador signicadoVisuAlg Java= == igual< < menor> > maior ! = diferente= maior ou igual
Veja alguns exemplos:
-
2.2. EXPRESS ~AO L OGICA 37
1 soma > 0
2 num 1
3 valor = 23
4 nome "Joao"
5 area = y
Ainda podemos combinar uma ou mais express~oes 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 express~ao logica. Ja os operadores e e ou s~ao operadores
binarios, ou seja, eles s~ao utilizados para combinar duas ou mais express~oes
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 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
precede^ncia 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 express~ao logica estara presente. Normalmente, essa express~ao logica
realiza comparac~oes entre variaveis e valores xos 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
-
38 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
trabalhador. Seu algoritmo recebe o salario bruto e o total de descontos e
devera mostrar o salario lquido. Note que, salario e descontos s~ao numeros
reais positivos, faca a validac~ao dos dados e avise ao usuario se ele colocar
um valor invalido.
Soluc~ao em VisuAlg:
1 algoritmo salarioLiquido
2 var
3 salBruto , desconto , salLiquido: real
4 inicio
5 escreva("Digite o salario bruto:")
6 leia(salBruto)
7 escreva("Digite o total de descontos em R$:")
8 leia(desconto)
9 se (salBruto > 0 e desconto > 0) entao
10 salLiquido
-
2.2. EXPRESS ~AO L OGICA 39
6 double salBruto = tec.nextDouble ();
7 System.out.print("Desconto:")
8 double desconto = tec.nextDouble ();
9 if (salBruto > 0 && desconto > 0) {
10 double salLiquido = salBruto - desconto;
11 System.out.println("Salario lquido: " +
salLiquido);
12 }
13 else {
14 System.out.println("Informe um valor positivo
do salario");
15 }
16 }
17 }
Na linha 09 dos dois algoritmos temos um exemplo de uma express~ao
logica complexa utilizando o operador e. Note que, para que o resultado da
express~ao logica complexa seja verdadeira, as duas express~oes logicas internas
devem ser verdadeiras. Considere que X e Y sejam duas express~oes logicas,
a Tabela 2.3 mostra um resumo de todas as combinac~oes entre X e Y com
seu respectivo resultado.
Tabela 2.3: Tabela Verdade
X Y nao X (!X) X e Y (X && Y) X ou Y (X || Y)V V F V VV F F F VF V V F VF F V F F
Para cada express~ao logica abaixo, julgue verdadeiro ou falso. Considere
-
40 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
a = 5, b = 7, c = 4 e d = 81:
1. (a b) e (b < d)
2. (a = b) ou (c 6= 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: Contribuic~ao do INSS 2014
salario contribuic~ao (em R$) alquota (em %)
ate 1.317,07 8,00de 1.317,08 a 2.195,12 9,00de 2.195,13 a 4.390,24 11,00acima de 4.390,24 R$ 482,92
1Gabarito: V, V, F, V, F
-
2.2. EXPRESS ~AO L OGICA 41
Soluc~ao em VisuAlg:
1 algoritmo "previdencia"2 var3 // nunca use acento ou espaco nos nomes das
variaveis
4 salario , contribuicao : real5 inicio6 escreva("Digite o salario:")7 leia(salario)8 se (( salario >= 0) e (salario
-
42 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
Soluc~ao em Java:
1 import java.util.Scanner;23 public class Previdencia {45 public static void main(String [] args) {6 Scanner tec = new Scanner(System.in);7 System.out.print("Digite o salario: ");8 double salario = tec.nextDouble ();9 double contribuicao = 0;10 if (salario >= 0 && salario = 1317.08 && salario = 2195.13 && salario 4390.24) {20 contribuicao = 4390.24 * 0.11;21 }22 System.out.println("O desconto INSS sera de " +
contribuicao);
23 }24 }
Figura 2.10: soluc~ao usando varios comandos se simples em Java
Note que as soluc~oes usando o comando se simples implicam no teste
de todas as condic~oes mesmo quando o salario se encontra na 1a faixa de
contribuic~ao. Se usarmos o comando se de forma encadeada as condic~oes
que ser~ao testadas ser~ao apenas as necessarias para encontrar a faixa de
contribuic~ao do trabalhador.
-
2.2. EXPRESS ~AO L OGICA 43
Soluc~ao em VisuAlg usando o comando se encadeado.
1 algoritmo "previdencia"2 var3 // nunca use acento ou espaco nos nomes das
variaveis
4 salario , contribuicao : real5 inicio6 escreva("Digite o salario:")7 leia(salario)8 se (( salario >= 0) e (salario
-
44 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
Soluc~ao em Java usando o comando se encadeado:
1 import java.util.Scanner;23 public class Previdencia {45 public static void main(String [] args) {6 Scanner tec = new Scanner(System.in);7 System.out.print("Digite o salario: ");8 double salario = tec.nextDouble ();9 double contribuicao = 0;10 if (salario >= 0 && salario
-
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 EXECU-
TAR no computador, sabendo que A
-
46 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~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 numero de gols
marcados em uma partida. Escrever o nome do vencedor. Caso n~ao
haja vencedor devera ser impresso a palavra EMPATE.
5. A jornada de trabalho semanal e de 40 horas. O funcionario que traba-
lhar 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
numero de horas trabalhadas em um me^s, o salario por hora e escreva
o salario total do funcionario (considere que o me^s possua 4 semanas
exatas).
6. Faca um programa para ler dois numeros inteiros A e B e informar se
A e divisvel por B.
7. A raiz quadrada e uma operac~ao que apenas aceita numeros positivos.
-
2.3. EXERCICIOS 47
Escreva um algoritmo que le^ um numero qualquer e retorna a raiz
quadrada desse numero se possvel. Use a func~ao 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 Idade
Infantil 5 a 7Juvenil 8 a 10Adolescente 11 a 15Adulto 16 a 30Senior acima de 30
9. Uma equac~ao de 2o grau e da forma: ax2 + bx + c = 0, onde a 6= 0.Escreva um algoritmo que recebe os tre^s coecientes da equac~ao, calcula
e imprime as razes reais se for possvel. Use a seguinte formula para
resolver a equac~ao:
= b2 4acx1 =
b+p2a
x2 =bp
2a
-
48 CAPITULO 2. ESTRUTURA DE SELEC ~AO OU DECIS ~AO
10. Escreva um algoritmo que calcule o que deve ser pago por um produto,
considerando o preco normal de etiqueta e a escolha da condic~ao de pa-
gamento. Utilize os codigos da tabela a seguir para ler qual a condic~ao
de pagamento escolhida e efetuar o calculo adequado.
codigo condic~ao de pagamento
1 A vista em dinheiro ou cheque, recebe 10% de desconto2 A vista no cart~ao de credito, recebe 5% de desconto3 Em duas vezes, preco normal de etiqueta sem juros4 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 numero de aulas ministradas e o numero
de aulas assistidas por este aluno nesta disciplina. Calcule e mostre a
media nal 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 freque^ncia.
12. Desenvolva um algoritmo que informe se uma data e valida ou n~ao. O
algoritmo devera ler 2 numeros inteiros, que representem o dia e o me^s
e informar se e um dia do me^s valido. Desconsidere os casos de ano
bissexto, ou seja, fevereiro te^m 28 dias.
13. Escreva um algoritmo que recebe tre^s numeros 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 repetic~ao s~ao recursos da linguagem de programac~ao que
permitem que um conjunto de instruc~oes sejam executadas repetidas vezes.
Os comandos de repetic~ao, tambem conhecidos por lacos, s~ao os responsaveis
por repetir um determinado conjunto de instruc~oes determinada por uma
condic~ao1. S~ao tre^s comandos de repetic~ao existentes na linguagem Java:
while (enquanto), for (para) e do/while (repita/ate).
Neste captulo apresentaremos a sintaxe basica desses tre^s comandos,
mostraremos seu uso atraves de exemplos de problemas e tambem havera
exerccios de xac~ao. 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 repetic~ao.
1a mesma do comando if
49
-
50 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
3.1 while (enquanto)
O comando while e o comando mais generico dentre os comandos de
repetic~ao, ou seja, qualquer algoritmo onde e necessario o uso de comandos
de repetic~ao pode ser resolvido com o while. Segue abaixo a sintaxe basica
do comando while.
1 while () {2 // coloque aqui as instruc~oes3 //que ser~ao executadas enquanto4 //a for verdadeira5 }
A interpretac~ao do comando while: enquanto a for verda-
deira, executo as instruc~oes dentro do bloco2. Como a 1a ac~ao do comando
while e testar a condic~ao, e possvel que as instruc~oes dentro do bloco podem
nunca ser executadas, para isso basta que a condic~ao seja falsa. Vejamos a
forma de utilizac~ao do while em VisuAlg.
1 enquanto () faca2 // coloque aqui as instruc~oes3 //que ser~ao executadas enquanto4 //a for verdadeira5 fimenquanto
No VisuAlg, o bloco de instruc~oes s~ao denidos pelas palavras reserva-
das enquanto e fimenquanto. Vamos trabalhar o comando while com um
problema que ja foi visto em sala de aula.
Problema 3.1 Dados uma seque^ncia de 5 numeros inteiros. Calcule a soma
de todos os numeros da seque^ncia.
2em Java o bloco de instruc~oes s~ao delimitados por chaves: f e g
-
3.1. WHILE (ENQUANTO) 51
Segue abaixo um algoritmo, ja apresentado em sala de aula, desse pro-
blema. Observe que nos eslaides ele foi resolvido em VisuAlg mas dessa vez
apresentaremos em Java:
1 import java.util.Scanner;23 public class Soma5 {45 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 numero: ");10 num = tec.nextInt ();11 soma = soma + num;12 System.out.println("Digite numero: ");13 num = tec.nextInt ();14 soma = soma + num;15 System.out.println("Digite numero: ");16 num = tec.nextInt ();17 soma = soma + num;18 System.out.println("Digite numero: ");19 num = tec.nextInt ();20 soma = soma + num;21 System.out.println("Digite numero: ");22 num = tec.nextInt ();23 soma = soma + num;24 System.out.println("O valor e " + soma);25 }26 }
Figura 3.1: Soluc~ao em Java do Problema 3.1
Observe as 5 repetic~oes das instruc~oes:
1 System.out.println("Digite numero: ");2 num = tec.nextInt ();3 soma = soma + num;
-
52 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
Essa e uma situac~ao onde poderamos colocar tais instruc~oes dentro de um
while (enquanto) e controlar, atraves da condic~ao, a quantidade de vezes que
as instruc~oes s~ao executadas. A Figura 3.2 ilustra a codicac~ao 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
-
3.1. WHILE (ENQUANTO) 53
(a) Valor inicial das variaveis (b) 1a iterac~ao
(c) 2a iterac~ao (d) 3a iterac~ao
(e) 4a iterac~ao (f) 5a iterac~ao
Figura 3.3: Teste de mesa do Problema 3.1
Na 5a e ultima iterac~ao da repetic~ao, a variavel qtd assume o valor 6 que
-
54 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
torna a express~ao booleana qtd
-
3.1. WHILE (ENQUANTO) 55
1 public class RM {23 public static void main(String args []) {4 // objeto que le^ informac~oes do teclado5 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("Dgito: " + resto);12 System.out.println("RM restante: " + rm);13 }14 }
Figura 3.5: Separando o ultimo dgito do RM
tanto o numerador e denominador s~ao numeros inteiros, alem disso, aproveito
a mesma variavel rm para armazenar o quociente da divis~ao. Se executarmos
esse codigo para a entrada 56395 ser~ao impressos as informac~oes:
Dgito: 5
RM restante: 5639
Melhorando o algoritmo anterior, poderamos mostrar os dois ultimos
dgitos do RM, veja na Figura 3.6 a soluc~ao e note a repetic~ao das instruc~oes
das linhas 10 a 13 com as linhas 15 a 18.
-
56 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
1 public class RM {23 public static void main(String args []) {4 // objeto que le^ informac~oes do teclado5 Scanner tec = new Scanner(System.in);6 int resto;7 System.out.println("Digite o RM: ");8 int rm = tec.nextInt ();91011 resto = rm % 10;12 rm = rm / 10;13 System.out.println("Dgito: " + resto);14 System.out.println("RM restante: " + rm);1516 resto = rm % 10;17 rm = rm / 10;18 System.out.println("Dgito: " + resto);19 System.out.println("RM restante: " + rm);20 }21 }
Figura 3.6: Separando os dois ultimos dgitos do RM
Faca o teste de mesa e certique-se que a sada do algoritmo sera:
Dgito: 5
RM restante: 5639
Dgito: 9
RM restante: 563
Para imprimir todos os dgitos do RM temos que executar mais vezes
as instruc~oes que se repetem. Ate que momento devemos executa-las? Elas
ser~ao executadas ate que o valor da variavel rm seja igual a 0, ou seja, en-
quanto rm != 0 continuo a execuc~ao das mesmas.
Note que, caso o usuario digite 0 no RM, nenhuma instruc~ao dentro do
bloco do while sera executada pois a condic~ao e falsa. Contudo, ainda
-
3.1. WHILE (ENQUANTO) 57
assim o algoritmo mostra a resposta correta. Veja na Figura 3.7 a soluc~ao ja
acumulando os dgitos do RM.
1 public class RM {23 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: Soluc~ao 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 iterac~oes do
while.
-
58 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
(a) Valor inicial das variaveis (b) 1a iterac~ao
(c) 2a iterac~ao (d) 3a iterac~ao
(e) 4a iterac~ao (f) 5a iterac~ao
Figura 3.8: Teste de mesa do Problema 3.2
Problema 3.3 Dados dois numeros 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 numeros, como exemplo, vamos calcular o mdc de
24 e 15. As guras abaixo demonstram o processo de calculo.
(a) 1a divis~ao (b) 2a divis~ao
(c) 3a divis~ao (d) 4a divis~ao
(e) 5a divis~ao
Figura 3.9: Calculando md(24,15)
-
60 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
Na 1a linha da grade temos os quocientes das divis~oes que n~ao ser~ao
utilizados no processo. Na 2a linha temos os numeros que ser~ao os dividendos
e divisores, enquanto na 3a linha temos os restos das divis~oes. Observe que os
restos das divis~oes s~ao fundamentais no processo de calculo. Na imagem (a)
temos a 1a divis~ao entre 24 e 15, como o resto e 9 (6= 0) e necessario uma 2a
divis~ao. Nessa 2a divis~ao o divisor da 1a torna-se o dividendo e o resto vira
o divisor, observe na imagem (b) a divis~ao do 15 por 9 cujo resto e 6. Esse
processo continua ate que o resto da divis~ao chegue em 0, quando atingimos
o resto igual a 0 o maximo divisor comum e o ultimo numero 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 numeros 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 restoanterior vira o novo divisor
45 dividendo = divisor;6 divisor = resto;7 resto = dividendo % divisor;89 // 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 instruc~oes repetidas nas linhas 5 a 7 e nas linhas 10 a 12, podemos
coloca-las dentro de um comando while, lembrando que as divis~oes ser~ao
-
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 numeros inteiros.
1 public class Mdc {23 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 ();910 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: Soluc~ao do Problema 3.3
-
62 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
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 iterac~ao
(c) 2a iterac~ao (d) 3a iterac~ao
Figura 3.12: Teste de mesa do Problema 3.3
3.2 do/while (repita/ate)
Vimos que o comando while primeiro testa a condic~ao e so executa as
instruc~oes dentro do bloco se a condic~ao for verdadeira. Podemos concluir
que as instruc~oes dentro do while podem ser executadas 0 ou mais vezes.
Ja o do/while possui uma caracterstica diferente pois a condic~ao e testada
apenas ao nal das instruc~oes do bloco. Ou seja, as instruc~oes s~ao 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 instruc~oes3 //que ser~ao executadas enquanto4 //a for verdadeira5 } while ();
1 repita2 // coloque aqui as instruc~oes3 //que ser~ao executadas enquanto4 //a for verdadeira5 ate que
A interpretac~ao do comando do/while: execute as instruc~oes dentro do
bloco enquanto a for verdadeira. No VisuAlg, a interpretac~ao e
repita as instruc~oes ate que a seja verdadeira. Vamos trabalhar
alguns problemas usando o do/while.
Problema 3.4 O valor do salario-famlia sera de R$ 37.18, por lho 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 salario-
famlia por lho 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 numero de lhos de acordo com as restric~oes acima e calcula o valor do
salario famlia do trabalhador.
Validar informac~oes fornecidas ao programa e parte da logica do algo-
ritmo, para resolver o problema do salario famlia devemos garantir que o
salario e o no de lhos sejam n~ao negativos.
-
64 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
1 public class Departamento {23 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 salario: ");9 salario = tec.nextDouble ();10 } while (salario < 0);1112 do {13 System.out.print("Digite n o filhos: ");14 filhos = tec.nextInt ();15 } while (filhos < 0);1617 double salarioFamilia = 0;18 if (salario
-
3.3. FOR (PARA) 65
3.3 for (para)
Castigo por jogar avi~oes na sala de aula
O comando de repetic~ao for e utilizado quando sabemos a quantidade
de vezes que um conjunto de instruc~oes ser~ao executadas. Segue abaixo a
sintaxe basica do comando for:
1 for (; ; ) {2 // coloque aqui as instruc~oes3 //que ser~ao executadas enquanto4 //a for verdadeira5 }
O comando for pode ser interpretado do seguinte modo:
1. declaro e inicializo a variavel de controle
2. enquanto condic~ao e verdadeira, executo as instruc~oes do
bloco; se a condic~ao e falsa saio do for
3. atualizo a variavel de controle (pode ser um incremento
ou decremento)
4. apos a volto para testar a
-
66 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
1 para de ate passo faca
2 // coloque aqui as instruc~oes3 //que ser~ao executadas enquanto 4 //n~ao ultrapassar 5 fimpara
Vejamos a instruc~ao equivalente no VisuAlg:
Vamos trabalhar com um problema bem simples para exemplicar o uso
do comando for
Problema 3.5 Escreva um algoritmo que recebe um numero inteiro positivo
n e imprime todos os numeros de 1 ate n.
Vamos fazer um esboco da soluc~ao para ilustrar as instruc~oes que ser~ao
colocadas dentro de um comando de repetic~ao.
1 public class Imprime {23 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 numeros de 1 a n
Note a repetic~ao das instruc~oes das impress~oes, podemos substitu-las por
um comando de repetic~ao. Segue a soluc~ao usando o comando for:
-
3.3. FOR (PARA) 67
1 public class Imprime {23 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
-
68 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
Vamos ver um outro exemplo de problema que utiliza um comando de
repetic~ao.
Problema 3.6 Escreva um algoritmo que recebe um numero 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 adic~ao a
cada iterac~ao do comando de repetic~ao. Usaremos nosso velho e conhecido
comando soma = soma + num para essa nalidade. A Figura 3.17 ilustra a
soluc~ao usando o comando for.
1 import java.util.Scanner;23 public class SomaNatural {45 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
-
3.4. EXERCICIOS 69
3.4 Exerccios
1. Dada uma seque^ncia de numeros inteiros onde o ultimo elemento e
o 0, escreva um algoritmo que calcula a soma dos numeros pares da
seque^ncia.
2. Dados o numero n de alunos de uma turma de Algoritmos e suas notas
da primeira prova, determinar a media das notas dessa turma. Consi-
dere que o usuario digite as informac~oes 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 seque^ncia de n numeros reais, es-
creva um algoritmo que conta e imprime a quantidade de numeros
positivos e a quantidade de numeros negativos.
5. Escreva um algoritmo que, dados um numero inteiro positivo n, im-
prime na tela a contagem de todos os divisores positivos de n.
6. Em uma prova de concurso com 70 quest~oes haviam 20 pessoas concor-
rendo. Sabendo que cada quest~ao vale 1 ponto, escreva um algoritmo
que le^ a pontuac~ao da prova obtida de cada um dos candidatos e cal-
cula:
(a) a maior e a menor nota
(b) o percentual de candidatos que acertaram ate 20 quest~oes, o per-
centual que acertaram de 21 a 50 e o percentual que acertou acima
de 50 quest~oes
7. Um numero inteiro positivo n e denominado primo se existirem apenas
-
70 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
dois divisores inteiros positivos dele: o 1 e o proprio n. Escreva um
algoritmo que recebe um inteiro n e verica se n e primo ou n~ao.
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 nal em dinheiro se d car 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, ent~ao 6! = 123456 = 720.
10. No problema de vericar se um numero e primo ou n~ao resolvemos
contando o numero de divisores. Tambem podemos pensar em resolver
este problema encontrando um divisor diferente de 1. Se tal divisor for
o proprio n, signica que n e primo, caso contrario, dizemos que ele
n~ao e primo. Pensando nessa ideia, escreva um algoritmo que verica
se n e primo ou n~ao. Ao inves do comando for use o comando while
11. Se Fn e o n-esimo numero da seque^ncia de Fibonacci, podemos calcula-
la atraves da seguinte formula de recorre^ncia:
Fn =
8>: 1 se n = 1 ou n = 2;Fn1 + Fn2 se n > 2Vamos mostrar os 10 primeiros numeros da seque^ncia de Fibonacci:
1; 1; 2; 3; 5; 8; 13; 21; 34; 55
Escreva um algoritmo que dado n, calcula o n-esimo numero da seque^ncia
de Fibonacci.
-
3.4. EXERCICIOS 71
12. Uma das maneiras de evitar erros na digitac~ao de numeros como conta
corrente, CPF, boleto bancario e a utilizac~ao de um ou mais dgitos de
controle. Um dos metodos de calculo e a utilizac~ao do metodo modulo
10. Segue a descric~ao do algoritmo: Dado um numero inteiro n deve-
mos pegar cada dgito desse numero comecando pela casa das unidades
e multiplicar, alternadamente, por 2 e por 1. Caso o resultado da mul-
tiplicac~ao seja um numero maior ou igual a 10 devemos simplicar esse
valor somando os dois dgitos. Apos feitas as multiplicac~oes e as sim-
plicac~oes devemos somar todos os valores e calcular o resto da divis~ao
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 numero do meio do boleto, o numero cor-
responde a n = 246421501 e o dgito de controle sera 7. Vamos efetuar
os seguintes calculos:
1 2 = 20 1 = 05 2 = 101 1 = 12 2 = 4
-
72 CAPITULO 3. ESTRUTURAS DE REPETIC ~AO
4 1 = 46 2 = 124 1 = 42 2 = 4
Da somamos 2 + 0 + 1(1 + 0) + 1 + 4 + 4 + 3(1 + 2) + 4 + 4 = 23. O
resto da divis~ao 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 numero 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 informac~oes sempre foi um dos
objetivos de estudos da Cie^ncia da Computac~ao. Todos os dias ouvimos falar
de uma nova ferramenta de BI, uma maneira de trabalhar com BIG Data ou
um novo software para Minerac~ao de Dados, todas essas tecnologias com-
provam a importa^ncia de aprender a trabalhar com conjunto de informac~oes.
Neste captulo sera introduzido o vetor que e um recurso presente nas lin-
guagens de programac~ao que permite a representac~ao, o armazenamento e a
manipulacao de conjunto de informac~oes dentro dos algoritmos.
73
-
74 CAPITULO 4. VETOR
4.1 Preliminares, denic~ao e exemplos
Antes de denirmos 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 Algorit-
mos. 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 caram abaixo da media e quantos alunos caram 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
especicados.
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 ultima nota, n~ao temos condic~ao de contar o no de alunos que
caram abaixo e acima da media. Para resolver esse problema, poderamos
adotar duas soluc~oes:
1. todas as notas teriam que ser digitadas novamente ou
2. armazenar todas as notas digitadas dentro do algoritmo
Claramente a 2a soluc~ao e mais adequada, porem n~ao podemos usar as
variaveis do jeito que conhecemos. Precisamos de variaveis que representam
um conjunto de numeros e e nesse contexto que os vetores ser~ao uteis.
Denic~ao 4.1 Vetor e uma estrutura de dados que armazena uma seque^ncia
de informac~oes, todas do mesmo tipo, com o mesmo identicador e alocadas
em posic~oes consecutivas da memoria RAM.
-
4.1. PRELIMINARES, DEFINIC ~AO E EXEMPLOS 75
Ou seja, um vetor representa um conjunto de variaveis de um mesmo tipo
e com o mesmo identicador. Mas como podemos acessar cada uma dessas
variaveis ja que elas possuem o mesmo identicador? O que distingue cada
uma das variaveis e um ndice que e responsavel por indicar a localizac~ao da
variavel dentro da estrutura.
O codigo int[] v = new int[10]; declara e instancia um vetor v de
numeros inteiros com 10 posic~oes. Cada uma das posic~oes s~ao inicializadas
com o 0 que e o valor default do tipo int. A gura abaixo e a representac~ao
graca do vetor v:
0 1 2 3 4 5 6 7 8 90 0 0 0 0 0 0 0 0 0
Cada uma dos quadrados representa uma variavel e o numero acima re-
presenta o ndice daquela variavel. Veja algumas caractersticas dos vetores:
os ndices dos vetores em Java s~ao numeros inteiros que comecam do 0
para acessar uma variavel do vetor colocamos o nome do vetor e ondice entre colchetes
em Java todos os vetores s~ao objetos, note o new utilizado para instan-ciar o vetor
Veja abaixo algumas instruc~oes exemplicando o uso do vetor v:
1 v[0] = 1;2 v[7] = -3;3 v[4] = 2;4 v[6] = 5
e a gura abaixo demonstra o que ocorre no vetor apos a execuc~ao das
instruc~oes:
-
76 CAPITULO 4. VETOR
0 1 2 3 4 5 6 7 8 91 0 0 0 2 0 5 -3 0 0
Note que o acesso a cada uma das posic~oes pode ser feito de forma in-
dependente, bastando saber o ndice da posic~ao. Uma das maneiras mais
utilizadas para trabalhar com vetores e usar uma variavel inteira para per-
correr os ndices e, consequentemente, todas as suas posic~oes. Veja na Fi-
gura 4.1 um algoritmo que preenche um vetor com capacidade de armazenar
20 numeros inteiros com informac~oes digitadas pelo usuario.
1 import java.util.Scanner;23 public class PreencheVetor {45 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 raz~ao todas as posic~oes do vetor s~ao 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 instruc~ao conjunto.length devolve o valor 20 que representa o tamanho
do vetor.
Veja mais um exemplo:
-
4.1. PRELIMINARES, DEFINIC ~AO E EXEMPLOS 77
Problema 4.2 Escreva um algoritmo que recebe um inteiro n > 0, instancia
um vetor de numeros inteiros com n posic~oes, preenche o vetor com numeros
pares comecando do 0 ate a ultima posic~ao do vetor e depois imprime o
resultado na tela da ultima posic~ao para a primeira. Por exemplo, suponha
n = 9 o vetor resultante do algoritmo devera ser preenchido da seguinte
forma:
0 1 2 3 4 5 6 7 8 90 2 4 6 8 10 12 14 16 18
1 import java.util.Scanner;23 public class PreenchePares {45 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 }1314 int i = numeros.length - 1;15 while (i >= 0) {16 System.out.println(numeros[i]);17 i--;18 }19 }20 }
Figura 4.2: Soluc~ao do Problema 4.2
Agora, vamos resolver o Problema 4.1 proposto no incio do captulo.
-
78 CAPITULO 4. VETOR
1 public class Estatistica {23 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 media foi " + media);35 System.out.println("Maior nota: " + maiorNota);36 System.out.println("Menor nota: " + menorNota);37 System.out.println("Mais ou igual a media: " +
acimaMedia);
38 System.out.println("Menos da media: " +abaixoMedia);
39 }40 }
Figura 4.3: Soluc~ao do Problema 4.1
-
4.1. PRELIMINARES, DEFINIC ~AO E EXEMPLOS 79
Nos dois algoritmos anteriores instanciamos o vetor com a capacidade
de armazenamento necessaria para resolver o problema. Porem, uma vez
instanciado n~ao podemos aumentar ou diminuir sua capacidade. Nem todos
os problemas antecipam a quantidade de informac~oes que ser~ao 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 seque^ncia de nomes onde o ultimo nome dessa
seque^ncia 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 seque^ncia de nomes seja: "Joaquim", "Manoel", "Pedro"e ;
seu algoritmo devera mostrar na tela (um em cada linha): Pedro, Manoel e
Joaquim.
Para este problema, devermos armazenar todos os nomes antes de im-
primir na tela. Ou seja, devemos usar um vetor de String mas com qual
capacidade? Veja a soluc~ao na Figura 4.4.
-
80 CAPITULO 4. VETOR
1 import java.util.Scanner;23 public class NomesInvertidos {45 public static void main(String args []){6 Scanner tec = new Scanner(System.in);7 // Espero que 100 nomes seja suficiente8 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 }2223 // vamos usar o comando for a partir do valor
qtd -1 ate chegar no zero
24 for (int i = qtd - 1; i >= 0; i--) {25 System.out.println(nomes[i]);26 }27 }28 }
Figura 4.4: Soluc~ao do Problema 4.3
Na linha 18 verico se a sada do comando de repetic~ao se deu por conta
termino da seque^ncia ou se todas as posic~oes foram usadas. Se o tamanho
do vetor n~ao for suciente para armazenar todos os nomes, e exibida uma
mensagem e o algoritmo termina.
-
4.1. PRELIMINARES, DEFINIC ~AO E EXEMPLOS 81
Algumas vezes, precisamos executar nosso programas com dados aleatorios
e, na maioria das linguagens, ha geradores de numeros aleatorios. Na lingua-
gem Java n~ao e diferente, temos o metodo Math.random() que gera numeros
aleatorios entre 0 e 1 ou a classe Random que possui mais metodos para
gerac~ao de numeros aleatorios. Ilustraremos um pouco o uso da classe Ran-
dom atraves do proximo problema.
Problema 4.4 Escreva um algoritmo que recebe um numero n inteiro posi-
tivo, cria um vetor de numeros inteiros com n posic~oes, preenche todas as
posic~oes do vetor com numeros aleatorios entre 0 e 999. Depois de criado
e preenchido o vetor, faca um clone deste vetor e mostre todos os numeros
deste vetor na tela.
-
82 CAPITULO 4. VETOR
1 import java.util.Random;2 import java.util.Scanner;34 public class Aleatorio {56 public static void main(String [] args) {7 Scanner tec = new Scanner(System.in);8 System.out.print("Digite n: ");9 int n = tec.nextInt ();10 int[] vetor = new int[n];11 Random rand = new Random ();12 for (int i = 0; i < n; i++) {13 vetor[i] = rand.nextInt (1000);14 }15 int[] vetorClonado = new int[n];16 for (int i = 0; i < n; i++) {17 vetorClonado[i] = vetor[i];18 }19 for (int i = 0; i < n; i++) {20 System.out.println(vetorClonado[i]);21 }22 }23 }
Figura 4.5: Soluc~ao do Problema 4.4
Vamos mostrar alguns exemplos envolvendo metodos:
Problema 4.5 Escreva um metodo que clona um vetor. Seu metodo recebe
como para^metro um vetor de numeros inteiros e retorna um outro vetor com
a mesma capacidade e com o mesmo conteudo.
4.2 Exerccios: vetores de tipos basicos
1) Faca um programa que preencha com 10 numeros 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 {23 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 }1011 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: Soluc~ao do Problema 4.4
numeros negativos e a soma dos numeros positivos desse vetor.
2) Dados um numero inteiro n e uma seque^ncia de n numeros reais, escreva
um algoritmo que armazena os n numeros no vetor e depois encontra
o maior e o menor numero.
3) Dados um inteiro n e uma seque^ncia de n numeros reais, escreva um
algoritmo que armazena os n numeros no vetor e depois calcula a so-
matoria dos numeros que est~ao 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.
-
84 CAPITULO 4. VETOR
5) Dados n e uma seque^ncia de n numeros inteiros, escreva um algoritmo
que armazena os n numeros 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 elesse encontrem no meio do vetor.
6) Crie tre^s vetores de: String, int e double, cada um com 10 posic~oes.
Nesses tre^s vetores voce^ devera armazenar o nome do aluno (vetor
de String), o rm (vetor de int) e a media nal (vetor de double) da
disciplina de algoritmos. Depois de armazenado, imprima o nome e
o RM dos alunos que foram reprovados em algoritmos (media < 4),
caram de exame (4 < media < 6) e foram aprovados (media >= 6).
E se fosse resolver usando orientac~ao a objetos, o que voce^ faria?
7) Crie uma classe Estatistica, dentro dela, escreva o metodo mediaAritmetica
que recebe um vetor de numeros reais e retorna a media aritmetica dos
numeros contidos no vetor. Faca um metodo main para testar esse
metodo.
8) Acrescente na classe anterior o metodo desvioPadrao que recebe um
vetor de numeros reais e retorna o desvio padr~ao desses numeros. O
desvio padr~ao que, normalmente, e representado por pode ser calcu-
lado atraves da seguinte formula:
=
sPn1i=0 (x[i] x)2
n 1 (4.1)
onde x representa o vetor, n e o tamanho de x e x e a media dos
numeros do vetor.
9) Escreva um algoritmo que le^ um inteiro n que representa o numero 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 contribuic~ao 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 contribuic~ao alquota/valorate R$ 1.317,07 8%de R$ 1.317,08 ate R$ 2.195,12 9%de R$ 2.195,13 ate R$ 4.390,24 11%acima de R$ 4.390,24 11% sobre R$ 4.390,24
Tabela 4.1: Contribuic~ao INSS 2014
10) Escreva um metodo que recebe como para^metro 2 vetores a e b de
numeros reais e devera retornar um terceiro vetor contendo todos os
numeros contidos no vetor a e todos os numeros contidos no vetor b.
Faca um metodo main que devera chamar o metodo criado e imprimir
todo o conteudo do terceiro vetor.
11) Escreva um metodo chamado intercala que recebe como para^metro
2 vetores a e b de numeros 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
-
Ape^ndice A
Correc~ao dos exerccios da
Introduc~ao
3. Escreva um algoritmo que recebe um numero x ele imprime x2. Lembre-
se que x2 = x x.
1 algoritmo "quadrado"
2 var
3 x, pot: real
4 inicio
5 escreva("Digite n o ")
6 leia(x)
7 pot = x * x
8 escreva("Sada: ", 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
-
88 APE^NDICE A. CORREC ~AO DOS EXERCICIOS DA INTRODUC ~AO
2 var
3 raio , area , perimetro: real
4 inicio
5 escreva("Digite raio ")
6 leia(raio)
7 area = raio * raio * 3.14
8 perimetro = 2 * 3.14 * raio
9 escreval("Area: ", area)
10 escreval("Permetro: ", perimetro)
11 fimalgoritmo
5. Alem das 4 operac~oes matematicas, as linguagens de programac~ao pos-
suem o operador resto da divis~ao. O resto da divis~ao e uma operac~ao
que envolve apenas numeros inteiros e, na linguagem VisualG, e repre-
sentada pelo operador % ou o mod. Vejamos um exemplo:
1 a
-
89
numero. Dica: usando papel e lapis faca a divis~ao do numero por 10
mas n~ao coloque vrgula e nem acrescente 0 na divis~ao.
1 algoritmo "divisao"
2 var
3 num: inteiro
4 dezena: inteiro
5 unidade: inteiro
6 inicio
7 // entrada de dados
8 escreva("Digite um numero entre 0 e 99: ")
9 leia(num)
10 dezena
-
90 APE^NDICE A. CORREC ~AO DOS EXERCICIOS DA INTRODUC ~AO
7 escreva("Digite o n o de calcas: ")
8 leia(y)
9 escreva("Digite o n o de pares de sapatos: ")
10 leia(z)
11 escreva("Voce^ 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
4 desconto , novopreco : real
5 inicio
6 // Sec~ao de Comandos
7 escreva("digite preco: ")
8 leia(preco)
9 escreva("digite desconto %: ")
10 leia(percentual)
11
12 desconto
-
91
16 escreval("O novo preco 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 dista^ncia em metros e o tempo em segundos.
1 algoritmo "cemmetros"
2 var
3 espaco , tempo: real
4 velocidade , velocidadeKM: real
5 inicio
6 escreva("Digite a metragem da corrida")
7 leia(espaco)
8 escreva("Digite o tempo (s): ")
9 leia(tempo)
10
11 velocidade
-
92 APE^NDICE A. CORREC ~AO DOS EXERCICIOS DA INTRODUC ~AO
aumento e devera calcular e exibir o percentual de aumento que Jo~ao
obteve.
1 algoritmo "percentual"
2 var
3 salAntes , salDepois: real
4 relativo , percent: real
5 inicio
6 escreva("Digite salario antes do aumento: ")
7 leia(salAntes)
8 escreva("Digite salario depois do aumento: ")
9 leia(salDepois)
10
11 relativo
-
93
5 inicio
6 escreva("Digite RM:")
7 leia(rm)
8 soma
-
94 APE^NDICE A. CORREC ~AO DOS EXERCICIOS DA INTRODUC ~AO
-
Ape^ndice B
Correc~ao dos exerccios do
Capitulo 2
1. Faca um algoritmo que receba um numero e mostre uma mensagem
caso este numero seja maior que 10.
1 algoritmo "ex1"
2 var
3 numero: real
4 inicio
5 escreva("Digite n o : ")
6 leia(numero)
7 se (numero > 10)
8 escreva(numero , " e maior que 10")
9 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 APE^NDICE B. CORREC ~AO DOS EXERCICIOS DO CAPITULO 2
1 algoritmo "ex2"
2 var
3 num1 , num2: real
4 inicio
5 escreva("Digite 1 o numero: ")
6 leia(num1)
7 escreva("Digite 2 o numero: ")
8 leia(num2)
9 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 numero de gols
marcados em uma partida. Escrever o nome do vencedor. Caso n~ao
haja vencedor devera ser impresso a palavra EMPATE.
1 algoritmo "exe4"
2 var
3 timeCasa , timeVisitante: caracter
4 golCasa , golVisitante: inteiro
5 inicio
-
97
6 // Sec~ao de Comandos
7 escreva("Time da casa:")
8 leia(timeCasa)
9 escreva("Time visitante:")
10 leia(timeVisitante)
11 escreva("Gols da casa:")
12 leia(golCasa)
13 escreva("Gols visitante:")
14 leia(golVisitante)
15
16 se golCasa > golVisitante entao
17 escreval("Time da casa venceu!")
18 senao
19 se golCasa < golVisitante entao
20 escreval("Time visitante venceu!")
21 senao
22 escreval("Houve empate")
23 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 traba-
lhar 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
numero de horas trabalhadas em um me^s, o salario por hora e escreva
-
98 APE^NDICE B. CORREC ~AO DOS EXERCICIOS DO CAPITULO 2
o salario total do funcionario (considere que o me^s possua 4 semanas
exatas).
1 algoritmo "exe5"
2 var
3 horasTrabalhadasMes:real
4 salarioHora: real
5 horaExtra: real
6 salario: real
7
8 inicio
9 escreva("Digite horas trabalhadas mes")
10 leia(horasTrabalhadasMes)
11 escreva("Salario hora:")
12 leia(salarioHora)
13
14 horaExtra 0 entao
17 salario
-
99
6. Faca um programa para ler dois numeros 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: ")
6 leia(a)
7 escreva("Digite divisor: ")
8 leia(b)
9 resto
-
100 APE^NDICE B. CORREC ~AO DOS EXERCICIOS DO CAPITULO 2
8 se (numero < 0) entao
9 escreva("Numero negativo. Impossvel
calcular raiz quadrada")
10 senao
11 resultado
-
101
11 senao
12 se (idade < 5) entao
13 escreva("Abaixo de 5 anos , n~ao ha
categoria")
14 senao
15 se (idade < 7) entao
16 escreva("Infantil")
17 senao
18 se (idade < 10) entao
19 escreva("Juvenil")
20 senao
21 se (idade < 15) entao
22 escreva("Adolescente")
23 senao
24 se (idade < 30) entao
25 escreva("Adulto")
26 senao
27 escreva("Se^nior")
28 fimse
29 fimse
30 fimse
31 fimse
32 fimse
33 fimse
34 fimalgoritmo
9. Uma equac~ao de 2o grau e da forma: ax2 + bx + c = 0, onde a 6= 0.
-
102 APE^NDICE B. CORREC ~AO DOS EXERCICIOS DO CAPITULO 2
Escreva um algoritmo que recebe os tre^s coecientes da equac~ao, calcula
e imprime as razes reais se for possvel. Use a seguinte formula para
resolver a equac~ao:
= b2 4acx1 =
b+p2a
x2 =bp
2a
1 algoritmo "semnome"
2 var
3 a, b, c: real
4 delta , x1 , x2: real
5 inicio
6 // leitura dos dados
7 escreva("Digite a:")
8 leia(a)
9 escreva("Digite b:")
10 leia(b)
11 escreva("Digite c:")
12 leia(c)
13
14 // processamento
15 se (a = 0) entao
16 escreva("N~ao e equac~ao de 2 o grau")
17 senao
-
103
18 delta
-
104 APE^NDICE B. CORREC ~AO DOS EXERCICIOS DO CAPITULO 2
7 escreva("Preco do produto: ")
8 leia(preco)
9 escreva("Forma pagto (1,2,3,4):")
10 leia(formaPgto)
11 se (formaPgto = 1) entao
12 escreva("Valor do produto: ", preco *
0.9)
13 senao
14 se (formaPgto = 2) entao
15 escreva("Valor do produto: ", preco *
0.95)
16 senao
17 se (formaPgto = 3) entao
18 escreva("Valor do produto: 2x",
preco /2)
19 senao
20 escreva("Valor do produto: 4x",
preco *1.07/4)
21 fimse
22 fimse
23 fimse
24 fimalgoritmo
11. Faca um algoritmo que leia as medias semestrais obtidas por um aluno
na disciplina de Algoritmos, o numero de aulas ministradas e o numero
de aulas assistidas por este aluno nesta disciplina. Calcule e mostre a
media nal 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 freque^ncia.
1 algoritmo "semnome"
2 var
3 media1sem , media2sem: real
4 mediaFinal: real
5 aulasMinistradas , aulasAssistidas: integer
6 frequencia: real
7 inicio
8 escreva("Media 1 o semestre: ")
9 leia(media1sem)
10 escreva("Media 2 o semestre: ")
11 leia(media2sem)
12
13 se (media1sem < 0) ou (media1sem > 10) ou (
media2sem < 0) ou (media2sema > 10) entao
14 escreva("notas invalidas , execute
novamente o programa")
15 fimalgoritmo
16 fimse
17 mediaFinal
-
106 APE^NDICE B. CORREC ~AO DOS EXERCICIOS DO CAPITULO 2
22 leia(aulasAssistidas)
23
24 se (aulasMinistradas < 0) ou (
aulasAssistidas < 0) entao
25 escreva("notas invalidas , execute
novamente o programa")
26 fimalgoritmo
27 fimse
28
29 // frequencia maior ou igual a 75% para
aprovac~ao
30 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 fimse
40 fimse
41 senao
42 escreva("Retido por falta")
43 fimse
44 fimalgoritmo
-
107
12. Desenvolva um algoritmo que informe se uma data e valida ou n~ao. O
algoritmo devera ler 2 numeros inteiros, que representem o dia e o me^s
e informar se e um dia do me^s valido. Desconsidere os casos de ano
bissexto, ou seja, fevereiro te^m 28 dias.
1 algoritmo "semnome"
2 var
3 dia , mes: inteiro
4 inicio
5 escreva("Informe o dia")
6 leia(dia)
7 escreva("Informe o me^s")
8 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
-
108 APE^NDICE B. CORREC ~AO DOS EXERCICIOS DO CAPITULO 2
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 tre^s numeros inteiros e imprime eles
em ordem crescente.
1 algoritmo "semnome"
2 var
3 a, b, c: inteiro
4 inicio
5 // Sec~ao de Comandos
6 escreva("Digite a: ")
7 leia(a)
8 escreva("Digite b: ")
9 leia(b)
10 escreva("Digite c: ")
11 leia(c)
12
13 se (a
-
109
16 se (a