Você está na página 1de 47

Captulo 1 Introduo e Conceitos Fundamentais

Todo mundo que tem contato com computadores sabe que eles precisam ser programados para executar tarefas. Um programa um conjunto de milhares de instrues que indicam ao computador, passo a passo, o que ele tem que fazer. Estes programas so construdos com ferramentas chamadas "linguagens de programao". Estas linguagens contm os comandos que fazem o computador escrever algo na tela, realizar clculos aritmticos, receber uma entrada de dados via teclado, e milhares de outras coisas, mas estes comandos precisam estar em uma ordem lgica e contribuir, cada um, para a tarefa em questo. A lgica da programao, ento, o ponto principal na criao de aplicaes para os computadores, e na verdade, ela independe da linguagem de programao utilizada. Provavelmente voc j viu uma receita de bolo. Nela esto colocados os ingredientes necessrios e nas quantidades corretas; tambm na receita encontramos o modo de preparao, dizendo o que deve ser misturado com o que, em que ordem, o tempo em que o bolo ficar no forno, etc. A este conjunto de instrues poderamos dar o nome de "algoritmo para a confeco de um bolo". A palavra algoritmo significa "conjunto de regras e instrues, que devem ser seguidas na ordem especificada, para resolver um problema especfico". Este termo est ligado s cincias da computao, mas na realidade pode ser aplicado a qualquer problema cuja soluo possa ser decomposta em um grupo de instrues. A nica diferena no caso que, em relao ao computador, os comandos tm que ser precisos, e cada um deve conter uma tarefa, apenas. Um computador no entenderia a instruo "bata a massa at atingir a consistncia desejada..." Provavelmente teramos que dizer "ligue a batedeira; bata a massa durante 5 minutos; desligue a batedeira", ou coisa parecida. O termo "processamento de dados" muitas vezes utilizado em conjunto com computadores, pois isto o que eles fazem: processar dados. Da podemos extrair os dois componentes bsicos de um algoritmo (de agora em diante, esta palavra ser sempre utilizada no contexto da informtica): dados e cdigo. Dados so os valores (nmeros, nomes, etc.) de que precisamos para resolver o problema, e cdigo so os comandos que usaremos para manipular e "processar" os dados. A partir de agora estudaremos estes dois componentes . Tipos de Dados Os dados existem nas mais variadas formas, tanto no mundo real quanto nos computadores, mas para este curso usaremos trs tipos, que sero suficientes embora no representem toda a gama possvel. Estes tipos so: Dados Numricos - representam quantidades como o peso de uma pessoa, o nmero de alunos em uma sala de aula, o preo de uma mercadoria, uma temperatura, etc. Nos algoritmos so representados como na escrita corrente, com a exceo de que se usa o ponto e no a vrgula para se separar a parte decimal, e no se separam as casas de milhares, milhes, etc. Usaremos dois subtipos: os valores inteiros, aqueles que por natureza no tm parte fracionria (exemplos: nmero de alunos em uma turma, estoque de latas de Coca-Cola em um mercado, etc.) , e os reais, que podem t-la (exemplo: o peso de uma pessoa, o preo de uma mercadoria, etc.). Exemplos: 7, 1.23, -3, 45657, 0.66, -1897.06, etc. Dados Caracter ou Literais - representam letras, nomes, sinais de pontuao, etc. Outros nome usado para este tipo de dados cadeia ou string (por causa do ingls string of characters, isto , uma cadeia de caracteres). Nos algoritmos so representados entre aspas. Exemplos: "Rio de Janeiro", "Computador", "A", "?", "Fora!" Dados Lgicos - representam apenas dois valores: FALSO ou VERDADEIRO. Tambm so chamados de dados booleanos. Vamos estudar com mais profundidade este tipo frente no curso. Ele importante porque d a "inteligncia" aos programas de computador, mas neste momento podemos ficar s com esta pequena explicao.

E como os dados esto representados nos algoritmos? De duas maneiras: como constantes, ou seja, o dado escrito como ele , como nos exemplos acima, ou armazenados em variveis. Vamos fazer uma analogia com a lgebra da escola para que voc entenda melhor. Na equao y = x + 2, por exemplo, o valor 2 uma constante (2 sempre 2), enquanto que x e y so variveis (podemos achar muitos valores de x e y que satisfazem a equao). Ento, x e y so como que nomes que damos a um objeto que contm um determinado valor em um determinado momento, valor este que pode mudar da o nome varivel. Vamos agora estender este conceito ao mundo dos computadores.

Variveis Variveis so locais de armazenamento temporrio para os dados. Como voc deve saber, os programas so executados na memria de um computador, e tanto o cdigo (as instrues) do programa quanto os dados que ele manipula ali residem. Cada valor que um programa usa est armazenado em um local determinado da memria do computador, onde pode ser examinado ou modificado, usado em clculos, etc. Embora seja possvel se criar um algoritmo que no use variveis, ele no seria capaz de fazer muita coisa... So rascunhos que o programa (representado pelo algoritmo) usa para guardar os dados que so introduzidos pelo usurio (via digitao, por exemplo), realizar seus clculos e mostrar os resultados. um conceito parecido com os famosos x, y e z que usamos na lgebra. Elas tm trs caractersticas: Nome: como nos referimos s variveis. Os nomes geralmente descrevem a funo das variveis no programa; por exemplo, se voc tem um programa para calcular a mdia aritmtica de dois valores, teria as variveis PrimeiroValor, SegundoValor, e Media; j em um outro, poderia ter a varivel Salario, para armazenar o salrio de um funcionrio, etc. Tipo: indica o tipo de dado que ela armazena. Assim, uma varivel pode ser do tipo numrico, caracter (o mesmo que literal) ou lgico. Quando se define uma varivel para uso no programa (os programadores dizem "declarar uma varivel"), temos que indicar ao computador no s o seu nome, mas tambm o tipo de dados que ela vai armazenar. Contedo: o valor armazenado na varivel em determinado momento. Podemos fazer duas coisas com o contedo de uma varivel: examin-lo, ou seja "ver o que ela contm, para usar ou no", e modific-lo. Quando criamos uma varivel em um programa, ela est "vazia", ou seja, seu contedo indeterminado. Para que ela tenha utilidade, devemos dar-lhe valores que tenham a ver com o problema em questo (os programadores usam a expresso "atribuir valores a ela").

As Partes de um Algoritmo Um algoritmo se compe de duas partes bsicas: a rea de declarao das variveis, onde informamos ao computador o nome e tipo das variveis que usaremos, e a parte de comandos, onde o cdigo que far o programa funcionar ser escrito. Quase todas as linguagens de programao exigem a declarao das variveis de um programa. Em algumas (bem poucas) isto facultativo, mas sempre uma boa tcnica declarar variveis, por vrios motivos. Portanto, para treinar as tcnicas corretas, vamos assumir que a declarao de variveis sempre obrigatria, mesmo que o nosso algoritmo no saia nunca do papel. A seguir vemos um exemplo de esqueleto de um algoritmo: algoritmo "exemplo" var inicio fimalgoritmo Neste exemplo vemos o uso de quatro palavras-chave que indicam as partes de um algoritmo: a primeira a palavra algoritmo, que marca o incio do algoritmo. Note que ela vem seguida do nome do algoritmo, entre aspas. Este nome geralmente descreve o que algoritmo faz, de maneira bem sucinta; logo depois vemos a palavra-chave var, que indica o incio da seo de declarao de variveis. Esta palavra s aparece uma vez no algoritmo; depois vem a palavra-chave inicio (note que est sem o acento...), que marca o comeo da seo de comandos do algoritmo; por ltimo, temos a palavra-chave fimalgoritmo (assim mesmo, tudo junto), que marca naturalmente o fim do cdigo do algoritmo.

Conforme vimos anteriormente, toda varivel tem um nome, e fica ao critrio do programador dar os nomes que quiser s variveis de seus programas. Existem, porm, regras (e cada linguagem de programao tem as suas) para a sua formao. Ns tambm as teremos: neste curso, os nomes de variveis devero comear com um sublinhado ("_") ou uma letra, e depois podero ter qualquer combinao de letras, nmeros e sublinhado. No pode haver espaos no interior dos nomes, e no haver diferenciao entre maisculas e minsculas (ou seja, os nomes "Salario", "SALARIO", e "salario" se referem mesma varivel. Tambm no usaremos nenhum tipo de acentuao, pontuao, til ou cedilha nos nomes. Exemplos: Nomes vlidos: Valor1, Valor2, Nota_do_Aluno, Salario, _SOMA Nomes invlidos: 1Valor, 2Valor, Salrio, Nota.do.Aluno, Media-Aritmetica, Variao, TOTAL GERAL, RESPOSTA? Para terminar, lembramos que as palavras-chave no podem ser usadas como nome de variveis. Assim, no possvel haver uma varivel chamada inicio, ou algoritmo. Declarando Variveis Para declarar uma varivel, colocamos, no incio do algoritmo, seu nome, seguido por dois pontos, e seu tipo: Salario : real Nome : caracter Se tivermos mais de uma varivel do mesmo tipo, podemos colocar todas, separadas por vrgulas, na mesma declarao: Peso, Altura: real Idade : inteiro Voltando ao exemplo visto acima, ele ficaria assim com a declarao destas variveis: algoritmo "exemplo2" var Nome : caracter Peso, Altura : real Idade : inteiro Estrangeiro : logico inicio fimalgoritmo Nota: Alguns autores usam o tipo de dados literal como um sinnimo para caracter. Note tambm que no utilizamos acentos nos nomes dos tipos das variveis, e que estas cinco palavras (inteiro, real, caracter, literal e logico) so palavras-chave. Atribuindo Valores a Variveis Quando declaramos uma varivel, criamos uma rea de armazenamento para os dados, mas ela ainda est sem valor. Para que a varivel seja til, deve ter valores colocados por ns. A isto se chama "atribuir valores". A atribuio de valores feita pelo operador de atribuio "<-" (uma seta apontando para a esquerda). Por exemplo: Peso <- 78 Este comando atribui varivel Peso o valor 78. Diz-se no linguajar dos programadores que Peso recebe 78. Nome <- "Joo da Silva" Este comando atribui varivel Nome o valor "Joo da Silva", isto , Nome recebe Joo da Silva. importante lembrar que s se podem atribuir a uma varivel valores do mesmo tipo daquela varivel. Nos exemplos acima, Salario do tipo real (um tipo numrico); ento, o seguinte comando seria invlido:

Salario <- "Insuficiente" Uma varivel, como o prprio nome est dizendo, pode ter seu contedo (seu valor) mudado quantas vezes for necessrio durante a execuo de um algoritmo ou programa. As atribuies de valores so comandos, e por isso devem ficar depois da palavra-chave inicio. algoritmo "exemplo3" var Salario : real Nome : caracter Peso, Altura : real Idade : inteiro Estrangeiro : logico inicio Peso <- 78 Nome <- "Joao da Silva" fimalgoritmo Exibindo o Valor de uma Varivel Um programa que faa o seu processamento e no tenha como mostrar seus resultados intil. Portanto, em algum ponto deve haver a exibio de valores, e todas as as linguagens de programao tm comandos para este fim. Nos algoritmos usamos o comando escreva para isto. A sintaxe deste comando, isto , o modo correto de ele ser usado, a seguinte: escreva(expresso1, expresso2, etc... ) ou escreval(expresso1, expresso2, etc... ) expresso1, expresso2, etc. so valores de qualquer tipo, separados por vrgula. Estes valores podem ser constantes, variveis ou mesmo expresses, que sero calculadas e tero seu valor final exibido. Caso a expresso seja uma varivel, ser exibido o seu valor. Veja os exemplos a seguir (suponha que a varivel Nome do tipo literal ou caracter e Idade do tipo inteiro): Comandos escreva("Al, mundo!") escreva(20) Nome <- "Jos" Idade <- 40 escreva(Nome) escreva("O meu nome ", Nome) escreva("Tenho ",Idade," anos") escreva("Em 3 anos terei ",Idade+3," anos") Resultado (o que aparecer na tela do computador) Al, mundo! 20

Jos O meu nome Jos Tenho 40 anos Em 3 anos terei 43 anos

E qual a diferena entre escreva e escreval ? Bem, imagine a tela do computador como sendo composta de vrias linhas. Depois que o programa escreve algo na tela ele pode pular para a prxima linha, de modo que a prxima coisa a ser escrita seja colocada no incio desta nova linha, ou continuar na mesma, para que os prximos dados sejam colocados na frente do que j est na tela. Esta a diferena entre escreva e escreval. Com o comando escreva, o computador no pula de linha ao terminar de colocar os dados na tela, e com escreval ele pula. Veja os exemplos a seguir, considerando os mesmos valores para as variveis Nome e Idade.: Comandos escreva("O meu nome ") escreval(Nome) escreva("Tenho ",Idade) Resultado (o que aparecer na tela do computador) O meu nome Jos Tenho 40 anos Em 3 anos terei 43 anos

escreval(" anos") escreva("Em 3 anos terei ") escreva(Idade+3) escreva(" anos") Obtendo Dados para o Programa Nem todos os dados que um programa manipula so gerados por ele. Um programa de caixa automtico, por exemplo, tem que obter do usurio o nmero da conta, a senha, a opo de servio desejada, etc. Assim, deve haver um meio para que sejam digitados (ou fornecidos de outra maneira) dados para uso do programa. Mais uma vez, todas as linguagens de programao permitem isto, e nos algoritmos usamos o comando Leia. A sintaxe deste comando : leia(Varivel1, Varivel2, etc... ) Varivel1, Varivel2, etc. so as variveis onde sero armazenados os dados digitados, na ordem em que forem fornecidos. Veja este exemplo: leia(Nome, Peso ) Supondo que o usurio digitou "Paulo", teclou ENTER, digitou 80 e teclou ENTER novamente, o valor "Paulo" foi atribudo automaticamente varivel Nome, e o valor 80 varivel Peso. Dica: no uma boa idia usar um comando leia com duas variveis de uma vez, j que isto pode confundir o usurio. Em seus programas sempre use um comando escreva, com a instruo sobre o que deve ser digitado, e um leia logo depois. Use o comando escreva e no escreval para que o cursor fique parado exatamente no fim do texto de instruo, esperando pelos dados do usurio. Veja este exemplo, e note como bem mais fcil para o usurio entender o que se pede: escreva("Digite seu nome: ") leia(Nome) escreva("Digite seu peso: ") leia(Peso)

Captulo 2 - Expresses Aritmticas


Grande parte do processamento em qualquer programa numrica. As linguagens de programao trabalham com a aritmtica mais ou menos do mesmo jeito que ns, na escola (veja bem, mais ou menos...) Os componentes bsicos das expresses aritmticas so: constantes, variveis e operadores. Os dois primeiros j conhecemos; operadores so os "sinais" que usamos nas contas:

Operador + * / DIV MOD

Operao Adio Subtrao Multiplicao Diviso real Diviso inteira (despreza a parte fracionria) Resto da diviso inteira (ou mdulo)

3+2 10 - 5 3*7 25 / 2 25 DIV 2 26 MOD 7

Exemplo =5 =5 = 21 = 12,5 = 12 = 5 ( 26 DIV 7 = 3, resto 5)

Note que no se usa o "X" para indicar a multiplicao, nem a barra horizontal de frao para indicar a diviso... Da mesma maneira que estudamos na escola, algumas operaes tm prioridade sobre as outras. Multiplicao e diviso devem ser operadas antes da adio e subtrao. Assim, na expresso 3 + 2 * 5 primeiro operamos o 2*5, e somamos o resultado com 3 para obter 13. Para mudar a ordem das operaes, usamos parnteses: como na aritmtica da escola, o que estiver entre parnteses ser operado primeiro. Por exemplo: ( 3 + 2 ) * 5 primeiro operamos o 3 + 2, porque est entre parnteses, e depois o resultado desta operao ser multiplicado com 5 para obter 25. Quando na expresso s houver operaes com a mesma prioridade, a avaliao feita normalmente da esquerda para a direita. Nas linguagens de programao e nos algoritmos no se usam colchetes e chaves para sucessivos agrupamentos de operaes, e sim mais parnteses. Vamos ver um exemplo mais complexo. Qual o valor de: ( 3 + 5 ) * ( 4 * ( 10 -7 ) ) / 2 ( 3 + 5 ) * ( 4 * 3 ) / 2 8 * 12 / 2 96 / 2 48 Um outro exemplo: 6 * ( 9 + 3 * 2 ) / ( 2 * 4 - 11 ) 6 * ( 9 + 6 ) / ( 8 - 11 ) 6 * 15 / -3 90 / -3 -30 Opera-se o que estiver nos parnteses mais internos Operam-se os dois parnteses que restaram So h * e / - , ento opera-se da esquerda para a direita Resultado final Operam-se as multiplicaes nos parnteses Operam-se os parnteses So h * e / - opera-se da esquerda para a direita Observe o sinal negativo antes do 3... Resultado final

At agora s vimos expresses com constantes. Na maioria das vezes, porm, haver expresses que combinaro variveis e constantes. Quando houver uma varivel em uma expresso, o clculo deve ser feito usando-se o valor da varivel naquele momento. Como exemplo, veja os trechos de algoritmos a seguir: Comandos 1) var A : inteiro A <- 3 escreva( A * 5 ) Comentrios Declarao da varivel Atribuio de valor Ser exibido o valor 15, pois A=3, logo 3*5 = 15

