Você está na página 1de 36

1

1.1

Introduo aos Computadores e Programao


Computadores

Os computadores fazem parte da vida corrente e so, hoje em dia, aparelhos quase to familiares como os telefones, os televisores e os frigorficos. Se ainda h pessoas (cada vez menos) que os olham com desconfiana, porque foram condicionadas nesse sentido. um pouco como os peles-vermelhas, que tinham medo que os fotografassem, porque isso lhes roubava a alma. Quem quisesse mesmo tirar-lhes o retrato, ou o fazia s escondidas, ou explicava pacientemente que aquilo no interferia com a vida eterna. E tal como para usar um desses aparelhos no preciso ter uma ideia exacta de como ele feito, assim se pode ignorar quase tudo acerca dos computadores e, no entanto, conseguir tirar deles um grande proveito. No entanto, na fase inicial de um curso de Programao no se pode evitar a pergunta sacramental: o que um computador? Colocada assim, secamente, uma pergunta de algibeira, que parece estar espera de uma resposta cheia de esperteza. claro que um computador ser muita coisa diferente, para muita gente diferente! Suponhamos que a pergunta era no o que um computador?, mas o que um avio?, o que uma locomotiva? ou o que uma mquina fotogrfica. Para um engenheiro aeronutico, um avio ser um aparelho aerodinmico motorizado, capaz de se sustentar no ar por efeito do atrito e bl-bl-bl. Para o homem da rua, um avio poder ser um meio de transporte areo, capaz de levar pessoas e carga. Para um bochimane do deserto do Calari, capaz de ser um pssaro gigante ou um sinal dos deuses. Com as locomotivas, com as mquinas fotogrficas ou com qualquer outro artefacto tecnolgico, facilmente se conseguiriam respostas do mesmo gnero. FCA - EDITORA DE INFORMTICA 1

Pascal Tcnicas de Programao

Mas o que ento um computador? Para uns, um instrumento para fazer contas. Para outros, um aparelho electrnico dotado de memria, capaz de processar informaes a grande velocidade. Para outros ainda, mais atrevidos, uma mquina que pensa. Estas respostas so algo subjectivas, mas sempre ajudam a perceber de que que se trata. Para tirar as teimas, no h nada como as definies oficiais da ISO (International Organization for Standardization) e do IEEE (Institute of Electrical and Electronics Engineers). Para a ISO, um computador a functional unit that can perform substantial computation, including numerous arithmetic operations or logical operations, without intervention by a human operator during a run (transcrevemos em ingls, para evitar o rudo da traduo). Esta definio vem reproduzida no Glossrio de Terminologia Informtica do IEEE, que inclui tambm uma segunda definio alternativa: A functional programmable unit that consists of one or more processing units and peripheral equipment, that is controlled by internally stored programs, and that can perform substantial computation, including numerous arithmetic operations or logic operations, without human intervention. Pronto, j sabemos o que um computador! Apreciemos nas definies a nfase colocada na capacidade de fazer muitas contas, em sentido lato, isto , operaes aritmticas e operaes lgicas, e tambm o facto de poder trabalhar sozinho, sem interveno humana, controlado por um programa armazenado internamente. A segunda definio insiste no facto de se tratar de uma unidade programvel. Quer dizer, a noo de computador surge estritamente ligada de programa, o que no deixa de ser interessante. Um termo que aparece muitas vezes associado a computador hardware, palavra inglesa para a qual a traduo portuguesa mais apropriada parece ser o substantivo material. Segundo o glossrio do IEEE, hardware physical equipment used in data processing, as opposed to computer programs, procedures, rules and associated documentation, Contrast with software. Como curiosidade, refira-se que o termo hardware, em ingls, no tinha inicialmente nada a ver com computadores. O Oxford Advanced Learners Dictionary of Current English apresenta trs significados para ele. O primeiro utenslios metlicos de uso domstico. O segundo, de conotao militar, armas e equipamento blico, por exemplo, veculos blindados. S o terceiro corresponde quilo a que nos habitumos. Em nenhuma das definies se refere o facto de os computadores pensarem ou deixarem de pensar. Com efeito, e como diz Edsger W. Dijkstra, um dos mais conceituados professores de Programao, saber se os computadores pensam to importante como saber se os submarinos nadam. Pensar aqui apenas um verbo intransitivo, habitualmente usado com seres humanos, mas quem quiser pode aplic-lo com outras classes de sujeitos, por sua conta e risco. E, se verdade que, em portugus, no costume dizer que os submarinos nadam, isso no escandalizaria ningum, tanto mais que se diz que os avies voam, mesmo sem serem pssaros. Estas coisas so convencionais e variam de lngua para lngua. Por exemplo, em portugus diz-se o homem anda e tambm o carro anda; em ingls diz-se the man walks mas no faria sentido dizer the car walks. Em concluso, saber se os computadores pensam, ou no, uma questo lingustica e no informtica.
2

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

1.2

Programas

Tal como os computadores, os programas so coisas diferentes para pessoas diferentes. Ou at coisas diferentes para a mesma pessoa, consoante a perspectiva em que ela se coloque. Vejamos, para comear, o que diz o IEEE. De acordo com o glossrio, um programa a sequence of instructions suitable for processing by a computer. Processing may include the use of an assembler, a compiler, an interpreter, or a translator to prepare the program for execution as well as to execute it. Temos, portanto, uma definio circular: um computador uma mquina programvel e um programa uma sequncia de instrues para um computador! No faz mal, que a gente percebe. No entanto, h uma certa vantagem em libertar a noo de programa da de computador. Essencialmente, se verdade que um programa contm sempre a descrio dos clculos a realizar por um computador, por outro lado, no indispensvel que esse computador exista realmente. O que interessa que a descrio esteja feita de tal forma que, em princpio, se poderia construir um computador que a processasse. E para que isso pudesse acontecer, necessrio (mas no suficiente, note-se) que a descrio esteja feita formalmente, segundo regras bem definidas. Isso implica que deve haver um documento que especifique, de uma vez por todas, quais so as regras de descrio utilizveis e que permita determinar taxativamente se um dado candidato a programa mesmo um programa, ou se apenas um texto disfarado de programa. Ora, um conjunto de regras de descrio de clculos (a ser efectuado por um computador), para o qual existe um documento de referncia , por definio, uma linguagem de programao. Com a ajuda deste novo conceito, podemos fazer abstraco dos computadores e dizer que um programa simplesmente um texto contendo a descrio de clculos, escrito numa linguagem de programao. Associada aos programas, surge a noo de software. Como o prprio termo sugere, software aquilo nos computadores que no hardware (trata-se de uma espcie de definio por excluso de partes, no muito satisfatria). O glossrio do IEEE mais explcito: software significa Programs, procedures and rules, and any associated documentation pertaining to the operation of a computer system. Contrast with hardware. Aparentemente, ao contrrio de hardware, o termo software apenas usado em informtica.

1.3

Estrutura dos computadores

Os computadores foram inventados h j mais de cinquenta anos e, ao contrrio do que s vezes se pensa, no evoluram muito. Digamos que foram bastante aperfeioados e so hoje mais rpidos, mais fiveis, mais potentes e, sobretudo, mais baratos do que ento. Mas os princpios que presidiram ao projecto dos primeiros computadores so essencialmente os que se seguem ainda hoje. Basicamente, todos os computadores convencionais so constitudos por quatro componentes, ligados como se indica na figura seguinte:

FCA - EDITORA DE INFORMTICA 3

Pascal Tcnicas de Programao

Processador

Unidade de entrada

Memria

Unidade de sada

Figura 1.1

O processador a componente que faz os clculos. Podemos imagin-lo constitudo por duas partes: a unidade aritmtica e lgica e a unidade de controlo. A primeira executa as operaes aritmticas (adies, subtraces, multiplicaes e divises) e as operaes lgicas (comparaes de valores). A segunda encarrega-se de controlar o encadeamento das sucessivas operaes a executar. A memria funciona como um armazm onde se guardam os resultados das operaes, os quais, presumivelmente, so precisos mais tarde como dados de outras operaes. tambm na memria que se encontra, de maneira codificada, o programa que controla o funcionamento do computador. As unidades de entrada e de sada, ou unidades perifricas, so o que permite alimentar o computador com novos dados e novos programas, e tambm aceder aos resultados produzidos. Normalmente, com estes dispositivos que os utilizadores contactam directamente. Os terminais so as unidades de entrada e de sada mais frequentes. De certo modo, o teclado funciona como unidade de entrada e o ecr como unidade de sada. As impressoras constituem outra classe importante de perifricos de sada. O processador , por assim dizer, o motor do computador (ou, ento, o corao) Na gria, chama-se-lhe CPU, do ingls Central Processing Unit. Actualmente, os processadores usuais funcionam velocidade de cerca de mil milhes de operaes por segundo, o que constitui um progresso assinalvel em relao aos dos primeiros computadores, que no passavam de algumas dezenas. A memria formada por um conjunto de clulas, numeradas sequencialmente. Existe a clula 0, a clula 1, etc. (em informtica muitas vezes comea-se a contar por zero). O nmero de ordem de uma clula o seu endereo. Cada clula formada por 8 bits. Um bit um dispositivo magntico, electrnico, ou de outra natureza, muito pequenino (para poder haver muitos), capaz de estar num de dois estados. Da o nome bit, abreviatura do ingls binary digit. Os dois estados possveis so geralmente designados por termos contraditrios: sim e no, um e zero, verdadeiro e falso, mais e menos, ligado e desligado, on e off. Um grupo de 8 bits pode ter 28, ou seja, 256 configuraes diferentes. Ora o nmero de caracteres utilizados correntemente na escrita de cada uma das lnguas ocidentais relativamente pequeno, da ordem dos cento e tal. Por isso, 8 bits so suficientes para representar todos esses caracteres e ainda sobra. Os grupos de 8 bits so muito importantes e desi4

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

