Você está na página 1de 46

Algoritmos de Programao para Resoluo de Problemas de Fsica, Matemtica e Engenharia

der Julio Kinast Universidade Estadual do Rio Grande do Sul Unidade Novo Hamburgo Verso 2.0 - Maro de 2006

Sumrio
1 Introduo 2 Diagramas de Blocos 3 Resoluo de Problemas com Diagrama de Blocos e Portugus Estruturado 4 Tipos de Dados, Variveis e Constantes 5 Operaes Matemticas e Frmulas 6 Os 6.1 6.2 6.3 Comandos Bsicos Os Comandos leia e escreva . . . . . . . . . . . . . . Funes e Funes de Retorno . . . . . . . . . . . . . . Tomadas de Deciso . . . . . . . . . . . . . . . . . . . 6.3.1 Operadores .E., .OU. e .NO. . . . . . . . . . 6.3.2 Tomada de Deciso com Vrias Possibilidades . 6.4 Laos de Repetio . . . . . . . . . . . . . . . . . . . . 6.4.1 Lao de Repetio com Teste Lgico no Incio . 6.4.2 Lao de Repetio com Teste Lgico no Final . 6.4.3 Lao de Repetio com Varivel de Controle . 6.4.4 Lao de Repetio Innito e o Comando pare . 2 3 4 6 7 8 8 11 13 17 21 22 22 25 26 28 33 33 34

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

7 Consideraes Finais 8 Referncias 9 Apndice A - Algoritmos Traduzidos para Linguagem C

Introduo

Nas reas das Cincias Exatas freqentemente depara-se com problemas que necessitam de recursos computacionais para serem resolvidos. Este material introduz os algoritmos de programao aos alunos de garduao. Alm disso, proporciona condies iniciais para posterior elaborao de programas mais complexos. Sero apresentados os conceitos bsicos de variveis, constantes, funes, tomadas de deciso e laos de repetio, focando fortemente exemplos de aplicaes matemticas simples para facilitar a compreenso. Os algoritmos so, basicamente, uma sucesso de ordens bem denidas que formam o processo pelo qual ser cumprido determinada tarefa ou resolvido determinado problema. Por exemplo, qual o primeiro nmero inteiro de 1 at 1000, que multiplicado por 3 ento subtrado de 2, divisvel por 11? O problema acima puramente matemtico e dicilmente teria aplicao prtica. Porm, imagine guardar uma lista de 1000 nomes, cada um com endereo completo, nmero de telefone, nmero do CPF e data de nascimento. Ento, gerar uma lista das pessoas que nasceram antes de determinada data; ou, gerar uma lista destas pessoas que moram em determinado bairro. Seria uma tarefa cansativa. Imagine ento, se ao invs de 1000 nomes, tivssemos 100.000 nomes! O tempo que levaramos para fazer uma lista parcial com determinada caracterstica seria enorme! Esta e outras razes fazem com que utilizemos os computadores. Pela capacidade de processamento que possuem, os computadores so os ajudantes ideais para este tipo de servio, pois so muito mais rpidos do que ns poderamos ser nestes casos. Alm do mais, em condies ideais, os computadores no erram. E as condies idias so algoritmos bem escritos, alm de computadores em bom estado de funcionamento. Um computador pode executar muitas tarefas de forma rpida e eciente, porm, para fazer isto necessrio que saibamos comunicar ao computador exatamente o objetivo, informando todo o procedimento a ser executado, as alternativas possveis, e algumas vezes at os erros que podem surgir. importante diferenciarmos os algoritmos propriamente ditos com as diversas linguagens de programao, como FORTRAN, Pascal, C, C++, Java, etc. Um algoritmo pode ser escrito diretamente em uma dessas linguagens, como pode ser escrito em portugus, ingls ou at representado por um diagrama de blocos que descreva as instrues a serem cumpridas. Neste captulo, iremos privilegiar os algoritmos, seja em portugus ou atravs de diagramas de blocos, ao invs de suas tradues em diferentes linguagens. Utilizaremos algumas ferramentas didticas para passar os conceitos e formas para escrever algoritmos. Uma delas escrev-los em portugus estruturado. Esta forma de escrita nada mais do que escrever as ordens em portugus simples e resumido. Outra ferramenta de aprendizagem o uso dos Diagramas de Blocos, muito teis para construirmos e compreendermos melhor os algoritmos. Conforme j comentado, no ser possvel contemplar toda matria de algoritmos, mas sim aquelas instrues iniciais. Para uma discusso mais aprofundada, sugerimos as referncias do nal do captulo. Esperamos que este estudo inicial possa contribuir para o entendimento bsico dos algoritmos de programao. Ou ainda, que esta introduo aos comandos lgicos de programao abram alguns horizontes de possibilidades. Bom proveito!

Diagramas de Blocos

Os diagramas de blocos so utilizados para descrever a seqncia de ordens ou procedimentos de um algoritmo ou programa computacional. So utilizados smbolos especcos, que indicam as diferentes operaes que devem ser realizadas, como entradas e sadas de dados, processamentos (clculos), tomadas de deciso, etc. Geralmente elaboramos um diagrama de blocos para depois escrevermos o algoritmo correspondente. Isto acontece, pois o diagrama de blocos facilita o entendimento do algoritmo (e seus eventuais consertos de lgica, quando necessrios). Os principais smbolos utilizados para elaborao dos diagramas de blocos so: Terminal serve para indicar o incio ou o trmino de um programa;

Seta de uxo serve para conectar os outros smbolos e indicar a direo do uxo de processamento; Processamento serve para indicar o processamento de informaes ou clculos; Entrada de dados serve para indicar a entrada de dados, em geral, via teclado; Display utilizado para indicar a exibio de dados, em geral, na tela do computador; Tomada de deciso serve para indicar a tomada de deciso, em geral, a partir de variveis e seus determinados valores; Conector serve para rejuntar ou re-conectar o uxo de dados aps uma tomada de deciso; Seta dupla de uxo so setas de uxo com prioridade maior, em geral, utilizadas para parar um lao de repetio ou mudar bruscamente a ordem de processamento; Preparao utilizada no incio de grupos de comandos como processamento inicial.

Resoluo de Problemas com Diagrama de Blocos e Portugus Estruturado

Inicialmente, iremos tratar de problemas ou tarefas simples, como o primeiro problema que segue. Problema 1 - Ler 3 notas e calcular a mdia aritmtica destas. Para fazermos o computador realizar esta tarefa, necessrio que ele leia as 3 notas a partir do que escrevemos no teclado, e aps calcule e escreva a mdia na tela. Desta forma, teremos as etapas bsicas contidas na Figura 1.
incio

leitura das 3 notas

clculo da mdia

escrita da mdia na tela fim

Figura 1: Diagrama de Blocos para clculo da mdia de 3 notas. Outro problema interessante, pedir para o programa escrever na tela se o aluno est APROVADO ou REPROVADO, dependendo se sua mdia foi maior ou igual a 6.0. Para tanto, necessrio utilizar uma tomada de deciso, vericando se a condio da mdia ser maior ou igual a 6.0 ser verdadeira ou falsa. Teramos ento o diagrama de blocos da Figura 2.
incio

leitura das 3 notas

clculo da mdia

mdia 6

REPROVADO

APROVADO

escrita da mdia na tela fim

Figura 2: Diagrama de Blocos para clculo da mdia, indicando aprovao ou reprovao. Note que dentro do losango h a inscrio mdia 6, que signica que o computador deve vericar se isto Verdadeiro ou Falso. Toda tomada de deciso vai envolver uma condio, e esta ser verdadeira ou falsa. Caso a mdia seja maior ou igual a 6, o programa optar por seguir o programa pelo lado direito (lado Verdadeiro), caso a mdia seja menor que 6, seguir pelo lado esquerdo (lado Falso).

Em breve iremos tratar mais detalhadamente de cada uma das instrues acima, porm, caso escrevssemos o diagrama de blocos na forma resumida, utilizando variveis, teramos a seguinte representao da Figura 3.
incio

N1, N2, N3

M = (N1+N2+N3)/3

M 6,0

REPROVADO

APROVADO

M fim

Figura 3: Diagrama de Blocos resumido para clculo da mdia de 3 notas, indicando aprovao ou reprovao. Neste caso, o programa deveria ler os valores das notas N1, N2 e N3. Ento calcular a mdia aritmtica M, que igual as trs notas somadas e divididas por 3. Os smbolos de soma e subtrao so os tradicionais + e --, porm para os smbolos de multiplicao e diviso sero escritos como * e /, respectivamente, pois assim feito nas linguagens computacionais que utilizaremos. O programa representado acima pelo diagrama de blocos, pode ser transcrito para forma escrita, mais perecido com a forma nal dada antes de introduzirmos estas ordens no computador. Para tanto utilizaremos o portugus estruturado, comentado na Introduo: #utiliza padres /* utiliza os padres conhecidos de funes */ incio principal /* incio do programa propriamente dito */ define reais N1, N2, N3, M /* definio das variveis */ escreva(Digite as 3 notas) /* texto de orientao */ leia(N1,N2,N3) /* leitura das notas */ M=(N1+N2+N3)/3 /* clculo da mdia */ se (M>=6.0) ento /* tomada de deciso */ {escreva(APROVADO)} /* comando caso Verdadeiro */ seno {escreva(REPROVADO)} /* comando caso Falso */ fim_se /* fechamento da deciso */ escreva(A mdia final vale ,M) /* escrita da mdia */ vai para o final /* comando de encerramento */ final principal /* fim do programa */ Nas prximas sesses iremos tratar de cada um dos comandos acima, porm alguns aspectos chamam a ateno. Por exemplo, existem linhas que comeam mais direita de outras. Aps o comando incio principal at o comando final principal, as linhas foram escritas em outro nvel, mais direita. Isto

