You are on page 1of 78

Guia r apido de refer encia da linguagem Pascal Vers ao Free Pascal

Marcos Castilho Everaldo Gomes Loirto Alves dos Santos Eleandro Maschio Krynski Jos e Ivan Gon calves J unior Rene Kultz Marcos Castilho

Vers ao 0.2 Dezembro de 2009

Este texto est a em constru c ao. A vers ao atual pode ser encontrada em: http://www.inf.ufpr.br/cursos/ci055.

Sum ario
1 Introdu c ao 2 Breve hist orico da linguagem 3 O compilador Pascal 3.1 Obtendo o compilador . . . . . . . . 3.2 Editando um programa-fonte . . . . . 3.3 Compilando . . . . . . . . . . . . . . 3.4 Exemplo de intera ca o com a m aquina 3.5 Erros de compila c ao . . . . . . . . . 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 Cabe calho (ou pre ambulo) . . . . . . . . . . . . . . . . 4.1.1 Se c ao de declara ca o de r otulos . . . . . . . . . . 4.1.2 Se c ao de declara ca o de constantes . . . . . . . . 4.1.3 Se c ao de declara ca o de tipos . . . . . . . . . . . 4.1.4 Se c ao de declara ca o de vari aveis globais . . . . . 4.1.5 Se c ao de declara ca o de procedimentos e fun c oes 4.2 Programa principal . . . . . . . . . . . . . . . . . . . . 5 Elementos b asicos 5.1 S mbolos . . . . . . . . . . . . . . . . . . . 5.2 Palavras reservadas . . . . . . . . . . . . . 5.3 Coment arios . . . . . . . . . . . . . . . . . 5.4 Identicadores . . . . . . . . . . . . . . . . 5.5 Tipos de dados em Pascal . . . . . . . . . 5.5.1 A fam lia de tipos ordinal . . . . . 5.5.2 Tipo enumer avel . . . . . . . . . . 5.5.3 Tipo sub-faixa . . . . . . . . . . . . 5.5.4 A fam lia de tipos real . . . . . . . 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 Express oes l ogicas, aritm eticas e 6.1 Express oes aritm eticas . . . . . 6.1.1 Exemplos . . . . . . . . 6.1.2 Ordem de preced encia . 6.2 Express oes l ogicas . . . . . . . . 6.2.1 Exemplos . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

6.2.2

Ordem de preced encia . . . . . . . . . . . . . . . . . . . . . . . 39 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 atribui ca o . . . . . . . . . . . . . . . . . . . . . . . 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 repeti c ao . . . . . . . . . . . . . . . . . . . . . . . 7.6.1 Repeti c ao condicional com teste no in cio (while-do) . . 7.6.2 Repeti c ao condicional com teste no nal (repeat-until) 7.6.3 Repeti c ao por enumera ca o (for-do) . . . . . . . . . . . . 7.7 Delimitadores de bloco . . . . . . . . . . . . . . . . . . . . . . . 8 Legibilidade do c odigo 8.1 Espa cos e linhas em branco s ao ignorados . . . . 8.2 N ao h a distin ca o entre mai usculas e min usculas 8.3 Coment arios . . . . . . . . . . . . . . . . . . . . 8.4 Identa c ao ou alinhamento de c odigo por colunas 8.5 Realce de sintaxe . . . . . . . . . . . . . . . . . 8.6 Simplicidade e clareza . . . . . . . . . . . . . . 8.7 Nomes dos identicadores . . . . . . . . . . . . A Fun c oes e procedimentos 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

Introdu c ao

Este texto e um material complementar a ` disciplina CI055 - Algoritmos e Estruturas de Dados I, ministrada no curso de Bacharelado em Ci encia da Computa ca o da Universidade Federal do Paran a. O presente documento foi concebido com a nalidade de servir como um guia r apido de refer encia da linguagem Pascal, vers ao Free Pascal, destinado ao estudante no in cio do curso. Portanto, n ao dispensa o acompanhamento de material did atico apropriado para o aprendizado de algoritmos. Denitivamente, este material n ao constitui por si s o um curso de programa c ao em Pascal. Desta forma, recomenda-se consulta a ` farta literatura que apresenta em profundidade aspectos sem anticos dos elementos da linguagem aqui abordados. Os estudantes s ao encorajados a ter por costume buscar outras fontes e conquistar autonomia para enfrentar situa co es das mais diversas em programa c ao de computadores. O material did atico prim ario do curso e indicado na p agina ocial da disciplina1 e inclui notas de aula2 , bem como demais refer encias bibliogr acas pertinentes. Algumas das principais refer encias s ao: [Wir78], [VC07], [Car82],[Gui]. A documenta ca o completa da linguagem pode ser encontrada juntamente com o compilador escolhido para este curso3 (Free Pascal ). Sup oe-se que os estudantes tenham contato e estudem minimamente: Guia de refer encia da linguagem: e uma refer encia para a linguagem Pascal tal como implementada pelo citado compilador. Descreve as constru co es permitidas e lista os tipos de dados suportados. N ao e um tutorial. Guia do programador: descreve as peculiaridades do compilador Free Pascal e prov e uma vis ao de como o compilador gera o c odigo e de como o programador pode modicar este c odigo. Guia do usu ario: descreve o processo de instala c ao e uso do compilador Free Pascal nas diferentes plataformas suportadas. Guia das bibliotecas: descreve as bibliotecas auxiliares que n ao est ao dispon veis na vers ao b asica do compilador. Serve para problemas que envolvem, por exemplo, bibliotecas gr acas, fun co es matem aticas complicadas, e uma s erie de outras possibilidades. Aprenda Pascal : tutorial bastante did atico, com exemplos e escrito em ingl es de 4 f acil compreens ao . Altamente recomendado. O manual presente foi idealizado como um guia r apido, em portugu es, para o material citado. A p agina ocial da disciplina, anteriormente mencionada, det em contatos atualizados para a notica ca o de poss veis erros, assim como para o recebimento de cr ticas e sugest oes acerca deste guia.
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 hist orico da linguagem

A linguagem Pascal foi desenvolvida em 1968 pelo professor Niklaus Wirth, do Instituto de inform atica da ETH (Eidgen ossische Technische Hochschule ), em Zurique, Su ca. Sua denomina ca o e uma homenagem a Blaise Pascal (1623-1662), matem atico e l osofo franc es que inventou a primeira calculadora mec anica. Foi baseada em algumas linguagens estruturadas existentes at e ent ao, como o ALGOL e PL/I. O desejo de Wirth era dispor, para o ensino de programa ca o, de uma nova linguagem que fosse simples, coerente e capaz de incentivar a confec ca o de programas claros e facilmente leg veis, favorecendo a utiliza ca o de boas t ecnicas de programa ca o. Al em disso, a linguagem deveria ser de f acil implementa ca o, ou seja, os compiladores precisariam ser compactos, ecientes e econ omicos [FBF+ 86]. O Pascal somente ganhou popularidade quando foi adotado pela Universidade da Calif ornia (San Diego) em 1973. No mesmo per odo, em seus cursos, tamb em foram feitas implementa co es de compiladores para mini e microcomputadores [Rin92]. Na d ecada de 80, come cou a ser utilizada para prop ositos comerciais com o lan camento 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 padr oes Standard Pascal e Advanced Pascal. Embora n ao tenha sido a primeira linguagem a incorporar os conceitos de Programa ca o Estruturada, o Pascal e considerado um marco na evolu c ao das linguagens de programa ca o, devido a v arias inova c oes introduzidas na epoca, tais como a cria c ao de novos tipos, a estrutura ca o de dados, a aloca ca o din amica de vari aveis com o aux lio de ponteiros, a declara ca o de identicadores para constantes, a utiliza c ao de procedimentos que l eem e escrevem campos individuais em vez de registros completos, o uso de fun co es e procedimentos recursivos, entre outras.

O compilador Pascal

