109
Introdu¸c˜aoaPrograma¸c˜ ao — Algoritmos Eduardo Gondo 2015

Apostila de algoritmo - Basico + Exercicios

Embed Size (px)

DESCRIPTION

Apostila de algoritmo, primeiro semestre de tec. analise de sistemas.

Citation preview

  • 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