acontece, pois todas essas linhas internas so comandos que esto dentro da estrutura do incio at o nal da parte principal. Outro exemplo, a estrutura se-seno-fim_se. Estes trs comandos esto no mesmo nvel, porm os comandos que devem ser realizados caso a mdia seja maior ou igual a 6 (escrever APRORVADO) ou menor que 6 (escrever REPROVADO), so mais internas e esto dentro da estrutura da tomada de deciso. Finalmente importante introduzir as frases colocadas entre os smbolos /* e */, que so comentrios para melhor entendimento do programa. Estes comentrios so desconsiderados quando o computador executar o programa.

Tipos de Dados, Variveis e Constantes

Existem cinco tipos principais de dados que se pode armazenar e processar, que so: Tipo Inteiro so os nmeros inteiros, positivos ou negativos, como por exemplo, 5, 200, 0, 17000 e 137963; Tipo Real so os nmeros com casas decimais, como por exemplo, 5.12, 1.2, 235.18021 e 12.0. Note que as casas decimais so separadas por ponto ao invs de vrgula, pois utilizado o padro americano. Alm disso, o nmero 15. apesar de no possuir casa decimal, considerado do tipo real, pois est escrito com o ponto; Tipo Texto so expresses e textos escritos entre aspas (), como por exemplo, Ol, Bairro Centro, DDD 51 e Rua Dr. Sol, 12/301; Tipo Caractere so dados escritos entre aspa () e formados por um nico dgito, como por exemplo, a, A, 4, # e ~; Tipo Lgico s existem duas possibilidade de dados lgicos, que so Verdadeiro ou Falso. Este tipo de dado bastante utilizado para auxiliar em tomadas de deciso ou processamentos elaborados. Em geral, representamos os tipos lgicos por .V. ou .F.. Estes cinco tipos de dados podem ser armazenados em variveis, que so fragmentos da memria do computador selecionados para guardar valores ou expresses. Por exemplo, no Problema 1, no calculo da mdia aritmtica de 3 notas, os valores das notas eram guardadas nas variveis N1, N2 e N3. A mdia foi calculada e o valor foi armazenado na varivel M. Estas quatro variveis so do tipo real, pois guardam valores que podem ter casas decimais (as notas podem valer, por exemplo, N1=7.4, N2=8.2 e N3=7.0, assim a mdia com cinco casas decimais vale M=7.53333). Freqentemente utilizamos tambm variveis que guardam os outros tipos de dados. Por exemplo, NOME=Joo (tipo texto), OPCAO=2 (tipo caractere), RG=12345678 (tipo inteiro), RESPOSTA=.V. (tipo lgico). Existem algumas regras para escrevermos os nomes das variveis: o primeiro dgito deve ser obrigatoriamente uma letra; s podem ser utilizados letras maisculas ou minsculas, nmeros e o smbolo de sublinhado _;

no podem ser utilizadas as palavras reservadas da linguagem como nomes de variveis. No caso de portugus estruturado, no poderemos utilizar, por exemplo, uma varivel com o nome leia; Alm disso, as variveis escritas em maisculas so consideradas diferentes daquelas escritas com minsculas. Por exemplo, as variveis CPF, cpf e Cpf so diferentes. Assim, preciso ter cuidado para escrever os nomes das variveis sempre da mesma forma dentro de um programa. J as constantes so valores xos, utilizadas, em geral, dentro de expresses e clculos matemticos. Por exemplo, podemos escrever a frmula para circunferncia de um crculo como C=2*3.14159*r, onde os nmeros 2 e 3.14159 (nmero ou Pi) servem como constantes.

Operaes Matemticas e Frmulas

Nas principais linguagens computacionais, no existe a possibilidade de se escrever as frmulas matemticas no formato padro que conhecemos. Por exemplo, a expresso f= x2 + 5 3x 1

deve ser escrita na forma padro de linguagens computacionais, que so em linhas. Para tanto fazemos uso de parnteses e dos smbolos +, , *, /, e ^ para as operaes de soma, subtrao, multiplicao, diviso e potnciao, respectivamente. A expresso escrita acima escrita em uma linha corresponde a: f=(x^2+5)/(3*x-1) Outros exemplos: Formato matemtico M= N1 + N2 + N3 3 a2 + b2 Formato computacional M=(N1+N2+N3)/3 (3-(5*x+2*(8+x))) c=(a^2+b^2)^(1/2)

{3 [5x + 2 (8 + x)]} c=

Nestes exemplos, podemos notar que os parnteses exercem uma funo importante: a de limitar os grupos de operaes que dever ser feitas. No caso da mdia, as notas N1, N2 e N3 devem ser somadas antes de serem divididas por 3, e os parnteses garantem isso na forma computacional. Na forma computacional no existem chaves ou colchetes, ambos so substitudos por parnteses. J as razes matemticas sero consideradas como potncias no inteiras, como no exemplo acima: extrair a raiz quadrada o mesmo que elevar a potncia 1 2.

Os Comandos Bsicos

Antes de comear a descrever os comandos bsicos, preciso comentar sobre a forma padro com que escreveremos os programas. Quando escrevemos na linguagem C, os comandos utilizados devem estar previamente denidos para o computador em arquivos chamados cabealhos. No o objetivo deste guia detalhar tais arquivos. Iremos nos limitar a acrescentar a linha #utiliza padres para indicar que o programa deve ser construdo sobre as funes padres. Outro aspecto interessante que a linguagem C nomeia o grupo de comandos central de main ou principal. A parte principal de um programa contm a coluna vertebral dos processos, os comando que iro gerenciar todo o programa. Estes comandos cam entre as linhas incio principal e final principal. O trmino de um programa se dar, em geral, com a instruo vai para o final, que indica para o programa que deve ir para o nal da parte principal e terminar o programa. Neste captulo tambm iremos tratar de forma bsica as funes que podem ser denidas fora da parte principal do programa.

6.1

Os Comandos leia e escreva

A entrada de dados via teclado ser feita pelo comando leia e a sada de dados na tela ser feita pelo comando escreva. A Figura 4 mostra os smbolos usados em um uxograma para representar estes dois comandos.
Leitura
lista de dados

Apresentao
lista de dados

Figura 4: Smbolos usados nos diagramas de blocos para leitura e apresentao dos dados. Os comandos de entrada e sada de dados em portugus estruturado so: leia(lista de dados) escreva(lista de dados) No Problema 1 deste captulo, era preciso ler 3 notas, ento foi utilizado um comando leia(N1,N2,N3). Este comando espera que o usurio escreva cada uma das notas, separadas por um espao, e tecle <ENTER>. Ou ainda, que o usurio escreva cada nota seguida da tecla <ENTER>. Tambm neste problema, foi utilizado o comando escreva(Digite as 3 notas) para indicar ao usurio que escrevesse as 3 notas. Na lista de dados pode aparecer mais de um tipo de dados. Ainda no Problema 1, a mdia aritmtica M das 3 notas cou valendo 7.53333. O comando escreva(A mdia final vale ,M) ir escrever na tela: A mdia final vale 7.53333 Note que foi misturado um texto com o valor de uma varivel, necessariamente separados por vrgula para correta escrita do comando. Lembrando que as notas valiam N1=7.4, N2=8.2, N3=7.0, era possvel escrever o seguinte comando: escreva(As notas valem ,N1,, ,N2, e ,N3,.) e obteramos a seguinte apresentao na tela: 8

As notas valem 7.4, 8.2 e 7.0. Veja que a vrgula que separa as notas 7.4 e 8.2 foi escrita entre aspas para aparecer na apresentao da tela. Alm disso, as notas 8.2 e 7.0 foram separadas por um e e houve um ponto nal, tambm colocado entre aspas. Os problemas que seguem imediatamente so mais simples que o Problema 1.

Problema 2 - Elaborar um programa que escreva a palavra Ol na tela. O diagrama de blocos deste problema mostrado na Figura 5. Dentro da parte principal do programa aparecem somente os comandos escreva e vai para o final.
incio Ol fim

Figura 5: Diagramas de blocos para escrever o texto Ol na tela. O programa em portugus estruturado correspondente apresentado a seguir. #utiliza padres incio principal escreva(Ol) vai para o final final principal /* /* /* /* /* utiliza os padres conhecidos de funes */ incio do programa propriamente dito */ texto a ser escrito */ comando de encerramento */ fim do programa */

Problema 3 - Elaborar um programa que calcule a mdia dos nmeros 5, 7 e 9, armazene o resultado na varivel M e escreve o resultado na tela. Neste diagrama de blocos (Figura 6), aparece o processamento ou clculo necessrio para colocar na varivel M o resultado da mdia dos nmeros 5, 7 e 9. Ao nal, a varivel M apresentada na tela.
incio M = (5+7+9)/3

