You are on page 1of 121

Apresentao

Para a maior parte dos alunos que ingressa em algum curso de informtica, em qualquer nvel (ensino tcnico ou superior), uma grande curiosidade ou desejo aprender a programar um computador. Fazer o computador fazer o que se quer. Da vem uma grande questo: qual o caminho a percorrer para atingir esse objetivo? At porque essa no uma tarefa fcil para a maior parte das pessoas. a que esta disciplina de Introduo a Programao entra, porque antes de comear a programar, voc precisa desenvolver a sua lgica de programao, precisa saber construir um algoritmo. Mas o que danado um algoritmo? Um algoritmo um conjunto de passos bem denidos para chegar resoluo de um problema, algo como uma receita, um passo a passo. Como todo programa de computador objetiva resolver um problema, sempre voc vai precisar construir um algoritmo para iniciar a programao. Algumas pessoas consideram uma perda de tempo aprender algoritmos e querem logo passar para uma linguagem de programao diretamente. Porm, aprender algoritmo no uma perda de tempo antes da programao, mas a programao que pode se tornar uma perda de tempo quando no se parou para raciocinar sobre qual algoritmo deve ser aplicado. Pense assim: no se pode construir uma casa, sem os seus alicerces. Ou at voc poderia, mas a casa no caria de p muito tempo. E a, voc gostaria de construir uma casa que pode vir a cair? Alm disso, de uma forma ou de outra, o algoritmo sempre vai existir, mesmo que voc diga que no o escreveu, ele existe! Mesmo que apenas no seu pensamento! Isso porque, para programar, voc sempre vai precisar organizar as ideias, a m de denir os passos que resolvero o problema e vai precisar estabelecer a ordem que esses passos devero ser executados. isso, amigo, construir algoritmos ser uma das principais coisas que voc vai aprender nesta disciplina! Porm, amigos, no vou iludi-los, no um caminho fcil e haver momentos que voc sentir vontade de desistir, momentos que parecer que nada tem lgica! Mas no desista! Voc ver que a prtica, as tentativas e erros vo lhe ajudar a amadurecer e alguns algoritmos que pareciam um GRANDE desao, em algum tempo, vo se tornando mais fceis. Basta ter perseverana, exercitar bastante e colocar a cuca pra funcionar! Lembre-se! Essa disciplina a base para muita coisa que vem pela frente no curso. E o grande diferencial entre quem sempre vai apenas usar o computador e quem vai fazer o computador fazer exatamente o que se quer que ele faa! E a, vamos programar? Sandra de Albuquerque Siebra Professora Conteudista

Introduo a Programao

Captulo 1 Introduo a Algoritmos e Lgica de Programao


A programao a arte de fazer com que o computador faa exatamente o que desejamos que ele faa. Dessa forma, programar criar uma rotina para que, seguindo uma lgica passo a passo, possamos alcanar a resoluo de um problema computacional. A esse passo a passo para resoluo do problema, chamamos de algoritmo. A palavra ALGORITMO pode parecer estranha, mas fazemos uso de algoritmos constantemente na nossa vida cotidiana, nas mais diversas situaes (ex: para acordar, para dirigir, para fazer a barba, para cozinhar, etc). Vamos exemplicar melhor. Olhando para o quadro I, seria ele um algoritmo?

Quadro 1 - Seria este um algoritmo?

Para resolver um problema qualquer necessrio que seja, primeiramente, encontrada uma maneira de descrever este problema de uma forma clara e precisa. Depois, preciso que encontremos uma sequncia de passos que permitam que o problema possa ser resolvido. Justamente a essa sequncia de passos chamamos algoritmo. Logo, como o quadro I descreve os passos para resolver o problema de trocar um pneu furado, ele um algoritmo. Outro exemplo clssico de um algoritmo uma receita de bolo. Se voc seguir a receita direitinho, ao nal, voc vai ter um bolo pronto. Logo, escrever um algoritmo nada mais do que criar uma receita para 5

Introduo a Programao

resolver um problema qualquer (e no nosso caso, essa receita vai ser executada pelo computador). Voc poderia me perguntar: qualquer um pode aprender a construir um algoritmo? E prontamente eu responderia: Claro que pode! Apesar de alguns acharem que um programador nasce com o dom de programar, no bem assim. Ser um bom programador, pegar os macetes da lgica de programao, conseguir construir o algoritmo que vai dar origem ao programa algo que pode ser aprendido e desenvolvido por qualquer um que decida abraar esse estudo com perseverana e interesse. Ah, tambm necessrio praticar. Sem praticar, nunca vai ser fcil construir um algoritmo. Outro fator possuir o desejo de programar computadores, realmente querer programar. Caso contrrio, ser sempre uma perda de tempo. Fazer o que no se gosta, simplesmente por fazer, perda de tempo. Para aprender a construir um algoritmo, uma coisa que atrapalha, que h poucas publicaes especializadas que tratam do assunto de maneira clara e em um nvel que os simples mortais possam entender e estudar. Alm disso, muitas vezes so adotados livros sobre determinada linguagem de programao como livros-texto para aprender a programar. Porm, esses livros, nessa fase inicial, no so muito teis, viro a ser depois. Porque, uma vez que voc aprenda a construir um algoritmo, voc vai passar esse algoritmo para alguma linguagem de programao qualquer com facilidade (tal como C ou Pascal) e a, sim, o algoritmo vai ser executado pelo computador e voc estar comeando a programar! Logo, sabendo construir um algoritmo, voc poder, futuramente, programar em qualquer linguagem, com poucas adaptaes. Bom, vamos agora dar uma denio formal. Podemos dizer que: Algoritmo um conjunto nito de regras que prov uma sequncia de operaes para resolver um tipo de problema especco, em um tempo determinado (KNUTH, 1997). A partir dessa denio, quais caractersticas podemos dizer que um algoritmo tem? Bem, um algoritmo apresenta caractersticas prprias que o distinguem de um simples conjunto de aes, so elas: Um algoritmo sempre termina, ele deve ter um m. Na verdade, cada ao do algoritmo, cada passo, deve ser simples o bastante de forma a ser executada em um intervalo de tempo nito.

Introduo a Programao

As instrues do algoritmo devem estar em uma sequncia lgica, ou seja, deve existir uma ordem de execuo dos passos da sequncia. Cada ao descrita precisamente e sem ambiguidades, ou seja, o algoritmo no pode dar margem dupla interpretao. Um algoritmo sempre produz um ou mais resultados (sadas), podendo no exigir dados de entrada. Parsons (1995) acrescenta a estas caractersticas a obrigatoriedade de um algoritmo sempre solucionar um determinado problema justamente para que tenha uma utilidade. Um ponto importante a destacar que um algoritmo uma soluo e no a soluo de um problema. Isso porque um problema pode ser resolvido de diversas maneiras. Logo, pode ser resolvido usando diversos algoritmos diferentes. Por exemplo, um algoritmo para trocar uma lmpada queimada, pode variar. Para trocar a lmpada um sujeito A pode dizer que precisa subir em uma cadeira para alcanar a lmpada; outro sujeito B pode descrever o mesmo algoritmo, mas agora subindo em uma escada e ainda, um sujeito C pode ser alto o suciente para no algoritmo dele no precisar nem de cadeira, nem de escada para trocar a lmpada. Porm, o problema a resolver (trocar a lmpada) o mesmo e qualquer um dos algoritmos resolver esse problema.

Figura 1 - Formas de trocar uma lmpada

E tudo pode virar um algoritmo? Podemos construir um algoritmo 7

Introduo a Programao

para qualquer coisa? Qualquer tarefa que siga um padro poder ser representada por um algoritmo. Por exemplo, qual o prximo nmero da sequncia numrica: 2, 4, 6, 8, ____? Obviamente, estamos apresentando os nmeros pares. Logo, o valor seguinte o nmero anterior acrescentado de duas unidades, sendo prximo valor da sequncia o nmero 10. E agora, a sequncia 1, 1, 2, 3, 5, 8, 13, ____? Qual o prximo nmero? Se olhar bem, com exceo dos dois primeiros nmeros que so o incio da sequncia, todos os outros so a soma do ltimo nmero escrito e de seu antecessor. Assim sendo, o prximo nmero da sequncia 21 (ou seja, o ltimo nmero 13 + o seu antecessor 8). Como h um padro, seria fcil construir um algoritmo para essas tarefas. Porm, se considerarmos a sequncia 0, 1, 4, 9, 17, 25, ____, qual seria o prximo nmero? Complicado? Como no conseguimos denir uma lgica para o clculo do prximo nmero, ns no conseguiramos construir um algoritmo para essa tarefa, pois no se teria uma frmula para calcular quem vem a seguir. Dessa forma, para podermos construir um algoritmo para um problema, esse problema tem de ter uma lgica. Seno, no ser possvel solucionlo de forma a ser executado por um computador. Vale lembrar que, algumas vezes, pode ser complicado achar a lgica do problema a primeira vista, mas quanto mais voc praticar, mais fcil ser encontrla.

Fases Bsicas da Construo de Algoritmos


Sim, e agora, como fazemos para comear o algoritmo? Para montar um algoritmo, precisamos primeiro dividir o problema apresentado em trs fases fundamentais: ENTRADA, PROCESSAMENTO e SADA. Essa denio vai ajudar voc a encontrar a resoluo do problema. Entrada: So os dados de entrada do algoritmo, os valores que ele vai usar no processamento para chegar soluo do problema. Esses dados de entrada, geralmente, so fornecidos pelo usurio, fazendo uso de algum dispositivo de entrada de dados, tal como, um teclado, um mouse ou um leitor de cdigo de barras (vide Figura 2).

Introduo a Programao

Figura 2 - Dispositivos para Entrada de Dados

Processamento: So os procedimentos utilizados para chegar ao resultado nal, para alcanar a resoluo do problema. Esses procedimentos so executados no processador do computador e os valores parciais so armazenados na memria (memria RAM). Sada: So os dados j processados. o resultado do processamento. Estes dados de sada so apresentados em algum dispositivo de sada. Por exemplo, a tela de um monitor (vide Figura 3).

Figura 3 - Dispositivo de Sada de Dados

Sendo assim, se formos pensar, veremos que muitas coisas que fazemos so um algoritmo e possuem essas trs fases. Por exemplo, quando eu falo com algum, eu espero o que a pessoa vai me dizer (entrada), ento penso (processamento) e dou uma resposta para a pessoa (sada). Sempre car mais fcil comear a organizar a sequncia lgica do algoritmo, se voc identicar no problema essas trs fases.

Introduo a Programao

Figura 4 - Exemplos das trs fases de um algoritmo

Por isso, antes de construir um algoritmo, pare para pensar e identicar: Quais dados so necessrios para comear o algoritmo? Que dados ele vai precisar para executar? ENTRADA Quais so os clculos que precisam ser feitos e quais decises precisam ser tomadas? PROCESSAMENTO Quais dados devem ser exibidos para o usurio? SADA Para ilustrar, suponha um algoritmo para calcular a mdia aritmtica de dois nmeros. Quais seriam as fases desse algoritmo? ENTRADA: os dois nmeros (anal, para calcular a mdia, voc precisa ter os dois valores) PROCESSAMENTO: o clculo da mdia (que seria somar os dois nmeros e dividir por dois) SADA: a mdia (que era o objetivo do problema)

Representao de Algoritmos
Agora que j identicamos as etapas do problema, como representar isso em um algoritmo? Um algoritmo pode ser representado de trs formas: Descrio Narrativa, Fluxograma e Linguagem Algortmica, tambm chamada de Pseudocdigo. A seguir, vamos descrever melhor cada uma dessas representaes. 10

Introduo a Programao

Descrio Narrativa
Faz uso do portugus normal, sem tirar, nem por, com o objetivo de descrever os passos principais da soluo para um problema. Uma receita de bolo, por exemplo, uma descrio narrativa. Outros exemplos so calcular a mdia de um aluno (ver Quadro 2) e tomar banho (ver Quadro 3).
Calcular a mdia de um aluno: Obter as suas 2 notas de provas do aluno Calcular a mdia aritmtica das notas Se a mdia for maior que 6, mostrar na tela uma mensagem dizendo que o aluno foi aprovado, seno mostrar uma mensagem que ele foi reprovado
Quadro 2 - Algoritmo para calcular a mdia de um aluno (Descrio Narrativa)

Tomar banho: Entrar no banheiro e tirar a roupa Abrir a torneira do chuveiro Entrar na gua Ensaboar-se Sair da gua Fechar a torneira Enxugar-se Vestir-se
Quadro 3 - Algoritmo para tomar banho (Descrio Narrativa)

Qual a vantagem? Todos falamos e conhecemos o portugus e sabemos, bem ou mal, fazer uma descrio, uma lista de atividades. E as desvantagens? Bem, primeiro, no h um padro. Cada pessoa pode escrever como quiser (em tpicos, sem tpicos, usando verbos no innitivo ou no, etc). Outra desvantagem a impreciso, 11

Introduo a Programao

uma vez que a especicao pode no car clara ou car ambgua, ou seja, cada um pode interpretar de uma forma. Por exemplo, em algumas receitas de bolo voc pode encontrar a frase leve ao forno at assar. Algumas pessoas poderiam saber exatamente quando o bolo est assado, outras pessoas no. Levando a pergunta e a, quando o bolo estar assado? Por ltimo, h o perigo de se escrever muito para dizer pouca coisa ou da pessoa no saber se expressar bem e ser confusa na escrita.

Fluxograma
Tentando eliminar a ambiguidade e procurando fazer uso de uma ferramenta j usada na rea de administrao (o uxograma), passouse a fazer uso de smbolos grcos padronizados para representar algoritmos. Nessa representao formas geomtricas diferentes implicam em aes, instrues ou comandos distintos. Isso pode ajudar no entendimento do algoritmo e a eliminar a ambiguidade. Esta forma intermediria descrio narrativa e ao pseudocdigo (subitem seguinte), pois mais precisa do que a primeira, porm, no se preocupa com detalhes de implementao do programa, como o tipo das variveis usadas. Os principais smbolos do uxograma so apresentados na Figura 5, ao lado de cada smbolo est a sua utilizao. Alm desses smbolos, as setas que os unem, indicaro a direo do uxo de execuo do algoritmo. E dentro de cada smbolo, deve ser escrito o que ocorrer naquela fase.

Figura 5 - Simbologia do Fluxograma

Vamos ilustrar o uso para que voc possa entender melhor. Suponha um algoritmo para calcular a mdia de um aluno e apresentar ela para o usurio. Como ele caria representado usando uxograma? 12

Introduo a Programao

Comeamos o uxograma usando o smbolo de incio. Depois, dentro do smbolo para entrada de dados, colocamos as duas notas do aluno que foram chamadas de N1 e N2 No smbolo de processamento cou o clculo da mdia do aluno. Dessa forma Mdia recebe (uso do smbolo para indicar a atribuio de um valor) o valor de N1 somado com N2 e dividido por 2. Depois que a mdia calculada, usamos o smbolo de sada de dados para dizer o que queremos que seja apresentado ao usurio Finalmente, o smbolo de Fim usado para indicar que o uxograma acabou.
Figura 6 - Fluxograma para calcular a mdia de um aluno

E, agora, se fosse o mesmo algoritmo descrito no Quadro 2 (Calcular a Mdia de um Aluno), onde se precisa checar se o aluno foi aprovado ou no? Como caria?

Figura 7 - Fluxograma mais completo para calcular a mdia de um aluno

Se prestar ateno toda a primeira parte do algoritmo igual ao uxograma anterior. Porm, a partir desse ponto, precisamos usar o smbolo de deciso. O texto que colocado dentro desse smbolo, o que voc quer questionar. No caso A mdia maior ou igual a 6,0? (expresso como Mdia >= 6,0). A partir da, se a resposta a pergunta for verdadeira (V), no smbolo de sada de dados vemos a palavra 13

Introduo a Programao

aprovado. Seno, se a resposta a pergunta for falso (F), dentro do smbolo de sada de dados colocamos a palavra reprovado. Em qualquer um dos casos, depois de mostrar na tela a mensagem apropriada, o uxograma termina, indicando que o algoritmo termina a. Para isso, usamos o smbolo de Fim. Quais as vantagens do uxograma? Ele uma ferramenta conhecida em outras reas fora a informtica. Alm disso, as guras dizem muito mais que palavras, podem facilitar o entendimento do que deve ser feito no algoritmo. Adicionalmente, o uxograma tem um padro mundial de smbolos bem denidos, logo, poder ser compreendido em qualquer lugar. E as desvantagens? Apesar de mais claro para ler, evitando a ambiguidade, o uxograma d pouca ateno aos dados, no oferecendo recursos para descrevlos ou represent-los. Isso vai fazer diferena na hora de implementar mesmo o algoritmo em uma linguagem de programao. Porque quando estiver programando, voc vai precisar denir o tipo (nmero inteiro, nmero com ponto utuante, caracter, etc) de cada varivel. Alm disso, o uxograma pode se tornar complicado de ler e entender, medida que cresce muito (por exemplo, as linhas podem comear a se cruzar).

Linguagem Algortmica ou Pseudocdigo


Essa linguagem surgiu para tentar suprir as decincias das outras representaes. Consiste na denio de uma pseudolinguagem de programao, cujos comandos so em portugus, mas j lembram um pouco a estrutura de uma linguagem de programao estruturada, ou seja, a pseudolinguagem se assemelha muito ao modo como os programas so escritos. Isso vai permitir que os algoritmos nela representados possam ser traduzidos, quase que diretamente, para uma linguagem de programao. Como essa a forma de representao mais utilizada, ns vamos explic-la, em detalhes, nos prximos captulos (tenha s um pouquinho de pacincia!). Por isso, agora, s para ilustrar, vamos apresentar o mesmo algoritmo de calcular a mdia de um aluno (do Quadro 2) usando a linguagem algortmica. 14

Introduo a Programao

algoritmo calcularMedia var N1, N2, Media : real inicio leia(N1, N2) Media <- (N1 + N2)/2 se media >= 6 entao escreva(aprovado) senao escreva(reprovado) mse malgoritmo

As palavras em negrito so palavras reservadas da linguagem algortmica. Quais as vantagens da linguagem algortmica? Apesar de lembrar uma linguagem de programao, ela usa o portugus como base, e isso pode facilitar para quem est aprendendo. Ela a forma de representao mais poderosa de todas porque nela possvel denir, com riqueza de informaes, quais os dados que sero utilizados, o tipo dos mesmos e at se eles sero agrupados (estruturados) de alguma forma (para formar conjuntos). Alm disso, a passagem do algoritmo em linguagem algortmica para uma linguagem de programao qualquer quase imediata. E, j existem ferramentas para executar um programa escrito em linguagem algortmica (no se preocupe, vamos usar uma!) Quais as desvantagens? Utilizar uma linguagem que no real para trabalho (porque ela uma pseudo linguagem). Outro ponto que a linguagem algortmica no padronizada (podem existir vrias verses da mesma).

Conceitos Bsicos sobre Linguagens


Essa unidade se chama Introduo a Algoritmos e Lgica de Programao. At agora, s falamos de algoritmos, onde entra a lgica de programao? Bem, antes de denir lgica de programao, vamos denir o que lgica.

15

Introduo a Programao

Lgica a cincia que estuda as leis do raciocnio; a correo/validao do pensamento; o encadeamento, ordenao de ideias; a arte de bem pensar.

Por exemplo, usando a lgica, temos que se Rosa me de Ana; Paula lha de Rosa e Jlia lha de Ana. Ento, a partir do que foi dito, podemos dizer que Jlia neta de Rosa e sobrinha de Paula. Outro exemplo, se o guarda-roupa est fechado e a camisa que quero est no guarda-roupa, ento, preciso primeiro abrir o guarda-roupa para poder pegar a camisa. Entendeu como funciona a lgica? Ao nos depararmos com um problema, usamos o conhecimento que j temos para tentar deduzir, produzir uma nova informao. E agora, a lgica de programao, o que ?
Lgica de Programao o encadeamento lgico de instrues para o desenvolvimento de programas.

Pela denio acima, podemos dizer que lgica de programao o que voc utiliza para analisar um problema, denir passos para resolv-lo e implement-lo em uma linguagem de programao. Ou seja, o raciocnio usado para criar um algoritmo para resolver um determinado problema e depois transformar esse algoritmo em um programa. E o que um programa?
Programa a implementao das instrues de um algoritmo em uma linguagem de programao.

Uma instruo representa um passo do algoritmo. uma ao elementar que deve ser executada. Ou seja, uma ao que no pode ser subdividida. Por exemplo, trocar a lmpada no uma instruo, pois uma ao que pode ser subdividida em vrias outras (desligar o interruptor da luz, subir na cadeira, girar a lmpada queimada at solt-la do bocal, colocar a lmpada nova no bocal, etc). J desligar o interruptor da luz uma ao elementar, logo, ela uma instruo do algoritmo para trocar uma lmpada. E a linguagem de programao, o que ?
Ela o conjunto nito de palavras, comandos e instrues escritos com o objetivo de orientar a realizao de uma tarefa pelo computador.

Em computao, uma linguagem de programao a ferramenta de comunicao entre o programador que visa resolver um problema e o computador que ir ajud-lo a resolver este problema. Alguns exemplos de linguagem de programao so C, Pascal, Java, C#, PHP e Phyton. Cada uma dessas linguagens tem suas caractersticas, 16

Introduo a Programao

palavras reservadas, comandos, regras e convenes para conversar com o computador. Porm, h um problema a. Como os computadores vo entender o que escrito em uma linguagem de programao (que uma linguagem de alto nvel), se eles s entendem linguagem de mquina (que uma linguagem de baixo nvel)? Epa, pera... para poder responder a essa pergunta, vamos primeiro esclarecer alguns dos termos usados acima. Logicamente, a linguagem que ns utilizamos em nosso cotidiano diferente da linguagem utilizada pelo computador. O computador trabalha somente com cdigos numricos, baseados nos nmeros 0 e 1 (sistema binrio), que representam impulsos eltricos, ausente (zero) e presente (um). Assim, qualquer linguagem de programao deve estar situada entre dois extremos: o da linguagem natural do homem (muito clara, porm lenta e ambgua) e o da linguagem de mquina (muito rpida, porm complexa para ser utilizada por gente normal). Este o conceito de nvel de linguagem: linguagem de alto nvel so aquelas mais prximas da linguagem humana (d pra entender o que est escrito); linguagem de baixo nvel so aquelas mais semelhantes linguagem de mquina. Para deixar mais claro, vamos detalhar um pouco mais o que essa tal de linguagem de mquina.

Figura 8 - Linguagem de mquina e linguagem de alto nvel

Todas as instrues que o computador precisa executar cam codicadas na sua memria (memria RAM), em uma linguagem prpria que a linguagem de mquina (a nica que ele entende). A linguagem de mquina s apresenta ZEROS e UNS. Um exemplo de instruo seria 1001000101001100011. O resultado da execuo dessa instruo variaria de acordo com o tipo de computador utilizado: um Macintosh far uma coisa, um computador da linha PC far outra, etc. Pois cada computador tem seu conjunto nico de instrues, denido pelo fabricante do chip. Cada instruo identica uma alterao e/ou consulta do valor de uma posio da memria do computador. 17

Introduo a Programao

Como a linguagem de mquina bem complicada e muda de computador para computador, construir um programa diretamente nessa linguagem pode ser muito difcil, tedioso e demorado. Dessa forma, os programas so escritos em linguagens de alto nvel (como C ou Java, por exemplo) e so convertidos (traduzidos) para a linguagem de mquina especca, para que possam ser executados pelo computador. Por exemplo, vamos supor uma soma de dois valores, tendo que o val2 vai receber a soma dele mesmo com o val1. Essa instruo seria facilmente escrita em uma linguagem de alto nvel (val2 <- val1 + val2), porm, em linguagem de mquina, ela daria origem a bem mais instrues (vide Figura 9). Por isso, seria necessrio usar um tradutor para converter a linguagem de alto nvel em linguagem de mquina (mais fcil, n?). Vale ressaltar que um programa em linguagem de alto nvel que foi traduzido para executar em determinado computador precisa ser traduzido novamente (e muitas vezes reescrito), para que possa ser executado em outro computador que no tenha o mesmo conjunto de instrues.

