Você está na página 1de 78

Guia rpido de referncia da linguagem Pascal a e Verso Free Pascal a

Marcos Castilho Everaldo Gomes Loirto Alves dos Santos Eleandro Maschio Krynski Jos Ivan Gonalves Jnior e c u Rene Kultz Marcos Castilho

Verso 0.2 a Dezembro de 2009

Este texto est em construo. a ca A verso atual pode ser encontrada em: a http://www.inf.ufpr.br/cursos/ci055.

Sumrio a
1 Introduo ca 2 Breve histrico da linguagem o 3 O compilador Pascal 3.1 Obtendo o compilador . . . . . . . . 3.2 Editando um programa-fonte . . . . . 3.3 Compilando . . . . . . . . . . . . . . 3.4 Exemplo de interaao com a mquina c a 3.5 Erros de compilao . . . . . . . . . ca 3.5.1 Exerc cios . . . . . . . . . . . 6 7 8 8 9 9 10 11 11 12 12 13 13 14 14 15 19 20 20 20 22 22 24 24 25 26 26 27 28 28 29 30 31 34 34 35 36 37 39

. . . . . . . . . . . . . . . . . . . . . . . . para compilar . . . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4 Estrutura de um programa-fonte em Pascal 4.1 Cabealho (ou prembulo) . . . . . . . . . . . . . . . . c a 4.1.1 Seo de declaraao de rtulos . . . . . . . . . . ca c o 4.1.2 Seo de declaraao de constantes . . . . . . . . ca c 4.1.3 Seo de declaraao de tipos . . . . . . . . . . . ca c 4.1.4 Seo de declaraao de variveis globais . . . . . ca c a 4.1.5 Seo de declaraao de procedimentos e funes ca c co 4.2 Programa principal . . . . . . . . . . . . . . . . . . . . 5 Elementos bsicos a 5.1 S mbolos . . . . . . . . . . . . . . . . . . . 5.2 Palavras reservadas . . . . . . . . . . . . . 5.3 Comentrios . . . . . . . . . . . . . . . . . a 5.4 Identicadores . . . . . . . . . . . . . . . . 5.5 Tipos de dados em Pascal . . . . . . . . . 5.5.1 A fam de tipos ordinal . . . . . lia 5.5.2 Tipo enumervel . . . . . . . . . . a 5.5.3 Tipo sub-faixa . . . . . . . . . . . . 5.5.4 A fam de tipos real . . . . . . . lia 5.5.5 Tipo boolean (booleano) . . . . . . 5.5.6 Tipo char (caractere) . . . . . . . 5.5.7 Tipo string (cadeia de caracteres) 5.6 Tipo array (matriz) . . . . . . . . . . . . 5.7 Tipo record (registro) . . . . . . . . . . . 5.8 Tipo file (arquivo) . . . . . . . . . . . . 6 Expresses lgicas, aritmticas e o o e 6.1 Expresses aritmticas . . . . . o e 6.1.1 Exemplos . . . . . . . . 6.1.2 Ordem de precedncia . e 6.2 Expresses lgicas . . . . . . . . o o 6.2.1 Exemplos . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

6.2.2

Ordem de precedncia . . . . . . . . . . . . . . . . . . . . . . . 39 e 41 41 42 43 43 44 45 46 47 50 50 51 53 55 56 56 57 58 59 61 61 61 64 64 64 65 65 66 66 67 67 67 68 68 69 69 70 70 70 71 71

7 Comandos da linguagem Pascal 7.1 Comando de atribuiao . . . . . . . . . . . . . . . . . . . . . . . c 7.2 Comandos de entrada . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Comandos de sa da . . . . . . . . . . . . . . . . . . . . . . . . . 7.4 Comando de desvio incondicional (Goto) . . . . . . . . . . . . . 7.5 Comandos de desvio condicional . . . . . . . . . . . . . . . . . . 7.5.1 Desvio condicional simples (if-then) . . . . . . . . . . . 7.5.2 Desvio condicional completo (if-then-else) . . . . . . 7.5.3 Comando de desvio condicional por caso (case) . . . . . 7.6 Comandos de repetio . . . . . . . . . . . . . . . . . . . . . . . ca 7.6.1 Repetio condicional com teste no in (while-do) . . ca cio 7.6.2 Repetio condicional com teste no nal (repeat-until) ca 7.6.3 Repetio por enumeraao (for-do) . . . . . . . . . . . . ca c 7.7 Delimitadores de bloco . . . . . . . . . . . . . . . . . . . . . . . 8 Legibilidade do cdigo o 8.1 Espaos e linhas em branco so ignorados . . . . c a 8.2 No h distinao entre maisculas e minsculas a a c u u 8.3 Comentrios . . . . . . . . . . . . . . . . . . . . a 8.4 Identao ou alinhamento de cdigo por colunas ca o 8.5 Realce de sintaxe . . . . . . . . . . . . . . . . . 8.6 Simplicidade e clareza . . . . . . . . . . . . . . 8.7 Nomes dos identicadores . . . . . . . . . . . . A Funes e procedimentos co A.1 Abs . . . . . . . . . . . A.2 ArcTan . . . . . . . . . A.3 Break . . . . . . . . . A.4 Chr . . . . . . . . . . . A.5 Concat . . . . . . . . . A.6 Continue . . . . . . . . A.7 Copy . . . . . . . . . . A.8 Cos . . . . . . . . . . . A.9 Dec . . . . . . . . . . . A.10 Delete . . . . . . . . . A.11 Exp . . . . . . . . . . A.12 Frac . . . . . . . . . . A.13 Inc . . . . . . . . . . . A.14 Insert . . . . . . . . . A.15 Int . . . . . . . . . . . A.16 Length . . . . . . . . . A.17 Log . . . . . . . . . . . A.18 Lowercase . . . . . . .

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

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

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

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

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

predenidos no compilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

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

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

A.19 Odd . . . . A.20 Ord . . . . A.21 Pi . . . . . A.22 Pos . . . . . A.23 Power . . . A.24 Pred . . . . A.25 Random . . A.26 Randomize . A.27 Round . . . A.28 Sin . . . . . A.29 Sqr . . . . . A.30 Sqrt . . . . A.31 Succ . . . . A.32 Trunc . . . A.33 Upcase . . . A.34 Val . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

72 72 73 73 73 74 74 74 75 75 75 76 76 77 77 77

Introduo ca

Este texto um material complementar a disciplina CI055 - Algoritmos e Estrutue ` ras de Dados I, ministrada no curso de Bacharelado em Cincia da Computaao da e c Universidade Federal do Paran. a O presente documento foi concebido com a nalidade de servir como um guia rpido de referncia da linguagem Pascal, verso Free Pascal, destinado ao estudante a e a no in do curso. Portanto, no dispensa o acompanhamento de material didtico cio a a apropriado para o aprendizado de algoritmos. Denitivamente, este material no a constitui por si s um curso de programao em Pascal. o ca Desta forma, recomenda-se consulta a farta literatura que apresenta em profundi` dade aspectos semnticos dos elementos da linguagem aqui abordados. Os estudantes a so encorajados a ter por costume buscar outras fontes e conquistar autonomia para a enfrentar situaoes das mais diversas em programao de computadores. c ca O material didtico primrio do curso indicado na pgina ocial da disciplina1 e a a e a inclui notas de aula2 , bem como demais referncias bibliogrcas pertinentes. Algue a mas das principais referncias so: [Wir78], [VC07], [Car82],[Gui]. e a A documentaao completa da linguagem pode ser encontrada juntamente com c o compilador escolhido para este curso3 (Free Pascal ). Supe-se que os estudantes o tenham contato e estudem minimamente: Guia de referncia da linguagem: uma referncia para a linguagem Pascal tal e e e como implementada pelo citado compilador. Descreve as construoes permitidas c e lista os tipos de dados suportados. No um tutorial. a e Guia do programador: descreve as peculiaridades do compilador Free Pascal e prov uma viso de como o compilador gera o cdigo e de como o programador e a o pode modicar este cdigo. o Guia do usurio: descreve o processo de instalao e uso do compilador Free Pascal a ca nas diferentes plataformas suportadas. Guia das bibliotecas: descreve as bibliotecas auxiliares que no esto dispon a a veis na verso bsica do compilador. Serve para problemas que envolvem, por exema a plo, bibliotecas grcas, funoes matemticas complicadas, e uma srie de outras a c a e possibilidades. Aprenda Pascal : tutorial bastante didtico, com exemplos e escrito em ingls de a e 4 fcil compreenso . Altamente recomendado. a a O manual presente foi idealizado como um guia rpido, em portugus, para o matea e rial citado. A pgina ocial da disciplina, anteriormente mencionada, detm contatos a e atualizados para a noticaao de poss c veis erros, assim como para o recebimento de cr ticas e sugestes acerca deste guia. o
1 2

http://www.inf.ufpr.br/cursos/ci055 http://www.inf.ufpr.br/cursos/ci055/apostila.pdf 3 http://www.freepascal.org 4 http://www.taoyue.com/tutorials/pascal/contents.html

Breve histrico da linguagem o

A linguagem Pascal foi desenvolvida em 1968 pelo professor Niklaus Wirth, do Instituto de informtica da ETH (Eidgenssische Technische Hochschule), em Zurique, a o Suca. Sua denominaao uma homenagem a Blaise Pascal (1623-1662), matemtico c e a e lsofo francs que inventou a primeira calculadora mecnica. Foi baseada em alo e a gumas linguagens estruturadas existentes at ento, como o ALGOL e PL/I. e a O desejo de Wirth era dispor, para o ensino de programaao, de uma nova linc guagem que fosse simples, coerente e capaz de incentivar a confecao de programas c claros e facilmente leg veis, favorecendo a utilizaao de boas tcnicas de programaao. c e c Alm disso, a linguagem deveria ser de fcil implementaao, ou seja, os compiladores e a c precisariam ser compactos, ecientes e econmicos [FBF+ 86]. o O Pascal somente ganhou popularidade quando foi adotado pela Universidade da Califrnia (San Diego) em 1973. No mesmo per o odo, em seus cursos, tambm foram e feitas implementaoes de compiladores para mini e microcomputadores [Rin92]. c Na dcada de 80, comeou a ser utilizada para propsitos comerciais com o lanamento e c o c do Turbo Pascal pela empresa americana Borland International. Posteriormente, a linguagem foi sucedida pela linguagem Object Pascal, utilizadas nas IDEs Borland Delphi, Kylix e Lazarus. Atualmente, a linguagem Pascal foi padronizada pela ISO nos padres Standard Pascal e Advanced Pascal. o Embora no tenha sido a primeira linguagem a incorporar os conceitos de Proa gramaao Estruturada, o Pascal considerado um marco na evoluo das linguagens c e ca de programaao, devido a vrias inovaes introduzidas na poca, tais como a criao c a co e ca de novos tipos, a estruturaao de dados, a alocaao dinmica de variveis com o c c a a aux de ponteiros, a declaraao de identicadores para constantes, a utilizao de lio c ca procedimentos que lem e escrevem campos individuais em vez de registros completos, e o uso de funoes e procedimentos recursivos, entre outras. c

O compilador Pascal

Cdigo-fonte um conjunto de palavras ou s o e mbolos escritos de maneira ordenada, contendo instruoes em uma linguagem de programaao conhecida. Normalmente, o c c cdigo-fonte escrito em uma linguagem de alto-n o e vel, ou seja, com grande capacidade de abstrao. O compilador um programa que traduz um cdigo-fonte escrito em ca e o uma linguagem de alto-n em um programa de baixo-n vel vel, ou seja, um programa que seja formado por um conjunto de instruoes a serem realizadas pelo processador. c O processo de compilaao ocorre em duas etapas: c Anlise sinttica de um cdigo fonte, segundo as regras gramaticais da linguagem a a o escolhida; Geraao do programa executvel semanticamente equivalente. c a Este guia abrange a primeira parte, isto , contm material que explica como e e escrever programas sintaticamente corretos. A gerao do cdigo-executvel, por sua ca o a vez, dependente de plataforma e de sistema operacional e foge do propsito deste e o documento. Existem vrios compiladores dispon a veis para a linguagem Pascal. Alguns deles so sens a veis ` plataforma. No contexto deste manual e da disciplina correlata, foi a adotado o compilador Free Pascal por, basicamente, por dois motivos: E software livre; E fornecido para diversas plataformas, incluindo o Linux. E absolutamente fundamental que os leitores deste material consultem o guia de referncia da linguagem Pascal para o compilador Free Pascal, a m de obter uma e completa explicaao de todas as regras para esta verso da linguagem. Este guia foi c a criado com o intuito de ser uma primeira referncia a esta linguagem. e Quando forem apresentados exemplos de programas sendo compilados, sero feitos a para a verso em Linux. a Conforme antedito, h muito material sobre outros compiladores para a linguagem. a O leitor encorajado a no se limitar ao corrente guia. e a

3.1

Obtendo o compilador

O compilador pode ser instalado a partir dos pacotes dispon veis na pgina do projeto a 5 Free Pascal , bastando que seja escolhido o pacote correspondente ao seu hardware e sistema operacional. Nos laboratrios do Departamento de Informtica da Universidade Federal do o a Paran, usa-se o Debian GNU/Linux. Para instalar o compilador neste ambiente, a basta executar, como root, o seguinte comando: $ apt-get install fp-compiler
5

http://www.freepascal.org

Caso queira, o usurio pode instalar todo o ambiente de desenvolvimento disa pon em uma fam de pacotes, incluindo a documentaao, atravs do seguinte vel lia c e comando: $ apt-get install fp-docs fpc lazarus O Lazarus um ambiente de desenvolvimento e pode ser usado alternativamente e ao editor de texto. Todavia, este material escrito para aqueles que usam editores de e texto e shell.

3.2

Editando um programa-fonte

Para se gerar um programa-fonte deve-se usar um editor de texto simples. No Linux, existem vrios editores, tais como o vi, o emacs, o gedit e o joe. Ainda h a opao a a c de usar outro editor ASCII de sua preferncia, incluindo o dispon e vel no ambiente Lazarus. No Windows, escolha um editor como o Notepad (Bloco de Notas), ou algum fornecido por um ambiente de desenvolvimento em Pascal, como o editor do Turbo Pascal. Em nenhuma hiptese utilize editores das suites de escritrio, pois estes inserem o o caracteres no-ASCII que o compilador no conhece. Alm disso, os compiladores a a e geralmente no sabem lidar com acentuaao, negrito, itlico, entre outras formataes. a c a co Ento, aceite o fato, escreva em ASCII puro. a

3.3

Compilando

Para se compilar um programa-fonte em Pascal usando o Free Pascal no Linux, basta abrir um shell e executar o programa fpc. Suponha que o seu arquivo-fonte tenha o nome alomamae e contenha o seguinte texto:
program alomamae ; begin writeln ( Alo mamae ! ) ; end .

Este cdigo-fonte, aps compilado e executado, produzir na tela a mensagem o o a Alo mamae!. Para compilar, abra um shell e digite: $ fpc alomamae.pas Este comando produziu em seu diretrio de trabalho um arquivo binrio de nome o a alomamae. Para execut-lo, faa o seguinte: a c $ ./alomamae e aparecer na tela a mensagem de sa do programa. a da Na seqncia deste material, ser explicado como construir programas-fontes sinttica ue a a e semanticamente corretos, que podem ser compilados sem gerarem erros de compilaao. c 9

3.4

Exemplo de interao com a mquina para compilar ca a

A seguir, apresenta-se uma sesso de trabalho em que se compila o programa alomamae.pas. a $> ls -l -rw-r--r-- 1 marcos c3sl 60 Ago 4 11:18 alomamae.pas

Este comando mostra que no diretrio de trabalho existe um arquivo de nome o alomamae.pas que foi criado as 11h18min do dia 4 de agosto de 2009. Este arquivo ` de propriedade do usurio marcos, que pertence ao grupo c3sl. O arquivo pode e a ser lido por qualquer usurio, mas pode ser alterado apenas pelo dono. Como ultima a informaao, ele ocupa 60 bytes de disco. c $> fpc alomamae.pas Free Pascal Compiler version 2.2.2-8 [2008/12/20] for i386 Copyright (c) 1993-2008 by Florian Klaempfl Target OS: Linux for i386 Compiling alomamae.pas Linking alomamae 6 lines compiled, 0.2 sec O comando acima invocou o compilador, que imprimiu algumas mensagens de verso e autoria, fundamentalmente informando que compilou as 6 linhas do programa a em 0.2 segundos. $> ls -l -rwxr-xr-x 1 marcos c3sl 114400 Ago -rw-r--r-- 1 marcos c3sl 1832 Ago -rw-r--r-- 1 marcos c3sl 60 Ago 4 11:28 alomamae 4 11:28 alomamae.o 4 11:18 alomamae.pas

