Você está na página 1de 93

Algoritmos e Estrutura de Dados I

prof. marcelo siqueira prof. henrique mongelli Departamento de Computa c ao e Estat stica Centro de Ci encias Exatas e Tecnologia Universidade Federal de Mato Grosso do Sul 11 de abril de 2001

Sum ario
1 Introdu c ao ` a Computa c ao 1.1 Algoritmo . . . . . . . . . . . . . . . 1.2 Algoritmos e Resolu c ao de Problemas 1.3 Resolu c ao de Problemas e Abstra c ao 1.4 Algoritmos e Computadores . . . . . 1.4.1 Hardware . . . . . . . . . . . 1.4.2 Linguagens de Programa c ao . 1.4.3 Software . . . . . . . . . . . . 1.5 A Computa c ao Como Disciplina . . . 2 Os Computadores HV-1, HV-2 e 2.1 O Computador HV-1 . . . . . . 2.1.1 Gaveteiro . . . . . . . . 2.1.2 Calculadora . . . . . . . 2.1.3 EPI . . . . . . . . . . . 2.1.4 Porta-Cart oes . . . . . . 2.1.5 Folha de Sa da . . . . . 2.1.6 Operador . . . . . . . . 2.1.7 Programando o HV-1 . . 2.1.8 Instru c oes do HV-1 . . . Soma . . . . . . . . . . . Carga no AC . . . . . . Armazenamento do AC . Impress ao . . . . . . . . Leitura . . . . . . . . . . Desvio Condicional . . . Pare . . . . . . . . . . . 2.1.9 Exemplo de Programa . 1 4 4 7 8 9 11 14 16 17 20 20 21 21 22 22 22 22 23 25 25 25 26 26 26 27 27 27

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

HIPO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

Sum ario

dct-ufms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 32 32 32 33 33 34 34 35 35 36 36 38 39 41 42 43 43 43 44 44 45 46 48 48 48 49 52 52 57 62

2.2 O Computador HV-2 . . . . . 2.3 O Computador HIPO . . . . . 2.3.1 Mem oria . . . . . . . . 2.3.2 CPU . . . . . . . . . . 2.3.3 EPI . . . . . . . . . . 2.3.4 Unidade de Entrada . 2.3.5 Unidade de Sa da . . . 2.3.6 Instru c oes do HIPO . . 2.3.7 Exemplo de Programa 2.4 Bibliograa . . . . . . . . . .

3 Desenvolvimento de Algoritmos - Parte I 3.1 Componentes de um Algoritmo . . . . . . 3.2 Uma Linguagem para Algoritmos . . . . . 3.3 Tipos de Dados . . . . . . . . . . . . . . . 3.4 Vari aveis . . . . . . . . . . . . . . . . . . . 3.5 Constantes . . . . . . . . . . . . . . . . . . 3.6 Operadores . . . . . . . . . . . . . . . . . 3.6.1 Operador de Atribui c ao . . . . . . 3.6.2 Operadores Aritm eticos . . . . . . 3.6.3 Comando de Atribui c ao . . . . . . 3.6.4 Preced encia de Operadores . . . . . 3.6.5 Entrada e Sa da . . . . . . . . . . . 3.7 Estrutura Geral de um Algoritmo . . . . . 4 Desenvolvimento de Algoritmos - Parte II 4.1 Express oes Condicionais . . . . . . . . . . 4.1.1 Rela c oes . . . . . . . . . . . . . . . 4.1.2 Operadores L ogicos . . . . . . . . . 4.2 Estruturas de Controle . . . . . . . . . . . 4.2.1 Estruturas Condicionais . . . . . . 4.2.2 Estruturas de Repeti c ao . . . . . . 4.3 Problemas e Solu c oes . . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

5 Modulariza c ao 71 5.1 O Qu e e Por Qu e? . . . . . . . . . . . . . . . . . . . . . . . . 71 5.2 Componentes de um m odulo . . . . . . . . . . . . . . . . . . . 72 5.3 Ferramentas para Modulariza c ao . . . . . . . . . . . . . . . . 73 2

Sum ario

dct-ufms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 76 78 78 81 86 86 89 90

5.4 Criando Fun c oes e Procedimentos . . 5.5 Chamando Fun c oes e Procedimentos 5.6 Passagem de Par ametros . . . . . . . 5.7 Escopo de Dados e C odigo . . . . . . 5.8 Problemas e Solu c oes . . . . . . . . .

6 Ordena c ao e Busca 6.1 Ordena c ao por Inser c ao . . . . . . . . . . . . . . . . . . . . . 6.2 Busca Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Busca Bin aria . . . . . . . . . . . . . . . . . . . . . . . . . . .

Cap tulo 1 Introdu c ao ` a Computa c ao


Computadores s ao dispositivos que s o sabem fazer um tipo de coisa: executar algoritmos para processar informa c ao. Para cientistas da Computa c ao, algoritmo e o conceito central da Computa c ao. Neste T opico, introduziremos a no c ao de algoritmo, mostraremos alguns exemplos, abordaremos a rela c ao algoritmo-computador e discutiremos sobre a Computa c ao e suas areas.

1.1

Algoritmo

H a tantas deni c oes diferentes para o termo algoritmo quanto autores escrevendo sobre elas. Entretanto, todas estas deni c oes concordam que um algoritmo e uma seq u encia de instru c oes para resolver um problema, a qual possui as seguintes propriedades: Garantia de t ermino: o problema a ser resolvido possui condi c oes espec cas que, quando satisfeitas, a execu c ao do algoritmo e encerrada e o problema e ent ao tido como resolvido. Al em disso, estas condi c oes devem ser satisfeitas ap os uma quantidade nita de tempo, a ser contado a partir do in cio da execu c ao do algoritmo. Exatid ao: a inten c ao de cada instru c ao no algoritmo deve ser sucientemente clara, de forma que n ao haja ambig uidade na interpreta c ao da inten c ao. Efetividade: cada instru c ao deve ser b asica o suciente para ser executada, pelo menos em princ pio, por qualquer agente usando apenas 4

1.1. Algoritmo

dct-ufms

l apis e papel. Para exemplicar a no c ao de algoritmo, considere o problema de encontrar o m aximo divisor comum (MDC) de dois n umeros naturais quaisquer e a seguinte seq u encia de instru c oes para resolver o problema: 1. Chame o maior n umero de a e o menor de b 2. Divida a por b e chame o resto de r 3. Se r e igual a zero ent ao o MDC e igual a b e a execu c ao das instru c oes encerra aqui. Caso contr ario, siga para a pr oxima instru c ao. 4. Atribua o valor de b a a e o valor de r a b 5. Volte para a instru c ao 2. Esta seq u encia de instru c oes e um algoritmo para o problema de encontrar o MDC de dois n umeros naturais quaisquer. Pois, se seguida, resolve qualquer ocorr encia do problema1 . A execu c ao da seq u encia sempre p ara ap os uma quantidade nita de tempo. Isto e garantido pela instru c ao 3, que compara o valor de r a zero e termina a execu c ao se r e igual a 0. Cada instru c ao da seq u encia e clara e poss vel de ser executada por qualquer pessoa que saiba, pelo menos, dividir dois n umeros. Como era de se esperar, nem toda seq u encia de instru c oes para resolver um determinado problema pode ser considerada um algoritmo. Por exemplo, se a instru c ao Divida x por y se todo n umero inteiro par maior que 2 ea soma de dois n umeros primos estiver presente na seq u encia, ela s o poder a ser executada se soubermos se a proposi c ao todo n umero inteiro par maior que 2 e a soma de dois n umeros primos e verdadeira ou falsa. Entretanto, esta proposi c ao, conhecida como conjectura de Goldbach, foi proposta em 1742 e continua sem solu c ao at e hoje. Logo, nossa instru c ao n ao pode ser executada por qualquer agente hoje em dia e, portanto, n ao pode fazer parte de um algoritmo. Um outro exemplo de instru c ao que n ao pode fazer parte de um algoritmo e Escreva todos os n umeros mpares. Neste caso, temos uma instru c ao que n ao pode ser executada porque a execu c ao nunca terminar a, apesar de sabermos exatamente como determinar os n umeros mpares. Observe que se
1

Se voc e n ao acredita nisso, pode come car a testar!

1.1. Algoritmo

dct-ufms

modic assemos a instru ca o para Escreva todos os n umeros mpares menores do que 100, ela poderia, perfeitamente, fazer parte de um algoritmo. Um problema para o qual existe uma solu c ao na forma de algoritmo e dito um problema algor tmico. O problema de encontrar o MDC de dois n umeros naturais quaisquer e, portanto, um problema algor tmico. Problemas algor tmicos, em geral, possuem muitas ocorr encias. Por exemplo, para o problema de encontrar o MDC de dois n umeros naturais, cada ocorr encia e uma dupla distinta de n umeros naturais cujo MDC queremos encontrar. Um algoritmo e dito correto quando ele sempre termina e produz a resposta correta para todas as ocorr encias de um dado problema. Algoritmo, ent ao, pode ser imaginado como a especica c ao de um processo mec anico que, quando executado, leva-nos ` a solu c ao de algum problema. Embora o termo algoritmo esteja relacionado intimamente com Ci encia da Computa c ao, algoritmos tem sido parte de nossas vidas desde a primeira vez que uma pessoa explicou para outra como fazer alguma coisa. As pessoas utilizam algoritmos quando seguem receitas culin arias ou instru c oes para programar um v deo cassete. Entretanto, nem todo algoritmo pode ser executado por um computador. Um computador pode executar apenas aqueles algoritmos cujas instru c oes envolvam tarefas que ele possa entender e executar. Este n ao e o caso, por exemplo, de instru c oes como bata as gemas e ligue o v deo cassete. Computadores executam algoritmos que manipulam apenas dados e n ao coisas f sicas, tais como gema de ovo e v deo cassete. A execu c ao de um algoritmo por um computador e denominada processamento de dados e consiste de tr es partes: uma entrada, um processo e uma sa da. A entrada e um conjunto de informa c oes que e requisitada para que as instru c oes do algoritmo possam ser executadas. O processo e a seq u encia de instru c oes que comp oe o algoritmo. A sa da e o resultado obtido com a execu c ao do processo para a entrada fornecida. Por exemplo, a entrada e a sa da para uma computa c ao do algoritmo para o problema de encontrar o MDC de dois n umeros naturais s ao, respectivamente, dois n umeros naturais e o MDC deles. Quando escrevemos algoritmos para serem executados por computador, temos de fazer algumas suposi c oes sobre o modelo de computa c ao entradaprocesso-sa da. A primeira delas e que, a m de realizar qualquer computa c ao, o algoritmo deve possuir um meio de obter os dados da entrada. Esta tarefa e conhecida como leitura da entrada. A segunda, e que o algoritmo deve possuir um meio de revelar o resultado da computa c ao. Isto e conhe6

1.2. Algoritmos e Resolu c ao de Problemas

dct-ufms

cido como escrita dos dados da sa da. Todo e qualquer computador possui dispositivos atrav es dos quais a leitura e a escrita de dados s ao realizadas.

1.2

Algoritmos e Resolu c ao de Problemas

Todo algoritmo est a relacionado com a solu c ao de um determinado problema. Portanto, construir um algoritmo para um dado problema signica, antes de mais nada, encontrar uma solu c ao para o problema e descrev e-la como uma sequ encia nita de a c oes. A tarefa de encontrar a solu c ao de um problema qualquer e , em geral, realizada de forma emp rica e um tanto quanto desorganizada; ocorrem v arios procedimentos mentais, dos quais raramente tomamos conhecimento. A organiza c ao do procedimento de resolu c ao de problemas e extremamente desej avel, pois somente assim podemos vericar onde o procedimento n ao est a eciente. Identicadas as deci encias, procuramos formas de corrigi-las e, consequentemente, aumentamos a nossa capacidade de resolver problemas. A capacidade para resolver problemas pode ser vista como uma habilidade a ser adquirida. Esta habilidade, como qualquer outra, pode ser obtida pela combina c ao de duas partes: Conhecimento: adquirido pelo estudo. Em termos de resolu c ao de problemas, est a relacionado a que t aticas, estrat egias e planos usar e quando usar; Destreza: adquirida pela pr atica. A experi encia no uso do conhecimento nos d a mais agilidade na resolu c ao de problemas. Independente do problema a ser resolvido, ao desenvolvermos um algoritmo devemos seguir os seguintes passos: An alise preliminar: entender o problema com a maior precis ao poss vel, identicando os dados e os resultados desejados; Solu c ao: desenvolver um algoritmo para o problema; Teste de qualidade: executar o algoritmo desenvolvido com uma entrada para a qual o resultado seja conhecido; Altera c ao: se o resultado do teste de qualidade n ao for satisfat orio, altere o algoritmo e submeta-o a um novo teste de qualidade; 7

1.3. Resolu c ao de Problemas e Abstra c ao

dct-ufms

Produto nal: algoritmo conclu do e testado, pronto para ser aplicado.

1.3

Resolu c ao de Problemas e Abstra c ao

Talvez, o fator mais determinante para o sucesso em resolver um problema seja abstra c ao. De acordo com o Websters New Dictionary of American Language (segunda edi c ao), abstra c ao e alguma coisa independente de qualquer ocorr encia particular ou o processo de identicar certas propriedades ou caracter sticas de uma entidade material e us a-las para especicar uma nova entidade que representa uma simplica c ao da entidade da qual ela foi derivada. Esta nova entidade e o que chamamos de abstra c ao. Para entender o papel da abstra c ao na resolu c ao de problemas, considere a seguinte ocorr encia de um problema que lembra nossos tempos de crian ca: Maria tinha cinco ma c as e Jo ao tinha tr es. Quantas ma c as eles tinham juntos? Provavelmente, um adulto resolveria este problema fazendo uma abstra c ao das ma c as como se elas fossem os n umeros 5 e 3 e faria a soma de tais n umeros. Uma crian ca poderia imaginar as cinco ma c as de Maria como cinco palitinhos e as tr es de Jo ao como tr es palitinhos. Da , faria uma contagem dos palitinhos para chegar ` a solu c ao. Em ambos os casos, os elementos do problema foram substitu dos por outros (n umeros e palitinhos) e a solu c ao foi encontrada atrav es da manipula c ao dos novos elementos. O processo de abstra c ao pode ser visto como constando de n veis. Isto diz respeito ao grau de simplica c ao de uma abstra c ao. Por exemplo, minha av o cozinha desde garota, logo se algu em entreg a-la uma receita culin aria de uma lazanha ao molho branco e n ao mencionar como o molho branco e feito, provavelmente, isto n ao ser a um problema para ela. Entretanto, se a mesma receita for dada para mim, eu n ao saberei fazer a tal lazanha2 . Isto quer dizer que a receita dada para mim deveria conter maiores detalhes do processo de preparo da lazanha do que aquela dada para minha av o. Aqui, a receita e uma abstra c ao e o n vel de detalhe da receita e proporcional ao n vel de simplica c ao da abstra c ao. Algoritmos bem projetados s ao organizados em n veis de abstra c ao, pois um mesmo algoritmo deve ser entendido por pessoas com diferentes graus
2

A menos que eu compre o molho branco no supermercado.

1.4. Algoritmos e Computadores

dct-ufms

de conhecimento. Quando um algoritmo est a assim projetado, as instru c oes est ao organizadas de tal forma que podemos entender o algoritmo sem, contudo, ter de entender os detalhes de todas as instru c ao de uma s o vez. Para tal, o processo de constru c ao de algoritmos conta com ferramentas, tais como m odulos, que agrupam instru c oes que realizam uma determinada tarefa no algoritmo, independente das demais, tal como fazer a leitura da entrada, dispensando-nos de entender o detalhe de cada instru c ao separadamente, mas sim fornecendo-nos uma vis ao da funcionalidade do grupo de instru c oes.

1.4

Algoritmos e Computadores

Desde que o homem come cou a processar dados, ele tentou construir m aquinas para ajud a-lo em seu trabalho. O computador moderno e o resultado dessas tentativas que v em sendo realizadas desde o ano 1.200 a.C. com a inven c ao da calculadora denominada abaco, a qual foi mais tarde aperfei coada pelos chineses. O computador e, sem d uvida alguma, um dos principais produtos da ci encia do s eculo XX. O que e um computador? De acordo com o Websters New World Dictionary of the American Language (segunda edi c ao), um computador e uma m aquina eletr onica que, por meio de instru c oes e informa c oes armazenadas, executa r apida e frequentemente c alculos complexos ou compila, correlaciona e seleciona dados. Basicamente, um computador pode ser imaginado como uma m aquina que manipula informa c ao na forma de n umeros e caracteres. Esta informa c ao e referenciada como dado. O que faz dos computadores uma m aquina not avel e a extrema rapidez e precis ao com que eles podem armazenar, recuperar e manipular dados. Quando desejamos utilizar um computador para nos auxiliar na tarefa de processamento de dados, deparamo-nos com alguns problemas inerentes a este processo: Como informaremos ao computador o algoritmo que deve ser executado para obtermos o resultado desejado?, Como forneceremos a entrada do algoritmo? e Como receberemos o resultado do algoritmo? O ato de instruir o computador para que ele resolva um determinado problema e conhecido como programa c ao. Esta tarefa nada mais e do que inserir no computador as a c oes do algoritmo que corresponde ` a solu c ao do problema e os dados referenciados pelas a c oes. Entretanto, antes de inserir as a c oes e os dados no computador, devemos reescrev e-las em uma linguagem apropriada para descrever algoritmos computacionais, ou seja, em uma 9

1.4. Algoritmos e Computadores

dct-ufms

linguagem de programa c ao. O termo programa e comumente empregado para designar o algoritmo em uma linguagem de programa c ao. Entretanto, n ao h a distin c ao conceitual entre algoritmo e programa no que diz respeito ` a linguagem em que eles est ao escritos. A u nica diferen ca e que um programa n ao necessariamente termina. Um exemplo de programa que nunca termina e o sistema operacional de um computador. Como os programas a serem estudados neste curso sempre terminar ao, n os utilizaremos os termos programa e algoritmo como sin onimos. Cada computador possui uma linguagem de programa c ao pr opria, denominada linguagem de m aquina, e, em geral, distinta das linguagens de m aquina dos demais modelos de computador. Esta eau nica linguagem de programa c ao que o computador realmente entende. No entanto, para evitar que n os tenhamos de aprender a linguagem de m aquina de cada computador diferente para o qual queremos programar, muitas linguagens de programa c ao independentes de m aquina foram criadas. Se voc e aprende uma linguagem independente de m aquina, estar a apto, pelo menos em princ pio, a programar qualquer computador. As linguagens de programa c ao independentes de m aquina n ao s ao compreendidas pelos computadores. Ent ao, para que elas possam ser u teis para n os, um programa denominado compilador deve estar presente no computador. Um compilador para uma determinada linguagem de programa c ao realiza a tradu c ao autom atica de um programa para a linguagem de m aquina. Tudo que n os temos a fazer para executar um programa escrito em uma linguagem de programa c ao, que n ao e a linguagem de m aquina do computador, e compilar o nosso programa com o compilador espec co daquela linguagem. Tanto o algoritmo quanto os seus dados de entrada s ao inseridos nos computadores por meio de equipamentos eletr onicos conhecidos como perif ericos de entrada. O teclado e o mouse s ao exemplos de perif ericos de entrada. As instru c oes e os dados inseridos no computador atrav es de um perif erico de entrada s ao armazenados em um dispositivo do computador denominado mem oria. Os dados de sa da resultantes da execu c ao do algoritmo pelo computador s ao apresentados tamb em por meio de equipamentos eletr onicos denominados perif ericos de sa da. O v deo e a impressora s ao exemplos de perif ericos de sa da. O computador executa um determinado programa atrav es de um dispositivo interno denominado unidade central de processamento, mais conhecido no mundo dos computadores pela sua abrevia c ao em Ingl es: CPU de 10