C odigo-fonte e um conjunto de palavras ou s mbolos escritos de maneira ordenada, contendo instru co es em uma linguagem de programa ca o conhecida. Normalmente, o c odigo-fonte e escrito em uma linguagem de alto-n vel, ou seja, com grande capacidade de abstra c ao. O compilador e um programa que traduz um c odigo-fonte escrito em uma linguagem de alto-n vel em um programa de baixo-n vel, ou seja, um programa que seja formado por um conjunto de instru co es a serem realizadas pelo processador. O processo de compila ca o ocorre em duas etapas: An alise sint atica de um c odigo fonte, segundo as regras gramaticais da linguagem escolhida; Gera ca o do programa execut avel semanticamente equivalente. Este guia abrange a primeira parte, isto e, cont em material que explica como escrever programas sintaticamente corretos. A gera c ao do c odigo-execut avel, por sua vez, e dependente de plataforma e de sistema operacional e foge do prop osito deste documento. Existem v arios compiladores dispon veis para a linguagem Pascal. Alguns deles s ao sens veis ` a plataforma. No contexto deste manual e da disciplina correlata, foi adotado o compilador Free Pascal por, basicamente, por dois motivos: software livre; E fornecido para diversas plataformas, incluindo o Linux. E absolutamente fundamental que os leitores deste material consultem o guia de E refer encia da linguagem Pascal para o compilador Free Pascal, a m de obter uma completa explica ca o de todas as regras para esta vers ao da linguagem. Este guia foi criado com o intuito de ser uma primeira refer encia a esta linguagem. Quando forem apresentados exemplos de programas sendo compilados, ser ao feitos para a vers ao em Linux. Conforme antedito, h a muito material sobre outros compiladores para a linguagem. O leitor e encorajado a n ao se limitar ao corrente guia.

3.1

Obtendo o compilador

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

http://www.freepascal.org

Caso queira, o usu ario pode instalar todo o ambiente de desenvolvimento dispon vel em uma fam lia de pacotes, incluindo a documenta ca o, atrav es do seguinte comando: $ apt-get install fp-docs fpc lazarus O Lazarus e um ambiente de desenvolvimento e pode ser usado alternativamente ao editor de texto. Todavia, este material e escrito para aqueles que usam editores de 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 v arios editores, tais como o vi, o emacs, o gedit e o joe. Ainda h a a op ca o de usar outro editor ASCII de sua prefer encia, incluindo o dispon 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 hip otese utilize editores das suites de escrit orio, pois estes inserem caracteres n ao-ASCII que o compilador n ao conhece. Al em disso, os compiladores geralmente n ao sabem lidar com acentua ca o, negrito, it alico, entre outras formata c oes. Ent ao, aceite o fato, escreva em ASCII puro.

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 c odigo-fonte, ap os compilado e executado, produzir a na tela a mensagem Alo mamae!. Para compilar, abra um shell e digite: $ fpc alomamae.pas Este comando produziu em seu diret orio de trabalho um arquivo bin ario de nome alomamae. Para execut a-lo, fa ca o seguinte: $ ./alomamae e aparecer a na tela a mensagem de sa da do programa. Na seq u encia deste material, ser a explicado como construir programas-fontes sint atica e semanticamente corretos, que podem ser compilados sem gerarem erros de compila ca o. 9

3.4

Exemplo de intera c ao com a m aquina para compilar

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

Este comando mostra que no diret orio de trabalho existe um arquivo de nome alomamae.pas que foi criado a `s 11h18min do dia 4 de agosto de 2009. Este arquivo e de propriedade do usu ario marcos, que pertence ao grupo c3sl. O arquivo pode ser lido por qualquer usu ario, mas pode ser alterado apenas pelo dono. Como u ltima informa ca o, ele ocupa 60 bytes de disco. $> 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 vers ao e autoria, fundamentalmente informando que compilou as 6 linhas do programa 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, a `s 11h28 minutos do dia 4 de agosto de 2009, foram criados, pelo compilador, dois arquivos novos: alomamae e alomamae.o. O primeiro e um arquivo execut avel ocupando 114.400 bytes em disco, o segundo e um arquivo tempor ario utilizado pelo compilador durante o processo de gera ca o de c odigo. O leitor deste material n ao deve se preocupar com este arquivo no momento. $> ./alomamae Alo mamae! $> Finalmente, foi executado o programa e vemos a sa da, conforme esperado. Tentar executar o arquivo-fonte produziria o seguinte erro: $> ./alomamae.pas bash: ./alomamae.pas: Permiss~ ao negada $> Isto ocorre porque o c odigo-fonte n ao e, como explicado, um arquivo execut avel, ele apenas cont em as instru co es que servem para que o compilador gere o programa de fato. 10

3.5

Erros de compila c ao

Caso o programa-fonte n ao respeite as regras gramaticais da linguagem (aqui, Pascal ), 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 compila ca o, ap os ler a palavra reservada program e o identicador alomamae, o compilador esperava encontrar o s mbolo ;. Ao inv es disso, encontrou na linha 3, coluna 1, o s mbolo begin. Como resultado deste erro, n ao foi gerado o programa execut avel. Na verdade, o compilador e incapaz de dizer, com absoluto acerto, o local exato 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 c opia deste programa-fonte e que explore o compilador para come car a compreender as mensagens de erro e a procurar corrigi-los. Experimente, por exemplo, as seguintes altera co es: escreva program errado, por exemplo, pogram; escreva writeln errado, por exemplo, writenl; apague o ponto nal ap os o end na u ltima linha; esque ca de abrir ou de fechar as aspas da mensagem; esque ca de abrir ou de fechar os par enteses; escreva alomam ae com til na linha 1. Fa ca uma altera ca o por vez e observe quais mensagens de erro ser ao retornadas pelo compilador. 11

Estrutura de um programa-fonte em Pascal

O c odigo-fonte de um programa em Pascal deve ser estruturado de maneira que respeite a gram atica formalizada para esta linguagem. Com isto, o compilador pode transformar o programa-fonte em um c odigo-execut avel. Um programa em Pascal consiste de dois blocos: o cabe calho e o programa principal. A gura abaixo ilustra a estrutura b asica de um programa. Os textos que aparecem entre os s mbolos < e > n ao s ao parte do programa, mas estruturas que ser ao detalhadas mais a ` frente neste documento. Igualmente, os textos que aparecem entre os s mbolos (* e *) constituem coment arios no c odigo e s ao explicados na se ca o 5.3.
( 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 e o texto que aparece entre as palavras reservadas (ver se c ao 5.2) begin e end. O programa termina com um ponto nal6 . O cabe calho e tudo o que aparece a partir da palavra reservada program at e o que vai imediatamente antes do begin do programa principal. O cabe calho n ao constitui c odigo execut avel, mas cont em informa co es necess arias para o processo de compila c ao, bem como c odigos para subprogramas (ver se c ao 4.1.5) que podem ser ativados por algum comando no programa principal. Cada t opico ser a explicado no decorrer desta se ca o.

4.1

Cabe calho (ou pre ambulo)

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

Nas ilustra c oes deste texto, as palavras reservadas aparecem em negrito

12

de ponto-e-v rgula (;). No cabe calho tamb em deve-se especicar, se necess ario: 1. Os r otulos para comandos de desvio incondicional, se algum tiver sido usado; 2. As constantes, se alguma foi usada no programa; 3. Os tipos denidos pelo usu ario, se algum foi necess ario; 4. As vari aveis globais usadas no programa; 5. Os c odigos dos subprogramas eventualmente usados pelo programa. As declara c oes devem ser inseridas nesta ordem, embora n ao seja obrigat orio que se usem todas estas declara co es. A seguir, ser a explicada como e a sintaxe de cada uma. 4.1.1 Se c ao de declara c ao de r otulos

Um r otulo (label ) e um nome para uma localiza ca o no c odigo-fonte para o qual o uxo de execu ca o do programa pode ser direcionado de outra localiza c ao pelo uso de um comando goto. Os r otulos podem ser seq u encia de d gitos ou identicadores. Logo, os r otulos s ao apenas necess arios quando se usa um ou mais comandos de desvio incondicional (goto, ver se c ao 7.4). Exemplo:
l a b e l a l o , 1 0 0 , FIM ;

4.1.2

Se c ao de declara c ao de constantes

Constantes s ao u teis quando o programador precisa se referir a informa co es que n ao se alteram durante o programa, ou seja, s ao est aticas. Contrastam, portanto, com as vari aveis, que permitem reatribui c ao de valores. A declara c ao e feita atrav es da palavra reservada const. Nesta se c ao do programa, cada constante nova e declarada por um nome de identicador, ainda n ao utilizado, seguido do s mbolo igual (=) e sucedida pela constante num erica ou alfanum erica desejada, sempre terminando com um ponto-e-v rgula (;). Usualmente, os nomes de constantes s ao escritos em letras mai usculas para contrastarem com os nomes de vari aveis. 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

Se c ao de declara c ao de tipos

Em Pascal, toda vari avel (ver se ca o 4.1.4) possui um tipo. Isto e relacionado com a maneira como o computador vai interpretar a seq u encia de bits no endere co de mem oria acessado. Na linguagem Pascal existem alguns tipos pr e-denidos (ver se ca o 5.5). Aqui, contudo, o programador pode declarar seus pr oprios tipos de dados. Assim, um identicador pode ser usado para denotar este novo tipo ao se declarar vari aveis no c odigo-fonte. A declara c ao e feita tendo como in cio a palavra reservada type. Segue ent ao uma lista contendo um novo identicador, um s mbolo de igual (=) e a deni ca o do novo tipo baseada em tipos pr e-existentes. Finalmente um s mbolo de ponto-e-v rgula (;). Abaixo h a alguns exemplos de como se declarar novos tipos. 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

Se c ao de declara c ao de vari aveis globais

Em Pascal, toda vari avel global (ver se c ao 4.1.4) deve ser declarada. Assim, o compilador passa a conhecer aquele nome e tamb em reserva espa co de mem oria para o conte udo da vari avel. Adicionalmente, a declara c ao propicia que o compilador possa interpretar corretamente o mapeamento entre o formato bin ario da m aquina, correspondente ao espa co de mem oria alocado, e a maneira como estes bits ser ao manipulados em opera c oes, comandos de leitura ou de impress ao. Vari aveis s ao declaradas atrav es da palavra reservada var. Nesta se ca o do programa, cada nova vari avel (ou lista de vari aveis separadas por v rgula) e declarada por um novo nome de identicador seguido do s mbolo de dois pontos (:) e sucedido pelo nome do tipo da vari avel, seja um tipo pr e-denido pelo compilador ou um novo tipo denido pelo programador (conforme explicado na se ca o 4.1.3). Como sempre, todo comando em Pascal deve ser terminado por um ponto-e-v rgula (;). A diferen ca entre vari aveis globais ou locais ser a caracterizada na se ca o 4.1.5. 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

Se c ao de declara c ao de procedimentos e fun co es

Procedimentos e fun c oes s ao formas de escrever subprogramas na linguagem Pascal. Estes c odigos s o s ao executados quando ativados no programa principal. Assim e feita a declara c ao de um procedimento:
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 fun ca o, por sua vez, e declarada desta forma:


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 s ao reservadas. O corpo de um procedimento ou de uma fun ca o e constitu do por comandos da mesma maneira que o programa principal (ver se ca o 4.2), com a diferen ca de que, nos subprogramas, os comandos s o s ao executados quando o procedimento ou a fun c ao tiverem sido invocados no programa principal. O cabe calho de um procedimento ou de uma fun ca o e constitu do da mesma maneira que o cabe calho do programa principal. Isto e, permite a declara ca o de constantes, de vari aveis ou de tipos. A diferen ca reside no fato de que, tais elementos, possuem abrang encia (escopo) local e n ao est ao acess veis a outros subprogramas ou ao programa principal. Uma vari avel declarada em um subprograma existe somente durante a execu ca o deste. Pode, inclusive, ter o mesmo nome de um identicador previamente usado, seja em outro subprograma, seja at e no programa principal. A lista de par ametros e uma seq u encia (que pode ser vazia) de nomes de identicadores, 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 par ametros s ao argumentos repassados ao procedimento ou a ` fun c ao em foco. O retorno, caracter stica espec ca de fun co es, tem o respectivo tipo denido ap os a lista de par ametros, precedido por dois pontos (:). O valor de retorno e especicado atrav es de uma atribui c ao ao identicador da fun c ao, como se este fosse uma vari avel do tipo denido como retorno. 15

O compilador n ao aceita tipos estruturados como par ametro ou como retorno de subprogramas, a menos que estes tenham sido previamente denidos pelo programador na se ca o de declara ca o de tipos. A linha que cont em o cabe calho do procedimento ou fun c ao dene a assinatura ou prot otipo do subprograma, isto e, estabelece o nome, os par ametros com respectivos tipos e, no caso das fun co es, o tipo de retorno. Os par ametros podem ser passados de duas maneiras, tanto para procedimentos quanto para fun co es: por valor ou por refer encia. Na assinatura do subprograma, a diferen ca e que os par ametros passados por refer encia levam a palavra var antes da lista de par ametros. Os par ametros passados por valor recebem uma c opia dos valores das vari aveis usadas como argumento na chamada do subprograma. Os par ametros passados por refer encia remetem, na verdade, a ` pr opria vari avel; que sofrer a todas as altera co es realizadas. Os subprogramas s ao invocados ou no programa principal ou por outro subprograma da seguinte maneira: Os procedimentos s ao invocados pelo seu nome e lista de argumentos, da mesma maneira como se invocaria um comando qualquer da linguagem, garantindo-se o n umero de par ametros da assinatura do subprograma e os respectivos tipos; As fun co es s ao invocadas tamb em por seu nome e lista de argumentos, contudo a invoca c ao deve ser feita onde se espere um valor do mesmo tipo que o retorno da fun ca o vir a a fornecer. Assim, se determinada fun ca o retornar um valor real, pode-se invoc a-la em qualquer lugar onde se admita um valor real. importante observar que o compilador faz a checagem do n E umero de par ametros e respectivos tipos da lista de argumentos do cabe calho do subprograma com os mesmos itens da ativa ca o deste. Caso o n umero de argumento, a ordem, ou os tipos n ao compatibilizem, o compilador acusa erro. Exemplos: Neste primeiro exemplo, o procedimento aloMamae e ativado pelo programa principal.
program umProcedimento ; procedure aloMamae ; begin writeln ; writeln ( Alo Mamae !!! ) ; writeln ; end ; begin aloMamae ; end .

Aqui, faz-se a chamada do procedimento perfil. S ao passados como par ametro o nome, a idade e o peso do indiv duo. Embora, as vari aveis globais sejam denominadas 16

n, i e p, elas poderiam perfeitamente se chamarem nome, idade e peso, visto que as vari aveis do procedimento perfil t em escopo local.
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 par ametros s ao agrupados por tipo no cabe calho.
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 e mostrado como se faz a passagem de par ametro por refer encia em um procedimento. Para fun co es, a sintaxe tamb em e v alida.
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 exp oe um procedimento recursivo que conta de um inteiro n at e zero.


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 par ametro.
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 par ametro e o retorno de uma fun ca o que recebe duas notas inteiras e devolve a m edia anual (um valor real) 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 fun c ao recursiva que retorna o n- ezimo elemento da s erie de Fibonacci.
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 ( n 1) + f i b o n a c c i ( n 2) ; end ;

4.2

Programa principal

O trecho demarcado como programa principal e onde, efetivamente, e escrito o programa na linguagem Pascal. Qualquer subprograma (procedimento ou fun c ao, tratados na se ca o 4.1.5) s o e executado quando chamado primariamente a partir do programa principal. O programa principal e constitu do de comandos seq uenciais (ver se ca o 7) que s ao executados iniciando da instru ca o begin at e que seja encontrada a instru ca o end e o ponto nal do programa. A execu ca o dos comandos contidos no programa principal e feita de cima para baixo e da esquerda para a direita, ignorando-se os espa cos em branco e as linhas vazias. Este comportamento s o se altera quando utilizados comandos que manipulem o uxo natural de execu ca o do programa, conforme explicado na se ca o 7. O pr oxima cap tulo cont em mais instru co es sobre os elementos b asicos da linguagem Pascal.

19

Elementos b asicos

Neste cap tulo, discutem-se os elementos b asicos que comp oem a linguagem Pascal. Em primeiro lugar, s ao apresentados os s mbolos e as palavras reservadas usados na constru ca o de um c odigo-fonte (se co es 5.1 e 5.2, respectivamente). Na se ca o 5.3, s ao discutidas as alternativas para a inser ca o de coment arios no c odigo-fonte. A se c ao 5.4 trata da cria c ao de identicadores v alidos para a linguagem Pascal. A partir da se c ao 5.5, s ao apresentados os tipos de dados utilizados em Pascal. S ao elencados desde os tipos b asicos, como o inteiro e o caractere, at e aqueles mais complexos, como os que s ao voltados a ` constru c ao de estruturas de dados.

5.1

S mbolos

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

5.2

Palavras reservadas

Palavras reservadas s ao componentes da pr opria linguagem Pascal e n ao podem ser redenidas, ou seja, denominar elementos criados pelo programador. Por exemplo, begin, palavra reservada que indica o in cio de um bloco de c odigo, n ao pode ser nome r otulos, constantes, tipos ou quaisquer outros identicadores no programa. O compilador Pascal n ao faz distin ca o entre mai usculas e min usculas. Assim, tanto identicadores quando palavras reservadas podem ser grafados com varia c oes de mai usculas e min usculas sem altera ca o de signicado: begin, BEGIN, Begin ou BeGiN. Conforme o guia de refer encia da linguagem Free Pascal, vers ao de dezembro de 2008, as palavras reservadas s ao divididas em tr es grupos. O primeiro cont em 7 as palavras reservadas para a vers ao do Turbo Pascal . O segundo compreende as palavras reservadas do Delphi, e o u ltimo encerra as do Free Pascal.
7

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

20

Esta diferen ca existe porque no Turbo Pascal as palavras do Delphi n ao s ao reservadas. 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 S ao palavras reservadas do Delphi : 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

Aten c ao: as palavras reservadas variam conforme o compilador utilizado. Portanto, e indispens avel consultar o guia de refer encia para a vers ao do compilador que tenha em m aos. 21

5.3

Coment arios

Os coment arios s ao colocados no arquivo-fonte para ajudar a entender o que determinado bloco de c odigo faz. Coment arios n ao s ao interpretados pelo compilador. O Free Pascal suporta tr es tipos de coment arios. Dois destes j a eram utilizados por compiladores Pascal antigos; um terceiro vem da linguagem C). A seguir, uma lista de coment arios v alidos:
( 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 e pode colocar coment arios dentro de coment arios, com a condi ca o de que os tipos de coment arios sejam diferentes. Exemplos:
( 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 s ao utilizados para denominar programas, r otulos, constantes, vari aveis, tipos, procedimentos, fun c oes e units criados pelo programador. S ao regras, em Pascal para se constituir corretamente um identicador: 1. Um identicador n ao pode ser igual a uma palavra reservada; 2. Um identicador deve ter no m aximo 255 caracteres; 3. Os s mbolos que constituem um identicador podem ser: 22

letras: A at e Z ou a at e z; d gitos: 0 at e 9; um sublinhado: . 4. O primeiro s mbolo deve ser uma letra ou o sublinhado. Assim, n ao s ao aceitos espa cos ou caracteres especiais em qualquer parte de um identicador. At e mesmo o cedilha ( c) e considerado um caractere especial. S ao exemplos de identicadores v alidos: 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 inv alidos: 12porcento, 4por4: iniciam por n umero; cor veiculo: cont em espa co em branco; pre co: possui um caracter inv alido (cedilha); p assaro: apresenta acentua ca o; ao inicia por letra ou por sublinhado. %b54 : n Observa co es: N ao se pode declarar uma vari avel com o mesmo nome que foi atribu do ao programa ou a qualquer outro identicador previamente declarado no mesmo escopo8 ; Como o compilador Pascal ignora o estado de mai usculas e min usculas, os identicadores podem ser grafados de maneiras diferentes e ter o mesmo signicado, como por exemplo: saldo, SALDO, Saldo ou SaLdO.
8

Para informa c oes sobre escopo, veja a se c ao 4.1.5)

23

5.5

Tipos de dados em Pascal

A linguagem Pascal e, por deni ca o, uma linguagem fortemente tipada. Ser tipada signica que as vari aveis e constantes possuem um tipo precisamente denido, isto e, o compilador deve conhecer detalhes de quantidade de bytes para seu armazenamento e o formato de convers ao decimal/bin ario. J a, uma linguagem dita fortemente tipada, com raras exce co es, n ao permite que tipos sejam misturados. Tal ocorr encia provoca erro de compila c ao ou at e mesmo durante a execu ca o do programa. Na se ca o 4.1.3 mostrou-se que e poss vel declarar novos tipos sob demanda do programador. Na presente se ca o, ser ao enumerados todos os tipos considerados b asicos para o compilador Free Pascal. Conv em lembrar que isto pode mudar de um compilador para outro. Logo, procure sempre informa co es atualizadas para a vers ao do compilador que tem em uso. Os tipos que interessam para a disciplina introdut oria de programa ca o s ao os seguintes: a fam lia de tipos ordinal; a fam lia de tipos real; boolean (booleano); char (caractere); string (cadeia de caracteres); array (matriz); record (registro); file (arquivo). Contudo, e importante observar que para n veis avan cados de programa ca o existem outros tipos pr e-denidos na linguagem. Consultar o guia de refer encia para maiores informa co es. 5.5.1 A fam lia de tipos ordinal

Os tipos ordinais representam n umeros conhecidos em linguagem informal como sendo os tipos inteiros. Segundo o guia de refer encia da linguagem, em sua vers ao de dezembro de 2008, tem-se que, com exce ca o do int64, qword e dos tipos reais, todos os tipos b asicos s ao do tipo ordinal. Conservam as seguintes caracter sticas: 1. S ao enumer aveis e ordenados, ou seja, e poss vel iniciar uma contagem de um por um destes n umeros em uma ordem espec ca. Esta propriedade implica que as opera c oes de incremento, decremento e ordem funcionam; 24

2. Existem menores e maiores valores poss veis. A seguir e relacionada uma lista com os tipos inteiros e respectivas faixas de valores. O programador deve escolher o tipo mais conveniente a ` representa c ao da vari avel, pois a diferen ca b asica entre eles e a quantidade de bytes usada em mem oria e o fato de necessitar que n umeros negativos sejam representados. Para um estudante de Ci encia da Computa ca o, a diferen ca est a na interpreta ca o do n umero em bin ario, se est a em complemento de 2 ou em bin ario puro. 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

Fun c oes predenidas relacionadas: abs, chr, dec, inc, int, odd, ord, power, pred, random, randomize, round, succ, trunc e val. Vide anexo A. 5.5.2 Tipo enumer avel

Os tipos enumer aveis s ao denidos pelo programador. Possuem uma certa seq u encia de poss veis valores ordinais que as vari aveis daquele tipo poder ao assumir. 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 da de n umeros ou letras. 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 lia de tipos real

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 endere co de mem oria e na representa ca o de sinais, seja no expoente ou na mantissa. Abaixo apresenta-se uma lista com os tipos reais e suas faixas de valores, conforme o guia de refer encia em sua vers ao de dezembro de 2008. 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 exce co es da checagem de tipo da linguagem, pois uma vari avel do tipo real pode receber a soma de um real com um inteiro. Neste caso,
Apesar de estarmos no Brasil, em Pascal os n umeros em ponto utuante s ao escritos com um ponto, n ao com v rgula.
9

26

antes da opera c ao, o computador faz a convers ao do inteiro para um formato em ponto 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 .

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

O boolean (booleano) e um tipo l ogico que assume apenas um entre dois poss 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 vari avel booleana, esta ser a verdadeira. 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 vari aveis ou constantes do tipo boolean s ao elementos fundamentais na deni ca o e entendimento de express oes booleanas, que ser ao apresentadas na se ca o 6.2.

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 mem oria. Na realidade, n ao e o caractere que e armazenado na mem oria, mas o c odigo ASCII correspondente. O c odigo ASCII do caractere A, por exemplo, e 65. Ent ao, se for atribu do A a uma vari avel do tipo caractere, na verdade ser a atribu do o valor 65 para esta vari avel. Pode-se atribuir diretamente o valor ASCII a uma vari avel caractere inserindo-se o sustenido na frente do n umero correspondente (por exemplo, a := #65). 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 se ca o 7.5.3). Fun c oes predenidas relacionadas: chr, lowercase, ord e upcase. Vide anexo A. 5.5.7 Tipo string (cadeia de caracteres)

O tipo string e utilizado para armazenar palavras, isto e, seq u encias de s mbolos ASCII. Em Pascal, as palavras, assim como o tipo char, devem estar entre ap ostrofos (aspas simples). Pode-se concatenar strings e caracteres usando o operador de adi ca o (+). 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 !

Fun c oes predenidas relacionadas: concat, copy, delete, insert, length, lowercase, pos, upcase e val. Vide anexo A.

5.6

Tipo array (matriz)

Em sua forma elementar, o tipo array e utilizado para armazenar, sob um mesmo nome de vari avel, uma quantidade xa de elementos do mesmo tipo. Por isto, o tipo array tamb em e conhecido como um arranjo homog eneo. Para formas de uso mais complexas recomendamos a leitura do guia de refer encia da linguagem Pascal. A declara ca o de uma vari avel do tipo array e feita assim:
array [ < l i s t a de t i p o s enumeraveis > ] of < t i p o >

onde <tipo> e qualquer tipo previamente denido pelo programador ou pr e-denido pela linguagem, e <lista de tipos enumeraveis> e uma lista de faixas de n umeros separadas por v rgula. Por restri c ao dos tipos enumer aveis, os valores devem ser do tipo ordinal e conhecidos em tempo de compila ca o. Os casos mais comuns de matrizes s ao de uma e de duas dimens oes, embora possam ser declaradas com dimens oes maiores. As de uma u nica dimens ao s ao costumeiramente denominadas vetores, as de duas dimens oes s ao chamadas de matrizes 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 . .MAX 1] 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 . .MAX 1,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 conte udo de um vetor deve-se usar o nome da vari avel e um

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 enumer avel gera erro de execu ca o no programa. O compilador n ao aceita que se passe o tipo array como par ametro em fun co es e 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 e uma forma especial de array de caracteres (char). Suponha uma palavra com 10 letras. Signica que esta string cont em 10 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 e usado para aglomerar sob um mesmo nome de vari avel uma cole ca o de outras vari aveis de tipos potencialmente diferentes. Por isto e uma estrutura heterog enea, contrariamente ao tipo array que e homog eneo. A sintaxe para se usar uma vari avel do tipo record e a seguinte:

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> e um identicador e <tipo i> e um tipo qualquer da linguagem ou 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 e boa pol tica declarar um tipo para o record, como e mostrado a 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 e usado basicamente para armazenamento de dados em mem oria secund aria. Contudo, e poss vel tamb em se utilizar deste tipo para grava ca o na mem oria principal. Desta forma, o tamanho que os arquivos podem ocupar dependem basicamente do espa co livre em disco ou em RAM. Um arquivo e declarado da seguinte maneira: 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 pr oprio tipo file. poss E vel n ao se informar o tipo do arquivo, o que resulta em um arquivo sem tipo. Segundo o guia de refer encia, isto e equivalente a um arquivo de bytes. Para se usar uma vari avel do tipo arquivo, alguns comandos s ao necess arios: assign associa o nome da vari avel (interno ao programa) a um nome de arquivo (em disco, por exemplo). O nome do arquivo e dependente do sistema operacional; 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) e usado para armazenar 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 e o do tipo text, que armazena dados que podem ser manipulados pelas bibliotecas padr ao de entrada e sa da, inclusive as entradas default input (teclado) e output (tela). O c odigo a seguir mostra o uso de um arquivo do tipo text.
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