Figura 9 - Exemplo de Traduo

E como feita essa traduo? A traduo feita usando um tradutor (simples, no? ). Agora, explicando melhor... tradutor, no contexto de linguagens de programao, um programa que recebe como entrada um programa em linguagem de alto nvel (chamado programa-fonte) e produz como sada as instrues deste programa traduzidas para linguagem de mquina (chamado programaobjeto). Existem basicamente trs tipos de tradutores: Compilador, Interpretador e Montador. Porm, no contexto desta disciplina, apenas vamos trabalhar com os dois primeiros tipos e, por isso, apenas eles sero explicados a seguir. Compilador: traduz de uma vez s todo o programa escrito em linguagem de alto nvel (cdigo-fonte) para um programa equivalente escrito em linguagem de mquina (cdigo-objeto).

18

Introduo a Programao

Interpretador: traduz (sem gerar cdigo-objeto) e em seguida executa, uma a uma, as instrues de um programa em linguagem de alto nvel (cdigo-fonte). Vamos tentar ilustrar isso... suponha que existe um programa escrito em uma linguagem de alto nvel e que essa linguagem seja a lngua inglesa. Suponha, tambm, que o computador voc e voc s entende o velho e bom portugus (a sua linguagem de mquina, linguagem nativa). Nesse caso, voc ir precisar de um tradutor. Voc poderia usar, ento, um tradutor do tipo compilador ou um tradutor do tipo interpretador. O tradutor do tipo Compilador iria pegar todo o programa escrito em ingls (linguagem de alto nvel) e iria traduzir ele para um outro programa em portugus (linguagem de mquina), para que voc pudesse pegar esse programa traduzido e executar (no caso, ler), vide Figura 10.

Figura 10 - Funcionamento do Compilador

J o tradutor do tipo Interpretador, iria pegar, uma a uma, as palavras do programa escrito em ingls (linguagem de alto nvel) e iria traduzir cada palavra (instruo) para o portugus (linguagem de mquina). E cada palavra traduzida seria imediatamente lida (executada) pelo computador, sem gerar nenhum outro arquivo (cdigo-objeto), vide Figura 11.

Figura 11 - Funcionamento do Interpretador

Algumas informaes interpretadores so:

adicionais

sobre

compiladores

19

Introduo a Programao

O cdigo objeto (programa traduzido para a linguagem de mquina) que produzido por um compilador pode ser executado vrias vezes sem a necessidade de recompilao. Voc s precisa recompilar se o cdigo fonte for alterado. Todo programa interpretado deve reexecutar todo o processo de interpretao independentemente de ter havido ou no modicaes no seu cdigo fonte. Isso se d porque nenhum cdigo-objeto gerado. Por no exigirem mais nenhum processo de converso para linguagem de mquina, um programa que j tenha sido compilado uma vez tende a ser executado mais rapidamente que um programa que precise ser interpretado (que sempre ter que executar o processo de interpretao completo).

Aprenda Praticando Para que possamos comear a desenvolver algoritmos no prximo captulo, importante que voc j consiga especicar as fases de um problema e encaixar essas fases em uma representao de algoritmo das que a gente detalhou at agora (descrio narrativa ou uxograma). Dessa forma, vamos dar um exemplo, para que depois voc possa fazer os exerccios, ok? Vamos analisar o seguinte problema: Ler um valor de temperatura em Fahrenheit e calcular o seu valor correspondente em Celsius e, depois, apresentar esse valor ao usurio. Um problema de fsica! Bem, como voc pode no estar lembrado da frmula, vou lhe adiantar:
TC = 5/9 * (TF 32) onde TC = Temperatura em graus Celsius e TF = Temperatura em graus Fahrenheit

Sabendo disso, quais seriam as fases do problema (entrada, processamento e sada) e como caria a representao desse algoritmo em descrio narrativa e usando uxograma? Se lermos o problema, vamos ver que a primeira coisa que

20

Introduo a Programao

precisamos ler um valor de temperatura em Fahrenheit. Ento ENTRADA = Valor em Fahrenheit. Depois, precisamos usar a frmula indicada para calcular o valor em Celsius. Logo, o PROCESSAMENTO o clculo do valor em Celsius. Por m, o valor calculado em Celsius dever ser impresso. Dessa forma, a SAIDA o valor em Celsius. A partir daqui, usando a simbologia apropriada do uxograma, basta apenas fazer o encaixe dentro do smbolo apropriado de cada uma dessas fases do problema.

Saiba Mais O assunto dessa unidade bsico e qualquer livro de algoritmos ou de lgica de programao ter no primeiro ou nos dois primeiros captulos esse assunto. Sugiro, ento, a leitura do captulo 1 do livrotexto da disciplina: FORBELLONE, Andr Luiz. Lgica de Programao. Makron Books, 3. Edio, 2005.

Atividades Agora que j explicamos um bocado de coisas, que tal voc fazer a sua parte, para ver se xou bem os conceitos? Ento, resolva os exerccios a seguir. 1. Escolha dois exemplos do seu cotidiano que poderiam ser descritos fazendo uso de algoritmos e represente esses exemplos atravs de descrio narrativa e de uxograma.

21

Introduo a Programao

2. Agora, que j praticou com exemplos mais simples, que tal representar atravs de descrio narrativa e uxograma trocar uma lmpada? 3. Vimos que uma parte importante da construo de um algoritmo identicar as fases fundamentais do problema a ser resolvido (entrada, processamento e sada). Sabendo disso, identique as fases de cada um dos problemas abaixo e depois, represente cada um dos problemas usando um uxograma: Calcular e exibir a mdia ponderada de duas notas dadas, de
Lembrete Para calcular uma porcentagem, voc deve multiplicar o valor pelo nmero da porcentagem e dividir por cem. Por exemplo, para calcular 10% de 30 reais, voc multiplica 30 por 10 e depois, divide o resultado por 100. Dessa forma, voc obteria o valor da porcentagem. 10% de 30 reais = (10 x 30)/100 = 300/100 = 3 reais.
1

tal forma que a nota1 tenha peso 6 e a nota2 tenha peso 4. Reajustar1 um salrio inicial em 15% Calcular o desconto de 23% sobre o preo de um produto Checar se um determinado nmero fornecido pelo usurio positivo (maior do que zero) ou negativo (menor do que zero). Imprima como resultado, as palavras positivo ou negativo, conforme o caso. 4. Com suas palavras, quais seriam as diferenas entre um compilador e um interpretador? 5. Qual a diferena entre algoritmo e programa?

Resumo De um modo geral, considera-se que um algoritmo uma descrio, passo a passo, de uma metodologia que conduz resoluo de um problema ou execuo de uma tarefa. Um algoritmo deve ser til (resolver o problema a que se prope), nito (deve ter um m), deve seguir uma sequncia lgica de passos e sempre produzir um ou mais resultados. O algoritmo pode ser representado de trs formas distintas: descrio narrativa, uxograma ou linguagem algortmica. Cada uma dessas representaes tem vantagens e desvantagens. Para desenvolver o algoritmo voc precisa fazer uso da lgica de programao, que o raciocnio necessrio para resolver um dado problema. Depois que o algoritmo est pronto, voc pode passlo para uma linguagem de programao, transformando assim o algoritmo em um programa.

22

Introduo a Programao

O programa para ser entendido pelo computador precisa estar em linguagem de mquina (linguagem de baixo nvel). Logo, para um programa em uma linguagem de programao qualquer (linguagem de alto nvel) ser entendido pelo computador necessrio usar um tradutor. Esse tradutor pode ser um compilador ou um interpretador. Ao nal desse captulo, esperamos que voc saiba: Denir o que um algoritmo e sua utilidade Especicar as fases para construo de um algoritmo Representar por descrio narrativa e uxograma problemas de pequena e mdia complexidade Diferenciar algoritmo e programa Diferenciar linguagem de alto nvel e linguagem de baixo nvel Diferenciar ou comparar um compilador e um interpretador Se voc sabe tudo isso, parabns! Se h algum ponto que ainda no entendeu, por favor, volte a ler o texto com calma e, se possvel, faa a leitura adicional sugerida. Acho que isso vai ajudar bastante! Quando estiver pronto, avance para o prximo captulo. No prximo captulo, iremos detalhar a linguagem algortmica, que uma das representaes mais utilizadas de algoritmos. Vamos l?

23

Introduo a Programao

Captulo 2 Linguagem Algortmica


A linguagem algortmica consiste na denio de uma