1.4. Algoritmos e Computadores

dct-ufms

Central Processing Unit. A CPU e respons avel por buscar as instru c oes e os dados do programa que est ao armazenados na mem oria do computador, decodicar as instru c oes e executar a tarefa descrita por elas com os respectivos dados. A CPU pode ser imaginada como o c erebro do computador. No mundo dos computadores, voc e ouvir a as pessoas falarem sobre hardware e software. Hardware se refere ` a m aquina propriamente dita e a todos os perif ericos conectados a ela. Software se refere aos programas que fazem a m aquina realizar alguma tarefa. Muitos pacotes de software est ao dispon veis nos dias atuais. Eles incluem processadores de texto, sistemas gerenciadores de banco de dados, jogos, sistemas operacionais e compiladores. Voc e pode e aprender a a criar seus pr oprios softwares. Para aprender a criar softwares, voc e dever a adquirir capacidade para: Desenvolver algoritmos para solucionar problemas envolvendo transforma c ao de informa c ao; Usar uma linguagem de programa c ao. Inicialmente, voc e deve imaginar que aprender uma linguagem de programa c ao, seja de m aquina ou n ao, e a tarefa mais dif cil porque seus problemas ter ao solu c oes relativamente f aceis. Nada poderia ser mais enganoso! A coisa mais importante que voc e pode fazer como um estudante de Computa c ao e desenvolver sua habilidade para resolver problemas. Uma vez que voc e possui esta capacidade, voc e pode aprender a escrever programas em diversas linguagens de programa c ao.

1.4.1

Hardware

Toda transmiss ao de dados, manipula c ao, armazenagem e recupera c ao e realmente realizada por um computador atrav es de pulsos el etricos e magn eticos representando sequ encias de d gitos bin arios (bits), isto e, sequ encias de 0s e 1s. Cada sequ encia, por sua vez, e organizada em 1 ou mais bytes, que s ao grupos de oito bits. Neste contexto, as instru c oes e os dados manipulados pelo computador nada mais s ao do que sequ encias de bytes que possuem signicado para o computador. As instru c oes e os dados s ao armazenados na mem oria do computador. Um computador possui dois tipos de mem oria: a prim aria e a secund aria. A primeira e tamb em conhecida como mem oria principal ou mem oria tempor aria e tem como objetivo armazenar as instru c oes e os dados de 11

1.4. Algoritmos e Computadores

dct-ufms

um programa em execu ca o. Esta mem oria se assemelha a um gaveteiro, pois e uma sequ encia de posi c oes de tamanho xo, cada qual possuindo um identicador distinto denominado endere co. Cada posi c ao da mem oria prim aria armazena uma instru c ao ou parte dela ou um dado do programa. A CPU se comunica constantemente com a mem oria prim aria para obter a pr oxima instru c ao do programa a ser executada ou um dado necess ario ` a execu c ao da instru c ao. Tanto as instru c oes quanto os dados s ao localizados na mem oria atrav es dos endere cos das posi c oes de mem oria que os cont em. O tamanho de cada posi c ao de mem oria e dado em bytes. Cada 1024 bytes representam 1 quilobyte (1K), cada 1024K representam 1 megabyte (1M), cada 1024M representam 1 gigabyte (1G) e cada 1024G representam 1 terabyte (1T). Se o tamanho de uma posi c ao de mem oria de um computador mede 2 bytes e a mem oria possui 640 Kbytes de capacidade de armazenagem, o n umero de posi c oes de mem oria e igual a 327.680. A mem oria prim aria perde todo o seu conte udo no momento em que o computador e desligado. Ela possui o prop osito principal de armazenar instru c oes e dados de um programa em execu c ao. Sua principal caracter stica e a rapidez com que as informa c oes nela armazenadas s ao lidas e escritas pela CPU. Toda vez que um programa deve ser executado, ele e inserido antes na mem oria prim aria. A mem oria secund aria possui caracter sticas opostas ` aquelas da mem oria prim aria. Ela e permanente, isto e, o computador pode ser desligado, mas ela n ao perde o seu conte udo. Ela e mais lenta do que a mem oria principal e, em geral, possui muito mais capacidade para armazenagem de informa c ao. O principal prop osito da mem oria secund aria e armazenar programas e dados que o computador pode executar e utilizar, respectivamente, em um dado instante. Os discos r gidos, os discos ex veis e os CD-ROMs s ao exemplos de mem oria secund aria. Quando um programa armazenado em mem oria secund aria precisa ser executado, o computador primeiro transfere o programa e os dados necess arios a sua execu c ao para a mem oria e, da , inicia a execu c ao do programa. As mem orias tamb em podem ser classicadas quanto ` a permiss ao ou n ao para alterarmos o seu conte udo. Os principais tipos nesta classica c ao s ao: Mem oria de acesso aleat orio (Random Access Memory - RAM). Este tipo de mem oria permite a leitura e a escrita de seus dados em qualquer 12

1.4. Algoritmos e Computadores

dct-ufms

de suas posi c oes. O acesso a qualquer posi c ao e aleat orio, isto e, podemos ter acesso a qualquer posi c ao diretamente. A mem oria principal de um computador e uma mem oria do tipo RAM. Mem oria apenas para leitura (Read Only Memory - ROM). Este tipo de mem oria permite apenas a leitura de seus dados, como o pr oprio nome sugere. O conte udo de uma ROM e gravado durante seu processo de fabrica c ao, de acordo com a vontade do usu ario. Uma vez que o usu ario decidiu quais dados devem ser armazenados na ROM, ele os transmite ao fabricante da mem oria. Feita a grava c ao da ROM, o seu conte udo n ao poder a mais ser alterado. A CPU de um computador, devido a sua complexidade, e normalmente dividida, para ns de estudo e projeto, em duas partes: a Unidade de Controle (Control Unit - CU), onde as sequ encias de c odigo bin ario, que representam as instru c oes a serem executadas, s ao identicadas e atrav es da qual os dados s ao obtidos da mem oria; e a Unidade L ogica e Aritm etica (Arithmetic and Logic Unit - ALU), onde as instru c oes s ao efetivamente executadas. Toda instru c ao e codicada como uma sequ encia de bits. Alguns desses bits identicam a instru c ao propriamente dita e os demais cont em o endere co da posi c ao de mem oria dos dados usados pela instru c ao. A CU interpreta a sequ encia de bits e identica qual e a instru c ao e, se houver refer encia a algum dado, realiza a busca do dado na mem oria. Estas opera c oes s ao realizadas por um conjunto de circuitos l ogicos que comp oe a CU. A execu c ao das instru c oes e realizada pela ALU. A CPU tamb em possui seus pr oprios elementos de mem oria. Eles s ao denominados registradores. Os registradores armazenam, em cada instante, os dados a serem imediatamente processados, isto e, os dados referenciados pela instru c ao processada no momento e que foram trazidos da mem oria principal. Os registradores possibilitam o aumento de velocidade na execu c ao das instru c oes, pois os resultados intermedi arios da instru c ao n ao precisam ser armazenados na mem oria principal. Com o avan co da microeletr onica e poss vel construir toda uma CPU em uma u nica pastilha de sil cio. Essa pastilha, ou chip, denomina-se microprocesador, sendo conhecido pelo nome de seu fabricante seguido de um 13

1.4. Algoritmos e Computadores

dct-ufms

determinado n umero, como por exemplo, Intel 80486. Os microprocessadores s ao classicados pelo tamanho da palavra - ou comprimento, em bits, da unidade de informa c ao - que s ao capazes de processar de uma s o vez. Os primeiros microprocessadores foram de 8 bits, seguidos pelos de 16 bits, depois pelos de 32 bits e, mais recentemente, pelos de 64 bits. As unidades de entrada, que servem para introduzir programas ou dados no computador, e as unidades de sa da, que servem para receber programas ou dados do computador, s ao denominadas perif ericos de entrada e perif ericos de sa da, respectivamente. Os perif ericos de entrada mais comuns s ao: Teclado; Mouse; Unidade de disco; Scanner e Leitora otica. E, alguns dos perif ericos de sa da mais comuns s ao: V deo; Impressora; e Unidade de disco.

1.4.2

Linguagens de Programa c ao

A primeira gera c ao de linguagens de programa c ao remonta aos dias de codica c ao em linguagem de m aquina. Esta linguagem e formada por instru c oes descritas como sequ encias de bytes, ou seja, ela e baseada em um alfabeto que possui apenas dois elementos, o bit 0 e o bit 1, e cada palavra (instru c ao) da linguagem e formada por grupos de oito bits denominados bytes que possuem signicado para o computador. Portanto, um programa em linguagem de m aquina poderia se parecer com a seguinte sequ encia de bytes: 01000011 00111010 00111011 01000001 00101011 01000100

14

1.4. Algoritmos e Computadores

dct-ufms

O tamanho de uma instru c ao pode ser de 1 ou mais bytes, dependendo do n umero total de instru c oes da linguagem e do n umero m aximo de operandos por instru c ao. Observe que com apenas 1 byte voc e pode codicar 256 instru c oes! Os dados utilizados por um programa tamb em s ao codicados com 0s e 1s. Para programar em linguagem de m aquina, n os devemos conhecer a sequ encia de bits que determina cada instru c ao e tamb em como codicar os dados em bin ario. Al em disso, voc e deve conhecer os dispositivos internos do computador, pois as instru c oes de uma linguagem de m aquina envolvem diretamente tais dispositivos. Como a maioria dos problemas resolvidos por computadores n ao envolve o conhecimento dos dispositivos internos do computador, a programa c ao em linguagem de m aquina e, na maioria das vezes, inadequada, pois o desenvolvedor perde mais tempo com os detalhes da m aquina do que com o pr oprio problema. Entretanto, para programas onde o controle de tais dispositivos e essencial, o uso de linguagem de m aquina e mais apropriado ou, ` as vezes, indispens avel. O pr oximo passo na evolu c ao das linguagens de programa c ao foi a cria c ao da linguagem montadora ou assembly. Nesta linguagem, as instru c oes da linguagem de m aquina recebem nomes compostos por letras, denominados mnem onicos, que s ao mais signicativos para n os humanos. Por exemplo, a instru c ao na linguagem montadora do processador 8088 que soma o valor no registrador CL com o valor no registrador BH e armazena o resultado em CL e dada por: ADD CL,BH . Esta instru c ao equivale a seguinte sequ encia de dois bytes na linguagem de m aquina do 8088: 00000010 11001111 . Para que o computador pudesse executar um programa escrito em linguagem montadora foi desenvolvido um compilador denominado montador ou assembler, o qual realiza a tradu c ao autom atica de um c odigo escrito em linguagem montadora para o seu correspondente em linguagem de m aquina. O sucesso da linguagem montadora animou os pesquisadores a criarem linguagens em que a programa c ao fosse realizada atrav es de instru c oes na l ngua inglesa, deixando para o pr oprio computador a tarefa de traduzir o 15

1.4. Algoritmos e Computadores

dct-ufms

c odigo escrito em tais linguagens para sua linguagem de m aquina. Isto foi poss vel devido ` a cria c ao de compiladores mais complexos do que os montadores. A primeira destas linguagens, que teve ampla aceita c ao, surgiu em 1957 e e ainda hoje utilizada. Trata-se da linguagem FORTRAN (FORmula TRANslation). A grande vantagem de linguagens como a FORTRAN e que o programador n ao necessita se preocupar com os detalhes internos do computador, pois as instru c oes da linguagem n ao envolvem os elementos internos do computador, tais como os registradores. Este fato tamb em permitiu a execu c ao do mesmo programa em computadores distintos sem haver altera c ao em seu texto. Na d ecada de 70 surgiu a linguagem C e, na d ecada de 80, a linguagem C++. Ambas constituem uma evolu c ao na forma de estruturar as instru c oes de um programa e seus respectivos dados em rela c ao as suas antecessoras. Outro aspecto importante da evolu c ao das linguagens de programa c ao diz respeito ` a quantidade de detalhe que o programador deve fornecer ao computador para que ele realize as tarefas desejadas.

1.4.3

Software

O software pode ser classicado como sendo de dois tipos: b asico ou aplicativo. Softwares b asicos s ao programas que administram o funcionamento do computador e nos auxiliam a us a-lo. Softwares aplicativos s ao programas que executam com o aux lio dos softwares b asicos e realizam tarefas tipicamente resolvidas pelos computadores. Os principais softwares b asicos s ao: Sistema Operacional: conjunto de programas que gerencia o computador e serve de interface entre os programas do usu ario e a m aquina, isto e, controla o funcionamento do computador, as opera c oes com os perif ericos e as transfer encias de dados entre mem oria, CPU e perif ericos. Um sistema operacional pode ser classicado de acordo com a sua capacidade de execu c ao de tarefas como: monotarefa: sistema operacional que permite a execu c ao de apenas um programa de cada vez. Por exemplo, o DOS;

16

1.5. A Computa c ao Como Disciplina

dct-ufms

multitarefa: sistema operacional que permite mais de um programa em execu c ao simultaneamente. Por exemplo, o Unix e o Windows NT. Utilit arios: programas de uso gen erico que funcionam em conjunto com o sistema operacional e que t em como objetivo executar fun c oes comuns em um computador. Por exemplo, formatadores de disco, programas que realizam transfer encia de dados entre computadores, entre outros. Compiladores: programas que traduzem um programa em uma linguagem de programa c ao espec ca para seu equivalente em uma linguagem de m aquina espec ca. Interpretadores: programas que, para cada instru c ao do programa, interpretam o seu signicado e a executam imediatamente. Depuradores: programas que auxiliam o programador a encontrar erros em seus programas. Um software aplicativo e aquele que realiza tarefas mais especializadas e que, apoiado nos softwares b asicos, torna o computador uma ferramenta indispens avel ` as organiza c oes. Por exemplo, editores de texto, programas de desenho e pintura, programas de automa c ao cont abil, entre outros.

1.5

A Computa c ao Como Disciplina

A disciplina de Computa c ao e conhecida por v arios nomes, tais como Ci encia da Computa c ao, Engenharia da Computa c ao, Inform atica e assim por diante. Qualquer que seja a denomina c ao, Computa c ao pode ser entendida como o estudo de processos sistem aticos que descrevem e transformam informa c ao: suas teorias, an alise, projeto, eci encia, implementa c ao e a aplica c ao. A quest ao fundamental da Computa c ao e O que pode ou n ao ser automatizado?. De acordo com o que vimos neste texto, os processos sistem aticos que transformam a informa c ao s ao exatamente os algoritmos. Ent ao, podemos dizer que a Computa c ao e o estudo de algoritmos, mais especicamente, a teoria, an alise, projeto, eci encia, implementa c ao e aplica c ao deles. Cada

17

1.5. A Computa c ao Como Disciplina

dct-ufms

uma destas partes e abordada em uma area espec ca da Computa c ao, a saber: Arquitetura. Esta area estuda as v arias formas de fabrica c ao e organiza c ao de m aquinas nas quais os algoritmos possam ser efetivamente executados. Linguagens de Programa c ao. Esta area estuda os m etodos para projeto e tradu c ao de linguagens de programa c ao. Teoria da Computa c ao. Aqui as pessoas perguntam e respondem quest oes tais como: Uma determinada tarefa pode ser realizada por computador? ou Qual e o n umero m nimo de opera c oes necess arias para qualquer algoritmo que execute uma certa tarefa? An alise de Algoritmos. Esta area compreende o estudo da medida do tempo e do espa co que os algoritmos necessitam para realizar determinadas tarefas. Projeto de algoritmos. Esta area estuda os m etodos para desenvolver algoritmos de forma r apida, eciente e con avel. As aplica c oes envolvendo algoritmos s ao respons aveis pelo surgimento de outras areas da Computa c ao, tais como Sistemas Operacionais, Bancos de Dados, Intelig encia Articial, entre outras. Observe que a deni c ao de Computa c ao dada acima tamb em menciona que a Computa c ao compreende os os processos sistem aticos que descrevem a informa c ao. Isto e, a Computa c ao envolve tamb em o estudo de m etodos para representar e armazenar dados a serem utilizados pelos algoritmos durante suas execu co es. Sendo assim, podemos dizer que a Computa c ao e o estudo de algoritmos e suas estruturas de dados. Neste curso, n os estudaremos m etodos para construir algoritmos e tamb em algumas estruturas de dados simples para representar, no computador, os dados utilizados pelos algoritmos que construiremos. No ano seguinte, voc es estudar ao algoritmos e estruturas de dados conhecidos e bem mais complexos do que aqueles que desenvolveremos neste ano.

Bibliograa
Este texto foi elaborado a partir dos livros abaixo relacionados: 18

1.5. A Computa c ao Como Disciplina