gnam-se por um termo especial, a palavra inglesa byte. Usualmente, as capacidades das memrias dos computadores medem-se em bytes. Existe, associado a isto, uma espcie de sistema mtrico: 1 Kbyte (quilobyte) vale 1024 bytes, um Mbyte (megabyte) vale 1024 Kbytes e um Gbyte (gigabyte) vale 1024 Mbytes. Usa-se 1024 e no 1000, por 1024 ser 10 uma potncia de 2 (1024 = 2 ) e nos computadores quase todas as coisas vm em quantidades que so potncias de 2. Mas na prtica arredonda-se e diz-se, por exemplo, que um megabyte so um milho de bytes. Juntando 4 bytes, forma-se um grupo de 32 bits, chamado palavra (word, em ingls). 32 Com 32 bits conseguem-se representar 2 , ou seja, 4294967296 valores diferentes. Se esses valores forem interpretados como nmeros inteiros, ento o normal deixar metade para os positivos e metade para os negativos. Nesta partilha, o zero conta como positivo e, portanto, nos computadores com palavras de 32 bits, os nmeros inteiros vo desde -2147483648 at 2147483647. Os nmeros reais nos computadores tambm so representados por um grupo de bytes, normalmente 6 ou 8. Com 8 bytes consegue-se representar nmeros reais maiores (isto , com maior valor) e com maior preciso (isto , com mais algarismos significativos) do que com 6, claro. A memria de um computador divide-se em duas partes: uma, chamada memria principal (ou central), qual o CPU tem acesso directo, e outra, dita memria secundria (ou perifrica). Antes de serem processados, os dados que esto na memria secundria tm de ser transferidos para a memria central. Na maior parte dos computadores, a memria secundria constituda por dispositivos magnticos capazes de guardar a magnetizao mesmo com o computador desligado e, por isso, so sobretudo usadas para arquivo da informao. A memria principal formada por circuitos electrnicos, de acesso mais rpido por parte do CPU, mas voltil, isto , s guarda a informao enquanto h energia elctrica. Por isso, destina-se a ser usada apenas durante os clculos. Quando se desliga o computador, o seu contedo desaparece irremediavelmente. Os suportes magnticos mais usados actualmente tm a forma de disquetes ou de discos, mas ainda h algum tempo atrs eram comuns as bandas magnticas. Mais para trs ainda, usava-se o papel como suporte de memria secundria, na forma de cartes perfurador ou de fita perfurada. Os furinhos que se faziam no papel eram representaes dos dados ou dos resultados dos processamentos. Os computadores dispunham de perifricos capazes de fazer as perfuraes e de outros capazes de as ler. Curiosamente, assistimos recentemente ao ressurgimento da tecnologia dos furinhos, mas numa forma mais sofisticada: os discos compactos, anlogos aos usados para gravar msica, usados como arquivo de dados. A a informao codificada registada com furinhos gravados por raios laser e pode ser depois consultada base da deteco desses furinhos, feita igualmente com raios laser. A capacidade das memrias varia muito. Tipicamente, nos computadores pessoais profissionais, usam-se memrias centrais de 32 a 256 Mbytes, disquetes de 1,44 Mbytes, CD de 670MB e discos de 4 a 20 Gbytes, mas estes valores vo aumentando de ano para ano. Como termo de comparao, refira-se que cada pgina deste texto tem em mdia cerca de FCA - EDITORA DE INFORMTICA 5

Pascal Tcnicas de Programao

2500 caracteres e, portanto, uma disquete de 1,44 Mbytes dava para armazenar cerca de 576 pginas e um CD cerca de 268000.

1.4

A linguagem de programao Pascal

A linguagem de programao Pascal foi projectada em 1969 por Niklaus Wirth, professor do Instituto Politcnico Federal, de Zurique. O seu nome constitui uma homenagem ao clebre matemtico e filsofo francs Blaise Pascal que, entre outras coisas importantes, inventou e construiu uma mquina calculadora, por volta do ano 1644. A mquina fazia as 9 quatro operaes aritmticas e suportava nmeros at 10 -1. Apesar de funcionar bem, era muito cara e, por isso, acabou por ser um fracasso comercial. O Pascal pertence a uma famlia de linguagens de programao ditas de tipo Algol, por serem descendentes da linguagem Algol-60. A linguagem Algol-60, hoje cada em desuso, foi desenvolvida por um grupo internacional de cientistas, entre 1958 e 1960, no seguimento do aparecimento da linguagem FORTRAN, em 1957. Estas duas linguagens, o FORTRAN e o Algol-60, constituem marcos fundamentais no desenvolvimento da programao. No entanto, enquanto a importncia do Algol-60 sobretudo histrica, pelas ideias que introduziu e que ainda hoje so vlidas e por dela derivarem muitas das linguagens da actualidade, o FORTRAN continua a ser usado correntemente, se bem que numa verso mais moderna e num nicho de mercado: o das aplicaes de clculo em engenharia. Depois de uns poucos anos de utilizao, o Pascal foi revisto em 1974. Foi sob essa forma que se tornou uma linguagem popular. De tal maneira que comearam a surgir dialectos, isto , variantes todas parecidas, mas todas diferentes uma das outras. A proliferao destes dialectos teria consequncias graves, pois comprometeria a portabilidade dos programas, isto , a possibilidade de levar um programa de um computador para outro computador de outra marca ou de outro modelo e faz-lo correr sem muito trabalho de adaptao. Para combater a praga dos dialectos, a organizao ISO promoveu a normalizao do Pascal, em 1983. verdade que continuam a existir dialectos, sobretudo no mundo dos computadores pessoais. No entanto, os respectivos fornecedores tm normalmente o cuidado de enumerar as diferenas da sua verso em relao norma e assim torna-se mais fcil para os programadores tomarem as precaues necessrias para salvaguardar a portabilidade, se for caso disso. Hoje em dia, o ambiente Pascal mais popular o Delphi, da companhia Borland. Na verdade, o Pascal usado no Delphi muito mais extenso que o Pascal ISO, mas ns no faremos uso dessas novidades aqui. O ambiente Delphi serve para desenvolver programas para o sistema de operao Windows, com interface grfica, mas neste livro apenas consideramos programas com funcionamento em modo alfanumrico. Por isso, usaremos o Pascal ISO, excepto nalgumas situaes, para as quais chamaremos a ateno na altura em que surgirem. H alguns anos, o Pascal era geralmente considerado a melhor linguagem para a aprendizagem da programao e era usado para isso em quase todas as universidades. Hoje em
6

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

dia, essa unanimidade j no existe, mas para muitas pessoas, que j no formam a maioria, verdade, o Pascal continua a ser a melhor escolha neste campo. O ser bom para aprender a programar no significa que seja para abandonar logo que termina a fase de aprendizagem. O Pascal uma ptima linguagem de produo de programas, de uso geral, com todas as condies para ser usada profissionalmente. Certas classes de problemas, no entanto, so mais bem tratadas por linguagens especializadas e convm estar consciente disso.

1.5

Estrutura dos programas Pascal

Os programas Pascal tm todos a mesma estrutura macroscpica: so formados por um cabealho, por uma parte declarativa e por um corpo. O cabealho uma componente introdutria, que serve para especificar a maneira como o programa interage com o exterior; a parte declarativa inclui a descrio das caractersticas dos valores que o programa manipula e a especificao das operaes sobre eles, feita de forma abstracta; o corpo do programa constitudo pelas instrues cuja execuo vai dar origem ao processamento pretendido. A parte declarativa e o corpo do programa formam o bloco principal. Como exemplo, eis um programa Pascal completo para calcular o factorial de um nmero inteiro no negativo que o utilizador d pelo teclado. O resultado afixado no ecr:
program Factoriais(input, output); var n: integer; function Factorial(x: integer): integer; begin if x = 0 then Factorial := 1 else Factorial := x * Factorial(x-1) end; begin write('Qual o nmero? '); readln(n); writeln('O factorial ', Factorial(n)) end.

O cabealho formado pela primeira linha; tudo o resto constitui o bloco principal. A parte declarativa tem, neste caso, duas componentes: a declarao da varivel n, na terceira linha e a declarao da funo Factorial, entre a quarta e a dcima. No estamos a contar as linhas em branco. Alis, as linhas em branco, que aqui separam as declaraes, assim como, em geral, todas as linhas em branco num programa Pascal, no tm nenhum significado objectivo, sendo usadas para melhorar o aspecto do programa, fazendo salientar as partes que o compem.

FCA - EDITORA DE INFORMTICA 7

Pascal Tcnicas de Programao

A escrita n: integer significa que n uma varivel inteira, podendo tomar valores entre os limites da representao de nmeros inteiros vistos h pouco: -2147483648 a 2147483647, para computadores de 32 bits. Na terminologia do Pascal, diz-se que estes intervalos constituem o tipo integer. Se em resultado de uma operao aritmtica o valor da varivel n ficasse fora desses limites, o programa daria um erro, interrompendo imediatamente o seu funcionamento. A declarao da funo Factorial tem tambm um cabealho a quarta linha e um corpo as seis linhas seguintes. Por vezes, as funes tambm tm uma parte declarativa, o que quer dizer que a estrutura de uma funo semelhante do programa. Para as distinguir, as declaraes feitas nas funes dizem-se locais, por oposio s do programa, que so globais. O cabealho da funo contm a indicao do nome da funo, do conjunto de partida da funo e do conjunto de chegada. Note que estes conceitos funo, conjunto de partida, conjunto de chegada so anlogos aos da matemtica: no h aqui nada de novo, nem nada escondido. O nome da funo aparece a seguir palavra function. O conjunto de partida surge explicitamente no seio da lista de parmetros da funo, que a parte do cabealho que vem entre parntesis. Neste caso, a indicao x: integer significa que o conjunto de partida o conjunto dos inteiros representveis no computador e tambm que o argumento da funo vai ser representado no bloco da funo pelo identificador x. Neste caso, a funo tem apenas um argumento, mas existem funes com dois, trs ou mais argumentos. O conjunto de chegada indicado depois do sinal dois pontos que se segue ao parntesis que fecha a lista de parmetros. Na gria do Pascal, diz-se que a funo Factorial de tipo integer e que x um parmetro formal de tipo integer. (Correntemente, aportuguesa-se e fala-se em tipo inteiro, em vez de tipo integer. No entanto, nos programas, escreve-se sempre em ingls.) O bloco da funo comea pela palavra begin e termina com a palavra end seguinte, que com ela emparelha. Estas palavras inglesas no devem ser interpretadas como verbos de carcter imperativo, mas apenas como delimitadores do texto do bloco. Neste caso, o texto do bloco formado por uma instruo if-then-else, a qual permite fazer uma escolha entre duas alternativas, consoante o valor da expresso lgica que se segue palavra if: se for verdadeiro, vale o ramo then, seno, vale o ramo else. O significado do corpo bastante elementar: corresponde exactamente definio corrente da funo factorial usada em Matemtica:
n! = 1, se n = 0 n! = n * (n-1)!, seno (isto , se n > 0)