pseudolinguagem (tambm chamada de pseudocdigo) de programao para representar algoritmos. Esta pseudolinguagem, apesar de fazer uso de um portugus estruturado (o portugus que conhecemos, porm com regras para formao do algoritmo), se assemelha muito ao modo como os programas so escritos. Por isso, essa representao permite que os algoritmos nela representados possam ser traduzidos, quase que diretamente, para uma linguagem de programao (bom, no?). A linguagem algortmica no tem uma padronizao. Voc vai ver que em cada livro que consultar, poder encontrar a linguagem com alguma modicao no formato. Porm, todos os formatos tm os mesmos tipos de estruturas, apenas escritas de forma um pouco diferente (por exemplo, em um tipo voc pode encontrar a palavra m para marcar o nal do algoritmo e em outro tipo, como ser o nosso caso, a palavra usada ser malgoritmo). Para o nosso estudo, vamos adotar a linguagem algortmica que usada dentro da ferramenta VisuAlg (http://www.apoioinformatica.inf.br/visualg/objetivos.htm), uma vez que, posteriormente, vamos utilizar essa ferramenta para a compilao dos nossos algoritmos. E qual o formato dessa linguagem, anal? O formato geral de um algoritmo em linguagem algortmica est representado no Quadro 4.
algoritmo <nome_do_algoritmo> [<declarao_de_constantes>] [var <declarao_de_variveis>] [<denio de subalgoritmos>] inicio <corpo_do_algoritmo ou seja, as instrues, comandos e clculos> malgoritmo
Quadro 4 - Formato geral de um algoritmo em linguagem algoritmica

Neste quadro, os trechos que esto entre os sinais < > so obrigatrios e os que esto entre colchetes [ ] so opcionais. Agora, 24

Introduo a Programao

vamos explicar, resumidamente, o cdigo do Quadro 4: algoritmo uma palavra que indica o incio da denio de um algoritmo em forma de pseudocdigo. <nome_do_algoritmo> um nome simblico dado ao algoritmo com a nalidade de distingu-los de outros algoritmos que voc possa vir a criar. Esse nome dever vir entre aspas duplas. <declarao_de_constantes> uma parte opcional do

algoritmo e indica a rea onde ser feita a declarao dos valores constantes (que no vo mudar durante a execuo do algoritmo). Mais detalhes, daqui a pouco. var <declarao_de_variveis> uma parte opcional do algoritmo e indica a rea onde ser feita a declarao de variveis (que vamos saber o que daqui a pouco) do algoritmo. Uma vez que essa parte exista no algoritmo, deve-se indicar a rea de declarao com a palavra var e, depois dela, obrigatoriamente, especicar que variveis sero usadas no algoritmo. Pacincia que explicaremos isso em detalhes, mais a frente. <denio de subalgoritmos> consiste de uma rea opcional do algoritmo onde so denidos os subalgoritmos, ou seja, algoritmos que podem ser criados dentro de outros. Isso ser assunto do Captulo 5. Logo, por agora, apenas saiba que esse seria o lugar onde os subalgoritmos, tambm chamados de sub-rotinas entrariam. incio e malgoritmo so respectivamente as palavras que delimitam o incio e o m do conjunto de instrues do corpo do algoritmo, que o lugar onde vai ocorrer todo o processamento (realizao de clculos, leituras de dados, sada de dados, operaes, etc). No Quadro 4, as palavras indicadas em negrito so palavras reservadas da linguagem algortmica. Voc poderia ento perguntar: e o que so palavras reservadas? Palavras Reservadas so palavras que fazem parte da estrutura de uma linguagem (como, por exemplo, a linguagem algortmica). Ou seja, elas tm signicados pr-determinados dentro da linguagem e, por causa disso, no podem ser usadas para outra nalidade diferente daquela que foi especicada na linguagem. Por exemplo, na 25

Introduo a Programao

linguagem algortmica a palavra Algoritmo uma palavra reservada que indica o incio da denio do algoritmo. Dessa forma, voc no pode usar essa palavra em nenhuma outra parte do algoritmo: nem na declarao de variveis, nem como parte das instrues, comandos, clculos ou expresses do corpo do algoritmo. A utilizao indevida de palavras reservadas causam erros no processo de compilao. Apenas para ilustrar, as palavras reservadas da linguagem algortmica que vamos utilizar so: aleatorio algoritmo arquivo asc ate carac caracpnum caractere caso compr copia cronometro debug e eco enquanto entao escolha escreva escreval faca falso malgoritmo menquanto mescolha mfuncao mpara funcao inicio int inteiro interrompa leia limpatela logico maiusc minusc mod nao para passo pausa pos real procedimento repita retorne se senao timer var vetor verdadeiro xou

mprocedimento numpcarac mrepita mse ou outrocaso

Voc no precisa se preocupar em decorar essas palavras! Nem ns vamos explicar todas elas agora. Essas palavras iro aparecendo no decorrer das explicaes dos prximos captulos. s ter pacincia, ok? Ah, uma coisa que ia esquecendo, a linguagem algortmica no faz distino entre letras maisculas e minsculas. Ou seja, a palavra algoritmo seria reconhecida dentro da linguagem da mesma forma que a palavra algoritmo. Porm, h linguagens (como por exemplo, C e Java) onde essas palavras seriam consideradas diferentes.

26

Introduo a Programao

Agora, tambm, apenas para ilustrar, ou seja, voc no precisa se preocupar em entender esse cdigo agora, vamos dar um exemplo do uso da linguagem algortmica para aquele caso que j apresentamos em descrio narrativa e uxograma de calcular a mdia de dois alunos a partir de duas notas dadas. Esse exemplo pode ser visto no Quadro 5.
algoritmo calcularMedia var N1, N2, Media : real inicio leia(N1, N2) Media <- (N1 + N2)/2 se media>=6 entao escreva(aprovado) senao escreva(reprovado) mse malgoritmo
Quadro 5 - Exemplo de uso da linguagem algortmica para calcular a mdia de um aluno

Como armei antes: no se assuste! Mais frente, vamos explicar melhor cada pedacinho desse cdigo. E, logo, logo, ele vai car mais claro para voc.

E a? Por onde comeo?


Antes de destrinchar melhor a linguagem algortmica, h uma questo que muitos alunos costumam me perguntar: quando vou construir um algoritmo, por onde comeo? Bem, vou dar umas dicas que podem ser teis para voc nesse sentido. 1. Primeiro: antes de comear, tente entender o que o problema est pedindo. Como fazer isso? Leia o enunciado do problema com ateno, para tentar entender, em linhas gerais, o que est sendo pedido. Se voc no entender o que o problema quer dizer, fatalmente vai construir o algoritmo errado que, provavelmente, no vai resolver o problema, no vai satisfazer o objetivo. Fazendo um paralelo... Imagine que voc est dirigindo com uma pessoa lhe ensinando o caminho para 27

Introduo a Programao

chegar ao lugar desejado (o objetivo). Se a pessoa dissesse para voc dobrar na prxima rua direita e voc entendesse errado e dobrasse na prxima rua esquerda, com certeza voc no chegaria ao destino desejado, no ? 2. Segundo: leia novamente o problema para identicar as trs fases de resoluo do problema que so: Entrada o que voc identicou que vai precisar que o usurio ou algum lhe informe? (via teclado, leitor de cdigo de barras ou mouse). Ou seja, os valores de trabalho do algoritmo, o que precisa ser perguntado ao usurio. Normalmente, na descrio dos problemas elas aparecem, mais ou menos, assim: Escreva um programa que recebe 2 notas de aluno e calcula a mdia aritmtica delas. Escreva um algoritmo para ler o preo e a quantidade de um produto e calcula o preo a pagar pelo mesmo. Escreva um algoritmo para calcular o salrio lquido de um funcionrio, a partir do nmero de horas trabalhadas e da quantidade de dependentes. Sabe-se que o valor da hora de 12 reais, que se recebe 40 reais por cada dependente e que descontado um total de imposto de 12% do valor do salrio bruto (salrio sem descontos). Voc consegue identicar nos enunciados (descries do problema) acima os valores que devero ser fornecidos na entrada? Leia atentamente. Os valores esto indicados em itlico. Veja que justamente o que voc precisa ter para poder calcular o que o problema est pedindo. No primeiro exemplo, voc precisa das duas notas (entrada) para poder calcular a mdia solicitada. No segundo exemplo, voc precisa do preo e da quantidade para calcular o valor a pagar. E, no ltimo exemplo, voc precisa do nmero de horas trabalhadas e da quantidade de dependentes para poder calcular o salrio do funcionrio. Qualquer dado que precise ser informado pelo usurio (por exemplo, atravs de digitao de valores) considerado um dado de entrada. Processamento que tipo de clculos sero necessrios para resolver o problema? H alguma checagem a ser feita com os dados? Existe alguma deciso a ser tomada dentro do algoritmo? Existem operaes de processamento que precisaro ser realizadas mais de

28

Introduo a Programao

uma vez? Ou seja, o que preciso fazer para que o algoritmo gere as sadas esperadas? Vejamos os mesmos exemplos anteriores. No primeiro exemplo, para calcular a mdia aritmtica, sabemos que o processamento somar as duas notas e dividir por dois: (nota1 + nota2)/2 No segundo exemplo, para calcular o valor a pagar, seria multiplicar o preo do produto, pela quantidade comprada: preo unitrio x quantidade comprada O terceiro exemplo o mais elaborado, pois precisaramos fazer em mais de um passo o clculo. Vamos l! Se voc reler o problema, teramos que: Para calcular o valor do salrio bruto (s os ganhos da pessoa, sem os decontos), teramos de multiplicar as horas trabalhadas pelo valor da hora fornecido (12 reais) e somar com a quantidade de dependentes, multiplicada pelo valor pago por dependente (fornecido como 40 reais). Dessa forma: Salrio bruto = (horas trabalhadas * 12) + (no. Dependentes * 40) Agora, para calcular o salrio lquido, teramos de descontar os impostos do salrio bruto. O problema diz que descontado do salrio bruto, 12% de impostos . Dessa forma, caramos com: Salrio lquido = salrio bruto ((12 * salrio bruto)/100) Um exemplo adicional de processamento seria Leia um nmero qualquer e diga se ele maior ou menor que zero, imprimindo uma mensagem apropriada. Nesse caso, o processamento no seria calcular alguma coisa, mas sim fazer uma checagem (no caso se o nmero maior ou menor que zero). Sada quais os resultados que necessitaro ser apresentados aos usurios? O que deve ser impresso pelo algoritmo na tela/monitor do computador? Geralmente, essa parte vem expressa no enunciado do problema, o que o problema est pedindo. Por exemplo, a sada do primeiro exemplo a mdia aritmtica das notas. A sada do segundo exemplo, o preo a pagar pelo produto e no terceiro exemplo, o salrio lquido do funcionrio. s vezes, na sada, voc pode precisar, tambm, dar alguma mensagem. Por exemplo, naquele caso de checar se o nmero maior ou menor que zero, voc, provavelmente, precisaria escrever na tela O nmero maior do que zero ou o nmero menor do que zero. Isso tambm sada 29

Introduo a Programao

Identificadores
Identicadores so nomes nicos denidos pelos programadores para identicar/distinguir os elementos de um algoritmo, tais como: o nome do algoritmo, as constantes e as variveis (essas duas ltimas, veremos daqui a pouco o que so). Para denir esses nomes nicos, algumas regras devem ser seguidas: O nome do identicador deve sempre comear por uma letra (caractere alfabtico). Ou seja, o primeiro caractere do nome deve ser uma letra. Os outros caracteres, depois do primeiro, podem ser letras ou nmeros. No permitido o uso de espao em branco ou de caracteres especiais, tais como: @, #, &, *, -, +, ?, $, etc. O nico caractere especial permitido o _ (subescrito). Por exemplo, nome_ completo. Maisculas e minsculas so consideradas letras iguais, logo a palavra Nome igual a palavra nome. O nome dos identicadores no deve ter acentuao, nem fazer uso do cedilha (). O nome do identicador no pode ser igual a nenhuma palavra reservada da linguagem algortmica. O nome deve ser signicativo. Ou seja, deve expressar o valor que ele pretende representar. Por exemplo, um identicador chamado X no diz nada. Voc no ter a menor ideia do que valor est guardado nele. Porm um identicador chamado nota1, voc sabe que, provavelmente, o valor guardado nesse identicador o da primeira nota. Voc no pode ter dois identicadores de mesmo nome dentro do algoritmo. Baseados nessas regras, alguns exemplos de identicadores vlidos, corretos, so: salario_minimo, nome, cpf, numeroChassi. Agora, alguns exemplos de identicadores invlidos, incorretos, com o problema apresentado entre parnteses: vm (o nome no signicativo) 13salario (identicador tem de comear por uma letra) 30

Introduo a Programao

salrioR$, %desconto, km/h, (o nome do identicador no poder ter smbolos especiais) horrio, preo (no se deve usar acentuao ou cedilha) valor total (o identicador no pode ter espao em branco) logico, passo, algoritmo (o nome do identicador no pode ser uma palavra reservada)

Constantes, Variveis e Tipos de Dados


Como dissemos na seo anterior, constantes e variveis so tipos de identicadores. Na verdade, elas so os elementos bsicos que um programa manipula, ou seja, so os dados manipulados pelo programa. Vamos explicar isso melhor agora. Constantes Constante um determinado valor xo que no se modica ao longo do tempo, durante a execuo de um programa. Voc deve lembrar da palavra constante da matemtica. Uma das constantes mais famosas daquela rea a chamada (pi). Lembra dela? aquela que vale 3,1415...? A ideia ter um identicador que guarda esse valor constante que no vai ser modicado no decorrer do algoritmo. Seu uso poupa tempo quando se quer alterar um valor a cada execuo do algoritmo (no durante a mesma execuo), porque ao trocar o valor da constante, todas as instrues que manipulam aquele identicador da constante iro, automaticamente, assumir o novo valor (mostraremos isso a voc mais para frente, pode esperar...). A declarao (denio) das constantes do algoritmo deve ser feita na rea de declarao de constantes (vide Quadro 4), logo depois da denio do nome do algoritmo. O formato da declarao o seguinte:
<nome da constante> = <valor>

Por exemplo:
PI <- 3.1416 MAX <- 10 PAIS <- Brasil

Onde <- o operador de atribuio (que falaremos mais frente),

31

Introduo a Programao

mas para adiantar, ele pega o valor do lado direito e armazena no identicador da constante do lado esquerdo. Por exemplo, PI <3.1416, quer dizer que a constante PI vai receber (para armazenar durante a execuo do algoritmo) o valor 3.1416. Falaremos desse armazenamento daqui a pouco. Variveis

Figura 12 - Armrio com gavetas

Na Matemtica, uma varivel a representao simblica dos elementos de um conjunto. J nos algoritmos a varivel vai armazenar um determinado valor de dados. E isso sempre vai ser necessrio, porque todo dado manipulado pelo algoritmo vai precisar estar em uma varivel. De fato, uma varivel corresponde a uma posio de memria (a memria de trabalho do computador, que conhecemos como memria RAM), identicada por um nome (o identicador) e cujo contedo pode variar ao longo da execuo do algoritmo. Fazendo um paralelo como se a memria principal do seu computador fosse um armrio, onde cada gaveta uma varivel onde eu posso armazenar alguma coisa. Mas claro que o que vai ser armazenado depende do tamanho da gaveta, n? E esse tamanho vai ser especicado pelo tipo de dado da varivel. Alm disso, embora uma varivel possa assumir diferentes valores no decorrer do algoritmo, ela s pode armazenar um valor a cada instante. Antes de mostrar a declarao de variveis, precisamos denir os tipos de dados. Vamos l!

Tipos de Dados
Toda varivel possui, alm do nome (o identicador), um tipo, responsvel por denir o espao que essa varivel vai ocupar na memria. As variveis podem ser basicamente de trs tipos: Numricas, literais ou lgicas (vide Figura 13).

32

Introduo a Programao

Figura 13 - Tipos de Variveis

Tipo Numrico especco para armazenamento de nmeros (positivos ou negativos), que posteriormente podero ser utilizados para clculos. O tipo numrico pode ser ainda classicado como Inteiro ou Real. O tipo inteiro serve para armazenamento de nmeros inteiros, ou seja, aqueles que no possuem ponto utuante. Por exemplo, 234, 1, -89 e 27 e o tipo real serve para o armazenamento de nmeros que possuam casas decimais. Por exemplo, 2.14, -9.0, 1200.09 e 0.23. O Tipo Literal ou Caractere especco para armazenamento de uma ou mais letras, nmeros ou smbolos especiais. Porm, os nmeros do tipo Literal no podero ser utilizados para operaes matemticas. Geralmente, os dados literais so representados nos algoritmos pela coleo de caracteres, delimitada em seu incio e trmino com o caractere aspas (). Por exemplo: QUAL ?, , AbCdefGHi, 1-2+3=, Ana Maria e 0. Note que, por exemplo, 2 representa um dado do tipo literal, diferindo de 2 que um dado do tipo inteiro. Com o segundo voc poder fazer clculos matemticos. Mas com o caractere no. Como saber a diferena? O dado do tipo caractere SEMPRE dever aparecer entre . O tipo lgico armazena somente dados lgicos que s possuem dois valores possveis: Verdadeiro ou Falso. Esse tipo usado em expresses lgicas. comum encontrar em outras referncias outros tipos de pares de valores lgicos possveis, tais como sim/ no, 1/0, true/false. Porm, aqui adotaremos apenas verdadeiro (ou simplesmente V) ou falso (ou simplesmente F).

Declarao de Variveis
As fases de Entrada, Processamento e Sada podem manipular vrios tipos de variveis. Para denir que variveis so essas preciso fazer a declarao das mesmas. Em linguagem algortmica as variveis so declaradas na seo de declarao de variveis (identicada pela palavra var), antes do incio do algoritmo propriamente dito. A 33

Introduo a Programao

declarao dever ter o seguinte formato:


var <nomeVar1, variavel(eis)> ..., nomeVarN>: <tipo_dado_da(s)_

Alguns exemplos de declaraes so:


var media, salrio: real (veja que voc pode declarar mais de uma varivel por linha) contador: inteiro achou: logico nome, sexo: caractere

E o que o computador faz a partir dessa declarao? Bem, imagine que a Figura 14 a memria do computador. Cada pedao da memria tem um endereo, para poder ser acessada. Esse endereo conhecido pelo sistema operacional (ex: windows, linux) do computador. Na gura, estamos inventando endereos, para tentar lhe explicar como as coisas funcionam. Por exemplo @#1, @#2 so endereos de memria na nossa gura, porm os endereos de verdade so bem mais complexos que apenas isso, so complicados de serem expressos. Algo como @#$1208DFE ou pior.

Figura 14 - Exemplo de Memria do Computador

Quando declaramos variveis, estamos reservando na memria uma rea para aquela varivel (para guardar o seu valor) e identicando essa rea pelo nome da varivel. O tamanho da rea vai depender do tipo da varivel (se caractere, se inteiro, se real ou lgico). Por exemplo, suponhamos as declaraes:
var nome: caractere idade: inteiro ativo: logico

Figura 15 - Memria do Computador aps a declarao da varivel nome

34

Introduo a Programao

Com essas declaraes o compilador ou interpretador da linguagem, seguindo a ordem que as declaraes foram feitas, pegaria uma rea de memria qualquer (aleatoriamente), onde coubesse algo do tipo caractere, marcaria como ocupada e chamaria essa rea de nome (vide Figura 15). Depois o compilador/interpretador pegaria uma rea (de novo, aleatoriamente, ou seja, no nada sequencial), que coubesse um nmero inteiro, marcaria a rea como ocupada e a chamaria de idade. Da mesma forma, seria reservada uma rea para um valor lgico, marcada como ocupada e essa rea seria chamada de ativo, que poderia servir, por exemplo, para indicar se a pessoa est ativa ou aposentada, em termos de trabalho (vide Figura 16).

Figura 16 - Memria do Computador aps a declarao de todas as variveis.

Agora, se quisssemos colocar um valor dentro de cada varivel, poderamos cham-las pelo nome, que o compilador/interpretador, automaticamente, levaria para o endereo de memria correto. Por exemplo:
nome <- Ana Maria idade <- 27 ativo <- V

Resultaria na modicao na memria do computador, apresentada na Figura 17.

Figura 17 - Memria do Computador aps a atribuio de valores s variveis

Se no tivssemos a noo de varivel, ns teramos de conhecer cada endereo de memria do computador, para poder implementar algum programa. J pensou a complicao? Para exemplicar, a nossa atribuio de valores passaria a algo do tipo: 35

Introduo a Programao

//atribuindo o valor Ana Maria a um endereo de memria @#$1208DFE <- Ana Maria; //atribuindo o valor 27 a um endereo de memria @#$1118DCC = 27;

E com o detalhe que os endereos poderiam mudar de computador para computador, dependendo da marca e da capacidade de armazenamento da memria, do sistema operacional instalado, entre outras coisas. Por isso, usar variveis uma forma de facilitar o acesso para armazenamento e recuperao de valores na memria do computador. Pois agora, ns podemos atribuir valores aos nomes das variveis e a linguagem se encarrega de gerenciar a memria para ns. Lembre-se! Para fazer qualquer algoritmo que precise processar qualquer coisa que seja, voc vai precisar declarar variveis, porque so elas que armazenam os valores para voc.

Operadores e Expresses
Agora que as variveis j esto declaradas, para fazer a parte do PROCESSAMENTO da maior parte dos algoritmos, vamos precisar fazer uso de operadores. Os operadores so os meios usados para incrementar, decrementar, comparar e avaliar dados dentro do computador. J uma expresso faz uso dos operadores e de operandos para construir frmulas que sero usadas na parte do processamento do algoritmo. Operandos so as variveis ou valores usados na expresso. Por exemplo, na expresso 4 + 5, os operandos so os nmeros 4 e 5 e o operador o + (que representa a soma). J os operadores podem ser dos seguintes tipos: operador de atribuio (que a gente at j veio utilizando, antes de explicar pra valer, ele aquela setinha <-), operadores aritmticos, operadores relacionais e operadores lgicos. As expresses podem ser classicadas como expresses aritmticas (quando o clculo retorna um valor numrico, inteiro ou real) ou expresses lgicas (quando o clculo retorna um valor lgico, verdadeiro ou falso). Vamos explicar melhor isso tudo no texto a seguir.

Operador de atribuio
Serve para atribuir um valor a uma varivel ou para copiar o 36

Introduo a Programao

contedo de uma varivel para outra do mesmo tipo. O operador de atribuio representado por (uma seta apontando para a esquerda). Em uma atribuio temos dois elementos fundamentais: o primeiro o elemento para o qual estaremos realizando a atribuio e o segundo elemento o que nos fornece o valor a ser atribudo. O primeiro elemento sempre uma varivel e o segundo uma expresso, outra varivel ou um valor. Alguns exemplos de uso so: Sandra (aqui temos que a varivel Nome recebe o Nome valor Sandra) Idade Casado Salario Soma 18 (a varivel Idade recebe o valor 18) F (a varivel Casado recebe o valor F (falso)) 500.55 (a varivel Salario recebe o valor 500.55) 45 + 10 (a varivel Soma recebe o resultado da soma

de 45 com 10, ou seja, 55) Nome2 Nome (a varivel Nome2 recebe o mesmo valor

que Nome, ou seja, aqui voc est copiando para Nome2 o que estava armazenado em Nome, ou seja, o valor Sandra). Esse tipo de atribuio envolvendo duas variveis s pode ser feito se as duas variveis forem do mesmo tipo (para poderem ter a mesma quantidade de posies reservadas na memria (vide Figura 18).

Figura 18 - Varivel Nome copiada para a Varivel Nome2

O tipo da varivel deve ser respeitado durante uma atribuio, ou seja, a varivel que vai receber o valor da atribuio deve ser compatvel com o valor a ser atribudo.

Operadores aritmticos e expresses aritmticas


Os operadores aritmticos so smbolos que representam operaes matemticas bsicas. Eles esto implementados em, praticamente, todas as linguagens de programao, ainda que possam existir algumas ligeiras variaes de uma linguagem para outra. Esses operadores so classicados em: 37

Introduo a Programao

Binrios: atuam sobre dois operandos, ou seja, precisam de dois valores para poder agir. A multiplicao um operador binrio. Por exemplo, 5 * 4 = 20. Unrios: atuam sobre um nico operando. So os sinais de + e -, quando indicam se o valor positivo (maior que zero) ou negativo (menor que zero). Ex: -10 e +6 Na tabela 1, apresentamos todos os operadores binrios aceitos pela linguagem algortmica. Quanto mais na parte de cima da tabela estiver o operador, maior a sua prioridade quando usado em uma expresso. Porm, sabemos que a prioridade dos operadores pode ser alterada usando parnteses. Por exemplo, as expresses (4 + 5) * 3 e 4 + 5*3 dariam o mesmo valor? No, no dariam. Na primeira expresso, a prioridade de quem est entre parnteses, dessa forma, a soma seria resolvida primeiro e depois a multiplicao, cando com 9 * 3 = 27. J na segunda expresso, como no h parnteses, seria considerada a prioridade dos operadores. Pela tabela 1, a multiplicao tem prioridade sobre a soma. Dessa forma, teramos 4 + 15 = 19.

Tabela 1 - Operadores Aritmticos e suas Prioridades

Uma expresso aritmtica justamente o que usamos acima. fazer uso dos operadores aritmticos para criar uma frmula de clculo. Expresses aritmticas retornam, necessariamente, um valor inteiro ou real. Vejamos outro exemplo: 10+(3+1)/2. Quanto daria essa expresso? Avalie as prioridades... daria 12. Como? Primeiro deveria ser feito o clculo entre parnteses 10 + 4/2. Agora, a prioridade da diviso (consulte a tabela 1), da teramos 10 + 2 = 12. Voltando para a Tabela 1, a maior parte dos operadores voc j conhece. Porm, gostaria de destacar trs deles que voc pode no conhecer. A barra invertida (\) equivale diviso inteira de um nmero. 38

Introduo a Programao

E o que isso? Quer dizer voc realizar a diviso de um nmero por outro e no considerar (desprezar) a parte decimal obtida. o caso do exemplo dado na Tabela 1: 6\4 igual a 1, porque a diviso normal de 6 por 4 daria 1.5. Porm, na diviso inteira, a parte .5 (parte decimal) seria ignorada, dando como resultado apenas o valor inteiro 1. Outro operador a pontenciao (^). S relembrando, se temos X ^ Y, quer dizer que X ser multiplicado por ele mesmo Y vezes. Ex: 2 ^ 3 = 2 x 2 x 2 = 8. Por ltimo, o operador MOD, que tambm pode ser representado por %. Ele representa o resto da diviso inteira. E o que isso? Bem, vamos explicar. Quando voc faz uma conta de diviso, voc tem os elementos especicados na Figura 19. O MOD fornece justamente o valor do resto e no o do quociente, como o caso da diviso normal. Logo, como ilustrado na gura, 6 MOD 2 seria igual a 0 (zero). Porque o resto da diviso de um nmero par por dois, sempre ZERO (ou seja, a diviso exata, no possui resto).

Figura 19 - Elementos da Diviso

Para ver se voc entendeu, quanto seria 7 MOD 3? Seria 1 (um). Veja na Figura 20.

Figura 20 - Demonstrao do clculo de 7 MOD 3

E quanto seria 4 MOD 6? Mais difcil? Realmente, aqui temos uma exceo (vide Figura 21). Toda vez que se vai calcular o MOD, onde o valor do divisor maior que o nmero a ser dividido (dividendo), o resto o prprio dividendo. Isso porque como resto da diviso inteira, no nos interessa esperar pelos outros valores da parte decimal, uma vez que diviso nal daria: 0.666666666.

Figura 21 - Demonstrao do clculo de 4 MOD 6

39

Introduo a Programao

Operadores Relacionais
Operadores relacionais so sinais utilizados para realizar comparaes entre valores, variveis, expresses e constantes. Estes operadores sempre retornam valores lgicos (verdadeiro ou falso). Todos os operadores relacionais tm a mesma prioridade, logo, para estabelecer prioridades no que diz respeito a qual operao executar primeiro, voc deve utilizar parnteses. Um detalhe que as comparaes realizadas s podem ser feitas entre dados do mesmo tipo. Por exemplo, voc no pode comparar um inteiro e um caractere. Mas pode comparar dois nmeros inteiros. Os operadores relacionais podem ser vistos na Tabela 2. Na tabela dado um exemplo de uso de cada operador e que valor ele retornaria com a comparao (ou seja, se o valor V verdadeiro ou F falso).

Tabela 2 - Operadores Relacionais

Para ilustrar melhor, vamos tambm dar exemplos das outras comparaes que podem ser realizadas. Considere que x tem valor 2, y tem valor 5, w tem valor 4 e j tem valor 3. varivel e constante. Ex: x = 3 (o que retornaria um Falso, porque x = 2) varivel e varivel. Ex: x <> y (o que retornaria o valor Verdadeiro) varivel e expresso. Ex: j = (w - 1) (o que retonaria o valor Verdadeiro) expresso e expresso. Ex: (x + 1) > (y + 4) (o que retornaria o valor Falso) Os operadores relacionais so usados para criar expresses lgicas, que sero explicadas na subseo a seguir.

40

Introduo a Programao

Operadores lgicos e expresses lgicas Os operadores lgicos so tambm conhecidos como operadores booleanos, porque derivam da lgebra de lgica matemtica desenvolvida por George Boole. A principal funo destes operadores construir expresses, chamadas de expresses lgicas, que so aquelas que resultam em valores lgicos verdadeiro/falso. Em termos prticos, eles vo conectar condies a serem testadas durante a execuo do algoritmo. Em outras palavras, esses operadores servem para realizar operaes sobre valores lgicos (verdadeiro/falso). Os operadores lgicos podem ser vistos na Tabela 3 e sero explicados a seguir.

Tabela 3 - Operadores Lgicos

NO (negao) o operador mais simples e de maior prioridade. Ele um operador unrio (opera sobre apenas uma varivel) e serve para inverter o valor da expresso ou condio. Por exemplo, se a expresso for verdadeira, ele inverte para falsa e vice-versa. Exemplo: No (4 < 3) avaliada como verdadeira, porque a expresso (4 < 3) falsa e no falso igual a verdadeiro. E (conjuno) - o prximo operador na ordem de precedncia. Ele retorna Verdadeiro como resultado se (e somente se) ambos os operandos forem avaliados como Verdadeiros. Se qualquer um dos operandos for avaliado como Falso, ele retorna Falso. Esse operador corresponde ao E usado em portugus, como na frase S poder se inscrever no concurso quem for maior de 18 anos E tiver conhecimentos bsicos de informtica . Ou seja, se uma das condies no for verdadeira, o candidato no poder se inscrever. Esse o mesmo caso do operador lgico E. Se uma das condies for falsa, o resultado falso. Vamos dar uma olhada nas combinaes possveis na Tabela 4. Exemplo: a expresso (3<4) E ((8+2) = 11) resultaria em falso. Porque a primeira expresso verdadeira, mas a segunda falsa. E, pela Tabela 4, voc pode ver que verdadeiro E falso = falso.

41

Introduo a Programao

Tabela 4 Uso do Operador E

OU (disjuno) o operador OU retorna o resultado Verdadeiro se qualquer um dos dois operandos for avaliado como Verdadeiro. Novamente, o signicado similar ao uso da palavra OU em portugus, como, por exemplo, Eu irei ao mercado se acabar o arroz ou o feijo. Ou seja, se uma das condies for verdadeira, o resultado j ser verdadeiro. As combinaes possveis do operador OU podem ser vistas na Tabela 5.

Tabela 5 Uso do Operador OU

Exemplo: peguemos a mesma expresso usada antes, trocando o E por OU e vejamos: (3<4) OU ((8+2) = 11) resultaria em verdadeiro. Porque a primeira expresso verdadeira e a segunda falsa. E, pela Tabela 5, voc pode ver que verdadeiro OU falso = verdadeiro. Observaes nais sobre operadores Os operadores podem ser combinados para formar expresses. A prioridade entre eles pode ser vista na Tabela 6. Operadores com a mesma prioridade devem ser executados da esquerda para direita. Para alterar a ordem de prioridade, voc deve utilizar parnteses.

Tabela 6 Prioridade entre os operadores

Exemplos: Qual seria o resultado de No (3+4 > 10) E (10<> 8-2)? Seria verdadeiro. Porque o primeiro termo da expresso, entre parnteses resulta em falso, mas como existe a negao na frente 42

Introduo a Programao

dele, ele se tornaria verdadeiro. O segundo termo da expresso verdadeiro. Ento, verdadeiro E verdadeiro resultam em verdadeiro.

Instrues de Entrada e Sada


Para poder implementar no algoritmo as fases de ENTRADA e SADA, fatalmente voc vai precisar ter instrues especcas para essas partes. Isso porque na fase de ENTRADA um algoritmo pode receber dados atravs de dispositivos como teclado, mouse, um leitor de cdigo de barras, etc. E na fase de SADA, o algoritmo pode enviar dados para o monitor de vdeo ou para a impressora, entre outros. Estes tipos de operaes em que dados so recebidos por um algoritmo ou so enviados por um algoritmo para um dispositivo so chamados de operaes de entrada e sada. Elas so instrues bsicas que efetuam tarefas essenciais para o recebimento e apresentao de dados. Vamos explicar melhor cada uma. A instruo de entrada de dados permite que informaes que os usurios fornecem atravs dos dispositivos de entrada sejam transferidas para a memria do computador e armazenadas em variveis (tal como uma atribuio, pegando o que lido pelo dispositivo de entrada e guardando na varivel). O formato do comando de entrada o seguinte: Leia (nomeVariavel) onde nomeVariavel o nome da Varivel onde o valor lido ser armazenado na memria do computador. Ex: Leia (nome). Voc tambm pode ler mais de uma varivel por comando: Leia (nomeVar1, ..., nomeVarN), porm, no aconselhamos essa prtica, porque o algoritmo ca mais difcil de ser entendido (menos legvel). Ex: Leia (nome, sexo).

Importante Quando uma varivel declarada, esta apenas reserva uma posio na memria RAM (memria de trabalho) do computador. Ou seja, o contedo dessa posio vazio. Assim, a cada varivel criada deve-se ler ou atribuir um valor a ela. Diferente do operador , que s atribui valores pr-denidos a uma varivel, a instruo LEIA permite qualquer entrada de dados vlida, fornecida pelo usurio, atravs de algum dispositivo de entrada. 43

Introduo a Programao

A instruo de sada de dados o meio pelo qual o resultado da fase de PROCESSAMENTO do algoritmo ser exibido pelos dispositivos de sada de um computador (ex: vdeo e impressora), para que o usurio possa ver. Para simplicar, chamaremos a ativao do comando de sada de impresso (mesmo, nem sempre, ele enviando o resultado para a impressora). H vrios formatos possveis para o comando de sada: 1. Apenas impresso de varivel ou variveis: Escreva (nome Var1) onde nomeVar1 o nome da varivel onde est o valor que voc quer imprimir. Ex: Escreva (salario) iria imprimir o valor armazenado na varivel salrio, como por exemplo 2000. Voc tambm pode imprimir mais de uma varivel no mesmo comando de sada: Escreva (nomeVar1, ..., nomevarN). Por exemplo: Escreva (nome, endereco, cidade). 2. Apenas impresso de texto: Escreva (texto a ser mostrado ao usurio). Por exemplo, Escreva (Aula de Introduo a Programao). Da, apareceria na tela o texto especicado entre aspas. 3. Impresso de texto e variveis: Escreva (textoA, nomeVar, textoB, nomeVar1, ..., nomeVarN), ou seja, intercalado no comando a escrita de texto e a impresso de valores de uma ou mais variveis. Por exemplo: Escreva (Nome= , nome, Telefone = ,telefone). Na tela do computador, o que apareceria seria algo do tipo: Nome= Ana Maria Telefone=32221090

Importante Usa-se , (vrgula) para separar o valor de uma varivel com um texto explicativo. Veja que o nome da varivel ca sem aspas, porque voc quer pegar o valor que est gravado dentro da posio de memria com aquele nome. Ou seja, no caso de uma lista de variveis, o contedo de cada uma delas pesquisado na memria e enviado para o dispositivo de sada. E no caso do texto que est entre aspas, o que vai ser impresso exatamente o que estiver escrito entre as aspas. Por exemplo:
media 15/2

escreva (A Mdia do Aluno : , media) O valor impresso na tela seria: A Mdia do aluno : 7.5

44

Introduo a Programao

Vamos ver agora como esses comandos entrariam em um algoritmo? Suponha que voc quer construir um algoritmo para ler o preo unitrio e a quantidade de um produto e quer imprimir o preo nal a ser pago pelo cliente. Como caria?
Algoritmo Exemplo var precoUnit, precoTot: real qtd: inteiro inicio Leia(precoUnit) Leia (qtd) precoTot <- precoUnit * qtd Escreva(precoTot) malgoritmo.

Importante H duas regras bsicas para melhorar nossos algoritmos: 1) Antes de toda operao de leitura deve ser impressa uma mensagem informando ao usurio que dados ele deve fornecer para o programa. 2) Todo resultado enviado ao usurio deve ser precedido de uma mensagem explicativa sobre que valor est sendo mostrado. Assim sendo, vamos aplicar essas regras no algoritmo que apresentamos anteriormente.
Algoritmo Exemplo var precoUnit, precoTot: real qtd: inteiro inicio Escreva(Informe o preo unitrio e a quantidade) Leia(precoUnit) Leia (qtd) precoTot <- precoUnit * qtd Escreva(O valor a ser pago ser: , precoTot) malgoritmo.

Veja que agora o algoritmo est mais claro e as informaes sero melhor apresentadas ao usurio. 45

Introduo a Programao

Sintaxe e Semntica
A denio de qualquer linguagem comporta dois aspectos: a forma da linguagem e o signicado associado a essa forma. A estes aspectos damos respectivamente o nome de sintaxe e semntica da linguagem. Vamos detalh-los. A sintaxe dita as regras de como os comandos de uma linguagem e cada um dos seus termos deve ser construdo corretamente. Ou seja, se o comando est correto ou no. Formalizando, sintaxe um conjunto de regras formais que especicam a composio dos algoritmos a partir de letras, dgitos e outros smbolos. Por exemplo, o comando de entrada de dados, a sintaxe dele, ou seja, a sua forma correta : leia (nomeVariavel). Se voc escrever ler(nomeVarivel) a sintaxe vai estar incorreta, ou seja, a escrita do comando vai estar errada. A violao da sintaxe de uma instruo impede que ela seja executada. Ou seja, vai causar erro no algoritmo. Por exemplo, os comandos abaixo apresentariam problema de sintaxe: mediaNotas Ana Maria (toda mdia, geralmente,

um valor do tipo real e no poderia receber um valor do tipo caractere) nota >= 7 (todo valor entre aspas do tipo caractere. E um caractere no poderia ser comparado com um valor do tipo inteiro (como o caso do 7), uma vez que s se podem comparar valores do mesmo tipo). A semntica diz respeito ao signicado lgico das instrues que sero executadas pelo computador. Ou seja, se os comandos fazem sentido. Porque um comando (ou sequncia deles) pode estar escrito corretamente, mas no fazer nenhum sentido na prtica. Formalmente, semntica o conjunto de regras que especica o signicado de qualquer programa ou algoritmo, sintaticamente vlido. A checagem da semntica de um algoritmo mais difcil que a checagem da sintaxe, porque ela depende do conhecimento do problema que est sendo resolvido e do contexto do mesmo. E, tambm, porque a violao da semntica no impede que o algoritmo seja executado. Todavia, ele processar e mostrar ao usurio um resultado errado. Em resumo, temos que a sintaxe dita as regras de como as frases de um a linguagem e cada um dos seus termos deve ser construdos corretamente. J a semntica se preocupa com o signicado das