Express oes l ogicas, aritm eticas e operadores

Existem dois tipos de express oes em Pascal : as l ogicas e as aritm eticas. S ao basicamente usadas por comandos quando e necess ario produzir um c alculo complexo ou na tomada de decis oes em comandos que exigem certos testes. Express oes s ao formadas por dois componentes: os operadores e os operandos. Como a linguagem Pascal e tipada, ocorre que as express oes tamb em produzem resultados de tipo denido. Este tipo depende essencialmente dos operandos e dos operadores que comp oem a express ao. O restante desta se ca o detalha os aspectos mais importantes das constru co es que envolvem express oes.

6.1

Express oes aritm eticas

S ao express oes aritm eticas: Constantes; Vari aveis dos tipos ordinal e real; Fun co es cujo tipo de retorno sejam ordinais ou reais; Se E1 e E2 s ao duas express oes aritim eticas, ent ao as seguintes tamb em s ao: E1 + E2 E1 E2 E1 E2 E1 /E2 E1 div E2 E1 mod E2 (E1 ) Somente s ao express oes aritm eticas as que podem ser constru das com as regras acima. Os s mbolos +, -, *, /, div, mod s ao operadores aritm eticos bin arios, isto e, operam sobre dois operandos para produzir um resultado. A tabela abaixo explica cada um destes s mbolos. operador + * / div mod signicado adi ca o subtra ca o multiplica c ao divis ao real divis ao inteira resto de divis ao inteira 34