dct-ufms

1. Lambert, K.A., Nance, D.W., Naps, T.L. Introduction to Computer Science with C++. West Publishing Company, 1996. 2. Pothering, G.J., Naps, T.L. Introduction to Data Structures and Algorithm Analysis with C++. West Publishing Company, 1995. 3. Shackelford, R.L. Introduction to Computing and Algorithms. AddisonWesley Longman, Inc, 1998. 4. Tucker, A., Bernat, A.P., Bradley, W.J., Cupper, R.D., Scragg, G.W. Fundamentals of Computing I - Logic, Problem Solving, Programs, and Computers. C++ Edition. McGraw-Hill, 1995.

19

Cap tulo 2 Os Computadores HV-1, HV-2 e HIPO


Neste T opico, estudaremos tr es computadores hipot eticos: HV-1, HV-2 e HIPO. O estudo do funcionamento destes tr es computadores nos auxiliar a na compreens ao do funcionamento dos computadores reais e tamb em no aprendizado de conceitos fundamentais da programa c ao de computadores, tais como os conceitos de vari avel e programa armazenado. Uma pessoa que denominaremos usu ario utilizar a os computadores mencionados anteriormente para resolver seus problemas de processamento de dados. Cada um dos tr es computadores poder a funcionar sem a interfer encia do usu ario at e que a solu c ao total do problema seja fornecida a ele.

2.1

O Computador HV-1

O computador HV-1 e formado pelos seguintes componentes: Um gaveteiro com 100 gavetas; Uma calculadora com mostrador e teclado; Um pequeno quadro-negro denominado EPI; Um porta-cart oes; Uma folha de sa da; e

20

2.1. O Computador HV-1

dct-ufms

Um operador do sistema, uma pessoa chamada CHICO, com l apis, apagador de quadro-negro e giz.

2.1.1

Gaveteiro

O gaveteiro consiste numa sequ encia de gavetas numeradas de 00 a 99. O n umero de cada gaveta e denominado seu endere co. Cada gaveta cont em um pequeno quadro-negro, onde e escrito um n umero sempre com 3 algarismos (por exemplo, 102, 003, etc.) e outras informa c oes que veremos mais tarde. O gaveteiro e constru do de tal maneira que valem as seguintes regras de utiliza c ao: 1. em qualquer momento, no m aximo uma gaveta pode estar aberta; 2. a leitura do quadro-negro de uma gaveta n ao altera o que nele est a gravado; 3. a escrita de uma informa c ao no quadro-negro de uma gaveta e sempre precedida do apagamento do mesmo; e 4. somente o operador CHICO tem acesso ao gaveteiro.

2.1.2

Calculadora

Trata-se de uma calculadora usual, com teclado para entrada de n umeros, teclas das quatro opera c oes aritm eticas b asicas, tecla = e um mostrador, que denominaremos acumulador. N ao h a tecla de ponto (ou v rgula) decimal ou outra tecla adicional qualquer. H a dois tipos de opera c oes efetuadas com essa calculadora: 1. carga de um n umero no acumulador. Para isso, pressiona-se a tecla = (garantindo-se assim o encerramento de alguma opera c ao pr evia) e a seguir digitam-se os algarismos do n umero a ser carregado, o qual aparece no acumulador; 2. opera c ao aritm etica. Esta e sempre feita entre o n umero que est a no acumulador e um segundo n umero. Para isso, pressiona-se a tecla da opera c ao desejada, digita-se o segundo n umero e pressiona-se a tecla =. O resultado da opera c ao aparece no acumulador. Assim como o gaveteiro, a calculadora s o pode ser utilizada pelo CHICO. 21

2.1. O Computador HV-1

dct-ufms

2.1.3

EPI

Trata-se de quadro-negro independente do gaveteiro, com a forma , onde ser a escrito um n umero entre 00 e 99, correspondendo a um endere co de gaveta do gaveteiro. O n umero nele escrito indica sempre o Endere co da Pr oxima Instru c ao, donde sua abreviatura. Somente o CHICO tem acesso ao EPI.

2.1.4

Porta-Cart oes

um dispositivo similar aos porta-cigarros onde s E ao empilhados ma cos de cigarro a serem vendidos. O porta-cart oes funciona de acordo com as seguintes regras: 1. cart oes com informa c oes s ao colocados exclusivamente pela parte superior, um a um; quando um cart ao cont em um n umero, este e sempre escrito com 3 algarismos, como por exemplo, 101, 003, etc; 2. cart oes s ao retirados da extremidade inferior, um de cada vez, aparecendo na mesma ordem em que foram colocados no dispositivo; 3. a retirada de cart oes s o pode ser feita pelo CHICO; e 4. a coloca c ao de cart oes s o pode ser feita pelo usu ario.

2.1.5

Folha de Sa da

Trata-se de uma folha de papel onde pode ser escrito um n umero em cada linha, utilizando-se sempre linhas consecutivas. Somente o CHICO pode escrever nessa folha; somente o usu ario pode ler o que j a foi escrito.

2.1.6

Operador

Resumindo as diversas caracter sticas descritas, vemos que o operador CHICO e a u nica pessoa que tem acesso ao gaveteiro, ` a calculadora, ao EPI, e eou nico que pode retirar cart oes do porta-cart oes e escrever na folha de sa da. Ele executa estritamente ordens recebidas, n ao podendo tomar nenhuma iniciativa pr opria, executando alguma a c ao fora da especica c ao dessas ordens. O CHICO trabalha sempre em um de dois estados diferentes: 22

2.1. O Computador HV-1

dct-ufms

1. Estado de carga, onde ele exclusivamente transcreve informa c oes de cart oes, lidos do porta-cart oes, para gavetas do gaveteiro. 2. Estado de execu c ao, onde ele executa ordens gravadas nas gavetas. Os detalhes do funcionamento desses estados ser ao explicados adiante. A comunica c ao entre o usu ario e o operador e feita exclusivamente atrav es das unidades porta-cart oes e folha de sa da. O CHICO sabe fazer de cabe ca uma u nica opera c ao aritm etica: incrementar de 1 o conte udo do EPI.

2.1.7

Programando o HV-1

Para resolver um problema usando o computador HV-1, o usu ario deve planejar uma sequ encia de ordens (o programa) a serem executadas pelo CHICO. Cada uma dessas ordens e denominada instru c ao. Um exemplo de instru c ao e o seguinte: some o conte udo da gaveta de endere co 41 ao conte udo do acumulador. A m de se produzir a execu c ao correta das instru c oes e na sequ encia adequada, elas s ao escritas nas gavetas do gaveteiro. Para executar uma instru c ao da sequ encia, o CHICO segue os seguintes passos: 1. consulta o EPI, onde est a escrito o endere co E da pr oxima instru c ao; 2. incrementa de 1 o conte udo do EPI, apagando o valor anterior e escrevendo o novo valor (o qual neste caso ser a E+1); 3. abre a gaveta de endere co E; nesta gaveta ele deve encontrar uma instru c ao I, que e lida; 4. fecha a gaveta E; e 5. executa I. Ap os nalizados esses passos, o CHICO recome ca do passo 1, com exce c ao de um caso explicado a seguir. Se a execu c ao da instru c ao I n ao acarretar altera c ao no conte udo do EPI, a pr oxima instru c ao a ser executada ser aa da gaveta de endere co E+1, devido ao passo 2. Se uma instru c ao acarretar altera c ao no EPI, mudando o seu conte udo para X, a pr oxima instru c ao a ser executada ser a a da gaveta de endere co X; diz-se que houve um desvio para X. As instru c oes escritas nas gavetas do gaveteiro constituem um programa armazenado. Para conseguir a execu c ao de um programa, o usu ario 23

2.1. O Computador HV-1

dct-ufms

deve produzir inicialmente o armazenamento desse programa no gaveteiro, passando portanto a constituir um programa armazenado. Isso e feito da seguinte forma: 1. o usu ario escreve cada instru c ao em um cart ao, precedida de um endere co; assim, cada cart ao do programa cont em um par ordenado (E,I), onde E e um endere co e I uma instru c ao; 2. o CHICO e colocado em estado de carga de programa; 3. o usu ario coloca o conjunto de cart oes do programa no porta-cart oes, em qualquer ordem; 4. como o CHICO est a em estado de carga, ele l e um cart ao com um par (E,I); abre a gaveta de endere co E; escreve em seu quadro-negro a instru c ao I; fecha essa gaveta; 5. o CHICO repete o passo 4 at e ler o u ltimo cart ao de programa, ap os o que ele e colocado em estado de execu c ao de programa. Ap os o encerramento da carga do programa, o CHICO e colocado em estado de execu c ao de programa. Isso e feito por meio de um cart ao especial, que deve encerrar o conjunto de cart oes de programa. A forma desse cart ao e EXECUTE X, onde X e um n umero escrito pelo usu ario; ser a o endere co da gaveta onde se encontra a primeira instru c ao a ser executada. Ao ler esse cart ao, o CHICO apaga o EPI e escreve o mesmo valor X; a seguir, ele vai para o passo 1 da execu c ao de uma instru c ao, como exposto no in cio deste item. Para completar este quadro, resta descrever como o CHICO entra em estado de carga de programa. Vamos supor que, na verdade, esse estado seja o estado normal do CHICO; ele s o pode sair desse estado ao tentar carregar um cart ao EXECUTE X. Estando em estado de execu c ao, ele s o sai desse estado nos dois casos seguintes: 1. atrav es da execu c ao da instru c ao pare a execu c ao; 2. se ocorrer algum erro durante a execu c ao. Um exemplo do caso 2 e o de o CHICO tentar executar uma instru c ao inv alida, isto e, n ao conhecida.

24

2.1. O Computador HV-1

dct-ufms

2.1.8

Instru co es do HV-1

O conte udo de uma gaveta de endere co E, isto e, o n umero gravado em seu quadro-negro, ser a representado por cE. Assim, c10 indicar a o conte udo da gaveta 10. Indicaremos por cAC o conte udo do acumulador; este ser a abreviado por AC. Soma Instru c ao: some o cE ao AC. Signicado: some o cE ao cAC e coloque o resultado no AC; o cE n ao se altera. Execu c ao: o CHICO efetua os seguintes passos: 1. digita a tecla + da calculadora; 2. abre a gaveta de endere co E; 3. l e o n umero escrito nessa gaveta (cE) e digita-o na calculadora; 4. fecha a gaveta E; e 5. digita = na calculadora. Daqui em diante, em lugar de escrevermos gaveta de endere co E, escreveremos simplesmente E. Tamb em deixaremos de mencionar explicitamente que e o CHICO quem efetua os passos da execu c ao. Carga no AC Instru c ao: carregue o cE no AC. Signicado: copie o cE no AC; o cE n ao muda. Execu c ao: 1. digita =; 2. abre E; 3. l e cE e digita-o; e 4. fecha E. 25

2.1. O Computador HV-1

dct-ufms

Armazenamento do AC Instru c ao: armazene o cAC em E. Signicado: copie o cAC em E; o cAC n ao muda (oposto da instru c ao anterior). Execu c ao: 1. abre E; 2. apaga o cE; 3. l e o cAC e o escreve em E; e 4. fecha a gaveta. Impress ao Instru c ao: imprima o cE. Signicado: o cE e transcrito na folha de sa da. Execu c ao: 1. abre E; 2. l e cE e escreve seu valor na pr oxima linha da folha de sa da; e 3. fecha a gaveta. Note que supusemos haver espa co na folha de sa da. No caso contr ario, o CHICO aguarda at e ser fornecida nova folha. Leitura Instru c ao: leia um cart ao e guarde em E. Signicado: o conte udo do pr oximo cart ao do porta-cart oes e lido e transcrito para E; Execu c ao: 1. abre E; 2. retira um cart ao do porta-cart oes; 26

2.1. O Computador HV-1

dct-ufms

3. l e o conte udo do cart ao e escreve o seu valor em E; 4. joga fora o cart ao; e 5. fecha E. Note que supusemos haver cart ao no porta-cart oes. Em caso contr ario, o CHICO aguarda a coloca c ao de pelo menos um cart ao no porta-cart oes. Desvio Condicional Instru c ao: se cAC= 0, desvie para E. Signicado: se h a um n umero diferente de 0 no AC, a pr oxima instru c ao a ser executada est a em E, caso contr ario n ao h a nada a fazer (isto e, a pr oxima instru c ao a ser executada estar a na gaveta seguinte ` a que cont em esta instru c ao). Execu c ao: 1. l e o cAC; e 2. se cAC=0 ent ao apaga o EPI e escreve E no mesmo. Pare Instru c ao: pare. Signicado: encerra a execu c ao do programa. Execu c ao: 1. entrega a folha de sa da para o usu ario; e 2. entra no estado de carga.

2.1.9

Exemplo de Programa

Considere o seguinte problema: dada uma sequ E encia de n umeros inteiros positivos; determinar sua soma. Suponhamos que o usu ario do computador HV-1 planeje resolver o problema da seguinte maneira: 27

2.1. O Computador HV-1

dct-ufms

1. cada n umero da sequ encia e escrito em um cart ao; 2. dois cart oes adicionais contendo o n umero 0 s ao colocados um imediatamente antes do primeiro cart ao da sequ encia, e o outro logo ap os o u ltimo cart ao; 3. o programa e escrito em cart oes j a no formato de carga de programa como mostrado na tabela abaixo: endere co 01 02 03 04 05 06 07 08 09 10 instru c ao leia um cart ao e guarde em 11 leia um cart ao e guarde em 12 imprima o c12 carregue no AC o c11 some o c12 ao AC armazene o cAC em 11 carregue o c12 no AC se cAC= 0, desvie para 02 imprima o c11 pare

4. e formada uma pilha de cart oes com a seguinte ordem: programa EXECUTE 01 - cart oes conforme 1 e 2 acima. Essa pilha e colocada no porta-cart oes. Teremos nesta unidade, portanto, os cart oes denominados cart oes de programa e cart oes de dados, precedendo e seguindo, respectivamente, o cart ao EXECUTE; e 5. terminada a execu c ao, e recebida a folha de sa da, onde estar ao impressos os n umeros da sequ encia, seguidos da soma procurada. Para compreendermos como funciona o processo descrito pelo programa e pelos cart oes de dados, vejamos um exemplo concreto. Seja a sequ encia 100, 5 e 31. Os cart oes de dados conter ao, conforme 1 e 2, os seguintes valores, pela ordem: 000, 100, 005, 031 e 000. Suponhamos que o CHICO tenha carregado o programa e tenha encontrado o cart ao EXECUTE 01. Como vimos na Sub-Se c ao 2.1.7, ele apaga o EPI, escreve nele o n umero 01, e come ca a executar as instru c oes do programa conforme os passos 1 a 5 descritos no in cio daquela Sub-Se c ao. Se n os zermos um acompanhamento do papel do CHICO na execu c ao do programa, obteremos a tabela de execu c ao a seguir: 28

2.1. O Computador HV-1 g 01 02 03 04 05 06 07 08 02 03 04 05 06 07 08 02 03 04 05 06 07 08 02 03 04 05 06 07 08 09 10 pc cAC 000,100,005,031,000 100,005,031,000 005,031,000 005,031,000 005,031,000 000 005,031,000 100 005,031,000 100 005,031,000 100 005,031,000 100 031,000 100 031,000 100 031,000 100 031,000 105 031,000 105 031,000 005 031,000 005 000 005 000 005 000 105 000 136 000 136 000 031 000 031 031 031 136 136 136 000 000 000 000 c11 000 000 000 000 000 100 100 100 100 100 100 100 105 105 105 105 105 105 105 136 136 136 136 136 136 136 136 136 136 136 136 12 fs

dct-ufms cEPI 01 02 03 100 04 100 05 100 06 100 07 100 08 100 02 100 03 100,005 04 100,005 05 100,005 06 100,005 07 100,005 08 100,005 02 100,005 03 100,005,031 04 100,005,031 05 100,005,031 06 100,005,031 07 100,005,031 08 100,005,031 02 100,005,031 03 100,005,031,000 04 100,005,031,000 05 100,005,031,000 06 100,005,031,000 07 100,005,031,000 08 100,005,031,000 09 100,005,031,000,136 10 100,005,031,000,136

100 100 100 100 100 100 100 005 005 005 005 005 005 005 031 031 031 031 031 031 031 000 000 000 000 000 000 000 000 000

onde g e o n umero da gaveta com a instru c ao, pc e o porta-cart oes, fs e a folha de sa da e cEPI e o conte udo do EPI.

29

2.2. O Computador HV-2

dct-ufms

2.2

O Computador HV-2

As instru c oes do computador HV-1 est ao escritas por extenso, diferindo assim dos n umeros armazenados em outras gavetas, como as de endere co 11 e 12 no programa exemplo da Sub-Se c ao 2.1.9. Conseguiremos uma grande simplica c ao de nota c ao e de funcionamento se codicarmos as instru c oes, transformando-as tamb em em n umero. Como veremos mais tarde, isso permitir a inclusive a substitui c ao, com relativa facilidade, do operador CHICO por dispositivos eletr onicos. Para simplicar a compreens ao, suponhamos que cada gaveta do gaveteiro contenha um quadro-negro da seguinte forma: , onde o CHICO s o pode escrever n umeros de 3 algarismos, como 001, 015, 152, etc. O novo computador assim obtido receber a a sigla HV-2. No computador HV-2, as instru c oes dever ao ser necessariamente codicadas como n umeros de 3 algarismos, para podermos grav a-las no gaveteiro. Elas ter ao a forma CEE, onde C e um d gito de 1 a 7 e corresponde ao c odigo da instru c ao; EE e um n umero de 00 a 99 e corresponde ao endere co da gaveta empregada na execu c ao da instru c ao, denominado c odigo de endere co. As instru c oes vistas na Se c ao 2.1.8 ser ao codicadas conforme a tabela dada a seguir: instru c ao codicada 1EE 2EE 3EE 4EE 5EE 6EE 7EE instru c ao carregue o cEE no AC armazene o cAC em EE leia um cart ao e guarde em EE imprima o cEE some o cEE ao AC se cAC= 0 desvie para EE pare