M fim

Figura 6: Diagramas de blocos para clculo e apresentao da mdia de 5, 7 e 9. Para resolver este problema necessrio denir uma varivel M que conter o valor da mdia. O tipo desta varivel real, pois temos que admitir que este valor pode ser um nmero no inteiro. No caso, o resultado da mdia 7.0, mas, em geral, a mdia pode assumir qualquer outro valor no inteiro. Todas as variveis utilizadas em um programa devem ser denidas nas primeiras linhas abaixo do comando 9

incio principal. Desta forma, ao longo de toda parte principal, as variveis sero conhecidas pelo computador. Os comandos em portugus estruturado so apresentados a seguir. #utiliza padres /* incio principal /* defina real M /* M=(5+7+9)/3 /* escreva(A mdia de 5, 7 vai para o final /* final principal /* utiliza os padres conhecidos de funes */ incio do programa propriamente dito */ definio da varivel da mdia */ clculo da mdia */ e 9 vale ,M) /* apresentao */ comando de encerramento */ fim do programa */

O programa acima, uma vez executado, ir gerar o resultado da mdia de trs nmeros xos. S possvel variar estes nmeros se o programa for reescrito. O mais prtico seria escrever um programa que lesse 3 nmeros quaisquer informados pelo usurio e ento calculasse a mdia. Cada vez que este novo programa fosse executado, seria possvel mudar os nmeros de interesse. Assim foi feito no Problema 1 deste captulo. Naquele problema, foi necessrio denir as variveis N1, N2, N3 e M, pois os 3 valores deveriam ser variveis lidas e M a varivel para conter o resultado da mdia. No problema a seguir, deniremos 5 variveis para leitura de valores e uma para armazenar o resultado da soma desses nmeros.

Problema 4 - Elaborar um programa que leia 5 nmeros inteiros e armazene o resultado da soma destes em uma varivel. Aps, o programa deve escrever o resultado na tela. O comando para denio das variveis no aparece no diagrama de blocos apresentado na Figura 7, somente na escrita do programa em portugus estruturado. Todas as variveis foram denidas antes de serem utilizadas, o que necessrio quando trabalhamos com a linguagem C (a linguagem C++ admite denio de variveis em outras partes do programa). Alm disso, foi colocado um lembrete ou ordem para o usurio escrever os 5 nmeros. Isto importante para as pessoas que no escreveram o programa e que no sabem o que o ele faz o utilizarem.
incio N1, N2, N3, N4, N5 SOMA = N1+N2+N3+N4+N5

SOMA fim

Figura 7: Diagramas de blocos para leitura de 5 nmeros e escrita da soma desses. Aps a leitura dos 5 nmeros, feito clculo da soma e posto o resultado na varivel SOMA. Ao nal, o resultado escrito na tela, utilizando a varivel SOMA. Os comandos em portugus estruturado aparecem abaixo.

10

#utiliza padres /* utiliza os padres conhecidos de funes */ incio principal /* incio do programa propriamente dito */ defina inteiros N1,N2,N3,N4,N5,SOMA /*definio de variveis*/ escreva(Digite 5 nmeros inteiros.) /*lembrete para usurio*/ leia(N1,N2,N3,N4,N5) /*leitura dos nmeros*/ SOMA=N1+N2+N3+N4+N5 /*clculo da soma*/ escreva(A soma vale ,SOMA) /*apresentao da soma*/ vai para o final /* comando de encerramento */ final principal /* fim do programa */

6.2

Funes e Funes de Retorno

As funes so estruturas especiais usadas para processamento de dados fora da parte principal do programa. Elas so utilizadas para melhor organizao do algoritmo. Como um dos objetivos deste material o preparo para a escrita na linguagem C, as denies das funes devem ser feitas antes da parte principal do programa, tal como feito nesta linguagem. As funes podem ser conjuntos de comandos para serem realizados (Funes), ou podem retornar algum valor quando chamadas (Funes de Retorno). Ser reescrito o Problema 2 (escrever Ol na tela) com utilizao de uma funo e de uma funo de retorno. No sero apresentados os diagrama de blocos neste momento, pois o programa no sofre grande alterao lgica. Problema 2 com utilizao de uma funo para escrever Ol: #utiliza padres abre definio de oi() escreva(Ol) fecha definio incio principal oi() vai para o final final principal /* /* /* /* /* /* /* /* utiliza os padres conhecidos de funes */ definio da funo oi() */ texto a ser escrito */ fim da definio da funo oi() */ incio do programa propriamente dito */ chama e executa a funo oi() */ comando de encerramento */ fim do programa */

A funo oi() foi denida para, quando chamada, escrever Ol na tela. Na parte principal, a funo foi chamada para isto. H primeira vista, no h muita lgica em fazer isto, porque poderamos colocar o comando escreva(Ol) na parte principal, ao invs de chamarmos um funo para fazer isto. Acontece que em algoritmos e programas mais complexos, as funes facilitam muita nossa tarefa de escrever o programa. As funes sempre devem ser escritas seguidas de parnteses. No caso, foi escolhido o nome oi, assim a funo passa a se chamar oi(). Ser reescrito agora o Problema 2 utilizando uma funo de retorno: #utiliza padres abre definio de oir() retorne(Ol) fecha definio incio principal escreva(oir()) vai para o final final principal /* /* /* /* /* /* /* /* utiliza os padres conhecidos de funes */ definio da funo oir() */ texto a ser retornado */ fim da definio da funo oir() */ incio do programa propriamente dito */ escreve o retorno da funo oir() */ comando de encerramento */ fim do programa */ 11

Desta forma, quando o programa chamar na parte principal a funo oir(), receber no lugar de oir() o texto Ol. Esta forma de escrita de programas muito til em programas que exigem clculos mais complexos. Os dois programas reescritos acima com funo e funo de retorno no exigiam que, quando chamadas, as funes tivessem parmetros denidos para serem utilizados dentro das funes. Quer dizer, para chamar as funes, simplesmente foi digitado oi() e oir(). Abaixo aparece reescrito o Problema 1 (da mdia de 3 nmeros digitados pelo usurio) utilizando uma funo de retorno: #utiliza padres abre definio de media(real A, real B, real C) retorna((A+B+C)/3) fecha definio incio principal define reais N1, N2, N3 escreva(Digite as 3 notas) leia(N1,N2,N3) escreva(A mdia final vale ,media(N1,N2,N3)) vai para o final final principal A funo de retorno media() tem 3 parmetros, que so os nmeros reais A, B e C, os quais serviro temporariamente para o clculo da mdia. Na parte principal ainda preciso colocar o comando de leitura dos valores N1, N2 e N3. Quando a funo que ir calcular a mdia for chamada, necessrio colocar estes 3 parmetros, pois anal a mdia calculada entre N1, N2 e N3. Quando chegar a hora do programa executar a linha escreva(A mdia final vale ,media(N1,N2,N3)), o computador escrever na tela A mdia final vale e ao lado o valor retornado na mdia dos nmeros N1, N2 e N3. No se pode utilizar as mesmas variveis (A,B,C e N1,N2,N3) para denio da funo media(). Isto acontece, pois na linguagem C, as variveis de leitura (N1, N2 e N3) no podem ser as mesmas que as variveis temporrias para processamento da funo (A, B e C). Como exemplo nal de funo de retorno, ser passado o Problema 5.

Problema 5 - Elaborar um programa que leia um nmero inteiro e escreva o seu quadrado na tela, utilizando uma funo de retorno. O diagrama de blocos deste algoritmo apresentado na Figura 8. No foram reservados smbolos especcos para a denio da funo de retorno, nem do processamento fora da parte principal. Este programa ir se comportar como se no houvesse uma funo de retorno presente. A utilizao da funo de retorno tem a ver principalmente com a possibilidade de facilitar a escrita do programa, e de separar em grupos distintos os diversos tipos de processamentos. Neste caso, porm, o uxo de dados e de processamento pode ser pensado como sendo o da Figura 8. Foi necessrio utilizar o smbolo de potenciao para calcularmos o quadrado do nmero, N^2. Seria possvel utilizar tambm a forma N*N, mas a notao com o smbolo de potenciao prefervel. A verso em portugus estruturado aparece abaixo.

12

incio N N^2 fim

Figura 8: Diagramas de blocos para leitura de um nmero e escrita do seu quadrado. #utiliza padres abre definio de quadrado(inteiro A) retorna(A^2) fecha definio incio principal define inteiro N escreva(Digite um nmero) leia(N) escreva(O quadrado de ,N, vale ,quadrado(N),.) vai para o final final principal Por exemplo, caso este programa fosse executado e o nmero digitado fosse 7, a linha escreva(O quadrado de ,N, vale ,quadrado(N),.) faria resultar na tela a seguinte frase: O quadrado de 7 vale 49.

6.3

Tomadas de Deciso

As tomadas de deciso so dos itens mais importantes em um programa. So estruturas utilizadas para o programa denir que rumo tomar ou quais os comando executar dependendo de uma condio especicada. O smbolo utilizado nos diagramas de blocos para uma tomada de deciso o losango com a condio especicada dentro (Figura 9). O programa optar para o lado V ou F dependendo da condio.