O comando acima mostra que, as 11h28 minutos do dia 4 de agosto de 2009, foram ` criados, pelo compilador, dois arquivos novos: alomamae e alomamae.o. O primeiro um arquivo executvel ocupando 114.400 bytes em disco, o segundo um arquivo e a e temporrio utilizado pelo compilador durante o processo de geraao de cdigo. O a c o leitor deste material no deve se preocupar com este arquivo no momento. a $> ./alomamae Alo mamae! $> Finalmente, foi executado o programa e vemos a sa conforme esperado. Tentar da, executar o arquivo-fonte produziria o seguinte erro: $> ./alomamae.pas bash: ./alomamae.pas: Permiss~o negada a $> Isto ocorre porque o cdigo-fonte no , como explicado, um arquivo executvel, o a e a ele apenas contm as instruoes que servem para que o compilador gere o programa e c de fato. 10

3.5

Erros de compilao ca

Caso o programa-fonte no respeite as regras gramaticais da linguagem (aqui, Pascal ), a o compilador produz mensagens de erro correspondentes. Observe o que ocorre se, por exemplo, fosse omitido o ; ao nal da primeira linha: $> cat alomamae.pas program alomamae

begin writeln (Alo mamae!); end. $> fpc alomamae.pas Free Pascal Compiler version 2.2.2-8 [2008/12/20] for i386 Copyright (c) 1993-2008 by Florian Klaempfl Target OS: Linux for i386 Compiling alomamae.pas alomamae.pas(3,1) Fatal: Syntax error, ";" expected but "BEGIN" found Fatal: Compilation aborted Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a sou Durante o processo de compilaao, aps ler a palavra reservada program e o c o identicador alomamae, o compilador esperava encontrar o s mbolo ;. Ao invs e disso, encontrou na linha 3, coluna 1, o s mbolo begin. Como resultado deste erro, no foi gerado o programa executvel. a a Na verdade, o compilador incapaz de dizer, com absoluto acerto, o local exato e onde ocorreu o erro. Neste caso, sabe-se que faltou um ponto-e-v rgula no nal da linha 1. 3.5.1 Exerc cios

Sugere-se que o leitor produza erros de sintaxe na sua cpia deste programa-fonte o e que explore o compilador para comear a compreender as mensagens de erro e a c procurar corrigi-los. Experimente, por exemplo, as seguintes alteraoes: c escreva program errado, por exemplo, pogram; escreva writeln errado, por exemplo, writenl; apague o ponto nal aps o end na ultima linha; o esquea de abrir ou de fechar as aspas da mensagem; c esquea de abrir ou de fechar os parnteses; c e escreva alomame com til na linha 1. a Faa uma alteraao por vez e observe quais mensagens de erro sero retornadas c c a pelo compilador. 11

Estrutura de um programa-fonte em Pascal

O cdigo-fonte de um programa em Pascal deve ser estruturado de maneira que reso peite a gramtica formalizada para esta linguagem. Com isto, o compilador pode a transformar o programa-fonte em um cdigo-executvel. o a Um programa em Pascal consiste de dois blocos: o cabealho e o programa princ cipal. A gura abaixo ilustra a estrutura bsica de um programa. Os textos que a aparecem entre os s mbolos < e > no so parte do programa, mas estruturas a a que sero detalhadas mais a frente neste documento. Igualmente, os textos que aparea ` cem entre os s mbolos (* e *) constituem comentrios no cdigo e so explicados a o a na seao 5.3. c
( i n i c i o do c a b e c a l h o ) program <nome do programa >; ( d e c l a r a c a o dos r o t u l o s ) ( d e c l a r a c a o das c o n s t a n t e s ) ( d e c l a r a c a o dos t i p o s ) ( d e c l a r a c a o das v a r i a v e i s ) ( d e c l a r a c a o dos p r o c e d i m e n t o s e f u n c o e s ) ( termino do c a b e c a l h o ) ( i n i c i o do programa p r i n c i p a l ) begin <comandos> end . ( termino do programa p r i n c i p a l )

O programa propriamente dito, conhecido como programa principal o texto que e aparece entre as palavras reservadas (ver seo 5.2) begin e end. O programa termina ca com um ponto nal6 . O cabealho tudo o que aparece a partir da palavra reservada program at o que c e e vai imediatamente antes do begin do programa principal. O cabealho no constitui c a cdigo executvel, mas contm informaoes necessrias para o processo de compilao, o a e c a ca bem como cdigos para subprogramas (ver seo 4.1.5) que podem ser ativados por o ca algum comando no programa principal. Cada tpico ser explicado no decorrer desta seao. o a c

4.1

Cabealho (ou prembulo) c a

Todo programa em Pascal comea com a palavra reservada program (ver seo 5.2) c ca seguida de um identicador (ver seao 5.4) que o nome do programa e um s c e mbolo
6

Nas ilustraes deste texto, as palavras reservadas aparecem em negrito co

12

de ponto-e-v rgula (;). No cabealho tambm deve-se especicar, se necessrio: c e a 1. Os rtulos para comandos de desvio incondicional, se algum tiver sido usado; o 2. As constantes, se alguma foi usada no programa; 3. Os tipos denidos pelo usurio, se algum foi necessrio; a a 4. As variveis globais usadas no programa; a 5. Os cdigos dos subprogramas eventualmente usados pelo programa. o As declaraes devem ser inseridas nesta ordem, embora no seja obrigatrio que co a o se usem todas estas declaraoes. A seguir, ser explicada como a sintaxe de cada c a e uma. 4.1.1 Seo de declarao de rtulos ca ca o

Um rtulo (label ) um nome para uma localizaao no cdigo-fonte para o qual o uxo o e c o de execuao do programa pode ser direcionado de outra localizao pelo uso de um c ca comando goto. Os rtulos podem ser seqncia de d o ue gitos ou identicadores. Logo, os rtulos so apenas necessrios quando se usa um ou mais comandos de o a a desvio incondicional (goto, ver seo 7.4). ca Exemplo:
l a b e l a l o , 1 0 0 , FIM ;

4.1.2

Seo de declarao de constantes ca ca

Constantes so uteis quando o programador precisa se referir a informaoes que no a c a se alteram durante o programa, ou seja, so estticas. Contrastam, portanto, com as a a variveis, que permitem reatribuio de valores. a ca A declarao feita atravs da palavra reservada const. Nesta seo do programa, ca e e ca cada constante nova declarada por um nome de identicador, ainda no utilizado, e a seguido do s mbolo igual (=) e sucedida pela constante numrica ou alfanumrica e e desejada, sempre terminando com um ponto-e-v rgula (;). Usualmente, os nomes de constantes so escritos em letras maisculas para cona u trastarem com os nomes de variveis. a Exemplo:
const PI = 3 . 1 4 1 5 9 ; MEU CPF = 000.123.456 -78 ; ERRO MSG = Erro na execucao do programa . ; QUATRO = 4 ;

13

MENOS QUATRO = q u a t r o ; MAX = 1 0 0 0 0 0 0 0 ;

4.1.3

Seo de declarao de tipos ca ca

Em Pascal, toda varivel (ver seao 4.1.4) possui um tipo. Isto relacionado com a c e a maneira como o computador vai interpretar a seqncia de bits no endereo de ue c memria acessado. o Na linguagem Pascal existem alguns tipos pr-denidos (ver seao 5.5). Aqui, e c contudo, o programador pode declarar seus prprios tipos de dados. Assim, um o identicador pode ser usado para denotar este novo tipo ao se declarar variveis no a cdigo-fonte. o A declarao feita tendo como in ca e cio a palavra reservada type. Segue ento a uma lista contendo um novo identicador, um s mbolo de igual (=) e a deniao do c novo tipo baseada em tipos pr-existentes. Finalmente um s e mbolo de ponto-e-v rgula (;). Abaixo h alguns exemplos de como se declarar novos tipos. a Exemplo:
type diaMes = integer ; tipoSaldo = real ; l e t r a m i n u s c u l a = a . . z ; nomes = array [ 1 . .MAX] of l e t r a m i n u s c u l a ;

4.1.4

Seo de declarao de variveis globais ca ca a

Em Pascal, toda varivel global (ver seo 4.1.4) deve ser declarada. Assim, o coma ca pilador passa a conhecer aquele nome e tambm reserva espao de memria para o e c o contedo da varivel. Adicionalmente, a declarao propicia que o compilador possa u a ca interpretar corretamente o mapeamento entre o formato binrio da mquina, corresa a pondente ao espao de memria alocado, e a maneira como estes bits sero manipuc o a lados em operaes, comandos de leitura ou de impresso. co a Variveis so declaradas atravs da palavra reservada var. Nesta seao do proa a e c grama, cada nova varivel (ou lista de variveis separadas por v a a rgula) declarada e por um novo nome de identicador seguido do s mbolo de dois pontos (:) e sucedido pelo nome do tipo da varivel, seja um tipo pr-denido pelo compilador ou um novo a e tipo denido pelo programador (conforme explicado na seao 4.1.3). Como sempre, c todo comando em Pascal deve ser terminado por um ponto-e-v rgula (;). A diferena entre variveis globais ou locais ser caracterizada na seao 4.1.5. c a a c Exemplos:
var i , j , k , i d a d e : integer ; b : byte ;

14

r a i z , x , y , z , media : r e a l ; l e t r a : char ; nome : string ; saldo : tiposaldo ;

4.1.5

Seo de declarao de procedimentos e funoes ca ca c

Procedimentos e funes so formas de escrever subprogramas na linguagem Pascal. co a Estes cdigos s so executados quando ativados no programa principal. o o a Assim feita a declarao de um procedimento: e ca
procedure <i d e n t i f i c a d o r > ( < l i s t a de parametros> ) ; ( c a b e c a l h o do p r o c e d i m e n t o ) begin ( corpo do p r o c e d i m e n t o ) end ;

Uma funao, por sua vez, declarada desta forma: c e


function <i d e n t i f i c a d o r > ( < l i s t a de parametros> ) : <t i p o >; ( c a b e c a l h o da f u n c a o ) begin ( corpo da f u n c a o ) end ;

As palavras procedure e function so reservadas. O corpo de um procedimento a ou de uma funao constitu por comandos da mesma maneira que o programa c e do principal (ver seao 4.2), com a diferena de que, nos subprogramas, os comandos c c s so executados quando o procedimento ou a funo tiverem sido invocados no o a ca programa principal. O cabealho de um procedimento ou de uma funao constitu da mesma mac c e do neira que o cabealho do programa principal. Isto , permite a declaraao de consc e c tantes, de variveis ou de tipos. A diferena reside no fato de que, tais elementos, a c possuem abrangncia (escopo) local e no esto acess e a a veis a outros subprogramas ou ao programa principal. Uma varivel declarada em um subprograma existe somente durante a execuao a c deste. Pode, inclusive, ter o mesmo nome de um identicador previamente usado, seja em outro subprograma, seja at no programa principal. e A lista de parmetros uma seqncia (que pode ser vazia) de nomes de identia e ue cadores, separados por v rgula, com seus respectivos tipos precedidos por dois-pontos (:). Para cada novo tipo, deve-se usar o separador ponto-e-v rgula. Os parmetros a so argumentos repassados ao procedimento ou a funo em foco. a ` ca O retorno, caracter stica espec ca de funoes, tem o respectivo tipo denido aps a c o lista de parmetros, precedido por dois pontos (:). O valor de retorno especicado a e atravs de uma atribuio ao identicador da funo, como se este fosse uma varivel e ca ca a do tipo denido como retorno. 15

O compilador no aceita tipos estruturados como parmetro ou como retorno de a a subprogramas, a menos que estes tenham sido previamente denidos pelo programador na seao de declaraao de tipos. c c A linha que contm o cabealho do procedimento ou funo dene a assinatura ou e c ca prottipo do subprograma, isto , estabelece o nome, os parmetros com respectivos o e a tipos e, no caso das funoes, o tipo de retorno. c Os parmetros podem ser passados de duas maneiras, tanto para procedimentos a quanto para funoes: por valor ou por referncia. Na assinatura do subprograma, a c e diferena que os parmetros passados por referncia levam a palavra var antes da c e a e lista de parmetros. a Os parmetros passados por valor recebem uma cpia dos valores das variveis a o a usadas como argumento na chamada do subprograma. Os parmetros passados por a referncia remetem, na verdade, a prpria varivel; que sofrer todas as alteraoes e ` o a a c realizadas. Os subprogramas so invocados ou no programa principal ou por outro subproa grama da seguinte maneira: Os procedimentos so invocados pelo seu nome e lista de argumentos, da mesma a maneira como se invocaria um comando qualquer da linguagem, garantindo-se o nmero de parmetros da assinatura do subprograma e os respectivos tipos; u a As funoes so invocadas tambm por seu nome e lista de argumentos, contudo c a e a invocao deve ser feita onde se espere um valor do mesmo tipo que o retorno ca da funao vir a fornecer. Assim, se determinada funao retornar um valor real, c a c pode-se invoc-la em qualquer lugar onde se admita um valor real. a E importante observar que o compilador faz a checagem do nmero de parmetros e u a respectivos tipos da lista de argumentos do cabealho do subprograma com os mesmos c itens da ativaao deste. Caso o nmero de argumento, a ordem, ou os tipos no c u a compatibilizem, o compilador acusa erro. Exemplos: Neste primeiro exemplo, o procedimento aloMamae ativado pelo programa prine cipal.
program umProcedimento ; procedure aloMamae ; begin writeln ; writeln ( Alo Mamae !!! ) ; writeln ; end ; begin aloMamae ; end .