Lembremos que cEE signica conte udo (agora sempre com 3 d gitos) da gaveta de endere co EE. Na instru c ao pare usamos sempre EE=0. Por exemplo, a instru c ao 512 encontrada pelo CHICO em alguma gaveta e interpretada por ele como some o conte udo da gaveta 12 ao conte udo do acumulador e guarde o resultado no acumulador. Na tabela dada a seguir apresentamos o programa da Sub-Se c ao 2.1.9 codicado para o computador HV-2: 30

2.2. O Computador HV-2 endere co 01 02 03 04 05 06 07 08 09 10 instru c ao codicada 311 312 412 111 512 211 112 602 411 700

dct-ufms

Observe um fato muito importante: e imposs vel, no modelo HV-2, distinguir-se o conte udo de uma gaveta como correspondendo a uma instru c ao codicada ou a um n umero manipulado por certas instru c oes, o que n ao era o caso do modelo HV-1. Por exemplo, seguindo a execu c ao do programa exemplo da Sub-Se ca o 2.1.9, vemos, na d ecima quarta linha, que a gaveta 11 recebe o conte udo 105, correpondendo ao n umero cento e cinco (resultado da soma at e esse momento) e n ao ` a instru c ao carregue no AC o c05. Como pode o CHICO distinguir esses dois signicados? Na verdade, a distin c ao e feita atrav es da situa c ao em que o CHICO se encontra ao se utilizar de uma gaveta (no caso, a 11). Assim, se ele estiver abrindo uma gaveta (no caso, a 11) ` a procura da pr oxima instru c ao a ser executada, o seu conte udo ser a interpretado como sendo uma instru c ao codicada (no caso, a instru c ao 105). Por outro lado, se essa gaveta for aberta durante a execu c ao de uma instru c ao, o seu conte udo ser a usado como um valor num erico (no caso, o n umero 105). A id eia de se armazenar as instru c oes da mesma maneira que os dados e atribu da ao famoso matem atico americano John Von Neumann, que em meados da d ecada de 1940 prop os esse esquema. Esse conceito foi um dos motivos que possibilitou a r apida evolu c ao dos computadores da para frente. A codica c ao, por meio de n umeros, de instru c oes que manipulam n umeros e, em ess encia, a id eia fundamental. Uma id eia an aloga foi aplicada na d ecada de 1930 pelo matem atico alem ao G odel, o qual codicou numericamente teoremas sobre n umeros, permitindo assim se enunciar teoremas sobre teoremas, chegando ao seu famoso teorema da incompletude dos sistemas axiom aticos.

31

2.3. O Computador HIPO

dct-ufms

2.3

O Computador HIPO

O fabricante dos computadores HV-2 percebeu, em um dado instante, que eles tinham as seguintes desvantagens: 1. os valores num ericos que podiam ser representados nas gavetas eram muito restritos, permitindo apenas 3 algarismos, sem sinal; 2. o operador CHICO era muito lento; 3. da mesma maneira, o mecanismo das gavetas e de outros componentes tamb em era muito lento. Assim, prop os-se a fabricar um outro computador, que denominou de HIPO (cuja sigla prov em de computador hipot etico). Podemos descrever a sua organiza c ao comparando-a com a do HV-2.

2.3.1

Mem oria

Em lugar do gaveteiro, o HIPO disp oe de um dispositivo eletr onico, denominado mem oria, com regras de funcionamento an alogas ` as do gaveteiro do HV-2. Este dispositivo cont em partes, denominadas c elulas, que correspondem ` as gavetas no gaveteiro. Cada c elula tem comprimento de 8 bits (1 byte). O modelo mais simples do HIPO e produzido com mem oria de 32 c elulas, de endere cos 00 a 31. Em cada c elula podem ser representadas instru c oes codicadas como especicado mais adiante ou um n umero inteiro de -128 a 127, representado por complemento de 2 (dois).

2.3.2

CPU

No caso do computador HV-2, um operador, o CHICO, acionava todos os dispositivos, seja gaveteiro ou calculadora. No HIPO, esse papel e desempenhado por um sistema de circuitos eletr onicos, cujo funcionamento equivale as a ` c oes executadas pelo CHICO no HV-2. Esse sistema e denominado de Unidade de Controle ou simplesmente UC. Na Se c ao 2.1.6 foi dito que o CHICO pode estar em um dos dois estados: carga e execu c ao. Analogamente, a unidade de controle do HIPO estar a um um desses dois estados em qualquer instante. O CHICO interpretava as

32

2.3. O Computador HIPO

dct-ufms

instru c oes escritas nas gavetas do HV-2. As instru c oes interpretadas por essa UC do HIPO e armazenadas na mem oria t em o formato mostrado a seguir: C C C E E E E E

onde os d gitos bin arios CCC representam o c odigo da instru c ao e os d gitos bin arios EEEEE representam o endere co de uma c elula de mem oria. No lugar da calculadora, o computador HIPO realiza as opera c oes aritm eticas por meio de um conjunto de circuitos denominado Unidade L ogica e Aritm etica ou simplesmente ULA. Para executar uma opera c ao de soma, por exemplo, impulsos eletr onicos s ao encaminhados ` a se c ao apropriada do circuito da ALU, iniciando uma sequ encia de opera c oes que resulta na obten c ao do resultado da opera c ao no acumulador. O acumulador e um registrador acess vel eletronicamente, isto e, n ao possui exibi c ao visual.

2.3.3

EPI

O endere co da pr oxima instru c ao e um registrador eletr onico, sem exibi c ao visual, com formato de um n umero com 5 algarismos bin arios. Somente a CPU do HIPO tem acesso ao EPI, podendo consult a-lo ou alterar seu conte udo.

2.3.4

Unidade de Entrada

Em lugar do porta-cart oes, o HIPO cont em uma unidade de entrada com capacidade para ler eletronicamente linhas de entrada com o formato apresentado a seguir: I/D : e E: .

Isto e, cada linha de entrada cont em duas partes. Se a unidade de controle est a em estado de execu ca o, s o e utilizada a parte I/D (iniciais de Instru c ao/ Dado). O usu ario especica na mesma um n umero de 8 d gitos bin arios, onde o d gito mais signicativo representa o sinal do n umero (0-n ao negativo e 1-negativo). Uma instru c ao de leitura executada pela unidade de controle provoca a transcri c ao do n umero dado pelo usu ario na linha de entrada para uma c elula da mem oria. O endere co dessa c elula e especicado pela instru c ao de leitura.

33

2.3. O Computador HIPO

dct-ufms

No estado de carga, o usu ario especica em I/D uma instru c ao conforme o formato dado na Se c ao 2.3.2 e, em E, o endere co da c elula de mem oria onde a instru c ao deve ser carregada. O mesmo esquema do HV-1 e usado para se mudar a unidade de controle do estado de carga para o estado de execu c ao e vice-versa. V arios dispositivos podem ser usados como unidade de entrada: cart oes perfurados (onde furos codicam os elementos das linhas), cart oes marcados a l apis ou com tinta magn etica, teclado como de m aquina de escrever, etc. Todos eles transformam a representa c ao externa acess vel ao usu ario em impulsos eletr onicos que s ao enviados pela unidade de controle ` a mem oria, posicionando os circuitos desta a m de que as c elulas envolvidas tenham um conte udo equivalente ` a representa c ao externa.

2.3.5

Unidade de Sa da

Em lugar da folha de sa da do HV-2, o HIPO cont em uma unidade de sa da com capacidade de gravar linhas de sa da. Cada uma destas consiste em um n umero com 8 d gitos bin arios, onde o d gito mais signicativo indica o sinal do n umero (0-n ao negativo e 1-negativo). Novamente, nenhum dispositivo de sa da particular foi indicado, podendo o mesmo ser uma m aquina de escrever, uma impressora de linha, um terminal de v deo, etc.

2.3.6

Instru co es do HIPO

Vejamos algumas das instru c oes do computador HIPO. Supomos que as instru c oes tenham c odigo de endere co EEEEE. Lembramos que cAC abrevia conte udo do acumulador.

34

2.4. Bibliograa

dct-ufms

instru c ao codicada 001EEEEE 010EEEEE 011EEEEE 100EEEEE 101EEEEE 110EEEEE 111EEEEE 000EEEEE

signicado carrega o cEEEEE no AC armazena o cAC em EEEEE l e uma linha de entrada e p oe seu conte udo em EEEEE grava o cEEEEE em uma linha de sa da soma o cEEEEE ao cAC e guarda o resultado em AC desvia para EEEEE se cAC= 0 pare inicia o estado de execu c ao com a instru c ao em EEEEE

2.3.7

Exemplo de Programa

A tabela a seguir ilustra o programa da Se c ao 2.1.9 escrito na linguagem de m aquina do computador HIPO. endere co 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 instru c ao 01101010 01101011 10001011 00101010 10101011 01001010 00101011 11000001 10001010 11100000

2.4

Bibliograa

O texto apresentado neste Cap tulo foi retirado e adaptado, com ns did atico, do Cap tulo 2, O Computador ` a Gaveta, do livro Introdu c ao ` a Computa c ao e ` a Constru c ao de Algoritmos de autoria dos professores Routo Terada e Waldemar W. Setzer, publicado pela editora Makron Books do Brasil em 1992.

35

Cap tulo 3 Desenvolvimento de Algoritmos - Parte I


Neste t opico, voc e encontrar a uma breve descri c ao dos componentes de um algoritmo e aprender a a construir algoritmos utilizando os componentes mais simples e uma linguagem de programa c ao virtual.

3.1

Componentes de um Algoritmo

Quando desenvolvemos algoritmos, trabalhamos, tipicamente, com sete tipos de componentes: estruturas de dados, vari aveis, constantes, instru c oes de manipula c ao de dados, express oes condicionais, estruturas de controle e m odulos. Cada um destes tipos de componentes est ao descritos brevemente a seguir: Estrutura de dados, vari aveis e constantes. Dados s ao representa c oes de informa c oes usadas por um algoritmo. Isto inclui dados de entrada e sa da, bem como dados gerados pelo algoritmo para seu pr oprio uso. Quando um algoritmo e executado por um computador, os valores dos dados por ele manipulados devem ser armazenados em algum dep osito, de modo que tais valores estejam dispon veis para serem usados pelo algoritmo a qualquer momento. A deni c ao da organiza c ao interna de tais dep ositos, bem como da rela c ao entre suas partes, e conhecida como estrutura de dados. Na maior parte das vezes, desejamos que um dep osito de dados seja 36

3.1. Componentes de um Algoritmo

dct-ufms

vari avel, isto e, que o seu conte udo possa ser alterado durante a execu c ao do algoritmo. Por exemplo, no algoritmo para calcular o MDC de dois n umeros naturais (ver Cap tulo 1), a, b e r s ao dep ositos para valores de dados cujos conte udos mudam durante a execu c ao do algoritmo. Outras vezes, queremos que o conte udo de um dep osito de dados seja constante, ou seja, que ele n ao seja alterado durante a execu c ao do algoritmo. Instru co es para Manipula c ao de Dados. Qualquer algoritmo requer instru c oes que fa cam o seguinte: obtenham valores de dados fornecidos pelo usu ario e armazenem-os em estruturas de dados; manipulem aqueles valores de dados, isto e, modiquem o valor de uma vari avel atrav es de opera c oes aritm eticas, copiem o valor de uma vari avel para outra, entre outras; comuniquem os valores de dados resultantes do algoritmo ao usu ario. Express oes condicionais. Algoritmos tamb em apresentam pontos de decis ao. A capacidade de um algoritmo de tomar decis oes e o que o faz potente. Se um algoritmo n ao pudesse fazer mais do que seguir uma u nica lista de opera c ao, ent ao um computador nada mais seria do que uma m aquina de calcular. Tais decis oes s ao baseadas em express oes condicionais que, quando avaliadas, resultam em apenas um dos seguintes dois valores: verdadeiro ou falso. Por exemplo, no algoritmo para calcular o MDC de dois n umeros naturais (ver Cap tulo 1), a compara c ao r e igual a zero e um exemplo de express ao condicional. O resultado desta compara c ao pode ser apenas verdadeiro ou falso, dependendo se r e igual a zero ou n ao, respectivamente. Se uma express ao condicional e verdadeira, o algoritmo pode agir de diferentes formas, tal como executar certas instru c oes ou n ao execut alas. Portanto, a partir do resultado de uma express ao condicional, o algoritmo pode tomar decis oes diferentes. No algoritmo para calcular o MDC, se a express ao condicional r e igual a zero e verdadeira, o algoritmo encerra sua execu c ao. Do contr ario, ele continua a execu c ao. Estruturas de controle. Os elementos de um algoritmo que governam o que ocorre depois que um algoritmo toma uma decis ao s ao denominados estruturas de controle. Sem estruturas de controle, as decis oes 37

3.2. Uma Linguagem para Algoritmos

dct-ufms

n ao possuem qualquer valor. Isto e, o que adianta tomar uma decis ao se voc e n ao pode efetu a-la? Sem estruturas de controle, o algoritmo e apenas uma lista de instru c oes que deve ser executada sequencialmente. Estruturas de controle permitem que um algoritmo possa tomar decis oes e, a partir delas, executar algumas instru c oes ou n ao, repetir a execu c ao de certas instru c oes e executar um grupo de instru c oes em detrimento de outro. No algoritmo para calcular o MDC de dois n umeros naturais foi utilizada uma estrutura de controle condicional que permite encerrar ou n ao a execu c ao do algoritmo, dependendo do resultado da avalia c ao da express ao condicional r e igual a zero: se r e igual a zero ent ao o MDC e igual a b e a execu c ao encerra aqui. Caso contr ario, siga para a pr oxima instru c ao. M odulos. Algoritmos podem se tornar muito complexos, de modo que agrupar todos os seus componentes em uma u nica unidade far a com que o algoritmo seja dif cil de entender, dif cil de manter e dif cil de estender. Para evitar que isso ocorra, constru mos nossos algoritmos utilizando m odulos, que s ao trechos de algoritmos que agrupam instru c oes e dados necess arios para a realiza c ao de uma dada tarefa l ogica do algoritmo, que seja a mais independente poss vel das demais. A utiliza c ao de m odulos facilita o entendimento do algoritmo, pois eles s ao menores do que o algoritmo como um todo e podem ser entendidos individualmente, isto e, para entendermos um deles n ao precisamos, necessariamente, entender os demais, visto que eles s ao partes independentes do algoritmo. A manuten c ao do algoritmo tamb em e facilitada, pois a modica c ao de um m odulo n ao deve afetar os demais, desde que o m odulo continuar a fazendo o que ele fazia antes. Por u ltimo, a extens ao de um algoritmo pode ser feita mais facilmente se pudermos reutilizar m odulos j a existentes.

3.2

Uma Linguagem para Algoritmos

A experi encia tem mostrado que e necess ario expressar id eias algor tmicas em uma forma mais precisa e mais compacta do que aquela encontrada em uma linguagem natural, tal como Portugu es. H a muitas linguagens que

38

3.3. Tipos de Dados

dct-ufms

poder amos utilizar com o prop osito de escrever algoritmos, incluindo qualquer linguagem de programa c ao, as quais nos permitem escrever algoritmos em uma forma que os computadores podem entender. A vantagem de usar uma linguagem de programa c ao e que podemos, de fato, executar nossos algoritmos em um computador. Entretanto, para o prop osito de introduzir conceitos algor tmicos, esta abordagem possui tr es s erias desvantagens: Linguagens de programa c ao s ao criadas com algum prop osito espec co em mente e, desta forma, enfatizam algumas caracter sticas em detrimento de outras. N ao h a linguagem de programa c ao que possa ser considerada a melhor. A op c ao por qualquer uma delas resultaria em compromissos que omitem a diferen ca entre propriedades importantes de algoritmos e as propriedades de certos tipos de programas. As linguagens de programa c ao incluem muitos detalhes t ecnicos que introduzem diculdades extras que n ao est ao relacionadas com o aspecto l ogico da resolu c ao de problemas algor tmicos. Os praticantes se tornam t ao envolvidos com os aspectos t ecnicos das linguagens que desviam a aten c ao da import ancia de um bom projeto de algoritmo. Por estas raz oes, neste curso, os algoritmos ser ao descritos em pseudoc odigo (uma linguagem virtual de programa c ao). Entretanto, oportunamente, traduziremos alguns algoritmos que construiremos na sala de aula para seus equivalentes na linguagem de programa c ao C++.

3.3

Tipos de Dados

Os dados manipulados por um algoritmo podem possuir natureza distinta, isto e, podem ser n umeros, letras, frases, etc. Dependendo da natureza de um dado, algumas opera c oes podem ou n ao fazer sentido quando aplicadas a eles. Por exemplo, n ao faz sentido falar em somar duas letras. Para poder disting uir dados de naturezas distintas e saber quais opera c oes podem ser realizadas com eles, os algoritmos lidam com o conceito de tipo de dados. O tipo de um dado dene o conjunto de valores ao qual o valor do dado pertence, bem como o conjunto de todas as opera c oes que podem atuar sobre qualquer valor daquele conjunto de valores. Por exemplo, o tipo de 39

3.3. Tipos de Dados

dct-ufms

dados num erico pode ser imaginado como o conjunto de todos os n umeros e de todas as opera c oes que podem ser aplicadas aos n umeros. Os tipos de dados manipulados por um algoritmo podem ser classicados em dois grupos: at omicos e complexos. Os tipos at omicos s ao aqueles cujos elementos do conjunto de valores s ao indivis veis. Por exemplo, o tipo num erico e at omico, pois os n umeros n ao s ao compostos de partes. Por outro lado, os tipos complexos1 s ao aqueles cujos elementos do conjunto de valores podem ser decompostos em partes mais simples. Por exemplo, o tipo cadeia e aquele cujos elementos do conjunto de valores s ao frases e frases podem ser decompostas em caracteres, os quais s ao indivis veis. Entre os tipos at omicos, os mais comuns s ao: num erico: inclui os n umeros inteiros, racionais e irracionais e as opera c oes aritm eticas e relacionais para estes n umeros. Na nossa linguagem de descri c ao de algoritmos, os n umeros inteiros s ao escritos apenas como a concatena c ao dos d gitos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9. Por exemplo, 5, 100 e 1678. Os n umeros com fra c ao devem ser escritos, nos algoritmos, com a presen ca do ponto decimal. Por exemplo, 3.14159, 100.0 e 0.5. No caso do n umero ser negativo, adicionamos o sinal na frente do n umero, tal como 23. Dentre os tipos numricos distinguiremos os tipos inteiro e real que incluem, respectivamente, os nmeros inteiros e reais. caracter: inclui os s mbolos do alfabeto usado pela nossa linguagem de programa c ao virtual. Estes s mbolos consistem das letras do alfabeto romano, dos d gitos 0, 1, . . . , 9, dos caracteres de pontua c ao, tais como ?, ., . . ., dos s mbolos de opera c ao aritm etica + e , entre outros. As opera c oes denidas para este tipo s ao igualdade e desigualdade. Os elementos do conjunto de valores do tipo caracter devem ser escritos, nos algoritmos, entre aspas simples, como, por exemplo, a, 1 e ?. Note a diferen ca entre escrever 1 e 1. No primeiro caso, temos o n umero inteiro um; no segundo, o caracter representando o d gito um. l ogico: inclui apenas os valores verdadeiro e falso e as opera c oes l ogicas. Nos algoritmos, estes valores s ao escritos como V e F. Entre os tipos complexos, vamos utilizar inicialmente apenas o tipo cadeia, cujo conjunto de valores e formado por frases ou cadeias. Por frase,
1

Alguns autores utilizam o termo estruturado ao inv es de complexo.

40

3.4. Vari aveis

dct-ufms

entendemos uma concatena c ao de valores do tipo caracter. As frases s ao escritas, nos algoritmos, entre aspas duplas, tal como Entre com algum valor: . Note que a e a s ao valores pertencentes a tipos distintos. No primeiro caso, temos uma frase que cont em apenas o caracter a; no segundo, temos o caracter a.

3.4

Vari aveis

Como dito antes, um algoritmo manipula dados, que podem ser dados vari aveis ou constantes. Por exemplo, em um algoritmo que calcula a area de um c rculo, o raio do c rculo e um dado de entrada vari avel, pois o valor do raio pode variar de c rculo para c rculo. Por outro lado, o valor do n umero 2 , utilizado no c alculo da area do c rculo , e uma constante. N ao importa qual seja o raio do c rculo, o mesmo valor e utilizado no c alculo da area. Um algoritmo representa dados vari aveis e dados constantes atrav es de vari aveis e constantes, respectivamente. Uma vari avel pode ser imaginada como um dep osito para armazenar valores de dados, para o qual existe um nome, conhecido como identicador, e cujo conte udo pode ser alterado pelo algoritmo. O identicador de uma vari avel deve ser distinto daquele das demais vari aveis do algoritmo, pois e atrav es do identicador da vari avel que o algoritmo a disting ue das demais e tem acesso ao seu conte udo. O ato de criar uma vari avel e conhecido como declara c ao de vari avel. Cada vari avel utilizada em um algoritmo deve ter sido declarada antes de ser utilizada pela primeira vez. Ao criarmos uma vari avel, temos de, explicitamente, associar-lhe um tipo de dados, pois o tipo determina o conjunto de valores que a vari avel pode armazenar e, conseq uentemente, a estrutura de dados que dene o conte udo da vari avel. Desta forma, se uma vari avel e declarada como sendo do tipo num erico, ela n ao poder a armazenar qualquer outro valor que n ao seja um n umero. Para se declarar uma vari avel, segue-se o formato abaixo: <tipo da varivel> <lista de identicadores> onde tipo da vari avel o nome do tipo ao qual as variveis estaro associadas e lista de identicadores uma lista de identicadores de variveis separados por vrgula.
2

A area do c rculo e dada por r2 , onde r e o raio do c rculo.

41

3.5. Constantes

dct-ufms

Como exemplo, considere a declara c ao de duas vari aveis, denominadas x do tipo inteiro e y do tipo real: inteiro x inteiro y Quando executamos um algoritmo em um computador, a cada vari avel corresponde uma posi c ao distinta de mem oria, em geral, o endere co da primeira c elula de mem oria ocupada pelo conte udo da vari avel. Vari aveis, portanto, nada mais s ao do que representa c oes simb olicas para posi c oes de mem oria que armazenam dados. O uso de vari aveis e uma caracter stica das linguagens de alto-n vel, pois, como pudemos constatar no cap tulo anterior, quando programamos em linguagem de m aquina, utilizamos os pr oprios endere cos de mem oria para referenciar os dados manipulados pelo programa.

3.5

Constantes

Uma constante faz exatamente o que o nome sugere: representa um dado cujo valor n ao muda durante todo o algoritmo. Assim como uma vari avel, uma constante tamb em possui um identicador u nico e deve ser declarada antes de ser utilizada. No entanto, como o valor da constante e xo, ele e atribu do ` a constante no momento de sua declara c ao, de modo que n ao h a necessidade de explicitarmos o tipo do valor da constante. Em nossa linguagem de escrita de algoritmos, uma constante e declarada da seguinte forma: dena <identicador> <valor> onde dena uma palavra-chave, identicador e o identicador da constante e valor e o valor da constante. Entenda por palavra-chave qualquer palavra que tenha um signicado espec co para o algoritmo e que n ao deve ser utilizada para qualquer outro prop osito, tal como para dar um nome a uma vari avel. Neste curso, as palavras-chaves sempre aparecer ao sublinhadas. Como exemplo, temos a declara c ao de duas constantes, P I e M EN SAGEM : dena P I 3.14159 Dena M EN SAGEM A area do c rculo e: Desta forma, P I e uma constante do tipo num erico e M EN SAGEM e uma constante do tipo cadeia, ou seja, M EN SAGEM e uma frase. 42