condio

procedimentos caso a condio seja falsa

procedimentos caso a condio seja verdadeira

Figura 9: Smbolos usados nos diagramas de blocos para tomadas de deciso.

13

Em portugus estruturado escrevemos os comandos se, seno e fim_se conforme segue: se (condio) ento {procedimentos caso a condio seja verdadeira} seno {procedimentos caso a condio seja falsa} fim_se J foi utilizada uma tomada de deciso neste material. Na segunda parte do Problema 1, aps calcular a mdia de 3 nmeros, o programa deveria escrever na tela APROVADO caso a mdia fosse maior ou igual a 6.0, ou REPROVADO em caso contrrio. O smbolo de tomada de deciso sempre envolver um lado V (de Verdadeiro) e F (de Falso) que depende da condio especicada. O Problema 6 utiliza uma tomada de deciso que compara dois nmeros. Problema 6 - Elaborar um programa que leia 2 nmeros e escreva na tela o maior deles. No diagrama de blocos, teremos que comparar diretamente os dois nmeros, conforme apresentado na Figura 10. Caso N1 seja maior que N2 (N1 > N2), o programa escrever N1 na tela. Caso a condio N1 > N2 seja falsa, ou seja, N2 seja maior ou igual que N1, o programa escrever N2 na tela.
incio N1, N2 F V

N1 > N2

N2

N1

fim

Figura 10: Diagramas de blocos para comparao de dois nmero e escrita do maior deles. Mesmo que os dois nmeros sejam iguais, o programa est coerente, pois neste caso a condio N1 > N2 falsa, e o programa escrever N2 na tela. Acontece que, como N1 igual a N2, podemos escrever qualquer um deles na tela. O programa correspondente em portugus estruturado aparece abaixo. #utiliza padres incio principal define reais N1,N2 escreva(Digite 2 nmeros) leia(N1,N2) se (N1>N2) ento {escreva(O nmero maior vale ,N1)} seno {escreva(O nmero maior vale ,N2)} fim_se vai para o final final principal 14

Em problemas mais elaborados, muitas vezes necessrio ou conveniente escrever estruturas de tomadas de deciso dentro de outras. Nestes casos uma deciso pode depender de uma outra que tenha sido tomada anteriormente; o caso do Problema 7.

Problema 7 - Elaborar um programa que leia o preo de um produto e calcula o desconto correspondente, em funo da faixa de preo. Para produtos custando menos que R$ 50, o desconto dever ser de 5%. Para produtos custando de R$ 50 at R$ 200, o desconto dever ser de 10%. J os produtos custando mais que R$ 200, devero ter desconto de 15%. Ao nal, o programa deve escrever o desconto dado e o preo nal com desconto. Uma das formas de resolver este problema, vericar inicialmente se o preo lido menor que R$ 50. Caso seja, o desconto ser de 5%; caso o preo seja maior que R$ 50, teremos que vericar se o preo maior que R$ 200, para ento o programa decidir o desconto. Ento, caso o preo seja maior que R$ 200, o desconto ser de 15%; caso no seja, o desconto ser de 10%. O diagrama de blocos da Figura 11 mostra esta lgica.
incio PRE F V

PRE < 50

PRE > 200

PREF = PRE 0.9

PREF = PRE 0.85

PREF = PRE 0.95

Desconto de 10%. Preo final ,PREF

Desconto de 15%. Preo final ,PREF

Desconto de 5%. Preo final ,PREF

fim

Figura 11: Diagramas de blocos para leitura de preo e clculo do desconto. No diagrama de blocos acima, a varivel PRE ser o preo inicial lido e a varivel PREF ser o preo nal com desconto. Notar que uma forma de calcular 5% de desconto de um determinado valor pode ser feito com o valor sendo multiplicado por 0,95. Isto foi feito acima caso o preo seja menor que R$ 50. Se o preo fosse maior ou igual a R$ 50 (condio PRE < 50 falsa), haveriam ainda duas possibilidades. Se o preo fosse maior que R$ 200, ento o desconto o preo nal pode ser calculado com sendo o preo inicial multiplicado por 0,85 (15% de desconto). Finalmente, a outra possibilidade possvel, seria o preo inicial ser maior ou igual a R$ 50 e menor ou igual a R$ 200 (50 < PRE < 200), ento o preo nal seria dado pelo preo inicial multiplicado por 0,9 (10% de desconto). Na prxima pgina apresentada a verso em portugus estruturado para o Problema 7. Muitas vezes, preciso utilizar uma tomada de deciso em que o programa execute determinados comandos caso a condio seja verdadeira, mas no execute comandos caso a condio seja falsa. O Problema 8 tratar de um exemplo assim.

15

#utiliza padres incio principal define real PRE,PREF escreva(Digite o preo do produto) leia(PRE) se (PRE<50) ento {PREF=PRE*0.95 escreva(Desconto de 5%. Preo final R$ ,PREF)} seno {se (PRE>200) ento {PREF=PRE*0.85 escreva(Desconto de 15%. Preo final R$ ,PREF} seno {PREF=PRE*0.9 escreva(Desconto de 10%. Preo final R$ ,PREF} fim_se} fim_se vai para o final final principal

Problema 8 - Elaborar um programa que leia um caractere. Caso o caractere lido seja x o programa deve escrever na tela Voc teclou x. Caso o caractere lido seja outro qualquer, no deve executar qualquer comando, s acabar a estrutura de tomada de deciso. O diagrama de blocos apresentado na Figura 12 ilustra este algoritmo. A varivel CAR foi utilizada para guardar o caractere lido. Neste algoritmo, o programa s executa comando para o caso da condio ser verdadeira; no h comandos a serem executados caso o caractere lido qualquer outro, que no x. Ento o ramo da deciso falsa ca sendo uma linha contnua at o nal da tomada de deciso.
incio CAR

CAR == x

Voc teclou x

fim

Figura 12: Diagramas de blocos para tomada de deciso sem comandos para o caso falso. Neste programa a estrutura de tomada de deciso se-fim_se cou sem a parte seno, caracterizando uma tomada de deciso que no executa comando caso a condio seja falsa. Outra questo que merece comentrio a condio utilizada. O operado que verica se duas entidades (constantes numricas, textos, caracteres, variveis e dados lgicos) so iguais o operador ==. O smbolo simples de igualdade (=)

16

utilizado como operador de atribuio. Por exemplo, PREF=PRE*0.9 signica colocar dentro da varivel PREF o resultado de PRE*0.9. J a condio PREF==PRE*0.9 pergunta se a varivel PREF igual ao valor de PRE*0.9. O programa correspondente em portugus estruturado aparece a seguir. #utiliza padres incio principal define caractere CAR escreva(Tecle algo.) receba(CAR) se (CAR==x) ento {escreva(Voc teclou x.)} fim_se vai para o final final principal Os demais operadores de comparao utilizados na linguagem C so: Igual Diferente Maior Menor Maior ou igual Menor ou igual == != > < >= <=

Finalmente, tambm preciso comentar sobre a leitura de caracteres. Em geral, as variveis do tipo caractere no so lidas com o comando leia. Este comando espera o usurio digitar o texto e teclar <ENTER>. Porm, as variveis do tipo caractere so formadas por um nico caractere, que pode ser um dgito, uma letra ou um smbolo. Por isso, utilizamos o comando receba, que coloca na varivel CAR o primeiro caractere digitado pelo usurio no teclado. A tecla <ENTER> no precisa ser usada.

6.3.1

Operadores .E., .OU. e .NO.

Freqentemente, preciso utilizar uma tomada de deciso que envolva mais de uma condio ao mesmo tempo. Foi o caso, por exemplo, no Problema 7, quando foi calculado o preo com desconto de produtos em diferentes faixas de preo. Porm, existem formas mais sucintas de se executar um tomada de deciso com mais de uma condio. Pode-se utilizar os operadores .E., .OU. e .NO.. No Problema 9 ser apresentado um exemplo que ilustra o uso destes operadores. Problema 9 - Elaborar um programa que leia um nmero inteiro. Caso o nmero esteja entre 50 e 70, o programa deve escrever O nmero est entre 50 e 70.. Se o nmero estiver fora deste intervalo aberto, o programa deve escrever O nmero est fora do intervalo de 50 a 70.. Para vericar se o nmero est no intervalo acima, necessrio vericar se o nmero maior que 20 e ao mesmo tempo menor que 70. Para isto, utiliza-se o operador .E. na condio da tomada de deciso. O diagrama de blocos da Figura 13 ilustra este procedimento. Para os comandos da parte verdadeira serem executados, necessrio que N seja, ao mesmo tempo, maior que 50 e menor que 70. Caso uma das duas condies seja falsa, o programa ir executar os comandos da parte falsa. Os comandos correspondentes em portugus estruturado aparece abaixo. 17

incio N F V

N > 20 .E. N < 70

O nmero est fora do intervalo de 50 a 70.

O nmero est entre 50 e 70.

fim