Trata-se de uma definio recursiva, em que a prpria funo a definir aparece na definio, mas com um argumento mais pequeno. Na avaliao, isso vai dar origem a uma sucesso de chamadas da funo, com argumentos decrescentes. A sucesso finita, se o valor inicial for no negativo (como se espera), por causa da definio especial para o caso de o argumento ser zero.
8

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

Podemos observar que, em rigor, o factorial uma funo de varivel natural e, portanto, considerar, como fizemos, que o conjunto de partida o dos inteiros constitui um abuso. No entanto, frequente proceder-se assim em Pascal, pois esta linguagem no dispe, pelo menos desde logo, de um tipo para os nmeros naturais. As declaraes das funes no desencadeiam, por si ss, nenhuns clculos. o bloco principal do programa que pe as coisas a mexer. Neste caso, o bloco principal composto por trs instrues: a primeira a chamada do procedimento write, que provoca a afixao da mensagem que surge entre plicas numa janela do ecr do terminal do utilizador; a segunda a chamada do procedimento readln, que vai interpretar os toques do utilizador no teclado e transform-los num nmero inteiro, o qual vai passar a constituir o valor da varivel n (na realidade, o que acontece que os bits das clulas de memria atribudas varivel vo passar a conter a representao convencional do nmero digitado); a terceira a chamada do procedimento writeln, para realizar a afixao na janela do valor do factorial, cujo clculo desencadeado pela presena da expresso Factorial(n) como argumento do writeln. O valor numrico aparece precedido pela mensagem que surge entre plicas. Como vemos, tanto o procedimento write como o procedimento writeln servem para afixar mensagens e valores na janela onde corre o programa. Intuitivamente, a diferena entre eles a seguinte: depois do writeln d-se uma mudana de linha, depois do write no. Assim, o utilizador vai poder escrever o seu nmero na mesma linha em que surge o pedido, o que no aconteceria se tivesse usado a instruo writeln('Qual o nmero? '), em vez de write('Qual o nmero? '). Como vemos, um programa Pascal um texto. Ao escrever programas Pascal no papel, costume fazer realar certas palavras as palavras reservadas colocando-as a negro (como aqui) ou sublinhando-as (o que mais prtico quando se escreve mo). As palavras reservadas desempenham um papel especial em Pascal e ao inventar nomes para as nossas variveis e para as nossas funes temos de evitar escolh-las (o que no muito difcil, pois elas so s 35). A disposio do texto do programa no tem qualquer significado intrnseco. Se quisssemos, podamos ter posto tudo de seguida, por exemplo assim:
program Factoriais(input, output); var n: integer; function Factorial(x: integer): integer; begin if x = 0 then Factorial := 1 else Factorial := x * Factorial(x-1) end; begin write ('Qual o nmero? '); readln(n); writeln ('O factorial ', Factorial(n)) end.

No entanto, isto seria uma ideia muito m, pois deixvamos de poder identificar facilmente as diversas partes do programa. Devemos tirar partido da possibilidade de usar o espao vontade para fazer sobressair a estrutura do programa, a fim de facilitar a vida a quem tiver de trabalhar com ele, a comear por ns prprios.

FCA - EDITORA DE INFORMTICA 9

Pascal Tcnicas de Programao

1.6

Execuo dos programas

Como vimos, um programa um texto. Para podermos fazer um computador realizar os clculos que esse texto descreve ou, como se diz, para executar (ou correr) o programa, preciso comear por meter o programa no computador. Para escrever no computador, usam-se programas chamados editores de texto. Estes programas transformam o terminal numa mquina de escrever sofisticada. Trabalha-se com o teclado como de costume e visualiza-se o que se digitou numa janela no ecr. A capacidade de modificar facilmente e rapidamente o contedo da janela de edio permite realizar com os editores operaes impensveis no papel e conferir o seu efeito imediatamente: corrigir entradas errneas, mover linhas ou grupos de linhas de um lado para outro, inserir texto no meio de uma linha, ou escrever por cima do que j l est, acrescentar novas linhas em qualquer stio, partir linhas ou juntar linhas, etc. Por outro lado, alguns efeitos que ficam bem no papel, como sublinhar ou escurecer as palavras reservadas, no fazem sentido nalguns editores mais elementares, enquanto outros, mais especializados, fazem isso automaticamente. Modernamente, a edio dos programas faz-se dentro de um ambiente de programao adaptado linguagem com que trabalhamos. Normalmente, o resultado de uma sesso de trabalho com o editor de texto no para deitar fora logo a seguir: queremos guard-lo, para o poder completar ou reutilizar mais tarde. claro que o local de arquivo ideal a memria secundria, num disco ou numa disquete. Assim, ele estar mo da prxima vez que for preciso. Nos discos existiro normalmente outros textos com programas e tambm muitas outras coisas, algumas das quais at ignoramos. Para que possamos identificar e localizar facilmente o que nos interessa, cada texto, e em geral, cada uma das coisas que residem no disco, constitui um ficheiro ou arquivo. Todos os ficheiros tm nomes diferentes e como nos referimos a eles pelo nome, nunca h dvidas. Na verdade, pode haver ficheiros com o mesmo nome, desde que estejam em directrios diferentes, por forma a no haver ambiguidade. Isto , se consideramos que o nome completo de um ficheiro inclui a indicao do directrio onde ele reside, ento no h mesmo duplicao de nomes (completos). Certas linguagens de programao so construdas de maneira que os programas respectivos so executveis logo. Isto , escrito o texto com o editor, pode-se imediatamente correr o programa para realizar os clculos pretendidos. o caso clssico das linguagens Basic e Prolog, por exemplo. Note-se que no h milagre nenhum: os computadores so, fisicamente, montanhas de circuitos electrnicos, que reagem a tenses elctricas e no aos caracteres que compem o programa. O que acontece na realidade que o programa que executado no o nosso, mas um outro, o interpretador da linguagem, para o qual o nosso programa funciona como um dos dados. O interpretador um processador de texto, capaz de pegar no texto do programa e fazer o computador comportar-se conforme a vem especificado. Outras linguagens, como o Pascal (e tambm o C, o C++, o Ada, por exemplo), exigem normalmente um certo tratamento preliminar para codificar o texto dos programas, de
10

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

maneira a torn-lo directamente executvel no hardware do computador. Depois, esta verso directamente executvel que vai ser colocada na memria central, para controlar, ela mesma, o funcionamento do computador na realizao dos clculos programados. primeira vista, a primeira tcnica parece mais simptica. No entanto, os programas interpretados dessa maneira, ou seja, executados na sua forma textual, sob controlo do interpretador, correm mais devagar do que os que so executados directamente e, por isso, a interpretao s aceitvel em situaes no muito exigentes. Quando temos um programa escrito em Pascal (ou noutra linguagem no interpretada) guardado num ficheiro de texto, para o executarmos preciso realizar trs operaes preparatrias: compilao, ligao e carregamento. A compilao consiste na traduo do texto em Pascal para um cdigo compatvel com a constituio electrnica da mquina, constituio essa que ns normalmente no conhecemos, nem queremos ter de conhecer. A compilao realizada por um compilador, um programa com capacidades de processamento de texto que, ele sim, conhece tudo o que preciso acerca desse cdigo interno e acerca da linguagem de programao utilizada, o Pascal, no nosso caso. A traduo s possvel se o texto for mesmo um programa Pascal, isto , se estiver escrito de acordo com todas as regras da linguagem. Se no, no um verdadeiro programa Pascal (apesar de ns pensarmos que sim, pois os lapsos tero sido involuntrios, com certeza) ou, quanto muito, ser um programa Pascal com erros. Na verdade, as regras das linguagens de programao so muito precisas e fcil cometermos lapsos: um ponto e vrgula que falta, um parntesis a mais, uma palavra mal soletrada, por exemplo. Estes tipos de erros no so muito graves, pois o compilador no os deixa passar e avisa-nos deles. Alis, ele melhor a detect-los do que ns prprios e, por isso, escusado perder muito tempo a olhar para o nosso texto a ver se est tudo impecvel. O compilador assinalar cada violao das regras da linguagem, indicando o stio em que isso ocorre e tambm a natureza do erro, por meio de uma mensagem explicativa. No temos mais que tomar nota, regressar ao editor de texto, fazer as correces e compilar de novo. Note-se que o compilador conhece as regras da linguagem, mas no bruxo. H erros que ele no pode detectar. Por exemplo, se na definio da funo Factorial, no programa da seco anterior, se tivesse escrito a sexta linha (no contando com a linha vazia) assim:
if x > 0 then Factorial := 1

(com o sinal de maior, em vez do de igual), o programa ficava perfeito para o compilador, mas no calculava factoriais como ns queramos (dava 1 para qualquer valor positivo introduzido no terminal). O resultado de uma compilao com xito chamado programa-objecto. Ao programa original, para distinguir, chama-se por vezes programa-fonte. O programa-objecto vai residir na memria secundria, num ficheiro, como tudo o resto. Apesar de os nomes dos ficheiros serem completamente arbitrrios, normalmente segue-se uma disciplina bastante rgida na atribuio de nomes aos diversos ficheiros envolvidos na construo de um pro FCA - EDITORA DE INFORMTICA 11

Pascal Tcnicas de Programao