3.6. Operadores

dct-ufms

3.6

Operadores

N os declaramos vari aveis e constantes a m de criar espa co para armazenar os valores dos dados manipulados pelo algoritmo. Uma vez que declaramos as vari aveis e constantes, temos a nossa disposi c ao v arios tipos de operadores, com os quais podemos atribuir valor a uma vari avel e manipular os valores armazenados em vari aveis e constantes. H a tr es categorias b asicas de operadores: operadores de atribui c ao, operadores aritm eticos e operadores de entrada e sa da.

3.6.1

Operador de Atribui c ao

O ato de atribuir ou copiar um valor para uma vari avel e conhecido como atribui c ao. Utilizaremos o operador de atribui c ao () como um s mbolo para esta opera c ao. Por exemplo, as seguintes instru c oes atribuem os valores 4 e a ` as vari aveis x e y , respectivamente: x4 y a Ap os tais opera c oes de atribui c ao serem executadas, x conter a o valor 4 e y , o valor a. Lembre-se de que, para qualquer vari avel ser utilizada em um algoritmo, temos de declar a-la antes de seu primeiro uso.

3.6.2

Operadores Aritm eticos

Os operadores aritm eticos b asicos s ao quatro: adi c ao, representado pelo s mbolo +; subtra c ao, representado pelo s mbolo ; multiplica c ao, representado pelo s mbolo ; e divis ao, representado pelo s mbolo /. Estes operadores podem ser aplicados a express oes envolvendo valores num ericos quaisquer, n ao importando se o n umero e inteiro ou cont em parte fracion aria. Como exemplo, suponha que as vari aveis a, b e c tenham sido declaradas como segue: inteiro a, b, c 43

3.6. Operadores

dct-ufms

Ent ao, podemos escrever express oes como as seguintes: a+b+c a b c/2 A opera c ao de divis ao, representada pelo s mbolo /, e a divis ao real. Isto e, mesmo que os operandos sejam n umeros inteiros, o resultado e real. Entretanto, para podermos trabalhar apenas com aritm etica inteira, existem dois outros operadores: DIV e MOD. DIV e o operador de divis ao para n umeros inteiros. Se zermos 4 DIV 3, obteremos 1 como resultado, ao passo que 4/3 resulta em 1.333 . . .. J a o operador MOD e utilizado para obtermos o resto de uma divis ao inteira. Por exemplo, 5 M OD 2 e igual a 1, o resto da divis ao inteira de 5 por 2.

3.6.3

Comando de Atribui c ao

Um comando de atribui c ao e qualquer comando que inclua um operador de atribui c ao. Este comando sempre envolve uma vari avel, que se localiza ` a esquerda do operador, e um valor ou uma express ao que se localiza ` a direita do operador. Quando um comando de atribui c ao e executado, o valor do lado direito do operador de atribui c ao, que pode ser uma constante, o conte udo de uma vari avel ou o resultado de uma express ao, e copiado para a vari avel do lado esquerdo do operador. Como exemplo, considere os seguintes comandos de atribui c ao: xa+2c y4 zy onde a, c, x, y e z s ao vari aveis.

3.6.4

Preced encia de Operadores

Assim como na aritm etica padr ao, a preced encia de operadores nas express oes aritm eticas dos algoritmos tamb em e governada pelo uso de par enteses. A menos que os par enteses indiquem o contr ario, as opera c oes de divis ao e multiplica c ao s ao executadas primeiro e na ordem em que forem encontradas ao lermos a express ao da esquerda para a direita. Em seguida, temos as opera c oes de adi c ao e subtra c ao. Como exemplo, considere o seguinte trecho algor tmico: inteiro a inteiro b 44

3.6. Operadores

dct-ufms

inteiro c inteiro x a2 b3 c4 xa+bc Este trecho de c odigo armazenar a o valor 14 na vari avel x. Se fosse desejado realizar a opera c ao de adi c ao primeiro, o comando de atribui c ao seria x (a + b) c Neste caso, o uso dos par enteses fez com que a opera c ao de adi c ao fosse realizada primeiro. Na nossa linguagem para escrita de algoritmos, a utiliza c ao de par enteses possui o mesmo signicado visto no primeiro grau. Al em de possu rem prioridade m axima perante os demais operadores aritm eticos, os par enteses tamb em podem ocorrer de forma aninhada, como na express ao abaixo: ((2 + 3) (1 + 2)) 3 (3 + (3 2)) que resulta no valor 2.

3.6.5

Entrada e Sa da

Qualquer algoritmo requer a obten c ao de dados do mundo (entrada) e tamb em um meio de comunicar ao mundo o resultado por ele obtido (sa da). Para tal, existem duas opera c oes, denominadas entrada e sa da, realizadas, respectivamente, pelos operadores leia e escreva. O operador de leitura tem sempre um ou mais vari aveis como operandos, enquanto o operador de sa da pode possuir constantes, vari aveis e express oes como operandos. A forma geral destes operadores : leia <lista de variveis> escreva <lista de variveis e/ou constantes e/ou expresses > onde leia e escreva so palavras-chave, lista de variveis uma lista de identicadores separados por vrgula, e lsita de identicadores e/ou constantes e/ou expresses, como o prprio nome j dene uma lista contendo identicadores (de constantes ou variveis), constantes e expresses, independente de alguma ordem. 45

3.7. Estrutura Geral de um Algoritmo

dct-ufms

Como exemplo do uso dos operadores de entrada e sa da, temos: inteiro x leia x escreva x escreva O valor de x e:, x

3.7

Estrutura Geral de um Algoritmo

Nesta Se c ao, veremos algumas caracter sticas que encontraremos nos algoritmos que estudaremos neste curso: 1. A linha de cabe calho, que e a primeira linha do algoritmo, cont em a e o nome palavra-chave algoritmo, seguida por um identicador, que escolhido para o algoritmo. 2. A declarao de constantes e variveis ser o prximo passo, sendo que a declarao de constantes precede a declarao de variveis. 3. O corpo do algoritmo contm as instrues que faze parte da descrio do algoritmo. 4. A linha nal, que eau ltima linha do algoritmo, cont em a palavra-chave malgoritmo para especicar onde o algoritmo termina. Temos ainda alguns detalhes que serviro para deixar o algoritmo mais claro e mais fcil de ler: 1. Os passos do algoritmo so especicados atravs da identao dos vrios comandos entre a linha de cabealho e a linha nal. A identao, visualmente, enquadra o corpo do algoritmo no olho humano e acaba com a confuso criada por no sabermos onde o algoritmo comea ou termina. 2. Dentro do corpo do algoritmo, linhas em branco s ao usadas para dividir o algoritmo em partes logicamente relacionadas e tornar o algoritmo mais leg vel. 3. O algoritmo pode vir seguido de coment arios. Coment arios s ao linhas que n ao s ao executadas e cujo prop osito e apenas o de facilitar o entendimento do algoritmo por parte de quem desejar l e-lo. As linhas 46

3.7. Estrutura Geral de um Algoritmo

dct-ufms

de coment ario s ao iniciadas com duas barras (//) e podem abrigar qualquer texto. Como exemplo, considere um algoritmo para calcular e escrever a area de um c rculo, dado o raio do c rculo. // algoritmo para calcular a area do c rculo algoritmo area do circulo // declara c ao de constantes e vari aveis dena P I 3.14159 area do c rculo e: dena M EN SAGEM O valor da real raio, area // leitura do raio do c rculo leia raio // c alculo da area do c rculo area P I raio raio // comunica c ao do resultado escreva M EN SAGEM , area malgoritmo

Bibliograa
O texto deste cap tulo foi elaborado a partir dos livros abaixo relacionados: 1. Pothering, G.J., Naps, T.L. Introduction to Data Structures and Algorithm Analysis with C++. West Publishing Company, 1995. 2. Shackelford, R.L. Introduction to Computing and Algorithms. AddisonWesley Longman, Inc, 1998.

47

Cap tulo 4 Desenvolvimento de Algoritmos - Parte II


Neste t opico, voc e estudar a detalhadamente dois componentes dos algoritmos: express oes condicionais e estruturas de controle. Como visto no cap tulo anterior, as express oes condicionais possibilitam os algoritmos tomarem decis oes que s ao governadas pelas estruturas de controle.

4.1

Express oes Condicionais

Denomina-se express ao condicional ou expres ao l ogica a express ao cujos operandos s ao rela c oes, constantes e/ou vari aveis do tipo l ogico.

4.1.1

Rela co es

Uma express ao relacional, ou simplesmente rela c ao, e uma compara c ao entre dois valores do mesmo tipo b asico. Estes valores s ao representados na rela c ao atrav es de constantes, vari aveis ou express oes aritm eticas.

48

4.1. Express oes Condicionais

dct-ufms

Os operadores relacionais, que indicam a compara c ao a ser realizada entre os termos da rela c ao, s ao conhecidos da Matem atica: Operador = = > < Descri c ao igual a diferente de maior que menor que maior ou igual a menor ou igual a

O resultado da avalia c ao de uma rela c ao e sempre um valor l ogico, isto e, V ou F. Como exemplo, considere as vari aveis a, b e c denidas a seguir: inteiro a, b, c Agora, suponha as seguintes atribui c oes: a2 b3 c4 Ent ao, as express oes a = 2, a > b + c, c 5 a e b = 3 valem V, F, F e F, respectivamente.

4.1.2

Operadores L ogicos

Uma proposi c ao e qualquer senten ca que possa ser avaliada como verdadeira ou falsa. Por exemplo, a senten ca a popula c ao de Campo Grande e de 500 mil habitantes pode ser classicada como verdadeira ou falsa e, portanto, e uma proposi c ao. J a a senten ca feche a porta! n ao pode e, consequentemente, n ao e uma proposi c ao. No nosso contexto, uma proposi c ao e uma rela c ao, uma vari avel e/ou uma constante do tipo l ogico. As express oes condicionais ou l ogicas s ao formadas por uma ou mais proposi c oes. Quando h a mais de uma proposi c ao em uma express ao l ogica, elas est ao relacionadas atrav es de um operador l ogico. Os operadores l ogicos utilizados como conectivos nas express oes l ogicas s ao os seguintes: 49

4.1. Express oes Condicionais Operador E OU NAO Descri c ao para a conjun c ao para a disjun c ao para a nega c ao

dct-ufms

Duas proposi c oes podem ser combinadas pelo conectivo E para formar uma u nica proposi c ao denominada conjun c ao das proposi c oes originais. A conjun c ao das proposi c oes p e q e representada por p q e lemos p e q . O resultado da conjun c ao de duas proposi c oes e verdadeiro se e somente se ambas as proposi c oes s ao verdadeiras, como mostrado na tabela a seguir. p V V F F q V F V F pq V F F F

Duas proposi c oes quaisquer podem ser combinadas pelo conectivo OU (com o sentido de e/ou) para formar uma nova proposi c ao que e chamada disjun c ao das duas proposi c oes originais. A disjun c ao de duas proposi c oes p eq e representada por p q e lemos p ou q . A disjun c ao de duas proposi c oes e verdadeira se e somente se, pelo menos, uma delas for verdadeira, como mostrado na tabela a seguir. p V V F F q V F V F pq V V V F

Dada uma proposi c ao p qualquer, uma outra proposi c ao, chamada ne falso que antes de p ou, se ga c ao de p, pode ser formada escrevendo E poss vel, inserindo a palavra n ao em p. Simbolicamente, designamos a nega c ao de p por p e lemos n ao p. Desta forma, podemos concluir que se p e verdadeira, ent ao p e falsa; se p e falsa, ent ao p e verdadeira, como mostrado na tabela a seguir. p V F p F V 50

4.1. Express oes Condicionais

dct-ufms

Agora, vejamos alguns exemplos de express oes l ogicas que utilizam os conectivos vistos antes. Considere as vari aveis a, b, c e x denidas a seguir: inteiro a, b, c l ogico x Agora, suponha as seguintes atribui c oes: a2 b3 c4 xF x valem Ent ao, as express oes a = 2 E a > b + c, c 5 a OU b = 3, e NAO F, F e V, respectivamente. Na primeira express ao, a = 2 E a > b + c, a = 2 e a > b + c s ao rela c oes. Em particular, a > b + c cont em uma express ao aritm etica, b + c, que devemos resolver primeiro para da podermos avaliar a rela c ao a > b + c. De forma an aloga, devemos primeiro resolver as rela c oes a = 2 e a > b + c para podermos resolver a express ao l ogica a = 2 E a > b + c. Isto signica que estamos realizando as opera c oes em uma certa ordem: em primeiro lugar, fazemos as opera c oes aritm eticas, depois as opera c oes relacionais e, por u ltimo, as opera c oes l ogicas. A tabela a seguir ilustra a prioridade de todos os operadores vistos at e aqui. Operador /, , DIV, MOD +, =, =, , , >, < NAO E OU Prioridade 1 (m axima) 2 3 4 5 6 (m nima)

Observe que entre os operadores l ogicos existe n veis distintos de prioridade, assim como entre os operadores aritm eticos. Isto signica que na express ao a = 2 OU a > b + c E c 5 a, a opera c ao l ogica a > b + c E c 5 a e realizada primeiro e seu resultado e, ent ao, combinado atrav es do operador c ao a = 2. Se quis essemos mudar a de disjun c ao (OU) com aquele da rela ordem natural de avalia c ao, poder amos escrever a express ao com o uso de par enteses: (a = 2 OU a > b + c) E c 5 a. 51

4.2. Estruturas de Controle

dct-ufms

4.2

Estruturas de Controle

Uma vez que a express ao condicional foi avaliada, isto e, reduzida para um valor V ou F, uma estrutura de controle e necess aria para governar as a c oes que se suceder ao. Daqui em diante, veremos dois tipos de estruturas de controle: estrutura condicional e estrutura de repeti c ao.

4.2.1

Estruturas Condicionais

A estrutura condicional mais simples e a se - ent ao - mse. A forma geral desta estrutura e mostrada a seguir: se <express ao condicional> ent ao comando1 comando2 . . . comandon mse Esta estrutura funciona da seguinte forma: se express ao condicional for verdadeira, os comandos 1, 2, . . . , n, contidos dentro da estrutura, s ao executados e, depois disso, o comando imediatamente depois da estrutura de controle e executado. Caso contr ario, os comandos 1, 2, . . . , n n ao s ao executados e o uxo de execu c ao do algoritmo segue com o comando imediatamente depois da estrutura de controle. Isto signica que esta forma de estrutura de controle permite que um algoritmo execute ou n ao um determinado n umero de comandos, dependendo de uma dada condi c ao ser ou n ao satisfeita.

52

4.2. Estruturas de Controle

dct-ufms

Como exemplo, considere um algoritmo para ler dois n umeros, a e b, e escrev e-los em ordem n ao decrescente: // algoritmo para escrever dois n umeros em ordem n ao decrescente algoritmo ordena dois n umeros // declara c ao de vari aveis inteiro a, b, temp // l e os n umeros leia a, b // ordena os n umeros se a > b ent ao temp a ab b temp mse // escreve os n umeros ordenados escreva a, b malgoritmo Tudo que este algoritmo faz e vericar se o valor de a, fornecido na entrada, e maior do que o valor de b; se sim, ele troca os valores de a e b; caso contr ario, ele n ao altera o valor destas vari aveis. Como a opera c ao de troca deve ser realizada apenas quando a > b, ela foi inserida dentro da estrutura condicional se - ent ao - mse. Um outro ponto importante deste exemplo e a opera c ao de troca. Esta opera c ao e realizada com a ajuda de uma outra vari avel, denominada temp, e atrav es de tr es atribui c oes. Isto n ao pode ser feito de outra forma! A m de atribuir o valor de a a b e o valor de b a a, temos de utilizar uma outra vari avel, pois ao executarmos a b, atribu mos o valor de b a a e, consequentemente, perdemos o valor que, anteriormente, estava retido em a. Logo, para podermos fazer com que este valor possa ser atribu do a b, antes de executarmos a b, guardamos o valor de a em um valor seguro: a vari avel temp. Depois, atribu mos o valor em temp a b. 53

4.2. Estruturas de Controle

dct-ufms

Uma varia ca o da estrutura de controle se - ent ao - mse e a estrutura se - ent ao - sen ao - mse. Esta estrutura permite ao algoritmo executar uma de duas seq u encias mutuamente exclusivas de comandos. A forma geral deste comando dada a seguir. se <express ao condicional> ent ao comando1 comando2 . . . comandon seno comando2 . . . comandon mse Neste caso, se o resultado da expresso condicional for verdadeiro, os comandos 1, 2, . . . , n so executados e depois disso o primeiro comando logo aps o m da estrutura de controle executado; caso contrrio, se o resultado da expresso condicional for falso, os comandos 1 , 2 , . . . , n so executados e depois disso o prximo comando a ser executado aquele logo aps o m da estrutura de controle. Notemos que as seqncias de comandos correspondentes a ento e seno so mutuamente exclusivas, isto , ou os comandos 1, 2, . . . , n so executados ou os comandos 1 , 2 , . . . , n so executados. Como exemplo considere um algoritmo para escrever uma mensagem com o resultado de um exame, dada a nota obtida pelo candidato no exame: // algoritmo para escrever resultado de um exame // baseado na nota obtida pelo candidato algoritmo resultado exame // declara c ao de constantes e vari aveis dena N OT AM IN IM A 6.0 real nota // l e a nota do candidato leia nota comando1

54

4.2. Estruturas de Controle

dct-ufms

// compara a nota lida e escreve resultado se nota N OT AM IN IM A ent ao escreva candidato aprovado sen ao escreva candidato reprovado mse malgoritmo

55

4.2. Estruturas de Controle

dct-ufms

As estruturas condicionais podem estar aninhadas, isto e, elas podem ocorrer umas dentro de outras. Como exemplo disto, considere o seguinte algoritmo que l e tr es n umeros e escreve-os em ordem n ao decrescente: // algoritmo para ordenar tr es n umeros algoritmo ordena tr es n umeros // declara c ao de vari aveis inteiro a, b, c, temp // l e os tr es n umeros leia a, b, c // encontra o menor dos tr es n umeros e guarda em a se (a > b) OU (a > c) ent ao se (b c) ent ao temp a ab b temp sen ao temp a ac c temp mse mse // encontra o valor intermedi ario e guarda em b se (b > c) ent ao temp b bc c temp mse // escreve os n umeros em ordem n ao descrescente escreva a, b, c malgoritmo

56

4.2. Estruturas de Controle

dct-ufms

4.2.2

Estruturas de Repeti c ao

A estrutura de repeti c ao, ou simplesmente la co, permite que um grupo de comandos seja executado repetidamente um n umero determinado de vezes ou at e que uma determinada condi c ao se torne verdadeira ou falsa. Nesta Subse c ao, estudaremos tr es estruturas de repeti c ao: a estrutura para - fa ca a estrutura enquanto - fa ca a estrutura repita - at e A estrutura de repeti c ao para - fa ca possui a seguinte forma geral para <vari avel> de <valor inicial> at e <valor nal> fa ca comando1 comando2 . . . comandon mpara e funciona como segue: 1. atribui ` a vari avel, que e o nome de uma vari avel num erica, o valor num erico valor inicial; 2. compara o valor de vari avel com o valor num erico valor nal. Se ele for menor ou igual a valor nal, vai para o passo 3. Caso contr ario, executa o comando imediatamente ap os a estrutura de repeti c ao; 3. executa os comandos 1 a n; 4. incrementa o valor de vari avel de uma unidade. 5. volta para o passo 2.