Figura 13: Diagramas de blocos para tomada de deciso com operador .E.. #utiliza padres incio principal define inteiro N escreva(Digite um nmero.) leia(N) se ((N>50).E.(N<70)) ento /* condio com operador .E. */ {escreva(O nmero est entre 50 e 70.)} seno {escreva(O nmero est fora do intervalo de 50 e 70.} fim_se vai para o final final principal A condio com o operador deve ser colocada entre parnteses para ser vlida. Neste caso, as duas condies deveriam ser verdadeiras para a tomada de deciso executar o lado verdadeiro. Existem casos, porm, em que possvel o programa executar a lado verdadeiro, se pelo menos uma das condies for verdadeira. quando se utiliza o operador .OU.. O Problema 10 tratar de um exemplo assim.

Problema 10 - Elaborar um programa que leia um caractere F ou M, dependendo do sexo da pessoa que teclar. Caso a pessoa teclar uma destas duas opes, o programa dever escrever Sexo vlido.. Caso a pessoa tecle outra letra, o programa dever escrever Sexo invlido.. Neste problema, existem duas possibilidades de sexo vlido que o usurio pode teclar. Assim, ser utilizado um operador .OU. para indicar que o programa pode escrever Sexo vlido. se qualquer uma das duas opes forem tecladas. A Figura 14 ilustra o diagrama de blocos correspondente. Diferentemente dos operadores .E. e .OU. que servem para relacionar duas ou mais condies o operador .NO. serve para inverter a lgico de uma condio. Quando o operador .NO. adicionado na frente de uma condio, os lados verdadeiro e falso cam invertidos. Por exemplo, a condio (0<1) (zero menor que um?) verdadeira. Porm a condio (.NO.(0<1)) falsa. Pois, apesar de zero ser menor que um, o operador .NO. inverte a lgica. Esse operador pouco utilizado, pois sempre possvel reescrever a condio de forma a no o utilizar. Em geral, seu uso til quando percebe-se algum erro de lgica nas tomadas de deciso, e ao invs de se reescrever a condio, inverte-se sua lgica com um operador .NO.. 18

incio SEXO F V

SEXO==F .OU. SEXO==M

Sexo invlido.

Sexo vlido.

fim

Figura 14: Diagramas de blocos para tomada de deciso com operador .OU.. No programa em portugus estruturado para o Problema 10 aparece abaixo. #utiliza padres incio principal define caractere SEXO escreva(Qual o seu sexo? Tecle F ou M.) receba(SEXO) se ((SEXO==F).OU.(SEXO==M)) ento /* condio com .OU. */ {escreva(Sexo vlido.)} seno {escreva(Sexo invlido.} fim_se vai para o final final principal No Problema 11 apresentado um exemplo em que conveniente o emprego de mais de duas condies nas tomadas de deciso para resoluo.

Problema 11 Elaborar um programa que leia 3 valores (A, B e C) considerados lados de um tringulo. O programa deve indicar caso esses 3 valores no possam formar um tringulo. Caso seja possvel formar um tringulo, o programa deve indicar se os lados formam um tringulo eqiltero, issceles ou escaleno. Existe mais de uma possibilidade para resoluo deste problema A Figura 15 mostra o diagrama de blocos deste problema e abaixo da gura a forma em portugus estruturado. Inicialmente, preciso vericar se um lado qualquer no maior que a soma dos outros dois lados. Ou seja, devemos vericar se, ao mesmo tempo, (A<B+C) e (B<A+C) e (C<A+B). Caso qualquer uma destas condies seja falsa, estes valores no formam um tringulo. Se o teste para formar um tringulo for verdadeiro, ento ser necessrio vericar se os trs lados so iguais, formando um tringulo eqiltero. Caso no seja eqiltero, o tringulo poder ser issceles (dois lados iguais e um diferente) ou escaleno (trs lados diferentes). Uma das formas de vericar se os trs lados so iguais utilizando uma condio com um operador .E., da forma ((A==B).E.(B==C)). No se pode utilizar uma condio do tipo (A==B==C), pois as condies so comparaes feitas sempre entre duas entidades. 19

E, nalmente, caso os lados formem um tringulo, mas que no eqiltero, deve-se vericar se h dois lados que sejam iguais. Desta forma o tringulo ser issceles. Caso contrrio, o tringulo ser escaleno. Para tanto compara-se os 3 lados, dois a dois, da forma ((A==B).OU.(B==C).OU.(A==C)). Assim, quaisquer dois lados iguais, faro esta grande condio ser verdadeira.
incio A, B, C F V

A<B+C .E. B<A+C .E. C<A+B

No formam um tringulo.

A==B .E. B==C

F V A==B .OU. B==C .OU. A==C Formam um tringulo escaleno. Formam um tringulo issceles.

Formam um tringulo eqiltero.

fim

Figura 15: Diagramas de blocos para vericao dos lados de um tringulo.

#utiliza padres incio principal define reais A,B,C escreva(Digite os 3 valores dos lados de um tringulo.) leia(A,B,C) se ((A<B+C).E.(B<A+C).E.(C<A+B)) ento {se ((A==B).E.(B==C)) ento {escreva(Formam um tringulo eqiltero.)} seno {se ((A==B).OU.(B==C).OU.(A==C)) ento {escreva(Formam um tringulo issceles.)} seno {escreva(Formam um tringulo escaleno.)} fim_se} fim_se} seno {escreva(No formam um tringulo.)} fim_se vai para o final final principal 20

preciso ter muito cuidado no momento de escrever o programa em portugus estruturado e, obviamente, na linguagem computacional escolhida. Qualquer smbolo de chaves ou comando fora do lugar no ser entendido pelo compilador, que faz a leitura e nalizao do programa no computador.

6.3.2

Tomada de Deciso com Vrias Possibilidades

Existe ainda uma forma de tomada de deciso que envolve mais de duas possibilidades de resposta na deciso. Para tanto utilizamos o comando caso. Em portugus estruturado escrevemos os comandos com a seguinte forma: caso <varivel> seja <valor 1> ento {operaes 1} seja <valor 2> ento {operaes 2} seja <valor 3> ento {operaes 3} . . . seno {operaes seno} fim_caso Problema 12 - Elaborar um programa que leia a lngua falada pelo usurio e que responda Bom dia nessa lngua. As opes de lnguas devero ser: 1 para portugus, 2 para ingls, 3 para espanhol e 4 para francs. Caso o usurio tecle outra opo, o programa deve escrever Lngua invlida. Este um programa tpico para o uso do comando caso, pois a varivel que guardar a opo selecionada pelo usurio tem 5 possibilidades. Cada possibilidade gera um Bom dia em uma lngua diferente. A Figura ?? mostra o diagrama de blocos deste algoritmo.
incio OPCAO V OPCAO == 1 F V OPCAO == 2 F V OPCAO == 3 F V OPCAO == 4 F Lngua invlida. Bonjour. Buenos das. Good morning. Bom dia.

fim

Figura 16: Diagramas de blocos para responder Bom dia na lngua selecionada pelo usurio. O programa em portugus estruturado aparece abaixo. 21

#utiliza padres incio principal define caractere OPCAO escreva(Selecione a lngua 1 -- Portugus Select the language 2 -- English Seleccione la lengua 3 -- Espaol Choisissez la langue 4 -- Franais) receba(OPCAO) caso OPCAO seja 1 faa {escreva(Bom dia.)} seja 2 faa {escreva(Good morning.)} seja 3 faa {escreva(Buenos das.)} seja 4 faa {escreva(Bonjour.)} seno {escreva(Lngua invlida.)} fim_caso vai para o final final principal O primeiro comando escreva utilizou quatro linhas para mostrar as opes. A varivel OPCAO recebeu a opo teclada pelo usurio. Ento, as opes so testadas no comando caso.

6.4

Laos de Repetio

Os laos de repetio consistem em comandos que repetem blocos de comandos um determinado nmero de vezes. Estas estruturas so muito teis, pois freqentemente preciso que uma grande quantidade de instrues seja re-executada. Existem trs tipos principais de laos de repetio: com teste lgico no incio do lao; com teste lgico no nal do lao; com varivel de controle. 6.4.1 Lao de Repetio com Teste Lgico no Incio

Neste tipo de lao, uma condio testada. Caso o resultado seja verdadeiro, os comandos dentro do lao sero executados, caso seja falsa, o lao no executado e o programa passa para a prxima instruo. Quando os comandos dentro do lao so executados a condio novamente vericada para continuar rodando o lao ou no. Os smbolos utilizados para este tipo de lao de repetio aparecem na Figura 17. Mesmo que um dos smbolos utilizados neste lao seja o losango dos comandos se-seno-fim_se, os comandos em portugus estruturado do lao de repetio correspondentes aparecem abaixo. enquanto (condio) faa {instrues executadas enquanto a condio verdadeira} fim_enquanto

22

condio V

instrues executadas enquanto a condio verdadeira