46

Introduo a Programao

frases construdas. Podemos construir frases sintaticamente corretas, mas com problema de semntica. Vamos dar um exemplo fora da rea de computao para facilitar o seu entendimento. A frase O gato comeu o rato est, em termos da lngua portuguesa, sintaticamente e semanticamente correta. Porque em termos de sintaxe, a frase tem sujeito, verbo e predicado e o verbo est corretamente conjugado. Semanticamente a frase tambm est correta, porque na vida real um gato pode mesmo comer um rato. Porm, se a frase fosse O rato comeu o gato, teramos um problema. A frase continua sintaticamente correta. Porm, a semntica apresenta problemas, porque, na vida real, geralmente, um rato no come um gato. Agora, vamos dar um exemplo relacionado com programao, fazendo uso de uma estrutura que veremos na seo que explica as estruturas condicionais (pgina 49). Suponha o trecho de cdigo:
Se (media >= 7.0) entao Escreva (REPROVADO) Senao Escreva (APROVADO) mse

Voc vai ver que, sintaticamente, a estrutura Se-Ento-Seno est correta, mas o bloco de instrues est semanticamente errado. Na vida real sabemos que o aluno est APROVADO se obtm media maior ou igual a sete. E no reprovado como mostra o algoritmo. Os erros sintticos so identicados pelos tradutores (compiladores e interpretadores), enquanto que os erros semnticos no o so. Por isso, os erros semnticos exigem mais ateno para corrigilos. Agora que j sabemos o que sintaxe e semntica e j vimos todos os conceitos mais bsicos relacionados a algoritmos (variveis, constantes, tipos de dados, operadores e expresses e comandos de entrada e sada), podemos partir para construir as estruturas de controle de um algoritmo. Existem 3 estruturas bsicas de controle nas quais se baseiam os algoritmos: Sequencial: conjunto de comandos separados que so executados em uma sequncia linear de cima para baixo. Seleo, Condicional ou de Deciso: a partir de um teste condicional, uma instruo, ou um conjunto de instrues, podem ser executados ou no, dependendo exatamente do resultado do teste efetuado. 47

Introduo a Programao

Repetio: uma instruo ou o conjunto de instrues que ser executado repetidamente, de acordo com o resultado de um teste condicional ou de uma contagem. Detalharemos cada uma delas na subsees a seguir.

Estrutura Sequencial
Na estrutura sequencial os comandos de um algoritmo so executados numa sequncia pr-estabelecida. Cada comando executado somente aps o trmino do comando anterior. Os comandos devero ser executados numa sequncia linear, seguindo-se o texto em que esto escritos, de cima para baixo, se no houver indicao em contrrio (vide Figura 22).

Figura 22 - Estrutura Sequencial

Nesta estrutura da Figura 22, o comando-3 somente ser executado aps o comando-2 e o comando-2 aps o comando-1 e assim por diante. Uma estrutura de sequencial delimitada pelas palavras-reservadas inicio e malgoritmo e contm basicamente comandos de atribuio, de entrada e de sada. Em termos de uxogramas, a estrutura sequencial caracterizada por um nico uxo de execuo (um nico caminho orientado) no diagrama. Vamos ver um exemplo de algoritmo sequencial. Suponha um algoritmo para somar dois nmeros e mostrar o resultado ao usurio.
Algoritmo Sequencial var num1, num2, soma: inteiro inicio Escreva(Informe o primeiro nmero) Leia(num1) Escreva(Informe o segundo nmero)

48

Introduo a Programao

Leia(num2) soma <- num1 + num2 Escreva(A soma dos valores : , soma) malgoritmo.

O algoritmo proposto respeita as regras de organizao e sintaxe da linguagem algortmica. Porm, qual a primeira instruo a ser executada? Ele ser executado de maneira sequencial, onde, a partir da palavra reservada var, as instrues vo sendo executadas de cima para baixo e a prxima instruo s executada aps a anterior ser encerrada. importante observar que sempre ser executado primeiro o bloco de declaraes (para poder criar as variveis na memria do computador, como explicado antes) e depois, na sequncia, o bloco de instrues. A execuo da palavra reservada malgoritmo encerra a execuo do algoritmo.

Estrutura Condicional
Estrutura tambm conhecida como de deciso ou de seleo, caracteriza-se pela execuo de um bloco de instrues dependendo da veracidade de uma condio (representada por expresses com operadores relacionais e lgicos). Ou seja, a execuo de um ou mais comandos depender de se uma condio satisfeita ( verdadeira) ou no. A estrutura de deciso deve ser sempre usada quando h a necessidade de testar alguma condio e em funo da mesma tomar uma atitude. Essa estrutura muito utilizada, at porque no nosso dia a dia, estamos sempre tomando decises, vejamos um exemplo: Se estiver chovendo ento tenho de fechar as janelas Caso contrrio (seno) as janelas podem car abertas A estrutura se subdivide em outras trs formas: Condicional Simples, Condicional Composta e Condicional Mltipla. Vamos analisar cada uma delas. Estrutura condicional simples Na estrutura condicional simples, uma nica expresso lgica avaliada, para decidir se o bloco de instrues ser executado ou no. Em descrio narrativa, seria algo do gnero: Se zer sol ento eu irei praia. A representao dessa condio em um uxograma, seria algo como na Figura 23. Nesta mesma gura, o exemplo de 49

Introduo a Programao

uso do uxograma mostra que se o Tempo for igual a sol, a condio verdadeira (V) e o comando vou praia ser executado. Se a condio no for verdadeira, o comando no ser executado.

Figura 23 - Modelo Fluxograma e Exemplo para Estrutura Condicional Simples

Em linguagem algortmica, a sintaxe para esse tipo de estrutura :


se <condio> entao <comando-1> <comando-2> ... <comando-N> mse

Exemplo:
se (idade < 18) entao escreva (Esta pessoa menor de idade) mse

Onde, se a <condio> for verdadeira ser executado os comandos dentro do bloco, que pode ser apenas um ou vrios comandos (<comando-1>...<comando-2>). Como mencionado anteriormente a <condio> uma expresso lgica. No caso do exemplo, a frase s ser apresentada ao usurio, se a idade for menor que 18. Estrutura condicional composta Na estrutura condicional composta, a condio ir determinar qual comando ou bloco de comandos ser executado dentre dois listados. Na estrutura simples temos se.....entao, nesta caso teremos se..... 50

Introduo a Programao

entao.....senao. Dessa forma, alm de executar se a condio for Verdadeira (V), a deciso composta tambm vai executar algo se a condio for Falsa (F). Ou seja, a seleo composta sempre executar um bloco condicional, pois se o resultado do teste condicional for verdadeiro um conjunto de instrues ou somente uma instruo ser executada e se o resultado no for verdadeiro (for falso) uma outra instruo ou conjunto delas ser executada tambm. Agora, ser um caminho ou outro, nunca os dois blocos de instrues sero executados. Em descrio narrativa seria algo do gnero: Se zer sol ento eu irei praia seno eu irei ao shopping. A representao dessa condio em um uxograma, seria algo como na Figura 24.

Figura 24 - Modelo Fluxograma e Exemplo para Estrutura Condicional Composta

Nesta mesma Figura 24, o exemplo de uso do uxograma mostra que se o Tempo for igual a sol, a condio verdadeira (V) e o comando vou praia ser executado. Seno, se a condio no for verdadeira (for falsa), o comando vou ao shopping ser executado. Em linguagem algortmica, a sintaxe para esse tipo de estrutura :
se <condio> entao <comando-A1> <comando-A2> ... <comando-AN> senao <comando-B1> <comando-B2> ... <comando-BN> mse

51

Introduo a Programao

Exemplo:
Se (media >= 7.0) entao escreva (Aluno Aprovado!) senao escreva (Aluno Reprovado!) mse

Onde, se a <condio> for verdadeira ser executado os comandos dentro do bloco SE, que pode ser apenas um ou vrios comandos (<comando-1>...<comando-2>). J se a condio for falsa, sero executados os comandos ou bloco de comandos do SENAO. No caso do exemplo, a frase Aluno Aprovado! s apareceria se a mdia fosse maior ou igual a 7. Seno apareceria frase Aluno Reprovado!. Estrutura condicional composta aninhada A instruo condicional (SE) pode ser encadeada uma dentro da outra, seja no bloco verdadeiro (ento) ou falso (seno). O encadeamento destas instrues tambm chamado de aninhamento de instrues de seleo ou de deciso. No existe um limite de quantos testes condicionais podem estar dentro um do outro, tudo vai depender do problema a ser resolvido. S para dar um exemplo de aninhamento, temos:
se <condio_1> entao <bloco de comandos 1> senao se (<condio_2>) entao <bloco de comandos 2> senao se (<condio_3>) entao : mse mse mse

Um exemplo de uso desse tipo de estrutura seria:


Algoritmo exemplo var idade: inteiro inicio

52

Introduo a Programao

escreva(Informe sua idade: ); leia (idade); se (idade < 18) entao escreva (Voc de menor) senao se (idade >=18 e idade < 30) entao escreva (Voc jovem) senao se (idade >= 30 e idade < 60) entao escreva (Voc adulto) senao se (idade >= 60) entao escreva(Voc velho) mse mse mse mse malgoritmo

Veja que apenas uma das condies ser executada. Porque a pessoa no poder se encaixar em dois intervalos de idades diferentes. Ou seja, as opes de SE quando encadeadas ou aninhadas so mutuamente exclusivas. Estrutura condicional mltipla A estrutura condicional ou de deciso mltipla uma especializao da estrutura de deciso composta aninhada, que permite a execuo de opes mutuamente exclusivas. Dessa forma, ela equivalente a uma estrutura aninhada. Esse tipo de instruo checa a igualdade do valor avaliado com algumas opes e executa a instruo ou bloco de instruo correspondente ao valor selecionado. A sintaxe desse comando pode ser vista a seguir.
escolha <seletor> caso <exp1> <sequncia-de-comandos-1> caso <exp2> ... outrocaso <sequncia-de-comandos-extra> mescolha <sequncia-de-comandos-2>

53

Introduo a Programao

Neste comando o seletor avaliado para ver em qual dos casos ele se encaixa. checada a igualdade do seletor com cada uma das expresses presentes em cada caso. Quando uma igualdade ocorrer, a sequncia de comandos correspondente executada e apenas ela. Se nenhum caso atender a seleo, o trecho denominado outro caso executado (ou seja, a sequncia de comandos extra). Vejamos um exemplo. Suponha um trecho de programa para selecionar o ms do ano. Sendo que 1 janeiro, 2 fevereiro, 3 maro e assim por diante.

No exemplo acima, vai ser realizada uma comparao de igualdade para identicar qual opo tem o mesmo valor do seletor. Caso todas as condies sejam F, executa-se o outro caso (se este existir, uma vez que ele uma parte opcional do comando) ou sai-se da estrutura sem executar nada. Se a igualdade for encontrada, vai ser executada a operao pertinente. O uxograma ao lado do cdigo ilustra, de forma resumida, o que acontece durante a execuo. O teste dos casos feito sequencialmente.

Estrutura de Repetio
Adivinha para que serve a repetio? Isso mesmo! Para repetir uma instruo ou um bloco de instrues. Vamos tomar como base a preparao de uma xcara de caf. Quais seriam os passos desse algoritmo?
1. Colocar o acar na xcara 2. Colocar o caf na xcara (neste caso, teria de ser um caf solvel)

54

Introduo a Programao

3. Colocar a gua quente 4. Mexer 5. Mexer 6. Mexer 7. Mexer 8. Mexer 9. Mexer 10. Tomar o caf