Aqui, faz-se a chamada do procedimento perfil. So passados como parmetro o a a nome, a idade e o peso do indiv duo. Embora, as variveis globais sejam denominadas a 16

n, i e p, elas poderiam perfeitamente se chamarem nome, idade e peso, visto que as variveis do procedimento perfil tm escopo local. a e
program o u t r o P r o c e d i m e n t o ; procedure p e r f i l ( nome : string ; i d a d e : integer ; p e s o : r e a l ) ; begin writeln ( Nome: , nome ) ; writeln ( Idade : , i d a d e ) ; writeln ( Peso: , p e s o ) ; end ; var n : string ; i : integer ; p : real ; begin n := Blaise Pascal ; i := 3 9 ; p := 7 0 . 5 ; p e r f i l (n , i , p) ; end .

Este terceiro exemplo apresenta um procedimento em que alguns parmetros so a a agrupados por tipo no cabealho. c
procedure v a r i o s T i p o s ( a , b : integer ; c : r e a l ; d : integer ) ; begin writeln ( Inteiros : , a , e , b ) ; writeln ( Real: , c ) ; writeln ( Novamente inteiro : , d ) ; end ;

Neste quarto exemplo mostrado como se faz a passagem de parmetro por ree a ferncia em um procedimento. Para funoes, a sintaxe tambm vlida. e c e e a
program p o r R e f e r e n c i a ; procedure d u p l i c a ( var n : integer ) ; begin n := 2 n ; end ; var numero : integer ; begin numero := 1 0 ; d u p l i c a ( numero ) ; writeln ( numero ) ; end .

Exemplo que expe um procedimento recursivo que conta de um inteiro n at zero. o e


procedure contaAteZero ( n : integer ) ; begin

17

i f ( n >= 0 ) then begin writeln ( n ) ; contaAteZero ( n 1 ) ; end ; end ;

Aqui, apresenta-se um exemplo em que se utiliza um tipo estruturado, predenido, como parmetro. a
program t i p o E s t r u t u r a d o ; type v e t o r 1 0 i n t = array [ 1 . . 1 0 ] of integer ; procedure e x i b e V e t o r ( v : v e t o r 1 0 i n t ) ; var i : integer begin writeln ; writeln ( Vetor digitado : ) ; f o r i := 1 to 10 do writeln ( v [ i ] ) ; end ; var i : integer ; vetor : vetor10int ; begin f o r i := 1 to 10 do begin writeln ( Digite um valor para a posicao , i , : ) ; readln ( v e t o r [ i ] ) ; end ; exibeVetor ( vetor ) ; end .

Neste outro exemplo, evidencia-se a chamada, a passagem de parmetro e o retorno a de uma funao que recebe duas notas inteiras e devolve a mdia anual (um valor real) c e de um aluno.
program calculoDaMedia ; function media ( nota1 , nota2 : integer ) : r e a l ; begin media := ( nota1 + nota2 ) / 2 ; end ; var a , b : integer ; begin writeln ( Digite a media do primeiro semestre : ) ; readln ( a ) ; writeln ( Digite a media do segundo semestre : ) ; readln ( b ) ;

18

writeln ( Media anual : , media ( a , b ) ) ; end .

Por m, este exemplo apresenta o uso uma funo recursiva que retorna o n-zimo ca e elemento da srie de Fibonacci. e
function f i b o n a c c i ( n : integer ) : integer ; begin i f ( n < 3 ) then f i b o n a c c i := 1 else f i b o n a c i := f i b o n a c c i ( n1) + f i b o n a c c i ( n2) ; end ;

4.2

Programa principal

O trecho demarcado como programa principal onde, efetivamente, escrito o proe e grama na linguagem Pascal. Qualquer subprograma (procedimento ou funo, traca tados na seao 4.1.5) s executado quando chamado primariamente a partir do c o e programa principal. O programa principal constitu de comandos seqenciais (ver seao 7) que so e do u c a executados iniciando da instruao begin at que seja encontrada a instruao end e o c e c ponto nal do programa. A execuao dos comandos contidos no programa principal feita de cima para c e baixo e da esquerda para a direita, ignorando-se os espaos em branco e as linhas c vazias. Este comportamento s se altera quando utilizados comandos que manipulem o o uxo natural de execuao do programa, conforme explicado na seao 7. c c O prxima cap o tulo contm mais instruoes sobre os elementos bsicos da linguae c a gem Pascal.

19

Elementos bsicos a

Neste cap tulo, discutem-se os elementos bsicos que compem a linguagem Pascal. a o Em primeiro lugar, so apresentados os s a mbolos e as palavras reservadas usados na construao de um cdigo-fonte (seoes 5.1 e 5.2, respectivamente). Na seao 5.3, so c o c c a discutidas as alternativas para a inserao de comentrios no cdigo-fonte. A seo 5.4 c a o ca trata da criao de identicadores vlidos para a linguagem Pascal. ca a A partir da seo 5.5, so apresentados os tipos de dados utilizados em Pascal. ca a So elencados desde os tipos bsicos, como o inteiro e o caractere, at aqueles mais a a e complexos, como os que so voltados a construo de estruturas de dados. a ` ca

5.1

S mbolos

E poss vel inserir quaisquer s mbolos num arquivo-fonte em Pascal. O compilador dar um signicado adequado, a cada s a mbolo presente no cdigo. o Os s mbolos seguintes tm signicados especiais, por se tratarem de operadores ou e indicadores de que determinada parte do cdigo no se trata de uma instruao: o a c e/ou s mbolos que podem indicar ao compilador que aquela parte do cdigo onde o se encontram no uma instruao: a e c + * / = < > [ ] . , ( ) : ^ @ { } $ # Os s mbolos abaixo seguem a mesma regra, mas so sempre usados em par (note a que <=, sem espao, diferente de < =); c e <= >= := += -= *= /= (* *) (. .) // Dentro de uma string,tais s mbolos fazem parte da palavra e no sero interprea a tados pelo compilador de outra forma.

5.2

Palavras reservadas

Palavras reservadas so componentes da prpria linguagem Pascal e no podem ser a o a redenidas, ou seja, denominar elementos criados pelo programador. Por exemplo, begin, palavra reservada que indica o in cio de um bloco de cdigo, no pode ser o a nome rtulos, constantes, tipos ou quaisquer outros identicadores no programa. o O compilador Pascal no faz distinao entre maisculas e minsculas. Assim, a c u u tanto identicadores quando palavras reservadas podem ser grafados com variaes co de maisculas e minsculas sem alteraao de signicado: begin, BEGIN, Begin ou u u c BeGiN. Conforme o guia de referncia da linguagem Free Pascal, verso de dezembro e a de 2008, as palavras reservadas so divididas em trs grupos. O primeiro contm a e e 7 as palavras reservadas para a verso do Turbo Pascal . O segundo compreende as a palavras reservadas do Delphi, e o ultimo encerra as do Free Pascal.
7

http://pt.wikipedia.org/wiki/Turbo_Pascal

20

Esta diferena existe porque no Turbo Pascal as palavras do Delphi no so reserc a a vadas. A tabela abaixo apresenta uma lista das palavras reservadas reconhecidas pelo compilador Turbo Pascal : absolute else nil set and end not shl array le object shr asm for of string begin function on then break goto operator to case if or type const implementation packed unit constructor in procedure until continue inherited program uses destructor inline record var div interface reintroduce while do label repeat with downto mod self xor Tabela 1: Palavras reservadas do Turbo Pascal So palavras reservadas do Delphi : a as class except exports nalization nally initialization is library on out property raise threadvar try Tabela 2: Palavras reservadas do Free Pascal O compilador Free Pascal suporta todas as palavras reservadas descritas acima e mais as seguintes: dispose exit false true new

Tabela 3: Palavras reservadas do Delphi

Ateno: as palavras reservadas variam conforme o compilador utilizado. Portanto, ca indispensvel consultar o guia de referncia para a verso do compilador que tenha e a e a em mos. a 21

5.3

Comentrios a

Os comentrios so colocados no arquivo-fonte para ajudar a entender o que determia a nado bloco de cdigo faz. Comentrios no so interpretados pelo compilador. o a a a O Free Pascal suporta trs tipos de comentrios. Dois destes j eram utilizados e a a por compiladores Pascal antigos; um terceiro vem da linguagem C). A seguir, uma lista de comentrios vlidos: a a
( E i s um c o m e n t a r i o . E l e pode t e r mais de uma l i n h a ) { Um o u t r o c o m e n t a r i o . Tambem pode t e r mais de uma l i n h a } // Um c o m e n t a r i o que compreende apenas a t e o f i n a l da l i n h a

Voc pode colocar comentrios dentro de comentrios, com a condiao de que os e a a c tipos de comentrios sejam diferentes. Exemplos: a
( I s t o eh um c o m e n t a r i o . E l e pode t e r mais de uma l i n h a { Aqui e s t a o u t r o c o m e n t a r i o d e n t r o do p r i m e i r o I s s o eh t o t a l m e n t e v a l i d o // E s t e eh um t e r c e i r o c o m e n t a r i o . Tambem v a l i d o . } ) // I s t o eh um c o m e n t a r i o . ( E s t e eh o u t r o c o m e n t a r i o Porem eh um c o m e n t a r i o i n v a l i d o , p e l o e x c e s s o de l i n h a s ) { Primeiro c o m e n t a r i o { Segundo c o m e n t a r i o O primeiro comentario sera fechado a s e g u i r } E a chave a s e g u i r e s t a sobrando }

5.4

Identicadores

Identicadores so utilizados para denominar programas, rtulos, constantes, variveis, a o a tipos, procedimentos, funes e units criados pelo programador. co So regras, em Pascal para se constituir corretamente um identicador: a 1. Um identicador no pode ser igual a uma palavra reservada; a 2. Um identicador deve ter no mximo 255 caracteres; a 3. Os s mbolos que constituem um identicador podem ser: 22

letras: A at Z ou a at z; e e d gitos: 0 at 9; e um sublinhado: . 4. O primeiro s mbolo deve ser uma letra ou o sublinhado. Assim, no so aceitos espaos ou caracteres especiais em qualquer parte de um a a c identicador. At mesmo o cedilha () considerado um caractere especial. e c e So exemplos de identicadores vlidos: a a a, a1, b568, codigo, raizquadrada, preco especial; veiculo, elemento do conjunto, raiz quadrada, b54 ; CorVeiculo, Ano, MES, SaLdO, Parcela Quitada; Este nome eh muito longo e raramente deve ser usado mas eh valido. Exemplos de identicadores invlidos: a 12porcento, 4por4: iniciam por nmero; u cor veiculo: contm espao em branco; e c preo: possui um caracter invlido (cedilha); c a pssaro: apresenta acentuaao; a c a %b54 : no inicia por letra ou por sublinhado. Observaoes: c No se pode declarar uma varivel com o mesmo nome que foi atribu ao a a do programa ou a qualquer outro identicador previamente declarado no mesmo escopo8 ; Como o compilador Pascal ignora o estado de maisculas e minsculas, os idenu u ticadores podem ser grafados de maneiras diferentes e ter o mesmo signicado, como por exemplo: saldo, SALDO, Saldo ou SaLdO.
8

Para informaes sobre escopo, veja a seo 4.1.5) co ca

23

5.5

Tipos de dados em Pascal

A linguagem Pascal , por deniao, uma linguagem fortemente tipada. Ser tipada e c signica que as variveis e constantes possuem um tipo precisamente denido, isto , a e o compilador deve conhecer detalhes de quantidade de bytes para seu armazenamento e o formato de converso decimal/binrio. a a J, uma linguagem dita fortemente tipada, com raras exceoes, no permite que a c a tipos sejam misturados. Tal ocorrncia provoca erro de compilao ou at mesmo e ca e durante a execuao do programa. c Na seao 4.1.3 mostrou-se que poss declarar novos tipos sob demanda do proc e vel gramador. Na presente seao, sero enumerados todos os tipos considerados bsicos c a a para o compilador Free Pascal. Convm lembrar que isto pode mudar de um come pilador para outro. Logo, procure sempre informaoes atualizadas para a verso do c a compilador que tem em uso. Os tipos que interessam para a disciplina introdutria de programaao so os o c a seguintes: a fam de tipos ordinal; lia a fam de tipos real; lia boolean (booleano); char (caractere); string (cadeia de caracteres); array (matriz); record (registro); file (arquivo). Contudo, importante observar que para n e veis avanados de programaao existem c c outros tipos pr-denidos na linguagem. Consultar o guia de referncia para maiores e e informaoes. c 5.5.1 A fam de tipos ordinal lia

Os tipos ordinais representam nmeros conhecidos em linguagem informal como sendo u os tipos inteiros. Segundo o guia de referncia da linguagem, em sua verso de dezembro de 2008, e a tem-se que, com exceao do int64, qword e dos tipos reais, todos os tipos bsicos so c a a do tipo ordinal. Conservam as seguintes caracter sticas: 1. So enumerveis e ordenados, ou seja, poss iniciar uma contagem de um a a e vel por um destes nmeros em uma ordem espec u ca. Esta propriedade implica que as operaes de incremento, decremento e ordem funcionam; co 24

2. Existem menores e maiores valores poss veis. A seguir relacionada uma lista com os tipos inteiros e respectivas faixas de e valores. O programador deve escolher o tipo mais conveniente a representao da ` ca varivel, pois a diferena bsica entre eles a quantidade de bytes usada em memria a c a e o e o fato de necessitar que nmeros negativos sejam representados. Para um estudante u de Cincia da Computaao, a diferena est na interpretaao do nmero em binrio, e c c a c u a se est em complemento de 2 ou em binrio puro. a a Tipo Faixa dos limites Tamanho em bytes byte 0 ..255 1 shortint -128 .. 127 1 smallint -32768 .. 32767 2 word 0 .. 65535 2 integer smallint ou longint 2 ou 4 cardinal longword 4 longint -2147483648 .. 2147483647 4 longword 0 .. 2147483647 4 int64 -9223372036854775808 .. 9223372036854775807 8 qword 0 .. 18446744073709551615 8 Tabela 4: Tipos ordinais em Pascal

Funes predenidas relacionadas: abs, chr, dec, inc, int, odd, ord, power, co pred, random, randomize, round, succ, trunc e val. Vide anexo A. 5.5.2 Tipo enumervel a