Figura 17: Smbolos usados nos diagramas de blocos para lao de repetio com teste lgico no incio. Problema 13 - Elaborar um programa que escreva na tela 20 vezes a frase O cu azul. Apesar de ser simples de resolver, este algoritmo enfadonho de escrever na forma em que j conhecemos. Como o comando de escrita seria repetido 20 vezes, conveniente utilizar a estrutura enquanto-fim_enquanto. O diagrama de blocos deste algoritmo aparece na Figura 18. O lao de repetio utiliza uma varivel contadora, no caso chamada de CONT, que vai contando o numero de vezes que o programa executou o lao. O comando CONT=CONT+1 signica que na varivel CONT ser adicionada uma unidade. A condio para o lao continuar que a varivel CONT seja menor ou igual a 20. A varivel CONT comea em 1 por causa do comando CONT=1 executado no incio. Aps, a condio (CONT <= 20) testada. Como verdadeira, os comando dentro do lao sero executados. A ltima instruo dentro do lao que a varivel CONT seja aumentada de uma unidade. Na prxima vez em que a condio (CONT <= 20) for testada, ainda ser verdadeira e os comandos dentro do lao so repetidos.
incio CONT = 1

F CONT <= 20 V O cu azul.

CONT=CONT+1

fim

Figura 18: Diagramas de blocos para repetio de escrita da uma frase. As repeties iro nalizar quando a varivel CONT chegar a 21. Ento, a condio (CONT <= 20) ser falsa e o programa segue para o nal. No problema acima, a varivel de controle CONT no foi utilizada dentro do lao de repetio, exceto pela instruo de acumulao CONT=CONT+1. Pode-se utilizar a varivel de controle em outros comandos dentro do lao, como ilustrado no Problema 13. O programa correspondente ao Problema 12 aparece abaixo em portugus estruturado.

23

#utiliza padres incio principal define inteiro CONT CONT=1 enquanto (CONT<=20) faa {escreva(O cu azul.) CONT=CONT+1} fim_enquanto vai para o final final principal

Problema 14 - Elaborar um programa que escreva na tela os quadrados dos nmeros pares inteiros de 2 at 100. Agora, faz-se necessrio o uso da varivel de controle dentro do lao. Alm disso, ser feito essa varivel aumentar de 2 em 2, comeando no nmero 2, pois assim garantido que o contador s valer nmeros pares. O diagrama de blocos da Figura 19 mostra estes procedimentos.
incio CONT = 2

F CONT<=100 V CONT^2

CONT=CONT+2

fim

Figura 19: Diagramas de blocos para escrita dos quadrados dos pares de 2 a 100. A varivel contadora comea no valor 2, por causa do comando CONT=2. O lao de repetio ser feito at a varivel atingir o valor 100, devido condio CONT<=100. Os quadrados dos nmeros sero escritos usando o contador ao quadrado (CONT^2). A acumulao do valor do contador ser feita de 2 em 2 pela instruo CONT=CONT+2. O programa em portugus estruturado aparece abaixo. #utiliza padres incio principal define inteiro CONT CONT=2 enquanto (CONT<=100) faa {escreva(O quadrado de ,CONT, vale ,CONT^2,.) CONT=CONT+2} fim_enquanto vai para o final final principal 24

O comando de escrita foi incrementado para escrever na tela o quadrado do nmero. Por exemplo, quando CONT for igual a 6, o comando escreva(O quadrado de ,CONT, vale ,CONT^2,.) apresentar na tela O quadrado de 6 vale 36. Mesmo o ponto nal no foi esquecido, adicionado pelo ponto entre aspas no nal do comando escreva.

6.4.2

Lao de Repetio com Teste Lgico no Final

A segunda possibilidade de lao de repetio que ser apresentado aqui aquele com teste lgico no nal. A grande alterao em relao ao teste no incio que o lao (com certeza) realizado pelo menos uma vez, j que a condio s testada no nal do lao. O diagrama de blocos com este tipo de lao apresentado na Figura 20.

instrues executadas enquanto a condio verdadeira

condio F

Figura 20: Smbolos usados nos diagramas de blocos para lao de repetio com teste lgico no nal. Os comandos correspondentes em portugus estruturado so: repita {instrues a serem repetidas} enquanto (condio) Problema 15 - Elaborar um programa que leia dois nmeros inteiros e apresente a soma deles na tela. Ao nal, o programa deve perguntar se o usurio quer executar novamente o programa ou parar. Se a resposta for positiva, o programa deve ser executado novamente. Sero utilizadas as variveis inteiras N1 e N2 para serem os dois nmeros a serem somados. A varivel de resposta do usurio para executar novamente o programa ser RESP, do tipo caractere. Alm disso, este um exemplo tpico de utilizao de lao de repetio com teste lgico no nal, pois a pergunta sobre continuar o programa feita justamente no nal. O diagrama de blocos da Figura ?? mostra este algoritmo. Enquanto o usurio teclar a opo S para na leitura da resposta RESP, o programa ir continuar. Ou seja, o programa ir refazer a leitura de dois nmeros e mostrar a soma destes na tela. Qualquer outra resposta (outro caractere teclado), o programa proceder para o m. Este algoritmo apresentado abaixo em portugus estruturado.

25

incio

N1, N2

N1 + N2

RESP

RESP==S F fim

Figura 21: Diagramas de blocos para programa com teste lgico no nal. #utiliza padres incio principal define inteiros N1,N2 define caractere RESP repita {escreva(Digite dois nmeros inteiros.) leia(N1,N2) escreva(A soma dos dois nmeros vale ,N1+N2,.) escreva(Deseja fazer novamente? Tecle S para continuar.) receba(RESP)} enquanto (RESP==S) vai para o final final principal

6.4.3

Lao de Repetio com Varivel de Controle

Este tipo de lao de repetio possui uma varivel contadora ou controladora de forma inerente. Sempre que so utilizadas variveis de controle, este possivelmente ser o tipo de lao de repetio mais conveniente. Os smbolos utilizados so mostrados na Figura 22. A varivel que utilizamos precisa ser denida com um incio, um m e um passo ou incremento. Por exemplo, se denimos a varivel CONT como CONT:1,15,2 signica que esta varivel valer 1, 3, 5, 7, 9, 11, 13, 15. O incio foi denido como 1 e o m como 15, com incrementos de 2 em 2. Os comandos em portugus estruturado para um lao deste tipo aparecem abaixo. O Problema 15 mostra um exemplo com este tipo de lao. para <varivel> de <incio> at <fim> passo <passo> faa {instrues a serem repetidas} fim_para Problema 16 - Elabore um programa que mostra na tela o resultado das potncias mpares da base 3 dos nmeros de 1 at 11. Ou seja, os resultados de 31 , 33 , 35 , 37 , 39 e 311 . 26

varivel: incio,fim,passo

instrues a serem repetidas

Figura 22: Smbolos usados nos diagramas de blocos para lao de repetio com varivel de controle. A base xa e igual a 3, o que preciso fazer variar o expoente. Esse expoente deve variar de 1 at 11, com incremento de 2 em 2. Assim, ser utilizado um lao de repetio com varivel de controle (Figura 23). Abaixo aparece o programa em portugus estruturado.
incio

CONT: 1,11,2

3^CONT

fim

Figura 23: Diagramas de blocos para programa com varivel de controle.

#utiliza padres incio principal define inteiro CONT para CONT de 1 at 11 passo 2 faa {escreva(3^CONT)} fim_para vai para o final final principal

Problema 17 - Elabore um programa que calcula o fatorial de um nmero inteiro, digitado pelo usurio. O fatorial de um nmero calculado com a multiplicao de todos os nmeros inteiros de 1 at o nmero. O smbolo utilizado para indicar fatorial o ponto de exclamao. Assim, por exemplo, 7! = 1 2 3 4 5 6 7 = 5040. Para este problema, o nmero digitado pelo usurio ser colocado na varivel N. A varivel de controle ser CONT e o valor do fatorial de N ser colocado na varivel FAT. O diagrama de blocos deste programa aparece na Figura 24 Aps o nmero N ser dado pelo usurio, a varivel CONT ir rodar entre os valores de 1 at este nmero N, indo de 1 em 1. Cada novo valor de CONT, ser multiplicado na varivel FAT, que acumula o valor do fatorial. A varivel FAT iniciou com o valor 1. Ento, ela ir acumular as multiplicaes 27

incio

FAT = 1

CONT: 1,N,1

FAT=FATCONT

FAT

fim

Figura 24: Diagramas de blocos para programa para clculo de fatorial. dos demais valores da varivel CONT, at chegar no nmero N. O programa em portugus estruturado aparece abaixo. #utiliza padres incio principal define inteiros CONT,FAT,N FAT=1 escreva(Digite um nmero para calculo do fatorial.) leia(N) para CONT de 1 at N passo 1 faa {FAT=FAT*CONT} fim_para escreva(O valor do fatorial de ,N, vale ,FAT,.) vai para o final final principal

6.4.4

Lao de Repetio Innito e o Comando pare

No raro, necessrio que o programador faa algoritmos que tenham procedimentos que devem ser indenidamente executados at que o usurio indique algum comando para o programa parar ou executar outro procedimento. Os laos innitos podem ser feitos de duas formas: com os comandos enquanto-fim_enquanto e repita-enquanto com uma condio que seja sempre verdadeira, como por exemplo, 0<1 (zero ser sempre menor do que 1); ou com um lao com varivel de controle, onde no especicamos o valor at o qual a varivel deve variar, como por exemplo, CONT:1, ,1. A varivel CONT ir variar de 1 em 1 partindo de 1 at innito, pois o nal do intervalo de repetio no est indicado. Entretanto, preciso que se tenha uma forma de pararmos as repeties innitas, seno s seria possvel parar o programa desligando o computador ou com interrupes bruscas feitas a partir do teclado. 28