O tipo do retorno depende do tipo dos operandos e dos operadores. Em geral, as opera co es de adi ca o e subtra c ao e multiplica ca o retornam o mesmo tipo dos operandos. Se estiverem sendo operados um real e um inteiro, o resultado e do tipo real. Para as opera co es de divis ao inteira (div) e resto de divis ao inteira (mod) o resultado e inteiro, mas os operandos tamb em devem ser inteiros. As opera c oes com a divis ao real (/) resultam sempre em tipo real, mesmo que um ou mais operandos sejam do tipo inteiro. A tabela abaixo resume esta explica c ao.

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 opera co es de divis ao real ou inteira, o segundo operando n ao pode ser nulo, o que acarretar a erro de execu ca o. 6.1.1 Exemplos

S ao exemplos de express oes aritm eticas bem formadas: 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 fun co es cos, ln, exp e sqrt s ao pr e-denidas pelo compilador e retornam, respectivamente, o cosseno, logaritmo, exponencial e raiz quadrada do argumento. 6.1.2 Ordem de preced encia

Em uma express ao complexa, o compilador executa cada opera ca o separadamente segundo uma ordem pr e-estabelecida. Isto e conhecido como ordem de preced encia dos operadores. Em outras palavras, suponha a express ao: 5+42 Sem maiores informa co es, e uma express ao amb gua, pois 5 + 4 = 9 e 9 2 = 18, mas por outro lado, 4 2 = 8 e 5 + 8 = 13. Isto reete a diferen ca entre as express oes: (5 + 4) 2 e 5 + (4 2) Em Pascal as opera c oes s ao realizadas segundo a ordem de preced encia seguinte: as opera c oes entre par enteses ocorrem primeiro; em seguida, as de multiplica ca o ou divis ao, seja real ou inteira; em seguida, as de adi ca o ou subtra ca o; nalmente, realiza opera co es da esquerda para a direita. Assim, no exemplo acima 5 + 4 2, signica que a multiplica c ao ser a feita em primeiro lugar, e o resultado ser a 13. As express oes podem ser utilizadas nos seguintes casos: em comandos de atribui ca o (ver se c ao 7.1); em express oes l ogicas (ver se ca o 6.2); como argumento de fun c oes ou procedimentos (ver se c ao 4.1.5).