grama Pascal. Comea-se por terminar os nomes de todos ficheiros com programas-fonte em Pascal por uma mesma extenso convencional, por exemplo .pas. Assim, um bom nome para o ficheiro do programa sobre factoriais seria factoriais.pas. Depois, deixa-se ao compilador o cuidado de escolher o nome do programa-objecto. Habitualmente, o compilador muda apenas a extenso, o que permite relacionar facilmente os ficheiros associados a um certo programa. De acordo com isto, o ficheiro do programa-objecto chamar-se-ia qualquer coisa como factoriais.obj. As extenses realmente usadas dependem do compilador e do ambiente de programao utilizado. A ligao uma operao um tanto misteriosa, realizada por um programa chamado ligador (linker, em ingls), que pega no programa-objecto produzido pelo compilador e o liga a outros programas-objecto pr-existentes dos quais ns no temos conhecimento directo, mas que so indispensveis para que o nosso prprio programa fique completo e autnomo, do ponto de vista do hardware. O resultado da ligao o programa-executvel, formado por cdigo capaz de activar directamente os circuitos da mquina, prontinho a ser executado. Tal como o programa-fonte e o programa-objecto, o programa-executvel vai residir num ficheiro. Se no houver indicao em contrrio, o ligador d-lhe um nome por defeito, mudando novamente apenas a extenso. No nosso caso, poderia ser factoriais.exe, por exemplo. Note-se que, uma vez obtido o programa-executvel, o programa-objecto deixa de fazer falta e deve ser apagado do disco, para no ficar a atravancar a nossa rea de trabalho. conveniente manter o programa-fonte, mesmo quando o executvel fica pronto, pois mais cedo ou mais tarde vamos precisar dele de novo para lhe fazer algumas modificaes, para nos recordarmos de como resolvemos certo problema que surgiu agora noutro contexto ou para copiar algumas partes para o programa sobre o qual estamos a trabalhar no momento. Finalmente, para poder executar verdadeiramente o programa, preciso trazer para memria central o programa executvel, a partir do respectivo ficheiro em disco, e dar-lhe o controlo do processador (isto , instruir a unidade de controlo para comear a ir buscar as instrues do nosso programa). Estas tarefas fundamentais constituem o carregamento do programa e so realizadas por um programa chamado carregador, de cuja existncia normalmente no nos apercebemos. S damos por ele quando alguma coisa corre mal e ele tem de manifestar a anomalia. O nosso programa arranca logo que o carregamento esteja completo. Em resumo, para se conseguir que um computador realize os clculos necessrios resoluo de um problema, preciso comear por escrever um programa contendo a descrio desses clculos, usando um editor de texto. Depois, preciso compilar o programa. Quando h erros de compilao, volta-se ao editor e fazem-se as correces. Quando os erros tiverem desaparecido, passa-se ligao. S ento se pode lanar a execuo (o que envolve o prvio carregamento para memria central). Ao executar um programa, nem sempre o efeito que obtemos ser o que ns antecipvamos. Por vezes, cometemos erros de lgica e a soluo que imaginmos pura e simplesmente no resolve o problema. Que fazer ento? Pensar melhor, identificar os pontos onde o nosso raciocnio falhou, reconsiderar o texto do programa, rever as nossas decises e
12

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

adaptar o programa em conformidade. Noutros casos, a nossa soluo at resolveria o problema, mas por lapso ou por desconhecimento de algum aspecto da linguagem, escrevemos no texto do programa alguma coisa que no correspondia nossa inteno. Pois bem, temos de reler tudo com ateno para localizar as partes que esto mal e corrigi-las. Este processo, que na gria chamamos fazer o debug, por vezes muito moroso, mas inevitvel. Isto que acabmos de descrever um modelo tpico. No quer dizer que todos os sistemas funcionem exactamente assim. Existem, por exemplo, casos de implementaes em que o Pascal interpretado e no compilado. Noutros sistemas, o prprio editor contm o compilador e a compilao feita dentro do editor. Esta soluo muito interessante, pois no se perde tempo a guardar ficheiros e a mudar de programa, do editor para o compilador (para ver os erros) e do compilador para o editor (para os corrigir).

1.7

Funes

O programa apresentado na seco 5 dizia respeito a um problema matemtico: calcular o factorial de um nmero natural. A soluo baseava-se na escrita de uma funo Pascal para representar a funo factorial e serviu para ilustrar a semelhana conceptual entre este aspecto da linguagem Pascal e o formalismo convencional da matemtica. Nem todos os problemas de programao provm da matemtica: os compiladores, os editores de texto, os jogos, os sistemas de gesto de pessoal, por exemplo, pouco tm a ver com essa disciplina, pelo menos primeira vista. No entanto, difcil imaginar um programa significativo que no mexa com nmeros e operaes aritmticas. Por isso, todas as linguagens vm equipadas com um conjunto de conceitos adaptados programao de expresses numricas. Na que nos interessa, o Pascal, existem, por um lado, os operadores aritmticos habituais (adio, subtraco, multiplicao e diviso), que se usam tal e qual como na Matemtica, com a pequena diferena de o produto ser sempre representado por um asterisco e o quociente no poder ser escrito com o divisor por baixo do dividendo (porque em Pascal a escrita unidimensional). Existe tambm, por outro lado, o mecanismo de declarao de funes, de que a funo Factorial um exemplo. A possibilidade de declarar funes fundamental em programao, pois as funes constituem um dos principais instrumentos de estruturao da soluo dos problemas. Tipicamente, a maior parte de um programa Pascal formada pelas declaraes das funes que se revelam necessrias para a resoluo. Na realidade, alm das declaraes das funes, normalmente aparecem, misturadas com elas, declaraes de procedimentos. Os procedimentos, que estudaremos mais adiante, so operaes abstractas, da famlia das funes. Para j, vejamos mais alguns exemplos de funes avulso. Suponhamos que preciso dispor da funo do segundo grau cujo grfico a seguinte parbola:

FCA - EDITORA DE INFORMTICA 13

Pascal Tcnicas de Programao

Figura 1.2

Usando a notao convencional da Matemtica, definir-se-ia a funo assim:


p: R > R x > x2 - 4

Passar isto para Pascal pode ser feito por analogia com a funo Factorial: preciso o cabealho, comeado pela palavra reservada function, e o corpo, entre begin e end (no h declaraes locais). Agora, no entanto, trata-se de uma funo real, de varivel real. Por isso, o tipo a usar o tipo real, um dos tipos predefinidos fornecidos pela linguagem. A pequena dificuldade resultante da impossibilidade de representar expoentes (j observmos que em Pascal a escrita unidimensional) ultrapassa-se facilmente usando a multiplicao (x2 = x * x) ou ento recorrendo funo pr-declarada sqr, que calcula o quadrado do seu argumento, precisamente aquilo que faz falta:
function P(x: real): real; begin P := sqr(x) - 4 end;

Como dissemos, a funo sqr pr-declarada. Isto significa que ela vem incorporada na linguagem e no temos de nos preocupar em declar-la ns prprios (ainda que no fosse difcil). O Pascal dispe de um pequeno nmero de funes pr-declaradas, entre as quais se encontram as funes trigonomtricas seno, coseno e arcotangente, a exponencial e o logaritmo natural, o quadrado e a raiz quadrada. Na prtica, quando queremos programar uma funo, quase nunca nos damos ao trabalho de comear por defini-la usando a notao matemtica, como no caso anterior. Passamos logo do entendimento informal para o Pascal (que, bem vistas as coisas, acaba por ser
14

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

mais expressivo e mais claro, em muitas ocasies). Suponhamos ento que queremos a funo para calcular a soma de todos os nmeros naturais entre 0 e um nmero dado. Neste caso, a maneira mais imediata de programar a operao parece ser usar a analogia com a funo Factorial, a qual calcula o produto de todos os nmeros naturais entre 1 e um nmero dado. Agora, em vez de multiplicar, soma-se. Podemos levar a analogia at questo da escolha do nome da funo: se Factorial se chama assim porque um produto de factores, ento a funo em apreo poder chamar-se Termial porque uma soma de termos:
function Termial(n: integer): integer; begin if n = 0 then Termial := 0 else Termial := n + Termial(n - 1) end;

Em palavras, a soma de todos os nmeros entre 1 e n zero, se n for zero, e n mais a soma de todos os nmeros entre 1 e n-1, se no. Se bem que esta funo calcule realmente o que se pretende, ela uma m soluo para o problema. Tal como no caso do Factorial, o resultado obtido recursivamente, exigindo sucessivas chamadas da funo, com o inerente consumo de recursos (tempo e memria). Neste caso, se tivssemos mantido o esprito aberto, sem nos deixarmos embarcar na analogia, o mais natural seria repararmos logo que se trata da soma de uma progresso aritmtica, para a qual bem conhecida a frmula (o primeiro elemento mais o ltimo, sobre dois, vezes o nmero de elementos). Portanto, evidente que muito melhor programar assim:
function Termial(n: integer): integer: begin Termial := (1 + n) * n div 2 end;

Este cdigo, muito simples, exige alguns comentrios. O smbolo div representa o operador quociente da diviso inteira. Por exemplo: 6 div 2 vale 3, 5 div 2 vale 2, 4 div 2 vale 2. No se pode confundi-lo com a barra, /, que representa a diviso real exacta. Por exemplo, 5 / 2 vale 2,5. Outra questo suscitada por este pequeno exemplo a prioridade dos operadores. Como seria de esperar, usa-se a regra habitual: as operaes multiplicativas (multiplicaes e divises) tem precedncia sobre as aditivas (adies e subtraces). Por isso, so necessrios os parntesis volta da expresso 1 + n. Por outro lado, operaes com a mesma prioridade avaliam-se da esquerda para a direita. Assim, no h dvidas de que a ltima coisa que se faz a diviso, como tem de ser.

FCA - EDITORA DE INFORMTICA 15

Pascal Tcnicas de Programao

Muitas funes tm mais do que um argumento. Seja, por exemplo, o clculo da hipotenusa de um tringulo rectngulo, dados os catetos. Trata-se de uma funo real com duas variveis reais:
function Hipotenusa(c1, c2: real): real; begin Hipotenusa := sqrt(sqr(c1) + sqr(c2)) end;