Veja que como h uma parte do algoritmo que se repete, ele poderia ser reescrito, de forma otimizada, como segue:
1. Colocar o acar na xcara 2. Colocar o caf na xcara (neste caso, teria de ser um caf solvel 3. Colocar a gua quente Repita 6 vezes 4. Mexer FimRepita 5. Tomar o caf

Note que a segunda verso faz a mesma coisa, porm, de maneira muito mais elegante. Nos algoritmos e programas existem situaes que o processamento de um valor uma nica vez no suciente para resolver o problema (por exemplo, a folha de pagamento de uma empresa no roda para apenas um funcionrio, mas para todos os funcionrios da empresa os mesmos clculos). Quando isto ocorre, deve-se utilizar uma estrutura de repetio. Estruturas de repetio permitem que uma ou mais instrues sejam executadas um nmero denido de vezes, ou enquanto uma determinada condio no alcanada. As estruturas de repetio tambm so conhecidas como Laos ou Loops e podem ser classicadas em dois tipos: Condicional elas repetem um ou mais comandos at satisfazer a condio de repetio. So usadas quando no se sabe previamente quantas vezes deve-se executar as instrues do bloco de repetio. Esse tipo de estrutura de repetio condicional pode executar o teste da condio no incio (ENQUANTO/FAA) ou no nal (REPITA/AT).

55

Introduo a Programao

Contada - repetem um nmero contado (pr-denido) de vezes um ou mais comandos. So usadas quando se sabe previamente quantas vezes deve-se executar as instrues do bloco de repetio. Para saber quando parar, esse tipo de estrutura de repetio utiliza uma varivel contadora para controlar a quantidade de repeties. representada pela estrutura PARA/FAA. Vamos, a seguir, descrever e exemplicar cada uma dessas estruturas. Estrutura de repetio ENQUANTO/FAA Lao que verica antes de cada execuo, se permitido executar o trecho do algoritmo. Ele se mantm repetindo o bloco de instrues enquanto uma dada condio permanecer verdadeira. Ou seja, faz o teste no incio do lao. Se o resultado for verdade, as instrues do lao so executadas. Depois ele volta para o incio do lao e testa se a condio continua verdadeira. Se for, executa as instrues do lao novamente. E assim continua repetindo enquanto a condio testada for verdade. Quando a condio for falsa, o lao no ser mais executado. Essa estrutura utilizada quando no sabemos o nmero de repeties e quando possumos uma expresso que deve ser avaliada para que os comandos da estrutura sejam executados. No se sabe de antemo quantas vezes o bloco de repetio ser executado. Isto , ele pode ser executado uma vez, vrias vezes ou nenhuma vez. O formato desta estrutura pode ser vista a seguir, bem como o uxograma que representa a sua execuo.

56

Introduo a Programao

Vamos dar um exemplo de utilizao do enquanto/faa. Suponha um algoritmo para ler vrios nmeros positivos ou negativos. Esse algoritmo deve ler uma quantidade no denida de nmero, parando apenas quando for digitado o valor zero. Para cada nmero lido o algoritmo deve avaliar e escrever na tela se o nmero positivo ou negativo.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. algoritmo ExemploEnquantoFaca var x: inteiro inicio escreva(Digite um valor) leia (x) enquanto (x<>0) faca se (x > 0) entao escreva (O nmero positivo) senao escreva (O nmero negativo) mse escreva(Digite um valor) leia (x) menquanto

15. malgoritmo

No algoritmo acima, a linha 1 dene o algoritmo e o nome dele. Na linha 2 feita a declarao da varivel x que do tipo inteiro. As linhas 3 e 15 delimitam o incio e m do algoritmo. Nas linhas 4 e 5 feita a leitura do valor X antes de entrar no lao. Isso porque necessrio que x tenha algum valor para poder ser testada a condio da linha 6. Se a condio for verdadeira, as linhas de 7 a 13 sero executadas. Seno, nenhuma delas o ser. Caso entre no lao, as linhas de 7 a 13 sero executadas enquanto a condio for verdadeira. Ou seja, enquanto o valor de x for diferente de zero. Estrutura de Repetio REPITA/AT O funcionamento desta estrutura bastante parecido ao da estrutura enquanto. Porm, os comandos contidos no interior do lao sero executados pelo menos uma vez, j que a condio de continuidade no lao s testada no nal do bloco de comandos. Ou seja, depois da execuo do bloco a primeira vez, a condio testada, caso ela seja falsa, os comandos sero executados novamente. A execuo 57

Introduo a Programao

dos blocos repetida at que a condio (que falsa) se torne verdadeira. O repita/at utilizado quando no sabemos o nmero de repeties e quando os comandos devem ser executados pelo menos uma vez, antes da expresso ser avaliada. Ou seja, no se sabe de antemo quantas vezes o bloco de repetio ser executado. Todavia garantido que ele ser executado pelo menos uma vez. O bloco de comandos repetido toda vez que a condio for falsa. A execuo do bloco nalizada quando a condio for verdade. O formato desse comando est especicado a seguir.

Vamos supor o mesmo problema do exemplo da estrutura enquanto/faa de checar se o nmero positivo ou negativo. Como caria aquele problema usando a estrutura repita/at?
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. algoritmo ExemploRepitaAte var x: inteiro inicio repita escreva(Digite um valor) leia (x) se (x > 0) entao escreva (O nmero positivo) senao escreva (O nmero negativo) mse

58

Introduo a Programao

12.

ate (x=0)

13. malgoritmo

Veja que agora, o teste da condio que dene se o algoritmo continuar executando feito no nal do bloco de comandos (linha 12). Dessa forma, as linhas de 5 a 11 sero executadas ao menos uma vez, antes de chegar at a condio e, depois, s continuaro executando se a condio for falsa (x <> 0). Porque se ela for verdadeira, (x=0) ser encerrada a execuo do lao, visto que para ele executar at a condio se tornar verdadeira. Toda repetio condicional pode ser representada por uma estrutura do tipo Enquanto/Faa ou Repita/At. Todavia, perceba que a primeira repete somente quando a condio V e a segunda repete somente quando a condio F. Por isso, a condio de uma a negao da outra. Nos laos condicionais a varivel que testada (no caso dos algoritmos de exemplo, a varivel X) deve estar sempre associada a uma instruo que a atualize no interior do lao (no caso do algoritmo de teste, a atualizao a leitura de um novo valor para x). Pois, se isto no ocorrer, o algoritmo car repetindo indenidamente este lao, gerando uma situao conhecida como lao/loop innito
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. algoritmo ExemploEnquantoFaca var x: inteiro inicio escreva(Digite um valor) leia (x) enquanto (x<>0) faca se (x > 0) entao escreva (O nmero positivo) senao escreva (O nmero negativo) mse escreva(Digite um valor) leia (x) menquanto

15. malgoritmo

O algoritmo acima entraria em loop innito se o comando da linha 13 no fosse executado. Isso porque, se no fosse lido um novo valor para x, x poderia nunca chegar a ter o valor zero (condio de parada 59

Introduo a Programao

do lao), uma vez que o lao executa enquanto o x for diferente de zero. Estrutura de Repetio PARA/FAA Este tipo de estrutura til quando se conhece previamente o nmero de vezes que se deseja executar um determinado conjunto de comandos. Esta estrutura repete a execuo dos comandos enquanto a varivel contadora no atingir o valor nal. Ressalta-se que a varivel contadora previamente inicializada (recebe um valor inicial) e incrementada em uma unidade, automaticamente, a cada nal de execuo do bloco de comandos dentro do lao. Ou seja, sabe-se de antemo quantas vezes o bloco de repetio ser executado, uma vez que ele ir de um valor inicial, especicado, a um valor nal, tambm especicado e controlado pela varivel contadora. A varivel contadora sempre ser um nmero inteiro e ela no pode ser modicada dentro do bloco de comandos. O formato dessa estrutura est especicado a seguir.

Para exemplicar, suponha que gostaramos de construir um algoritmo para ler 20 nmeros e avaliar se esses nmeros so positivos ou negativos, escrevendo na tela a mensagem apropriada. Considere que zero entrar na parte dos nmeros positivos, para efeito de simplicar o algoritmo. Veja, neste algoritmo j dito que se quer ler e avaliar 20 nmeros. Ento voc j sabe o trecho do algoritmo que precisa ser executado 20 vezes. Ento, este trecho car dentro do lao para. 60

Introduo a Programao

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

algoritmo exemploParaFaca var num, contador: inteiro inicio para contador de 1 ate 20 faca escreva(Digite um valor) leia (num) se (num >= 0) entao escreva (O nmero positivo) senao escreva (O nmero negativo) mse mpara Ateno O problema pediu para ler e avaliar 20 nmeros. Logo o lao para vai de 1 at 20

13. malgoritmo

A varivel contadora, neste algoritmo chamada de contador, comea com o valor inicial 1 e vai at o valor nal 20 (especicados na linha 4) e a cada execuo do bloco de comandos dentro do lao (da linha 5 a linha 11) a varivel contadora incrementada e o lao checa se ela ainda menor ou igual ao valor nal. Se for, a execuo dos comandos dentro do lao continua, se no for, a execuo do lao para. possvel implementar um lao com contador, usando uma das estruturas de repetio condicionais (enquanto/faa ou repita/at). Porm, o controle do incremento da varivel contadora passa a ser seu, no ser mais feito automaticamente (tal qual feito no lao para). Vejamos o exemplo a seguir, trocando a estrutura para/faa por enquanto/faa.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. algoritmo exemploContadorEnquanto var num, contador: inteiro inicio contador <-1 enquanto (contador <= 20) faca escreva(Digite um valor) leia (num) se (num >= 0) entao escreva (O nmero positivo) senao Ateno Agora preciso dar um valor inicial ao contador

61

Introduo a Programao

11. Ateno A varivel contadora passa a necessitar ser incrementada por voc. Antes o lao para executava esse passo, automaticamente. 12. 13. 14.

escreva (O nmero negativo) mse contador <- contador + 1 menquanto

15. malgoritmo

Uma comparao que resumo tudo que foi apresentado at agora sobre as estruturas de repetio pode ser vista na Tabela 7.
Enquanto/Faa Tipo da Estrutura Ocorrncia do Teste Condicional Repita/At Condicional Para/Faa Contada

No incio Zero ou mais vezes (pode no ser executada nenhuma vez)

No Final Uma ou mais (vai ser executada, no mnimo, uma vez) Repete enquanto falso, ou seja, at que a condio se torne verdadeira.

No incio Vai ser executada do valor inicial ao valor nal, ou seja, ter um nmero de execues pr-denido Repete enquanto a Varivel Contadora for maior ou igual ao valor inicial e menor ou igual ao valor Final

Quantidade de Repeties

Condio para Repetir

Repete enquanto verdadeiro

Tabela 7 - Comparao entre as estruturas de repetio

Estruturas de Repetio Aninhadas ou Encadeadas Semelhante s estruturas de deciso compostas, as estruturas de repetio tambm podem ser encadeadas/aninhadas. Esta abordagem usada quando h a necessidade de se usar laos dentro de laos. Isso ser bastante utilizado no Captulo 4, quando formos falar de tipos estruturados de dados. Por isso, deixaremos para detalhar esse ponto, mais frente. Porm, para que voc tenha uma ideia do que estamos falando, vamos dar um exemplo. Suponha que voc precise fazer um algoritmo para gerar a tabuada da multiplicao de 1 a 10. Lembra dela? Acho que todos ns j passamos por ela (vide Figura 25). Se voc prestar ateno tabuada a primeira coluna de cada bloco de nmeros sempre o mesmo nmero. Exemplo, a primeira coluna da tabuada do 1 toda de nmero 1, a primeira coluna do bloco da 62

Introduo a Programao

tabuada do 2 toda de nmero 2 e assim por diante. J a segunda coluna de cada bloco, sempre varia de 1 a 10. D uma olhada na Figura 25 e veja isso. Viu? Dessa forma, para gerar essa tabuada, vamos precisar de um lao que tem de car no mesmo nmero, at que se gerem os nmeros de um a dez. Vamos ver como caria esse algoritmo e vamos depois explicar mais detalhes.
1x1 = 1 1x2 = 2 1x3 = 3 1x4 = 4 1x5 = 5 1x6 = 6 1x7 = 7 1x8 = 8 1x9 = 9 1x10 = 10 6x1 = 6 6x2 = 12 6x3 = 18 6x4 = 24 6x5 = 30 6x6 = 36 6x7 = 42 6x8 = 48 6x9 = 54 6x10 = 60 2x1 = 2 2x2 = 4 2x3 = 6 2x4 = 8 2x5 = 10 2x6 = 12 2x7 = 14 2x8 = 16 2x9 = 18 2x10 = 20 7x1 = 7 7x2 = 14 7x3 = 21 7x4 = 28 7x5 = 35 7x6 = 42 7x7 = 49 7x8 = 56 7x9 = 63 7x10 = 70 3x1 = 3 3x2 = 6 3x3 = 9 3x4 = 12 3x5 = 15 3x6 = 18 3x7 = 21 3x8 = 24 3x9 = 27 3x10 = 30 8x1 = 8 8x2 = 16 8x3 = 24 8x4 = 32 8x5 = 40 8x6 = 48 8x7 = 56 8x8 = 64 8x9 = 72 8x10 = 80 4x1 = 4 4x2 = 8 4x3 = 12 4x4 = 16 4x5 = 20 4x6 = 24 4x7 = 28 4x8 = 32 4x9 = 36 4x10 = 40 9x1 = 9 9x2 = 18 9x3 = 27 9x4 = 36 9x5 = 45 9x6 = 54 9x7 = 63 9x8 = 72 9x9 = 81 9x10 = 90 5x1 = 5 5x2 = 10 5x3 = 15 5x4 = 20 5x5 = 25 5x6 = 30 5x7 = 35 5x8 = 40 5x9 = 45 5x10 = 50 10x1 = 10 10x2 = 20 10x3 = 30 10x4 = 40 10x5 = 50 10x6 = 60 10x7 = 70 10x8 = 80 10x9 = 90 10x10 = 100 Ateno Controla o valor da primeira coluna da tabuada

Figura 25 - A nossa tabuada de cada dia

1. 2. 3. 4. 5. 6. 7. 8. 9.

algoritmo tabuada var coluna1, coluna2, resultado: inteiro inicio para coluna1 de 1 ate 10 faca para coluna2 de 1 ate 10 faca resultado <- coluna 1 * coluna2 escreval(coluna1, x, coluna2, =, resultado) mpara mpara

Ateno Controla o valor da segunda coluna da tabuada. Varia o valor da varivel coluna2, enquanto o valor de coluna1 continua o mesmo

10. malgoritmo

Neste algoritmo, quando o primeiro lao comea (linha 4), o valor da coluna1 ca xo, at que se volte para executar esse lao novamente. Porm, isso s vai ocorrer, quando lao mais interno (da linha 5 a linha 8) terminar. Esse lao mais interno o encarregado de 63

Introduo a Programao

gerar os valores de um a dez da segunda coluna de cada bloco da tabuada. Dessa forma, por exemplo, no comando da linha 6, o valor de coluna 1 continua o mesmo dentro desse lao mais interno e o valor da coluna 2 vai mudando. Seria algo como mostrado na Tabela 8.
Coluna 1 1 1 1 1 1 1 1 1 1 1 Coluna 2 1 2 3 4 5 6 7 8 9 10 Coluna 1 2 2 2 2 2 2 2 2 2 2 Coluna 2 1 2 3 4 5 6 7 8 9 10

1 Execuo do Lao Externo

2 Execuo do Lao Externo

Tabela 8 - Exemplo de valores gerados pelos laos aninhados

Dicas para Escrever Bons Algoritmos


Bom, agora, a essa altura, voc j tem todas as instrues necessrias para construir vrios tipos de algoritmos. Porm, vamos dar ainda algumas dicas para lhe ajudar a escrever realmente bons algoritmos, que sejam claros, fceis de entender e de dar manuteno. 1. Procure no escrever mais do que um comando por linha 2. Depois de ler o enunciado do problema, tente identicar sempre as trs fases: entrada, processamento e sada. Isso lhe ajuda a esquematizar o algoritmo. 3. Para lembrar, posteriormente, de trechos de programas mais complicados que voc pode esquecer como implementou, escreva comentrios claros e objetivos no momento em que estiver escrevendo o algoritmo. Isto tambm facilita o entendimento do algoritmo. Porm, cuidado, comentrios devero acrescentar alguma coisa; no apenas descrever instrues. Instrues dizem o que est sendo feito e os Comentrios dizem o porqu de est sendo feito. Por exemplo, para o comando lucro venda custo, um comentrio ruim seria Este comando atribui a lucro o valor de venda menos o 64

Introduo a Programao

valor de custo (isso est escrito, no precisa comentar). Um bom comentrio seria: Aqui calculado o lucro total obtido com a venda dos produtos. Uma linha de comentrio deve ser iniciada com a marca // (duas barras). A linha iniciada com essa marcao no ser traduzida pelo tradutor, serve apenas para informao ao programador e documentao do programa/ algoritmo. 4. Use comentrios no incio do algoritmo. Estes podem ter, entre outras informaes, a descrio do que o algoritmo faz, o nome do autor do algoritmo, a data de implementao, etc. Por exemplo:
Algoritmo Tabuada //Esse algoritmo gera a tabuada de multiplicao de 1 a 10. //Autora: Sandra de Albuquerque Siebra //Data: 20/08/2008 var coluna1, coluna2, resultado: inteiro incio ...

5. Escolha nomes de variveis que sejam signicativos. Evite variveis com nomes do tipo: x, y, z, lm. Prera nomes que expressem o valor que voc vai guardar dentro da varivel. Por exemplo: precoProduto, lucro, nome, idade, etc. 6. Procure alinhar os comandos de acordo com o nvel a que pertenam. Isto , destaque a estrutura na qual esto contidos. Este alinhamento chamado de identao. Identao a organizao hierrquica das estruturas e suas instrues. Facilita visualizar o que est contido em que. Ela auxilia no entendimento do cdigo e na busca de erros. Para ilustrar, qual dos dois trechos de algoritmo a seguir voc acha mais fcil de entender? O da esquerda ou o da direita? (o da direita est identado!)

65

Introduo a Programao

algoritmo ExemploEnquantoFaca var x: inteiro inicio escreva(Digite um valor) leia (x) enquanto (x<>0) faca se (x > 0) entao escreva (Positivo) senao escreva (Negativo) mse escreva(Digite um valor) leia (x) menquanto malgoritmo

algoritmo ExemploEnquantoFaca var x: inteiro inicio escreva(Digite um valor) leia (x) enquanto (x<>0) faca se (x > 0) entao escreva (Positivo) senao escreva (Negativo) mse escreva(Digite um valor) leia (x) menquanto malgoritmo

Aprenda Praticando Depois de ter visto vrios tipos de instrues da linguagem algortmica e ter inclusive lido algumas dicas para construo de algoritmos. E agora? Bem, vamos mostrar dois exemplos passo a passo de dois tipos de algoritmos para que, depois, voc mesmo possa fazer os seus exerccios. Problema 1: Construa um algoritmo para ler o nome, nmero de horas trabalhadas e nmero de dependentes de cada um dos 20 funcionrios de uma empresa. Aps a leitura, para cada funcionrio, calcule e imprima na tela: o nome do funcionrio, seu salrio bruto, o total de descontos que ele sofrer e seu salrio lquido. Considere que: A empresa paga R$10 por hora trabalhada e tem um adicional de R$40 por dependente que o funcionrio tenha. O salrio bruto o valor total dos ganhos do funcionrio Sobre o salrio bruto so descontados 8 % de INSS e 5% de IR (imposto de renda).

66

Introduo a Programao

O salrio lquido o valor do salrio bruto, menos os descontos. Agora, mos obra! Primeiro, faa a leitura do problema. Depois leia o problema tentando identicar qual a entrada, o processamento e a sada. Nisso temos: Entrada: o nome, o nmero de horas trabalhadas e o nmero de dependentes de cada funcionrio Processamento: calcular o salrio bruto, os impostos e o valor do salrio lquido de 20 funcionrios (veja, sabemos quantos funcionrios so!) Sada: o nome do funcionrio, seu salrio bruto, os descontos e o valor do salrio lquido. O que mais podemos saber da leitura? Vamos precisar usar estrutura de repetio, porque precisamos fazer o mesmo processamento para 20 funcionrios. Vamos precisar de uma varivel para cada valor que queremos ler na entrada e para cada coisa que precisamos calcular no processamento. Vamos l! Sabendo disso tudo, como caria o algoritmo? (lembre que as linhas iniciadas com // so comentrios
========================================================== // voc poderia dar qualquer nome ao algoritmo, // eu resolvi chamar ele de calcula Algoritmo calcula // aqui so feitas as declaraes das variveis. Lembre que // vamos precisar de uma varivel contadora para o lao // PARA/Faca (essa eu chamei de contador). Fora isso, uma // varivel para cada valor que precisa ser lido (nome, // horasTrab, dependentes) e uma varivel para cada valor a // ser calculado (salarioBruto, salarioLiquido, inss e ir) Var nome: caractere horasTrab, salarioBruto, salarioLiquido, inss, ir: real dependentes, contador: inteiro inicio // como so 20 funcionrios, precisaremos ler e calcular // tudo 20 vezes. Por isso, usamos um lao para/faca. para contador de 1 ate 20 faca // a primeira coisa a fazer pedir ao usurio para

67

Introduo a Programao

// digitar os valores de entrada escreva (*********************************) escreva (Digite o nome do funcionrio: ) leia(nome) escreva (Digite a quantidade de horas trabalhadas: ) leia(horasTrab) escreva(Digite o n de dependentes do funcionrio: ) leia(dependentes) // com os valores lidos, podemos calcular agora o // salrio bruto do funcionrio multiplicando o valor // em reais de cada coisa, pela sua quantidade salarioBruto <- (10 * horasTrab) + (40 * dependentes) // o INSS 8% do salrio bruto inss <- (8*salarioBruto)/100 // o IR 5% do salrio bruto Ir <- (5*salarioBruto)/100 // o salrio lquido o salrio bruto subtrado // dos descontos dos impostos salarioLiquido <- (salarioBruto inss) ir // depois de tudo calculado, imprimimos os resultados // (poderia fazer tudo em um escreval s, z em mais // de um s para organizar as impresses. Lembre // escreval serve para imprimir na tela e depois pular // uma linha) escreval (Nome: , nome) escreval (Salrio Bruto: R$ , salarioBruto) escreval (Descontos: R$ , (ir+inss) escreval (Salrio Lquido: R$ , salarioLiquido) mpara malgoritmo ==========================================================

Problema 2: Faa um algoritmo para ler uma quantidade indenida de bois (cdigo do boi e peso do boi), parando quando for digitado o cdigo zero. Depois, calcule e imprima o cdigo e o peso do boi mais gordo da fazenda. Considere, para simplicar, que no h dois pesos iguais. Neste problema temos: 68

Introduo a Programao

Entrada: o cdigo e o peso do boi Processamento: calcular qual o boi mais gordo Sada: o cdigo e o peso do boi mais gordo O que mais podemos saber da leitura? Vamos precisar usar estrutura de repetio. Porm, no pode ser um lao para/faa, porque vamos ler um nmero indenido de bois. Mas ns temos uma condio de parada (cdigo do boi igual a zero). Dessa forma, podemos usar ou um lao enquanto/faa ou um lao repita/at. Vamos escolher esse ltimo, porque o algoritmo teria de executar ao menos uma vez.
========================================================== Algoritmo pesado // Vamos precisar de uma varivel para cada valor que // precisa ser lido (codBoi, peso) e uma varivel para // guardar o que vai ser calculado codGordo, pesoGordo. Var codBoi, codigoGordo: inteiro peso, pesoGordo: real inicio // antes de entrar no lao, temos de dar um valor inicial // (inicializar) as variveis que vamos usar para os // clculos. Como no temos ainda o cdigo do boi mais // gordo inicializamos o cdigo do mais gordo com zero. // E, como queremos descobrir o peso do boi mais gordo, // comeamos o peso com zero tambm. Para que qualquer // que seja o peso do primeiro boi lido, ele j possa // substituir esse valor zero, como voc ver abaixo. codigoGordo <- 0 pesoGordo <- 0 repita // assim que entramos no repita, vamos ler os valores // de entrada escreval(********************************) escreva (Digite o cdigo do boi: ) leia(codBoi) // s continuo o algoritmo se o cdigo lido for // diferente de zero. Isso evita que o primeiro cdigo

69

Introduo a Programao

// digitado seja zero e voc tenha que executar o // algoritmo todo, antes de sair do lao porque o // teste do lao s no nal. se (codBoi <> 0) entao escreva (Digite o peso do boi: ) leia(peso) // agora vamos usar uma estrutura condicional para // tomar a deciso se esse boi que acabou de ser // lido mais gordo do que o que j temos // armazenado na varivel pesoGordo se (peso > pesoGordo) entao // se o peso do boi que foi lido for maior do que // o peso que estava armazenado, voc deve // substituir o valor armazenado, pelos valores // que acabaram de ser lidos. pesoGordo <- peso codigoGordo <- codBoi mse mse // esse algoritmo continua ate que a condio de // parada (codBoi =0) seja satisfeita ate (codBoi = 0) // quando sai do lao, deve imprimir o resultado escreval(O boi mais gordo o de cdigo: , codigoGordo, que pesa , pesoGordo) malgoritmo

Desao O que mudaria se que eu quisesse saber qual era o boi mais magro?

70

Introduo a Programao

Conhea Mais O assunto deste captulo linguagem algortmica e qualquer livro de algoritmos ou de lgica de programao ter esse assunto (na verdade um ou mais captulos sobre o assunto). Sugiro, ento, a leitura dos captulos 2 e 3 do livro-texto da disciplina: FORBELLONE, Andr Luiz. Lgica de Programao. Makron Books, 3. Edio, 2005. Outro livro que pode ser consultado o: FARRER, Harry; BECKER, C. G.; FARIA, E.C.; MATOS, H.F.; SANTOS, M.A.; MAIA, M.L. Algoritmos Estruturados. Editora LTC, 3. Edio, 1999. Outra fonte de pesquisa pode ser a internet. Voc pode consultar por Linguagem Algortmica que viro vrias dicas de apostilas, tutoriais, apresentaes e sites. Alm da prpria pgina do VisuAlg:
http://www.apoioinformatica.inf.br/visualg/linguagem.htm

Atividade de Estudo Construa algoritmos em linguagem algortmica para resolver os problemas a seguir. Usando s estrutura sequencial 1) Leia o nome e o salrio de um funcionrio e exiba com resultado o nome do mesmo com o salrio reajustado em 12%. 2) Leia 2 notas, calcule e exiba a mdia ponderada dessas notas. Considere que a nota1 tem peso 6 e a nota2 tem peso 4. 3) Faa um algoritmo que receba um valor em dlar e transforme o mesmo em reais, sabendo que a taxa de converso : 1 dlar = R$ 1.70. 4) Leia uma distncia em km entre dois pontos e o preo da gasolina em reais. Depois, exiba quantos litros de gasolina o carro ir consumir e quanto ser o gasto em reais, sabendo que o carro em questo consegue percorrer 12 km com um litro 71

Introduo a Programao

de gasolina. 5) Leia as variveis inteiras n1 e n2 e troque o valor destas variveis. Isto , n1 deve car com o valor de n2 e n2 deve car com o valor de n1. Exiba os valores antes e depois da troca. Usando s estrutura de deciso 6) Leia um nmero inteiro e mostre uma mensagem indicando se este nmero par ou mpar (para calcular se par ou mpar, use a funo MOD). 7) Leia 3 notas, calcule a mdia aritmtica dessas e, de acordo com o resultado, escreva como sada o valor da mdia e a mensagem apropriada: Reprovado (mdia < 4), Em Prova Final (mdia >= 4 e < 7) e Aprovado (mdia >= 7). 8) Leia a idade de um nadador e exiba sua categoria segundo as regras: Junior (5 at 7 anos); Infantil (8 at 12 anos); Pr (13 at 18) e Avanada ( Idade > 18) 9) Desenvolva um algoritmo que funcione como uma calculadora, com as quatro operaes bsicas: adio, subtrao, multiplicao e diviso. Para isso, deve ser pedido ao usurio o primeiro nmero, o sinal da operao e o segundo nmero. D uma mensagem se o sinal digitado no for um dos quatro presentes na calculadora e lembre que no existe nmero divisvel por zero. 10) Leia trs nmeros inteiros e mostre-os em ordem crescente. 11) Leia um nmero inteiro entre 20 e 39 e escreva seu valor por extenso. Exiba uma mensagem apropriada se o nmero estiver fora desse intervalo. 12) Leia um nmero inteiro e positivo, calcule e imprima o resultado do seu fatorial. Lembre que o fatorial de um nmero N qualquer igual a 1 x 2 x 3 x ... x N -1 x N. Ex: 5! = 5x4x3x2x1=120. Lembre tambm que 0! = 1. Usando estrutura de repetio (e talvez, outras estruturas) 12) Leia o nome e a idade de vrias pessoas at que uma idade igual a ZERO seja digitada. E, ao nal, informe o nome da pessoa mais velha e o nome da pessoa mais nova, entre todos os nomes lidos. Para simplicar, considere que no existem 72

Introduo a Programao

idades iguais. 13) Escreva um algoritmo para calcular e imprimir a soma dos nmeros inteiros e pares de 1 a 50. 14) Um rgo de pesquisa deseja efetuar um mapeamento das condies econmicas das pessoas de uma determinada regio e efetuou uma pesquisa perguntando Nome, idade, sexo, se trabalha, e quantos salrios mnimos recebem por ms. Elaborar um algoritmo para determinar: A quantidade de pesquisas realizadas por sexo (quantos homens e quantas mulheres foram entrevistados) A quantidade pessoas menores de 18 anos que trabalham A renda mdia dos homens A renda mdia das mulheres Nome e Renda da pessoa que trabalha e que tem a menor renda Quantidade de pessoas que no trabalham A mdia de idade dos entrevistados Considere: Nome = FIM indica que j foram lidos todas as pesquisas, ou seja, a condio de parada do algoritmo. Sexo vai ser informado como M ou F; Idade dever estar entre 00 e 100 anos Se trabalha dever receber um valor lgico, ou seja, V ou F (verdadeiro ou falso) 15) Escreva um programa que apresente a srie de Fibonacci at o dcimo quinto termo. A srie de Fibonacci formada pela sequncia: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... etc. Consegue ver a lgica de criao da mesma? Pense um pouquinho, no to difcil assim! 16) Faa um algoritmo para calcular e escrever a soma da seguinte srie: Soma = (X25 / 1) (X24 / 2) + (X23 / 3) (X22 / 4) + ... + (X / 25)

73

Introduo a Programao

17) Uma empresa de compras atravs da Internet decidiu realizar uma pesquisa entre os seus clientes para determinar o perl dos mesmos. Considerando uma amostra de 200 clientes, faa um algoritmo que leia o nome, a idade de seus clientes e se eles tm acesso Internet e fornea como resultado: A mdia de idade dos clientes; A quantidade de mulheres; Quantas pessoas tm acesso a Internet; O nome e a idade do homem mais velho que tem acesso a Internet; O nome e a idade da mulher mais nova.

Resumo A linguagem algortmica uma das formas de representao de algoritmos mais utilizadas. Porm, ela no padronizada. Logo, adotamos na nossa disciplina a linguagem algortmica utilizada dentro da ferramenta VisuAlg, que usaremos depois para executar nossos algoritmos. Para comear a construir o algoritmo em linguagem algortmica precisamos sempre identicar as trs fases de um programa: entrada, processamento e sada. Na fase de entrada, as informaes (entradas) so armazenadas em variveis. As variveis podem ser de quatro tipos diferentes: inteiro (para valores numricos sem parte decimal), real (para valores numricos com parte decimal), caracter (para letras, nmeros e smbolos) e lgico (que s pode assumir valor verdadeiro ou falso). Ns podemos colocar valores diretamente nas variveis pelo comando de atribuio ou podemos fazer a leitura dos dados usando o comando Leia(nomevarivel). Esse comando pega valores do teclado, leitores de cdigo de barras, etc e armazena nos espaos da memria do computador, nomeados pelas variveis. na fase de processamento que so realizados os clculos dos algoritmos. Por isso, nessa parte voc vai fazer uso de operadores e expresses. Os operadores podem ser do tipo aritmtico (+, -, *, /, \, MOD, ^), relacional (<, >, <=, >=, <>, =), lgico (no, e, ou), 74

Introduo a Programao

de atribuio (<-) e de caracter (+ signicando concatenao de valores). A parte de processamento pode fazer uso de: estruturas sequenciais, onde um comando vem atrs do outro e eles so executados, sequencialmente, seguindo a ordem de apario. estruturas de deciso ou condicionais, que podem ser de quatro tipos: condicionais simples (se-ento), condicionais compostas (se-ento-seno), condicionais aninhadas (quando colocamos estruturas condicionais, dentro de estruturas condicionais) e de deciso mltipla (escolha) estruturas de repetio, que podem ser de dois tipos, condicionais ou contada. As condicionais podem realizar o teste no incio (enquanto/faa) ou no nal (repita/at). Elas costumam ser usadas quando no se sabe quantas vezes ser preciso repetir um determinado bloco de comandos. A estrutura de repetio contada usada quando se sabe o nmero de repeties e representada pelo comando para/faa. Qualquer uma das estruturas podem ser utilizadas juntas, colaborando para a resoluo do problema. J na fase de sada, geralmente, se imprimem valores ou mensagens na tela. Para imprimir variveis, textos ou as duas coisas na tela, se usa o comando escreva(texto, varivel). No prximo captulo, vamos conhecer um ambiente de programao algortmica, facilitando a construo e teste dos nossos algoritmos.

75

Introduo a Programao

Captulo 3 Ambientes de Programao Algortmica


Para amenizar a vontade de sair da programao no papel que a maior parte dos alunos de Introduo Programao experimenta, sugerimos nesta etapa da disciplina, uma vez que voc j sabe criar um algoritmo bsico, o uso de uma ferramenta de compilao algortmica. O uso de uma ferramenta como essa permite aos alunos iniciantes em programao, o exerccio dos seus conhecimentos em um ambiente prximo da realidade da programao convencional. E isso pode ser bem interessante! Pois, nos anos que ensino a disciplina de Introduo Programao (h mais de dez anos) notei que, para o aluno, ca muito abstrato programar no papel. Por outro lado, submet-lo de cara aos rigores do uso de uma ferramenta para programao em uma linguagem como C, por exemplo, aumentaria em muito a complexidade do aprendizado. Dessa forma, acho recomendvel, fazer uso de um ambiente integrado, onde o aluno tenha disposio ferramentas como: editor para digitao do algoritmo; tradutor (compilador ou interpretador), a m de converter o algoritmo para linguagem de mquina e execut-lo e, se necessrio, depurar erros de extrema valia para o aprendizado; podendo, assim, amenizar a sede de usar uma ferramenta de programao. Existem vrias ferramentas desse tipo que foram implementadas em universidades brasileiras. Algumas das que encontramos com maior destaque foram: Portugol/Plus - http://www.c5.cl/ieinvestiga/actas/ribie98/118.html G-Portugol - http://gpt.berlios.de/manual_nodes/manual.html ILA: Interpretador de Linguagem Algortmica - http://www.
exatec.unisinos.br/_professores/gerador.php?professor=crespo&id_ menu=434&id_submenu=189

WebPortugol - http://www.univali.br/webportugol AlgoMais - http://www.brasilacademico.com/maxpt/links_goto.asp?id=808 Hall - http://www.paim.pro.br/hall/ VisuAlg - http://www.apoioinformatica.inf.br/download.htm 76

Introduo a Programao