36

Express ao Resultado 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 express oes

6.2

Express oes l ogicas

S ao express oes l ogicas: constantes do tipo boolean; vari aveis do tipo boolean; fun co es cujo tipo de retorno seja boolean; se E1 e E2 s ao duas express oes aritm eticas, ou vari aveis ou constantes do mesmo tipo, ent ao as seguintes s ao express oes l ogicas: E1 = E2 E1 <> E2 E1 > E2 E1 >= E2 E1 < E2 E1 <= E2 Se L1 e L2 s ao duas express oes l ogicas, ent ao as seguintes tamb em s ao: L1 or L2 L1 and L2 L1 xor L2 not(L1 ) (L1 ) Somente s ao express oes aritm eticas as que podem ser constru das com as regras acima.

37

Os s mbolos =, <>, >, >=, <, <= s ao operadores relacionais bin arios. Podem ter como argumento express oes aritm eticas ou ent ao vari aveis ou constantes do tipo, mas sempre resultam em tipo boolean. Os s mbolos and, or, xor e not s ao operadores booleanos, os dois primeiros s ao bin arios e o u ltimo e un ario. Signicam, respectivamente, as opera co es l ogicas de conjun ca o, disjun ca o, disjun c ao exclusiva e nega ca o. A tabela abaixo explica cada um destes s mbolos. operador = <> >= < <= and or xor not signicado igual diferente maior ou igual menor maior ou igual conjun ca o disjun ca o disjun ca o exclusiva nega ca o

O tipo do retorno sempre e boolean e o resultado da opera c ao segue as regras da l ogica cl assica que s ao resumidas nas tabelas verdade apresentada na gura 1.

Express ao Resultado false and false false false and true false true and false false true and true true
(a) AND

Express ao Resultado false or false false false or true true true or false true true or true true
(b) OR

Express ao Resultado false xor false false false xor true true true xor false true true xor true false
(c) XOR

Express ao Resultado not false true not true false


(d) NOT

Figura 1: Conjunto de tabelas verdade dos operadores l ogicos

As express oes podem ser utilizadas nos seguintes casos: em comandos de atribui ca o (ver se c ao 7.1); 38

em comandos que exigem um condicional (ver se c ao 7); como argumento de fun c oes ou procedimentos (ver se c ao 4.1.5). 6.2.1 Exemplos

S ao exemplos de express oes booleanas bem formadas: 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 preced encia

Assim como acontece com as express oes aritm eticas (se ca o 6.1.2), as express oes l ogicas tamb em precisam de uma ordem de preced encia entre os operadores para evitar ambig uidades na interpreta c ao da express ao. As opera c oes entre par enteses ocorrem primeiro; Em seguida, os operadores un arios (not, - (un ario)); Em seguida, os operadores multiplicativos (*, /, div, mod, and); Em seguida, os operadores aditivos (+, -, or, xor); 39

Em seguida, os operadores relacionais (=, <>, >, >=, <, <=); Finalmente, realiza opera co es da esquerda para a direita, em geral. Observa c ao Segundo o guia de refer encia, em sua vers ao de dezembro de 2008, o compilador Free Pascal, contrariamente ao Turbo Pascal, n ao consegue garantir a preced encia quando avalia express oes para acontecerem da esquerda para a direita, informando que o compilador decidir a qual avaliar primeiro baseado em regras de otimiza ca o. Assim, na express ao seguinte:
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 c odigo assim:
e1 := g ( 3 ) ; a := e1 + f ( 2 ) ;

Sempre que for feita a constru ca o de express oes l ogicas contendo express oes aritm eticas em conjunto com operadores relacionais, as senten cas contendo operadores relacionais precisam estar entre par enteses, ou o compilador vai gerar erro de execu ca o. Por exemplo, na express ao:
a < 0 or b < 0

o operador or possui maior preced encia em rela ca o aos operadores relacionais. Assim, o compilador tenta realizar primeiro a express ao 0 or b. O operador or n ao foi constru do para operar com dados num ericos, mas apenas com dados do tipo boolean, o que gera erro. A maneira correta de construir a express ao e utilizar par enteses para separar as senten cas relacionais, da seguinte maneira:
( a < 0 ) or ( b < 0 )

Deste modo, como os par enteses possuem maior preced encia em rela ca o ao or, as senten cas relacionais s ao reduzidas a valores l ogicos antes da utiliza c ao do operador.

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 vel da disciplina b asica de programa ca o de computadores ou de introdu c ao aos algoritmos. Por este motivo, recomendamos fortemente que o leitor consulte o guia de refer encia do compilador utilizado para conhecer todos os comandos dispon veis na linguagem. Os comandos que ser ao apresentados s ao os seguintes: Comandos Simples Comando de atribui c ao (:=); Comando de desvio incondicional (goto); Comandos Compostos Comandos de desvio condicional (if-then-else, case); Comandos de repeti c ao (while-do, repeat-until, for); Delimitadores de bloco.

7.1

Comando de atribui c ao

O comando de atribui ca o e usado exclusivamente para se atribuir um valor a uma vari avel. O valor previamente armazenado naquela posi c ao de mem oria e substitu do pelo novo. Sintaxe:
<var> := < e x p r e s s a o > ;

Com isto, ocorre a atribui c ao do resultado da avalia ca o da express ao para a vari avel indicada lado esquerdo do operador de atribui c ao (:=). Em fun c ao da linguagem ser tipada, as atribui c oes s o funcionam se o tipo do valor atribu do for o mesmo da vari avel que recebe o novo valor. Quando ocorre uma atribui ca o de tipos diferentes, o programa aborta com uma mensagem do tipo type mismatch. H a vezes em que o pr oprio compilador detecta incompatibilidades de tipos. 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 s ao usados para se carregar um determinado valor fornecido pelo usu ario em mem oria. Este valor pode ser digitado ou fornecido atrav es de arquivo. Os comandos de entrada da linguagem Pascal s ao read e readln, cujas sintaxes respectivas s ao apresentadas na seq u encia11 . 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 vari aveis> e uma lista de identicadores de vari aveis separados por v rgula, e <dispositivo> e o nome de um dispositivo de entrada (ver se c ao 5.8). Caso o nome do dispositivo seja omitido, ent ao se considera a entrada padr ao (teclado). As vari aveis devem ser de um tipo b asico da linguagem, isto e, tipos ordinais, reais, char, string ou boolean. A diferen ca entre as duas formas do comando read s o existe no caso de leitura de strings: readln acrescentar a o CR (carriage return ) ao nal da string lida, como 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 refer encia do Free Pascal, em sua vers ao de dezembro de 2008, n ao cont em informa c oes sobre os comandos de leitura, apenas menciona que s ao modicadores.
11