57

4.2. Estruturas de Controle

dct-ufms

Como exemplo, considere o seguinte algoritmo para calcular e exibir a soma de todos os n umeros pares desde 100 at e 200, inclusive: // algoritmo para somar os pares de 100 a 200 algoritmo soma pares 100 a 200 // declara c ao de vari aveis inteiro soma, i // inicializa com 0 a vari avel que guardar a a soma soma 0 // calcula a soma para i de 100 at e 200 fa ca se i MOD 2 = 0 ent ao soma soma + i mse mpara // escreve o valor da soma escreva A soma dos pares de 100 a 200 e: , soma malgoritmo Neste algoritmo, o la co para - fa ca inicia com a atribui c ao do valor 100 ` a vari avel i. Da i, compara o valor de i com 200 e, como i < 200, executa pela primeira vez os comandos dentro do la co e, ao nal da execu ca o, incrementa i de uma unidade. Deste ponto em diante, o valor de i e comparado com 200 e, caso seja menor ou igual a 200, uma nova itera c ao do la co e realizada e i e novamente incrementada de uma unidade ao nal da itera c ao. Este processo se repete at e que i seja igual a 201. Desta forma, i guarda um valor de 100 a 200 a cada repeti c ao do la co. A cada itera c ao, o algoritmo verica se o valor de i e par ou mpar. Se o valor de i for par, o valor de i e adicionado ao valor na vari avel soma. Observe que a vari avel soma recebe o valor 0 antes do la co ser executado. Esta atribui c ao e denominada inicializa c ao da vari avel. Como voc e pode perceber, soma e utilizada como um acumulador, isto e, a cada itera c ao do la co, soma e incrementada de mais um n umero par e isto e feito somando o 58

4.2. Estruturas de Controle

dct-ufms

valor atual de soma ao n umero par em i e atribuindo o resultado novamente ` a vari avel soma: soma soma + i. Entretanto, se a inicializa c ao n ao estivesse presente no algoritmo, quando o la co fosse executado pela primeira vez, n ao haveria um valor em soma e a atribui c ao soma soma + i n ao faria sentido1 . Uma varia c ao da estrutura de repeti c ao para - fa ca e aquela que nos possibilita controlar o valor do incremento da vari avel contadora do la co: para <vari avel> de <valor inicial> at e <valor nal> passo <incremento> fa ca comando1 comando2 . . . comandon mpara onde incremento e o valor adicionado ao valor de vari avel ao nal de cada ao est a presente, itera c ao. Quando a parte do comando passo <incremento> n o valor assumido para o incremento e 1 (um). Esta varia c ao da estrutura de repeti c ao para - fa ca nos permite, por exemplo, resolver o problema de calcular a soma de todos os pares de 100 a 200 de uma forma mais elegante do que aquela vista anteriormente, como podemos constatar a seguir: // algoritmo para somar os pares de 100 a 200 algoritmo soma pares 100 a 200 // declara c ao de vari aveis inteiro soma, i // inicializa com 0 a vari avel que guardar a a soma soma 0 // calcula a soma para i de 100 at e 200 passo 2 fa ca soma soma + i mpara
Se voc e executasse este algoritmo em computador sem a inicializa c ao de soma, o resultado seria imprevis vel, pois n ao poder amos prever o valor que est a na posi c ao de mem oria do computador correspondente a soma.
1

59

4.2. Estruturas de Controle

dct-ufms

// escreve o valor da soma escreva A soma dos pares de 100 a 200 e: , soma malgoritmo A estrutura de repeti c ao para - fa ca deve ser utilizada apenas quando queremos repetir a execu c ao de um ou mais comandos um n umero conhecido de vezes, como no exemplo anterior. Entretanto, h a problemas em que n ao e poss vel determinar, previamente, o n umero de repeti c oes. Neste caso, ca ou repita - at e. devemos utilizar a estrutura enquanto - fa ca possui a seguinte forma geral A estrutura enquanto - fa enquanto <express ao condicional> fa ca comando1 comando2 . . . comandon menquanto A l ogica do funcionamento desta estrutura de repeti c ao e a seguinte: 1. express ao condicional e avaliada. Se o resultado for verdadeiro, ent ao o uxo do algoritmo segue para o passo seguinte. Caso contr ario, o comando imediatamente posterior ` a estrutura de repeti c ao e executado; 2. executa os comandos de 1 a n; 3. volta para o passo 1.

60

4.2. Estruturas de Controle

dct-ufms

Como exemplo, considere o seguinte algoritmo para ler um n umero inteiro n, que n ao cont em d gito 0, e escrever um n umero inteiro m que corresponde a n invertido: // algoritmo para inverter um nmero inteiro sem d gito 0 algoritmo inverte n umero // declara c ao de vari aveis inteiro n, r, m // l e o valor de um inteiro leia n // inicializa a vari avel que conter a o inteiro invertido m0 // encontra o n umero invertido enquanto n > 0 fa ca r n MOD 10 m m 10 + r n n DIV 10 menquanto // exibe o n umero invertido escreva m malgoritmo Observe que, neste algoritmo, o la co e repetido uma quantidade de vezes igual ao n umero de d gitos de n. Como n e desconhecido at e a execu c ao do algoritmo iniciar, n ao somos capazes de dizer, ao escrevermos o algoritmo, quantos d gitos n ter a, logo n ao saberemos prever o n umero de repeti c oes do la co. Entretanto, podemos determinar o n umero de d gitos de n ao longo da execu c ao do algoritmo e isto e feito indiretamente pelo algoritmo ao dividir n, sucessivamente, por 10, o que far a n perder o d gito menos signicativo a cada repeti c ao do la co e se tornar 0 em algum momento. Neste ponto, podemos encerrar o la co. A estrutura de repeti c ao repita - at e e semelhante ` a estrutura enquanto fa ca, pois ambas s ao utilizadas quando n ao conhecemos, antecipadamente, o 61

4.3. Problemas e Solu c oes

dct-ufms

n umero de repeti c oes. A diferen ca entre elas reside no fato que a seq u encia de instru c oes da estrutura repita - at e e executada pelo menos uma vez, independentemente da express ao condicional ser ou n ao verdadeira. A estrutura repita - at e tem a seguinte forma geral: repita comando1 comando2 . . . comandon at e <express ao condicional> A l ogica do funcionamento desta estrutura de repeti c ao e a seguinte: 1. executa a seq u encia de instru c oes; 2. express ao condicional e avaliada. Se ela for falsa, ent ao o uxo de execu c ao volta para o passo 1. Caso contr ario, o comando imediatamente posterior ` a estrutura de repeti c ao e executada. Como exemplo, considere o seguinte trecho algor tmico: . . . repita escreva entre com um n umero positivo: leia n at en>0 . . . Neste trecho de algoritmo, o objetivo do la co e garantir que a vari avel n receba um n umero positivo; enquanto o usu ario entrar com um n umero menor ou igual a zero, o algoritmo continuar a solicitando a entrada.

4.3

Problemas e Solu co es

Nesta Se c ao, veremos quatro problemas e suas respectivas solu c oes. Associado a cada solu c ao est a um breve coment ario. Os problemas e suas respectivas solu c oes s ao os seguintes: 62

4.3. Problemas e Solu c oes

dct-ufms

1. Uma pessoa aplicou seu capital a juros e deseja saber, trimestralmente, a posi c ao de seu investimento inicial c. Chamando de i a taxa de juros do trimestre, escrever uma tabela que forne ca, para cada trimestre, o rendimento auferido e o saldo acumulado durante o per iodo de x anos, supondo que nenhuma retirada tenha sido feita. // algoritmo para calcular rendimento e montante de aplica c ao // trimestral algoritmo calcula rendimento // declara c ao de vari aveis inteiro x, n inteiro c, i, r, j // l e o capital inicial, a taxa de juros e n umeros de anos leia c, i, x // calcula o n umero de trimestres em x anos nx4 // calcula e exibe rendimento e montante para j de 1 at e n fa ca r ic cc+r escreva rendimento do trimestre , j , : , r escreva montante do trimestre , j , : , c mpara malgoritmo O algoritmo inicia com o c alculo do n umero de trimestres em x anos, j a que o rendimento deve ser calculado por trimestre e a taxa de juros i tamb em e dada em fun c ao do n umero de trimestres. O la co para fa ca e repetido n vezes, onde n e o n umero de trimestres encontrado. A cada repeti c ao do la co, o rendimento r e calculado e o capital c e somado a r para totalizar o montante do m es. Em seguida, os valores de r e c s ao exibidos para o usu ario.

63

4.3. Problemas e Solu c oes

dct-ufms

2. Em um frigor co existem 90 bois. Cada boi traz em seu pesco co um cart ao contendo seu n umero de identica c ao e seu peso. Fa ca um algoritmo que encontre e escreva o n umero e o peso do boi mais gordo e do boi mais magro. // algoritmo para encontrar o n umero e o peso do boi mais gordo e // do boi mais magro de um conjunto de 90 bois algoritmo encontra n umero peso // declara c ao de vari aveis inteiro num, boigordo, boimagro, real peso, maiorpeso, menorpeso // l e os dados do primeiro boi umero de identica c ao do primeiro boi: escreva entre com o n leia num escreva entre com o peso do primeiro boi: leia peso // inicializa as vari aveis que conter ao o resultado boigordo num boimagro num maiorpeso peso menorpeso peso // compara os pesos para encontrar o boi mais gordo e o boi mais magro para j de 2 at e 90 fa ca escreva entre com o n umero do pr oximo boi: leia num escreva entre com o peso do pr oximo boi: leia peso // compara o peso lido com o maior peso at e ent ao se peso > maiorpeso ent ao maiorpeso peso boigordo num sen ao se peso < menorpeso ent ao 64

4.3. Problemas e Solu c oes menorpeso peso boimagro num mse mse mpara

dct-ufms

// escreve o n umero e o peso do boi mais gordo e do boi mais magro escreva o n umero do boi mais gordo e: , boigordo e: , maiorpeso escreva o peso do boi mais gordo umero do boi mais magro e: , boimagro escreva o n e: , menorpeso escreva o peso do boi mais magro malgoritmo Neste algoritmo, a id eia e ler e processar as informa c oes de cada boi simultaneamente, pois n ao necessitamos guardar as informa c oes dos 90 bois para depois process a-las. Esta leitura e realizada atrav es de um la co para - fa ca, pois sabemos exatamente quantos bois existem: 90. Para guardar o n umero do boi mais gordo, o n umero do boi mais magro, o peso do boi mais gordo e o peso do boi mais magro, usamos quatro vari aveis, uma para cada dado. Para encontrar o n umero e peso do boi mais gordo e o n umero e peso do boi mais magro, comparamos o peso do boi que acabamos de ler com os at e ent ao maior e menor pesos. O problema e que para realizarmos esta opera c ao pela primeira vez, as vari aveis que armazenam o maior e o menor peso precisam possuir algum valor. Para tal, lemos as informa c oes sobre o primeiro boi separadamente e inicializamos ambas as vari aveis com o peso do primeiro boi. Da em diante, podemos prosseguir como imaginamos: comparando tais vari aveis com os valores de cada boi, um a um. 3. Uma pesquisa sobre algumas caracter sticas f sicas da popula c ao de uma determinada regi ao coletou os seguintes dados, referentes a cada habitante, para serem analisados: idade em anos sexo (masculino, feminino) cor dos olhos (azuis, verdes, castanhos) 65

4.3. Problemas e Solu c oes cor dos cabelos (louros, castanhos, pretos)

dct-ufms

Para cada habitante s ao informados os quatro dados acima. A m de indicar o nal da entrada, ap os a seq u encia de dados dos habitantes, o usu ario entrar a com o valor 1 para a idade, o que deve ser interpretado pelo algoritmo como m de entrada. // algoritmo para encontrar a maior idade de um conjunto de indiv duos // e o percentual de indiv duos do sexo feminino com idade entre 18 e // 35 anos, inclusive, e olhos verdes e cabelos louros algoritmo encontra maior idade e percentual // declara c ao de vari aveis idade, maioridade, habitantes, totalhabitantes, porcentagem dotipo num erico sexo, olhos, cabelos dotipo cadeia // inicializa algumas vari aveis maioridade 1 habitantes 0 totalhabitantes 0 // l e a idade do primeiro habitante escreva entre com a idade do habitante ou -1 para encerrar: leia idade // calcula os resultados enquanto idade = 1 fa ca escreva entre com o sexo do habitante: leia sexo escreva entre com a cor dos olhos do habitante: leia olhos escreva entre com a cor dos cabelos do habitante: leia cabelos // compara a idade lida com a maior idade at e ent ao se idade > maioridade ent ao 66

4.3. Problemas e Solu c oes maioridade idade mse // conta o n umero total de habitantes totalhabitantes totalhabitantes + 1

dct-ufms

// conta o n umero total de habitantes que satisfazem as restri c oes // (sexo feminino, idade entre 18 e 35 anos, olhos verdes e cabelos louros) se idade 18 E (idade 35) E (sexo =feminino) E (olhos =verdes) E (cabelos =louros) ent ao habitantes habitantes + 1 mse // l e a idade do pr oximo habitante escreva entre com a idade do habitante ou -1 para encerrar: leia idade menquanto // escreve a maior idade e a porcentagem pedida se totalhabitantes > 0 ent ao porcentagem (habitantes/totalhabitantes) 100 e: , maioridade escreva a maior idade e: , porcentagem escreva a porcentagem mse malgoritmo Este algoritmo difere do anterior em dois aspectos importantes: a entrada de dados e a forma pela qual encontramos a maior idade. Desta vez, n ao sabemos quantos habitantes ser ao processados, portanto n ao podemos realizar a leitura atrav es de um la co para - fa ca. Entretanto, o problema diz que a entrada encerra quando for digitado o n umero 1 ao inv es de uma idade, o que nos possibilita utilizar um la co do tipo enquanto - fa ca para ler a entrada. Quanto ` a idade, observe que, ao inv es de lermos o primeiro habitante separadamente para inicializarmos o valor de maioridade com a idade do primeiro habitante, usamos um n umero negativo. Neste caso, isso e poss vel, pois n ao existe um valor de idade negativo e, al em disso, quando maioridade for comparada com a idade do primeiro habitante, 67