Os tipos enumerveis so denidos pelo programador. Possuem uma certa seqncia a a ue de poss veis valores ordinais que as variveis daquele tipo podero assumir. a a Exemplo:
program tipo enum ; type T i p o E s p o r t e s = ( Futebol , Basquete , V o l e i ) ; var Esporte1 , E s p o r t e 2 : T i p o E s p o r t e s ; begin E s p o r t e 1 := F u t e b o l ; E s p o r t e 2 := Basquete ; { Perceba que E s p o r t e 1 tem o v a l o r F u t e b o l , e nao F u t e b o l , p o i s nao s e t r a t a de um t i p o s t r i n g . } i f E s p o r t e 1 = F u t e b o l then writeln ( O primeiro esporte eh Futebol ) ; end .

25

5.5.3

Tipo sub-faixa

Os tipos sub-faixas possuem valores numa determinada escala (que pode ser constitu de nmeros ou letras. da u Exemplo:
program t i p o s u b f a i x a ; type T i p o u m a c i n c o = 1 . . 5 ; // Vai de 1 a t e 5 T i p o a a f = a . . f ; // Vai de a a t e f var Numero : T i p o u m a c i n c o ; Letra : T i p o a a f ; begin Numero := 3 ; // OK. Esta na f a i x a writeln ( Numero ) ; L e t r a := p ; // OK. Esta na f a i x a writeln ( L e t r a ) ; L e t r a := z ; // Esta f o r a da f a i x a e s t a b e l e c i d a . O c o m p i l a d o r m o s t r a r a um warning writeln ( L e t r a ) ; end .

5.5.4

A fam de tipos real lia

Os tipos reais compreendem aqueles representados internamente pelo computador e interpretados como sendo de ponto utuante9 . Assim como no caso dos ordinais, variam basicamente na quantidade de bytes usada para cada endereo de memria e na representaao de sinais, seja no expoente c o c ou na mantissa. Abaixo apresenta-se uma lista com os tipos reais e suas faixas de valores, conforme o guia de referncia em sua verso de dezembro de 2008. e a Tipo Faixa dos limites Tamanho em bytes real depende da plataforma 4 ou 8 single 1.5E-45 .. 3.4E38 4 double 5.0E-324 .. 1.7E308 8 extended 1.9E-4932 .. 1.1E4932 10 comp -2E64+1 .. 2E63-1 8 currency -922337203685477.5808 .. 922337203685477.5807 19-20 Tabela 5: Tipos reais em Pascal

Aqui reside uma das raras exceoes da checagem de tipo da linguagem, pois uma c varivel do tipo real pode receber a soma de um real com um inteiro. Neste caso, a
Apesar de estarmos no Brasil, em Pascal os nmeros em ponto utuante so escritos com um u a ponto, no com v a rgula.
9

26

antes da operao, o computador faz a converso do inteiro para um formato em ponto ca a utuante. Exemplo:
program t y p e r e a l ; var a , b , c : real ; d : integer ; begin a := 1 4 . 5 ; b := s q r t ( 1 0 ) ; // b eh i g u a l a r a i z de 10 d := 1 0 ; / d eh i n t e i r o c := a + d ; // c eh a soma de um r e a l com i n t e i r o writeln ( a= , a , b= , b , c= , c , d= , d ) ; writeln ; writeln ( a= , a : 0 : 2 ) ; // a j u s t a para duas c a s a s d e c i m a i s apos o ponto end .

Funes predenidas relacionadas: abs, arctan, cos, exp, frac, int, log, pi, co power, random, randomize, round, sin, sqr, sqrt, trunc e val. Vide anexo A. 5.5.5 Tipo boolean (booleano)

O boolean (booleano) um tipo lgico que assume apenas um entre dois poss e o veis valores: false ou true, que equivalem respectivamente a falso ou verdadeiro (0 ou 1). Sempre que um valor diferente de 0 for associado a uma varivel booleana, esta a ser verdadeira. a Exemplo:
program t y p e b o o l ; var a , b , c , d : boolean ; begin a := f a l s e ; b := true ; c := boolean ( 0 ) ; // v a l o r i g u a l a z e r o : f a l s e d := boolean ( 10) ; // v a l o r d i f e r e n t e de z e r o : true writeln ( Variaveis : a= , a , b= , b , c= , c , d= , d ) ; end .

As variveis ou constantes do tipo boolean so elementos fundamentais na dea a niao e entendimento de expresses booleanas, que sero apresentadas na seao 6.2. c o a c

27

5.5.6

Tipo char (caractere)

O tipo char (ou caractere) armazena apenas um caracter da tabela ASCII10 e ocupa exatamente um byte de memria. Na realidade, no o caractere que armazenado o a e e na memria, mas o cdigo ASCII correspondente. o o O cdigo ASCII do caractere A, por exemplo, 65. Ento, se for atribu A a o e a do uma varivel do tipo caractere, na verdade ser atribu o valor 65 para esta varivel. a a do a Pode-se atribuir diretamente o valor ASCII a uma varivel caractere inserindo-se o a sustenido na frente do nmero correspondente (por exemplo, a := #65). u Exemplo:
program t y p e c h a r ; var a , c , d : char ; b : integer ; begin a := A ; // armazena 65 na v a r i a v e l a , que e q u i v a l e a A b := ord ( A ) + 2 ; // obtem o c o d i g o ASCII de A ( 6 5 ) e a c r e s c e n t a 2 // o b s e r v e que b , que r e c e b e i s t o , eh um i n t e i r o c := c h r ( b ) ; // armazena em c o c a r a c t e r e c o r r e s p o n d e n t e ao // v a l o r 67 em ASCII d := #68; writeln ( Variaveis : a= , a , b= , b , c= , c , d= , d ) ; // r e t o r n a a=A b=67 c=C end .

Por se tratar de um tipo ordinal, o tipo char pode ser utilizado em comandos case (ver seao 7.5.3). c Funes predenidas relacionadas: chr, lowercase, ord e upcase. Vide anexo A. co 5.5.7 Tipo string (cadeia de caracteres)

O tipo string utilizado para armazenar palavras, isto , seqncias de s e e ue mbolos ASCII. Em Pascal, as palavras, assim como o tipo char, devem estar entre apstrofos o (aspas simples). Pode-se concatenar strings e caracteres usando o operador de adiao c (+). Exemplo:
program t y p e s t r ; var a , b , d : string ; c : char ; begin a := hello ; b := world ; c := ! ; d := a + b + c ;
10

http://pt.wikipedia.org/wiki/ASCII

28

writeln ( d ) ; end .

// h e l l o world !

Funes predenidas relacionadas: concat, copy, delete, insert, length, co lowercase, pos, upcase e val. Vide anexo A.

5.6

Tipo array (matriz)

Em sua forma elementar, o tipo array utilizado para armazenar, sob um mesmo e nome de varivel, uma quantidade xa de elementos do mesmo tipo. Por isto, o tipo a array tambm conhecido como um arranjo homogneo. Para formas de uso mais e e e complexas recomendamos a leitura do guia de referncia da linguagem Pascal. e A declaraao de uma varivel do tipo array feita assim: c a e
array [< l i s t a de t i p o s enumeraveis >] of <t i p o >

onde <tipo> qualquer tipo previamente denido pelo programador ou pr-denido e e pela linguagem, e <lista de tipos enumeraveis> uma lista de faixas de nmeros e u separadas por v rgula. Por restrio dos tipos enumerveis, os valores devem ser do tipo ordinal e conheca a cidos em tempo de compilaao. c Os casos mais comuns de matrizes so de uma e de duas dimenses, embora posa o sam ser declaradas com dimenses maiores. As de uma unica dimenso so costuo a a meiramente denominadas vetores, as de duas dimenses so chamadas de matrizes o a propriamente ditas. Exemplos:
program t i p o a r r a y 1 ; const MAX = 1 0 ; MIN=5; var // exemplos de v e t o r e s a l u n o s : array [ MIN . .MAX] of string ; n o t a s : array [ 1 . . 3 ] of integer ; dados : array [ 0 . .MAX1] of r e a l ; // exemplos de m a t r i z e s t a b e l a : array [ MIN . .MAX, 1 . . 1 0 ] of r e a l ; t a b u l e i r o : array [ 1 . . 3 , 1 . .MAX+1] of integer ; dados : array [ 0 . .MAX1,MIN . .MAX] of r e a l ; // exemplos de array de dimensao 3 cubo : array [ MIN . .MAX, 1 . . 1 0 , 0 . . 5 0 ] of r e a l ; end .

Para se acessar o contedo de um vetor deve-se usar o nome da varivel e um u a

29

indexador do tipo ordinal entre colchetes. Exemplos:


a l u n o s [ 2 ] : = Fulano de Tal ; notas [ 1 ] : = 95; read ( dados [ 9 ] ) ; tabela [1 ,5]:= 0.405; write ( t a b u l e i r o [ 2 , 1 ] ) ; read ( dados [ 0 , 0 ] ) ; cubo [ 1 , 2 , 3 ] : = PI 1;

Tentar acessar um ndice fora da faixa denida no tipo enumervel gera erro de a execuao no programa. c O compilador no aceita que se passe o tipo array como parmetro em funoes e a a c procedimentos, por isto normalmente o programador deve declarar um novo tipo para o array. Exemplo:
type v e t o r d e r e a i s = array [ 1 . . 1 0 ] of r e a l ; var v: vetor de reais ;

Vale ressaltar que o tipo string uma forma especial de array de caracteres e (char). Suponha uma palavra com 10 letras. Signica que esta string contm 10 e caracteres. Para acessar cada caractere separadamente, utilize: nome variavel[indice do caractere desejado]. Exemplo:
var s : string ; begin s := hello world ! ; writeln ( s [ 4 ] ) ; // r e s u l t a d o eh a segunda l e t r a L de h e l l o . end .

5.7

Tipo record (registro)

O tipo record usado para aglomerar sob um mesmo nome de varivel uma coleao e a c de outras variveis de tipos potencialmente diferentes. Por isto uma estrutura a e heterognea, contrariamente ao tipo array que homogneo. e e e A sintaxe para se usar uma varivel do tipo record a seguinte: a e

30

record <I d <I d ... <Id end ;

1> : 2> : ..... n> :

<t i p o 1 >; <t i p o 2 >; .......... <t i p o n >;

onde <Id i> um identicador e <tipo i> um tipo qualquer da linguagem ou e e previamente denido pelo programador. Exemplo:
program t i p o r e c o r d 1 ; var c l i e n t e = record nome : string ; i d a d e : integer ; cpf : longint ; s e x o : char ; e n d e r e c o : string ; s a l a r i o : real ; end ;

Normalmente boa pol e tica declarar um tipo para o record, como mostrado a e seguir: Exemplo:
program t i p o r e c o r d 1 ; type t i p o c l i e n t e = record nome : string ; i d a d e : integer ; cpf : longint ; s e x o : char ; e n d e r e c o : string ; s a l a r i o : real ; end ; var cliente : tipo cliente ;

5.8

Tipo file (arquivo)

O tipo file usado basicamente para armazenamento de dados em memria see o cundria. Contudo, poss tambm se utilizar deste tipo para gravaao na memria a e vel e c o principal. Desta forma, o tamanho que os arquivos podem ocupar dependem basicamente do espao livre em disco ou em RAM. c Um arquivo declarado da seguinte maneira: e 31

var F : f i l e of <t i p o >;

observando-se que <tipo> pode ser uma estrutura de qualquer tipo, exceto o prprio o tipo file. E poss no se informar o tipo do arquivo, o que resulta em um arquivo sem vel a tipo. Segundo o guia de referncia, isto equivalente a um arquivo de bytes. e e Para se usar uma varivel do tipo arquivo, alguns comandos so necessrios: a a a assign associa o nome da varivel (interno ao programa) a um nome de arquivo (em a disco, por exemplo). O nome do arquivo dependente do sistema operacional; e reset abre o arquivo para somente leitura; rewrite abre o arquivo para leitura e escrita; close fecha o arquivo; Segue um exemplo em que um arquivo de registros (record) usado para armae zenar uma agenda em disco.
type agenda = record nome : string ; rg , f o n e : l o n g i n t ; end ; var F : f i l e of agenda ; begin a s s i g n (F , ~/ dados / agenda .db ) ; reset (F) ; // comandos que manipulam a agenda c l o s e (F) ; end .

Um arquivo especial o do tipo text, que armazena dados que podem ser mae nipulados pelas bibliotecas padro de entrada e sa a da, inclusive as entradas default input (teclado) e output (tela). O cdigo a seguir mostra o uso de um arquivo do tipo text. o
var F : text ; i : integer ; begin a s s i g n (F , ~/ dados / entrada .txt ) ;

32

reset (F) ; read (F , i ) ; // comandos que manipulam a v a r i a v e l i write (F , i ) ; // imprime i no a r q u i v o t e x t o ( ASCII ) ; write ( i ) ; // imprime i na t e l a ; c l o s e (F) ; end .

33

Expresses lgicas, aritmticas e operadores o o e

Existem dois tipos de expresses em Pascal : as lgicas e as aritmticas. So basicao o e a mente usadas por comandos quando necessrio produzir um clculo complexo ou na e a a tomada de decises em comandos que exigem certos testes. o Expresses so formadas por dois componentes: os operadores e os operandos. o a Como a linguagem Pascal tipada, ocorre que as expresses tambm produzem ree o e sultados de tipo denido. Este tipo depende essencialmente dos operandos e dos operadores que compem a expresso. o a O restante desta seao detalha os aspectos mais importantes das construoes que c c envolvem expresses. o

6.1

Expresses aritmticas o e

So expresses aritmticas: a o e Constantes; Variveis dos tipos ordinal e real; a Funoes cujo tipo de retorno sejam ordinais ou reais; c Se E1 e E2 so duas expresses aritimticas, ento as seguintes tambm so: a o e a e a E1 + E2 E1 E2 E1 E2 E1 /E2 E1 div E2 E1 mod E2 (E1 ) Somente so expresses aritmticas as que podem ser constru a o e das com as regras acima. Os s mbolos +, -, *, /, div, mod so operadores aritmticos binrios, isto , operam a e a e sobre dois operandos para produzir um resultado. A tabela abaixo explica cada um destes s mbolos. operador + * / div mod signicado adiao c subtraao c multiplicao ca diviso real a diviso inteira a resto de diviso inteira a 34

O tipo do retorno depende do tipo dos operandos e dos operadores. Em geral, as operaoes de adiao e subtrao e multiplicaao retornam o mesmo tipo dos operandos. c c ca c Se estiverem sendo operados um real e um inteiro, o resultado do tipo real. e Para as operaoes de diviso inteira (div) e resto de diviso inteira (mod) o rec a a sultado inteiro, mas os operandos tambm devem ser inteiros. As operaes com e e co a diviso real (/) resultam sempre em tipo real, mesmo que um ou mais operandos a sejam do tipo inteiro. A tabela abaixo resume esta explicao. ca

operador tipo dos operandos tipo do resultado + inteiros inteiro reais real real e inteiro real inteiros inteiro reais real real e inteiro real * inteiros inteiro reais real real e inteiro real / inteiros real real e inteiro real reais real div inteiros inteiro real e inteiro ERRO reais ERRO mod inteiros inteiro real e inteiro ERRO reais ERRO

Observamos que, nas operaoes de diviso real ou inteira, o segundo operando no c a a pode ser nulo, o que acarretar erro de execuao. a c 6.1.1 Exemplos

So exemplos de expresses aritmticas bem formadas: a o e 2 * 9 - 8 / 4 2 * (9 - 8 / 4) cos (x/(y+1)) + ln (exp(y)) / sqrt (2.376 * x - PI) 9 mod 5 + 2 * 7 35

(9 mod (5 + 2)) * 7 6.45 + 5.0 * 2.01 (6 + 5) * 2 As funoes cos, ln, exp e sqrt so pr-denidas pelo compilador e retornam, c a e respectivamente, o cosseno, logaritmo, exponencial e raiz quadrada do argumento. 6.1.2 Ordem de precedncia e

Em uma expresso complexa, o compilador executa cada operaao separadamente a c segundo uma ordem pr-estabelecida. Isto conhecido como ordem de precedncia e e e dos operadores. Em outras palavras, suponha a expresso: a 5+42 Sem maiores informaoes, uma expresso amb c e a gua, pois 5 + 4 = 9 e 9 2 = 18, mas por outro lado, 4 2 = 8 e 5 + 8 = 13. Isto reete a diferena entre as expresses: c o (5 + 4) 2 e 5 + (4 2) Em Pascal as operaes so realizadas segundo a ordem de precedncia seguinte: co a e as operaes entre parnteses ocorrem primeiro; co e em seguida, as de multiplicaao ou diviso, seja real ou inteira; c a em seguida, as de adiao ou subtraao; c c nalmente, realiza operaoes da esquerda para a direita. c Assim, no exemplo acima 5 + 4 2, signica que a multiplicao ser feita em ca a primeiro lugar, e o resultado ser 13. a As expresses podem ser utilizadas nos seguintes casos: o em comandos de atribuiao (ver seo 7.1); c ca em expresses lgicas (ver seao 6.2); o o c como argumento de funes ou procedimentos (ver seo 4.1.5). co ca

36

Expresso Resultado a 2 * 9 - 8 / 4 16 2 * (9 - 8 / 4) 14 (2 * 9) - 8 / 4 16 9 mod 5 + 2 * 7 18 (9 mod (5 + 2)) * 7 14 6 + 5 * 2 16 (6 + 5) * 2 22 Tabela 6: Exemplo de uso de expresses o

6.2

Expresses lgicas o o

So expresses lgicas: a o o constantes do tipo boolean; variveis do tipo boolean; a funoes cujo tipo de retorno seja boolean; c se E1 e E2 so duas expresses aritmticas, ou variveis ou constantes do mesmo a o e a tipo, ento as seguintes so expresses lgicas: a a o o E1 = E2 E1 <> E2 E1 > E2 E1 >= E2 E1 < E2 E1 <= E2 Se L1 e L2 so duas expresses lgicas, ento as seguintes tambm so: a o o a e a L1 or L2 L1 and L2 L1 xor L2 not(L1 ) (L1 ) Somente so expresses aritmticas as que podem ser constru a o e das com as regras acima.

37

Os s mbolos =, <>, >, >=, <, <= so operadores relacionais binrios. Podem ter a a como argumento expresses aritmticas ou ento variveis ou constantes do tipo, mas o e a a sempre resultam em tipo boolean. Os s mbolos and, or, xor e not so operadores booleanos, os dois primeiros so a a binrios e o ultimo unrio. Signicam, respectivamente, as operaoes lgicas de a e a c o conjunao, disjunao, disjuno exclusiva e negaao. c c ca c A tabela abaixo explica cada um destes s mbolos. operador = <> >= < <= and or xor not signicado igual diferente maior ou igual menor maior ou igual conjunao c disjunao c disjunao exclusiva c negaao c

O tipo do retorno sempre boolean e o resultado da operao segue as regras da e ca lgica clssica que so resumidas nas tabelas verdade apresentada na gura 1. o a a

Expresso a Resultado false and false false false and true false true and false false true and true true
(a) AND

Expresso a Resultado false or false false false or true true true or false true true or true true
(b) OR

Expresso a Resultado false xor false false false xor true true true xor false true true xor true false
(c) XOR

Expresso Resultado a not false true not true false


(d) NOT

Figura 1: Conjunto de tabelas verdade dos operadores lgicos o

As expresses podem ser utilizadas nos seguintes casos: o em comandos de atribuiao (ver seo 7.1); c ca 38

em comandos que exigem um condicional (ver seo 7); ca como argumento de funes ou procedimentos (ver seo 4.1.5). co ca 6.2.1 Exemplos

So exemplos de expresses booleanas bem formadas: a o 1 = 2 A = a 5 < 2 3 <= 3 JOAO > JOSE 2 + 3 <> 5 comp <> COMP 11 > 4 11 > 4 conhece pascal and conhece C reprovouNota xor reprovouPresenca (media >= 7) and (percentualFaltas <= 0.75) (idade >= 65) or (tempo servico >= 25) not(chovendo) and ((temperatura >= 30) or tem cerveja) (a and not(b)) or (b and not(a)) 6.2.2 Ordem de precedncia e

Assim como acontece com as expresses aritmticas (seao 6.1.2), as expresses lgicas o e c o o tambm precisam de uma ordem de precedncia entre os operadores para evitar ame e bigidades na interpretao da expresso. u ca a As operaes entre parnteses ocorrem primeiro; co e Em seguida, os operadores unrios (not, - (unrio)); a a Em seguida, os operadores multiplicativos (*, /, div, mod, and); Em seguida, os operadores aditivos (+, -, or, xor); 39

Em seguida, os operadores relacionais (=, <>, >, >=, <, <=); Finalmente, realiza operaoes da esquerda para a direita, em geral. c Observao Segundo o guia de referncia, em sua verso de dezembro de 2008, o ca e a compilador Free Pascal, contrariamente ao Turbo Pascal, no consegue garantir a a precedncia quando avalia expresses para acontecerem da esquerda para a direita, e o informando que o compilador decidir qual avaliar primeiro baseado em regras de a otimizaao. Assim, na expresso seguinte: c a
a := g ( 3 ) + f ( 2 ) ;

f (2) pode ser executada antes de g(3). Se o programador quiser garantir que g(3) ocorra antes, deve escrever seu cdigo assim: o
e1 := g ( 3 ) ; a := e1 + f ( 2 ) ;

Sempre que for feita a construao de expresses lgicas contendo expresses aritc o o o mticas em conjunto com operadores relacionais, as sentenas contendo operadores e c relacionais precisam estar entre parnteses, ou o compilador vai gerar erro de execuao. e c Por exemplo, na expresso: a
a < 0 or b < 0

o operador or possui maior precedncia em relaao aos operadores relacionais. Assim, e c o compilador tenta realizar primeiro a expresso 0 or b. O operador or no foi a a constru para operar com dados numricos, mas apenas com dados do tipo boolean, do e o que gera erro. A maneira correta de construir a expresso utilizar parnteses para separar as a e e sentenas relacionais, da seguinte maneira: c
( a < 0 ) or ( b < 0 )

Deste modo, como os parnteses possuem maior precedncia em relaao ao or, as e e c sentenas relacionais so reduzidas a valores lgicos antes da utilizao do operador. c a o ca

40

Comandos da linguagem Pascal

Existem dois tipos de comandos em Pascal, os comandos simples e os compostos. Neste texto vamos apresentar apenas os comandos compat veis com o n da discivel plina bsica de programaao de computadores ou de introduo aos algoritmos. a c ca Por este motivo, recomendamos fortemente que o leitor consulte o guia de referncia do compilador utilizado para conhecer todos os comandos dispon e veis na linguagem. Os comandos que sero apresentados so os seguintes: a a Comandos Simples Comando de atribuio (:=); ca Comando de desvio incondicional (goto); Comandos Compostos Comandos de desvio condicional (if-then-else, case); Comandos de repetio (while-do, repeat-until, for); ca Delimitadores de bloco.

7.1

Comando de atribuio ca

O comando de atribuiao usado exclusivamente para se atribuir um valor a uma c e varivel. O valor previamente armazenado naquela posio de memria substitu a ca o e do pelo novo. Sintaxe:
<var> := <e x p r e s s a o >;

Com isto, ocorre a atribuio do resultado da avaliaao da expresso para a varivel ca c a a indicada lado esquerdo do operador de atribuio (:=). ca Em funo da linguagem ser tipada, as atribuies s funcionam se o tipo do ca co o valor atribu for o mesmo da varivel que recebe o novo valor. Quando ocorre uma do a atribuiao de tipos diferentes, o programa aborta com uma mensagem do tipo type c mismatch. H vezes em que o prprio compilador detecta incompatibilidades de tipos. a o Exemplo:
program e x e m p l o a t r i b u i c a o ; var x , alpha : real ; m, n , f a t o r i a l : integer ; nome : string ; l e t r a : char ; begin x := 1 0 . 7 5 ;

41

a l p h a := s q r t ( l n ( y ) + b e t a ) y ( y + 1 ) ; m := m + n n DIV ( f a t o r i a l 1 ) ; nome := Fulano de Tal ; l e t r a := A ; end .

7.2

Comandos de entrada

Os comandos de entrada so usados para se carregar um determinado valor fornecido a pelo usurio em memria. Este valor pode ser digitado ou fornecido atravs de arquivo. a o e Os comandos de entrada da linguagem Pascal so read e readln, cujas sintaxes a respectivas so apresentadas na seqncia11 . a ue Sintaxe:
read(< d i s p o s i t i v o >, < l i s t a de v a r i a v e i s >) ; readln(< d i s p o s i t i v o >, < l i s t a de v a r i a v e i s >) ;

em que <lista de variveis> uma lista de identicadores de variveis separados a e a por v rgula, e <dispositivo> o nome de um dispositivo de entrada (ver seo 5.8). e ca Caso o nome do dispositivo seja omitido, ento se considera a entrada padro (tea a clado). As variveis devem ser de um tipo bsico da linguagem, isto , tipos ordinais, a a e reais, char, string ou boolean. A diferena entre as duas formas do comando read s existe no caso de leitura de c o strings: readln acrescentar o CR (carriage return) ao nal da string lida, como a parte da mesma. Exemplo:
program e x e m p l o l e i t u r a ; var x , alpha : real ; m, n , f a t o r i a l : integer ; nome : string ; l e t r a : char ; arq : f i l e of r e a l ; begin readln ( nome ) ; read ( x ) ; read ( arq , a l p h a ) ; read (m, n , f a t o r i a l , l e t r a ) ; end . O guia de referncia do Free Pascal, em sua verso de dezembro de 2008, no contm informaes e a a e co sobre os comandos de leitura, apenas menciona que so modicadores. a
11

42

7.3

Comandos de sa da

Os comandos de sa so usados para se exibir contedos de variveis, bem como da a u a mensagens que devem ser fornecidas para o usurio do programa. a Os comandos de sa da linguagem Pascal so write e writeln, conforme sintada a 12 xes seguintes : Sintaxe:
write(< d i s p o s i t i v o >, < l i s t a >) ; writeln(< d i s p o s i t i v o >, < l i s t a >) ;

em que <lista> uma lista de elementos separados por v e rgula, em que cada elemento pode ser um identicador de varivel, uma expresso aritmtica ou uma string (entre a a e aspas simples) e <dispositivo> o nome de um dispositivo de sa (ver seo 5.8). e da ca Tanto o dispositivo quanto a lista de variveis podem ser vazios. a Caso o nome do dispositivo seja omitido, ento se considera a sa padro (tela). a da a Um dispositivo interessante o lst, que remete a impressora padro. e ` a As variveis devem ser de um tipo bsico da linguagem, isto , tipos ordinais, a a e reais, char, string ou boolean. A diferena entre as duas formas do comando write que writeln acrescentar c e a o CR (carriage return) ao nal do contedo impresso. Isto faz com que o cursor seja u levado a prxima linha do dispositivo de sa ` o da. Exemplo:
program e x e m p l o l e i t u r a ; var x , alpha : real ; m, n , f a t o r i a l : integer ; nome : string ; l e t r a : char ; arq : f i l e of r e a l ; begin // Trecho com a l e i t u r a das v a r i a v e i s o m i t i d o writeln ( Nome do usuario : , nome ) ; write ( x , = , f ( 2 ) + l n ( a l p h a ) ) ; write ( arq , a l p h a ) ; write ( l s t , m, + , n , , fatorial , letra ) ; write ( ) ; writeln ; end .

7.4

Comando de desvio incondicional (Goto)

O comando de desvio incondicional o goto e serve para desviar o uxo de execuao e c do programa incondicionalmente para outro ponto do cdigo. Este outro ponto deve o
O guia de referncia do Free Pascal, em sua verso de dezembro de 2008, no contm informaes e a a e co sobre os comandos de sa da, apenas menciona que so modicadores. a
12

43

ser indicado por um rtulo previamente declarado na seao de rtulos (ver seao 4.1.1). o c o c Sintaxe:
goto <label>

em que <label> um rtulo declarado com o comando label. e o Ateno: preciso observar que o comando de desvio incondicional no faz parte ca e a dos comandos aceitos no contexto de programaao estruturada. Sempre poss c e vel reconstruir o cdigo de maneira mais elegante (embora talvez menos eciente) e obter o o mesmo resultado. Outra observao que o uso do goto de dentro para fora de laos ou vice-e-versa ca e c no algo muito razovel de se fazer, a chance de o programador estar fazendo algo a e a errado bastante alta. e Exemplo:
program alomamae ; label a l o , 1 0 0 , FIM ; begin goto 1 0 0 ; a l o : writeln ( Alo mamae ! ) ; goto fim ; 100 : writeln ( Inicio ! ) ; goto a l o ; FIM : end .

Este programa inicia pelo comando que desvia o cdigo para o rtulo 100, que o o imprime a mensagem Inicio na tela. Em seguida executa o desvio para o rtulo o alo, que imprime na tela a mensagem Alo mamae!. Finalmente, desvia o cdigo o para o rtulo fim e o programa termina. Observe que o exemplo seguinte cumpre o exatamente com a mesma nalidade. Exemplo:
program alomamae melhorado ; begin writeln ( Inicio ! ) ; writeln ( Alo mamae ! ) ; end .

7.5

Comandos de desvio condicional

Os comandos de desvio condicional servem para desviar o uxo de execuo dos coca mandos com base em uma condio denida pelo programador. ca 44

Existem dois comandos de desvio condicional em Pascal. Um deles possibilita duas formas de uso: 1. if-then; 2. if-then-else; 3. case-of. Cada forma de uso ser apresentada nas seoes subseqentes. a c u 7.5.1 Desvio condicional simples (if-then)

Nesta primeira variante, poss e vel executar um comando desejado apenas se uma condiao booleana for satisfeita, ou seja, for avaliada como true (verdadeira). Caso c contrrio (o resultado seja false), o comando no executado. a a e Sintaxe:
i f <e x p r e s s a o booleana > then comando >;

Note que as palavras if e then so reservadas. O comando a ser executado unico. a e Se o programador precisar de uma seqncia de comandos, ento os delimitadores de ue a bloco devem ser empregados (ver seao 7.7). Observe tambm que, como em Pascal c e todo comando termina por ponto-e-v rgula e, neste caso, o comando if-then termina somente aps <comando> aninhado, ento o ponto-e-v o a rgula somente aparece no nal de toda a construao. c Exemplo:
program e x e m p l o c o n d i c i o n a l 1 ; var n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; i f ( n mod 2 ) = 0 then writeln ( O numero , n , eh par. ) ; writeln ( fim ) ; end .

O programa anterior imprime a mensagem O numero n eh par. apenas e to a somente se o resto da diviso inteira de n por 2 for nulo. Em ambos os casos a a mensagem m impressa na tela. e Caso o programador queira imprimir tambm a mensagem m apenas no caso e da avaliao do condicional, o programa deveria ter sido escrito desta outra forma que ca segue. Exemplo: 45

program e x e m p l o c o n d i c i o n a l 2 ; var n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; i f ( n mod 2 ) = 0 then begin writeln ( O numero , n , eh par. ) ; writeln ( fim ) ; end ; end .

7.5.2

Desvio condicional completo (if-then-else)

Nesta segunda e ultima variante, poss executar um comando desejado apenas e vel se uma condiao booleana for satisfeita, ou seja, for avaliada como true e ao mesmo c tempo garantir que um segundo comando seja executado to somente se a condio a ca booleana for avaliada como false. Sintaxe:
i f <e x p r e s s a o booleana > then <comando 1> else <comando 2 >;

Note que as palavras if, then e else so reservadas. O comando a ser executado a unico, tanto o primeiro quanto o segundo. Se o programador precisar de uma e seqncia de comandos, ento deve usar um delimitador de bloco (ver seao 7.7). ue a c Observar tambm que, como em Pascal todo comando termina por ponto-e-v e rgula a e, neste caso, o comando if-then-else termina somente aps <comando 2>, ento o o ponto-e-v rgula aparece apenas no nal, e no no meio da construo, o que um a ca e erro comum para principiantes. Exemplo:
program e x e m p l o c o n d i c i o n a l 3 ; var n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; i f ( n mod 2 ) = 0 then writeln ( O numero , n , eh par. ) else writeln ( O numero , n , eh impar . ) ; writeln ( fim ) ; end .

46

O programa anterior imprime a mensagem O numero n eh par. apenas e to a somente se o resto da diviso inteira de n por 2 for nulo. Caso contrrio, a mensagem a a O numero n eh impar. ser impressa. Independentemente do desvio realizado, a a mensagem m exibida na tela. e Assim, uma maneira de distingir o desvio condicional simples do completo, u e visualizar a else como parte opcional do comando if. No exemplo a seguir, o programa gera um menu de opoes. Existe uma outra c forma mais adequada de fazer o mesmo menu, utilizando o comando case, que ser a visto na seo 7.5.3. ca Exemplo:
program p a r i m p a r ; var opc : integer ; begin writeln ( ------ M E N U ------ ) ; writeln ( 1 - Cadastro ) ; writeln ( 2 - Busca ) ; writeln ( 3 - Ajuda ) ; writeln ( 4 - Sair ) ; writeln ( --------------------- ) ; read ( opc ) ; i f ( opc = 1 ) then writeln ( Cadastrando ... ) e l s e i f ( opc = 2 ) then writeln ( Buscando ... ) e l s e i f ( opc = 3 ) then writeln ( Mostrando ajuda ... ) e l s e i f ( opc = 4 ) then writeln ( Saindo do programa ... ) else writeln ( Opcao Invalida ) ; end .

7.5.3

Comando de desvio condicional por caso (case)

O comando case serve para facilitar a visualizao de vrios comandos if-then-else ca a aninhados, com a diferena de que, no lugar de avaliar expresses booleanas, so c o a avaliadas expresses cujo resultado seja de algum tipo enumerado ou ordinal (exceto o boolean e char). O comando constitu por uma expresso e por constantes de caso. As conse do a tantes devem ser conhecidas em tempo de compilaao. Todas as constantes devem c ser do mesmo tipo. O compilador avalia a expresso e, caso haja o casamento de uma das constana tes com o valor da expresso, a sentena que segue esta constante executada. O a c e programa continua ento aps o end nal do comando. a o

47

Na situaao em que no h casamento de nenhuma constante com o valor da c a a expresso, executam-se as instruoes aninhadas em else. a c O trecho do else opcional e executado apenas no caso de no haver qualquer e a casamento de constante com o valor da expresso. Ainda neste caso, se no houver a a este trecho, o uxo de execuao seguir para o comando que sucede o end. c a Sintaxe:
case <e x p r e s s a o do case> of c t e 1 : comando 1 ; c t e 2 : comando 2 ; c t e 3 : comando 3 ; //... cteN : comando N ; else comando do else ; end ;

Observe que case, of e else so palavras reservadas. As constantes do comando a so cte1, cte2, . . . , cteN. Conforme explicado anteriormente, estas constantes poa dem ser tambm de tipos enumerveis, isto , da forma A..B. No Free Pascal no e a e a e permitido haver duplicidade nas constantes. Analogamente aos comandos if, aqui somente um unico comando executado em e cada caso. Quando necessrio mais de um comando, deve-se utilizar os delimitadores a de bloco (ver seao 7.7). c Ao contrrio do que ocorre com o if, aqui deve existir o ponto-e-v a rgula na instruao que precede o else. c Em suma, o comando case funciona baseado em casamentos de padres e no to o a e a genrico quando o comando if. Este, por sua vez, trabalha com expresses booleanas e o que podem ser to complexas quanto se precise. Vale frisar que todo trecho que utilize a case pode ser reescrito como um aninhamento de comandos if-then-else, embora o cdigo que menos leg o vel. Exemplo:
program e x e m p l o c a s e o f ; var a , b : integer ; r e s p o s t a , e s c o l h a : byte ; begin writeln ( Digite dois inteiros : ) ; read ( a , b ) ; writeln ( Escolha a operacao a ser realizada : ) ; writeln ( (1) Soma , (2) Subtracao , (3) Multiplicacao , (4) divisao ) ) ; read ( e s c o l h a ) ; case 1 2 3 e s c o l h a of : writeln ( a , + , b , = , ( a+b ) ) ; : writeln ( a , + , b , = , ( ab ) ) ; : begin r e s p o s t a := a b ;

48

writeln ( a , + , b , = , r e s p o s t a ) ; end ; 4 : writeln ( a , + , b , = , ( a /b ) ) ; 5..255: writeln ( Escolha errada ! ) ; else writeln ( Entrada incorreta . ) ; end .

O cdigo anterior, escrito com o case equivale a este outro cdigo, que utiliza if. o o
program o p e r a c o e s ; var a , b : integer ; r e s p o s t a : integer ; e s c o l h a : integer ; begin writeln ( Digite dois inteiros : ) ; read ( a , b ) ; writeln ( Escolha a operacao a ser realizada : ) ; writeln ( (1) Soma , (2) Subtracao , (3) Multiplicacao , (4) divisao ) ) ; read ( e s c o l h a ) ; i f e s c o l h a = 1 then writeln ( a , + , b , = , ( a+b ) ) else i f e s c o l h a = 2 then writeln ( a , + , b , = , ( ab ) ) else i f e s c o l h a = 3 then begin r e s p o s t a := a b ; writeln ( a , + , b , = , r e s p o s t a ) ; end else i f e s c o l h a = 4 then writeln ( a , + , b , = , ( a /b ) ) else i f ( e s c o l h a > 5 ) and ( e s c o l h a <= 2 5 5 ) then writeln ( Escolha errada ! ) else writeln ( Entrada incorreta . ) ; end .