Infelizmente, no h padronizao entre a linguagem algortmica utilizada por qualquer uma delas, fazendo com que fosse preciso optar por adotar apenas uma. Dessa forma, optamos por indicar o uso da ferramenta VisuAlg. A limitao que a mesma executa apenas em ambiente Windows. Porm, uma ferramenta gratuita, estruturada, com ambiente integrado para edio do algoritmo, interpretao e execuo, tem facilidades para depurao de erros, uma interface simples e o arquivo de instalao pequeno, podendo ser baixado inclusive por quem tem internet discada. A seguir daremos mais detalhes sobre essa ferramenta.

O VisuAlg
O VisuAlg uma ferramenta simples, que no depende de bibliotecas, mquinas virtuais ou outros componentes. Sua instalao no copia arquivos para nenhuma outra pasta a no ser aquela em que ela for instalada e exige cerca de 1 MB de espao em disco. Pode ser executado sob Windows 95 ou posterior e tem melhor aparncia com resoluo de vdeo de 800x600 ou maior. Os detalhes sobre a ferramenta, seus objetivos, desenvolvimento, linguagem algortmica utilizada e explicao das telas, podem ser encontrados em:
http://www.apoioinformatica.inf.br/visualg/objetivos.htm

Reserve um tempo para dar uma olhada nesse link, pois ele contm informaes detalhadas sobre a ferramenta para que voc possa utiliz-la da melhor maneira. Alm do material on-line do link acima, no ambiente est disponvel o manual do VisuAlg, bem ilustrado e detalhado. E a linguagem algortmica utilizada pelo VisuAlg? Bem, no precisa se preocupar, pois ela exatamente igual sintaxe dos comandos que foram apresentados at agora. Para baixar a ferramenta, use o link http://www.apoioinformatica.inf.
br/download.htm Nele escolha a opo VisuAlg. Vai iniciar o download

de um arquivo chamado setupv2.exe. Depois que baixar esse arquivo, basta clicar duas vezes sobre o nome dele e o VisuAlg ser instalado. Um cone para ativao do VisuAlg (Figura 26) ser criado na rea de trabalho, aps a instalao. Clicando neste cone, o ambiente aberto (Figura 27) e voc j pode comear a digitar o seu algoritmo, aproveitando o esqueleto de cdigo que j vem dentro da janela do editor.

77

Introduo a Programao

Figura 26 - Atalho para Ativao do VisuAlg

No mais, algumas observaes importantes para usar a ferramenta so: ela permite apenas um comando por linha. Na verso atual do VisuAlg (2.0), com exceo das rotinas de entrada e sada, no h nenhum subalgoritmo embutido, calculo de raiz quadrada, incremento, etc. Todas as palavras-chave do VisuAlg foram implementadas sem acentos ou cedilha. Portanto, o tipo de dados lgico denido como logico, o comando se..ento..seno denido como se..entao..senao, e assim por diante. O VisuAlg, tambm, no distingue maisculas e minsculas no reconhecimento de palavras-chave e nomes de variveis.

Figura 27 - Tela do VisuAlg

Para praticar, voc pode usar o VisuAlg para implementar alguns dos algoritmos resolvidos nos captulos anteriores.

Testes de Algoritmos (Teste de Mesa)


Para testar se as funcionalidades implementadas em um algoritmo esto corretas necessrio testar o algoritmo, vericando o contedo das variveis passo a passo. Para efetuar esta tarefa, costuma-se utilizar o chamado Teste de Mesa ou Teste Exaustivo. Realizar este teste signica seguir passo a passo as instrues do algoritmo, de maneira precisa, para vericar se o que foi implementado est correto

78

Introduo a Programao

ou no, a partir dos resultados gerados e dos valores parciais de cada varivel. Este teste permitir que o programador visualize o comportamento de todo o processo, cheque se o algoritmo est correto e corrija eventuais erros, se existirem. Em Informtica, d-se o nome de bugs aos erros de um programa. O processo de identicao e correo dos erros denomina-se debugging. Os erros podem ser dos seguintes tipos: Erros Sintticos - ocorrem quando as instrues do programa no so escritas de acordo com a sintaxe da linguagem sendo usada. Por exemplo: se eu esquecesse um mse de um comando se, o comando estaria incompleto. No estaria denido conforme a sintaxe da linguagem. Por isso, ocorreria o erro sinttico. Este tipo de erro impede a execuo do algoritmo ou programa. Erros Semnticos (ou lgicos) - ocorrem quando o cdigo escrito pelo programador no gera o resultado desejado por este. Ou seja, o cdigo est sintaticamente correto, mas o resultado gerado pelo algoritmo no est correto. Erros de lgica podem ser simplesmente uso incorreto de operadores (+ no lugar de -, usar o operador OU no lugar de usar o E), atribuies erradas (por exemplo, pedir para digitar o nome da pessoa e guardar o que for digitado na varivel endereo), etc. Os erros sintticos so fceis de encontrar e corrigir, porque, geralmente, o compilador se encarrega de apont-los e, normalmente, d uma indicaco do tipo de erro. O programa s executado quando no existem mais erros sintticos. J os erros semnticos so de deteco mais difcil, uma vez que os compiladores no podem encontrar erros de lgica, j que no tm conhecimento sobre o que o programador deseja fazer. Dessa forma, erros de lgica s podem ser encontrados e remediados pelo programador. Esse tipo de erro pode fazer com que o programa exiba comportamentos inesperados. E como se faz o teste de mesa? 1. Leia o algoritmo que foi escrito. 2. Crie uma coluna para cada uma das variveis declaradas no algoritmo e uma coluna para a sada de dados (o que vai ser impresso na tela). 3. Em seguida, acompanhe linha a linha a execuo do algoritmo, 79

Introduo a Programao

anotando nas colunas apropriadas cada mudana de valor das variveis ou do que foi escrito na tela. 4. Preste ateno nas estruturas condicionais (porque pode haver instrues que no sero executadas) e nas estruturas de repetio (porque pode haver trechos de instrues que devem ser executados mais de uma vez). 5. Siga a execuo at chegar ao nal do algoritmo. Uma animao interessante sobre um exemplo de teste de mesa simples pode ser vista em http://www.brasilacademico.com/ed/testemesa. htm. Vamos dar mais um exemplo. Suponha um algoritmo para ler duas notas de um aluno e calcular a mdia das mesmas. Depois indicar se o aluno foi aprovado (mdia >= 7) ou no. Suponha tambm que os valores digitados para as notas sero 8.0 e 9.0, respectivamente.
algoritmo calcularMedia var N1, N2, Media : real inicio escreva(Digite o valor da Primeira Nota ) leia(N1) escreva(Digite o valor da Segunda Nota ) leia(N2) Media <- (N1 + N2)/2 se (Media >= 7) entao escreva(Aprovado. Mdia = , Media) senao escreva(Reprovado. Mdia = , Media) mse malgoritmo

Seguindo os passos que foram explicados do teste de mesa, vai ser criada uma coluna para cada varivel do algoritmo e uma coluna para o que vai aparecer na tela. Em seguida, voc vai seguindo, linha a linha, passo a passo a execuo do algoritmo, com os valores de teste sugeridos e vai preenchendo a tabela criada (vide Tabela 9), at terminar o algoritmo.

80

Introduo a Programao

Executando NoLinha 4 5 6 7 8 10 8.0 8.0 8.0 N1

Variveis N2 Media Aparece na tela Digite o valor da Primeira Nota

Digite o valor da Segunda Nota 9.0 8.5 Aprovado. Mdia = 8.5


Tabela 9 - Exemplo de teste de mesa

Como as variveis foram preenchidas corretamente e o resultado impresso na tela est correto, o algoritmo criado est correto.

Vamos Revisar? Neste captulo, foi apresentado um ambiente para programao usando linguagem algortmica (o que pode facilitar a prtica dos exerccios). Alm disso, foi demonstrada uma forma de testar os algoritmos escritos, chamado teste de mesa. No prximo captulo, vamos estudar os tipos estruturados de dados. Eles servem para agrupar dados do mesmo tipo ou de tipos diferentes em conjuntos. E isso vai lhe dar muito mais poder de fogo na construo dos algoritmos.

81

Introduo a Programao

Captulo 4 Estruturas de Dados Homogneas


As estruturas de dados homogneas correspondem a conjuntos de elementos de um mesmo tipo, representados por um nico nome. E isso muito til! Quer ver? Imagine, por exemplo, como poderamos construir um algoritmo, que lesse os nomes de 500 pessoas e imprimisse um relatrio destes mesmos nomes ordenados alfabeticamente. Com o que sabemos at agora, isso no seria uma tarefa simples! Isso porque teramos que denir 500 variveis do tipo caracter e ler essas 500 variveis, como mostrado abaixo:
algoritmo Invivel var nome1, nome2, nome3, ..., nome499, nome500: caracter inicio escreva(Digite o nome 1: ) leia(nome1) escreva(Digite o nome 2: ) leia (nome2) ... escreva(Digite o nome 500: ) leia(nome500) ... malgoritmo

No seria possvel nem usar um lao para facilitar a leitura, visto que o nome das variveis muda (nom1, nome2, etc). Dessa forma, seria enorme o tamanho do algoritmo e o trabalho braal necessrio para constru-lo. Para resolver problemas como este e outros, existem as estruturas de dados. A declarao de uma estrutura de dados corresponde, na verdade, declarao de vrias posies de memria, cujo identicador difere apenas por um ndice. Onde este ndice corresponde a um valor numrico comeando por 0. E cada posio do conjunto, representada por um ndice, pode receber valores no decorrer do algoritmo, como se fosse uma varivel comum. Por exemplo, para o algoritmo anterior, poderamos ter uma estrutura de dados chamada Alunos e ela 82

Introduo a Programao

referenciar um conjunto de posies de memria, referenciadas por um ndice e em cada um dos ndices, poderia ser armazenado um nome.
0 Alunos Rosa 1 Ana 2 Pedro ... ... 498 499

As estruturas homogneas podem variar de acordo com a quantidade de ndices necessrios para localizar um valor dentro do conjunto. A estrutura de dados homognea unidimensional (Figura 28, estrutura V), tambm conhecida como vetor, necessita apenas de um ndice para localizao dos elementos do conjunto. J a estrutura de dados homognea bidimensional (Figura 28 estrutura M), tambm conhecida como matriz (aquela mesma matriz que voc estudou na matemtica!), necessita de dois ndices (linha e coluna) para localizao de um elemento dentro do conjunto. Existem ainda estruturas multidimensionais, onde utilizado um ndice para localizar o elemento em CADA uma das dimenses da estrutura. Por exemplo, uma estrutura tridimensional (Figura 28 estrutura T), como tem 3 dimenses, necessitaria de 3 ndices para localizar um elemento dentro da estrutura.

Figura 28 - Exemplos de Estruturas Homogneas

Cada elemento das estruturas (Figura 28) seria referenciado atravs de ndices (que sempre iniciam no valor zero). Para localizar um elemento do vetor V, usa-se apenas um ndice. Exemplos: V[1] = 4 e V[2] = 10. Para localizar um elemento dentro da matriz M usam-se dois ndices, o da linha e o da coluna. Por exemplo, M[1,1] = 55 , ou seja, o elemento da linha 1, coluna 1 da matriz. Outro exemplo, M[2,3] = 47.

83

Introduo a Programao

Para localizar um elemento dentro da estrutura tridimensional T, seriam usados 3 ndices. Um para localizar a cartela de elementos, depois, um ndice para a linha e outro para a coluna. Por exemplo, T[0,3,1] = 88, seria pegar a cartela 0, a da frente e, nela, a linha 3 e a coluna 1. Outro exemplo, T[2,0,1] = 6 Exploraremos nas sees a seguir apenas as estruturas unidimensionais e bidimensionais, apesar de ainda dar um exemplo de estrutura multidimensional.

Estruturas Homogneas Unidimensionais (Vetores)


Estruturas de dados homogneas unidimensionais, tambm conhecidas como vetores, so referenciadas por um nico ndice.
Estrutura de Dados Unidimensional = Conjunto de Dados onde cada elemento identicado por um nico ndice.

Por exemplo, se denssemos um conjunto de nomes de alunos de uma turma chamado Alunos, cada aluno gravado dentro da estrutura seria referenciado por um ndice. Essa estrutura est representada na Figura 29. Se desejssemos pegar o aluno da posio 4, usaramos o nome do vetor e, entre colchetes, o ndice desejado: Alunos[4], da conseguiramos pegar o valor Jos.

Figura 29 - Exemplo de Estrutura Unidimensional

O vetor declarado na rea de declarao de variveis e a sintaxe para declarao : nomeVetor : vetor [VI..VF] de Tipo 84

Introduo a Programao

onde: nomeVetor o nome que voc quer dar a varivel vetor na memria. vetor palavra reservada para indicar a criao da estrutura homognea [VI..VF] Vi o valor inicial do ndice do vetor e VF o valor nal. Eles devem ser SEMPRE nmeros inteiros positivos. Tipo = o tipo de elemento que voc quer gravar dentro do vetor. Lembrando que todas as posies do vetor tero esse mesmo tipo (inteiro, real, caracter ou lgico). Exemplo: o vetor alunos que apresentamos na Figura 29 poderia ser denido como: var alunos: vetor [0..6] de caracter Isso seria equivalente a ter 7 variveis de mesmo nome, s distinguveis pelos seus ndices (alunos[0], alunos[1], alunos[2], alunos[3], alunos[4], alunos[5] e alunos[6]). Outros exemplos de declaraes de vetores so:
// um vetor de 21 posies de nmeros inteiros idades: vetor [0..20] de inteiro //dois vetores de 10 posies de nmeros reais receitas, despesas: vetor [0..9] de real

Para se atribuir um valor a um elemento do vetor devemos utilizar o seguinte padro: nomeVetor[ndice] <- valor onde o ndice deve ser uma posio vlida, existente dentro do vetor. Por exemplo:
alunos[1] <- Joo da Silva idades[0] <- 35 idades[3] <- idades[0] //as posies cam com o mesmo valor i <- 5 idades[i] <- 45

Todos esses exemplos zeram uso de posies vlidas. Se eu tentasse acessar uma posio que no existe em um vetor, isso acarretaria um erro sinttico e seria indicado na compilao do 85

Introduo a Programao

algoritmo. Ex: alunos[10] <- Maria Aparecida. O vetor aluno, anteriormente denido, s tem sete posies, acessar a posio 10 causaria um erro. Para percorrer todas as posies de um vetor, deve-se usar alguma estrutura de repetio. Geralmente, utiliza-se a estrutura para..faa, porque sabemos o valor inicial e nal dos ndices do vetor. Por exemplo, para percorrer o vetor alunos, imprimindo o valor de cada posio, faramos o seguinte:
para indice de 0 at 6 faa escreva (alunos[indice]) mpara escreva(alunos[0]) escreva(alunos[1]) ... escreva(alunos[6])

Com isso, a cada vez que o lao fosse executado, uma posio diferente do vetor seria impressa, porque o valor do ndice estaria mudando. Vamos agora juntar tudo? Que tal criar um algoritmo completo que faa uso de vetor? Isso importante para voc tentar entender como manipular um vetor. Exemplo Completo: Faa um algoritmo para ler valores para preencher um vetor de 6 posies de nmeros inteiros, imprimir os valores lidos e, depois, imprimir quantos nmeros entre os lidos so nmeros positivos.
Algoritmo vetores var numeros: vetor [0..5] de inteiro // declaro o vetor // declaro um ndice para caminhar no vetor // e um contador para os nmeros positivos indice, numerosPos: inteiro inicio numerosPos <- 0 // para poder contar os nmeros positivos // um lao para ler os valores que vo preencher o vetor para indice de 0 ate 5 faca escreva(Digite o nmero da posio , indice) leia (numeros[indice]) // testa se nmero positivo se (numeros[indice] > 0) entao //se for positivo, incrementa o contador numerosPos numerosPos <- numerosPos + 1

86

Introduo a Programao

mse mpara // outro lao para imprimir os nmeros armazenados no vetor para indice de 0 ate 5 faca escreval (numeros[indice]) mpara // imprime o total de nmeros positivos contados escreva (Total de nmeros positivos: , numerosPos) malgoritmo

Para Reetir...
E se agora, eu quisesse que o algoritmo lesse 100 nmeros e no apenas 6? O que mudaria no algoritmo acima? Algoritmo vetores var numeros: vetor [0..99] de inteiro // declaro o vetor // declaro um ndice para caminhar no vetor // e um contador para os nmeros positivos indice, numerosPos: inteiro inicio numerosPos <- 0 // para poder contar os nmeros positivos // um lao para ler os valores que vo preencher o vetor para indice de 0 ate 99 faca escreva(Digite o nmero da posio , indice) leia (numeros[indice]) // testa se nmero positivo se (numeros[indice] > 0) entao //se for positivo, incrementa o contador numerosPos numerosPos <- numerosPos + 1 mse mpara // outro lao para imprimir os nmeros armazenados no vetor para indice de 0 ate 99 faca escreval (numeros[indice])

87

Introduo a Programao

mpara // imprime o total de nmeros positivos contados escreva (Total de nmeros positivos: , numerosPos) malgoritmo

J imaginou se tivesse de declarar um nome de varivel para cada um dos valores a serem lidos? Pois ... resolver o problema anterior sem vetores implicaria no rduo trabalho de ter que declarar e manipular 100 variveis! Mas usando vetores, voc s vai mudar a quantidade de posies do vetor e os limites de valores dentro dos laos e pronto! Todo o restante do algoritmo continuaria igual.

Estruturas Homogneas Bidimensionais (Matrizes)


Estruturas de dados homogneas bidimensionais, tambm conhecidas como matrizes, so referenciadas por dois ndices: um para indicar a linha da matriz e outro para indicar a coluna da matriz onde se encontra o dado.
Estrutura de Dados Multidimensional = Conjunto de Dados onde cada elemento identicado por MAIS de um ndice.

Por exemplo, como denir um conjunto para armazenar as mdias de 7 alunos obtidas em cada uma das 5 disciplinas que eles cursam? Poderamos fazer cada linha de uma matriz representar um aluno e cada coluna representar uma disciplina (vide Figura 30). Dessa forma, a mdia do quinto aluno, na primeira disciplina seria representada por: notas[4,0] e seria igual ao valor 10.0, como pode ser visto na Figura 30. Isso porque a linha 0 representa o primeiro aluno, a linha 1 o segundo aluno e assim por diante. A coluna 0 representa a primeira disciplina, a coluna 1 a segunda disciplina e assim por diante.

88

Introduo a Programao

Figura 30 - Exemplo de Estrutura Bidimensional

A matriz notas ocupa, ao todo, 35 posies de memria (notas de 7 alunos X 5 disciplinas), o que seria equivalente a criar 35 variveis isoladas no algoritmo, para poder resolver o mesmo problema. Mais complicado, no ? Ressalta-se que a matriz notas no armazena o nome dos alunos ou o nome das disciplinas. Ela armazena somente Notas! (lembre: estruturas de dados homogneas! Toda posio deve ter o mesmo tipo de dados, que, no caso, so valores reais que so as mdias). E como declarar isso? A matriz declarada na rea de declarao de variveis e a sintaxe para declarao : nomeMatriz : vetor [linhaI..linhaF, colunaI..colunaF] de Tipo onde: nomeMatriz o nome que voc quer dar a varivel matriz na memria. vetor palavra reservada para indicar a criao da estrutura homognea [linhaI..linhaF, colunaI..colunaF] a matriz precisa da denio de quantas linhas e quantas colunas a estrutura vai ter. Dessa forma, linhaI o valor inicial do ndice de linhas e linhaF o valor nal do ndice de linhas. J colunaI o valor inicial do ndice de colunas e colunaF o valor nal do ndice de colunas. 89

Introduo a Programao

Tipo = o tipo de elemento que voc quer gravar dentro da matriz. Lembrando que todas as posies tero esse mesmo tipo (inteiro, real, caracter ou lgico). Sendo assim, a matriz apresentada na Figura 30 poderia ser denida como: var notas: vetor [0..6, 0..4] de real Isso seria equivalente a ter as 35 variveis de mesmo nome, anteriormente mencionadas, que seriam distinguidas uma das outras pelos seus ndices (notas[0,0], notas[0,1], notas[0,2], notas[0,3], notas[0,4], notas[1,0] e assim por diante). Outros exemplos de declaraes de matrizes so:
// matriz de 3 linhas por 4 colunas de nmeros inteiros valores: vetor [0..2, 0..3] de inteiro // matriz de 2 linhas por 4 colunas de nomes alfanumricos nomes: vetor [0..1, 0..3] de caracter

Cada posio dentro da matriz identicada pelo valor do ndice da linha e pelo valor do ndice da coluna. Por exemplo, se fosse criada uma matriz M de 3 linhas por 3 colunas, cada posio seria acessada como ilustrado na Figura 31. A posio da linha 0, coluna 0 especicada por M00, a posio da linha 2, coluna 1, especicada por M21 e assim por diante.

Figura 31 - Exemplo de valores das posies de uma matriz

Para se atribuir um valor a um elemento de uma matriz necessrio usar esses dois ndices (anal, estrutura bidimensional), um para a linha e outro para a coluna: nomeMatriz[no linha, no coluna] <- valor O no da linha e o no da coluna devem ser posies vlidas, existente dentro da matriz. Por exemplo:
notas[0,1] <- 8.5 valores[1,1] <- 5 nomes[0,3] <- Maria

90

Introduo a Programao

Para percorrer todas as posies de uma matriz, devem-se usar duas estruturas para..faa aninhadas, ou seja, uma dentro da outra. Uma para cada dimenso. Ou seja, uma para caminhar nas linhas e outra para caminhar nas colunas. Por exemplo, para percorrer a matriz notas, imprimindo o valor de cada posio, faramos o seguinte:
// o primeiro para caminhar nas linhas para linha de 0 at 6 faca // o segundo para caminhar nas colunas // de uma mesma linha para coluna de 0 ate 4 faca escreva (notas[linha, coluna]) mpara escreva(notas[0,0]) escreva(notas[0,1]) escreva(notas[0,2]) escreva(notas[0,3]) escreva(notas[0,4]) escreva(notas[1,0]) escreva(notas[1,1]) escreva(notas[1,2]) escreva(notas[1,3]) escreva(notas[1,4]) ... escreva(notas[6,4])

Veja que quando entra no primeiro lao, o contador linha recebe o valor 0 e para esse mesmo valor, o contador coluna varia de 0 at 4. Depois volta-se para o contador linha que passar a ter o valor 1 e, novamente, o contador coluna varia de 0 at 4. Vamos agora juntar tudo? Para isso, faa um algoritmo para ler as mdias de 7 alunos em cada uma das cinco 5 disciplinas que eles cursam (a matriz notas da Figura 30). E depois imprimir essas notas.
Algoritmo matrizes var notas: vetor [0..6, 0..4] de real // declaro a matriz // declaro um ndice para linha e outro para coluna linha, coluna: inteiro inicio // primeiro l os valores das mdias // faz um lao para andar nas linhas para linha de 0 ate 6 faca // depois faz um lao para andar nas colunas para coluna de 0 ate 4 faca escreva(Digite disciplina , coluna) a mdia do aluno , linha, da

leia (notas[linha,coluna]) mpara mpara

91

Introduo a Programao

// um lao para imprimir os nmeros armazenados na matriz para linha de 0 ate 6 faca para coluna de 0 ate 4 faca escreva(Mdia, notas[linha, coluna]) mpara mpara malgoritmo linha, coluna, igual a,

Da mesma forma que no vetor, seria fcil aumentar a quantidade de alunos ou de disciplinas, apenas trocando o tamanho da matriz e os limites dos laos para..faa. Agora, s para ilustrar, como caria se a gente acrescentasse uma nova dimenso matriz anteriormente denida? Por exemplo, faa um algoritmo para ler as mdias de 7 alunos, em 5 disciplinas, em 10 cursos diferentes (estrutura tridimensional).
Algoritmo tridimensional var notas: vetor [0..6, 0..4, 0..9] de real // declaro um ndice para cada dimenso aluno, disciplina, curso: inteiro inicio // primeiro l os valores das mdias // faz um lao para andar nos alunos para aluno de 0 ate 6 faca // depois faz um lao para andar nas disciplinas para disciplina de 0 ate 4 faca // e, por m, um lao para andar nos cursos para curso de 0 ate 9 faca escreva(Digite a mdia: ) leia (notas[aluno, disciplina, curso]) mpara mpara mpara malgoritmo