4.3. Problemas e Solu c oes

dct-ufms

ela sempre vai receber este valor, pois ele sempre ser a maior do que o valor negativo de maioridade. Finalmente, o algoritmo calcula a porcentagem pedida de habitantes e escreve os resultados dentro de uma estrutura condicional se - ent ao - mse. Isto e necess ario para evitar que o c alculo de porcentagem seja realizado com o valor de totalhabitantes igual a 0, o que seria um comando imposs vel de ser executado.

68

4.3. Problemas e Solu c oes

dct-ufms

4. Escrever um algoritmo para fazer uma tabela de seno de A, com A variando de 0 a 1.6 radiano de d ecimo em d ecimo de radiano, usando a s erie A 3 A5 + + sen A = A 3! 5! com erro inferior a 0.0001. Escrever tamb em o n umero de termos utilizado. // algoritmo para calcular o seno de um n umero por aproxima c ao algoritmo calcula seno // declara c ao de vari aveis erico a, n, sena, t dotipo num // gera todos os valores de a para c alculo do seno e 1.6 passo 0.1 fa ca para a de 0 at // c alculo do seno de a sena 0 ta n0 repita sena sena + t nn+1 t t (a a)/(2 n (2 n + 1)) at e (t 0.0001) E (t 0.0001) mpara // escreve o seno obtido escreva o valor de a e: , a e: , sena escreva o valor do seno de a umero de termos usados no c alculo foi: , n escreva o n malgoritmo Neste algoritmo, temos um aninhamento de la cos. O la co mais externo tem a nalidade de gerar todos os n umeros de 0 a 1.6, com incremento de 0.1, dos quais desejamos calcular o seno. O la co mais 69

4.3. Problemas e Solu c oes

dct-ufms

interno, por sua vez, tem a nalidade de calcular o seno do valor atual de a gerado pelo la co mais externo. A cada repeti c ao do la co mais interno, um repita - at e, um termo da s erie e calculado e adicionado ` a vari avel sena. Um termo da s erie e sempre calculado a partir do anterior, multiplicandose por este o que falta para se obter aquele. O valor do termo e armazenado em t. Observe que se t e o n- esimo termo da s erie, ent ao o (n + 1)- esimo termo pode ser obtido da seguinte forma: t=t Por exemplo, a5 a3 a2 = . 5! 3! 2 2 (2 2 + 1) A express ao condicional (t 0.0001) E (t 0.0001) garante que o la co repita - at e encerra apenas quando o pr oximo termo t a ser adicionado a sena for inferior, em valor absoluto, a 0.0001, indicando que o valor at e ent ao em sena possui uma precis ao de 0.0001. a2 . 2 n (2 n + 1)

Bibliograa
O texto deste cap tulo foi elaborado a partir dos livros abaixo relacionados: 1. Farrer, H. et. al. Algoritmos Estruturados. Editora Guanabara, 1989. 2. Shackelford, R.L. Introduction to Computing and Algorithms. AddisonWesley Longman, Inc, 1998.

70

Cap tulo 5 Modulariza c ao


Os algoritmos que temos constru do at e ent ao s ao muito simples, pois resolvem problemas simples e apresentam apenas os componentes mais elementares dos algoritmos: constantes, vari aveis, express oes condicionais e estruturas de controle. Entretanto, a maioria dos algoritmos resolve problemas complicados, cuja solu c ao pode ser vista como formada de v arias subtarefas ou m odulo, cada qual resolvendo uma parte espec ca do problema. Neste t opico, veremos como escrever um algoritmo constitu do de v arios m odulos e como estes m odulos trabalham em conjunto para resolver um determinado problema algor tmico.

5.1

O Qu e e Por Qu e?

Um m odulo nada mais e do que um grupo de comandos que constitui um trecho de algoritmo com uma fun c ao bem denida e o mais independente poss vel das demais partes do algoritmo. Cada m odulo, durante a execu c ao do algoritmo, realiza uma tarefa espec ca da solu c ao do problema e, para tal, pode contar com o aux lio de outros m odulos do algoritmo. Desta forma, a execu c ao de um algoritmo contendo v arios m odulos pode ser vista como um processo cooperativo. A constru c ao de algoritmos compostos por m odulos, ou seja, a constru c ao de algoritmos atrav es de modulariza c ao possui uma s erie de vantagens: Torna o algoritmo mais f acil de escrever. O desenvolvedor pode focalizar pequenas partes de um problema complicado e escrever a solu c ao para estas partes, uma de cada vez, ao inv es de tentar resolver o 71

5.2. Componentes de um m odulo

dct-ufms

problema como um todo de uma s o vez. Torna o algoritmo mais f acil de ler. O fato do algoritmo estar dividido em m odulos permite que algu em, que n ao seja o seu autor, possa entender o algoritmo mais rapidamente por tentar entender os seus m odulos separadamente, pois como cada m odulo e menor e mais simples do que o algoritmo monol tico correspondente ao algoritmo modularizado, entender cada um deles separadamente e menos complicado do que tentar entender o algoritmo como um todo de uma s o vez. poss Eleva o n vel de abstra c ao . E vel entender o que um algoritmo faz por saber apenas o que os seus m odulos fazem, sem que haja a necessidade de entender os detalhes internos aos m odulos. Al em disso, se os detalhes nos interessam, sabemos exatamente onde examin a-los. Economia de tempo, espa co e esfor co. Freq uentemente, necessitamos executar uma mesma tarefa em v arios lugares de um mesmo algoritmo. Uma vez que um m odulo foi escrito, ele pode, como veremos mais adiante, ser chamado quantas vezes quisermos e de onde quisermos no algoritmo, evitando que escrevamos a mesma tarefa mais de uma vez no algoritmo, o que nos poupar a tempo, espa co e esfor co. Estende a linguagem. Uma vez que um m odulo foi criado, podemos utiliz a-lo em outros algoritmos sem que eles sejam modicados, da mesma forma que usamos os operadores leia e escreva em nossos algoritmos. A maneira mais intuitiva de proceder ` a modulariza c ao de problemas e realizada atrav es da deni c ao de um m odulo principal, que organiza e coordena o trabalho dos demais m odulos, e de m odulos espec cos para cada uma das subtarefas do algoritmo. O m odulo principal solicita a execu c ao dos v arios m odulos em uma dada ordem, os quais, antes de iniciar a execu c ao, recebem dados do m odulo principal e, ao nal da execu c ao, devolvem o resultado de suas computa c oes.

5.2

Componentes de um m odulo

Os m odulos que estudaremos daqui em diante possuem dois componentes: corpo e interface. O corpo de um m odulo e o grupo de comandos que 72

5.3. Ferramentas para Modulariza c ao

dct-ufms

comp oe o trecho de algoritmo correspondente ao m odulo. J a a interface de um m odulo pode ser vista como a descri c ao dos dados de entrada e de sa da do m odulo. O conhecimento da interface de um m odulo e tudo o que e necess ario para a utiliza c ao correta do m odulo em um algoritmo. A interface de um m odulo e denida em termos de par ametros. Um par ametro e um tipo especial de vari avel que o valor de um dado seja passado entre um m odulo e qualquer algoritmo que possa us a-lo. Existem tr es tipos de par ametros: par ametros de entrada, que permitem que valores sejam passados para um m odulo a partir do algoritmo que solicitou sua execu c ao; par ametros de sa da, que permitem que valores sejam passados do m odulo para o algoritmo que solicitou sua execu c ao; e par ametros de entrada e sa da, que permitem tanto a passagem de valores para o m odulo quanto a passagem de valores do m odulo para o algoritmo que solicitou sua execu c ao. Quando criamos um m odulo, especicamos o n umero e tipos de par ametros que ele necessita. Isto determina a interface do m odulo. Qualquer algoritmo que use um m odulo deve utilizar os par ametros que s ao especicados na interface do m odulo para se comunicar com ele.

5.3

Ferramentas para Modulariza c ao

H a dois tipos de m odulos: fun c ao: uma fun c ao e um m odulo que produz um u nico valor de sa da. Ela pode ser vista como uma express ao que e avaliada para um u nico valor, sua sa da, assim como uma fun c ao em Matem atica. procedimento: um procedimento e um tipo de m odulo usado para v arias tarefas, n ao produzindo valores de sa da. As diferen cas entre as deni c oes de fun c ao e procedimento permitem determinar se um m odulo para uma dada tarefa deve ser implementado como uma fun c ao ou procedimento. Por exemplo, se um m odulo para determinar o menor de dois n umeros e necess ario, ele deve ser implementado como uma fun c ao, pois ele vai produzir um valor de sa da. Por outro lado, se 73

5.4. Criando Fun c oes e Procedimentos

dct-ufms

um m odulo para determinar o maior e o menor valor de uma seq u encia de n umeros e requerido, ele deve ser implementado como um procedimento, pois ele vai produzir dois valores de sa da. Vamos considerar que a produ c ao de um valor de sa da por uma fun c ao e diferente da utiliza c ao de par ametros de sa da ou de entrada e sa da. Veremos mais adiante que os par ametros de sa da e de entrada e sa da modicam o valor de uma vari avel do algoritmo que a chamou, diferentemente do valor de sa da produzido por uma fun c ao que ser a um valor a ser usado em uma atribui c ao ou evolvido em alguma express ao.

5.4

Criando Fun co es e Procedimentos

A m de escrevermos uma fun c ao ou procedimento, precisamos construir as seguintes partes: interface e corpo. Como dito antes, a interface e uma descri c ao dos par ametros do m odulo, enquanto corpo e a seq u encia de instru c oes do m odulo. A interface de uma fun c ao tem a seguinte forma geral: fun c ao <tipo de retorno> <nome> (<lista de par ametros formais>) onde nome e um identicador u nico que representa o nome da fun c ao; lista de par ametros formais e uma lista dos par ametros da fun c ao; tipo de retorno e o tipo do valor de retorno da fun c ao. Por exemplo: fun c ao real quadrado (real r) Logo ap os a descri c ao da interface podemos descrever o corpo do algoritmo. Para delimitar os comandos que fazem parte da fun c ao, utilizamos mfun c ao. O corpo de uma fun c ao e uma seq u encia de comandos que comp oe a fun c ao e que sempre naliza com um comando especial denominado comando de retorno. O comando de retorno e da seguinte forma retorna <valor de retorno> 74

5.4. Criando Fun c oes e Procedimentos

dct-ufms

onde valor de retorno e o valor de sa da produzido pela fun c ao. Por exemplo: retorna x Vejamos um exemplo de uma fun c ao. Suponha que desejemos construir uma fun c ao para calcular o quadrado de um n umero. O n umero deve ser passado para a fun c ao, que calcular a o seu quadrado e o devolver a para o algoritmo que a solicitou. Vamos denominar esta fun c ao de quadrado, como mostrado a seguir: // fun c ao para calcular o quadrado de um n umero fun c ao real quadrado (real r) // declara c ao de vari aveis real x // calcula o quadrado xrr // retorna o quadrado calculado retorna x mfun c ao A interface de um procedimento tem a seguinte forma geral: procedimento <nome> (<lista de par ametros formais>) onde nome e um identicador u nico que representa o nome do procedimento; lista de par ametros formais e uma lista dos par ametros do procedimento. Por exemplo, procedimento ler n umero (ref real val)

75

5.5. Chamando Fun c oes e Procedimentos

dct-ufms

O corpo de um procedimento e uma seq u encia de comandos que n ao possui comando de retorno, pois apenas fun c oes possuem tal tipo de comando. Para delimitar os comandos que fazem parte do procedimento, utilizamos mprocedimento. Vejamos um exemplo de um procedimento. Suponha que desejemos construir um procedimento para ler um n umero e passar o n umero lido para o algoritmo que solicitou a execu c ao do algoritmo atrav es de um par ametro de sa da. Denominemos este procedimento de ler n umero, como mostrado a seguir: // procedimento para ler um n umero umero (ref real val) procedimento ler n // Solicita a entrada do n umero escreva Entre com um n umero: leia val mprocedimento Aqui, val e o par ametro de sa da que conter a o valor de entrada que ser a passado para o algoritmo que solicitar a execu c ao do procedimento ler n umero. A palavra-chave ref, que antecede o nome da vari avel na lista de par ametros formais do procedimento, e utilizada para denir val como par ametro de sa da ou entrada e sa da.

5.5

Chamando Fun co es e Procedimentos

Fun c oes e procedimentos n ao s ao diferentes apenas na forma como s ao implementados, mas tamb em na forma como a solicita c ao da execu c ao deles, ou simplesmente chamada, deve ser realizada. A chamada de uma fun c ao e usada como um valor constante que deve ser atribu do a uma vari avel ou como parte de uma express ao, enquanto a chamada de um procedimento e realizada como um comando a parte. Como exemplo, considere um algoritmo para ler um n umero e exibir o seu quadrado. Este algoritmo deve utilizar o procedimento ler n umero e a fun c ao quadrado, vistos antes, para ler o n umero e obter o seu quadrado, respectivamente. O algoritmo segue abaixo: 76

5.5. Chamando Fun c oes e Procedimentos

dct-ufms

// algoritmo para calcular e exibir o quadrado de um n umero // fornecido como entrada algoritmo calcula quadrado // declara c ao de vari aveis real num, x // l e um n umero umero(num) ler n // calcula o quadrado do n umero lido x quadrado(num) // escreve o quadrado escreva O quadrado do n umero e:, x malgoritmo Note a diferen ca da chamada do procedimento ler n umero para a chamada da fun c ao quadrado. Na chamada do procedimento, temos uma instru c ao por si s o. Por outro lado, a chamada da fun c ao ocupa o lugar de um valor ou express ao em uma instru c ao de atribui c ao. Isto porque a chamada quadrado(num) e substitu da pelo valor de retorno da fun c ao. Tanto na chamada do procedimento ler n umero quanto na chamada da fun c ao quadrado, temos um par ametro: a vari avel num. Na chamada do procedimento ler n umero, num e um par ametro de sa da, como denido na interface do procedimento, e, portanto, ap os a execu c ao do procedimento, num conter a o valor lido dentro do procedimento. J a na chamada da fun c ao quadrado, num e um par ametro de entrada, como denido na interface da fun c ao, e, assim sendo, o valor de num e passado para a fun c ao. A vari avel num e denominada par ametro real. Um par ametro real especica um valor passado para o m odulo pelo algoritmo que o chamou ou do m odulo para o algoritmo que o chamou. Os par ametros formais s ao aqueles da declara c ao do m odulo. A lista de par ametros reais deve concordar em n umero, ordem e tipo com a lista de pr ametros formais. 77

5.6. Passagem de Par ametros

dct-ufms

5.6

Passagem de Par ametros

Os valores dos par ametros reais de entrada s ao passados por um mecanismo denominado c opia, enquanto os valores dos par ametros reais de sa da e entrada e sa da s ao passados por um mecanismo denominado refer encia. O mecanismo de passagem por c opia funciona da seguinte forma. O valor do par ametro real (uma constante ou o valor de uma vari avel ou express ao) de entrada e atribu do ao par ametro formal quando da chamada do procedimento/fun c ao. Por exemplo, na chamada x quadrado(num) o valor da vari avel num e atribu do ao par ametro formal r da fun c ao quadrado. No mecanismo de passagem por refer encia, quando da chamada do procedimento/fun c ao, o par ametro formal passa a compartilhar a mesma area de armazenamento de par ametro real, assim, qualquer altera c ao no valor do par aemtro formal feita pelo procedimento/fun c ao acarretar a uma modica c ao no par ametro real quando do t ermino do procedimento/fun c ao. Sendo assim, quando a chamada ler n umero(num) e executada, a vari avel real num e a vari avel formal val (que est a precedida da palavra chave ref) compartilham uma mesma area de armazenamento, assim, num e val cont em o mesmo valor. Quando e feita a leitura do dado e armazenada em val, esta atualiza c ao afetar a o valor de num. Ao t ermino do procedimento a vari avel num conter a o valor atualizado. Devemos observar que os par ametros reais de sa da e de entrada e sa da devem obrigatoriamente ser vari aveis, uma vez que n ao faz sentido modicar o valor de uma constante ou de uma express ao.