2) var A, B : inteiro A <- 10 B <- A * 3 escreva(B A + 1) B <- 40 escreva(B A + 1)

Declarao das variveis O valor de B 30 ( 10*3) Ser exibido o valor 21 ( 30 - 10 + 1 ) Novo valor para B Agora ser exibido o valor 31 (40 - 10 + 1), pois o valor de B mudou Declarao da varivel O valor de A 6 Agora o valor de A passa a ser 7 (6, o valor anterior, mais 1) Ser exibido o valor 49 ( 7 * 7 ) Declarao da varivel Obtenha um nmero qualquer do usurio Ser exibido o dobro do nmero digitado (qualquer que ele seja)

3) var A : inteiro A <- 3 * 2 A <- A + 1 escreva(A * A) 4) var X : inteiro escreva("Digite um nmero :") leia(X) escreva(X * 2)

Pelos exemplos acima, voc deve ter notado que podemos usar uma expresso no comando escreva. Ela calculada, e o seu resultado exibido.

Funes Pr-Definidas
Toda linguagem de programao j vem com um grupo de funes que facilitam a vida do programador. Estas funes realizam os clculos aritmticos, trigonomtricos e de manipulao e converso de dados mais comuns; assim, o programador no tem que reinventar a roda a cada programa que faz. A este grupo de funes se d o nome de biblioteca. Como usar uma funo? Em termos simples, uma funo pode ser usada em qualquer lugar onde uma varivel tambm pode, a no ser, naturalmente, no lado esquerdo da seta em um comando de atribuio uma funo produz (diz-se no linguajar dos programadores retorna) um valor, e no o recebe. Vamos agora examinar as funes algbricas e trigonomtricas pr-definidas que usaremos em nossos algoritmos. Abs( expresso) Retorna o valor absoluto de uma expresso do tipo inteiro ou real. Equivale a | expresso |. ArcCos( expresso) Retorna o ngulo (em radianos) cujo co-seno representado por expresso. ArcSen( expresso) Retorna o ngulo (em radianos) cujo seno representado por expresso. ArcTan( expresso) Retorna o ngulo (em radianos) cuja tangente representada por expresso. Cos( expresso) Retorna o co-seno do ngulo (em radianos) representado por expresso. CoTan( expresso) Retorna a co-tangente do ngulo (em radianos) representado por expresso. Exp( base, expoente) Retorna o valor de base elevado a expoente, sendo ambos expresses do tipo real. GraupRad( expresso) Retorna o valor em radianos correspondente ao valor em graus representado por expresso. Int( expresso) Retorna a parte inteira do valor representado por expresso. Log( expresso) Retorna o logaritmo na base 10 do valor representado por expresso. LogN( expresso) Retorna o logaritmo neperiano (base e) do valor representado por expresso. Pi Retorna o valor 3.141592. Quad( expresso) Retorna quadrado do valor representado por expresso. RadpGrau( expresso) Retorna o valor em graus correspondente ao valor em radianos representado por expresso. RaizQ( expresso) Retorna a raiz quadrada do valor representado por expresso. Rand Retorna um nmero real gerado aleatoriamente, maior ou igual a zero e menor que um. RandI( limite) Retorna um nmero inteiro gerado aleatoriamente, maior ou igual a zero e menor que limite.

Sen( expresso) Retorna o seno do ngulo (em radianos) representado por expresso. Tan( expresso) Retorna a tangente do ngulo (em radianos) representado por expresso. Os valores que esto entre parnteses, representados pelas palavras expresso, base e expoente, so os parametros, ou como dizem alguns autores, os argumentos que passamos para a funo para que realize seus clculos e retorne um outro, que usaremos no programa. Algumas funes, como Pi e Rand, no precisam de parmetros, mas a maioria tem um ou mais. O valor dos parmetros naturalmente altera o valor retornado pela funo. A seguir temos alguns exemplos que ilustram o uso das funes. Na medida em que forem necessrias para a resoluo de algum algoritmo, elas sero usadas com explicaes mais detalhadas. algoritmo "exemplo_funcoes" var a, b, c : real inicio a <- 2 b <- 9 escreval( b a ) // ser escrito 7 na tela escreval( abs( a - b ) ) // tambm ser escrito 7 na tela c <- raizq( b ) // c recebe 3, a raiz quadrada de b, que 9 // A frmula da rea do crculo pi (3.1416) vezes raio ao quadrado... escreval("A rea do circulo com raio " , c , " " , pi * quad(c) ) // Um pouco de trigonometria... escreval("Um ngulo de 90 graus tem " , grauprad(90) , " radianos" ) escreval( exp(a,b) ) // escreve 2 elevado 9, que 512 // escreve 1, que a parte inteira de 1.8, resultado de 9/(3+2) escreval( int( b / ( a + c ) ) ) fimalgoritmo

Exerccios
1. Calcule as seguintes expresses, tendo em vista as variveis declaradas, seus tipo e valores, e diga o que o programa imprimir na tela : algoritmo "exercicio1a" var a, b, c, d : real inicio a <- 5 b <- a * 2 c <- 8 d <- 28 escreval( 30 / ( a + b ) ) escreval( ( a + b ) / ( c - 5 ) + ( d / ( c - 1 ) ) ) escreval( a * c * 7 / d - 8 ) escreval( a * c * 7 / ( d - 8 ) ) escreval( log(100) * raizq(16) ) fimalgoritmo algoritmo "exercicio1b" var a, b, c, d : inteiro inicio a <- 4 b <- a * 2 c <- 9 d <- 18 escreval( 37 div a + c )

escreval( escreval( escreval( escreval( fimalgoritmo

37 div ( a + c ) ) ( a + 2 * b ) div ( c mod 5 ) + ( d div ( c - 1 ) ) ) a * c * d div 6 mod 8 ) a * c * 7 div ( d - 8 ) )

Captulo 3 - Construindo os Primeiros Algoritmos


Basicamente a construo de um algoritmo se resume s seguintes etapas: a) Anlise e entendimento do problema; b) Definio dos dados que sero necessrios para resolv-lo (as entradas); a j deveremos ter idia dos tipos de dados que usaremos; c) Obteno destes dados; alguns vm do "exterior" do programa digitados pelo usurio, e outros so calculados no prprio algoritmo; d) Processamento em si; e) Exibio dos resultados. A primeira fase a mais difcil de se "pegar", pois depende um pouco da experincia do programador. Entretanto, mesmo nesta fase h tcnicas que podem ser aprendidas, e modelos que podem ser aplicados. Programao arte, cincia e tcnica, tudo ao mesmo tempo... Problema 1 - Clculo de Mdia Aritmtica Enunciado Faa um programa que leia dois valores numricos, e calcule e exiba a sua mdia aritmtica. Anlise Simples, hein? Dos tempos de escola lembramos que a mdia aritmtica de dois valores calculada como (a+b)/2, e sendo assim a primeira etapa j est pronta. Definio dos dados Os dados necessrios sero os dois valores, que colocaremos em duas variveis A e B, do tipo numrico, e uma terceira varivel, que chamaremos Mdia, que armazenar a mdia aritmtica calculada. Obteno dos dados A obteno dos dados neste programa simples e direta. Basta pedir ao usurio que digite os valores. Processamento O processamento aqui o clculo da mdia, usando o mtodo citado acima, na etapa 1. O resultado do clculo ser armazenado na varivel Media. Exibio Basta exibir o contedo da varivel Media. Soluo Algoritmo "Media" Var A,B,Media : real Inicio escreval("Programa que calcula a mdia aritmtica de dois valores.") escreva("Digite um valor : " ) leia(A ) escreva("Digite outro valor : " ) leia(B ) Media <- (A+B)/2 escreva("A mdia dos dois valores : ", Media ) fimalgoritmo

Voc deve ter notado que colocamos na tela instrues para o usurio usando o comando escreva. Esta uma boa tcnica de programao, mesmo hoje em dia, com o ambiente do Windows, etc. Da mesma forma, ao imprimir o resultado, no mostramos simplesmente a mdia, mas explicamos ao usurio o que aquele valor significa. Problema 2 - Clculo Simples de Velocidade Mdia Enunciado Faa um programa que leia o nome de um piloto, uma distncia percorrida em km e o tempo que o piloto levou para percorr-la (em horas). O programa deve calcular a velocidade mdia em km/h, e exibir a seguinte frase: A velocidade mdia de XX foi YY km/h. Onde XX o nome do piloto, e YY sua velocidade mdia. Anlise e definio dos dados Das aulas de Fsica sabemos que a velocidade mdia dada pela distncia percorrida dividida pelo tempo gasto para percorr-la (v=s/t), certo? Ento temos dois valores numricos do tipo real (distncia e tempo), e um caracter ou literal (o nome do piloto). Obteno dos dados A obteno dos dados neste programa simples e direta. Basta pedir ao usurio que digite os valores. Processamento e exibio Usaremos as mesmas tcnicas utilizadas no problema 1. Soluo algoritmo "Media2" var nome : caracter distancia,tempo,velmedia : real inicio escreval("Programa que calcula a velocidade mdia de um piloto." ) escreva("Digite o nome do piloto : " ) leia(nome) escreva("Digite a distncia percorrida (em km) : " ) leia(distancia ) escreva("Digite o tempo gasto para percorr-la (em horas) : " ) leia(tempo ) velmedia <- distancia/tempo escreva("A velocidade mdia de ",nome," foi ", velmedia ) fimalgoritmo Problema 3 - Clculo de Velocidade Mdia (mais complexo) Enunciado Em um rally foram percorridos dois trechos. Faa um programa que leia o nome de um piloto, a quilometragem de cada um dos trechos em km, e depois o tempo total para percorr-los, em horas. Calcule e imprima a velocidade mdia geral do piloto.