A funo sqrt a j mencionada funo pr-declarada para a raiz quadrada. Este exemplo levanta tambm a questo das regras de escrita dos identificadores. Em Pascal, os identificadores so sequncias de letras e algarismos, comeadas por uma letra. Todos os caracteres so significativos, mas as maisculas so equivalentes s minsculas. Assim, no nosso caso, o facto de sistematicamente escrevermos os nomes das funes que estamos a definir com maiscula inicial meramente uma questo de estilo. Ao programarmos, muito frequente surgir a necessidade de, dados dois nmeros inteiros, termos de escolher o maior ou o menor deles dois. Estas operaes no esto pr-declaradas e, por isso, temos de ser ns a ocuparmo-nos da sua declarao. Trata-se de funes inteiras com duas variveis inteiras:
function max(a, b: integer): integer; begin if a >= b then max := a else max := b end; function min(a, b: integer): integer; begin if a <= b then min := a else min := b end;

Repare-se nos operadores <= e >=, formados por smbolos duplos, representando as operaes relacionais menor ou igual e maior ou igual. Note-se que se fosse preciso calcular o mximo de dois nmeros reais, ter-se-ia de programar uma outra funo para isso, pois a anterior funo max s se aplica a inteiros para dar resultado inteiro. Poderia ser assim:

16

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

function rmax(a, b: real): real; begin if a >= b then rmax := a else rmax := b end;

O corpo idntico, mas o cabealho especifica argumentos e resultado de outro tipo. Repare-se que demos outro nome funo, porque o nome max j teria sido atribudo a outra funo no mesmo programa, presumivelmente. Em alguns dos exemplos anteriores tm surgido expresses relacionais envolvendo comparaes entre valores. As expresses relacionais so um caso particular das expresses lgicas, isto , expresses cujo valor um dos valores lgicos falso ou verdadeiro. Em Pascal, os valores lgicos aparecem por intermdio de um tipo predefinido, o tipo boolean, e so representados pelas duas constantes deste tipo, false e true. O tipo boolean um tipo como os outros. Como seria de esperar, dispe de um conjunto de operadores para as operaes lgicas usuais: not para a negao, and para a conjuno e or para a disjuno (com prioridade decrescente por esta ordem). Alm disso, frequentemente acontece necessitarmos de funes booleanas. Eis uma, como exemplo, para determinar se um dado nmero inteiro pertence ao intervalo fechado limitado por outros dois:
function Entre(a: integer; x1, x2: integer): boolean; begin Entre := (x1 <= a) and (a <= x2) end;

Repare-se bem que a expresso relacional x1 <= a tem um valor lgico, assim como a expresso a <= x2. A conjuno desses dois valores lgicos um valor lgico, o qual constituir o valor da funo. Os parntesis so necessrios, porque os operadores booleanos tm prioridade superior dos relacionais. Sem parntesis, estaria a especificar-se em primeiro lugar a conjuno a and a, o que neste caso no faz sentido (pois a expresso a representa um nmero inteiro e no um valor lgico) e seria assinalado como erro pelo compilador. Em rigor, a lista de parmetros poderia escrever-se a, x1, x2: integer, simplesmente. A separao em dois grupos serve apenas para realar a natureza diferente dos argumentos: o primeiro o nmero que se quer saber se est no intervalo formado pelos outros dois. Vejamos outra funo booleana, esta para descobrir se um nmero divide outro:
function Divide(a, b: integer): boolean; {a divide b, i.e., b um mltiplo de a} begin Divide := b mod a = 0 end;

FCA - EDITORA DE INFORMTICA 17

Pascal Tcnicas de Programao

O operador mod um operador aritmtico, da classe dos operadores multiplicativos, e representa o resto da diviso inteira (7 mod 3 vale 1, 8 mod 3 vale 2, 9 mod 3 vale 0). Como evidente, a dividir b, se b dividido por a der resto 0. No confundir o sinal de afectao := com o operador relacional de igualdade =. Repare-se bem que a expresso b mod a = 0 uma expresso booleana. No so precisos parntesis, porque a prioridade dos operadores aritmticos superior dos relacionais. O texto entre chavetas (incluindo as chavetas) um comentrio. Os comentrios no fazem propriamente parte dos programas e usam-se para acrescentar informao informal acerca de um qualquer ponto que no seja imediatamente compreensvel. Neste caso, o cabealho Divide(a, b: integer): boolean; ambguo acerca de quem divide quem. O comentrio explicita qual o significado pretendido e permite verificar que o corpo est correcto. Vimos anteriormente que o Pascal dispe de uma funo pr-declarada para calcular o quadrado de um nmero, a funo sqr. Esta funo tem uma particularidade (que s partilha com uma outra) e que a seguinte: pode aplicar-se a nmeros inteiros ou a nmeros reais e o resultado do tipo do argumento. Normalmente, as funes tm argumentos e resultados de tipos bem determinados. A outra funo com este funcionamento a funo abs, que calcula o valor absoluto de um inteiro ou de um real. Mas, se existe a funo sqr para calcular quadrados, falta uma funo para elevar nmeros a expoentes arbitrrios (uma vez que tambm no existe uma operao de potenciao, como noutras linguagens). No entanto, esta falta no muito grave e pode ser facilmente colmatada usando as funes pr-declaradas para a exponencial, exp, e para o a a ln x logaritmo natural, ln, pois como sabido: x = e . Donde:
function pot(x, a: real): real; begin pot := exp(a * ln(x)) end;

Note-se que os dois argumentos so reais e o resultado tambm. Se quisermos elevar um nmero real a um expoente inteiro, podemos continuar a usar a funo, pois no momento da chamada dar-se- uma converso automtica desse valor inteiro para o seu equivalente real e o resultado calculado convenientemente. No entanto, quando os expoentes so inteiros existem outras maneiras mais eficientes de calcular as potncias, tal como veremos mais adiante. Outra funo habitual que no aparece pr-declarada a tangente. Quando for precisa, programa-se assim:
function tan(x: real): real; begin tan := sin(x) / cos(x) end;

Ao usar esta funo, h que ter cuidado em no lhe passar um argumento que anule o coseno. Se tal acontecer, dar-se- uma diviso por zero, operao sem significado, conside18

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

rada um erro fatal e a execuo do programa onde tal ocorrer terminar imediatamente, em situao de erro. Na gria oficial diz-se que o programa aborta; mais informalmente (e mais expressivamente) fala-se que o programa estoira ou vai ao ar Frequentemente, nem todos os valores do tipo do parmetro so argumentos aceitveis. No Factorial, se o argumento for negativo, a funo fica indefinida (no devolve nenhum valor), o mesmo acontecendo na primeira verso do Termial. Nestes casos, se o argumento for um nmero negativo, a sucesso de chamadas recursivas nunca pra. Ou melhor, pra quando a memria se esgotar, pois cada chamada de funo requer memria adicional e a memria dos computadores finita, ou quando a sucesso dos valores dos argumentos ultrapassar, para baixo, o limite inferior dos nmeros inteiros representveis no computador. J a segunda verso da funo Termial funciona mesmo com valores negativos, ainda que o valor calculado nesse caso no tenha nada a ver com o problema inicial. Em qualquer declarao de funo deve ficar evidente de alguma maneira quais so os valores aceitveis para os argumentos e quais so os no aceitveis. Frequentemente, no preciso explicitar nada (por exemplo, toda a gente sabe que a tangente no existe quando o coseno zero). Noutros casos, menos claros, convir incluir um comentrio. Ficar ento responsabilidade de quem usa a funo garantir que os argumentos fazem sentido.

1.8

Algoritmos

Em programao, como em muitas outras coisas da vida, normalmente os problemas que aparecem no tm uma soluo nica: haver em geral vrias maneiras de os resolver, cada uma com os seus mritos e com os seus inconvenientes. A essncia de uma soluo de um problema de programao chamada algoritmo. Dois programas diferentes podem constituir solues essencialmente idnticas para um certo problema e ento diremos que eles implementam o mesmo algoritmo. Noutros casos, os prprios algoritmos so logo diferentes e deles resultam forosamente programas diferentes. o que acontece com as duas verses da funo Termial na seco anterior, por exemplo. O termo algoritmo muitas vezes usado com um sentido tcnico preciso. O glossrio do IEEE decreta que um algoritmo a finite set of well-defined rules for the solution of a problem in a finite number of steps. Esta definio no anda muito afastada da de programa enquanto texto contendo a descrio de clculos, escrito numa linguagem de programao (ver seco 4). De facto, pode dizer-se que um algoritmo um programa do qual se faz abstraco da linguagem de programao usada para o escrever. Note-se que os algoritmos so formados por regras bem definidas e, por isso, s podem ter existncia objectiva enquanto programas. A nuance est em que quando pensamos no algoritmo, estamos a esquecer a linguagem, para nos concentrarmos apenas na essncia do mtodo de resoluo. Nos programas, pelo contrrio, a linguagem um elemento importantssimo, que preciso ter em conta permanentemente, para a utilizar da maneira mais eficaz e produtiva. Quando nos surge um novo problema de programao, deparam-se-nos normalmente vrios algoritmos: alguns so sugeridos directamente pelo enunciado, enquanto outros s FCA - EDITORA DE INFORMTICA 19

Pascal Tcnicas de Programao

os descobrimos depois de uma anlise mais refinada, utilizando os nossos prprios conhecimentos acerca do domnio do problema. Vejamos um exemplo tpico desta situao. Trata-se de escrever um programa Pascal completo para afixar na janela o mximo divisor comum de dois nmeros inteiros positivos dados pelo teclado. A parte mais importante deste programa vai ser uma funo para calcular o mximo divisor comum de dois inteiros positivos: tudo o resto semelhante ao que foi visto no programa da seco 6. Sendo assim, dirijamos as atenes para esta funo. Ainda antes de saber como calcular, podemos escrever o cabealho:
function MDC(a, b: integer): integer;

Para evitar situaes extremas, pouco claras, decretamos desde j que os dois argumentos devem ser positivos. No ficar mal incluir um pequeno comentrio informativo:
{pre: a >= 1, b >= 1}