O prximo exemplo explora mais as possibilidades do case. o


program e x e m p l o c a s e s o f i s t i c a d o ; var numero : integer ; begin writeln ( Digite um numero : ) ; read ( numero ) ;

49

case numero of 1 : writeln ( Numero um. ) ; 2 . . 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29: writeln ( Numero esta entre os 10 primeiros primos . ) ; 4 , 8 , 12 , 16 , 20 , 24 , 28: writeln ( Numero menor do que 30 e divisivel por quatro ) ; else writeln ( Nada de especial com esse numero ) ; end ; end .

No exemplo acima, toda v rgula dentro da especicao das constantes consideca e rada um or. Sempre que forem encontrados dois pontos entre constantes, l-se at, e e pois especica uma escala de poss veis valores.

7.6

Comandos de repetio ca

Os comandos de repetiao servem para desviar o uxo de execuo de maneira que c ca um determinado trecho do cdigo possa ser repetido por um nmero determinado de o u vezes. A este desvio, d-se o nome de lao ou loop. a c O Pascal dispe dos seguintes comandos de repetiao: o c 1. while-do; 2. repeat-until; 3. for-do. Todos estes sero apresentados na seqncia. a ue 7.6.1 Repetio condicional com teste no in ca cio (while-do)

Em Pascal, o while-do o comando de repetiao condicional com teste no in e c cio. Usa-se o while-do para repetir um comando enquanto a avaliaao de sua expresso c a booleana resulte em verdade (true). Tal expresso avaliada antes do comando ser a e executado. Sintaxe:
while <e x p r e s s a o booleana > do comando >;