Anlise Como sabemos, a frmula para se calcular a velocidade mdia v=s/t, mas no nosso caso o "s", que significa espao percorrido, o somatrio dos dois trechos do rally. Assim, usando como base o programa anterior, podemos resolver facilmente este problema, e no analisaremos todas as 5 etapas. Algoritmo "Media3" Var Nome : caracter DistTrecho1, DistTrecho2, DistTotal, Tempo, VelMedia : real Inicio escreval("Programa que calcula a velocidade mdia de um piloto." ) escreva("Digite o nome do piloto : " ) leia(Nome) escreva("Digite a distncia percorrida no trecho 1(em km) : " ) leia( DistTrecho1 ) escreva( "Digite a distncia percorrida no trecho 2(em km) : " ) leia( DistTrecho2 ) escreva( "Digite o tempo gasto para percorr-las (em horas) : " ) leia( Tempo ) DistTotal <- DistTrecho1+DistTrecho2 VelMedia <- DistTotal/Tempo escreva("A velocidade mdia de ",Nome," foi ", VelMedia) fimalgoritmo

Inserindo Comentrios em nossos Programas Toda linguagem de programao permite que se insiram no programa textos que no tm nada a ver com a execuo do algoritmo, mas servem para explicar a quem examin-lo como ele funciona, identificar o autor e data do programa, etc. A estes textos chamamos comentrios. Geralmente os comentrios so precedidos de um ou dois caracteres ou uma palavrachave da linguagem, e vo at o fim da linha em que esto, ou podem se estender por vrias linhas at que outro grupo de caracteres aparea indicando o fim do comentrio. Por curiosidade, mostramos abaixo alguns exemplos (os caracteres que delimitam os comentrios estaro em negrito): Em BASIC (QuickBasic, Visual Basic ou outras verses ) ' Isto um comentrio - at o fim desta linha REM Isto tambm ... Em Pascal (Turbo Pascal, Delphi ou outros ) { Isto um comentrio pode se estender por vrias linhas } (* Outro tipo de comentrio em vrias linhas Em linguagem C // Comentrio at o fim da linha /* Comentrio pode se estender por vrias linhas */ Mesmo no sendo uma linguagem de programao, os algoritmos podem e devem ser entremeados por comentrios, de preferncia seguindo uma das regras acima, para que os comentrios fiquem destacados e no se confundam com o "cdigo" do algoritmo em si. Os programadores usam comentrios por vrias razes, como j vimos acima: a) Identificar o autor e a data da criao de um programa.

*)

b) Documentar as alteraes feitas no programa com o decorrer do tempo, as vezes at explicando o porque de terem sido feitas, quem as pediu, etc. c) Explicar (at para ns mesmos, daqui a algum tempo...) o funcionamento de certos trechos do algoritmo, que podem ser muito complexos. Isto muito til se mais de um programador cuidar do programa; assim, todos ficam sabendo o que fazem as vrias partes, no importa quem as tenha criado. d) Identificar trechos crticos no algoritmo, alertando para os efeitos que alteraes naquele ponto podem ter em outras partes do programa. e) Justificar porque certas tcnicas foram utilizadas em certos pontos do programa, etc. Para nossos propsitos, usaremos o mesmo esquema de comentrios at o fim da linha da linguagem C. A seguir temos a repetio da resposta do problema 2, comentada (os trechos entre // e o fim da linha no fazem parte do programa em si, so apenas comentrios de documentao e explicao) : // Curso de Algoritmos - Problema 2 // Programa que calcula a velocidade mdia de um piloto // Autor: C. M. Souza // Data : 02/09/1999 Algoritmo "Media2" // Declarao das Variveis Var Nome : caracter Distancia,Tempo,VelMedia : real Inicio // Apresentao do programa escreval("Programa que calcula a velocidade mdia de um piloto." ) // Obteno dos dados escreva("Digite o nome do piloto : ") Leia(Nome) escreva("Digite a distncia percorrida (em km) : " ) Leia(Distancia ) escreva("Digite o tempo gasto para percorr-la (em horas) : " ) Leia(Tempo) // Clculo da velocidade mdia VelMedia <- Distancia/Tempo // Exibio dos resultados escreva("A velocidade mdia de ",Nome," foi ", VelMedia ) fimalgoritmo bvio que no se precisa colocar uma linha de comentrio para cada linha de cdigo, nem comentar aquilo que, de to trivial, nem precisa ser explicado. Entenda o exemplo acima como uma ilustrao do uso de comentrios, e no como uma regra a ser seguida. Exerccios 1. 2. 3. 4. 5. 6. 7. Faa um programa que receba um nmero e imprima o seu dobro. Faa um programa que receba dois nmeros e imprima o seu produto e a sua soma. Dado o lado de um quadrado, calcular sua rea e seu permetro. Dado o valor da aresta de um cubo, calcular sua rea total. Dados os valores do lado maior e do lado menor de um retngulo, calcular a sua rea e o seu permetro. Dadas a altura e base de um tringulo, calcular a sua rea. Dados os valores do lado diferente e dos lados iguais de um tringulo issceles, calcular o seu permetro.

8.

A rea de um trapzio dada pela multiplicao da altura pela mdia aritmtica das bases. Faa um programa que leia o valor da base menor, da base maior e da altura de um trapzio, e calcule e imprima sua rea. Faa um programa que, dado o raio de um crculo, calcule seu permetro e sua rea.

9.

10. Dados 3 nmeros quaisquer, calcular a sua mdia aritmtica. 11. Dados 3 nmeros quaisquer, calcular sua mdia harmnica. A mdia harmnica de trs valores dada por:

12. Dados o nmero de pessoas na mesa de uma pizzaria e o valor total da conta, calcular a parte de cada uma. 13. Escreva um programa que leia o nome de um funcionrio, seu nmero de horas trabalhadas no ms, o valor que recebe por hora e calcule seu salrio mensal. A resposta deve estar no formato O funcionrio XXXX receber um salrio de R$ 999999.99. ) 14. Escreva um programa que leia o valor de um emprstimo e calcule o valor de cada amortizao (ou prestao) considerando 24 amortizaes a uma taxa de 48%. Use a frmula abaixo:

15. No incio de uma viagem anotei a marcao no velocmetro de meu carro, e no fim tambm. Sabendo que gastei certa quantidade de gasolina na viagem, faa um programa que calcule o rendimento mdio (em km/l) do carro. 16. Em um concurso, a prova de Portugus tem peso 3, e a de Matemtica peso 2. Faa um programa que calcule a mdia de um candidato, obtendo as notas nestas duas provas. 17. Dados o valor de uma compra, o valor da entrada e o nmero de parcelas, calcular o valor a ser financiado e tambm valor de cada pagamento mensal. 18. Dados o valor da entrada, o nmero de parcelas e o valor de cada uma, calcular o valor total de uma compra. 19. Dados o valor de uma compra e o percentual de desconto, calcule o valor a ser pago pelo cliente. 20. O rendimento de um empregado em um ano o seu salrio mensal vezes 12, mais o dcimo-terceiro, que tem o mesmo valor do salrio mensal. Entretanto, no ms em que ele tira frias ele recebe mais um tero de seu salrio mensal. Faa um programa que receba o salrio de um funcionrio e calcule o rendimento total anual baseado no que foi descrito anteriormente. 21. Um professor de matemtica quer saber o resultado da funo y = 3x + 2 + x/2 para vrios valores de x. Para no ter o trabalho de calcul-los todos, precisa de um programa que receba o valor de x e mostre o valor de y correspondente. Faa este programa. 22. Uma turma deseja realizar um churrasco em um stio. O stio cobra R$5,00 por pessoa, mais um adicional fixo de R$50,00, por conta de despesas de manuteno. Faa um programa que pea quantas pessoas vo participar do churrasco, calcule a despesa total ( R$5,00 por pessoa, mais sua parte no fixo) e imprima este valor.

23. Uma churrascaria s tem chopp, refrigerantes e rodzio. O chopp R$1,50, o refrigerante R$1,00 e o rodzio R$ 8,00. Faa um programa que leia quantos rodzios, refrigerantes e chopps foram consumidos em uma mesa, e calcule o total da conta, no se esquecendo dos 10% do garon! 24. O clculo do peso ideal de um homem dado pela seguinte frmula: multiplique sua altura em metros por 72.7, e do valor obtido subtraia 58. Baseado nesta frmula, faa um programa que receba a altura de um homem e escreva o seu peso ideal (se uma pessoa tem 1m e 80 de altura, o valor a ser digitado 1.8, e assim por diante). 25. Escreva um algoritmo que leia trs valores, respectivamente o 1 termo de uma progresso aritmtica (a1) , o ltimo termo da progresso (an) e a razo desta progresso (r), e calcule e escreva a soma dos termos da progresso aritmtica.

26. Escreva um algoritmo que leia 3 valores a, b e c que so os lados de um tringulo e calcule a rea deste tringulo, segundo a frmula abaixo (onde s representa o semi-permetro, ou seja, a metade da soma dos lados):

27. Um sistema de equaes lineares do tipo:

aX + bY = c dX + eY = f
pode ser resolvido segundo mostrado abaixo:

Escreva um algoritmo que leia os coeficientes a, b, c, d, e, f e calcule e escreva os valores X e Y. 28. O custo ao consumidor, de um carro novo, a soma do custo de fbrica com a percentagem do distribuidor e dos impostos (aplicados ao custo de fbrica). Supondo que a percentagem do distribuidor seja de 28% e os impostos de 45%, escrever um algoritmo para ler o custo de fbrica de um carro e escrever o custo ao consumidor. 29. Considerando que o aumento dos funcionrios de 80% do INPC e mais um percentual de produtividade discutido com a empresa. Escrever um algoritmo que l o nmero do funcionrio, seu salrio atual, o valor do INPC e o ndice de produtividade conquistado e escreve o nmero do funcionrio, seu aumento e o valor de seu novo salrio. 30. Escrever um algoritmo que leia 2 valores e encontre e imprima o maior deles, usando a frmula a seguir ( |a-b| representa o valor absoluto de a-b) :

Captulo 4 - Ensinando o Computador a Decidir


At agora temos criado programas que so apenas uma seqncia de comandos sem possibilidade de escolha, ou seja no existe neles nada do tipo "se tal coisa acontecer, faa isto, seno faa aquilo". Esta possibilidade de escolha que d "inteligncia" aos programas de computador; afinal, ns humanos estamos fazendo escolhas e pesando possibilidades o tempo todo... Todas as linguagens de programao tm comandos que permitem estes desvios da seqncia normal dos comandos de um programa baseados na resposta a uma pergunta, ou em um linguajar mais tcnico, na avaliao de uma condio. Por isso, estes comandos so s vezes chamados de comandos condicionais, ou ainda desvios condicionais. Para entendermos como estes comandos funcionam, primeiro temos que saber o que avaliar uma condio. Quando falamos de tipos de dados nos referimos ao tipo Lgico, que poderia ter apenas um de dois valores: Falso ou Verdadeiro. Estes valores se originam da anlise de uma expresso para se chegar seguinte concluso: ela verdadeira ou falsa. Vejamos os exemplos abaixo: Expresso A Terra gira em torno do Sol Zebras podem falar 2 + 2 igual a 5 14 maior que 3 Todo dia 1o. de Janeiro Segunda-Feira "Raposa" vem antes de "Borboleta" na ordem alfabtica A palavra "Jos" comea com a letra "J" Resultado Verdadeiro Falso Falso Verdadeiro Falso Falso Verdadeiro

Devemos ter em mente, ento, que uma expresso lgica pode conter qualquer tipo de dados, pois o que nos interessa saber que, ao analis-la, concluiremos se falsa ou verdadeira. Num primeiro momento, estaremos interessados em expresses lgicas contendo apenas valores numricos, mas depois vamos analisar condies com outros tipos de dados. Para trabalharmos com nmeros, precisamos conhecer os operadores que nos permitem compar-los. Ns os chamamos operadores relacionais, porque estabelecem uma relao entre valores (o nome no importante, e sim saber como uslos). Eles so: Nome Igual a Diferente de Menor que Maior que Menor ou igual a <= Smbolo Exemplos = 3 = 3 2+2 = 5 <> 140 <> 410 10+5 <> 30/2 < 13 < 7 77 < 20 * 2 0 > -1 345 > (3+1)*100 20 <=20 19 <= 20 21 <= 20 21 >= 20 19 >= 20 20 >= 20 Resultado Verdadeiro Falso Verdadeiro Falso (as duas expresses tm resultado 15, no so diferentes) Falso Falso Verdadeiro Falso (345 no maior que 400...) Verdadeiro Verdadeiro Falso Verdadeiro Falso Verdadeiro

Maior ou igual a

>=

Pelos exemplos acima, voc deve ter notado que quando qualquer um dos "lados" da expresso (tecnicamente dizemos "quando qualquer um dos operandos") for uma expresso aritmtica e no um simples nmero, ns calculamos seu valor

primeiro para depois fazer as comparaes. Nestas expresses podem aparecer variveis, tambm, como nestes exemplos (para verificar, substitua os valores de x e y nas expresses, calcule-as e compare-as) : Comandos e Expresses x <- 33 y <- 4 x = 33 x+1 < 90 y * 2 >= 10 x/3 = 11 y + x > 40 y * 8 <= x Resultado

Verdadeiro Verdadeiro Falso Verdadeiro Falso Verdadeiro