42

7.3

Comandos de sa da

Os comandos de sa da s ao usados para se exibir conte udos de vari aveis, bem como mensagens que devem ser fornecidas para o usu ario do programa. Os comandos de sa da da linguagem Pascal s ao write e writeln, conforme sinta12 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> e uma lista de elementos separados por v rgula, em que cada elemento pode ser um identicador de vari avel, uma express ao aritm etica ou uma string (entre aspas simples) e <dispositivo> e o nome de um dispositivo de sa da (ver se c ao 5.8). Tanto o dispositivo quanto a lista de vari aveis podem ser vazios. Caso o nome do dispositivo seja omitido, ent ao se considera a sa da padr ao (tela). Um dispositivo interessante e o lst, que remete a ` impressora padr ao. As vari aveis devem ser de um tipo b asico da linguagem, isto e, tipos ordinais, reais, char, string ou boolean. A diferen ca entre as duas formas do comando write e que writeln acrescentar a o CR (carriage return ) ao nal do conte udo impresso. Isto faz com que o cursor seja levado a ` pr oxima linha do dispositivo de sa 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 e o goto e serve para desviar o uxo de execu ca o do programa incondicionalmente para outro ponto do c odigo. Este outro ponto deve
O guia de refer encia do Free Pascal, em sua vers ao de dezembro de 2008, n ao cont em informa c oes sobre os comandos de sa da, apenas menciona que s ao modicadores.
12

43

ser indicado por um r otulo previamente declarado na se ca o de r otulos (ver se ca o 4.1.1). Sintaxe:
goto < label >

em que <label> e um r otulo declarado com o comando label. Aten c ao: e preciso observar que o comando de desvio incondicional n ao faz parte dos comandos aceitos no contexto de programa ca o estruturada. Sempre e poss vel reconstruir o c odigo de maneira mais elegante (embora talvez menos eciente) e obter o mesmo resultado. Outra observa c ao e que o uso do goto de dentro para fora de la cos ou vice-e-versa n ao e algo muito razo avel de se fazer, a chance de o programador estar fazendo algo errado e bastante alta. 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 c odigo para o r otulo 100, que imprime a mensagem Inicio na tela. Em seguida executa o desvio para o r otulo alo, que imprime na tela a mensagem Alo mamae!. Finalmente, desvia o c odigo para o r otulo fim e o programa termina. Observe que o exemplo seguinte cumpre 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 execu c ao dos comandos com base em uma condi c ao denida pelo programador. 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 a apresentada nas se co es subseq uentes. 7.5.1 Desvio condicional simples (if-then)

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

Note que as palavras if e then s ao reservadas. O comando a ser executado eu nico. Se o programador precisar de uma seq u encia de comandos, ent ao os delimitadores de bloco devem ser empregados (ver se ca o 7.7). Observe tamb em que, como em Pascal todo comando termina por ponto-e-v rgula e, neste caso, o comando if-then termina somente ap os <comando> aninhado, ent ao o ponto-e-v rgula somente aparece no nal de toda a constru ca o. 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 t ao somente se o resto da divis ao inteira de n por 2 for nulo. Em ambos os casos a mensagem m e impressa na tela. Caso o programador queira imprimir tamb em a mensagem m apenas no caso da avalia c ao do condicional, o programa deveria ter sido escrito desta outra forma que 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 u ltima variante, e poss vel executar um comando desejado apenas se uma condi ca o booleana for satisfeita, ou seja, for avaliada como true e ao mesmo tempo garantir que um segundo comando seja executado t ao somente se a condi c ao 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 s ao reservadas. O comando a ser executado e u nico, tanto o primeiro quanto o segundo. Se o programador precisar de uma seq u encia de comandos, ent ao deve usar um delimitador de bloco (ver se ca o 7.7). Observar tamb em que, como em Pascal todo comando termina por ponto-e-v rgula ao e, neste caso, o comando if-then-else termina somente ap os <comando 2>, ent o ponto-e-v rgula aparece apenas no nal, e n ao no meio da constru c ao, o que e um 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 t ao somente se o resto da divis ao inteira de n por 2 for nulo. Caso contr ario, a mensagem O numero n eh impar. ser a impressa. Independentemente do desvio realizado, a mensagem m e exibida na tela. Assim, uma maneira de disting uir o desvio condicional simples do completo, e visualizar a else como parte opcional do comando if. No exemplo a seguir, o programa gera um menu de op co es. Existe uma outra forma mais adequada de fazer o mesmo menu, utilizando o comando case, que ser a visto na se c ao 7.5.3. 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 visualiza c ao de v arios comandos if-then-else aninhados, com a diferen ca de que, no lugar de avaliar express oes booleanas, s ao avaliadas express oes cujo resultado seja de algum tipo enumerado ou ordinal (exceto boolean e char). O comando e constitu do por uma express ao e por constantes de caso. As constantes devem ser conhecidas em tempo de compila ca o. Todas as constantes devem ser do mesmo tipo. O compilador avalia a express ao e, caso haja o casamento de uma das constantes com o valor da express ao, a senten ca que segue esta constante e executada. O programa continua ent ao ap os o end nal do comando.

47

Na situa ca o em que n ao h a casamento de nenhuma constante com o valor da express ao, executam-se as instru co es aninhadas em else. O trecho do else e opcional e executado apenas no caso de n ao haver qualquer casamento de constante com o valor da express ao. Ainda neste caso, se n ao houver este trecho, o uxo de execu ca o seguir a para o comando que sucede o end. 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 s ao palavras reservadas. As constantes do comando s ao cte1, cte2, . . . , cteN. Conforme explicado anteriormente, estas constantes podem ser tamb em de tipos enumer aveis, isto e, da forma A..B. No Free Pascal n ao e permitido haver duplicidade nas constantes. Analogamente aos comandos if, aqui somente um u nico comando e executado em cada caso. Quando necess ario mais de um comando, deve-se utilizar os delimitadores de bloco (ver se ca o 7.7). Ao contr ario do que ocorre com o if, aqui deve existir o ponto-e-v rgula na instru ca o que precede o else. Em suma, o comando case funciona baseado em casamentos de padr oes e n ao e t ao gen erico quando o comando if. Este, por sua vez, trabalha com express oes booleanas que podem ser t ao complexas quanto se precise. Vale frisar que todo trecho que utilize case pode ser reescrito como um aninhamento de comandos if-then-else, embora o c odigo que menos leg 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 c odigo anterior, escrito com o case equivale a este outro c odigo, que utiliza if.
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 pr oximo exemplo explora mais as possibilidades do case.


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 especica c ao das constantes e considerada um or. Sempre que forem encontrados dois pontos entre constantes, l e-se at e, pois especica uma escala de poss veis valores.

7.6

Comandos de repeti c ao

Os comandos de repeti ca o servem para desviar o uxo de execu c ao de maneira que um determinado trecho do c odigo possa ser repetido por um n umero determinado de vezes. A este desvio, d a-se o nome de la co ou loop. O Pascal disp oe dos seguintes comandos de repeti ca o: 1. while-do; 2. repeat-until; 3. for-do. Todos estes ser ao apresentados na seq u encia. 7.6.1 Repeti c ao condicional com teste no in cio (while-do)

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

As palavras while e do s ao reservadas. O comando a ser executado eu nico. Caso o programador deseje executar uma seq u encia de comandos, o delimitador de blocos deve ser utilizado (ver se ca o 7.7). Como, em Pascal, todo comando termina por ponto-e-v rgula e, neste caso, o comando while-do termina somente ap os o <comando>, ent ao o ponto-e-v rgula somente aparece no nal, e n ao no meio da constru ca o. 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 n umeros entre n e 1. Se o n umero lido for negativo ou nulo, ent ao a mensagem Fim. e impressa imediatamente, isto e, nenhum n umero aparece na tela. Isto ocorre porque a avalia c ao da express ao condicional ocorre antes do bloco de instru c oes ser executado. Como o while-do repete um bloco de instru co es enquanto determinada condi c ao for verdadeira, e poss vel denir um la co de execu ca o innita caso a express ao avaliada nunca se altere para falsa. No c odigo a seguir, se um n umero negativo ou nulo for digitado como entrada, o programa termina sem nunca ter impresso n umero algum na sa da. Contudo, se o n umero entrado for positivo e n ao nulo, ser a impresso innitamente. 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

Repeti c ao condicional com teste no nal (repeat-until)

O repeat-until e o comando de repeti ca o condicional com teste no nal. Funciona de modo contrastante ao while-do, ou seja, repete at e que uma dada express ao booleana resulte em verdadeiro. Esta express ao e avaliada ap os o bloco de instru co es ter sido 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 s ao reservadas. Contrariamente ao comando while-do, o repeat-until pode executar v arios comandos sem a delimita c ao de bloco por begin e end (ver se ca o 7.7). Como, em Pascal, todo comando termina por ponto-e-v rgula e, neste caso, o comando repeat-until termina somente ap os a express ao booleana, ent ao o pontoe-v rgula somente aparece no nal, e n ao no meio da constru c ao. 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 n umeros entre n e 1. Contudo, aqui reside a principal diferen ca entre o repeat-until e o while-do: se o n umero lido for negativo ou nulo, o n umero ser a impresso seguido da mensagem de Fim.. Isto ocorre porque a avalia c ao da express ao somente e feita ap os a execu c ao do bloco de comandos. Dependendo da avalia ca o da express ao booleana, e poss vel denir um la co de execu ca o innita, tal como apresentado no exemplo a seguir. Um inteiro positivo, n ao nulo, lido do teclado e imprimido innitamente. Caso um n umero nulo ou negativo seja lido, o programa termina ap os imprimir o n umero uma u nica vez e exibir a 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