As palavras while e do so reservadas. O comando a ser executado unico. Caso a e o programador deseje executar uma seqncia de comandos, o delimitador de blocos ue deve ser utilizado (ver seao 7.7). c Como, em Pascal, todo comando termina por ponto-e-v rgula e, neste caso, o comando while-do termina somente aps o <comando>, ento o ponto-e-v o a rgula somente aparece no nal, e no no meio da construao. a c Exemplo: 50

program e x e m p l o w h i l e d o 1 ; var n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; while n > 0 do begin writeln ( n ) ; n := n 1 ; end ; writeln ( Fim. ) ; end .

O programa imprime, de maneira decrescente, todos os nmeros entre n e 1. Se u o nmero lido for negativo ou nulo, ento a mensagem Fim. impressa imediau a e tamente, isto , nenhum nmero aparece na tela. Isto ocorre porque a avaliao da e u ca expresso condicional ocorre antes do bloco de instrues ser executado. a co Como o while-do repete um bloco de instruoes enquanto determinada condio c ca for verdadeira, poss denir um lao de execuao innita caso a expresso avaliada e vel c c a nunca se altere para falsa. No cdigo a seguir, se um nmero negativo ou nulo for digitado como entrada, o u o programa termina sem nunca ter impresso nmero algum na sa u da. Contudo, se o nmero entrado for positivo e no nulo, ser impresso innitamente. u a a Exemplo:
program e x e m p l o w h i l e d o 2 ; var n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; while n > 0 do writeln ( n ) ; writeln ( Fim. ) ; end .

7.6.2

Repetio condicional com teste no nal (repeat-until) ca

O repeat-until o comando de repetiao condicional com teste no nal. Funciona de e c modo contrastante ao while-do, ou seja, repete at que uma dada expresso booleana e a resulte em verdadeiro. Esta expresso avaliada aps o bloco de instruoes ter sido a e o c executado. Sintaxe:
repeat

51

<comandos >; u n t i l <e x p r e s s a o booleana >;

As palavras repeat e until so reservadas. Contrariamente ao comando while-do, a o repeat-until pode executar vrios comandos sem a delimitao de bloco por begin a ca e end (ver seao 7.7). c Como, em Pascal, todo comando termina por ponto-e-v rgula e, neste caso, o comando repeat-until termina somente aps a expresso booleana, ento o pontoo a a e-v rgula somente aparece no nal, e no no meio da construo. a ca Exemplo:
program e x e m p l o r e p e a t u n t i l 1 ; var n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; repeat writeln ( n ) ; n := n 1 ; u n t i l n <= 0 ; writeln ( Fim. ) ; end .

O programa imprime de maneira decrescente todos os nmeros entre n e 1. Conu tudo, aqui reside a principal diferena entre o repeat-until e o while-do: se o c nmero lido for negativo ou nulo, o nmero ser impresso seguido da mensagem de u u a Fim.. Isto ocorre porque a avaliao da expresso somente feita aps a execuo ca a e o ca do bloco de comandos. Dependendo da avaliaao da expresso booleana, poss c a e vel denir um lao de c execuao innita, tal como apresentado no exemplo a seguir. Um inteiro positivo, no c a nulo, lido do teclado imprimido innitamente. Caso um nmero nulo ou negativo e u seja lido, o programa termina aps imprimir o nmero uma unica vez e exibir a o u mensagem Fim.. Exemplo:
program e x e m p l o r e p e a t u n t i l 2 ; var n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; repeat writeln ( n ) ; u n t i l n <= 0 ; writeln ( Fim. ) ; end .

52

7.6.3

Repetio por enumerao (for-do) ca ca

O for-do o comando de repetiao por enumeraao do Pascal. Usa-se para repetir e c c um bloco de comandos por um nmero xo e predeterminado de vezes. O controle u feito por uma varivel, denominada varivel de controle, a qual respeita os limites e a a estabelecidos que dependem de um valor inicial e de um valor nal. Tais limites so a denidos antes do comando ser executado e no podem ser alterados. a Sintaxe:
f o r <v a r i a v e l d e c o n t r o l e > := <EAO 1> to <EAO 2> do <comando >; f o r <v a r i a v e l d e c o n t r o l e > := <EAO 1> downto <EAO 2> do <comando >;

As palavras for, do, to e downto so reservadas. O comando a ser executado a unico, devendo ser utilizados os delimitadores de bloco (ver seo 7.7) no caso de e ca haver mais de um. Como, em Pascal, todo comando termina por ponto-e-v rgula e, neste caso, o comando for-do termina somente aps <comando>, ento o ponto-e-v o a rgula somente aparece no nal, e no no meio da construao. a c O comportamento do for-do o seguinte: e e 1. o valor de <EAO 2> avaliado; 2. a varivel de controle recebe o valor da avaliao de <EAO 1>; a ca 3. caso tenha sido usada a forma com to, ento o valor da varivel de controle a a e e comparado com <EAO 2> e, se for menor ou igual, o comando executado e a varivel de controle incrementada de uma unidade; a e 4. caso tenha sido usada a forma com downto, ento o valor da varivel de controle a a comparado com <EAO 2> e se for maior ou igual, o comando executado e a e e varivel de controle decrementada de uma unidade; a e 5. o ciclo se repete at que o valor da varivel de controle ultrapasse o limite e a estabelecido em <EAO 2>, no caso da forma com to ou se torne inferior a <EAO 2> no caso da forma com downto. E imperativo dizer que <variavel de controle> deve ser de tipo ordinal e que <EAO 1> e <EAO 2> so expresses aritmticas cujos valores de retorno tambm so a o e e a de um tipo ordinal. Estas duas expresses so avaliadas antes que o comando seja o a executado, sendo que proibido que se modique o valor da varivel de controle pelo e a comando. Finalmente, no adianta alterar variveis que mudem o valor de <EAO 2>, a a uma vez que esta expresso foi avaliada antes do in do lao. a cio c Exemplo: 53