Cada dimenso da matriz manipulada por um lao exclusivo. Por isso, ao se adicionar uma nova dimenso, deve-se criar uma 92

Introduo a Programao

nova varivel e um novo lao para manipul-la. Ou seja, criado um lao para..faca para cada dimenso a ser percorrida e a referncia ao elemento da estrutura feita pela quantidade de ndices correspondente quantidade de dimenses.

Aprenda Praticando Problema 1: Sobre Vetores - Faa um algoritmo para ler a idade de 20 pessoas e, depois, imprimir apenas as idades que estiverem acima da mdia das idades lidas. A partir da leitura do enunciado temos: Entrada: as idades de 20 pessoas. Processamento: calcular a mdia de idades. Sada: as idades que estiverem acima da mdia. Logo, neste algoritmo h duas opes, ou declarar 20 variveis idades ou usar vetores. Como apresentado neste captulo, o uso de vetores seria mais vantajoso e mais simples de manipular. Mas no poderia ser usada uma simples varivel um lao? No, porque precisamos saber as idades lidas, visto que aps calcular a mdia, temos de imprimir, entre as idades lidas, apenas aquelas que estiverem acima da mdia.
Algoritmo ExemploVetor var idades: vetor[0..19] de inteiro // 20 elementos: de 0 a 19 //ndice a varivel contadora para o lao para..faa soma, indice: inteiro media: real // servir para armazenar a mdia calculada inicio // para acumular a soma das idades, inicia soma com zero soma <-0 para indice de 0 at 19 faa escreval(informe a idade , indice) leia(idades[indice]) soma <- soma + idades[indice] mpara

93

Introduo a Programao

// ao sair do lao que soma as idades, calcula a mdia media <- soma / 20 // percorre o vetor para imprimir as idades que esto // acima da mdia das idades calculadas para indice de 0 at 19 faa se (idades[ndice] > media) entao escreva(idades[indice]) mse mpara malgoritmo

Problema 2: Sobre Matrizes - Faa um algoritmo para ler uma matriz 4 x 4 contando nmeros inteiros. Depois imprima a soma de cada linha da matriz e, ao nal, a soma de todos os elementos da matriz. A partir da leitura do enunciado temos: Entrada: matriz 4 x 4 de nmeros inteiros. Processamento: calcular a de cada linha da matriz e a soma de todos os elementos da matriz. Sada: o valor da soma de cada linha e o valor total da soma de todos os elementos da matriz. Logo, vamos comear o algoritmo criando a matriz. Vamos precisar de duas variveis, uma para acumular a soma das linhas e outra para acumular a soma total dos valores. Precisaremos tambm no algoritmo de dois laos, um para preencher a matriz e outro para calcular a soma das linhas e a soma total.
========================================================== Algoritmo ExemploVetor var numeros: vetor[0..3, 0..3] de inteiro //as variveis para acumular as somas somaLinha, somaTotal: inteiro // ndices para o lao para...faa para percorrer a matriz linha, coluna: inteiro inicio // para ler matrizes, voc vai precisar de dois laos // aninhados, um para andar nas linhas e outro para andar // nas colunas.

94

Introduo a Programao

para linha de 0 at 3 faa para coluna de 0 at 3 faa escreval(Digite um nmero ) leia(numeros[linha, coluna]) mpara mpara // zera, para acumular a soma total dos elementos da matriz somaTotal <-0 // depois da matriz preenchida, vamos fazer um lao para // realizar as devidas somas para linha de 0 at 3 faa // a cada nova linha a varivel que acumula a soma das // linhas deve ser zerada somaLinha <-0 para coluna de 0 at 3 faa somaLinha <- somaLinha + numeros[linha,coluna] mpara // quando sai do lao que anda nas colunas, terminou // a soma de uma linha toda. Por isso, imprimimos o // resultado da soma da linha e acumulamos este valor // na varivel somaTotal escreval(A soma da linha , linha, igual a , somaLinha) somaTotal <- somaTotal + somaLinha mpara // quando sair de todos os laos, imprime o resultado da // somaTotal escreva(A soma de todos os valores :, somaTotal) malgoritmo

Atividade de Estudo Construa algoritmos em linguagem algortmica para resolver os problemas abaixo. Lembre das boas prticas de programao!

95

Introduo a Programao

Estrutura Unidimensional 1) Leia um vetor chamado NUMEROS de 10 nmeros inteiros e exiba qual o maior e o menor nmero desse vetor. 2) Estenda a questo 1 para, a partir do vetor NUMEROS completamente preenchido, escrever os vetores VP (que ser um vetor de nmeros pares) e VI (que ser um vetor de nmeros mpares). 3) Estenda a questo 1 para, a partir do vetor NUMEROS, gerar o vetor OPOSTO, que corresponde ao vetor NUMEROS ao contrrio. Por exemplo, se o vetor NUMEROS tiver os nmeros 2 4 e 6, o vetor OPOSTOS ter os nmeros 6 4 e 2. 4) Leia um vetor LETRAS de 20 letras e, depois, escreva a quantidade de vogais que existem dentro do vetor e o percentual de consoantes. 5) Leia dois vetores A e B de tamanho 10. Depois gere, a partir deles, um vetor C, o qual corresponde intercalao dos elementos dos vetores A e B. Ou seja, voc deve colocar em C um elemento de A, depois um elemento de B, outro elemento de A, outro elemento de B e assim sucessivamente. Todos os elementos de A e B devem estar em C. 6) Estenda a questo anterior para, a partir dos vetores A e B, gerar o vetor INTERSECAO que corresponde aos elementos que esto no vetor A e tambm esto no vetor B. Ou seja, o vetor INTERSECAO ser um vetor com os elementos em comum entre os vetores A e B. Estrutura Bidimensional 7) Leia duas matrizes A e B (5 X 5) de nmeros inteiros e, a partir delas, gere a matriz SOMA (correspondente a soma das duas matrizes: A + B) e a matriz SUBTRACAO (correspondente subtrao entre as duas matrizes: A - B). 8) Leia uma matriz N (2X3) de nmeros inteiros e positivos e gere uma matriz C, do mesmo tamanho, de caracteres, onde cada posio C[linha, coluna] ter o valor P ou I dependendo de se o nmero da posio correspondente em N[linha, coluna] for PAR ou IMPAR, respectivamente. 9) Leia uma matriz 4 x 4 de nmeros inteiros e escreva os 96

Introduo a Programao

elementos da diagonal principal desta matriz. Para facilitar, observe o desenho abaixo. Em destaque est a diagonal principal. Como podem ser identicadas as posies desses elementos?

10) Leia as 4 notas de cada um dos 25 alunos de uma disciplina e escreva as notas que esto abaixo da mdia geral da turma e a porcentagem de notas acima da mdia da turma. 11) Leia uma matriz contendo o preo de 5 fornecedores para 10 produtos e calcule e imprima o preo mdio de cada fornecedor para os 10 produtos. 12) Leia um vetor com os nomes dos 50 alunos de uma turma e uma matriz com as trs notas desses alunos na mesma disciplina. Depois, calcule e escreva o nome dos alunos com mdia superior ou igual mdia geral da turma.

Super Desao Leia um vetor com os nomes dos 500 candidatos de um concurso, outro vetor com o gabarito das respostas (a, b, c, d ou e) das 60 questes da prova e uma matriz com as respostas dos candidatos para a prova. Ao nal, escrever os nomes dos candidatos que obtiveram a maior quantidade de acertos.

Vamos Revisar? Entre os conceitos avanados estudados neste captulo estava o de estruturas homogneas, que so conjuntos de dados de um nico tipo agrupados sob um mesmo nome. Essas estruturas so classicadas conforme o nmero de dimenses do conjunto ou, em outras palavras, conforme a quantidade de ndices necessrios para localizar um 97

Introduo a Programao

elemento dentro do conjunto (geralmente, um ndice para cada dimenso). Dessa forma, as estruturas podem ser: unidimensionais, bidimensionais, tridimensionais ou multidimensionais. O foco do nosso estudo nesta disciplina est apenas nas estruturas unidimensionais (vetores) e bidimensionais (matrizes). Vetores so estruturas de dados homogneas unidimensionais que permitem agrupar diversas informaes dentro de uma varivel nica. Estas correspondem a um grupo de posies contnuas na memria que possuem o mesmo nome e o mesmo tipo de dado e so acessadas por um NICO ndice. Seu tamanho denido por constantes inteiras e positivas e a denio do seu nome segue as mesmas regras aplicadas para identicadores Matrizes so estruturas de dados homogneas bidimensionais, ou seja, elas necessitam de dois ndices para individualizar um elemento do conjunto: um ndice para a linha e outro ndice para a coluna. Por exemplo, declarar uma matriz M, de 4 linhas por 3 colunas (4 x 3), constituda de elementos numricos inteiros far com que passe a existir uma estrutura de dados agrupada na memria do computador, capaz de armazenar 4x3=12 elementos inteiros, endereveis por um par de ndices, com o primeiro indicando a linha e o outro, a coluna.

98

Introduo a Programao

Captulo 5 SubAlgoritmos
A modularizao uma caracterstica muito importante no desenvolvimento de programas. um mtodo utilizado para facilitar a construo de grandes algoritmos, atravs de sua diviso em pequenas etapas, que so os subalgoritmos. Ao invs de escreverse um algoritmo grande, escrevem-se vrios algoritmos menores, os quais, no isoladamente, mas em conjunto, resolvem o problema proposto. o dividir para conquistar. Outra ocasio em que o uso de subalgoritmos conveniente quando uma determinada tarefa efetuada em diversos lugares no mesmo algoritmo. Nisso, ao invs de escrever o mesmo trecho diversas vezes, pode-se escrever um subalgoritmo com aquele trecho de cdigo e cham-lo diversas vezes. Vamos ilustrar isso com um exemplo: Faa um algoritmo para ler trs valores inteiros N1, N2 e N3 e coloc-las em ordem crescente, para ao nal imprimir os valores. Use apenas estruturas simples, no precisa usar vetores ou algo do gnero.
Algoritmo ordena var N1, N2, N3, aux: inteiro inicio // primeiro l os valores escreva(Digite N1: ) leia(N1) escreva(Digite N2: ) leia(N2) escreva(Digite N3: ) leia(N3) // compara os dados para colocar o maior valor em N3 se (N1 > N2) e (N1 > N3) ento aux <- N1 N1 <- N3 N3 <- aux seno se (N2 > N1) e (N2 > N3) ento

99

Introduo a Programao

aux <- N2 N2 <- N3 N3 <- aux mse mse // agora que o maior j est em N3, basta ver quem // o maior entre os outros dois slementos se (N1>N2) ento aux <- N1 N1 <- N2 N2 <- aux mse escreval(N1, malgoritmo , N2, , N3)

Analisando o cdigo, vemos que h trechos que realizam exatamente a mesma tarefa: trocar o valor de dois elementos. Justamente trechos como esses so bons candidatos a subalgoritmos. Mas vamos denir melhor, o que mesmo um subalgoritmo? Bem, um subalgoritmo um algoritmo menor que auxilia o algoritmo principal atravs da realizao de uma determinada subtarefa bem denida (at agora, tudo que zemos estava s no algoritmo principal). O subalgoritmo tambm chamado de subprograma, subrotina ou mdulo. Ele declarado antes do incio do algoritmo principal e pode ser chamado em qualquer ponto aps sua declarao. Ou seja, dentro do algoritmo principal ou a partir de outro subalgoritmo denido abaixo dele. Por exemplo, na Figura 32, o subalgoritmo 1.1 chamado a partir do subalgoritmo 1. Os subalgoritmos so chamados dentro do corpo do algoritmo principal ou de outro subalgoritmo como se fossem comandos. Da o uxo de execuo do que est sendo executado desviado para executar o subalgoritmo e, aps seu trmino, a execuo continua a partir do ponto seguinte chamada do subalgoritmo (Figura 32). Ou seja, a chamada de um subalgoritmo simplesmente gera um desvio provisrio no uxo de execuo do algoritmo principal.

100

Introduo a Programao

Figura 32 - Esquema de uma chamada a subalgoritmo

E que vantagens voc vai ter fazendo uso de subalgoritmos? Eles reduzem o tamanho do algoritmo como um todo. Porque, por exemplo, trechos repetidos s sero implementados uma vez em um subalgoritmo e, depois, sero apenas chamados. Facilitam a compreenso e visualizao do que faz o algoritmo, porque o desenvolvimento modularizado faz com que se possa pensar no algoritmo por partes Facilidade de depurao (correo/acompanhamento): mais fcil corrigir/detectar um erro apenas uma vez do que dez vezes, em dez trechos diferentes. Facilidade de alterao do cdigo: se preciso alterar, alterase apenas uma vez, no subalgoritmo. Generalidade de cdigo com o uso de parmetros: possvel escrever algoritmos para situaes genricas (voc vai ver quando falarmos dos parmetros!). Para se criarem subalgoritmos, preciso descrev-los/declarlos aps a declarao das variveis do algoritmo principal e antes do incio do mesmo.
Algoritmo ordena var N1, N2, N3, aux: inteiro // ***** LOCAL PARA A DECLARAO DOS SUBALGORITMOS ****** inicio <-- Algoritmo Principal

H dois tipos de subalgoritmos: procedimentos e funes. Vamos detalhar cada um deles a seguir.

101

Introduo a Programao

Procedimentos
Um procedimento um subalgoritmo que no retorna, explicitamente, valores ao algoritmo principal ou a outro subalgoritmo que o tenha chamado. Ele pode retornar valores apenas por meio dos parmetros, e nunca explicitamente como no caso das funes (que veremos depois) que usam a instruo Retorne. Sua declarao, como descrito anteriormente, deve estar entre o nal da declarao de variveis do algoritmo principal e a linha inicio do mesmo e obedece seguinte sintaxe:
procedimento nomeProcedimento ([declaraes-de-parmetros]) [var declarao de variveis locais] inicio //Seo de Comandos mprocedimento

onde: nomeProcedimento obedece s mesmas regras de

nomenclatura de um identicador (vistas no Captulo 2). [declaraes-de-parmetros] Um procedimento pode no receber nenhum parmetro ou pode ter um ou mais parmetros. Parmetros so a forma de comunicao entre quem chama o procedimento e o procedimento. So valores de entrada, que precisam ser enviados por quem chamou o procedimento. Essas declaraes vo ter o seguinte formato: [var] sequncia-de-parmetros : tipo-de-dado Cada declarao entre um mesmo tipo de dado separada por vrgula, mas a declarao entre tipos de dados diferentes separada por ponto-e-vrgula. A presena (opcional) da palavra-chave var indica que a passagem de parmetros feita por referncia; caso contrrio, a passagem de parmetros ser feita por valor (explicaremos isso melhor na subseo a seguir). [var declarao de variveis locais] De modo anlogo ao algoritmo principal, a seo de declarao de variveis locais comea com a palavra-chave var, e continua com a seguinte sintaxe: <lista-de-variveis> : <tipo-de-dado>. As variveis locais s so vistas e s podem ser usadas dentro do procedimento 102

Introduo a Programao

Na seo de comandos, voc pode ter qualquer instruo que foi vista at agora: estrutura sequencial, condicional ou de repetio, comandos de entrada e sada de dados, operaes etc. Lembre que um subalgoritmo (procedimento ou funo) um algoritmo, s que menor, especco para realizar uma tarefa. Logo, pode ter tudo que um algoritmo pode ter. E depois do procedimento declarado, como eu fao uso dele? Como eu posso cham-lo?

Figura 33 - Chamando um procedimento

Chamada de um Procedimento A chamada de um procedimento feita pelo nome dele, como um comando simples, dentro do algoritmo principal, de outro subalgoritmo ou dentro do prprio procedimento (quando um procedimento chama ele mesmo, est se fazendo uso de recurso esse assunto ser apresentado em uma outra disciplina). Sintaxe: nomeProcedimento(valores para os parmetros) Note que parecido com a ativao do comando instrues Leia e Escreva, porque eles so tambm procedimentos. Um procedimento no pode ser chamado no meio de expresses ou em atribuies como no caso de funes. Ao se chamar um procedimento, deve-se observar se ele tiver parmetros denidos. Se ele tiver, quem o chamou vai ter que passar um valor para cada parmetro. A quantidade dos parmetros, sua sequncia e respectivos tipos no podem mudar: devem estar de acordo com o que foi especicado na sua correspondente declarao. Que tal um exemplo completo agora, para ver se voc est entendendo? Vamos pegar aquele algoritmo ordena do incio do 103

Introduo a Programao

captulo e vamos agora, implement-lo usando procedimento. O trecho que se repete, que o da troca de valor de duas variveis, o que vai ser implementado como procedimento.
Algoritmo ordena2 var N1, N2, N3: inteiro // aps declarao de variveis, dene-se o procedimento procedimento troca (var num1, num2: inteiro) var aux: inteiro // declarao de varivel local inicio aux <- num1

num1 <- num2 num2 <- aux mprocedimento inicio // primeiro l os valores escreva(Digite N1: ) leia(N1) escreva(Digite N2: ) leia(N2) escreva(Digite N3: ) leia(N3) //faz comparaes e coloca o maior valor na varivel N3 se (N1 > N2) e (N1>N3) ento troca(N1, N3) seno se (N2 > N1) e (N2 > N3) ento troca(N2, N3) mse mse // agora que o maior j est em N3, basta ver quem o // maior entre os outros dois slementos se (N1>N2) ento troca(N1,N2) mse escreval(N1, malgoritmo , N2, , N3)

104

Introduo a Programao

Observe: o procedimento troca foi denido da linha 5 a linha 11. Ou seja, depois da declarao de variveis do algoritmo principal (que o ordena2) e antes do incio do mesmo (linha12). O procedimento troca possui dois parmetros (linha 5) chamados num1 e num2. Como na declarao dos parmetros usou-se a palavra var, a passagem est sendo feita por referncia (explicaremos isso melhor a seguir). Tambm foi denida uma varivel local para o procedimento (linha 6), chamada aux. Voc consegue notar a diferena entre varivel local e parmetro? O valor de cada parmetro (que chamado de argumento) vai ser recebido de quem chamar o procedimento, ou seja, ele recebe valores externos ao procedimento. J a varivel local, ela serve para ser usada dentro do procedimento, ela no recebe valor externo algum. O procedimento internamente tem seus comandos, que so os que realizam a troca de dois valores (linha 7 a 11). Aps declarado, o procedimento vai poder ser chamado dentro do algoritmo principal. As chamadas so feitas nas linhas 22, 25 e 31. Na hora que o procedimento chamado (para cham-lo s usar o nome dele) deve-se observar quais valores ele est esperando como parmetro. Da declarao do procedimento (linha 5) sabemos que ele est esperando duas variveis inteiras. Por isso, na hora de chamar o procedimento, temos de enviar para ele o que ele est esperando. No caso, na primeira chamada, passamos como argumento N1 e N3 (linha 22), na segunda chamada passamos como argumento N2 e N3 (linha 25) e na terceira chamada passamos N1 e N2 (linha 31), que, por causa da declarao dos parmetros do procedimento (linha 5), teriam de ser todas variveis do tipo inteiro.

Para Reetir...
Mas como funciona essa tal passagem de parmetros?

Passagem de Parmetros
Passagem de parmetros um esquema que torna a comunicao entre o subalgoritmo e quem o ativa mais clara, denindo muito bem as informaes que entram e que saem de um subalgoritmo e a maneira 105

Introduo a Programao

como estas informaes sero trocadas com a unidade que o ativou. Neste esquema, so denidos os parmetros na declarao do subalgoritmo (procedimento ou funo) e os argumentos na chamada do subalgoritmo. Ou seja, os argumentos so o que passamos para o subalgoritmo, no momento da chamada do mesmo. Argumentos e parmetros devem corresponder por tipo e posio. Se uma destas condies falhar, ocorrer um erro de compilao. Por exemplo, se for denido um procedimento:
// denio dos parmetros procedimento teste (valor: inteiro; nome: caractere)

Voc no poderia ativar esse procedimento no programa chamador de nenhuma das formas abaixo:
teste (Maria, 10)

a posio dos argumentos no equivale a declarao.


teste (10, 2.5)

o tipo dos argumentos est errado, no corresponde aos parmetros do procecimento. Supondo x do tipo real e com valor 2.5 e y do tipo caractere com valor Ana.
teste(x, y)

o tipo dos argumentos est errado. O correto seria passar um valor inteiro e um valor do tipo caractere, nesta ordem, que o que o procedimento est esperando como entrada, para ser ativado. No ltimo exemplo, quando o procedimento teste chamado, o argumento X do tipo real associado ao parmetro chamado valor do procedimento que do tipo inteiro, por isso estaria errado. Logo, tornamos a frisar, os argumentos e parmetros devem corresponder em tipo, quantidade e posio. A substituio dos parmetros pelos argumentos no ato da invocao ou chamada de um subalgoritmo denominada de passagem de parmetros e ela realizar-se por dois mecanismos distintos: passagem por valor (ou por cpia) e passagem por referncia. Passagem de Parmetros por Valor Quando um parmetro passado por valor, o valor do argumento do momento da ativao avaliado e COPIADO para o parmetro correspondente do subalgoritmo. Ou seja, o argumento apenas um valor de entrada para o parmetro correspondente. Dessa forma, 106

Introduo a Programao

qualquer alterao feita, dentro do subalgoritmo, no parmetro no vai afetar o argumento fora da subalgoritmo. Isto porque o que est sendo manipulado dentro do subalgoritmo uma cpia do argumento. A passagem de parmetros por valor indicada pela ausncia da palavra VAR na parte de declarao de parmetros do subalgoritmo. Ela usada quando no desejamos alterar o valor do argumento, apenas utiliz-lo. Vamos dar um exemplo. Suponha um algoritmo simples que faz uso de um procedimento para incrementar em uma unidade o valor de uma varivel e imprime o valor da varivel antes e depois da chamada do procedimento.
Algoritmo exemploValor var numero: inteiro procedimento incrementa(valor: inteiro) inicio valor valor + 1

// imprime 2 escreva(Dentro do procedimento, Valor = : , valor) mprocedimento inicio numero 1

// imprime 1 escreva(Antes do procedimento, nmero = , numero) incrementa(numero) // imprime 1 escreva(Depois do procedimento, nmero = , numero) malgoritmo

Quando algoritmo inicia (linha 8) a varivel nmero recebe o valor 1 (vide Figura 33). Por isso, a primeira impresso (linha 10) vai imprimir a frase Antes do procedimento, nmero = 1.

Figura 33 Exemplo da memria do computador ANTES e DEPOIS da chamada do procedimento

107

Introduo a Programao

Da o procedimento chamado (linha 11). Quando ele chamado feita uma passagem por valor (veja que na declarao do parmetro do procedimento na linha 3, no foi usada a palavra var) do argumento numero para o parmetro valor. Ou seja, feita uma cpia do valor 1 que est dentro da varivel numero do algoritmo principal, para a varivel chamada valor que pertence ao procedimento (Figura 34). As variveis e parmetros do procedimento s passam a existir na memria do computador, a partir do momento em que o procedimento chamado.

Figura 34 - Exemplo da memria do computador assim que o procedimento chamado

Dentro do procedimento o parmetro valor incrementado (linha 5 e Figura 35), por isso, dentro do procedimento o que impresso (linha 6) : Dentro do procedimento, Valor = 2.

Figura 35 - Exemplo da memria do computador DURANTE a execuo do procedimento