Qual neste caso o algoritmo sugerido pelo enunciado? O que se quer achar o mximo divisor comum de dois nmeros inteiros positivos, isto , o maior nmero inteiro que divide simultaneamente esses dois nmeros. Da seco anterior, aproveitemos a funo booleana Divide, que serve para determinar se um nmero divide outro. Com isto, uma parte do problema fica logo resolvida. Para determinar o maior nmero que divide os dois argumentos, podemos comear por experimentar o maior nmero representvel (2147483647, nos computadores de 32 bits). Se der, j est; se no, vamos decrementando o nmero a testar, at que ele divida os outros dois, o que, sabemos ns, h-de acontecer mais tarde ou mais cedo. Por outras palavras, comeamos com o maior nmero possvel e, enquanto esse nmero no dividir ambos os argumentos, vamos decrementando. Em Pascal, este algoritmo exprime-se assim:
function MDC(a, b: integer): integer; {pre: a >= 1, b >= 1} var i: integer; begin i := maxint; while not (Divide(i, a) and Divide(i, b)) do i := pred(i); MDC := i end;

Esta funo tem cinco coisas novas. A primeira a declarao da varivel i, interna funo. Trata-se de uma varivel local, que s diz respeito funo MDC e que s tem existncia enquanto duram os clculos referentes avaliao da funo. Pode haver no programa outras variveis com o mesmo nome, mas no tm nada a ver com esta. O corpo da funo composto por trs instrues. At agora cada corpo tinha s uma instruo. Cada duas instrues consecutivas so separadas por um sinal ponto e vrgula. Aqui, portanto, o ponto e vrgula funciona como separador. Noutras ocasies, por exemplo no fim de cabealhos e no fim de declaraes, funciona como terminador.
20

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

A primeira instruo uma afectao, por meio da qual se inicializa a varivel i. O identificador maxint, que aparece do lado direito, denota uma constante predefinida, cujo valor o do maior inteiro representvel no computador onde o programa for compilado, ou seja, 2147483647, nos computadores de 32 bits. Usar maxint, em vez de 2147483647, mais prtico (no temos de nos lembrar do valor exacto do nmero), mais seguro (no corremos o risco de nos enganarmos em algum dos algarismos), mais geral (o programa fica independente do nmero de bits usados para os nmeros inteiros). Esta ltima propriedade muito interessante, pois se tivermos a trabalhar num computador antigo, com palavras de 16 bits, o valor de maxint ser 215 1 (ou seja 32767) automaticamente, sem ns termos de nos preocupar em registar isso explicitamente no texto do nosso programa. A segunda instruo uma instruo while. Trata-se de uma instruo iterativa, cuja forma geral while B do S, para uma expresso booleana B e uma instruo S. O funcionamento corresponde leitura informal: enquanto se verificar a condio B, executar a instruo S. Por outras palavras, a execuo de while B do S comea pela avaliao da condio B; se der falso, a execuo termina (isto , passa-se instruo seguinte, a que vier a seguir instruo while B do S); se der verdadeiro, executa-se a instruo S e depois recomea-se, voltando a executar a instruo while B do S (de acordo com as mesmas regras). Neste caso, a instruo controlada pelo ciclo while ou, como tambm se diz, o corpo do ciclo, a afectao i := pred(i). Do lado direito desta afectao surge a funo pr-declarada pred, cujo valor o predecessor do argumento, precisamente o que ns queramos. Mais convencionalmente, podamos ter usado a subtraco, assim: i := i - 1, que ia dar no mesmo. Como seria de esperar, existe tambm no Pascal uma funo para o sucessor e chama-se succ. Esta primeira soluo mesmo muito m (apesar de bonita), ainda que no se possa dizer que no funcione. Comear pelo maior inteiro representvel revela que no se percebeu nada do que se est a fazer. evidente (para quem saiba um pouquito de aritmtica), que basta comear a testar pelo menor dos dois argumentos. Isto at nem difcil de implementar, se recordarmos a funo min da seco anterior: basta substituir a inicializao de i por:
i := min(a, b);

Este mtodo de resolver o problema no recorreu a nenhuns conhecimentos especiais: tudo o que se fez foi interpretar o enunciado, nomeadamente a expresso mximo divisor comum. Na gria, este tipo de solues pouco imaginativas so classificadas de fora bruta. Em portugus, era mais sugestivo adoptar a gria do bilhar e falar em solues meia bola e fora, no sentido de pouco jeito e esbanjamento de recursos. No entanto, preciso reconhecer que esta soluo meia bola e fora s poderia ocorrer a um programador, habituado utilizao dos ciclos while, os quais constituem uma ferramenta de programao muito caracterstica. Uma pessoa no contaminada pela programao provavelmente escolheria uma estratgia diferente: formar os conjuntos dos divisores de cada um dos nmeros; calcular a sua interseco; determinar o mximo elemento FCA - EDITORA DE INFORMTICA 21

Pascal Tcnicas de Programao

do conjunto assim obtido (o qual no vazio, de certeza). Uma soluo nestes termos seria muito mais complicada de programar e, por isso, deixamo-la de lado. Uma tentao a que os programadores muitas vezes no resistem adaptar programao os mtodos manuais que conhecem para resolver os problemas. No caso do mximo divisor comum, a tcnica convencional consiste em fazer a decomposio em factores primos de cada um dos nmeros e depois obter o produto dos factores primos comuns. No entanto, no faria sentido programar isto (ainda que fosse possvel, claro). Seria preciso dispor de uma lista de todos os nmeros primos (ou pelo menos de um mtodo para os ir gerando, medida das necessidades), o que s por si exigiria um programa bem mais complicado do que aquele que queremos escrever agora. Mas uma vez conseguido isso, a factorizao em si mesma no seria muito difcil, ainda que tivssemos de decidir como representar o resultado da factorizao, de maneira a facilitar a deteco dos factores comuns. Finalmente, o mximo divisor comum calculava-se sem grandes dificuldades, multiplicando todos os factores comuns. H mais de dois mil anos, Euclides inventou um mtodo muito mais prtico para calcular o mximo divisor comum, justamente conhecido por algoritmo de Euclides. Baseia-se na seguinte observao: se os dois nmeros so iguais, o mximo divisor comum igual a esses nmeros; se so diferentes, igual ao mximo divisor comum do menor dos nmeros e da diferena entre eles, diferena positiva, entenda-se. Ora isto programa-se muito bem, recursivamente, claro:
function MDC(a, b: integer): integer; {pre: a >= 1, b >= 1} begin if a = b then MDC := a else MDC := MDC(min(a, b), abs(a - b)) end;

A funo pr-declarada abs (j mencionada) calcula o valor absoluto do seu argumento. Recorde-se que o resultado inteiro se o argumento for inteiro e real se for real. Em rigor, o algoritmo de Euclides uma aplicao de algumas das propriedades da funo mximo divisor comum, a saber:
MDC(a, a) = a MDC(a, b) = MDC(b, a) se a > b ento MDC(a, b) = MDC(a - b, b)

A partir destas propriedades, obtm-se facilmente uma definio recursiva:


MDC(a - b, b), se a > b MDC(a, b) = a, se a = b MDC(a, b - a), se a < b

22

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

Isto d origem a uma programao ligeiramente diferente da vista h pouco:


function MDC(a, b: integer): integer; {pre: a >= 1, b >= 1} begin if a = b then MDC := a else if a > b then MDC := MDC(a - b, b) else MDC := MDC(a, b - a) end;

interessante reflectir um pouco sobre este cdigo, para ver se conseguimos transform-lo num programa no recursivo. De facto, o que se passa que se vai subtraindo o menor dos dois valores ao maior deles, enquanto no forem iguais (o que h-de acontecer, sabemo-lo ns, porque a funo est definida para qualquer par de inteiros positivos). Este funcionamento exprime-se facilmente com a ajuda da instruo while:
function MDC(a, b: integer): integer; {pre: a >= 1, b >= 1} begin while a <> b do if a > b then a := a - b else b := b - a; MDC := a end;

Note-se o sinal duplo <>, que denota o operador relacional diferente. Nesta funo, os parmetros so tambm usados como variveis, com o significado intuitivo. Vejamos ento o programa completo. A leitura dos nmeros cujo mximo divisor comum se pretende faz-se por meio da instruo readln, como no programa da seco 6. Agora, no entanto, vamos dar-nos ao trabalho de verificar se os nmeros so susceptveis de ser processados. Caso no sejam, no se faz nada, para alm de emitir uma mensagem de erro:
program MaximoDivisorComum(input, output); var n1, n2: integer; function MDC(a, b: integer): integer; {pre: a >= 1, b >= 1} begin while a <> b do if a > b then a := a - b

FCA - EDITORA DE INFORMTICA 23

Pascal Tcnicas de Programao

else b := b - a; MDC := a end; begin writeln('Mximo divisor comum'); write('Valores? '); readln(n1, n2); if not ((n1 >= 1) and (n2 >= 1)) then writeln('Valores invlidos!') else writeln('Resultado: ', MDC(n1, n2)) end.

O desenvolvimento j vai longo, mas ainda no fica por aqui! Olhemos para o programa e tentemos perceber bem o que acontece durante a execuo: quando, por exemplo, a maior que b, o ramo then vai ser escolhido sucessivamente e o valor de a vai diminuindo at estar no intervalo [1..b]. O valor final da varivel a, depois dessa fase do processamento, precisamente o resto da diviso de a por b, se a no for um mltiplo de b, ou b, se for. Tentativamente, poderamos substituir a instruo if-then-else por:
if a > b then if Divide(b, a) then a := b else a := a mod b else if Divide(a, b) then b := a else b := b mod a