program e x e m p l o f o r d o 1 ; var i , n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; f o r i := 1 to n do writeln ( i ) ; writeln ( Fim. ) ; end .

O programa imprime de maneira crescente todos os nmeros entre 1 e n. Se o u nmero lido for negativo ou nulo ento a mensagem Fim. impressa imediatamente, u a e isto , nenhum nmero aparece na tela. e u Exemplo:
program e x e m p l o f o r d o 2 ; var i , n : integer ; begin writeln ( Informe um numero inteiro positivo : ) ; read ( n ) ; f o r i := n downto 1 do writeln ( n ) ; writeln ( Fim. ) ; end .

O programa anterior imprime de maneira decrescente todos os nmeros entre n e u 1. Se o nmero lido for negativo ou nulo ento a mensagem Fim. impressa imeu a e diatamente, isto , nenhum nmero aparece na tela. Este programa absolutamente e u e equivalente ao primeiro exemplo apresentado na seo 7.6.1. ca Exemplo:
program t a b u a d a 1 a o 1 0 ; const MAX = 1 0 ; var i , j : integer ; begin f o r i := 1 to MAX do begin writeln ( Tabuada do , i ) ; f o r j := MAX downto 1 do writeln ( i , x , j , = , i j ) ; writeln ; end ; end .

54

Este ultimo exemplo mostrou como comandos do tipo for-do podem ser alinhados para se obter a impresso de todas as tabuadas do 1 ao 10. a No poss denir um lao de execuao innita usando-se o comando for-do. a e vel c c

7.7

Delimitadores de bloco

Os delimitadores de bloco serve para agrupar comandos a m de que sejam visto como um conjunto de instrues encapsulado. Isto , aglomera mais de um comando em co e um bloco que encarado pelo compilador como um unico comando. e O modo de usar simples, basta escrever os comandos desejados entre um begin e e um end;. O seguinte trecho de programa ilustra um uso deste tipo de comando.
begin a := b + 1 ; b := a 1 ; i f a > b then writeln ( A maior do que B ) ; end ;

55

Legibilidade do cdigo o

Esta seao apresenta algumas tcnicas para se escrever cdigos elegantes, de fcil leic e o a tura e compreenso por quem os l. Apesar de ter a linguagem Pascal como foco, a e o contedo aqui descrito pode ser projetado para qualquer outra linguagem de prou gramaao cujo compilador ignore espaos, tabulaoes ou linhas em branco. Em parc c c ticular, tambm se apresentam consideraoes para as linguagens que no so case e c a a sensitive, isto , que no diferenciam maisculas de minsculas. e a u u As prximas seoes descrevem convenoes e sugestes que ajudam a padronizar o o c c o cdigo e que devem ser levadas em consideraao. o c As idias aqui apresentadas podem no fazer muito sentido para um programador e a aprendiz, mas so fundamentais na arte da programao, em particular quando se a ca escrevem programas com algumas milhares de linhas.

8.1

Espaos e linhas em branco so ignorados c a

Ambos os exemplos geram rigorosamente o mesmo cdigo executvel, inclusive com o a o mesmo tamanho em bytes, pois o compilador ignora linhas em branco e espaos. c Contudo, a legibilidade da primeira verso privilegiada. a e Verso 1: a
program O i P e s s o a l ; begin write ( Oi ) ; writeln ( Pessoal ! ) ; end .

Verso 2: a
program O i P e s s o a l ; begin write ( Oi ) ; writeln ( Pessoal ! ) ; end .

Verso 3: a
program OiPessoal ; begin write ( Oi ) ; writeln ( Pessoal ! ) ; end .

56

Verso 4: a
program O i P e s s o a l begin writeln ( Pessoal ! ) ; ; write ( Oi ) ; end .

Em resumo, prefer e vel escrever um comando por linha, preferencialmente deixando espaos em branco de maneira regular. Usar uma linha em branco entre blocos c com o mesmo sentido, tambm boa prtica: inicializaao de variveis, leitura de e e a c a variveis, processamento das informaes, por exemplo. a co E muito importante que o programador mantenha a consistncia do padro por e a toda a redaao do programa. c

8.2

No h distino entre mai sculas e min sculas a a ca u u

Embora ambas as verses seguintes gerem o mesmo programa executvel, a verso o a a com comandos e identicadores em maisculas tem a legibilidade prejudicada. u Verso 1: a
program c a l c u l a r i m c ; var nome : string ; a l t u r a , peso , imc : r e a l ; begin write ( Digite o nome do paciente : ) ; readln ( nome ) ; write ( Digite a altura em metros (Ex .: 1.78) : ) ; readln ( a l t u r a ) ; write ( Digite o peso em quilogramas (Ex .:93) : ) ; readln ( p e s o ) ; writeln ; imc := p e s o / ( a l t u r a a l t u r a ) ; writeln ( O paciente , nome , tem o I.M.C. igual a , imc : 4 : 2 ) ; write ( Pressione qualquer tecla para sair. ) ; end .

Verso 2: a
P O R M CALCULAR IMC; RGA VA R NOME : STRING; ALTURA, PESO, IMC : REAL; BEGIN WRITE( DIGITE O NOME DO PACIENTE : ) ; READLN(NOME) ; WRITE( DIGITE A ALTURA EM METROS (EX .: 1.78) : ) ; READLN(ALTURA) ;

57

WRITE( DIGITE O PESO EM QUILOGRAMAS (EX .: 93): ) ; READLN(PESO) ; WRITELN; IMC := PESO/ (ALTURAALTURA) ; WRITELN( O PACIENTE , NOME, TEM O IMC IGUAL A , IMC : 4 : 2 ) ; WRITE( PRESSIONE QUALQUER TECLA PARA CONTINUAR . ) ; END.

A leitura do cdigo ca mais uente quando letras minsculas so utilizadas. o u a

8.3

Comentrios a

A maior parte das linguagens de programao modernas permite que o programador ca insira textos que no faam parte do programa propriamente dito, so comentrios a c a a adicionais que facilitam a compreenso por parte de quem l o cdigo. a e o Conforme vimos na seao 5.3, em Pascal isto poss com o uso equilibrado dos c e vel s mbolos: (* e *); { e }; e + +. Exemplo:
( E s t e programa f a z o c a l c u l o do MDC p e l o metodo de E u c l i d e s ) ( F e i t o por : Marcos C a s t i l h o ) ( Data : 12/05/2009 ) program MDCporEuclides ; var a , b , r e s t o : l o n g i n t ; // 2 b y t e s eh pouco para numeros g r a n d e s begin read ( a , b ) ; // o s v a l o r e s l i d o s devem s e r nao n u l o s i f not ( ( a = 0 ) or ( b = 0 ) ) then begin r e s t o := a mod b ; while r e s t o <> 0 do // quando o r e s t o f o r z e r o temos o MDC em b begin a:= b ; b:= r e s t o ; r e s t o := a mod b ; end ; writeln ( MDC = , b ) ; end else writeln ( O algoritmo nao funciona para entradas nulas ) ; end .

Algumas dicas para uso dos comentrios no cdigo: a o Ausncia de comentrios ruim, mas o excesso tambm ! Use o bom senso para e a e e e 58

decidir os lugares relevantes no cdigo que merecem comentrios. Se o cdigo o a o precisa de muitos comentrios, provavelmente est mal escrito; a a No escreva comentrios longos demais, a idia manter o cdigo o mais limpo a a e e o poss vel; Descrever o comportamento de funoes e procedimentos interessante; c e Indicar pontos no cdigo que so fundamentais para o bom funcionamento do o a programa, tambm . e e

8.4

Identao ou alinhamento de cdigo por colunas ca o

Identao uma palavra que vem do ingls identation e signica, neste contexto, o ca e e alinhamento de comandos em colunas de acordo com o n hierrquico de aninhavel a mento destes comandos. Identaao uma prtica em programao estruturada e c e a ca e vivel em compiladores que ignoram espaos ou linhas em branco. a c Em geral, boa prtica de programao identar blocos de comandos de maneira e a ca que, visualmente, o programa que mais claro e mostre quais linhas de cdigo so o a executadas por um determinado comando em um certo trecho do programa. O objetivo permitir que programas quem melhor apresentados e mais fceis de e a se entender. Sempre que um bloco de comandos estiver no escopo de um comando (signica estar sob o controle do comando), a identaao passa a ser interessante. A tcnica c e elementar deslocar este bloco mais a direita do que o comando principal. Isto e facilita muito a visualizao de diferentes escopos no programa. ca Os dois exemplos abaixo ilustram esta situao, o primeiro est bem identado, o ca a segundo no. a Exemplo:
program e x e m p l o i d e n t a c a o b o a ; var i : integer ; begin f o r i := 1 to 10 do write ( i ) ; writeln ( Fim. ) ; end .

Observe como o comando for foi deslocado 3 espaos para a direita com relaao c c ao alinhamento begin-end do programa, bem como o comando write foi deslocado outros 5 espaos com relaao a coluna do comando for (e portanto 6 com relao a ao c c ca begin-end). J o comando que imprime a mensagem de m cou alinhado na mesma a coluna do comando for, mostrando que est fora do seu escopo, isto , consiste em a e um comando independente do for. Exemplo: 59

program e x e m p l o i d e n t a c a o r u i m ; var i : integer ; begin f o r i := 1 to 10 do write ( i ) ; writeln ( Fim. ) ; end .

O motivo da identaao confusa do segundo exemplo que, visualmente, quem l c e e o cdigo tem a falsa impresso de que o comando que imprime o texto Fim. est o a a no escopo do comando for e portanto ser repetido 10 vezes, o que no verdade! a a e Se esta fosse de fato a intenao do programador, ento ele deveria ter escrito da c a maneira como mostrado no exemplo abaixo: e Exemplo:
program c o r r i g i n d o i d e n t a c a o r u i m ; var i : integer ; begin f o r i := 1 to 10 do begin write ( i ) ; writeln ( fim ) ; end ; end .

Isto , introduzindo o begin e o end que o programador provavelmente tinha e esquecido. O nmero de espaos do deslocamento depende da preferncia do programador. u c e Costuma-se utilizar entre 3 e 5 espaos em branco. H programadores que utilizam a c a tabulaao (tab), porm esta pode ser descongurada conforme o editor. c e O importante manter o mesmo nmero de espaos em todo o cdigo. Deve-se e u c o tambm ter cuidado para no se avanar mais do que a ultima coluna da direita, pois e a c o resultado tambm confuso, conforme exemplo seguinte. e e Exemplo:
program o u t r o e x e m p l o i d e n t a c a o r u i m ; var i : integer ; begin f o r i := 1 to 10 do f o r j := 1 to 10 do f o r k:= 1 to 10 do f o r l := 1 to 10 do write ( i , j , k , l ) ; end .

60

8.5

Realce de sintaxe

O realce de sintaxe (syntax highlighting) [Syn] uma funcionalidade presente na maie oria dos editores de texto para programao. Essa funcionalidade permite que cada ca categoria de termos da linguagem seja apresentada na tela com um realce (formato ou cor) espec co. Geralmente utilizada coloraao para destacar os termos, mas tambm podem ser e c e utilizados negrito, itlico ou outras fontes. a Dessa forma, comentrios, tipos bsicos da linguagem, nmeros e comandos so a a u a realados, facilitando a leitura do cdigo fonte. c o E importante lembrar que o realce no afeta o signicado do cdigo fonte, e sua a o unica funao facilitar a leitura e edio. Anal de contas, o compilador funciona c e ca sobre um arquivo totalmente escrito usando-se os caracteres vis veis da tabela ASCII.

8.6

Simplicidade e clareza

Simplicidade e clareza so dois atributos muito importantes para aumentar a legibia lidade do cdigo-fonte. A clareza torna o programa intelig e a simplicidade evita o vel que a leitura do programa seja enfadonha. Entretanto, esses atributos so relativamente subjetivos e a habilidade de escrever a programas simples, claros e ecientes s alcanada com muita prtica, o que exige oe c a necessrio que o programador tenha um bom conhecimento dedicaao e tempo. E c a em algoritmos, bem como doss recursos que a linguagem de programaao fornece, c pois isto ajuda na tarefa de alcanar o bom senso necessrio para se escrever cdigos c a o elegantes.

8.7

Nomes dos identicadores

Em linguagens de programaao, os identicadores so trechos de texto que nomeiam c a entidades da linguagem. Em Pascal, essas entidades so os nomes das variveis, a a constantes, dos tipos de dados, procedimentos e funoes. c Assim, ao se programar em Pascal necessrio escolher um nome para cada uma e a dessas entidades, com exceo dos tipos bsicos da linguagem. A escolha do nome ca a dos identicadores muito importante na legibilidade do cdigo-fonte, pois no ajuda e o a muito ter um cdigo identado, comentado e com a sintaxe realada, se os nomes dos o c identicadores complicarem a leitura do cdigo. o Por exemplo, se uma determinada varivel for armazenar o CPF de algum usurio, a a um bom nome para esta varivel cpf. Observe como outras escolhas poderiam ir a e contra a legibilidade do cdigo: o numero cadastro pessoa fisica; cadastro; numero; campo02. 61

A regra geral a simplicidade e a clareza, como mencionado anteriormente. O e ideal que a leitura do cdigo seja intuitiva, e se parea mais com um texto em l e o c ngua nativa do que com um cdigo de mquina. o a

62