5.7

Escopo de Dados e C odigo

O escopo de um m odulo (ou vari avel) de um algoritmo e a parte ou partes do algoritmo em que o m odulo (ou vari avel) pode ser referenciado. Quando iniciamos o estudo de modulariza c ao e natural nos perguntarmos qual e o escopo de um dado m odulo e das constantes ou vari aveis nele presentes. Em

78

5.7. Escopo de Dados e C odigo

dct-ufms

particular, o escopo de um m odulo determina quais s ao os demais m odulos do algoritmo que podem chamar-lhe e quais ele pode chamar. Os m odulos de um algoritmo s ao organizados por n veis. No primeiro n vel, temos apenas o algoritmo principal. Aqueles m odulos que devem ser acessados pelo algoritmo principal devem ser escritos dentro dele e, nesta condi c ao, s ao ditos pertencerem ao segundo n vel. Os m odulos escritos dentro de m odulos de segundo n vel s ao ditos m odulos de terceiro n vel. E assim sucessivamente. Por exemplo: // algoritmo para calcular o quadrado de um n umero fornecido // como entrada algoritmo calcula quadrado // m odulo para c alculo do quadrado de um n umero fun c ao real quadrado (quadrado r) // declara c ao de vari aveis real x // calcula o quadrado xrr // passa para o algoritmo chamador o valor obtido retorna x mfun c ao // m odulo para ler um n umero procedimento ler n umero (ref real val) // solicita um n umero ao usu ario umero: escreva Entre com um n leia val mprocedimento // declara c ao de constantes e vari aveis real num, x 79

5.7. Escopo de Dados e C odigo

dct-ufms

// l e um n umero ler n umero(num) // calcula o quadrado x quadrado(num) // escreve o quadrado umero e: , x escreva O quadrado do n malgoritmo Aqui, desej avamos que a fun c ao quadrado e o procedimento ler n umero fossem chamados pelo m odulo principal e, por isso, escrevemos tais m odulos dentro do m odulo principal, no segundo n vel da hierarquia modular do algoritmo. A regra para determinar o escopo de um m odulo e bastante simples: um m odulo X escrito dentro de um m odulo A qualquer pode ser acessado apenas pelo m odulo A ou por qualquer m odulo escrito dentro de A ou descendente (direto ou n ao) de algum m odulo dentro de A. Como exemplo, considere um algoritmo no qual o m odulo principal cont em outros quatro m odulos, S 1, S 2, F 1, F 2. Por sua vez, S 1 cont em mais dois m odulos, S 3 e F 3; e F 2 cont em os m odulos S 4 e F 4. Esta situa c ao e ilustrada por um diagrama na Figura 5.1. De acordo com as regras de escopo descritas anteriormente, o m odulo F 3 s o pode ser chamado por S 1 e S 3, enquanto o m odulo F 1 pode ser acessado por todos os m odulos. Vari aveis podem ser locais ou globais. Uma vari avel (constante) e dita local a um m odulo se ela e declarada naquele m odulo. Por exemplo, a vari avel x da fun c ao quadrado e uma vari avel local a esta fun c ao. Uma vari avel e dita global a um m odulo quando ela n ao est a declarada no m odulo, mas pode ser referenciada a partir dele. Neste curso, consideraremos que vari aveis s ao sempre locais, isto e, nenhum m odulo poder a referenciar uma vari avel declarada em outro m odulo.

80

5.8. Problemas e Solu c oes

dct-ufms

S1

S2

F1

F2

S3

F3

S4

F4

Figura 5.1: Exemplo de diagrama hier arquico

5.8

Problemas e Solu co es

Nesta se c ao, veremos tr es problemas envolvendo fun c oes e procedimentos e suas respectivas solu c oes. 1. Escreva um algoritmo para ler dois n umeros e exibir o menor dos dois. A verica c ao de qual deles e o menor deve ser realizada por uma fun c ao. // algoritmo para o encontrar e exibir o menor de dois n umeros algoritmo encontra menor de dois // m odulo para encontrar o menor de dois n umeros fun c ao inteiro menor de dois (inteiro a, b) // declara c ao de vari aveis inteiro menor menor a se a > b ent ao menor b mse 81

5.8. Problemas e Solu c oes

dct-ufms

retorna menor mfun c ao // declara c ao de constantes e vari aveis inteiro x, y , z

// l e dois n umeros escreva Entre com dois n umeros: leia x, y // obt em o menor dos dois z menor de dois(x, y ) // escreve o menor dos dois escreva O menor dos dois e: , z malgoritmo 2. Escreva um algoritmo para ler tr es n umeros e exibir o maior e o menor dos tr es. A obten c ao do maior e do menor n umero deve ser realizada por um procedimento. // algoritmo para o encontrar e exibir o menor e o maior de tr es // n umeros algoritmo encontra min max // m odulo para encontrar o menor e o maior de tr es n umeros procedimento min max(inteiroa, b, c, ref inteiro min, max) // encontra o maior dos tr es se a b e a c ent ao max a sen ao 82

5.8. Problemas e Solu c oes se b c ent ao max b sen ao max c mse mse // encontra o menor dos tr es se a b e a c ent ao min a sen ao se b c ent ao min b sen ao min c mse mse mprocedimento // declara c ao de constantes e vari aveis inteiro x, y , z , menor, maior // l e tr es n umeros escreva Entre com tr es n umeros: leia x, y , z // obt em o menor e o maior dos tr es min max(x, y, z, menor, maior) // escreve o menor e o maior dos tr es escreva O menor dos tr es e: , menor escreva O maior dos tr es e: , maior malgoritmo

dct-ufms

3. Escreva um algoritmo para ler tr es n umeros e escrev e-los em ordem n ao decrescente. Utilize, obrigatoriamente, um procedimento para trocar o 83

5.8. Problemas e Solu c oes

dct-ufms

valor de duas vari aveis. // algoritmo para ler tr es n umeros e escrev e-los em ordem // n ao decrescente algoritmo ordena tr es // m odulo para trocar o valor de duas vari aveis procedimento troca(ref inteiro a, b) // declara c ao de vari aveis inteiro aux // troca os valores aux a ab b aux mprocedimento // declara c ao de constantes e vari aveis inteiro l, m, n // l e os tr es n umeros Entre com tr es n umeros: escreva leia l, m, n // encontra o menor e p oe em l se l > m ou l > n ent ao se m n ent ao troca(l, m) sen ao troca(l, n) mse mse se m > n ent ao troca(m, n) mse 84

5.8. Problemas e Solu c oes

dct-ufms

escreva Os n umeros em ordem n ao decrescente: , l, m, n malgoritmo Neste algoritmo, os par ametros do procedimento troca s ao par ametros de entrada e sa da, pois para trocar os valores dos par ametros reais dentro de um procedimento, estes valores devem ser copiados para os par ametros formais e as mudan cas nos par ametros formais devem ser reetidas nos par ametros reais, uma vez que as vari aveis precisam retornar do procedimento com os valores trocados.

Bibliograa
O texto deste cap tulo foi elaborado a partir dos livros abaixo relacionados: 1. Farrer, H. et. al. Algoritmos Estruturados. Editora Guanabara, 1989. 2. Shackelford, R.L. Introduction to Computing and Algorithms. AddisonWesley Longman, Inc, 1998.

85

Cap tulo 6 Ordena c ao e Busca


A import ancia de mantermos coisas ordenadas e fundamental em muitas atividades. Voc e j a imaginou se os sobrenomes dos assinantes da lista telef onica de Campo Grande n ao estivessem dispostos em ordem alfab etica? Seria uma tarefa monumental encontrar o telefone de um usu ario da companhia telef onica, n ao? No processamento de dados, a tarefa de ordena c ao tamb em exerce um papel fundamental, pois a ordem na qual os dados s ao processados por um programa pode exercer uma grande inu encia em seu desempenho e simplicidade. Por esta raz ao, ordena c ao (ou classica c ao) de dados tem sido um assunto estudado exaustivamente em Computa c ao e muitas solu c oes interessantes foram propostas ao longo dos u ltimos 40 anos. Na maioria das vezes, a ordena c ao de dados e realizada com o objetivo de facilitar a busca de dados. Isto porque se os dados a serem recuperados em um certo conjunto de dados estiverem dispostos segundo uma dada ordem, a tarefa de encontr a-los no conjunto se tornar a mais r apida e simples. Neste cap tulo, veremos um algoritmo de ordena c ao bastante simples, denominado algoritmo de ordena c ao por inser c ao, e dois algoritmos de busca em conjuntos ordenados: o algoritmo de busca linear e o algoritmo de busca bin aria. Todos esses algoritmos assumem que o conjunto de dados est a representado em um vetor.

6.1

Ordena c ao por Inser c ao

O algoritmo de ordena c ao por inser c ao simula o processo de ordena c ao utilizado por um jogador de baralho. Suponha que exista um ma co de cartas de 86

6.1. Ordena c ao por Inser c ao

dct-ufms

baralho em uma mesa e que um jogador retira uma carta desse ma co por vez. O jogador utiliza sua m ao direita para retirar uma carta do ma co e sua m ao esquerda para segurar as cartas retiradas com a m ao direita. Inicialmente, a m ao esquerda est a vazia, pois todas as cartas est ao na mesa. Ap os retirar a primeira carta, o jogador a p oe imediatamente na m ao esquerda, que est a vazia. Em seguida, ele retira uma outra carta e a p oe na m ao esquerda, comparando-a com a carta l a existente. Se a carta retirada e menor do que a carta na m ao esquerda, ela deve car ` a esquerda desta. Caso contr ario, ela deve car ` a direita. Neste momento, as duas cartas na m ao esquerda encontram-se ordenadas. O processo segue com a retirada da terceira carta. O jogador, ent ao, insere a terceira carta na m ao esquerda. Esta inser c ao e realizada comparando-se a carta retirada com as duas cartas j a existentes na m ao esquerda. Como tais cartas est ao dispostas ordenadamente, a compara c ao se inicia pela carta mais ` a direita. Se a carta retirada e maior do que ela, ent ao aquela e inserida a direita desta. Caso contr ` ario, a carta retirada e comparada com a carta mais ` a esquerda. Caso ela seja maior do que esta, ela car a entre as duas. Caso contr ario, ela passa a ser a carta mais ` a esquerda das tr es. Para as demais cartas, o processo segue da mesma forma. A m ao esquerda sempre conter a cartas ordenadas da esquerda para a direita. Digamos, ent ao, que a m ao esquerda possua n cartas. Ao tentarmos inserir uma nova carta na m ao esquerda, devemos compar a-la primeiro com a carta mais ` a direita, a n- esima carta da esquerda para a direita. Se a nova carta e maior do que ela, colocamos a nova carta a sua direita. Caso contr ario, comparamos a nova carta com a carta na (n 1)- esima posi c ao e assim por diante. Desta forma, ap os inserirmos a u ltima carta do ma co na m ao esquerda, teremos nela as cartas completamente ordenadas. Vamos, agora, examinar um algoritmo de ordena c ao de dados que utiliza a id eia descrita antes para classicar um conjunto de n umeros armazenados em um vetor. Este algoritmo inicia considerando o elemento na primeira posi c ao do vetor como sendo a u nica carta na m ao esquerda e o restante do vetor como sendo o ma co. Da , o algoritmo segue por inserir o elemento na segunda posi c ao do vetor em sua posi c ao correta. Isto e, comparando-o com o elemento na primeira posi c ao e inserindo-o na primeira posi c ao se necess ario. Neste ponto, tem-se que o segmento do vetor formado pelas duas primeiras posi c oes encontra-se ordenado. O algoritmo segue, ent ao, com a inser c ao do terceiro elemento do vetor na posi c ao correta do segmento formado pelas duas primeiras posi c oes e sua pr opria posi c ao. 87

6.1. Ordena c ao por Inser c ao

dct-ufms

De forma geral, o algoritmo varre o vetor do segundo ao u ltimo elemento. Na i- esima varredura, o algoritmo insere o (i + 1)- esimo elemento do vetor na posi c ao correta do segmento que vai do primeiro elemento do vetor at e o (i + 1)- esimo. O algoritmo encontra a posi c ao correta de um elemento por compar a-lo com os elementos do segmento do vetor a sua esquerda, da esquerda para a direita. A posi c ao correta e encontrada quando o elemento do segmento sendo comparado e menor ou igual a ele. Obviamente, para se inserir um elemento no meio de um segmento de um vetor, deve-se deslocar os elementos que car ao a sua direita uma casa para a direita. Caso contr ario, danicar amos o vetor. O algoritmo segue abaixo. Considere o par ametro v como um vetor de n umeros com n elementos e possuindo a primeira posi c ao, com ndice 0, livre. Isto e, os n elementos do vetor est ao posicionados a partir da posi c ao 1. // procedimento para ordenar um vetor pelo m etodo de inser c ao procedimento ordena (ref v dotipo vetnum, n dotipo num erico) i, j dotipo num erico // o i- esimo elemento vai ser inserido na posi c ao correta // em rela c ao ao segmento a sua esquerda para i de 2 at e n fa ca // o segmento de v [1] a v [j ] est a ordenado v [0] v [i] j i1 // encontra a posi c ao correta para o i- esimo elemento ca enquanto v [0] < v [j ] fa v [j + 1] v [j ] j j1 menquanto // insere o i- esimo elemento na posi c ao encontrada v [j + 1] v [i] mpara mprocedimento 88

6.2. Busca Linear

dct-ufms

6.2

Busca Linear

O algoritmo de busca a ser estudado nesta se c ao recebe um vetor de dados j a ordenados e um elemento a ser encontrado neste vetor. O resultado do algoritmo e a posi c ao em que o elemento se encontra no vetor, caso ele esteja l a, ou um valor inv alido que represente o insucesso da busca caso o elemento n ao esteja no vetor. A busca e realida por se comparar o valor do elemento a ser encontrado com os elementos do vetor, um a um, da esquerda para a direita. O fato do vetor estar ordenado simplica o processo de compara c ao, pois a comparara c ao pode ser encerrada t ao logo encontremos um valor igual ou maior do que o procurado. Apenas no pior dos casos, que se d a quando o valor procurado e igual ao do u ltimo elemento do vetor ou quando ele for maior do que todos os elementos do vetor, o algoritmo realizar a a compara c ao do valor procurado com todos os elementos do vetor. Vejamos o algoritmo. Considere que v e um vetor de n umeros com n elementos e x e o valor a ser encontrado em v . // fun c ao para realizar uma busca linear em um vetor erico) retorna dotipo fun c ao busca linear (v dotipo vetnum, n, x dotipo num num erico i dotipo num erico // p oe x na u ltima posi c ao do vetor v [n + 1] x // varre o vetor a procura de x i1 ca enquanto x > v [i] fa ii+1 menquanto // verica se x foi encontrado ou n ao se v [i] = x e i = n + 1 ent ao busca linear retorna i sen ao busca linear retorna 1 mse 89

6.3. Busca Bin aria

dct-ufms

mfun c ao Observe que o valor inv alido usado para indicar o insucesso da busca linear e o valor de retorno 1.

6.3

Busca Bin aria

A id eia por tr as do algoritmo de busca bin aria e comparar um elemento do vetor de dados, sorteado aleatoriamente, com o elemento a ser encontrado. Se o elemento procurado e igual ao elemento sorteado, a busca termina. Entretanto, se o elemento sorteado for menor do que o elemento a ser encontrado, ent ao devemos restringir a busca ao segmento do vetor ` a direita do elemento sorteado, pois o segmento formado pelos elementos ` a esquerda deste e formado apenas por elementos menores do que o elemento procurado. Racioc nio an alogo pode ser aplicado caso o elemento procurado seja menor do que o elemento sorteado. O pr oximo passo e aplicar o mesmo processo de busca ao segmento que pode conter o elemento procurado. Este processo continua at e o elemento ser encontrado ou n ao haver mais segmento para procurar o elemento. A fun c ao abaixo implementa esta id eia: fun c ao busca bin aria (v dotipo vetnum, n, x dotipo num erico) retorna dotipo num erico l, r, m dotipo num erico l1 rn enquanto l r fa ca m qualquer valor entre l e r ao se x < a[m] ent r m1 sen ao se x > a[m] ent ao l m+1 sen ao l r+1 mse 90

6.3. Busca Bin aria

dct-ufms

mse menquanto se a[m] = x ent ao busca bin aria retorna m sen ao busca bin aria retorna 1 mse mfun c ao Embora a escolha de m possa ser aleat oria, o valor desta vari avel inuencia a eci encia do algoritmo. Para perceber este fato, basta notar que se conseguirmos eliminar o maior n umero de elementos em cada passo da busca, ela ser a realizada mais rapidamente. E como podemos eliminar o maior n umero de elementos? Fazendo m ser a metade do segmento, pois assim garantimos que a cada passo do algoritmo estamos eliminando a metade dos elementos do vetor (segmento)! Se escolh essemos qualquer outro valor, estar amos sempre correndo o risco de pegar o segmento maior para realizar o pr oximo passo da busca, certo? O algoritmo ent ao se torna o seguinte: fun c ao busca bin aria (v dotipo vetnum, n, x dotipo num erico) retorna dotipo num erico l, r, m dotipo num erico l1 rn enquanto l r fa ca m (l + r) DIV 2 se x < a[m] ent ao r m1 sen ao se x > a[m] ent ao l m+1 sen ao l r+1 mse mse 91

6.3. Busca Bin aria

dct-ufms

menquanto se a[m] = x ent ao busca bin aria retorna m sen ao busca bin aria retorna 1 mse mfun c ao

Bibliograa
O texto deste cap tulo foi elaborado a partir dos livros abaixo relacionados: 1. Azeredo, P.A. M etodos de Classica c ao de Dados. Editora Campus, 1996. 2. Wirth, N. Algoritmos e Estruturas de Dados. Prentice-Hall do Brasil, 1989.

92

Você também pode gostar