Esta programao seria inaceitvel, por vrias razes: primeiro, tanto a funo Divide como o ramo else do if-then-else respectivo envolvem a mesmssima operao de diviso para calcular o resto e essa duplicao desnecessria, certamente. Depois, o if-then-else exterior deve poder ser evitado, pois a escolha entre os seus dois ramos faz-se agora alternadamente (enquanto o ciclo durar), j que cada varivel se torna inferior outra. Vejamos primeiro como evitar a duplicao do clculo do resto. O que era preciso era uma funo binria, com um funcionamento anlogo ao do operador mod, mas dando como resultado o valor do divisor quando o resto zero. Trata-se de um pequeno exerccio de aritmtica de mdulos:
function Mod2(a, b: integer): integer; begin Mod2 := succ(pred(a) mod b) end;

24

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

Portanto, uma primeira simplificao daquela instruo complicada d:


if a > b then a := Mod2(a, b) else b := Mod2(b, a)

altura de reparar que se a > b for falso, isto , se o valor de a for menor ou igual ao de b, ento Mod2(a, b) vale o mesmo que a. Observao anloga pode ser feita a respeito do ramo else e do valor de Mod2(b, a). Logo, a instruo if-then-else pode desaparecer, tanto mais que j vimos que os dois ramos so seleccionados alternadamente. Obtemos:
while a <> b do begin a := Mod2(a, b); b := Mod2(b, a) end;

Note-se que o que se pretende que enquanto os valores de a e de b forem diferentes, se vo executando, em sequncia, as duas afectaes. Como uma instruo while controla apenas uma instruo (a forma geral while B do S, recorde-se) preciso fazer das duas afectaes uma nica instruo. para isso que serve o super-parntesis begin end: transforma a sequncia de instrues que engloba numa nica instruo composta, de nvel superior. Pode objectar-se que esta soluo tem o ligeiro inconveniente de, por vezes (em metade dos casos), fazer uma chamada de Mod2 desnecessariamente, quando a igualdade das duas variveis atingida depois da primeira afectao. Isso no muito grave, mas como, por regra, se deve realmente evitar andar a fazer contas s para aquecer, vejamos como eliminar esta pequena anomalia. Uma soluo simptica consistiria em tentar organizar as coisas por forma a haver apenas uma diviso por cada passo do ciclo. Para conseguir isso, podemos tirar partido da comutatividade do mximo divisor comum e ir trocando os valores das variveis, por forma a que o valor de a seja sempre maior ou igual ao de b (por exemplo). A troca dos valores de duas variveis um problema clssico, que se resolve nas linguagens convencionais recorrendo a uma varivel auxiliar para memorizar o valor da primeira das variveis que recebe o valor da outra:
t := a; a := b; b := t

Se garantirmos que o valor inicial de a maior ou igual ao de b, podemos escrever:


{a >= b} while a > b do begin a := Mod2(a, b); t := a;

FCA - EDITORA DE INFORMTICA 25

Pascal Tcnicas de Programao

a := b; b := t end; Mod2(a, b) e que o valor final de a {a >= b} while a > b do begin t := b; b := Mod2(a, b); a := t end;

Isto pode ser melhorado, notando que o valor final de b o resultado da chamada o valor inicial de b:

Resta preparar os valores iniciais, para que a condio imposta (a >= b) se verifique. Atendendo comutatividade, basta trocar o valor das duas variveis, quando elas no estiverem logo como preciso:
function MDC(a, b: integer): integer; { a >= 1, b >= 1 } var t: integer; begin if a < b then begin t := a; a := b; b := t end; while a > b do begin t := b; b := Mod2(a, b); a := t end; MDC := a end;

Atente-se na declarao local da varivel auxiliar t e na instruo composta que constitui o ramo then da instruo if-then-else. Repare-se tambm que o ramo else est ausente, uma vez que nada h a fazer se o valor de a for maior ou igual ao de b. Alternativamente, poderamos ter optado por autonomizar a operao auxiliar que calcula o mximo divisor comum de dois nmeros com a restrio de o primeiro ser maior ou igual ao segundo. Trata-se de uma funo, a qual, devido sua especificidade, s usada no mbito da funo MDC. Por isso, deve ser declarada localmente, para no atravancar o espao das funes de uso geral:

26

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

function MDC(a, b: integer): integer; {pre: a >= 1, b >= 1} function MDCAux(a, b: integer): integer; {pre: a >= 1, b >= 1, a >= b} var t: integer; begin while a > b do begin t := b; b := Mod2(a, b); a := t end; MDCAux := a end; begin MDC := MDCAux(max(a, b), min(a, b)) end;

Repare-se que a varivel auxiliar t declarada no mbito da funo onde usada, a funo auxiliar MDCAux. O programa completo fica um pouco mais comprido nesta verso do que na anterior:
program MaximoDivisorComum(input, output); var n1, n2: integer; function max(a, b: integer): integer; begin if a >= b then max := a else max := b end; function min(a, b: integer): integer; begin if a <= b then min := a else min := b end; function Mod2(a, b: integer): integer; begin Mod2 := succ(pred(a) mod b) end;

FCA - EDITORA DE INFORMTICA 27

Pascal Tcnicas de Programao

function MDC(a, b: integer): integer; {pre: a >= 1, b >= 1} function MDCAux(a, b: integer): integer; {pre: a >= 1, b >= 1, a >= b} var t: integer; begin while a > b do begin t := b; b := Mod2(a, b); a := t end; MDCAux := a end; MDC := MDCAux(max(a, b), min(a, b)) end; begin writeln('Mximo divisor comum'); write('Valores? '); readln(n1, n2); if not ((n1 >= 1) and (n2 >= 1)) then writeln('Valores invlidos!') else writeln('Resultado: ', MDC(n1, n2)) end.

Em resumo, este exerccio ps em evidncia quatro algoritmos para o problema do mximo divisor comum: o algoritmo meia bola e fora, o algoritmo da teoria dos conjuntos, o algoritmo manual (estes dois no chegmos a programar) e o algoritmo de Euclides. O moral da histria que na anlise de um problema de programao no devemos limitar-nos nem interpretao literal do enunciado, nem ao recurso pouco esclarecido aos mtodos tradicionais. preciso reflectir, estudar o domnio do problema, procurar propriedades susceptveis de conduzir a solues melhores. Finalmente, o prprio programa deve ser analisado e trabalhado, no sentido de se conseguir uma utilizao mais racional da linguagem de programao.

1.9

Sintaxe e semntica

Vimos na seco 2 que uma linguagem de programao um conjunto de regras de descrio de clculos, para o qual existe um documento de referncia. No caso do Pascal, o documento de referncia o livro Pascal User Manual and Report, de Jensen e Wirth ou, ento, a norma ISO 7185-1982 Specification for Computer Programming Language Pascal. O documento de referncia tem de ser rigoroso, por forma a responder inequivocamente a quaisquer questes colocadas tanto pelos que programam na linguagem, como por aque28

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

les que vo produzir os respectivos compiladores ou interpretadores. No entanto, as linguagens de programao so construes artificiais complexas e frequentemente o rigor absoluto difcil de atingir. Por exemplo, a segunda edio do Pascal User Manual and Report, nica referncia oficial durante muito tempo, continha muitas imprecises. Cada nova edio do livro (actualmente a mais recente a quarta, de 1991) tenta ser mais precisa do que a anterior. Deve dizer-se que as imprecises geralmente no incomodam demasiado os programadores, que na maior parte dos casos nem do por elas. No entanto, constituem um srio problema para os implementadores, isto , para aquelas pessoas, programadores tambm, que tm de programar os compiladores. As regras de descrio que constituem uma linguagem de programao dividem-se em duas classes: regras sintcticas e regras semnticas. As primeiras governam a escrita de programas vlidos. Por outras palavras (e mais abstractamente), definem o conjunto de todos os programas (independentemente de eles servirem para alguma coisa ou no). Note-se que, em rigor, o adjectivo vlido aplicado a programa redundante: um programa s um programa se respeitar as regras sintcticas da linguagem e, nesse caso. vlido. Se no respeitar as regras, ento no um programa, mas apenas um texto parecido com um programa. Um exemplo de uma regra sintctica a seguinte: um programa Pascal comea pela palavra reservada program e termina por um ponto. Daqui se infere que qualquer texto que ou no comece por program ou no termine por um ponto no um programa Pascal. Por outro lado, claro que nem tudo o que comea por program e acaba por ponto ser um programa Pascal As regras semnticas so as que do significado aos programas. Normalmente, elas referem-se a certos objectos sintcticos. Por exemplo, o efeito de uma instruo if B then S1 else S2, onde B uma expresso booleana e S1 e S2 so instrues quaisquer, o efeito de S1, se a avaliao de B der true, ou o efeito de S2, se der false. Note-se que esta regra inerentemente recursiva, pois explica o efeito da instruo if-then-else em termos do efeito de outras instrues e no est excludo que essas possam ser instrues if-then-else tambm. Os dois exemplos de regras, a sintctica e a semntica, vm enunciados em portugus corrente. O ideal talvez fosse dispormos de um formalismo matemtico bem definido sobre o qual no existissem dvidas, pois as lnguas naturais, mesmo quando manobradas com cuidado, so muitas vezes imprecisas e acabam por gerar confuses. Na realidade, existem vrios tipos de formalismos prprios para a descrio rigorosa da sintaxe e da semntica das linguagens, s que eles esto longe de ser elementares. Pelo contrrio, exigem bastantes conhecimentos prvios para poderem ser utilizados com eficcia. Por isso, no dia a dia, o melhor, em muitos casos, ainda explicar as coisas por extenso, mas com todas as precaues para se ser completo e claro, por um lado, e para evitar ambiguidades e inconsistncias, por outro. Para a sintaxe, no entanto, existe uma tcnica muito simples que permite descrever grande parte dela de modo compacto e muito sugestivo. Trata-se dos diagramas sintcticos. Um diagrama sintctico um grafo, associado a um objecto sintctico da linguagem (por exemplo, programa, instruo ou lista de parmetros), de tal forma que cada FCA - EDITORA DE INFORMTICA 29

Pascal Tcnicas de Programao

percurso no grafo define um objecto sintctico vlido. Os grafos so orientados, tm um ponto de entrada e um ponto de sada e o percurso estende-se entre um e outro. Por exemplo, eis um diagrama sintctico para o objecto sintctico programa, especificando que um programa Pascal constitudo por um cabealho, seguido de um bloco, seguido de um ponto:
programa cabealho de programa bloco .