Depois de aprendermos o que so expresses lgicas, iremos ver agora como coloc-las em nossos programas. Todas as linguagens de programao tm um ou mais comandos que permitem a um programa tomar caminhos diferentes baseado na avaliao de uma expresso lgica. Esses comandos recebem o nome genrico de comandos de deciso, e ns podemos us-los tambm em nossos algoritmos. Na vida real tomamos decises a todo momento baseados em uma situao existente. Em programao chamamos esta situao de condio, e as alternativas possveis de aes. Por exemplo: "Se tiver R$10,00 sobrando irei ao cinema hoje noite, mas se no tiver ficarei vendo TV em casa". Qual a condio nesta frase? Fcil, "tiver R$10,00 sobrando". Ela uma expresso lgica, pois a pergunta "Tenho R$10,00 sobrando?" pode (tem que) ser respondida com "Sim" ou "No". Lembre-se, ento: em um algoritmo, toda condio tem que ser uma expresso lgica. Quais so as aes possveis? Fcil, mais uma vez; "irei ao cinema" e "ficarei vendo TV em casa". A primeira s ser realizada se a resposta pergunta "Tenho dinheiro suficiente?" for "Sim", enquanto que a segunda ser realizada caso a resposta seja "No". Ento, em um algoritmo, as aes so um ou mais comandos que sero realizados, alguns caso a avaliao da condio resulte em Verdadeiro, outros caso ela resulta em Falso. Vamos colocar agora a frase do pargrafo anterior em outra forma, mais parecida com o que um programa de computador: Se "tiver R$10,00 sobrando" ento "irei ao cinema" seno "ficarei vendo TV em casa". Veja que grifamos trs palavras: Se, ento e seno. Elas so muito importantes na estrutura dos comandos de deciso. Como prximo passo, vamos generalizar a estrutura que criamos acima: Se <condio> ento <aes (uma ou mais) a serem realizadas se a condio for verdadeira> seno <aes (uma ou mais) a serem realizadas se a condio for falsa> Para terminar a nossa comparao, devemos lembrar que os comandos do algoritmo so sempre imperativos, e que o computador s lida com quantidades definidas (ou seja, ele no sabe o que "ter R$10,00 sobrando"). Para aproximar mais nossa frase de um algoritmo, poderemos ter a seguinte forma: Se Dinheiro >= 10 ento Ir ao Cinema seno Ver TV em Casa Entendeu a transformao? "Dinheiro" faz o papel de uma varivel que contm o que eu tenho sobrando no momento, e se valor maior ou igual a 10, ento "tenho R$10,00 sobrando". Por falar nisso, fique sabendo que a tcnica (ou arte) de se transformar perguntas do dia-a-dia em quantidades definidas que possam ser colocadas em um programa a chave de se fazer algoritmos. No se preocupe, no entanto: algo fcil e que pode ser aprendido e desenvolvido.

Bom, agora j podemos fazer um programa que ajude nosso amigo... Problema 5 - O que fao esta noite? Enunciado Faa um programa que pea ao usurio a quantia em dinheiro que tem sobrando e sugira, caso ele tenha 10 ou mais reais, que v ao cinema, e se no tiver, fique em casa vendo TV. Algoritmo "Sugestao" var Dinheiro: Real Inicio escreval("Servio Informatizado de Sugestes") escreva("Quanto dinheiro voc tem sobrando?") Leia(Dinheiro) Se Dinheiro >= 10 entao escreva("V ao cinema hoje noite.") senao escreva("Fique em casa vendo TV.") fim se escreva("Obrigado e volte sempre.") fimalgoritmo Em relao ao que vimos at agora, apenas uma novidade: a expresso fimse ao final do comando de deciso. Ela delimita o comando, isto , mostra onde as aes da parte senao do comando terminam. Imagine o comando sem ela; ficaria assim: // Exemplo de um trecho de programa INCORRETO Se Dinheiro >= 10 entao escreva("V ao cinema hoje noite.") senao escreva("Fique em casa vendo TV.") escreva("Obrigado e volte sempre.") Neste caso, o computador no saberia se o comando escreva("Obrigado e volte sempre.") faria ou no parte do comando de deciso (a indentao, ou seja, o fato de algumas linhas estarem mais distantes da margem esquerda que as outras, no quer dizer nada para o computador; fazemos isto apenas - e esta uma dica importante para voc - para que o algoritmo fique mais fcil de ler). Assim o fimse fundamental, e todas as linguagens de programao tm algo que cumpra esta funo. Problema 6 - Posso Entrar na Boate? Enunciado Faa um programa que pea o ano de nascimento de uma pessoa, e diga, se for maior de idade, que pode entrar na boate, e se no for, no pode. Algoritmo "ChecaIdade" Var AnoNascimento, Idade: inteiro Inicio escreval("Checagem de Idade da Boate Noites Cariocas") escreva("Em que ano voc nasceu?") Leia(AnoNascimento) Idade <- 2003 - AnoNascimento Se Idade >= 18 ento escreva("Voc pode entrar na boate.") senao escreva("Infelizmente, voc no pode entrar.") fimse

fimalgoritmo Neste algoritmo criamos uma varivel "rascunho", que chamamos Idade, para conter o resultado do clculo da idade da pessoa (que o ano atual menos o ano em que a pessoa nasceu - Nota: este algoritmo foi escrito em Novembro de 2003). Como voc j deve ter notado, ela dispensvel. Veja o algoritmo abaixo. Algoritmo "ChecaIdade2" AnoNascimento: Inteiro Inicio escreval("Checagem de Idade da Boate Noites Cariocas") escreva("Em que ano voc nasceu?") Leia(AnoNascimento) Se (2003 - AnoNascimento) >= 18 entao escreva("Voc pode entrar na boate.") senao escreva("Infelizmente, voc no pode entrar.") fimse fimalgoritmo A partir de 2004, este algoritmo no vai mais funcionar corretamente, como voc j deve ter notado. Portanto, vamos melhor-lo para que possa funcionar em qualquer ano. Algoritmo "ChecaIdade3" Var AnoAtual, AnoNascimento: Inteiro Inicio escreval("Checagem de Idade da Boate Noites Cariocas") escreva("Qual o ano atual?") Leia(AnoAtual) escreva("Em que ano voc nasceu?") Leia(AnoNascimento) Se (AnoAtual - AnoNascimento) >= 18 entao escreva("Voc pode entrar na boate.") senao escreva("Infelizmente, voc no pode entrar.") fimse fimalgoritmo Exerccios 1. Dadas as variveis A, B, C e D, do tipo real, e os comandos de atribuio a seguir, avalie as expresses abaixo e descubra se seu resultado FALSO ou VERDADEIRO. A B C D a) b) c) d) e) 2. <<<<A B B A A 10 15 8 20 = * = * + D 2 A ( B / 2 = A + D C + 2 ) < D * 5 + C + D = 43

Calcule o valor de K nas expresses lgicas abaixo de modo que sempre retornem VERDADEIRO como resultado (leve em considerao o valor das outras variveis, I e J do tipo real, atribudos da seguinte maneira): I <- 18 J <- I / 2

a) b) c) d) e) 3.

9 + K = K = I + 3 * K = K + J = (K / 2)

17 J I I + 10 = (I * 3) / ( J - 3 )

Calcule o maior valor possvel para K nas expresses lgicas abaixo de modo que sempre retornem VERDADEIRO como resultado (leve em considerao o valor das outras variveis, I e J, atribudos da seguinte maneira): I <- 25 J <- I - 13 a) b) c) d) K K K K <= I < I * I <= * I <= J J (J + 8) * 4 I

4.

Faa um programa que receba dois nmeros e imprima Os nmeros so iguais ou Os nmeros so diferentes caso sejam ou no iguais. Faa um algoritmo que receba dois nmeros inteiros e informe qual o maior. Refaa depois o algoritmo, desta vez para informar qual o menor. Faa um programa que receba trs nmeros do usurio e verifique se o terceiro a soma dos outros dois: caso seja, o programa emitir a mensagem: Operao correta!; seno, a mensagem ser Voc cometeu um engano.... Escrever um algoritmo que leia o nome e o sexo de uma pessoa (M ou F) e informe se ela homem ou mulher, com uma mensagem no formato XXXX homem, ou XXXX mulher, onde XXXX o nome da pessoa. Faa um programa que pergunte ao usurio se ele estrangeiro (ele responder com S ou N). Caso ele seja estrangeiro, o programa perguntar em que pas nasceu. Faa um programa que pergunte ao usurio se ele brasileiro (ele responder com S ou N). Caso ele seja estrangeiro, o programa perguntar em que pas nasceu; se no for, perguntar em que estado nasceu. Em ambos os casos o programa perguntar depois o ano de nascimento. Ao final, o programa imprimir uma frase como : O usurio ????, nasceu em XXXX e tem NN anos de idade, onde ???? BRASILEIRO ou ESTRANGEIRO, conforme o caso.

5.

6.

7.

8.

9.

10. Faa um programa que receba um nmero do usurio e diga se ele par ou impar. DICA: Considere a diviso como sendo inteira, isto , 20 DIV 2=10, 17 DIV 2 = 8, 5 DIV 2=2, etc. Uma outra possibilidade se usar o operador MOD, ou ainda a funao INT(). Lembre-se de declarar variveis do tipo inteiro se for usar DIV ou MOD. 11. Escrever um algoritmo que l o nmero do vendedor de uma empresa, seu salrio fixo e o total de vendas por ele efetuadas. Cada vendedor recebe um salrio fixo, mais uma comisso proporcional s vendas por ele efetuadas. A comisso de 3% sobre o total de suas vendas at 1.000.000 e 5% sobre o que ultrapassar este valor. Escrever o nmero do vendedor, o total de suas vendas seu salrio fixo e o seu salrio total.

Captulo 5 - Refinando Nossas Decises


Nem sempre as respostas aos testes feitos nos programas so simples como "Sim", "No", "Falso" ou "Verdadeiro". Quando perguntamos por exemplo se A igual a B, claro que a resposta "Sim"ou "No"; s vezes, no entanto, estamos interessados em saber a relao entre duas quantidades, isto , queremos saber por exemplo se A maior que B, se B maior que A, ou se os dois valores so iguais. Neste caso, um teste apenas no suficiente, pois temos trs possibilidades e ele vai eliminar apenas uma delas, sendo necessrio ainda um outro, para verificar entre as duas restantes qual a possibilidade correta. Vejamos estes exemplos: Problema 7 - Qual o Maior Valor? Enunciado Faa um programa que leia dois valores e indique o maior deles, ou se so iguais. Algoritmo "DescubraoMaior" Var Valor1, Valor2 : Inteiro Inicio // Leitura dos dados escreva("Digite o primeiro valor :") Leia(Valor11) escreva("Digite o segundo valor:") Leia(Valor21) // Resultado (Note que h dois testes, um "dentro" do outro...) Se Valor1 > Valor2 entao escreval("O primeiro valor o maior.") Senao // Eliminamos a primeira possibilidade (de o primeiro valor ser o maior) // Agora vamos ver entre as duas restantes Se Valor2 > Valor1 entao escreval("O segundo valor o maior.") Senao // Eliminamos tambm a segunda possibilidade // (de o segundo valor ser o maior). // Ento, so resta a terceira (eles so iguais) escreval("Os dois valores so iguais.") Fimse Fimse fimalgoritmo Simples, no ? Agora veremos um problema em que antes de fazermos os testes, deveremos processar os dados um pouco... Problema 8 - Qual o Carro mais Rpido? Enunciado Dois carros percorreram diferentes distncias em diferentes tempos. Sabendo que a velocidade mdia a razo entre a distncia percorrida e o tempo levado para percorr-la, faa um programa que leia as distncias que cada carro percorreu e o tempo que cada um levou, e indique o carro que teve maior velocidade mdia.

Anlise e Entendimento Neste programa, temos que comparar as velocidades mdias, mas vamos obter do usurio a distncia percorrida e o tempo gasto de cada carro. Com base nestes dados, primeiro calculamos as velocidades mdias de cada um, e s ento fazemos as comparaes. Algoritmo "VelocidadeMedia1" // Distncia percorrida, tempo gasto e velocidade media de cada carro Var Distancia1, Distancia2, Tempo1, Tempo2, VelMed1, VelMed2 : Real Inicio // Leitura dos dados escreva("Distncia percorrida pelo Carro 1:") Leia(Distancia1) escreva("Tempo gasto pelo Carro 1:") Leia(Tempo1) escreva("Distncia percorrida pelo Carro 2:") Leia(Distancia2) escreva("Tempo gasto pelo Carro 2:") Leia(Tempo2) // Clculo e exibio das velocidades mdias VelMed1 <- Distancia1 / Tempo1 VelMed2 <- Distancia2 / Tempo2 escreva("Velocidade mdia do Carro 1:", VelMed1) escreva("Velocidade mdia do Carro 2:", VelMed2) // Resultado (Note que h dois testes, um "dentro" do outro...) Se VelMed1 > VelMed2 entao escreval("O Carro 1 teve maior velocidade mdia.") Senao // Eliminamos a primeira possibilidade (de o carro 1 ser mais rpido) // Agora vamos ver entre as duas restantes Se VelMed2 > VelMed1 entao escreval("O Carro 2 teve maior velocidade mdia.") Senao // Eliminamos tambm a segunda possibilidade // (de o carro 2 ser mais rpido) // Ento, so resta a terceira (os dois carros tiveram a mesma // velocidade mdia) escreval("Os dois carros tiveram a mesma velocidade mdia.") Fimse Fimse fimalgoritmo Neste problema vemos como se coloca uma estrutura de teste (se ... entao ... senao ... fimse) dentro de outra. A indentao no obrigatria, mas note como ela facilita o entendimento do algoritmo. A colocao de uma estrutura dentro de outra em um programa conhecida como aninhamento. Qualquer estrutura pode ficar contida dentro de outra, de qualquer tipo (sim, h outros tipos de estruturas, ns os veremos frente...). A nica regra : quando duas estruturas so aninhadas, a mais interna deve ficar TOTALMENTE contida na mais externa. Veja a explicao a seguir, baseada no algoritmo anterior (eliminamos os comentrios para facilitar a leitura): Se VelMed1 > VelMed2 entao escreval("O Carro 1 teve maior velocidade mdia.") Senao