Repeti c ao por enumera c ao (for-do)

O for-do e o comando de repeti ca o por enumera ca o do Pascal. Usa-se para repetir um bloco de comandos por um n umero xo e predeterminado de vezes. O controle e feito por uma vari avel, denominada vari avel de controle, a qual respeita os limites estabelecidos que dependem de um valor inicial e de um valor nal. Tais limites s ao denidos antes do comando ser executado e n ao podem ser alterados. 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 s ao reservadas. O comando a ser executado eu nico, devendo ser utilizados os delimitadores de bloco (ver se c ao 7.7) no caso de haver mais de um. Como, em Pascal, todo comando termina por ponto-e-v rgula e, neste caso, o comando for-do termina somente ap os <comando>, ent ao o ponto-e-v rgula somente aparece no nal, e n ao no meio da constru ca o. O comportamento do for-do e o seguinte: e avaliado; 1. o valor de <EAO 2> 2. a vari avel de controle recebe o valor da avalia c ao de <EAO 1>; 3. caso tenha sido usada a forma com to, ent ao o valor da vari avel de controle e e executado e a comparado com <EAO 2> e, se for menor ou igual, o comando vari avel de controle e incrementada de uma unidade; 4. caso tenha sido usada a forma com downto, ent ao o valor da vari avel de controle e comparado com <EAO 2> e se for maior ou igual, o comando e executado e a vari avel de controle e decrementada de uma unidade; 5. o ciclo se repete at e que o valor da vari avel de controle ultrapasse o limite estabelecido em <EAO 2>, no caso da forma com to ou se torne inferior a <EAO 2> no caso da forma com downto. imperativo dizer que <variavel de controle> deve ser de tipo ordinal e que E <EAO 1> e <EAO 2> s ao express oes aritm eticas cujos valores de retorno tamb em s ao de um tipo ordinal. Estas duas express oes s ao avaliadas antes que o comando seja executado, sendo que e proibido que se modique o valor da vari avel de controle pelo comando. Finalmente, n ao adianta alterar vari aveis que mudem o valor de <EAO 2>, uma vez que esta express ao foi avaliada antes do in cio do la co. 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 n umeros entre 1 e n. Se o n umero lido for negativo ou nulo ent ao a mensagem Fim. e impressa imediatamente, isto e, nenhum n umero aparece na tela. 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 n umeros entre n e 1. Se o n umero lido for negativo ou nulo ent ao a mensagem Fim. e impressa imediatamente, isto e, nenhum n umero aparece na tela. Este programa e absolutamente equivalente ao primeiro exemplo apresentado na se c ao 7.6.1. 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 u ltimo exemplo mostrou como comandos do tipo for-do podem ser alinhados para se obter a impress ao de todas as tabuadas do 1 ao 10. N ao e poss vel denir um la co de execu ca o innita usando-se o comando for-do.

7.7

Delimitadores de bloco

Os delimitadores de bloco serve para agrupar comandos a m de que sejam visto como um conjunto de instru c oes encapsulado. Isto e, aglomera mais de um comando em um bloco que e encarado pelo compilador como um u nico comando. O modo de usar e simples, basta escrever os comandos desejados entre um begin 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 c odigo

Esta se ca o apresenta algumas t ecnicas para se escrever c odigos elegantes, de f acil leitura e compreens ao por quem os l e. Apesar de ter a linguagem Pascal como foco, o conte udo aqui descrito pode ser projetado para qualquer outra linguagem de programa ca o cujo compilador ignore espa cos, tabula co es ou linhas em branco. Em particular, tamb em se apresentam considera co es para as linguagens que n ao s ao case sensitive, isto e, que n ao diferenciam mai usculas de min usculas. As pr oximas se co es descrevem conven co es e sugest oes que ajudam a padronizar o c odigo e que devem ser levadas em considera ca o. As id eias aqui apresentadas podem n ao fazer muito sentido para um programador aprendiz, mas s ao fundamentais na arte da programa c ao, em particular quando se escrevem programas com algumas milhares de linhas.

8.1

Espa cos e linhas em branco s ao ignorados

Ambos os exemplos geram rigorosamente o mesmo c odigo execut avel, inclusive com o mesmo tamanho em bytes, pois o compilador ignora linhas em branco e espa cos. Contudo, a legibilidade da primeira vers ao e privilegiada. Vers ao 1:
program O i P e s s o a l ; begin write ( Oi ) ; writeln ( Pessoal ! ) ; end .

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

Vers ao 3:
program OiPessoal ; begin write ( Oi ) ; writeln ( Pessoal ! ) ; end .

56

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

Em resumo, e prefer vel escrever um comando por linha, preferencialmente deixando espa cos em branco de maneira regular. Usar uma linha em branco entre blocos com o mesmo sentido, tamb em e boa pr atica: inicializa ca o de vari aveis, leitura de vari aveis, processamento das informa c oes, por exemplo. muito importante que o programador mantenha a consist E encia do padr ao por toda a reda ca o do programa.

8.2

N ao h a distin c ao entre mai usculas e min usculas

Embora ambas as vers oes seguintes gerem o mesmo programa execut avel, a vers ao com comandos e identicadores em mai usculas tem a legibilidade prejudicada. Vers ao 1:
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 .

Vers ao 2:
P R O G R A M CALCULAR IMC; 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 c odigo ca mais uente quando letras min usculas s ao utilizadas.

8.3

Coment arios

A maior parte das linguagens de programa c ao modernas permite que o programador insira textos que n ao fa cam parte do programa propriamente dito, s ao coment arios adicionais que facilitam a compreens ao por parte de quem l e o c odigo. Conforme vimos na se ca o 5.3, em Pascal isto e poss vel com o uso equilibrado dos 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 coment arios no c odigo: Aus encia de coment arios e ruim, mas o excesso tamb em e! Use o bom senso para 58

decidir os lugares relevantes no c odigo que merecem coment arios. Se o c odigo precisa de muitos coment arios, provavelmente est a mal escrito; N ao escreva coment arios longos demais, a id eia e manter o c odigo o mais limpo poss vel; Descrever o comportamento de fun co es e procedimentos e interessante; Indicar pontos no c odigo que s ao fundamentais para o bom funcionamento do programa, tamb em e.

8.4

Identa c ao ou alinhamento de c odigo por colunas

Identa c ao e uma palavra que vem do ingl es identation e signica, neste contexto, o alinhamento de comandos em colunas de acordo com o n vel hier arquico de aninhamento destes comandos. Identa ca o e uma pr atica em programa c ao estruturada e e vi avel em compiladores que ignoram espa cos ou linhas em branco. Em geral, e boa pr atica de programa c ao identar blocos de comandos de maneira que, visualmente, o programa que mais claro e mostre quais linhas de c odigo s ao executadas por um determinado comando em um certo trecho do programa. O objetivo e permitir que programas quem melhor apresentados e mais f aceis de se entender. Sempre que um bloco de comandos estiver no escopo de um comando (signica estar sob o controle do comando), a identa ca o passa a ser interessante. A t ecnica elementar e deslocar este bloco mais a direita do que o comando principal. Isto facilita muito a visualiza c ao de diferentes escopos no programa. Os dois exemplos abaixo ilustram esta situa c ao, o primeiro est a bem identado, o segundo n ao. 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 espa cos para a direita com rela ca o ao alinhamento begin-end do programa, bem como o comando write foi deslocado outros 5 espa cos com rela ca o a coluna do comando for (e portanto 6 com rela c ao a ao begin-end). J a o comando que imprime a mensagem de m cou alinhado na mesma coluna do comando for, mostrando que est a fora do seu escopo, isto e, consiste em 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 identa ca o confusa do segundo exemplo e que, visualmente, quem l e o c odigo tem a falsa impress ao de que o comando que imprime o texto Fim. est a no escopo do comando for e portanto ser a repetido 10 vezes, o que n ao e verdade! Se esta fosse de fato a inten ca o do programador, ent ao ele deveria ter escrito da maneira como e mostrado no exemplo abaixo: 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 e, introduzindo o begin e o end que o programador provavelmente tinha esquecido. O n umero de espa cos do deslocamento depende da prefer encia do programador. Costuma-se utilizar entre 3 e 5 espa cos em branco. H a programadores que utilizam a tabula ca o (tab), por em esta pode ser descongurada conforme o editor. O importante e manter o mesmo n umero de espa cos em todo o c odigo. Deve-se tamb em ter cuidado para n ao se avan car mais do que a u ltima coluna da direita, pois o resultado tamb em e confuso, conforme exemplo seguinte. 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] e uma funcionalidade presente na maioria dos editores de texto para programa c ao. Essa funcionalidade permite que cada categoria de termos da linguagem seja apresentada na tela com um realce (formato ou cor) espec co. Geralmente e utilizada colora ca o para destacar os termos, mas tamb em podem ser utilizados negrito, it alico ou outras fontes. Dessa forma, coment arios, tipos b asicos da linguagem, n umeros e comandos s ao real cados, facilitando a leitura do c odigo fonte. importante lembrar que o realce n E ao afeta o signicado do c odigo fonte, e sua u nica fun ca o e facilitar a leitura e edi c ao. Anal de contas, o compilador funciona sobre um arquivo totalmente escrito usando-se os caracteres vis veis da tabela ASCII.