Quando o procedimento encerrado (linha 7), todas as variveis e parmetros que foram criados pelo mesmo na memria so retirados dela. Ou seja, tudo que criado pelo procedimento deixa de existir, voltando para o que est representado na Figura 33. Dessa forma, vemos que o que foi manipulado durante a execuo do procedimento foi uma cpia e, por isso, o valor passado como argumento (a varivel numero) no afetado por qualquer modicao feita dentro do procedimento. Tanto que a impresso realizada aps a chamada do procedimento (linha 12) imprime Depois do procedimento, nmero = 1. Ou seja, imprime o mesmo valor de antes da chamada do procedimento. Essa a losoa da passagem de parmetros por valor.

108

Introduo a Programao

Para Reetir...
E agora, qual a diferena para a passagem por referncia?

Passagem de Parmetros por Referncia A passagem de parmetros por referncia (tambm chamada de por endereo) utilizada quando desejamos alterar o valor do ARGUMENTO passado por quem ativa o subalgoritmo. Na verdade, na passagem de parmetros por referncia, toda alterao feita no parmetro vai alterar o argumento associado a este parmetro. Assim, quando a passagem por referncia, isto signica que o parmetro de entrada e sada. Quando a passagem por referncia, o que fornecido ao parmetro do subalgoritmo no uma cpia do valor do argumento, mas a sua localizao na memria do computador (endereo de memria). Ou seja, quando utilizada uma passagem por referncia, o parmetro e o argumento partilham o mesmo espao de memria e, consequentemente, qualquer modicao feita no parmetro reete no argumento. A passagem por referncia indicada pela presena da palavra VAR antecedendo a declarao do parmetro do subalgoritmo.
procedimento incrementa(var valor: inteiro)

Todo parmetro passado por valor, exceto quando indicado que a passagem de parmetros por referncia (quando for utilizada a palavra reservada var). Vamos agora mostrar o uso da passagem por referncia no mesmo exemplo dado anteriormente para a passagem por valor. E vamos observar o que muda.
Algoritmo exemploReferencia var numero: inteiro procedimento incrementa(var valor: inteiro) inicio valor valor + 1

// imprime 2 escreva(Dentro do procedimento: , valor) mprocedimento inicio

109

Introduo a Programao

numero

// imprime 1 escreva(Antes do procedimento, nmero = , numero) incrementa(numero) // imprime 2 escreva(Depois do procedimento, nmero = , numero) malgoritmo

Quando algoritmo inicia (linha 8) a varivel nmero recebe o valor 1 (vide Figura 36). Por isso, a primeira impresso (linha 10) vai imprimir a frase Antes do procedimento, nmero = 1.

Figura 36 Exemplo da memria do computador ANTES da chamada do procedimento

Da o procedimento chamado (linha 11). Quando ele chamado feita uma passagem por referncia (veja que na declarao do parmetro do procedimento na linha 3, foi usada a palavra var) do argumento numero para o parmetro valor. Ou seja, o argumento numero e o parmetro valor vo compartilhar o mesmo espao de memria (Figura 37). Lembrando que as variveis e parmetros do procedimento s passam a existir na memria do computador, a partir do momento em que o procedimento chamado.

Figura 37 - Exemplo da memria do computador assim que o procedimento chamado

Dentro do procedimento o parmetro valor incrementado (linha 5), automaticamente, o argumento numero tambm incrementado, porque eles referenciam a mesma posio de memria (Figura 38). Dentro do procedimento o que impresso (linha 6) : Dentro do procedimento, Valor = 2.

110

Introduo a Programao

Figura 38 - Exemplo da memria do computador DURANTE a execuo do procedimento

Quando o procedimento encerrado (linha 7), todas as variveis e parmetros que foram criados pelo mesmo na memria so retiradados dela. Dessa forma, a referncia do parmetro valor desacoplada do argumento numero, porm as mudanas que foram feitas permanecem (Figura 39). Desse modo, vemos que o que foi manipulado durante a execuo do procedimento afeta, diretamente, os argumentos passados por referncia. Por isso, a impresso realizada aps a chamada do procedimento (linha 12) imprime Depois do procedimento, nmero = 2. Ou seja, o valor do argumento do algoritmo principal foi realmente afetado pelo que foi executado dentro do procedimento.

Figura 39 - Exemplo da memria do computador DURANTE a execuo do procedimento

Em um mesmo subalgoritmo, podemos fazer uma passagem por valor e outra por referncia. Veja o exemplo abaixo.
algoritmo exemploPassagemParametros var N1,N2 : inteiro procedimento muda(X:inteiro; var Y:inteiro) inicio X <- 1 Y <- 1 mprocedimento inicio N1 <- 0 N2 <- 0 muda(N1,N2)

111

Introduo a Programao

escreva(N1) escreva(N2) malgoritmo

Que valores de N1 e N2 sero impressos (linhas 12 e 13), aps a chamada do procedimento? O argumento N1 ser associado ao parmetro X e ser feita uma passagem de parmetro por valor (no existe a palavra reservada var na denio do parmetro). Dessa forma, como a passagem foi por valor, o contedo de N1 no modicado. Assim, N1 continuaria com o valor zero. J o argumento N2 ser associado ao parmetro Y e ser feita uma passagem por referncia (veja que existe a palavra var antes da denio do parmetro Y). Desse modo, como foi possvel observar, a modicao feita em Y afetou diretamente N2. Sendo assim, o valor de N2 a ser impresso seria o valor UM. Ficou claro? Espero que sim! Apesar de termos dado todos os exemplos de passagem de parmetro usando procedimentos, esses tipos de passagem de parmetro acontecem tambm nas funes. Usamos procedimentos para ilustrar apenas porque s os explicamos at agora.

Escopo de Variveis
Cada subalgoritmo, alm de ter suas prprias variveis (chamadas de variveis locais), que existem apenas durante a sua execuo e s fazem sentido dentro do subalgoritmo, podem tambm ter acesso s variveis de quem o chamou e s variveis denidas no algoritmo principal. Na verdade, as variveis declaradas na parte inicial do algoritmo principal cam disponveis para uso em qualquer parte desse algoritmo ou por qualquer subalgoritmo. Por isso, elas so chamadas de variveis globais. Porm, para manter a modularidade dos programas, no recomendado que se faa uso de variveis globais dentro dos subalgoritmos. E sim, ao invs disso, importante que se use passagem de parmetros. As variveis globais existem na memria do computador durante toda a execuo do algoritmo, ou seja, at que o algoritmo completo chegue ao seu nal. J as variveis locais somente so criadas quando o subalgoritmo que as contm ativado e, ao seu trmino, elas 112

Introduo a Programao

so liberadas/desalocadas da memria, tornando-se inacessveis.


algoritmo exemploEscopo var N1,N2, resultado : inteiro procedimento soma(X, Y:inteiro; var Z:inteiro) inicio Z <- X + Y mprocedimento procedimento troca(var A, B:inteiro) var aux: inteiro inicio aux <- A A <- B B <- aux mprocedimento inicio N1 <- 10 N2 <- 5 soma(N1, N2, resultado) troca(N1, N2) escreva(N1, N2, resultado) malgoritmo

As variveis N1, N2 e resultado so variveis globais, porque foram denidas na declarao de variveis do algoritmo principal (linha 2). Por isso, elas podem ser acessadas e manipuladas de qualquer lugar. E vo existir na memria do computador at o nal do algoritmo (linha 23). As variveis X, Y e Z denidas dentro do procedimento soma (linha 4) s podem ser manipuladas e acessadas dentro deste procedimento. As variveis A e B (parmetros) e aux (varivel local) denidas dentro do procedimento troca (linhas 9 e 11) s podem ser acessadas e manipuladas dentro deste procedimento.

113

Introduo a Programao

Funes
O conceito de funes originrio da ideia de funo matemtica, onde um valor calculado a partir de outro(s) valor(es) fornecido(s) funo. No contexto de programao, uma funo um subalgoritmo que, alm de executar uma determinada tarefa, retorna, explicitamente, um valor para quem a chamou (o algoritmo principal ou a outro subalgoritmo que a tenha chamado), que o resultado de sua execuo. Esse valor retornado atravs da instruo Retorne. E, devido a esse fato, a chamada de uma funo aparece como uma expresso, e no apenas como um comando, como foi o caso do procedimento. Porque tem de existir alguma varivel para receber ou alguma expresso para usar o valor retornado pela funo. A declarao da funo, de forma anloga ao procedimento, deve estar entre o nal da declarao de variveis do algoritmo principal e a linha inicio do mesmo e obdece seguinte sintaxe:
funcao nomeFuncao ([declaraes-de-parmetros]): Tipo de Retorno [var declarao de variveis locais] inicio // Seo de comandos retorne varivel ou expresso de retorno mfuncao

onde nomeFuncao obedece s mesmas regras de nomenclatura de um identicador (vistas no captulo 1). [declaraes-de-parmetros] Uma funo pode no receber nenhum parmetro ou pode receber um ou mais parmetros, por valor ou por referncia. Essas declaraes vo ter o seguinte formato: [var] sequncia-de-parmetros : tipo-de-dado Cada declarao entre um mesmo tipo de dado separada por vrgula, mas a declarao entre tipos de dados diferentes separada por ponto-e-vrgula. Tal como no procedimento, a presena (opcional) da palavra-chave var indica que a passagem de parmetros feita por referncia; caso contrrio, a passagem de parmetros ser feita por valor (como explicado anteriormente). : Tipo de Retorno a funo retorna explicitamente um valor para quem a chamou. Esse tipo de retorno especica justamente o que o 114

Introduo a Programao

prprio nome indica: qual o tipo de dados que a funo vai retornar. [var declarao de variveis locais] De modo anlogo ao algoritmo principal, a seo de declarao de variveis locais comea com a palavra-chave var, e continua com a seguinte sintaxe: <lista-de-variveis> : <tipo-de-dado>. As variveis locais s so vistas e s podem ser usadas dentro da funo. Na seo de comandos, voc pode ter qualquer instruo, tal qual j foi explicado quando apresentamos os procedimentos. retorne varivel ou expresso de retorno - a instruo retorne um comando simples usado apenas nas funes e tem o efeito de parar a execuo da funo e enviar um valor para o algoritmo principal ou para outro subalgoritmo que a tenha chamado. A varivel ou expresso de retorno deve ser exatamente do mesmo tipo especicado na declarao da funo. Por exemplo, se foi dito que a funo retornava um valor inteiro. A varivel ou expresso de retorno tem de ser um valor inteiro. Toda funo deve ter em seu corpo de instrues, pelo menos, uma instruo Retorne. E depois da funo declarada, como eu fao uso dela? Como eu posso cham-la?

Figura 40 - Chamando uma funo

Chamada de uma Funo A chamada de uma funo, por parte do algoritmo principal ou por outro subalgoritmo, feita pelo simples aparecimento de seu nome, com os respectivos parmetros entre parnteses, dentro de uma expresso ou atribuio. Lembrando que os argumentos usados no ato da chamada da funo devem manter uma correspondncia (quantidade, ordem e tipo) com os parmetros denidos na funo. A funo executada e, ao seu trmino, o trecho do comando que a chamou substitudo pelo valor retornado pela mesma dentro 115

Introduo a Programao

da expresso ou atribuio em que se encontra e a avaliao da expresso ou atribuio prossegue normalmente. Vamos dar dois exemplos, para tentar deixar tudo mais claro: o primeiro chama a funo de dentro de uma expresso e o segundo chama a funo usando atribuio. Suponha que precisamos fazer um algoritmo, que faa uso de funo, para checar se uma pessoa maior ou menor de idade, dando a mensagem apropriada.
algoritmo exemploFuncao var idade: inteiro funcao checaIdade(id:inteiro): logico inicio se (id >= 18) entao retorne verdadeiro senao retorne falso mse mfuncao inicio escreva(Digite o valor da idade: ) leia(idade) se (checaIdade(idade)=verdadeiro) entao escreval(A pessoa de maior ) senao escreval(A pessoa de menor ) mse malgoritmo

A funo declarada na linha 3 e tem como tipo de retorno um valor lgico. Por causa disso, o que pode ser retornado no comando retorne so apenas valores lgicos (linhas 6 e 8). Veja que a funo foi chamada dentro de uma expresso (linha 14) que faz parte de uma estrutura condicional. O SE s ser avaliado, depois que a funo for chamada e executada, pois ele precisa do valor de retorno da mesma para poder realizar a comparao. Outra forma de chamar uma funo usando uma atribuio.
algoritmo exemploFuncao2 var num1, num2, resultado: inteiro

116

Introduo a Programao

funcao somar(x, y:inteiro): inteiro var resposta: inteiro inicio resposta <- x + y retorne resposta mfuncao inicio escreva(Digite Num1: ) leia(num1) escreva(Digite Num2: ) leia(num2) resultado <- somar(num1, num2) escreva(A soma dos valores : , resultado) malgoritmo

A funo declarada na linha 3 e tem como tipo de retorno um valor inteiro. Por causa disso, o que pode ser retornado no comando retorne s pode ser um valor inteiro (linha 7). Veja que a funo foi chamada dentro de uma atribuio (linha 14). Nisso a funo ativada/chamada e executada e o valor que ela retornar ser atribudo varivel resultado do algoritmo principal.

Ateno
Vrios programas, linguagens e ambientes possuem funes pr-denidas que podem ser utilizadas diretamente. Ou seja, j esto implementadas e prontas para usar. No VisuAlg tambm tem disso! Para saber as funes pr-denidas do VisuAlg, pressione (CTRL + J) dentro do ambiente do VisuAlg e aparecer uma lista delas (Figura 41). Para utiliz-las, selecione a funo desejada com o mouse ou as setas de direo do teclado e aperte o Enter. Depois s fornecer os parmetros que a funo esteja precisando para executar.

Figura 41 - Funes Pr-denidas do VisuAlg

117

Introduo a Programao

Aprenda Praticando Muitas novidades nesse mdulo, no? Ento vamos dar um exemplo relacionado com cada assunto, para que voc possa compreender melhor a construo dos algoritmos. Problema 1: Subalgoritmo - Faa um algoritmo para ler vrios nmeros inteiros e positivos (at que seja digitado o valor zero) e imprimir na tela se o nmero par ou mpar. Se o nmero lido no for positivo, d uma mensagem apropriada e no julgue o nmero. Faa uso de subalgoritmo para resolver o problema. A partir da leitura do enunciado temos: Entrada: vrios nmeros inteiros e positivos (at que seja digitado o valor zero). Processamento: testar se os nmeros so pares ou mpares. Sada: dizer se o nmero par ou mpar ou dar uma mensagem apropriada se o nmero for negativo. H vrias formas de resolver o problema. Pedi para resolverem usando subalgoritmo para podermos exercitar. A parte do problema que est bem denida e lembra um subalgoritmo, justamente a parte de julgar se o nmero par ou mpar. Vamos implementar isso usando um procedimento. Para a estrutura de repetio, como no temos uma quantidade denida de nmeros para ler, no devemos usar o lao para..faa. Podemos usar qualquer um dos outros.
========================================================== Algoritmo ExemploSubalgoritmo var numero: inteiro // o nmero a ser lido // subalgoritmos devem ser declarados antes do incio do // algoritmo principal a passagem de parmetros ser por // valor, porque no desejamos fazer nenhuma modicao no // valor passado como parmetro. Ele serve apenas como dado // de entrada procedimento julgar (valor: inteiro) inicio // para checar se o nmero par, uso o MOD que pega o

118

Introduo a Programao

// resto da diviso inteira. Porque se o nmero for // divisvel por dois (resto zero), ele par se (valor MOD 2 = 0) entao escreva(O nmero par!) senao escreva(O nmero mpar) mse mprocedimento inicio // vou usar o lao REPITA, para executar a leitura pelo // menos uma vez repita escreval(Digite um nmero ) leia(numero) // como o usurio pode digitar na 1 vez o zero // (condio de parada) s devemos continuar se o // valor lido for diferente de zero se (numero <> 0) entao // o enunciado do problema pede para s trabalharmos // com nmeros positivos logo, se ele for negativo, // temos de dar a mensagem apropriada ao usurio se (numero < 0) entao escreva(Digite apenas nmeros positivos!) senao // se for positivo, chamamos o procedimento julgar julgar(numero) mse mse ate (numero = 0) // condio de parada do lao malgoritmo

Conhea Mais Para saber mais sobre o VisuAlg e sobre dicas para uso da linguagem algortmica dentro dele, voc pode acessar a pgina da 119

Introduo a Programao

ferramenta: http://www.apoioinformatica.inf.br/visualg/linguagem.htm Ou dar uma lida nos seguintes materiais que estaro disponibilizados no ambiente: Manual do VisuAlg e A Linguagem do VisuAlg 2.0 (este tambm pode ser encontrado em: http://www. scribd.com/doc/2177331/Linguagem-Visualg2-0). Esse material tem todo o assunto referente a linguagem algortmica. Quanto aos assuntos Estruturas de Dados Homogneas e SubAlgoritmos, voc pode ler os captulos referentes a esses assuntos em qualquer livro sobre algoritmos ou lgica de programao. Porm, continuo indicando mais fortemente os livros: FORBELLONE, Andr Luiz. Lgica de Programao. Makron Books, 3. Edio, 2005. FARRER, Harry; BECKER, C. G.; FARIA, E.C.; MATOS, H.F.; SANTOS, M.A.; MAIA, M.L. Algoritmos Estruturados. Editora LTC, 3. Edio, 1999. Outra fonte de pesquisa pode ser a internet. Voc pode consultar pelo ttulo de cada assunto (por exemplo, Vetores ou Estrutura de Dados Unidimensional) que conseguir uma srie de apostilas, apresentaes, tutoriais, etc. Alguns exemplos de sites de outros professores so:
http://www.manzano.pro.br/algoritmo.html http://200.136.79.4/informatica/alunos/tutoriais/C/LCPP_aulaIII_vetor. htm http://www.ucb.br/programar/algoritmo/estruturadedadosV.htm

(muito

bom e com exerccios on-line para voc responder!)


http://www.ic.unicamp.br/~ducatte/mc102/ http://mc102.unicamp.googlepages.com/agenda http://david.coresoft.com.br/wiki/doku.php?id=ip http://www.gia.deinf.ufma.br/~geraldo/disciplinas/into_ee_2008_2.html http://almerindo.devin.com.br/index.php?option=content&task=view&id= 138&Itemid=33 http://www.airamez.com.br/Material.htm http://www-usr.inf.ufsm.br/~pasin/algo/index.html http://www.inf.ufrgs.br/~cora/Inf040/Aula06.ppt

120

Introduo a Programao

http://www.dcc.ufrj.br/~jonathan/docsPascal/apostila/capa.html (apesar

de mostrar o material em pascal, voc vai reconhecer muitos dos nossos algoritmos nele) Algumas vdeo-aulas no youtube (so uma sequncia de aulas, estou indicando apenas o link da primeira de cada tipo):
http://br.youtube.com/watch?v=3hv5_hWPIeo http://br.youtube.com/watch?v=kaJ4nJHcYLE http://br.youtube.com/watch?v=kGzFwgrZUXA

Atividade de Estudo Construa algoritmos em linguagem algortmica para resolver os problemas abaixo. Lembre das boas prticas de programao! 1) Crie um procedimento para exibir a tabuada da soma de um nmero que deve ser passado como parmetro. Por exemplo, se vier o nmero 1, voc deve imprimir a tabuada da soma do nmero 1 (a soma de um com todos os outros nmeros de 0 a 9). Faa tambm o algoritmo principal que vai chamar esse procedimento. 2) Escrever um algoritmo para determinar se um determinado nmero inteiro positivo ou negativo. Utilizar um subalgoritmo de funo que retorna um valor lgico para indicar se o valor recebido positivo ou negativo. 3) Escreva um algoritmo que l um nmero no determinado de valores, todos inteiros e positivos, um valor de cada vez, at que seja digitado o valor ZERO. A cada nmero, chamar uma funo para calcular o fatorial do mesmo. Escrever cada nmero lido e seu fatorial. Se o nmero for negativo, dar uma mensagem apropriada. 4) Faa uma funo (e o algoritmo principal que utiliza a mesma) que recebe a mdia nal de um aluno por parmetro e retorna o seu conceito, conforme a tabela abaixo:

121

Introduo a Programao

Nota de 0,0 a 4,9 de 5,0 a 6,9 de 7,0 a 8,9 de 9,0 a 10,0

Conceito D C B A

5) Faa um algoritmo que usa uma funo que recebe, por parmetro, a altura e o sexo de uma pessoa e retorna o seu peso ideal. Para homens, calcular o peso ideal usando a frmula peso ideal = 72.7 x altura - 58 e, para mulheres, peso ideal = 62.1 x altura - 44.7.

Super Desao Escreva um algoritmo que apresente um menu com as seguintes opes: 0 Inicializar vetor 1 Inserir elemento no vetor 2 Remover elemento do vetor 3 Escrever na tela o vetor 4 Sair Quando for escolhida a opo nmero 0, um subalgoritmo apropriado deve ser ativado para colocar ZERO em todas as posies do vetor. O subalgoritmo deve receber como parmetro o vetor a ser inicializado. Quando for escolhida a opo nmero 1, um subalgoritmo apropriado ativado para inserir um elemento (nmero inteiro positivo) em um vetor. O subalgoritmo deve receber como parmetro o nmero a ser inserido e o vetor onde ele deve ser inserido. Regras: A insero sempre ser realizada no nal do vetor (posies que possuam o valor ZERO so consideradas disponveis). Se no for possvel incluir no nal (no h mais posies disponveis no nal do vetor), devese procurar se existe pelo meio do vetor alguma posio com valor

122

Introduo a Programao

ZERO. Se houver, inserir o elemento naquela posio. Se no houver, avisar ao usurio que o vetor est realmente cheio. Quando for escolhida a opo nmero 2, um subalgoritmo apropriado ativado para deletar um elemento do vetor. O subalgoritmo deve receber como parmetro a posio (ndice) do elemento a ser eliminado e o vetor. Regras: se a posio que se deseja deletar no existir (ndice > 30) deve-se imprimir uma mensagem apropriada. Se a posio que se deseja deletar tiver valor zero (posio ainda sem elementos), tambm deve ser impressa uma mensagem apropriada. Cada elemento que for deletado deve ser substitudo pelo valor ZERO. Quando for escolhida a opo nmero 3, um subalgoritmo para imprimir todo o vetor na tela dever ser ativado. O subalgoritmo dever receber como parmetro o vetor a ser impresso. Regras: s devem ser impressas as posies diferentes de ZERO. E ao nal da impresso, dizer quantos nmeros foram impressos (Total de nmeros impressos = XX). OBS: Considere que existem dois vetores de tamanho 30 de nmeros inteiros e positivos.

Vamos Revisar? Neste captulo, foi estudado o conceito de subalgoritmos. Subalgoritmo um algoritmo que, geralmente, resolve um pequeno problema, e que est subordinado a um outro algoritmo. Esta subordinao deve-se ao fato de que o subalgoritmo s ser acionado se solicitado pelo algoritmo principal (tambm possvel que um subalgoritmo chame outro subalgoritmo). Nesse caso, o algoritmo completo passa a ser dividido em um algoritmo principal e em diversos subalgoritmos (tantos quantos forem necessrios ou convenientes para a resoluo do problema). O algoritmo principal aquele por onde comea a execuo, e chama, eventualmente, os demais subalgoritmos. Os subalgoritmos podem ser de dois tipos: procedimentos ou funes. A diferena entre eles que as funes retornam a quem as chamar um valor, explicitamente, e o procedimento no. Ambos os tipos podem receber parmetros. Os parmetros podem ser recebidos 123

Introduo a Programao

por valor ou por referncia. Quando a passagem feita por valor, uma cpia do argumento do programa chamador passada para o parmetro. Assim, o argumento original nunca modicado. Quando a passagem feita por referncia, o argumento e o parmetro passam a referenciar um mesmo endereo de memria. Dessa forma, qualquer modicao feita dentro do subalgoritmo no parmetro, reetida no argumento original, modicando-o. Indica-se que a passagem por referncia utilizando-se a palavra reservada VAR na declarao dos parmetros do subalgoritmo.

124