// O segundo se...entao..senao...fimse fica // TOTALMENTE contido neste ponto. Se VelMed2 > VelMed1 entao escreval("O Carro 2 teve maior velocidade mdia.") Senao escreval("Os dois carros tiveram a mesma velocidade mdia.") Fimse Fimse Problema 9 - Passei de Ano? Enunciado Em uma escola, um aluno passa direto se obtiver mdia final maior que ou igual a 7. Se a mdia for inferior a 4, ele est reprovado direto, sem direito a prova final. Em outro caso, ele vai final, e a nota que ele precisa para passar o que falta mdia final para completar 10. Faa um programa que receba as duas notas parciais, calcule a mdia final e informe ao aluno sua situao, inclusive informando a ele quanto precisa tirar na final, se este for o seu caso. Algoritmo ResultadoFinal Var Nota1, Nota2, Media : Real Inicio // Leitura dos dados escreva("Digite a Nota 1:") Leia(Nota1) escreva("Digite a Nota 2:") Leia(Nota2) // Clculo Media <- (Nota1 + Nota2) /2 // Exibio dos resultados escreval("Sua mdia final :", Media) // Vamos eliminar a primeira possibilidade Se Media >= 7 entao escreval("Voc foi aprovado.") Senao // Ele pode ter sido reprovado ou ficado em final // Primeiro, eliminamos a possibilidade de ele ter sido reprovado direto Se Media < 4 entao escreval("Voc foi reprovado") Senao // Ento, ficou em final... escreval("Voc est na final, e precisa de ", 10 Media) Fimse Fimse fimalgoritmo Uma coisa interessante a se notar que a ordem dos testes no faz diferena, desde que se cubram todas as possibilidades. Entretanto, pode ser que se testarmos em uma determinada ordem o algoritmo fique mais natural, isto , reflita a situao sendo modelada com mais clareza, e fique mais fcil de se entender. uma questo de estilo... Exerccios Saber interpretar um algoritmo uma habilidade to importante quanto faz-lo. Por isso, seguem alguns exerccios sobre esta habilidade. Voc vai notar que alguns destes exerccios no fazem nada de til; no se impressione, eles so apenas para testar sua habilidade de "rodar o chins" (gria de programador para "interpretar o algoritmo")...

1.

Dados os algoritmos abaixo: algoritmo "Teste1" var a,b,c : inteiro inicio leia(a) leia(b) c <- (a*3) + 4 se c=b entao a <- a + 5 escreva( 2 * a ) senao se c > b entao escreva( b+c ) senao escreva( a + b + c ) fimse fimse fimalgoritmo

Teste-o com os seguintes valores para a e b: a) a = 4, b = 16 b) a = 6, b = 20 c) a = 10, b = 11 e diga que valores sero escritos na tela do computador. algoritmo "FolhaDePagamento" var Salario, Rendimento, INSS, IR : real inicio IR <- 0 Leia( Salario ) se Salario >= 1200 entao INSS <- Salario * 8 /100 senao INSS <- Salario * 7 /100 fimse Rendimento <- Salario - INSS se Rendimento > 1500 entao IR <- (Rendimento * 20/100) - 135 senao se Rendimento > 900 entao IR <- Rendimento * 15/100 fimse fimse Rendimento <- Rendimento - IR escreva( Salario, IR, INSS, Rendimento ) fimalgoritmo Teste o algoritmo com os seguintes valores de Salario: 500, 900, 1000, 1200 e 2000. Para cada caso, mostre o que ser escrito na tela. 2. Faa um programa que leia o nome e idade de duas pessoas, e imprima o nome da pessoa mais nova e seu ano de nascimento, tendo como base o ano atual (este dado tambm dever ser pedido pelo programa). Faa um programa que receba dois nmeros do usurio e diga se o primeiro divisvel pelo segundo. Use as mesmas tcnicas do exerccio 10 do captulo anterior.

3.

4.

Um funcionrio recebe 250 dlares por ms. Se este salrio, depois de convertido em reais, for inferior a R$700,00, ele recebe ainda uma ajuda de custo de R$80,00. Faa um programa que obtenha o valor do dlar e calcule e imprima seu salrio final. Faa um programa que leia quantas aulas foram dadas em uma turma em um semestre. Depois o programa ler o nmero de faltas que um aluno teve. O programa dever informar o percentual de presena, e caso ele tenha sido menor que 25%, deve informar tambm que o aluno est reprovado por faltas. Escrever um algoritmo que leia os dados de uma pessoa (nome, sexo, idade e sade) e informe se ela est apta ou no para cumprir o servio militar. Se a pessoa no estiver apta, indique o motivo pelo qual a pessoa no est apta para cumprir o servio militar (Uma pessoa no apta se mulher, ou no tem idade suficiente, ou sade no 'boa'). Escrever um algoritmo que leia 2 valores inteiros e um caracter e realize uma das quatro operaes aritmticas bsicas entre estes dois valores. A operao a ser realizada dada pelo caracter (+, -, *, /).

5.

6.

7.

Captulo 6 Trabalhando com Perguntas mais Complexas


Muitas vezes nossas decises sero tomadas tendo em vista a resposta a mais de uma questo. Vamos tomar como exemplo o problema visto anteriormente: Se "tiver R$10,00 sobrando" ento "irei ao cinema" seno "ficarei vendo TV em casa". Ora, ir ao cinema sozinho no muito agradvel. Ento faremos o seguinte: s iremos ao cinema se, alm de ter o dinheiro, um amigo (ou amiga) puder ir conosco. O problema ento poderia ser colocado da seguinte forma: Se "tiver R$10,00 sobrando" ento Se meu amigo ou amiga puder ir comigo ento "irei ao cinema" seno "ficarei vendo TV em casa (tenho dinheiro, mas no tenho companhia)" seno "ficarei vendo TV em casa (no tenho dinheiro)". Veja que a linha irei ao cinema s ser executada se a resposta s suas duas perguntas for sim. Vamos agora traduzir este exemplo para a linguagem de algoritmos. algoritmo "Sugestao2" var Dinheiro: real TemCompanhia : caracter inicio escreval("Servio Informatizado de Sugestes") ecreva("Quanto dinheiro voc tem sobrando?") leia(Dinheiro) escreva("Voc tem companhia (S/N)?") leia(TemCompanhia) se Dinheiro >= 10 entao se TemCompanhia = "S" entao escreval("V ao cinema hoje noite.") senao escreval("Fique em casa vendo TV.") // Sem companhia chato... fimse senao escreval("Fique em casa vendo TV.") // Voc est sem dinheiro... fimse escreva("Obrigado e volte sempre.") fimalgoritmo H vrios detalhes interessantes neste algoritmo. Primeiro, veja como resolvemos o caso de o usurio ter ou no companhia. Criamos uma varivel do tipo caracter, TemCompanhia, e pedimos para digitar S ou N, caso ele tenha ou no um acompanhante. A, testamos este contedo para saber se ele deve ou no ir ao cinema. Esta uma situao similar s que comumente encontramos em programao, e esta maneira de resolv-la simples e eficiente. Outra coisa que notamos que a linha escreval("Fique em casa vendo TV.")aparece duas vezes no algoritmo (com comentrios diferentes); do jeito com que os testes esto colocados, esta a nica maneira de se resolver o problema e se apresentar a sugesto correta em cada caso. S por curiosidade, retire uma das duas linhas e veja se o algoritmo ser executado corretamente... Se s vamos ao cinema case a resposta s duas perguntas seja SIM, podemos junt-las em um s teste. Veja como o algoritmo fica agora: algoritmo "Sugestao3" var Dinheiro: real

TemCompanhia : caracter inicio escreval("Servio Informatizado de Sugestes") ecreva("Quanto dinheiro voc tem sobrando?") leia(Dinheiro) escreva("Voc tem companhia (S/N)?") leia(TemCompanhia) se (Dinheiro >= 10) e (TemCompanhia = "S") entao escreval("V ao cinema hoje noite.") senao escreval("Fique em casa vendo TV.") fimse escreva("Obrigado e volte sempre.") fimalgoritmo O que fizemos foi usar a palavra reservada e para unir os dois testes em um s. Este um recurso muito utilizado em programao. De quebra, eliminamos aquele problema da linha que aparecia duas vezes. Analisando todos os resultados possveis das duas perguntas em separado e o resultado de sua unio com a palavra e, temos: Dinheiro >= 10 FALSO FALSO VERDADEIRO VERDADEIRO TemCompanhia = "S" FALSO VERDADEIRO FALSO VERDADEIRO (Dinheiro>=10) e (TemCompanhia="S") FALSO FALSO FALSO VERDADEIRO

Vemos que a nica possibilidade de o teste composto resultar verdadeiro se os resultados de todos os dois testes forem verdadeiros tambm. A tabela acima o que se chama de TABELA-VERDADE do operador e. Agora vamos ver uma outra situao: suponha que voc goste de rock, aprecie muito as bandas Paralamas do Sucesso e Baro Vermelho, e seu amigo o convida para um show. Voc s est interessado em ir se for de uma destas duas bandas; ver qualquer outra no vale a pena o trabalho e a despesa... Colocando esta situaao em forma estruturada, teremos: Se "o show for do Paralamas" ento "irei ao show" seno Se o show for do Baro ento "irei ao show" seno "ficarei vendo em casa " Colocando o programa na linguagem do algoritmo, temos o seguinte: algoritmo "Sugestao4" var Banda : caracter inicio escreval("Servio Informatizado de Sugestes") ecreva("Qual a banda do show?") leia(Banda) se Banda = "Paralamas" entao escreval("V ao show.") senao se Banda = "Baro" entao escreval("V ao show.") senao escreval("Fique em casa vendo TV.") fimse escreva("Obrigado e volte sempre.") fimalgoritmo

Como voc deve ter notado, temos de novo o problema da linha que aparece duas vezes. Como resolv-lo? Observe que existem duas possibilidades de voc ir ao show: se a banda for Paralamas ou se a banda for o Baro. A palavra ou no foi grifada por acaso, pois podemos juntar as duas perguntas em uma s usando este operador, o que vai simplificar nosso programa. algoritmo "Sugestao5" var Banda : caracter inicio escreval("Servio Informatizado de Sugestes") ecreva("Qual a banda do show?") leia(Banda) se (Banda = "Paralamas") ou (Banda = "Baro") entao escreval("V ao show.") senao escreval("Fique em casa vendo TV.") fimse escreva("Obrigado e volte sempre.") fimalgoritmo Analisando todos os resultados possveis das duas perguntas em separado e o resultado de sua unio com a palavra ou, temos: Banda="Paralamas" FALSO FALSO VERDADEIRO VERDADEIRO Banda="Baro" FALSO VERDADEIRO FALSO VERDADEIRO (Banda="Paralamas") ou (Banda="Baro") FALSO VERDADEIRO VERDADEIRO VERDADEIRO

Vemos que basta um dos testes resultar verdadeiro (ou os dois que seria um show com as duas bandas...) para que o teste composto resulte verdadeiro tambm. A tabela acima o que se chama de TABELA-VERDADE do operador ou. Podemos criar expresses to complexas quanto for necessrio para resolver um dado problema, juntando vrias perguntas com os operadores e e ou. Vamos juntar nossos exemplos acima na seguinte situao: vai haver um show em sua cidade, mas voc s ir se for com uma daquelas bandas citadas anteriormente, e tambm se a entrada custar at 50 reais, que o que voc tem no momento. O algoritmo ficaria assim: algoritmo "Sugestao6" var Entrada : real Banda : caracter inicio escreval("Servio Informatizado de Sugestes") ecreva("Qual a banda do show?") leia(Banda) ecreva("Qual o valor da entrada?") leia(Entrada) se (Entrada<=50) e ( (Banda="Paralamas") ou (Banda="Baro") ) entao escreval("V ao show.") senao escreval("Fique em casa vendo TV.") fimse escreva("Obrigado e volte sempre.") fimalgoritmo Uma coisa para ser analisada neste algoritmo a grande quantidade de parnteses. Eles so necessrios para que a ordem de avaliao das perguntas seja correta de acordo com nossa necessidade. Entre os operadores lgicos existe a mesma caracterstica de precedncia que h nos operadores aritmticos. Neste caso, o operador e avaliado antes do operador ou. O que ns queremos, no entanto que a expresso com o ou seja avaliada ANTES da expresso com o e, e portanto usamos os parnteses para indicar ao computador a ordem necessria. S como curiosidade, vamos dar valores s variveis e analisar o resultado final da expresso.

Entrada R$ 30,00 R$ 50,00 R$ 60,00 R$ 45,00 R$ 50,00 R$ 70,00

Entrada<=50 Banda Baro V Raimundos V Paralamas F Paralamas V Baro V Raimundos F

Banda="Paralamas" ou Banda="Baro" V F V V V F

Resultado Final V F F V V F

Outra coisa importante a ser notada que quando se juntam vrias perguntas em uma s, necessrio que ela seja repetida em sua totalidade; um erro comum em iniciantes de programao fazer algo como: Se (Entrada<=50) e (Banda="Paralamas" ou "Baro") entao // ERRADO!