8.6

Simplicidade e clareza

Simplicidade e clareza s ao dois atributos muito importantes para aumentar a legibilidade do c odigo-fonte. A clareza torna o programa intelig vel e a simplicidade evita que a leitura do programa seja enfadonha. Entretanto, esses atributos s ao relativamente subjetivos e a habilidade de escrever programas simples, claros e ecientes s o e alcan cada com muita pr atica, o que exige dedica ca o e tempo. E necess ario que o programador tenha um bom conhecimento em algoritmos, bem como doss recursos que a linguagem de programa ca o fornece, pois isto ajuda na tarefa de alcan car o bom senso necess ario para se escrever c odigos elegantes.

8.7

Nomes dos identicadores

Em linguagens de programa ca o, os identicadores s ao trechos de texto que nomeiam entidades da linguagem. Em Pascal, essas entidades s ao os nomes das vari aveis, constantes, dos tipos de dados, procedimentos e fun co es. Assim, ao se programar em Pascal e necess ario escolher um nome para cada uma dessas entidades, com exce c ao dos tipos b asicos da linguagem. A escolha do nome dos identicadores e muito importante na legibilidade do c odigo-fonte, pois n ao ajuda muito ter um c odigo identado, comentado e com a sintaxe real cada, se os nomes dos identicadores complicarem a leitura do c odigo. Por exemplo, se uma determinada vari avel for armazenar o CPF de algum usu ario, um bom nome para esta vari avel e cpf. Observe como outras escolhas poderiam ir contra a legibilidade do c odigo: numero cadastro pessoa fisica; cadastro; numero; campo02. 61

A regra geral e a simplicidade e a clareza, como mencionado anteriormente. O ideal e que a leitura do c odigo seja intuitiva, e se pare ca mais com um texto em l ngua nativa do que com um c odigo de m aquina.

62

Refer encias
[Car82] S. Carvalho. Introdu c ao ` a Programa c ao com Pascal. Editora Campus, 1982.

[FBF+ 86] Harry Farrer, Christiano Gon calves Becker, Eduardo Chaves Faria, Frederico Ferreira Campos Filho, Helton F abio de Matos, Marcos Augusto dos Santos, and Miriam Louren co Maia. Pascal Estruturado. Livros T ecnicos 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 Fun c oes. Livros Erica 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. Programa c ao Sistem atica em PASCAL. Editora Campus, 1978.

63

Fun c oes e procedimentos predenidos no compilador

Nesta se c ao s ao brevemente descritas os principais procedimentos e fun co es predenidos pelo compilador Free Pascal. Existem fun c oes adicionais para nalidades espec cas que exigem o uso de bibliotecas (Units), contudo tal t opico excede a nalidade deste guia r apido. Fun co es espec cas para se trabalhar com entrada e sa da em arquivos s ao descritas na se ca o 5.8. Um manual pormenorizado de todos os procedimentos e fun c oes providos pelo compilador Free Pascal pode ser encontrado em: http://www2.toki.or.id/fpcdoc/ ref/refse64.html#x151-15700013.3

A.1

Abs
qualquerTipoNumerico) : qualquerTipoNumerico;

Cabe calho function abs(x :

Descri c ao Retorna o valor absoluto de x. O resultado da fun ca o e do mesmo tipo que o par ametro dado, que pode ser de qualquer tipo num erico. 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;

Cabe calho function arctan(x :

Descri c ao Retorna o arco tangente de x, que pode ser de qualquer tipo real. O resultado e dado em radianos. 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

Cabe calho procedure break; Descri c ao Salta para a instru ca o seguinte ao nal do comando de repeti ca o corrente. Tudo o que estiver entre o break e o m do comando de repeti ca o e ignorado. A express ao booleana do comando de repeti ca o n ao e avaliada. Pode ser usado com os comandos while-do, repeat-until e for-do. Ressaltase que pode ser muito danoso ao c odigo, pois possui efeito semelhante ao goto (ver se ca o 7.4); 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;

Cabe calho function chr(x :

Descri c ao 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;

Cabe calho function concat(s1, s2 [, s3, ...

Descri c ao Concatena as strings s1, s2, . . . , sn em uma u nica 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

Cabe calho procedure continue; Descri c ao Salta para o m do comando de repeti c ao corrente. O c odigo entre continue e o m do comando de repeti c ao e ignorado. Pode ser usado com os comandos while-do, repeat-until e for-do. Ressaltase que pode ser muito danoso ao c odigo, pois possui efeito semelhante ao goto (ver se ca o 7.4); 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;

Cabe calho function copy(const s : string; indice : quantidade : integer) : string;

Descri c ao Retorna uma string que e uma c opia da quantidade de caracteres de s, iniciando na posi c ao indice. Se isto ultrapassar o tamanho de s, ent ao o resultado e truncado. Se indice extrapolar os limites de s, ent ao uma string vazia 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;

Cabe calho function cos(x :

Descri c ao Retorna o cosseno de x, onde x e um angulo em radianos. 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

Cabe calho procedure dec(var x : qualquerTipoOrdinal [; decremento : qualquerTipoOrdinal]); 67

Descri c ao Decrementa de x o valor de decremento. Se decremento n ao for especicado, e tido como 1. 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;

Cabe calho procedure delete(var s : quantidade : integer);

Descri c ao Remove de s a quantidade de caracteres iniciando na posi ca o indice. Todos os caracteres depois daqueles deletados s ao trazidos para imediatamente ap os o indice e o tamanho de s e ajustado. 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;

Cabe calho function exp(var x : Descri c ao 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;

Cabe calho function frac(x :

Descri c ao Retorna a parte n ao inteira de x. 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

Cabe calho procedure inc(var x : qualquerTipoOrdinal [; incremento : qualquerTipoOrdinal]); Descri c ao Incrementa em x o valor de incremento. Se incremento n ao for especicado, 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;

Cabe calho procedure insert(const s1 : indice : integer);

Descri c ao Insere a string s1 em s2 na posi c ao indice, empurrando todos os caracteres depois de indice para a direita. O resultado e truncado para 255 caracteres. 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;

Cabe calho function int(x :

Descri c ao 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;

Cabe calho function length(s :

Descri c ao Retorna o tamanho de s, limitado a 255. Se s estiver vazio, 0 e retornado.

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;

Cabe calho function ln(x :

Descri c ao 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;

Cabe calho function lowercase(c :

Descri c ao Retorna o argumento c convertido para min usculas. O retorno e char ou string, 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;

Cabe calho function odd(x :

Descri c ao Retorna true se x for mpar, false caso o contr ario. 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;

Cabe calho function ord (x :

Descri c ao Retorna o valor ordinal (ASCII) do caractere x. A fun ca o ord n ao e exclusiva do tipo char e pode ser utilizada em outros tipos, por em foge do escopo deste 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;

Cabe calho function pi :

Descri c ao 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)

Cabe calho function pos(const substring : : integer;

Descri c ao Retorna o ndice da substring em s, se esta a contiver. Caso contr ario, 0 e retornado. A busca e case-sensitive. 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;

Cabe calho function power(base, expon :

Descri c ao 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;

Cabe calho function pred(x :

Descri c ao 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;

Cabe calho function random [(x :

Descri c ao Retorna um n umero aleat orio maior do que 0 e menor do que x. Exemplo
program exemploRandom ; begin randomize ; writeln ( random ( 3 ) ) ; end .

// Imprimira 0 , 1 ou 2

A.26

Randomize

Cabe calho procedure randomize;

74

Descri c ao Inicializa o gerador de n umeros aleat orios do Pascal, garantindo que a seq u encia de n umeros gerados mude a cada execu ca o. Exemplo Vide fun ca o anterior.

A.27

Round
real) : longint;

Cabe calho function round(x :

Descri c ao Arredonda o real x para o inteiro mais pr oximo. Exemplo


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

// Imprime 1235

A.28

Sin
real) : real;

Cabe calho function sin(x :

Descri c ao Retorna o seno de x, onde x e um angulo em radianos. 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;

Cabe calho function sqr(x :

Descri c ao 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;

Cabe calho function sqrt(x :

Descri c ao 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;

Cabe calho function succ(x :

Descri c ao 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;

Cabe calho function trunc(x :

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

// Imprime 1234

A.33

Upcase
charOuString) : charOuString;

Cabe calho function upcase(c :

Descri c ao Retorna o argumento c convertido para mai usculas. O retorno e char ou string, 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);

Cabe calho procedure val (const s :

Descri c ao Converte o valor representado em s para um valor num erico e armazena este conte udo na vari avel v, que pode ser dos tipos longint, real ou byte. Caso a convers ao n ao seja bem-sucedida, o par ametro codigo conter a o ndice do caractere de s que impossibilitou a convers ao. Admite-se espa cos no in cio de s.

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

You might also like