Quando o looping innito atingir determinado objetivo, utilizado o comando pare para passarmos para prxima instruo aps o lao. O Problema 18 tratar de um exemplo com lao innito e o comando pare. Problema 18 - Elaborar um programa que leia um nmero e escreva o seu dobro na tela. O programa s deve parar de repetir este procedimento quando o nmero lido for 1. Neste programa ser utilizado um lao de repetio innito para garantir que o procedimento seja repetido indenidamente. A sada deste looping s ser executada quando o nmero lido for 1. Para isto, ser introduzida uma tomada de deciso que ir vericar se o nmero lido igual a 1. Caso seja, ser executado o comando pare, o que far com que o programa saia do lao e v para a prxima instruo abaixo do lao de repetio. Caso o nmero no seja igual a 1 (tomada de deciso falsa), o dobro deste ser mostrado na tela. O diagrama de blocos deste programa apresentado na Figura 25. O programa em portugus estruturado aparece abaio.
incio

CONT: 1, ,1

F N == -1

2N

fim

Figura 25: Diagramas de blocos para programa para clculo do dobro de um nmero.

#utiliza padres incio principal define inteiros CONT,N para CONT de 1 at passo 1 faa {escreva(Digite um nmero para calcular o dobro.) leia(N) se (N==-1) ento {pare} seno {escreva(O dobro de ,N, vale ,2*N,. )} fim_se} fim_para vai para o final final principal 29

Problema 19 - Elaborar um programa que procure pelo primeiro nmero positivo que seja divisvel ao mesmo tempo por 6 e por 9. Quando o programa encontrar tal nmero, deve escrev-lo na tela. Existem diversas formas de resolver este problema, mas a tarefa ser facilitada com o uso do operador resto, cujo smbolo o sinal de porcentagem (%). Por exemplo, (20%4) vale zero, pois o resto da diviso de 20 por 4 zero. Equivalentemente, (31%5) vale 1 (31 = 5 6 + 1); e (31%4) vale 3 (31 = 4 7 + 3). Assim, um nmero N divisvel por um nmero D, quando o resto da diviso N/D for zero, ou seja, quando (N%D)==0. O problema consiste em achar o nmero que tem resto zero em relao a 6 e a 9 ao mesmo tempo. O diagrama de blocos da Figura 26 mostra este procedimento. A verso em portugus estruturado aparece abaixo.
incio

CONT: 1, ,1

(CONT%6)==0 .E. (CONT%9)==0

CONT

fim

Figura 26: Diagramas de blocos para programa para procura de nmero.

#utiliza padres incio principal define inteiro CONT para CONT de 1 at passo 1 faa {se (((CONT%6)==0).E.((CONT%9)==0)) {escreva(O numero procurado vale ,CONT)} pare} fim_se} fim_para vai para o final final principal A tomada de deciso ((CONT%6)==0).E.((CONT%9)==0) que garante que a varivel de controle seja ao mesmo tempo divisvel por 6 e por 9. A resposta para este problema o nmero 18. No seria difcil resolver este problema de cabea. Porm, muitas vezes, uma soluo procurada necessita de um nmero muito grande de interaes para ser encontrado. So os casos em que temos que procurar, por exemplo, por razes de equaes de polinmios com grau maior que 2 ou que envolvem ao mesmo tempo funes trigonomtricas, logartmicas e polinomiais. 30

No trataremos especicamente destes mtodos de resoluo neste material, embora j se tenha as ferramentas algortmicas necessrias para tal. Mtodos numricos sero temas de prximos textos como este.

Problema 20 - Reescrever o Problema 18 com uso de um lao de repetio com varivel de controle, eliminando a varivel de controle. Em muitos programas nos quais so executados laos de repetio innitos, a varivel de controle no utilizada dentro do lao. Foi o que aconteceu no Problema 18 (ver acima). Estes so os casos em que se pode eliminar a varivel de controle deste lao. Assim, um lao de repetio com varivel de controle, porm justamente sem a varivel de controle escrito com o diagrama de blocos da Figura 27.

: ,,

instrues a serem repetidas

Figura 27: Diagramas de blocos para lao de repetio com varivel de controle, porm sem a prpria varivel. Como no se ter varivel, nem ponto inicial, nal ou incremento, este um lao totalmente livre ou innito. Para ele ser interrompido, necessrio um comando do tipo pare. A vantagem que no necessrio denir uma varivel especicamente para o lao, dado que ela no ser utilizada. Assim, o Problema 17 pode ser reescrito como segue na Figura 28 e no programa em portugus estruturado abaixo.

incio

: ,,

F N == -1

2N

fim

Figura 28: Diagramas de blocos para programa para clculo do dobro de um nmero, reescrito sem varivel de controle.

31

#utiliza padres incio principal define inteiro N para de at passo faa {escreva(Digite um nmero para calcular o dobro.) leia(N) se (N==-1) ento {pare} seno {escreva(O dobro de ,N, vale ,2*N,.)} fim_se} fim_para vai para o final final principal

Problema 21 - Problema exposto na Introduo: qual o primeiro nmero de 1 at 1000, que multiplicado por 3 ento subtrado de 2, divisvel por 11? Para este problema, ser utilizado um lao de repetio com varivel de controle indo de 1 at 1000. O teste a ser feito achar o nmero que verique a tomada de deciso com a condio ((3*CONT 2)%11)==0. Ou seja, o nmero que multiplicado por 3 e depois subtrado de 2 (3*CONT2) e que seja divisvel por 11, signica ter resto zero em relao a 11. A Figura 29 mostra este diagrama de blocos.
incio

CONT: 1,1000,1

F ((3*CONT-2)%11)==0

CONT

fim

Figura 29: Diagramas de blocos para programa que procura um determinado nmero.

32

#utiliza padres incio principal define inteiro CONT para CONT de 1 at 1000 passo 1 faa se (((3*CONT-2)%11)==0) ento {escreva(O nmero procurado ,CONT,.) pare} fim_se} fim_para vai para o final final principal

Consideraes Finais

Este material apresentou os fundamentos bsicos de algoritmos de programao. Os tpicos apresentados foram variveis, constantes, operadores matemticos, tomadas de deciso e laos de repetio (at a Verso 2.0). O objetivo com estes tpicos iniciais a familiarizao, por parte dos estudantes, dos comandos e das lgicas iniciais de computao. Como objetivo maior espera-se despertar a curiosidade dos estudantes para que cheguem resoluo de problemas complexos de Engenharia, Fsica e Matemtica.

Referncias
1. Algoritmos (coleo Estudo Dirigido), de J.A.N.G. Manzano e J.F. de Oliveira, Editora tica, 2004, 9a Edio. 2. Curso de Linguagem C UFMG. Disponvel no endereo http://mico.ead.eee.ufmg.br/~cursoc/home.html. (Setembro/2005).

33

Apndice A - Algoritmos Traduzidos para Linguagem C

Seguem as tradues dos algoritmos utilizados para resolver os problemas deste material.

Problema 1 - Ler 3 notas e calcular a mdia aritmtica destas. Aps, o programa escrever na tela se o aluno est APROVADO ou REPROVADO, dependendo se sua mdia foi maior ou igual a 6.0. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { float N1,N2,N3,M; printf("Digite as 3 notas\n"); scanf("%f %f %f",&N1,&N2,&N3); M=(N1+N2+N3)/3; if(M>=6.0) {printf(APROVADO\n);} else {printf(REPROVADO\n);} printf("A media final vale %f\n",M); system("PAUSE"); return 0; }

Problema 1 - Ler 3 notas e calcular a mdia aritmtica destas. Reescrito com a Funo media(). #include <iostream> #include <stdlib.h> #include <stdio.h> float media(float A, float B, float C) { return((A+B+C)/3); } int main() { float N1,N2,N3; printf("Digite as 3 notas\n"); scanf("%f %f %f",&N1,&N2,&N3); printf("A media final vale %f\n",media(N1,N2,N3)); system("PAUSE"); return 0; }

34

Problema 2 - Elaborar um programa que escreva a palavra Ol na tela. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { printf("Ola\n"); system("PAUSE"); return 0; } Problema 2 - Elaborar um programa que escreva a palavra Ol na tela. Reescrito com a Funo oi(). #include <iostream> #include <stdlib.h> #include <stdio.h> int oi() { printf("Ola\n"); } int main() { oi(); system("PAUSE"); return 0; } Problema 2 - Elaborar um programa que escreva a palavra Ol na tela. Reescrito com a Funo de Retorno oir(). #include <iostream> #include <stdlib.h> #include <stdio.h> char *oir() { return("Ola\n"); } int main() { printf(oir()); system("PAUSE"); return 0; }

35

Problema 3 - Elaborar um programa que calcule a mdia dos nmeros 5, 7 e 9, armazene o resultado na varivel M e escreve o resultado na tela. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { float M; M=(5+7+9)/3; printf("A media de 5, 7 e 9 vale %f\n",M); system("PAUSE"); return 0; }