Uma construo como esta pode at refletir o jeito com que falamos, mas inaceitvel para uma linguagem de programao, e portanto no pode ser utilizada na construo de algoritmos. Para facilitar as coisas, a maioria das linguagens tem uma ou mais estruturas que ajudam na soluo de situaes como esta, e as veremos mais adiante. Trabalhando com Tabelas Uma das aplicaes mais comuns em programao a pesquisa de um valor em uma tabela, quer para saber se um dado est ou no em uma lista de valores, ou para saber em que faixa de uma tabela um valor se enquadra, entre outras. Neste exemplo vamos analisar este segundo caso. Problema 10 - Qual o Conceito do Aluno? Enunciado Em uma escola o conceito de um aluno dado baseado em sua mdia final, de acordo com a seguinte tabela: Nota de... 0 4 7 9 At... 3.9 6.9 8.9 10 Conceito Fraco Regular Bom Excelente

Faa um programa que receba a mdia final de um aluno e imprima o conceito correspondente. De acordo com o que vimos na resoluo dos problemas do captulo anterior, um teste apenas ou dois no vo resolver nosso problema. De uma forma geral, se temos n possibilidades, temos que ter n-1 testes para cobrir todas as respostas possveis. Vamos fazer uma primeira abordagem para resolver este problema, e depois vamos refin-la. Algoritmo "Conceito1" Var Media : Real Inicio escreva("Qual a mdia do aluno?") Leia(Media) Se (Media >=0) e (Media<=3.9) entao escreva("Conceito : Fraco") Senao Se (Media >=4) e (Media<=6.9) entao escreva("Conceito : Regular") Senao Se (Media >=7) e (Media<=8.9) entao escreva("Conceito : Bom") Senao Se (Media >=9) e (Media<=10) entao escreva("Conceito : Excelente")

Fimse Fimse Fimse Fimse fimalgoritmo

Refinamento 1
Analisando a tabela, vemos que as notas variam de 0 a 10 (estamos assumindo, claro, que o operador do programa no vai digitar valores estranhos, como 1, 77, etc.) Isto significa que os testes (Media>=0) e (Media<=10) so desnecessrios pois sempre vo resultar em "Verdadeiro", e no colaboram para a resoluo do problema. Por outro lado, se uma nota no passa pelo teste (Media>=0) e (Media <=3.9), claro que ela maior ou igual a 4, e o teste (Media >=4) tambm desnecessrio. Do mesmo modo, ento, os testes (Media>=7) e (Media>=9) tambm so dispensveis nos pontos onde se encontram no algoritmo. Sendo assim, chegamos a uma segunda verso do programa, bem mais simplificada.

Algoritmo "Conceito2" Var Media : Real Inicio escreva("Qual a mdia do aluno?") Leia(Media) Se (Media<=3.9) entao escreva("Conceito : Fraco") Senao Se (Media<=6.9) entao escreva("Conceito : Regular") Senao Se (Media<=8.9) entao escreva("Conceito : Bom") Senao escreva("Conceito : Excelente") Fimse Fimse Fimse fimalgoritmo Note que temos 4 possibilidades de conceitos e realizamos 3 testes, eliminando uma possibilidade de cada vez. Note tambm que no usamos os valores da coluna "Nota de.." para nenhum teste, apenas os valores da coluna "At...". Mesmo assim, o ltimo valor (10) no foi usado, pois se enquadrou no ltimo senao, isto , se um aluno no Fraco, Regular ou Bom s pode ser Excelente. Refinamento 2 Note que a expresso "Conceito :" aparece quatro vezes no algoritmo. Podemos melhor-lo se guardarmos o conceito do aluno em uma varivel para us-la uma vez s no fim do programa. Algoritmo "Conceito3" Var Media : Real Conceito : Caracter Inicio escreva("Qual a mdia do aluno?") Leia(Media) Se (Media<=3.9) entao Conceito <- "Fraco" senao

se (Media<=6.9) entao Conceito <- "Regular" senao se (Media<=8.9) entao Conceito <- "Bom" senao Conceito <- "Excelente" fimse fimse fimse escreva("Conceito : ",Conceito) fimalgoritmo Em um programa simples como este a utilidade desta tcnica no fica evidente, mas no prximo problema voc poder ver como ela melhora o entendimento e otimiza o algoritmo.

Problema 11 - Quanto Ganhar o Vendedor? Enunciado


Em uma empresa o salrio final de um vendedor composto de um valor fixo mais um percentual sobre suas vendas, de acordo com a seguinte tabela: Vendas de... R$ 0,00 R$ 1.500,01 R$ 3.000,01 R$ 6.000,01 At... R$ 1.500,00 R$ 3.000,00 R$ 6.000,00 Sem Limite Percentual 2% 3% 5% 6%

Alm disso, ele descontado em R$ 5,00 por cada dia de falta ao servio. Faa um programa que receba o valor da parte fixa do salrio, o total de vendas no perodo e o nmero de faltas de um vendedor e imprima o o seu salrio final. Algoritmo "Comissao1" Var Fixo, Vendas, Faltas, Percentual : real Comissao, Desconto, Salario : real inicio escreva("Qual o valor fixo?") leia(Fixo) escreva("Qual o total de vendas?") leia(Vendas) escreva("Qual o nmero de faltas?") leia(Faltas) // Primeiro, vamos achar o percentual para o clculo das comisses se Vendas <= 1500 entao Percentual <- 2 senao se Vendas <= 3000 entao Percentual <- 3 senao se Vendas <= 6000 entao Percentual <- 5 senao Percentual <- 6 fimse fimse

fimse // Agora calculamos o valor da comisso varivel //(observe a diviso por//100 - o percentual...) comissao <- Vendas * Percentual / 100 // Ento calculamos o desconto por faltas (R$5,00 por falta) Desconto <- Faltas * 5 // E descobrimos o salario final... Salario <- Fixo + Comissao - Desconto escreva("O salrio final do vendedor :", Salario) fimalgoritmo Refinamento Vamos eliminar todas as variveis "desnecessrias" e escrever um algoritmo mais "enxuto". Note que sempre que fazemos isso, o programa se torna mais difcil de analisar, principalmente para um principiante; portanto se no conseguir entender o que foi feito no se preocupe, pois a soluo acima est 100% correta. Quando estiver mais confiante volte aqui e analise esta outra soluo. Por outro lado, lembre-se que na maioria dos casos a legibilidade uma caracterstica to importante dos programas quanto a eficincia ou economia de memria (isto , economia no nmero de variveis declaradas). Algoritmo "Comissao2" Var Fixo, Vendas, Faltas, Percentual : real inicio escreva("Qual o valor fixo?") leia(Fixo) escreva("Qual o total de vendas?") leia(Vendas) escreva("Qual o nmero de faltas?") leia(Faltas) // Primeiro, vamos achar o percentual para o clculo das comisses se Vendas <= 1500 entao Percentual <- 2 senao se Vendas <= 3000 entao Percentual <- 3 senao se Vendas <= 6000 entao Percentual <- 5 senao Percentual <- 6 fimse fimse fimse escreva("O salrio final do vendedor :") escreva(Fixo + (Vendas * Percentual / 100) - (Faltas * 5)) fimalgoritmo

Exerccios
1. Elabore um algoritmo que leia o cdigo de um determinado produto (numrico) e escreva a sua classificao, de acordo com a seguinte tabela: Cdigo 1 2, 3, ou 4 5 ou 6 7 8 at 15 Qualquer Outro 2. 3. Classificao Alimento No-Perecvel Alimento Perecvel Vesturio Higiene Pessoal Limpeza e Utenslios Domsticos Cdigo Invlido

Faa um programa que leia 3 valores numricos informe qual o menor deles. Provavelmente voc usou trs variveis para resolver o exerccio acima. Consegue resolv-lo usando apenas duas variveis? Faa um programa que leia trs valores digitados em qualquer ordem nas variveis V1, V2 e V3, e os coloque em ordem crescente, de modo que o menor valor fique em VI, o segundo menor em V2 e o maior em V3. Faa um programa que leia dois valores, que sero o limite inferior e superior de um intervalo fechado. Assuma que o primeiro valor menor que o segundo. Depois o programa ler um terceiro valor e informar se ele est dentro do intervalo ou no. Repita o exerccio anterior, mas agora pense que o usurio pode errar e digitar um limite inferior maior ou igual ao superior. Neste caso, o programa no dever pedir o terceiro nmero, e informar o problema ao operador. Faa um programa que leia o valor de uma mercadoria, e depois o modo de pagamento, que pode ser V ( vista) ou P (a prazo). Se for P, o preo ser acrescido de 10%, e o programa pedir o nmero de prestaes do financiamento, dividindo o valor j com acrscimo por este nmero, para saber (e imprimir) o valor de cada prestao. Se o modo de pagamento for V, haver um desconto de 5%, e o programa vai mostrar o novo valor. Em uma escola, o aluno faz duas provas por perodo, com as notas variando de 0 a 10. Caso a mdia aritmtica das duas notas seja 5 ou mais, ele passa; seno, reprovado. Faa um programa que receba as duas notas de um aluno e escreva se ele passou ou no para o prximo perodo. O programa no deve aceitar notas fora da faixa permitida. Qualquer erro do usurio far com que o programa emita uma mensagem avisando o ocorrido, e termine. Faa um programa que receba trs valores que sero os lados de um tringulo, e indique o tipo de tringulo formado por eles (eqiltero, issceles ou escaleno). Assuma que os lados sempre podero formar um tringulo.

4.

5.

6.

7.

8.

9.

10. Repita o exerccio anterior, prevendo que os lados podem no formar um tringulo. Caso no se lembre como isto feito, consulte um bom livro de geometria... 11. O clculo do peso ideal de um homem (em quilos) dado pela frmula (72.7 * h) - 58, onde h a altura em metros, ou seja se uma pessoa tem 1m e 80 de altura, o valor de h 1.8, e assim por diante. Baseado nesta frmula, faa um programa que receba a altura de um homem e seu peso. O programa vai calcular o peso ideal deste homem e comparar com o peso fornecido pelo usurio, imprimindo "Voc est com o peso correto.", "Voc est acima do peso ideal.", ou "Voc est abaixo do peso ideal." caso o peso fornecido seja respectivamente igual, maior ou menor que o peso ideal calculado. 12. O peso ideal para uma mulher dado pela frmula (62.1 * h) - 44.7. Faa um programa que leia o sexo de uma pessoa ( F ou M), sua altura e seu peso, calcule seu peso ideal de acordo com o sexo e informe se a pessoa est dentro do peso, acima ou abaixo.

13. Repita o exerccio acima, dando uma tolerncia de 3 quilos (abaixo ou acima do peso) para as mulheres e 5 quilos para os homens. Isto significa que se o peso ideal de uma mulher for 54 quilos, por exemplo, se ela tiver entre 51 (54-3) e 57 (54+3) quilos, ainda assim o programa dir que est dentro do peso ideal.

Captulo 7 Selecionando um entre muitos


Suponha que voc tenha que fazer um programa onde o usurio fornece o nome de um time de futebol e o programa indica o seu estado de origem, de acordo com a seguinte base de dados: Time Fluminense Vasco Flamengo Santos Palmeiras So Paulo Cornthians Santa Cruz Nutico Bahia Vitria Grmio Internacional Origem Carioca

Paulista

Pernambucano Baiano Gacho

Bom, voc j deve estar pensando na quantidade de se ... ento ... seno que o programa vai ter, no ? S por curiosidade, vamos comear a resolver o problema desta maneira. algoritmo "times1" var time, origem : caracter inicio escreva("Digite o nome de um time: ") leia(time) se time = "Fluminense" entao origem = "Carioca" senao se time = "Vasco" entao origem = "Carioca" senao se time = "Flamengo" entao origem = "Carioca" senao se time = "Santos" entao origem = "Paulista" senao se time = "Palmeiras" entao ..... etc., etc., etc... fimse fimse fimse fimse fimse escreva("O time ", time , " ", origem) fimalgoritmo claro que podemos fazer melhor do que isso! Pense bem: um time carioca se seu nome for Vasco, Flamengo ou Fluminense, paulista se seu nome for Santos, Palmeiras, So Paulo ou Cornthians, etc. Isto nos indica que podemos usar o operador lgico ou para reunir vrias perguntas em uma s, o que tornar o algoritmo bem mais enxuto. Vamos ver como esta soluo fica:

algoritmo "times2" var time, origem : caracter inicio escreva("Digite o nome de um time: ") leia(time) se (time="Fluminense") ou (time="Vasco ") ou (time="Flamengo") entao origem = "Carioca" senao se (time="Santos ") ou (time="Palmeiras") ou ((time="So Paulo") ou (time="Cornthinas") entao origem = "Paulista" senao se (time="Santa Cruz") ou (time="Nutico") entao origem = "Pernambucano" senao se (time="Bahia") ou (time="Vitria") entao origem = "Bahiano" senao se (time="Grmio") ou (time="Internacional") entao origem = "Gacho" senao origem = "desconhecido" fimse fimse fimse fimse fimse escreva("O time ", time , " ", origem) fimalgoritmo Como voc viu, o algoritmo ficou menor a ponto de podermos faz-lo todo, e at incluir uma pequena sofisticao com o caso do time desconhecido. Mesmo assim algumas linhas ficaram muito grandes, com vrios ou unindo vrios testes. Precisamos melhor-lo ainda mais. Uma coisa que podemos notar que todas as perguntas se baseiam no valor da varivel time. Quando voc encontra uma situao como esta onde vrios testes que dependem da avaliao da mesma varivel, ou expandindo o conceito, da avaliao da mesma expresso, pode lanar mo de uma estrutura de seleo. A sintaxe de uma estrutura de seleo (isto , o modo como devemos us-la) a seguinte: escolha < expresso-de-seleo > caso < exp 1 > , < exp 2 >, ... , < exp n > < lista-de-comandos-1 > caso < exp 1 > , < exp 2 >, ... , < exp n > < lista-de-comandos-2 > caso < exp 1 > ate < exp 2 >, ... , < exp n > < lista-de-comandos-2 > outrocaso < lista-de-comandos-3 > fimescolha A expresso de seleo avaliada uma s vez, no incio do comando; ento, seu resultado comparado com cada valor da lista que vem depois da primeira palavra-chave caso. Se for igual a algum deles a lista de comandos que vem a seguir executada, at se encontrar uma outra palavra caso ou outrocaso; seno a prxima lista analisada e assim sucessivamente. Caso no haja uma igualdade entre o valor da expresso e nenhum valor de nenhuma lista, os comandos depois da palavra outrocaso, se houver algum, so realizados.

importante notar que a seo outrocaso opcional. Pode haver uma situao em que desejemos no fazer nada caso o valor que estamos procurando no exista. Outro ponto importante que podemos ter dois valores separados pela palavra ate. Quando isto acontece, o programa testa se o valor da expresso de seleo est entre os dois valores fornecidos, ou seja, se maior que ou igual ao primeiro e menor que ou igual ao segundo. Os exemplos a seguir esclarecem todas estas caractersticas. algoritmo "nota1" var nota : inteiro inicio escreva("Entre com a nota do aluno: ") leia(nota) escolha nota caso 0,1,2,3 escreval("Aluno reprovado.") escreval("Melhor sorte no prximo perodo...") caso 4,5,6 escreval("Aluno em final.") caso 7,8,9,10 escreval("Aluno aprovado.") escreval("Parabns!") fimescolha escreval("Fim do programa.") fimalgoritmo Aqui vemos o comando escolha em sua forma mais simples. A nota fornecida comparada com cada valor da primeira lista: se o aluno tirou 0, 1, 2 ou 3 o programa escrever as duas mensagens na tela e depois despreza todas as outras linhas at a palavra fimescolha. A ele imprime a mensagem final e o programa termina. Suponha que o aluno tenha tirado 8: o programa no encontra este valor na primeira lista, e despreza todos os comandos at a segunda lista, na qual tambm no o encontra; do mesmo modo, ele despreza os comandos at a terceira lista, onde vai encontrar o valor 8 e executar os comandos correspondentes. E se o usurio digitar um valor menor que 0 ou maior que 10? Naturalmente, estas so notas invlidas e no esto em nenhuma das listas. Neste caso, o programa no vai colocar nenhuma mensagem na tela sobre a situao do aluno, escrevendo apenas a mensagem final. Analise agora a segunda verso deste programa: algoritmo "nota2" var nota : inteiro inicio escreva("Entre com a nota do aluno: ") leia(nota) escolha nota caso 0,1,2,3 escreval("Aluno reprovado.") escreval("Melhor sorte no prximo perodo...") caso 4,5,6 escreval("Aluno em final.") caso 7,8,9,10 escreval("Aluno aprovado.") escreval("Parabns!") outrocaso escreval("Nota invlida.") fimescolha escreval("Fim do programa.") fimalgoritmo

Inclumos a seo outrocaso, que vai tratar o caso de notas que no estejam entre 0 e 10, colocando a mensagem correspondente na tela. S para lembrar: os comandos da seo outrocaso so executados se e somente se o programa no encontrar nas listas (linhas comeando com a palavra caso) o valor da expresso de seleo. Vamos melhorar mais um pouco este programa: algoritmo "nota3" var nota : inteiro inicio escreva("Entre com a nota do aluno: ") leia(nota) escolha nota caso 0 ate 3 escreval("Aluno reprovado.") escreval("Melhor sorte no prximo perodo...") caso 4,5,6 escreval("Aluno em final.") caso 7 ate 9, 10 escreval("Aluno aprovado.") escreval("Parabns!") outrocaso escreval("Nota invlida.") fimescolha escreval("Fim do programa.") fimalgoritmo Como voc deve ter notado, substitumos a linha caso 0,1,2,3 por caso 0 ate 3, e caso 7,8,9,10 por caso 7 ate 9, 10 (poderamos ter feito o mesmo com a linha caso 4,5,6, mas a deixamos como est para comparao). Fizemos isto para ilustrar o uso da palavra ate numa lista de valores. Note que se a nota do aluno for 0, 1, 2 ou 3 (isto , de 0 at 3) o programa escrever Aluno reprovado na tela; na outra linha modificada, mostramos que a palavra ate pode ser usada em conjunto com uma lista simples de valores: se a nota do aluno for 7,8 ou 9 (isto , de 7 at 9), ou 10, o programa escrever Aluno aprovado. As listas de valores no precisam estar em nenhuma ordem especfica, embora como tcnica de programao adotar uma seja uma boa idia. A nica obrigao que a seo outrocaso seja a ltima do comando. Lembre-se tambm de que para se usar a palavra ate o primeiro valor tem que ser menor que o segundo. A verso do programa a seguir igualmente correta, mas note que j fica um pouco mais difcil de se entender: algoritmo "nota4" var nota : inteiro inicio escreva("Entre com a nota do aluno: ") leia(nota) escolha nota caso 6, 4, 5 escreval("Aluno em final.") caso 10, 7 ate 9 escreval("Aluno aprovado.") escreval("Parabns!") caso 0 ate 3 escreval("Aluno reprovado.") escreval("Melhor sorte no prximo perodo...") outrocaso escreval("Nota invlida.") fimescolha escreval("Fim do programa.") fimalgoritmo

Quase todas as linguagens de programao tm uma estrutura parecida com esta, cada uma com suas caractersticas, restries ou facilidades especficas. A idia bsica, no entanto, a mesma. O que voc aprendeu aqui, com pequenas adapataes, permitir o uso desta estrutura quando for necessria. Um dos usos mais comuns da estrutura de seleo para se fazer algo em um programa baseado em uma opo fornecida pelo usurio. O programa apresenta um menu para o operador, obtm sua resposta e realiza a tarefa escolhida. Veja o programa a seguir: Problema 11 Clculo da rea de figuras geomtricas Enunciado Faa um programa que calcule a rea de um crculo, quadrado ou tringulo. O usurio informar a figura da qual deseja a rea, e baseado nesta escolha o programa pedir os dados adequados e realizar o clculo. Anlise Nos exerccios do captulo 1 vimos como se calculam as reas das figuras pedidas. Podemos aproveitar o que foi visto ali. Precisamos agora de obter do usurio a figura da qual ele quer o clculo, para saber que dados iremos pedir e que frmula usaremos. Definio dos dados Precisaremos da opo da figura, para a qual usaremos uma varivel do tipo caracter chamada OPCAO, com os valores C para o crculo, Q para o quadrado e T para o tringulo e F para finalizar o programa. Para qualquer outro valor, o programa informar que a opo foi invlida. Usaremos tambm duas variveis do tipo real, chamadas V1 e V2 para obter os dados numricos. As mesmas variveis sero usadas em todos os clculos, conforme necessrio. Obteno dos dados A obteno dos dados neste programa simples e direta. Basta pedirmos ao usurio que digite os valores. Processamento Segundo as frmulas de clculo para cada figura. Exibio Basta exibir o contedo da rea calculada. Soluo algoritmo "areas" var opcao : caracter v1,v2,v3 : real inicio escreval("Programa para clculo de reas de figuras geomtricas.") escreval escreval("Q - rea do quadrado") escreval("C - rea do crculo") escreval("T - rea do trapzio") escreval("F - Fim") escreva("Digite a sua opo:") leia(opcao) escreval escolha opcao

caso "Q" escreval("Digite o valor do lado:") leia(v1) escreval("A rea do quadrado de lado ",v1," ", quad(v1) : 10: 3 ) caso "C" escreva("Digite o valor do raio:") leia(v1) escreval("A rea do crculo de raio ",v1," ", quad(v1)*pi : 10: 3 ) caso "T" escreva("Digite o valor da base menor:") leia(v1) escreva("Digite o valor da base maior:") leia(v2) escreva("Digite o valor da altura:") leia(v3) escreva("A rea do trapzio de bases ",v1) escreval(" e ", v2," e altura ",v3," ", (v1+v2)/2*v3 : 10: 3 ) caso "F" escreval("Obrigado por usar este programa.") outrocaso escreval("Opo invlida.") fimescolha fimalgoritmo A primeira coisa a comentar neste programa como se constri o menu. Coloca-se um ttulo que indica o que o programa faz, pula-se uma linha ( o comando escreval sem nada na frente faz justamente isto), listam-se as opes, pula-se outra linha e se pede a escolha do usurio. Nos bons tempos da programao sem o modo grfico do Windows, quase todo programa funcionava desta maneira. Uma vez que sabemos de que figura calcular a rea, basta pedirmos os dados. Note que definimos trs variveis reais para obter estes dados e que algumas delas so usadas em mais de um ponto do programa. Fizemos isto para economizar a memria do computador, mas poderamos ter declarados as variveis lado, raio, basemenor, basemaior e altura, por exemplo, para ler cada dado necessrio com sua varivel exclusiva. Em um programa pequeno como este pode-se lanar mo do recurso das variveis genricas sem perda do entendimento; como o usurio no v o nome das variveis e sim a instruo que colocamos na tela, para ele no faz diferena, mesmo. Em programas maiores, entretanto, esta tcnica no aconselhada. Tambm usamos neste programa duas funes pr-definidas, quad() e pi. Quad(x) retorna o valor de x elevado ao quadrado, e pi retorna o famoso nmero 3.141592. Assim, as duas linhas abaixo so equivalentes: escreval("A rea do crculo de raio ",v1," ", quad(v1)*pi : 10:3 ) escreval("A rea do crculo de raio ",v1," ", v1*v1*3.141592 : 10:3 ) E o que representam os nmeros com dois pontos depois da expresso? So parmetros de formatao para a impresso dos valores na tela do computador. O primeiro nmero, 10, indica que o valor ocupar 10 colunas (espaos) na tela; o segundo, 3, indica o nmero de casas decimais que sero exibidas. Valores numricos so sempre alinhados direita, o que significa que se o nmero tiver menos de 10 dgitos o computador colocar espas em branco sua esquerda. Por outro lado, se tiver menos de 3 casas decimais, as restantes sero completadas com zeros; se tiver mais de 3 casas, ser arredondado para as 3 da formatao. Para terminar, note que a linha que informa a rea do trapzio foi dividida em dois comandos: um escreva e um escreval. Isto no acarreta nenhum problema, pois como sabemos o computador ao terminar o comando escreva coloca o cursor (ponto onde a prxima leitura ou escrita ser realizada) depois da ltima coisa escrita. Sendo assim, as duas formas a seguir so equivalentes: escreva("rea do trapzio de medidas ",v1)

escreval(",", v2," e ",v3,":", (v1+v2)/2*v3) escreval("rea do trapzio de medidas ",v1,",",v2," e ",v3,":",(v1+v2)/2*v3)

Exerccios
1. Usando o comando escolha, elabore um algoritmo que leia o cdigo de um determinado produto (numrico) e escreva a sua classificao, de acordo com a seguinte tabela: Cdigo 1 2, 3, ou 4 5 ou 6 7 8 at 15 Qualquer Outro 2. Classificao Alimento No-Perecvel Alimento Perecvel Vesturio Higiene Pessoal Limpeza e Utenslios Domsticos Cdigo Invlido

Usando o comando escolha, faa um programa que pea um valor do tipo caracter para o usurio, composto de apenas um caracter. O programa dir se ele um espao, uma letra, nmero ou sinal de pontuao (consideraremos a vrgula, ponto, exclamao, interrogao, dois pontos e ponto-e-vrgula); para um caracter que no se enquadre em nenhum destes tipos, o programa informar que um caracter desconhecido. DICA: Consulte a tabela ASCII em um livro de informtica para ver a ordem em que estes caracteres esto agrupados. Repita o exerccio anterior, agora informando se a letra uma vogal ou consoante. Melhore o problema 11 para incluir o clculo da rea de outras figuras, como o tringulo e retngulo.

3. 4.

Captulo 8 Trabalhando com repeties


O poder dos computadores vem do fato de eles poderem processar uma grande quantidade de dados com rapidez e exatido; entretanto, as estruturas que estudamos at agora no permitem que isto seja feito de uma maneira eficiente. Imagine que voc tivesse que fazer um programa que lesse trs valores e calculasse o seu somatrio. Provavelmente, o seu programa seria mais ou menos assim: algoritmo "somatorio1" var v1,v2,v3,soma : real inicio escreval("Programa para calcular o somatrio de trs valores.") escreval escreva("Digite o primeiro valor:") leia(v1) escreva("Digite o segundo valor:") leia(v2) escreva("Digite o terceiro valor:") leia(v3) soma <- v1 + v2 + v3 escreval escreval("A soma dos valores :" , soma : 10 : 3 ) fimalgoritmo Perfeito. Para trs valores apenas, esta soluo vivel. Vamos melhor-la um pouco e diminuir o nmero de variveis. Na verdade, s precisamos de duas. No exemplo a seguir as linhas so numeradas apenas para auxiliar a sua explicao. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 algoritmo "somatorio2" var v1, soma : real inicio // Inicializamos SOMA com zero soma <- 0 escreval("Programa para calcular o somatrio de trs valores.") escreval escreva("Digite o primeiro valor:") leia(v1) soma <- soma + v1 escreva("Digite o segundo valor:") leia(v1) soma <- soma + v1 escreva("Digite o terceiro valor:") leia(v1) soma <- soma + v1 escreval escreval("A soma dos valores :" , soma : 10 : 3 ) fimalgoritmo

Vrias tcnicas so usadas neste algoritmo: Linha 5: Inicializamos a varivel soma com zero, porque vamos utiliz-la para acumular os trs valores digitados pelo usurio. Qual o motivo disso? Lembre-se que quando declaramos uma varivel, na verdade estamos reservando uma rea na memria do computador onde seu valor ser armazenado. O que estava armazenado a anteriormente indeterminado, e portanto devemos atribuir o valor zero varivel, para termos certeza da exatido de nosso programa. Linhas 9, 12 e 15: Lemos a varivel v1 trs vezes. Sabemos que quando lemos uma varivel o valor digitado pelo usurio armazenado nela, substituindo o que estava ali anteriormente. Ento, como vamos somar os trs valores se ao ler o segundo perdemos o primeiro, e assim por diante? Bem, note que na linha 10 acumulamos o primeiro valor, lido na linha anterior, na varivel soma, e s ento lemos a varivel v1 uma segunda vez. O primeiro valor ento ser perdido, mas no tem problema porque j o utilizamos. A mesma coisa acontece nas linhas 13 e 16.

Linhas 10, 13 e 16: Usamos a palavra acumular vrias vezes nesta explicao, mas o que realmente isto significa? Preste ateno na linha 10: soma <- soma + v1.Ela indica que a varivel soma recebe o valor que ela tem no momento mais o valor da varivel v1 no momento. Ento, se soma vale 5 em um determinado momento, e v1 vale 3, se a linha 10 for executada, soma receber 5 (o seu prprio valor agora) mais 3 (o valor de v1), ou seja, 8. Na prtica o que foi feito foi acrescentar varivel soma o valor de v1, e da vem o termo acumular. Esta tcnica usada com muita freqncia em programao, e voc dever estar bastante familiarizado com ela. Realizando um teste de mesa Para terminar, vamos estudar uma tcnica que nos permitir testar a exatido de algoritmos, simulando o seu funcionamento no computador. Alguns autores denominam a tcnica de teste de mesa, e alguns programadores a chamam informalmente de rodar o chins (de donde vem esta expresso, ningum sabe). Em um programa simples como o que estamos analisando ela pode parecer um exagero, mas em outros mais complexos ela com certeza mostrar sua utilidade. Para rodarmos o chins precisamos de um conjunto de dados de teste; este nome bonito significa que vamos supor o que o usurio digitar quando utilizar o programa. No nosso caso, vamos assumir que ele digitar 10, 3 e 9 (nesta ordem) quando o programa pedir. Ento, nossos dados de teste so 10, 13 e 9. Depois, construimos uma espcie de planilha onde a primeira coluna representa a linha de programa sendo executada e cada uma das outras representa uma varivel. Comeamos ento a simular a execuo do programa, linha por linha. medida em que um comando leia executado ou que uma atribuio feita, escrevemos na coluna correspondente varivel o valor digitado ou calculado, naturalmente apagando o valor que havia l anteriormente. Se precisarmos do valor da varivel para um clculo ou para escrever na tela, vamos de novo coluna daquela varivel e pegamos o ltimo valor gravado, que o seu valor atual. A planilha para este algoritmo inicialmente ficar assim: Linha 2 SOMA ? V1 ?

Na linha 2 as variveis foram declaradas, mas o seu valor desconhecido. Ao se executar a linha 5, soma receber 0, e a planilha ficar assim (note que o valor de v1 no foi alterado, e continua indeterminado): Linha 2 5 SOMA ? 0 V1 ?

Na linha 9, o usurio vai digitar o primeiro valor (10, segundo nossos dados de teste). A planilha ento ficar assim: Linha 2 5 9 SOMA ? 0 V1 ? 10

Neste ponto vale lembrar que embora haja mais de um valor nas colunas SOMA e V1, o que vale sempre o ltimo, porque este o valor da varivel no momento. Quando a linha 10 executada, soma receber o seu valor no momento, que 0, mais 10, que o valor de v1. Ento, a planilha ficar assim: Linha 2 5 9 10 SOMA ? 0 10 V1 ? 10

Quando as linhas 12 e 13 forem executadas, o usurio digitar 13 e este valor ser acumulado em soma.

Linha 2 5 9 10 12 13

SOMA ? 0 10

V1 ? 10 13

23

Depois da execuo das linhas 15 e 16, teremos os seguintes valores na planilha: Linha 2 5 9 10 12 13 15 16 SOMA ? 0 10 13 23 9 32 V1 ? 10

Ao executar a linha 18, o computador exibir o valor atual da varivel soma, que 32. Esta a tcnica bsica para se executar um teste de mesa. Saber interpretar um algoritmo quase to importante como faz-lo. Alis, uma grande parte do trabalho de um programador analisar algoritmos, para descobrir erros de lgica, para entender o que um outro programador (que geralmente est de frias...) estava pensando ao criar um programa, ou at mesmo para refrescar a memria revendo um algoritmo que ele mesmo fez. O algoritmo que criamos razoavelmente eficiente para somar trs valores, mas e se tivssemor que somar 30 valores? Certamente poderamos repetir as linhas 14, 15 e 16 um nmero qualquer de vezes para ler tantos valores quantos fossem necessrios, mas qual a eficincia disso? Analisando o algoritmo, vemos que as linhas 8, 9 e 10 so quase iguais s linhas 11, 12 e 13 e 14, 15 e 16. Se pudermos escrever estas trs linhas (8, 9 e 10) uma s vez e pedir ao computador para execut-las 30 vezes poderemos ler os 30 valores com um algoritmo compacto e eficiente. ai que entram os comandos de repetio. Os comandos de repetio, tambm chamados de loops, laos ou malhas, so estruturas que delimitam um ou mais comandos e podem fazer com que eles sejam executados repetidamente um certo nmero de vezes. Existem trs comandos deste tipo, e vamos comear pelo mais simples. O comando para ... faa O comando para...faca (aasim mesmo, sem cedilha) faz com que um bloco de comandos seja executado certo nmero de vezes. Este nmero de vezes controlado por uma varivel do tipo inteiro que fica contando quantas repeties j aconteceram. Assim que a quantidade desejada atingida, as repeties param e o programa continua a partir do primeiro comando depois fim do bloco delimitado pelo para...faca. Vamos refazer o algoritmo anterior usando um comando para...faca, e depois vamos realizar um teste de mesa. 1 2 3 4 5 6 7 8 9 algoritmo "somatorio3" var v1, soma : real j : inteiro inicio // Inicializamos SOMA com zero soma <- 0 escreval("Programa para calcular o somatrio de trs valores.") escreval para j de 1 ate 3 faca

10 11 12 13 14 15 16

escreva("Digite um valor:") leia(v1) soma <- soma + v1 fimpara escreval escreval("A soma dos valores :" , soma : 10 : 3 ) fimalgoritmo

Logo de incio notamos que o programa ficou um pouco menor, e que uma varivel do tipo inteiro foi criada ( ela quem vai controlar o nmero de repeties). Os comandos que sero repetidos esto nas linhas 10, 11 e 12, e so delimitados pelos comandos para...faca e fimpara. Note que eles esto indentados; isto no obrigatrio e tambm no influncia na execuo do programa, mas uma boa prtica pois d uma indicao visual dos comandos que sero repetidos. O que significa a linha para j de 1 ate 3 faca ? Quando esta linha executada, a varivel j recebe o valor 1 (chamado valor inicial), e este valor comparado com 3 (chamado valor final). Se o valor inicial for menor ou igual ao valor final, uma repetio ser executada at que se chegue ao fimpara. No ache estranha esta primeira comparao; o valor inicial pode ser maior que o final s vezes, como voc poder ver... Quando o programa atinge o comando fimpara na linha 13, a varivel j incrementada em um, passando ento a valer 2, e novamente comparado ao valor final. Se for menor ou igual a ele, mais uma repetio ser executada, comeando na linha 10. No nosso caso, 2 menor que 3, e ento temos mais uma repetio. Ao atingir a linha 13 novamente, j ser incrementado de novo, passando a ter o valor 3, e nova comparao com o valor final ser feita. Naturalmente, como 3 igual a 3, outra repetio ser executada a partir da linha 10. Bem, quando o programa executar a linha 13 de novo, j passar a valer 4 (que no menor ou igual a 3); ento no haver nova repetio, e o programa continuar da linha 14 em diante. Se voc prestar ateno, ver que houve trs repeties, com j valendo 1, 2 e 3. Quando o valor de j atingiu 4, ele ultrapassou o valor final, e cessaram as repeties. Realizando o teste de mesa com os mesmos dados de teste do algoritmo anterior, teremos o seguinte resultado: Linha 2e3 6 9 11 12 13 11 12 13 11 12 13 V1 ? SOMA ? 0 J ? 1 10 10 2 13 23 3 9 32 4 Comentrio Declarao das variveis Inicializao de SOMA Incio do comando para..faca Primeira leitura de V1 Acumula V1 em SOMA Comando fimpara. J incrementado em 1 Segunda leitura de V1 Acumula V1 em SOMA Comando fimpara. J incrementado em 1 Terceira leitura de V1 Acumula V1 em SOMA Comando fimpara. J incrementado em 1 (fim das repeties)

importante notar que a funo da varivel j apenas contar o nmero de repeties; por isso, no se deve modificar o seu valor diretamente dentro de um loop, seja por atribuio ou leitura. Deixe que o comando para..faca cuide dela. Isto no nos impede, no entanto, de usar o valor de J se for interessante. Analise o algoritmo abaixo e veja o que acontece... algoritmo "somatorio4" var v1, soma : real j : inteiro inicio // Inicializamos SOMA com zero soma <- 0

escreval("Programa para calcular o somatrio de trs valores.") escreval para j de 1 ate 3 faca escreva("Digite o ", j , "o. valor:") leia(v1) soma <- soma + v1 fimpara escreval escreval("A soma dos valores :" , soma : 10 : 3 ) fimalgoritmo Voc deve ter entendido a utilidade do para...faca agora. Se quisermos fazer com que o programa leia 30 valores, basta mudar o 3 por 30 (ou 50, 500...) no comando de repetio, e o mesmo programa passar a ler a quantidade de valores desejada. Isto nos traz a uma limitao deste comando. Ele s pode ser utilizado quando soubermos exatamente quantas vezes o lao vai ser executado, no momento em que estivermos criando o algoritmo (como no exemplo acima), ou no momento em que ele estiver sendo executado. Veja o exemplo a seguir: algoritmo "somatorio5" var v1, soma : real qtde, j : inteiro inicio // Inicializamos SOMA com zero soma <- 0 escreval("Programa para calcular o somatrio de uma srie de valores.") escreval escreva("Quantos nmeros voc quer somar?") leia(qtde) para j de 1 ate qtde faca escreva("Digite o ", j , "o. valor:") leia(v1) soma <- soma + v1 fimpara escreval escreval("A soma dos valores :" , soma : 10 : 3 ) fimalgoritmo Problema 12 Escrever os pares de 2 a 20 Faa um programa que escreva os nmeros pares de 2 a 20, inclusive, usando um comando para...faca.. Anlise Quem no sabe quais so os pares de 2 a 20? So 2, 4, 6, 8, ..., 16, 18, 20. Isto fcil, mas como usar um comando de repetio para escrev-los? Bem, todo nmero par o dobro de um outro nmero, no ? Se pensarmos assim, veremos que 1 * 2 = 2, 2 * 2 = 4, 3 * 2 = 6, ... , 9 * 2 = 18 e 10 * 2 = 20. Sendo assim, podemos fazer com que a varivel de controle varie entre 1 e 10, e a cada repetio escreveremos o seu dobro. O programa ficar assim: algoritmo "pares1" var j : inteiro inicio escreval("Programa para escrever os nmeros pares entre 2 e 20.") para j de 1 ate 10 faca // Para cada valor de j, escreva o seu dobro. escreval( j * 2 ) fimpara fimalgoritmo

Esta soluo est correta, mas h outras. Alis, explorar outras solues para um problema mesmo depois de j t-lo resolvido um timo exerccio. Por exemplo, no seria timo se j fosse incrementado de 2 em 2 ao invs de 1 em 1? Se pudssemos fazer isto, comearamos com ele valendo 2, e de 2 em 2 escreveramos os pares ate 20. A boa notcia que podemos fazer isto! O comando para..faca permite que se especifique o passo de incremento, ou seja, quanto ser somado varivel de controle no fim de cada repetio. Este valor pode ser qualquer inteiro diferente de zero, e pode ser negativo ou positivo. Vamos explorar esta possibilidade: algoritmo "pares2" var j : inteiro inicio escreval("Programa para escrever os nmeros pares entre 2 e 20.") // Usando passo 2, faremos com que j s assuma valores pares para j de 2 ate 20 passo 2 faca escreval( j ) fimpara fimalgoritmo Como j incrementado em 2 a cada repetio, de 2 ele passa para 4, 6, 8, etc., at chegar a 20. Apresentaremos agora uma outra soluo, menos eficiente que as duas anteriores, mas que serve para ilustrar vrios conceitos. Podemos gerar todos os nmeros entre 2 e 20, mas s imprimir os pares. Mas como saber se um nmero par? No captulo 2 estudamos o operador MOD, que fornece o resto da diviso inteira entre dois nmeros. Sabemos que o resto da diviso de todo par por 2 0, e de todo mpar 1, no mesmo? Ento, para cada valor de j testaremos j mod 2 e se o resultado for zero imprimiremos o nmero, porque ele par. O algoritmo ficar assim: algoritmo "pares3" var j : inteiro inicio escreval("Programa para escrever os nmeros pares entre 2 e 20.") para j de 2 ate 20 faca se j mod 2 = 0 entao escreval( j ) fimse fimpara fimalgoritmo

Interesses relacionados