Referncias e
[Car82] S. Carvalho. Introduo ` Programao com Pascal. Editora Campus, ca a ca 1982.

[FBF+ 86] Harry Farrer, Christiano Gonalves Becker, Eduardo Chaves Faria, Fredec rico Ferreira Campos Filho, Helton Fbio de Matos, Marcos Augusto dos a Santos, and Miriam Loureno Maia. Pascal Estruturado. Livros Tcnicos c e e Cient cos Editora S.A., 2nd edition, 1986. [Gui] [Rin92] [Syn] [VC07] [Wir78] Manuais on-line do freepascal. Dispon veis juntamente com o compilador em http://www.freepascal.org. Roberto Rinaldi. Turbo Pascal 6.0 - Comandos e Funes. Livros Erica co Editora Ltda, 1992. http://en.wikipedia.org/wiki/Syntax_highlighting. Acessado em 7 de Maio de 2009. Michael Van Canneyt. Free pascal: Reference guide. freepascal.org/docs.var, August 2007. http://www.

N. Wirth. Programao Sistemtica em PASCAL. Editora Campus, 1978. ca a

63

Funes e procedimentos predenidos no comco pilador

Nesta seo so brevemente descritas os principais procedimentos e funoes predeca a c nidos pelo compilador Free Pascal. Existem funes adicionais para nalidades esco pec cas que exigem o uso de bibliotecas (Units), contudo tal tpico excede a nalio dade deste guia rpido. a Funoes espec c cas para se trabalhar com entrada e sa em arquivos so descritas da a na seao 5.8. c Um manual pormenorizado de todos os procedimentos e funes providos pelo co compilador Free Pascal pode ser encontrado em: http://www2.toki.or.id/fpcdoc/ ref/refse64.html#x151-15700013.3

A.1

Abs
qualquerTipoNumerico) : qualquerTipoNumerico;

Cabealho c function abs(x :

Descrio ca Retorna o valor absoluto de x. O resultado da funao do mesmo tipo que o c e parmetro dado, que pode ser de qualquer tipo numrico. a e Exemplo
program exemploAbs ; var r : real ; i : integer ; begin r := abs ( 1.0) ; i := abs ( 21) ; end .

// r : = 1 . 0 // i :=21

A.2

ArcTan
real) : real;

Cabealho c function arctan(x :

Descrio ca Retorna o arco tangente de x, que pode ser de qualquer tipo real. O resultado dado em radianos. e Exemplo
program exemploArctan ; var

64

r : real ; begin r := a r c t a n ( 0 ) ; r := a r c t a n ( 1 ) / p i ; end .

// r := 0 // r := 0 . 2 5

A.3

Break

Cabealho c procedure break; Descrio ca Salta para a instruao seguinte ao nal do comando de repetiao corrente. Tudo c c o que estiver entre o break e o m do comando de repetiao ignorado. A c e expresso booleana do comando de repetiao no avaliada. a c a e Pode ser usado com os comandos while-do, repeat-until e for-do. Ressaltase que pode ser muito danoso ao cdigo, pois possui efeito semelhante ao goto o (ver seao 7.4); c Exemplo
program exemploBreak ; var i : longint ; begin i := 0 ; while i < 10 do begin inc ( i ) ; i f i > 5 then break ; writeln ( i ) ; end ; end .

A.4

Chr
byte) : char;

Cabealho c function chr(x :

Descrio ca Retorna o caractere correspondente ao valor x na tabela ASCII. Exemplo


program exemploChr ; begin

65

write ( c h r ( 6 5 ) ) ; end .

// E s c r e v e A

A.5

Concat
, sn]) : string;

Cabealho c function concat(s1, s2 [, s3, ...

Descrio ca Concatena as strings s1, s2, . . . , sn em uma unica string. O truncado para 255 caracteres. O mesma resultado pode ser obtido com o operador +. Exemplo
program exemploConcat ; var s : string ; begin s := c o n c a t ( Seria mais facil , com , o operador +. ) ; end .

A.6

Continue

Cabealho c procedure continue; Descrio ca Salta para o m do comando de repetio corrente. O cdigo entre continue e ca o o m do comando de repetio ignorado. ca e Pode ser usado com os comandos while-do, repeat-until e for-do. Ressaltase que pode ser muito danoso ao cdigo, pois possui efeito semelhante ao goto o (ver seao 7.4); c Exemplo
program exemploContinue ; var i : longint ; begin i := 0 ; while i < 10 do begin inc ( i ) ; i f i < 5 then continue ; writeln ( i ) ; end ; end .

66

A.7

Copy
integer;

Cabealho c function copy(const s : string; indice : quantidade : integer) : string;

Descrio ca Retorna uma string que uma cpia da quantidade de caracteres de s, inicie o ando na posio indice. Se isto ultrapassar o tamanho de s, ento o resultado ca a truncado. Se indice extrapolar os limites de s, ento uma string vazia e a e retornada. Exemplo
program exemploCopy ; var s , t : string ; begin t := 1234567 ; s := copy ( t , 1 , 2 ) ; s := copy ( t , 4 , 2 ) ; s := copy ( t , 4 , 8 ) ; end .

// s := 12 // s := 45 // s := 4567

A.8

Cos
real) : real;

Cabealho c function cos(x :

Descrio ca Retorna o cosseno de x, onde x um ngulo em radianos. e a Exemplo


program exemploCos ; var r : real ; begin r := c o s ( Pi ) ; r := c o s ( Pi / 2 ) ; r := c o s ( 0 ) ; end .

// r := 1 // r := 0 // r := 1

A.9

Dec

Cabealho c procedure dec(var x : qualquerTipoOrdinal [; decremento : qualquerTipoOrdinal]); 67

Descrio ca Decrementa de x o valor de decremento. Se decremento no for especicado, a tido como 1. e Exemplo
program exemploDec ; var i : integer ; begin i := 1 ; dec ( i ) ; // i := 0 dec ( i , 2 ) ; // i := 2 end .

A.10

Delete
string; indice : integer;

Cabealho c procedure delete(var s : quantidade : integer);

Descrio ca Remove de s a quantidade de caracteres iniciando na posiao indice. Todos c os caracteres depois daqueles deletados so trazidos para imediatamente aps o a o indice e o tamanho de s ajustado. e Exemplo
program e x e m p l o D e l e t e ; var s : string ; begin s := This is not easy ! ; d e l e t e ( s , 9 , 4 ) ; // s := This is easy ! end .

A.11

Exp
real) : real;

Cabealho c function exp(var x : Descrio ca Retorna ex .

68

Exemplo
program exemploExp ; begin writeln ( exp ( 1 ) : 8 : 2 ) ; end .

// Deve i m p r i m i r 2 . 7 2

A.12

Frac
real) : real;

Cabealho c function frac(x :

Descrio ca Retorna a parte no inteira de x. a Exemplo


program exemploFrac ; begin writeln ( f r a c ( 1 2 3 . 4 5 6 ) : 0 : 3 ) ; writeln ( f r a c ( 123.456) : 0 : 3 ) ; end .

// Imprime O. 4 5 6 } // Imprime O. 4 5 6 }

A.13

Inc

Cabealho c procedure inc(var x : qualquerTipoOrdinal [; incremento : qualquerTipoOrdinal]); Descrio ca Incrementa em x o valor de incremento. Se incremento no for especicado, a e tido como 1. Exemplo
program exemploInc ; var i : integer ; begin i := 1 ; inc ( i ) ; // i := 2 i n c ( i , 2 ) ; // i := 4 end .

69

A.14

Insert
string; var s2 : string;

Cabealho c procedure insert(const s1 : indice : integer);

Descrio ca Insere a string s1 em s2 na posio indice, empurrando todos os caracteres ca depois de indice para a direita. O resultado truncado para 255 caracteres. e Exemplo
programa e x e m p l o I n s e r t ; var s : string ; begin s := Free Pascal is difficult to use ! ; i n s e r t ( NOT , s , pos ( difficult , s ) ) ; writeln ( s ) ; end .

A.15

Int
real) : real;

Cabealho c function int(x :

Descrio ca Retorna a parte inteira de um x real. Exemplo


program e x e m p l o I n t ; begin writeln ( i n t ( 1 2 3 . 4 5 6 ) : 0 : 1 ) ; writeln ( i n t ( 123.456) : 0 : 1 ) ; end .

// Imprime 1 2 3 . 0 // Imprime 123.0

A.16

Length
string) : integer;

Cabealho c function length(s :

Descrio ca Retorna o tamanho de s, limitado a 255. Se s estiver vazio, 0 retornado. e

70

Exemplo
program exemploLength ; var s : string ; i : integer ; begin s := ; f o r i := 1 to 10 do begin s := s + * ; writeln ( l e n g t h ( S ) : 2 , : , s ) ; end ; end .

A.17

Log
real) : real;

Cabealho c function ln(x :

Descrio ca Retorna o logaritmo natural de um x positivo. Exemplo


program exemploLog ; begin writeln ( l n ( 1 ) ) ; writeln ( l n ( Eep ( 1 ) ) ) ; end .

// P r i n t s 0 // P r i n t s 1

A.18

Lowercase
charOuString) : charOuString;

Cabealho c function lowercase(c :

Descrio ca Retorna o argumento c convertido para minsculas. O retorno char ou string, u e conforme o tipo de c. Exemplo
program exemploLowercase ; var i : longint ; begin f o r i := ord ( A ) to ord ( Z ) do write ( l o w e r c a s e ( c h r ( i ) ) ) ;

71

writeln ; writeln ( l o w e r c a s e ( ABCDEFGHIJKLMNOPQRSTUVWXYZ ) ) ; end .

A.19

Odd
longint) : boolean;

Cabealho c function odd(x :

Descrio ca Retorna true se x for mpar, false caso o contrrio. a Exemplo


program ExemploOdd ; begin i f odd ( 1 ) then writeln ( Tudo certo com o 1! ) ; i f not ( odd ( 2 ) ) then Writeln ( Tudo certo com o 2! ) ; end .

A.20

Ord
qualquerTipoOrdinal) : longint;

Cabealho c function ord (x :

Descrio ca Retorna o valor ordinal (ASCII) do caractere x. A funao ord no exclusiva c a e do tipo char e pode ser utilizada em outros tipos, porm foge do escopo deste e guia. Exemplo
program t y p e c h a r ; var a , c , d : char ; b : integer ; begin // armazena 65 na v a r i a v e l a , que e q u i v a l e a A a := A ; // obtem o c o d i g o ASCII de A ( 6 5 ) e soma a 2 ( b eh um i n t e i r o ) b := ord ( A ) + 2 ; // obtem o c a r a c t e r e c o r r e s p o n d e n t e ao c o d i g o ASCII 67 ( v a l o r de c) c := c h r ( b ) ; d := #68; // Retorna a=A b=67 c=C

72

writeln ( Variaveis : a= , a , b= , b , c= , c , d= , d ) ; end .

A.21

Pi
real;

Cabealho c function pi :

Descrio ca Retorna o valor de pi (3.1415926535897932385). Exemplo


program exemploPi ; begin writeln ( p i ) ; // 3 . 1 4 1 5 9 2 6 } writeln ( s i n ( p i ) ) ; end .

A.22

Pos
string; const s : string)

Cabealho c function pos(const substring : : integer;

Descrio ca Retorna o ndice da substring em s, se esta a contiver. Caso contrrio, 0 a e retornado. A busca case-sensitive. e Exemplo
program exemploPos ; var s : string ; begin s := The first space in this sentence is at position : ; writeln ( s , pos ( , s ) ) ; s := The last letter of the alphabet doesn t appear in this sentence ; i f ( pos ( Z , s ) = 0 ) and ( pos ( z , s ) = 0 ) then writeln ( s ) ; end .

A.23

Power
real) : 73 real;

Cabealho c function power(base, expon :

Descrio ca Retorna baseexpoente . Exemplo


program exemploPower ; begin writeln ( power ( 2 , 3 ) ) ; // Deve i m p r i m i r 8 end .

A.24

Pred
qualquerTipoOrdinal) : mesmoTipo;

Cabealho c function pred(x :

Descrio ca Retorna o elemento que precede x. Exemplo


program exemploPred ; begin writeln ( pred ( 3 ) ) ; // Deve i m p r i m i r 2 end .

A.25

Random
longint)] : longIntOuReal;

Cabealho c function random [(x :

Descrio ca Retorna um nmero aleatrio maior do que 0 e menor do que x. u o Exemplo


program exemploRandom ; begin randomize ; writeln ( random ( 3 ) ) ; end .

// Imprimira 0 , 1 ou 2

A.26

Randomize

Cabealho c procedure randomize;

74

Descrio ca Inicializa o gerador de nmeros aleatrios do Pascal, garantindo que a seqncia u o ue de nmeros gerados mude a cada execuao. u c Exemplo Vide funao anterior. c

A.27

Round
real) : longint;

Cabealho c function round(x :

Descrio ca Arredonda o real x para o inteiro mais prximo. o Exemplo


program exemploRound ; begin writeln ( round ( 1 2 3 4 . 5 6 ) ) ; end .

// Imprime 1235

A.28

Sin
real) : real;

Cabealho c function sin(x :

Descrio ca Retorna o seno de x, onde x um ngulo em radianos. e a Exemplo


program exemploSin ; var r : real ; begin r := s i n ( Pi ) ; r := s i n ( Pi / 2 ) ; end .

// r := 0 // r := 1

A.29

Sqr
real) : real;

Cabealho c function sqr(x :

Descrio ca Retorna o quadrado de x. 75

Exemplo
program exemploSqr ; var i : Integer ; begin f o r i :=1 to 10 do writeln ( s q r ( i ) : 3 ) ; end .

A.30

Sqrt
real) : real;

Cabealho c function sqrt(x :

Descrio ca Retorna a raiz quadrada de um x positivo. Exemplo


program exemploSqrt ; var i : Integer ; begin writeln ( s q r t ( 4 ) : 0 : 3 ) ; writeln ( s q r t ( 2 ) : 0 : 3 ) ; end .

// Imprime 2 . 0 0 0 // Imprime 1 . 4 1 4

A.31

Succ
qualquerTipoOrdinal) : mesmoTipo;

Cabealho c function succ(x :

Descrio ca Retorna o elemento que sucede x. Exemplo


program exemploSucc ; begin writeln ( pred ( 3 ) ) ; // Deve i m p r i m i r 4 end .

76

A.32

Trunc
real) : longint;

Cabealho c function trunc(x :

Descrio ca Trunca o real x. O resultado sempre ser igual ou menor ao valor original. a Exemplo
program exemploRound ; begin writeln ( t r u n c ( 1 2 3 4 . 5 6 ) ) ; end .

// Imprime 1234

A.33

Upcase
charOuString) : charOuString;

Cabealho c function upcase(c :

Descrio ca Retorna o argumento c convertido para maisculas. O retorno char ou string, u e conforme o tipo de c. Exemplo
program exemploUpcase ; begin writeln ( u p c a s e ( abcdefghijklmnopqrstuvwxyz ) ) ; end .

A.34

Val
string; var v; var codigo : word);

Cabealho c procedure val (const s :

Descrio ca Converte o valor representado em s para um valor numrico e armazena este e contedo na varivel v, que pode ser dos tipos longint, real ou byte. Caso u a a converso no seja bem-sucedida, o parmetro codigo conter o a a a a ndice do caractere de s que impossibilitou a converso. Admite-se espaos no in de s. a c cio

77

Exemplo
programa exemploVal var i , c o d i g o : integer ; begin v a l ( 2012 , i , c o d i g o ) ; i f ( c o d i g o <> 0 ) then writeln ( Erro na posicao , c o d i g o , . ) else writeln ( Valor : , i ) ; end .

78

Você também pode gostar