Figura 1.3

O exemplo ilustra que existem dois tipos de ns nos diagramas: uns rectangulares, que correspondem a objectos sintcticos, e outros arredondados, que correspondem aos chamados smbolos terminais. Os smbolos terminais so aquilo que se escreve realmente no programa Pascal. Existe um diagrama sintctico para cada objecto sintctico, exprimindo a sua sintaxe em termos de outros objectos sintcticos e de smbolos terminais. Por exemplo, o diagrama sintctico para cabealho de programa pode ser assim:
cabealho de programa program identificador ;

identificador

Figura 1.4

Por sua vez, o de identificador assim:


identificador letra letra algarismo

Figura 1.5

Trata-se da expresso grfica da regra de construo de identificadores: um identificador uma sequncia de letras e algarismos comeada por uma letra.

30

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

Os diagramas para algarismo e para letra so muito simples e constituem apenas a enumerao de todos os smbolos terminais respectivos:
algarismo

Figura 1.6
letra a b c d e f g h k j l m

o n p

q r

s t

u v

w x

y z

Figura 1.7

Neste diagrama, implicitamente, cada letra representa a sua forma minscula e maiscula. J agora, aproveitemos para concretizar a estrutura de um bloco:
bloco parte declarativa corpo

Figura 1.8

A parte declarativa fica para mais tarde. O corpo do bloco uma sequncia de instrues separadas por pontos-e-vrgulas, englobados pelos smbolos terminais begin e end:

FCA - EDITORA DE INFORMTICA 31

Pascal Tcnicas de Programao corpo begin instruo ; end

Figura 1.9

O diagrama para o objecto sintctico instruo conter a descrio da sintaxe de todas as instrues do Pascal. Ir sendo construdo medida das necessidades.

1.10

Resumo

Nas seces 5 (Estrutura dos programas Pascal), 7 (Funes) e 8 (Algoritmos) j utilizmos uma boa parte da linguagem Pascal. Vamos fazer aqui uma recapitulao dos tpicos fundamentais, acrescentando alguma informao complementar, quando isso for til.

Estrutura dos programas Pascal

Os programas Pascal so formados por um cabealho e um bloco (dito bloco principal) e terminam por um ponto. O cabealho, e portanto o programa, comea pela palavra reservada program. O bloco principal (como qualquer outro bloco) constitudo por uma parte declarativa (que pode ser vazia) e por um corpo, o qual formado por instrues executveis, englobadas por um par begin end. Os diagramas destes objectos sintcticos foram apresentados no final da Seco anterior.

Palavras reservadas

As palavras reservadas s podem ser utilizadas no contexto explicitamente previsto na definio da linguagem Pascal. So 35 em Pascal normalizado. Eis a sua lista completa:
and array begin case const div do downto else end file for function goto if in label mod nil not of or packed procedure program record repeat set then to type until var while with

Note-se que sintacticamente as palavras reservadas so smbolos terminais. Identificadores Os identificadores so nomes usados para designar variveis, funes, constantes e ainda outras classes de objectos, criados pelo programador ou j includos na linguagem. So constitudos por letras e algarismos, comeando sempre por uma letra. O diagrama sintctico j foi apresentado na seco anterior.
32

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

Tipos

Um tipo define um conjunto de valores utilizveis num programa e as operaes que se lhes podem aplicar. Existe um pequeno grupo de tipos predefinidos, entre os quais se encontram os tipos integer (nmeros inteiros), real (nmeros reais) e boolean (valores lgicos). O tipo integer corresponde na realidade a um intervalo de inteiros, cujos limites dependem do computador. Existe uma constante predefinida, maxint, com o valor do maior nmero inteiro representvel. Declarao de funes A declarao de uma funo constituda por um cabealho de funo e por um bloco. O cabealho comea pela palavra reservada function, seguida pelo nome da funo (um identificador), pela lista de parmetros e pelo tipo do resultado. O bloco, sintacticamente idntico ao bloco do programa, formado por uma parte declarativa (que pode ser vazia) e por um corpo. O corpo contm as instrues executveis, entre as quais figura pelo menos uma afectao ao identificador da funo, que serve para definir o resultado da avaliao. A parte declarativa contm as declaraes locais. Estas declaraes podem dizer respeito a variveis, a funes e ainda a outras classes de objectos, visveis e utilizveis apenas no mbito da funo. Funes pr-declaradas A linguagem Pascal vem equipada com um certo nmero de funes pr-declaradas de uso geral. Destas, algumas so aritmticas. Ei-las:
abs(x) sqr(x) sin(x) cos(x) exp(x) ln(x) sqrt(x) arctan(x)

valor absoluto de x (x pode ser inteiro ou real e o resultado do mesmo tipo). quadrado de x (x pode ser inteiro ou real e o resultado do mesmo tipo). seno de x (x real, em radianos). coseno de x (x real, em radianos). exponencial de x, isto , ex. logaritmo natural de x (x deve ser positivo). raiz quadrada de x (x deve ser no negativo; o resultado real). arco cuja tangente x (resultado entre -p/2 e p/2).

Existem ainda duas outras funes numricas, ditas de transferncia, que servem para passar de nmeros reais para nmeros inteiros, por arredondamento e por truncamento:
round(x) trunc(x)

arredondamento: devolve o nmero inteiro mais prximo de x (x real). truncamento: devolve a parte inteira de x (x real).

FCA - EDITORA DE INFORMTICA 33

Pascal Tcnicas de Programao

Declarao de variveis

Todas as variveis utilizadas num programa Pascal tm de ser declaradas. A sua manipulao no programa tem de ser compatvel com o tipo especificado na declarao, o qual determina o conjunto de valores que a varivel pode conter. Sintacticamente, a declarao das variveis uma componente da parte declarativa. Eis o seu diagrama sintctico:
declarao de variveis var identificador , : tipo ;

Figura 1.10

Note-se que tipo um objecto sintctico. Instruo if-then-else Sintacticamente, a instruo if-then-else uma componente do objecto sintctico instruo. O seu diagrama o seguinte. Repare-se que o ramo else pode faltar:
instruo if-then-else if expresso the n instruo else instruo

Figura 1.11

Em esquema, a forma da instruo if B then S1 else S2, para um if-then-else completo, ou if B then S1, para um if-then-else sem else (tambm chamado if-then), onde B uma expresso booleana e S1 e S2 so instrues quaisquer. Nesta fase, podemos dizer que o efeito da instruo if B then S1 else S2 o efeito de S1, se a avaliao de B der true, e o efeito de S2, se der false. Analogamente, o efeito da instruo if B then S1 o efeito de S1, se avaliao de B der true, e inexistente, se der false. Por outras palavras, se B der false, a instruo if B then S1 no tem qualquer efeito. Instruo while Como a instruo if-then-else, a instruo while uma componente do objecto sintctico instruo. O seu diagrama simples:
instruo while while expresso do instruo

Figura 1.12

34

FCA - EDITORA DE INFORMTICA

Introduo aos Computadores e Programao

Em esquema, a forma da instruo while B do S, para uma expresso booleana B e uma instruo S. O seu efeito pode ser explicado assim: se a avaliao de B der false a instruo no tem efeito; se der true, tem o efeito de S seguido do efeito de while B do S, de novo. Informalmente, isto significa que se vai executando S enquanto a avaliao de B for dando true e pra-se logo que der false. Por disso, se B der false logo primeira, S no chega a executar-se nenhuma vez. Instruo composta A instruo composta, como as anteriores, constitui uma componente do objecto sintctico instruo. O seu diagrama sintctico o seguinte:
instruo composta begin instruo end

Figura 1.13

Em esquema, a forma da instruo composta begin S1; S2; ...; Sn end, onde S1, , Sn so instrues. O seu efeito o de S1, seguido do de S2, , seguido do de Sn. Do ponto de vista sintctico, a instruo composta agrupa as instrues componentes numa nica instruo de nvel superior, susceptvel de constituir um dos ramos de uma instruo if-then-else ou de ser controlada por uma instruo while, por exemplo.
S2,

Operadores aritmticos

Os operadores aritmticos so os do costume e dividem-se em duas subclasses: inteiros e reais. Segue-se a lista completa de cada uma destas subclasses. Primeiro, os operadores inteiros:
+ * div mod

adio subtraco multiplicao diviso inteira (quociente) diviso inteira (resto) adio subtraco multiplicao diviso

E agora os operadores reais:


+ * /

Os operadores +, - e * so inteiros se ambos os operandos forem inteiros, caso em que o resultado tambm inteiro. Se um dos operandos for inteiro e o outro real, ou se forem os dois reais, o operador real e o resultado real. Os operadores de diviso inteira, div e FCA - EDITORA DE INFORMTICA 35

Pascal Tcnicas de Programao

mod,

exigem sempre dois operandos inteiros. O operador de diviso exacta, /, d sempre um resultado real, mesmo que ambos os operandos sejam inteiros. Operadores booleanos O tipo boolean dispe dos trs operadores booleanos habituais:
not and or

negao conjuno disjuno

Existe pr-declarada uma funo booleana de varivel inteira que devolve true se o argumento for mpar e false se for par:
odd(x)

mpar: odd(x) equivalente expresso abs(x) mod 2 = 1 (x inteiro).

Uma outra funo pr-declarada, a funo ord, quando aplicada a uma expresso booleana devolve 0 se a expresso for falsa e 1 se for verdadeira:
ord(false) ord(true)

vale 0 vale 1

Operadores relacionais Os operadores relacionais de comparao so os seguintes:


= <> < <= >= >

igual diferente menor menor ou igual maior ou igual maior

Prioridade dos operadores

Os diversos operadores da linguagem Pascal agrupam-se em quatro classes de prioridade, assim: Negao (prioridade mais elevada) Operadores multiplicativos (segunda prioridade) Operadores aditivos (terceira prioridade) =, <>, <, <=, >=, > Operadores relacionais (prioridade mais baixa)
not *, /, div, mod, and +, -, or

36

FCA - EDITORA DE INFORMTICA