Problema 4 - Elaborar um programa que leia 5 nmeros inteiros e armazene o resultado da soma destes em uma varivel. Aps, o programa deve escrever o resultado na tela. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int N1,N2,N3,N4,N5,SOMA; printf("Digite 5 numeros inteiros.\n"); scanf("%d %d %d %d %d",&N1,&N2,&N3,&N4,&N5); SOMA=N1+N2+N3+N4+N5; printf("A soma vale %d.\n",SOMA); system("PAUSE"); return 0; }

36

Problema 5 - Elaborar um programa que leia um nmero inteiro e escreva o seu quadrado na tela, utilizando uma funo de retorno. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <math.h> int quadrado(int A) { return(pow(A,2)); } int main() { int N; printf("Digite um numero\n"); scanf("%d",&N); printf("O quadrado de %d vale %d.\n",N,quadrado(N)); system("PAUSE"); return 0; }

Problema 6 - Elaborar um programa que leia 2 nmeros e escreva na tela o maior deles. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { float N1,N2; printf("Digite 2 numeros\n"); scanf("%f %f",&N1,&N2); if(N1>N2) {printf("O numero maior vale %f\n",N1);} else {printf("O numero maior vale %f\n",N2);} system("PAUSE"); return 0; }

37

Problema 7 - Elaborar um programa que leia o preo de um produto e calcula o desconto correspondente, em funo da faixa de preo. Para produtos custando menos que R$ 50, o desconto dever ser de 5%. Para produtos custando de R$ 50 at R$ 200, o desconto dever ser de 10%. J os produtos custando mais que R$ 200, devero ter desconto de 15%. Ao nal, o programa deve escrever o desconto dado e o preo nal com desconto. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { float PRE,PREF; printf("Digite o preco scanf("%f",&PRE); if(PRE<50) {PREF=PRE*0.95; printf("Desconto de else {if (PRE>200) {PREF=PRE*0.85; printf("Desconto else {PREF=PRE*0.9; printf("Desconto system("PAUSE"); return 0; }

do produto\n");

5%%.

Preco final R$ %f\n",PREF);}

de 15%%.

Preco final R$ %f\n",PREF);}

de 10%%.

Preco final R$ %f\n",PREF);} }

Problema 8 - Elaborar um programa que leia um caractere. Caso o caractere lido seja x o programa deve escrever na tela Voc teclou x. Caso o caractere lido seja outro qualquer, no deve executar qualquer comando, s acabar a estrutura de tomada de deciso. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main() { char CAR; printf("Tecle algo\n"); CAR=getch(); if(CAR==x) {printf(Voce teclou x.\n);} system("PAUSE"); return 0; }

38

Problema 9 - Elaborar um programa que leia um nmero inteiro. Caso o nmero esteja entre 50 e 70, o programa deve escrever O nmero est entre 50 e 70.. Se o nmero estiver fora deste intervalo aberto, o programa deve escrever O nmero est fora do intervalo de 50 a 70.. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int N; printf("Digite um numero\n"); scanf("%d",&N); if((N>50)&&(N<70)) {printf("O numero esta entre 50 e 70.\n");} else {printf("O numero esta fora do intervalo de 50 e 70.\n");} system("PAUSE"); return 0; }

Problema 10 - Elaborar um programa que leia um caractere F ou M, dependendo do sexo da pessoa que teclar. Caso a pessoa teclar uma destas duas opes, o programa dever escrever Sexo vlido.. Caso a pessoa tecle outra letra, o programa dever escrever Sexo invlido.. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main() { char SEXO; printf("Qual o seu sexo? Tecle F ou M.\n"); SEXO=getch(); if((SEXO==F)||(SEXO==M)) {printf(Sexo valido.\n);} else {printf(Sexo invalido.\n);} system("PAUSE"); return 0; }

39

Problema 11 Elaborar um programa que leia 3 valores (A, B e C) considerados lados de um tringulo. O programa deve indicar caso esses 3 valores no possam formar um tringulo. Caso seja possvel formar um tringulo, o programa deve indicar se os lados formam um tringulo eqiltero, issceles ou escaleno. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { float A,B,C; printf("Digite os 3 valores dos lados de um triangulo.\n"); scanf("%f %f %f",&A,&B,&C); if((A<B+C)&&(B<A+C)&&(C<A+B)) {if((A==B)&&(B==C)) {printf(Formam um triangulo equilatero.\n);} else {if((A==B)||(B==C)||(A==C)) {printf(Formam um triangulo isosceles.\n);} else {printf(Formam um triangulo escaleno.\n);} } } else {printf(Nao formam um triangulo.\n);} system("PAUSE"); return 0; }

40

Problema 12 - Elaborar um programa que leia a lngua falada pelo usurio e que responda Bom dia nessa lngua. As opes de lnguas devero ser: 1 para portugus, 2 para ingls, 3 para espanhol e 4 para francs. Caso o usurio tecle outra opo, o programa deve escrever Lngua invlida. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main() { char OPCAO; printf(Selecione a lingua 1 -- Portugues\n\ Select the language 2 -- English\n\ Seleccione la lengua 3 -- Espanol\n\ Choisissez la langue 4 -- Francais\n); OPCAO=getch(); switch(OPCAO) { case 1: printf("Bom dia.\n"); break; case 2: printf("Good morning.\n"); break; case 3: printf("Buenos dias.\n"); break; case 4: printf("Bonjour.\n"); break; default: printf("Lingua invalida.\n"); } system("PAUSE"); return 0; }

41

Problema 13 - Elaborar um programa que escreva na tela 20 vezes a frase O cu azul. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int CONT; CONT=1; while(CONT<=20) { printf("O ceu e azul.\n"); CONT=CONT+1; } system("PAUSE"); return 0; }

Problema 14 - Elaborar um programa que escreva na tela os quadrados dos nmeros pares inteiros de 2 at 100. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <math.h> int main() { int CONT; CONT=2; while(CONT<=100) { printf("O quadrado de %d vale %.0f.\n",CONT,pow(CONT,2)); CONT=CONT+2; } system("PAUSE"); return 0; }

42

Problema 15 - Elaborar um programa que leia dois nmeros inteiros e apresente a soma deles na tela. Ao nal, o programa deve perguntar se o usurio quer executar novamente o programa ou parar. Se a resposta for positiva, o programa deve ser executado novamente. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main() { int N1,N2; char RESP; do { printf("Digite dois numeros inteiros.\n"); scanf("%d %d",&N1,&N2); printf("A soma dos dois nmeros vale %d.\n",N1+N2); printf("Deseja fazer novamente? Tecle s para continuar.\n"); RESP=getch(); } while(RESP==s); system("PAUSE"); return 0; }

Problema 16 - Elabore um programa que mostra na tela o resultado das potncias mpares da base 3 dos nmeros de 1 at 11. Ou seja, os resultados de 31 , 33 , 35 , 37 , 39 e 311 . #include <iostream> #include <stdlib.h> #include <stdio.h> #include <math.h> int main() { int CONT; for(CONT=1;CONT<=11;CONT+=2) { printf("%0.f.\n",pow(3,CONT)); } system("PAUSE"); return 0; }

43

Problema 17 - Elabore um programa que calcula o fatorial de um nmero inteiro, digitado pelo usurio. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int CONT,FAT,N; FAT=1; printf("Digite um numero para calculo do fatorial.\n"); scanf("%d",&N); for(CONT=1;CONT<=N;CONT++) { FAT=FAT*CONT; } printf("O valor do fatorial de %d vale %d.\n",N,FAT); system("PAUSE"); return 0; }

Problema 18 - Elaborar um programa que leia um nmero e escreva o seu dobro na tela. O programa s deve parar de repetir este procedimento quando o nmero lido for 1. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int CONT,N; for(CONT=1;;CONT++) { printf("Digite um numero para calcular o dobro.\n"); scanf("%d",&N); if(N==-1) {break;} else {printf("O dobro de %d vale %d.\n",N,2*N);} } system("PAUSE"); return 0; }

44

Problema 19 - Elaborar um programa que procure pelo primeiro nmero positivo que seja divisvel ao mesmo tempo por 6 e por 9. Quando o programa encontrar tal nmero, deve escrev-lo na tela. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int CONT; for(CONT=1;;CONT++) { if(((CONT%6)==0)&&((CONT%9)==0)) {printf("O numero procurado vale %d\n",CONT); break;} } system("PAUSE"); return 0; }

Problema 20 - Reescrever o Problema 18 com uso de um lao de repetio com varivel de controle, eliminando a varivel de controle. #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int N; for(;;) { printf("Digite um numero para calcular o dobro.\n"); scanf("%d",&N); if(N==-1) {break;} else {printf("O dobro de %d vale %d.\n",N,2*N);} } system("PAUSE"); return 0; }

45

Problema 21 - Problema exposto na Introduo: qual o primeiro nmero de 1 at 1000, que multiplicado por 3 ento subtrado de 2, divisvel por 11? #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int CONT; for(CONT=1;CONT<=1000;CONT++) { if(((3*CONT-2)%11)==0) {printf("O numero procurado e %d\n",CONT); break;} } system("PAUSE"); return 0; }

46