Você está na página 1de 47

Caracter sticas da Linguagem Pascal

Lucas Amorim Willian Victor da Silva Instituto de Computaao c Universidade Federal de Alagoas
16 de outubro de 2008

Sumrio a
1 Introduo ca 1.1 Histrico . . . . . . . . . . . . . . . . . . o 1.2 Critrios de Avaliaao da Linguagem . . e c 1.2.1 Legibilidade . . . . . . . . . . . . 1.2.2 Escritabilidade . . . . . . . . . . 1.2.3 Conabilidade . . . . . . . . . . . 1.2.4 Custo . . . . . . . . . . . . . . . 1.3 Inuncias no Design da Linguagem . . . e 1.4 Custo Benef no projeto da linguagem cio 1.5 Mtodos de Implementao . . . . . . . e ca 1.6 Ambientes de Programaao . . . . . . . c 4 4 4 4 5 5 5 5 6 6 6 7 7 7 7 7 7 7 8 8 8 10 10 11 11 12 13 14 15 15 16 16 17 18

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

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

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

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

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

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

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

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

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

2 Nomes, Binding, Checagem de Tipos e Escopo 2.1 Nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Design . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Forma dos Nomes . . . . . . . . . . . . . . . . . 2.2 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . a 2.2.1 Nomes . . . . . . . . . . . . . . . . . . . . . . . 2.2.2 Endereo . . . . . . . . . . . . . . . . . . . . . . c 2.2.3 Tipo . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Binding . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Binding de atributos a variveis . . . . . . . . . a 2.3.2 Ligaao de Tipo . . . . . . . . . . . . . . . . . . c 2.3.3 Declaraao de Variveis . . . . . . . . . . . . . c a 2.3.4 Vinculaao de Memria e Tempo de Vida . . . . c o 2.4 Checagem de Tipos . . . . . . . . . . . . . . . . . . . . 2.5 Compatibilidade de Tipos . . . . . . . . . . . . . . . . 2.6 Escopo . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6.1 Subprogramas . . . . . . . . . . . . . . . . . . . 2.6.2 Tipo de Escopo implementado pela Linguagem . 2.6.3 Avaliao do Escopo da Linguagem . . . . . . . ca 2.6.4 Tempo de vida das variveis . . . . . . . . . . . a 2.6.5 Ambientes de referncia . . . . . . . . . . . . . e 2.7 Constante com Nome . . . . . . . . . . . . . . . . . . . 2.8 Inicializao da Varivel . . . . . . . . . . . . . . . . . ca a

3 Tipos de Dados 3.1 Tipos Primitivos . . . . . . . . . . . . . . . . 3.2 Tipos de String de Caracteres . . . . . . . . . 3.2.1 Questes de Projeto . . . . . . . . . . o 3.2.2 Strings e suas Operaoes . . . . . . . . c 3.2.3 Opoes de tamanho de Strings . . . . . c 3.2.4 Implementao de Strings . . . . . . . ca 3.3 Tipos Ordinais Denidos pelo Usurio . . . . a 3.3.1 Enumerao . . . . . . . . . . . . . . . ca 3.3.2 Subintervalos . . . . . . . . . . . . . . 3.3.3 Implementao de tipos Ordinais . . . ca 3.4 Arrays . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Questes de Projeto . . . . . . . . . . o 3.4.2 Arrays e ndice . . . . . . . . . . . . . 3.4.3 Vinculaao de Subscritos e Intervalo de c 3.4.4 Nmero de u ndices . . . . . . . . . . . 3.4.5 Inicializaao . . . . . . . . . . . . . . . c 3.4.6 Operaoes de Arrays . . . . . . . . . . c 3.5 Tipos Registros . . . . . . . . . . . . . . . . . 3.5.1 Questes de Projeto . . . . . . . . . . o 3.5.2 Denioes de Registros . . . . . . . . . c 3.5.3 Referncias a Campos de Registros . . e 3.5.4 Operaoes em Registros . . . . . . . . c 3.5.5 Implementao de Tipos Registros . . ca 3.6 Tipo Unio . . . . . . . . . . . . . . . . . . . a 3.6.1 Unio Discriminada . . . . . . . . . . . a 3.6.2 Questes de Projeto . . . . . . . . . . o 3.6.3 Avaliao . . . . . . . . . . . . . . . . ca 3.6.4 Implementao de Tipos Unio . . . . ca a 3.7 Tipos Ponteiros . . . . . . . . . . . . . . . . . 3.7.1 Questes de Projeto . . . . . . . . . . o 3.7.2 Operaoes com Ponteiros . . . . . . . . c 3.7.3 Problemas com Ponteiros . . . . . . . . 3.7.4 Ponteiros Pendurados . . . . . . . . . . 3.7.5 Variveis Dinmicas de Heap Perdidas a a 3.7.6 Ponteiros No Pascal . . . . . . . . . . . 4 Expresses e Instruoes de Atribuio o c ca 4.1 Expresses Aritimticas . . . . . . . . . . o e 4.1.1 Expresses Aritmticas . . . . . . . o e 4.1.2 Questes de Projeto . . . . . . . . o 4.1.3 Ordem de Avaliaao de Operadores c 4.1.4 Ordem de Avaliaao dos Operandos c 4.2 Sobrecarga de Operadores . . . . . . . . . 4.3 Converso de Tipo . . . . . . . . . . . . . a 4.3.1 Coerao em Expresses . . . . . . . c o 2 . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Validade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

19 19 20 21 21 21 21 22 22 22 23 23 24 24 25 26 26 26 27 28 28 28 29 29 29 29 30 30 30 31 31 31 31 31 32 32 33 33 33 34 34 34 35 36 36

4.4

4.5 4.6 4.7

4.3.2 Converso de Tipo Expl a cita . . . . . Expresses Relacionais e Booleanas . . . . . o 4.4.1 Expresses Relacionais . . . . . . . . o 4.4.2 Expresses Booleanas . . . . . . . . . o Avaliaao em Curto-circuito . . . . . . . . . c Atribuiao de Modo Misto . . . . . . . . . . c Instrues de Atribuiao . . . . . . . . . . . co c 4.7.1 Atribuies Simples . . . . . . . . . . co 4.7.2 Atribuies com Mltiplos Alvos . . co u 4.7.3 Operadores de Atribuio Compostos ca

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

36 37 37 37 38 38 38 38 38 38 39 39 39 39 39 40 40 41 41 42 43 43 43 43 43 43 44 44 44 45 45 45 45

5 Estruturas de Controle 5.1 Instrues de Seleo . . . . . . . . . . . . . . . . co ca 5.1.1 Exemplo de Seletor Bidirecional . . . . . . 5.1.2 Aninhamento de Seletores . . . . . . . . . 5.1.3 Construoes de Seleao Mltipla . . . . . . c c u 5.2 Instrues Iterativas . . . . . . . . . . . . . . . . co 5.2.1 Loops Controlados por Contador . . . . . 5.2.2 Loops Controlados por Expresses Lgicas o o 5.3 Desvio Incondicional . . . . . . . . . . . . . . . . 5.4 Comandos com Guarda . . . . . . . . . . . . . . .

6 Subprogramas 6.1 Fundamentos de Subprogramas . . . . . . . . . . . . 6.1.1 Procedimentos e Funoes . . . . . . . . . . . . c 6.2 Ambientes de Referncia Locais . . . . . . . . . . . . e 6.3 Mtodos de Passagem de Parmetros . . . . . . . . . e a 6.3.1 Passagem por Valor . . . . . . . . . . . . . . . 6.3.2 Passagem Por Referncia . . . . . . . . . . . . e 6.4 Parmetros que So Subprogramas . . . . . . . . . . a a 6.5 Sobrecarga de Subprogramas . . . . . . . . . . . . . . 6.6 Questes de Design de Funoes . . . . . . . . . . . . o c 6.6.1 Efeitos Colaterais de Funes . . . . . . . . . co 6.6.2 Tipos de Valores Que Podem Ser Retornados . 6.7 Co-rotinas . . . . . . . . . . . . . . . . . . . . . . . .

Cap tulo 1 Introduo ca


Neste trabalho procuramos desenvolver uma minuciosa anlise dos conceitos e caa racter sticas envolvidos com a linguagem Pascal. Embora esta linguagem de programaao jamais tenha sido padronizada de forma universalmente aceita, procurac mos nos ater a um unico padro, o padro Free Pascal [3]. Testes e armaoes sobre a a c a linguagem Pascal neste documento dizem respeito especicamente ao Free Pascal Compiler.

1.1

Histrico o

A linguagem de programaao Pascal, cujo nome faz homenagem ao matemtico e c a lsofo francs Blaise Pascal, foi criada em meados de 1968, quando Niklaus Wirth, o e um cientista da computaao suco, resolveu desenvolver uma linguagem imperativa c pequena e eciente com o intito de dar total suporte e incentivo ` programao u a ca estruturada e ao uso de estruturas de dados. Baseada na linguagem ALGOL 60, Pascal foi criada com o intuito de ensinar programaao estruturada a estudantes de graduao em cincia da computao. No c ca e ca entanto, linguagens derivadas de Pascal foram criadas e usadas nos mais diversos dom nios de programao. No Brasil, uma famosa linguagem derivada de Pascal ca e Delphi que fez bastante sucesso entre os desenvolvedores de sistemas comerciais. O primeiro compilador Pascal foi desenvolvido para a srie de computadores e mainframe CDC 6000 em Zurich, na prpria linguagem Pascal, em meados da dcada o e de 70 e j era capaz de compilar a si mesmo. Muitos compiladores Pascal, desde a ento, foram criados seguindo a mesma linha, ou seja, escritos na prpria linguagem a o Pascal, sendo o compilador GNU Pascal, uma notvel excesso. a a

1.2
1.2.1

Critrios de Avaliao da Linguagem e ca


Legibilidade

Podemos considerar que os programas escritos na linguagem Pascal so bastante a leg veis devido ao fato de exigir a declarao de todas as variveis, dar suporte a ca a abstraao de dados atravs dos tipos denidos pelo usurio, usar palavras especiais c e a

reservadas ao invs de palavras chave (isso evita esoterismos do tipo INTEGER : e REAL;), e de certa forma auto-explicativa, no que tange aos nomes dos constructos. e

1.2.2

Escritabilidade

Obviamente, a escitabilidade est tambm relacionada com a legibilidade, j que ao a e a escrever um programa necessrio sempre estar lendo o que j foi escrito enquanto e a a se prossegue no cdigo. o Entre outros fatores, um dos que mais inuenciam na escritabilidade da linguagem Pascal o fato de ser uma linguagem simples (com um nmero razoavelmente e u pequeno de constructos). O fato de usar palavras reservadas reduz um pouco a exibilidade pois a priori necessrio que se conhea todos os constructos da line a c guagem. No entanto, este ultimo fator pode ser deixado de lado se usarmos um bom editor de texto com suporte a highlighting. Muito maiores so as vantagens de se a usar palavras reservadas do que desvantagens. O suporte a abstraao est implementado na forma de subprogramas, o que c a torna programas complexos que usam os mesmos procedimentos repetidas vezes muito mais leg veis. Em termos de expressividade a linguagem Pascal no chega a a estar entre as melhores, mas tambm no pode ser considerada prolixa. e a

1.2.3

Conabilidade

A linguagem em questo no muito convel, permitindo coeroes de tipo implia a e a c citas. Mesmo onde a checagem de tipo entra em cena, muitas vezes falha, no e a detectando, por exemplo erros de atribuiao de valores fora do intervalo permitido c para aquele tipo de varivel, ver seo 2.5. a ca

1.2.4

Custo

Pascal foi desenvolvida para ser eciente tanto em termos de compilao como em ca termos de execuao. Pelo fato de ser uma linguagem um tanto complexa, j que c a implementa estrutura de dados e tipos compostos, sua compilao no to trivial, ca a e a mas consegue ter uma boa ecincia. e

1.3

Inuncias no Design da Linguagem e

Como a maioria das linguagens de programao, Pascal foi desenvolvida em cima ca 1 da arquitetura de von Neumann , por isso foi desenvolvida como uma linguagem imperativa, onde as variveis representam as clulas de memria e comandos reprea e o sentam as operaoes de piping [4]. A linguagem Pascal foi fortemente inuenciada c pelos conceitos de abstrao de dados, programaao estruturada e legibilidade. ca c
Num computador de von Neumann, tanto os dados quanto os programas so armazenados na a memria, que separada da CPU, onde so executadas as instrues que so passadas pelo pipe, o e a co a da memria para o processador. o
1

1.4

Custo Benef cio no projeto da linguagem

Semelhante a Ada, Pascal verica os intervalos de validade dos Arrays. Neste caso Pascal, troca a ecincia pela conabilidade. Pascal prioriza a Legibilidade em e relaao a Expressividade. No possui nenhuma situao que o enquandre em algum c a ca grau de expressividade. H implementao de ponteiros, qualquer linguagem que ima ca plemente ponteiros, est permitindo em algum momento uma quebra de segurana, a c e priorizando a ecincia. e

1.5

Mtodos de Implementao e ca

O Mtodo de implementao adotado pelo Pascal a compilao, que deniremos e ca e ca a seguir: Compilao ca O Processo de Compilao da linguagem Pascal dado pela imagem abaixo: ca e

Figura 1.1: Processo de Compilao ca

1.6

Ambientes de Programao ca

Existem vrios ambientes (compiladores) free para programar em Pascal: Turbo a Pascal, GNU Pascal, Free Pascal, PascalZim, P4 Compiler, Kylix 2 , Virtual Pascal.
2

Kylix uma verso do Object Pascal para programar no Linux. e a

Cap tulo 2 Nomes, Binding, Checagem de Tipos e Escopo


2.1
2.1.1

Nomes
Design

A linguagem Pascal no sens a caixa. a e vel Possui palavras especiais reservadas. Ex.: No se pode declarar uma varivel a a com o nome INTEGER.

2.1.2

Forma dos Nomes

Devido a ser uma linguagem no sens a caixa, a forma dos nomes bastante a vel e livre, com exceo do uso de palavras reservadas, de forma que esses nomes ca so equivalentes: a Variavel variavel VARIAVEL No entanto, os caracteres pertencentes ao nome devem ser alfanumricos. e

2.2
2.2.1

Variveis a
Nomes

Em Pascal, os nomes das variveis no inferem seu tipo (ao contrrio de Fortran) j a a a a que no h suporte a tipagem dinmica. Ou seja, as variveis precisam ser declaradas a a a a denindo seu tipo.

2.2.2

Endereo c

E permitido que se decrare variveis com o mesmo nome em escopos diferentes (Ver a seao Escopo). Dessa forma, a varivel pode assumir endereos diferentes na pilha c a c em tempo de execuo. ca 7

Aliases E permitida a criaao de aliases em Pascal, atravs, por exemplo, da manipulao c e ca de ponteiros, como a seguir: program P o i n t e r s ; var i : integer ; p : integer ; q : integer ; begin i := 1 ; p := @i ; q := @i ; p := p + 2 ; q := q + 2 ; writeln ( O v a l o r de i : , i ) ; end .

2.2.3

Tipo

Os valores e intervalos dos tipos inteiros, reais e booleanos so mostrados respectia vamente nas tabelas 2.1, 2.2 e 2.3. Tabela 2.1: Tipos de Variveis Inteiras a Intervalo 0 .. 255 -128 .. 127 -32768 .. 32767 0 .. 65535 smallint ou longint longword -2147483648 .. 2147483647 0..4294967295 -9223372036854775808 .. 9223372036854775807 0 .. 18446744073709551615

Tipo Byte Shortint Smallint Word Integer Cardinal Longint Longword Int64 QWord

Tamanho em bytes 1 1 2 2 size 2 or 4 4 4 4 8 8

2.3
2.3.1

Binding
Binding de atributos a variveis a

Uma varivel pode ser caracterizada como um sxtuplo de atributos (nome, tipo, a e endereo, valor, tempo de vida, escopo) [4]. Estudemos, ento, em que momento c a ocorre a associaao de cada um desses atributos ` varivel, apartir do cdigo abaixo: c a a o 8

Tabela 2.2: Tipos de Variveis Reais a Tipo Intervalo D gitos Signicativos Tamanho em bytes Real Depende da plataforma ??? 4 ou 8 Single 1.5E-45 .. 3.4E38 7-8 4 Double 5.0E-324 .. 1.7E308 15-16 8 Extended 1.9E-4932 .. 1.1E4932 19-20 10 Comp* -2E64+1 .. 2E63-1 19-20 8 Currency** -922337203685477.5808 .. ??? 8 922337203685477.5807 O tipo Comp, que um inteiro de 64 bits, no est dispon e a a vel em todas as plataformas. **O tipo Currency um tipo real de ponto xo que internamente e e implementado como um inteiro de 64 bits. Tabela 2.3: Tipos de Variveis Booleanas a Nome Tamanho Verdadeiro Boolean 1 1 ByteBool 1 Qualquer valor no nulo a WordBool 2 Qualquer valor no nulo a LongBool 4 Qualquer valor no nulo a program a s s o c i a c a o ; var x , y : ( t i p o o m i t i d o para e f e i t o de e s t u d o ) ; begin ... x := y + 1 0 ; { s e x e y n o fossem p r e v i a m e n t e d e c l a r a d a s em va r o c o m p i l a d o r l a n a r i a uma e x c e s s o } ... end . 1. Nome: como podemos observar, existe um bloco para deniao de variveis c a designado pela palavra reservada var, e conhecemos a identicaao de uma c dada varivel, em tempo de compilao, como podemos observar em x e y. a ca a amos esse 2. Tipo: Qual seria o tipo da varivel x e y? Em que momento conhecer atributo da varivel? Logicamente, antes do tempo de execuo, at mesmo a ca e para efeito de vericao de tipo, logo, ocorre em tempo de compilao. ca ca 3. Endereo: A linguagem em estudo, exige a declaraao de uma varivel associc c a ada a um tipo, e justamente o tipo que ir determinar a quantidade de clulas e a e alocadas na memria para a varivel. E isso ocorre em tempo de compilao o a ca (Veremos mais adiante que Pascal apresenta escopo esttico, e isso implica a que o endereo efetivo de memria uma vinculaao em tempo de execuo, c o e c ca 9

pois linguagens que apresentam esse tipo de escopo so dinmicas de pilha, a a no entanto, em tempo de compilaao que todos os endereos so emitidos e c c a relativamente a uma origem zero, posteriormente realocveis). a 4. Que valores podem ter (amplitude) os tipos aritimticos? Isso vai depender e da implementao da linguagem, logo ocorre em tempo de implementaao. No ca c entanto, o valor de uma varivel pode variar em tempo de de execuo(RT), a ca de acordo a implementao do cdigo. Dessa forma forma Qual seria o valor ca o de x e de y? Depende do tempo de execuo(RT). ca 5. Tempo de vida: No caso, do cdigo que estamos analisando, a declaraao das o c variveis ocorre num escopo no-local(global), dessa forma tais variveis so a a a a alocadas na memria em tempo de compilao, e sua desalocaao somente o ca c ocorre no trmino da execuao do programa. No entanto, se as mesmas fosse e c declaradas dentro de uma procedure ou function, seu escopo seria limitado a tal bloco e seu tempo de vida, seria do in da chamada da execuao do cio c bloco, ao trmino da execuao do mesmo. e c 6. Escopo: No exemplo em questo, o escopo global. a e

2.3.2

Ligao de Tipo ca

Uma vez denida o tipo de uma varivel, no ser permitida a mudana para outro a a a c em tempo de execuao. Pois conforme, bem denimos na seao anterior, a dec c niao do tipo de uma varivel ocorre em tempo de compilaao, acarrentando numa c a c alocao de uma rea da memria para a varivel. Dessa forma, A deniao do tipo ca a o a c esttica. e a

2.3.3

Declarao de Variveis ca a

Em cada bloco, independente de que o mesmo tenha escopo local ou global, existe uma rea reservada, onde somente ali pode haver a declaraao de varivel, onde a c a e obrigatrio que a mesma seja denida com um nome associado a um tipo. Sendo o assim, o tipo de declaraao explicito. c e Na declarao de variveis, poss denir uma lista de nomes (identicadores) ca a e vel para um mesmo tipo: program t e s t e l i s t a ; var x , y : integer ; x := 0 begin ... end .

10

2.3.4

Vinculao de Memria e Tempo de Vida ca o

Conforme vimos nas subseoes anteriores, o endereo efetivo de memria uma c c o e vinculaao em tempo de execuao, pois linguagens que apresentam o tipo de escopo c c esttico (veremos mais adiante) so dinmicas de pilha, no entanto, em tempo a a a e de compilaao que todos os endereos so emitidos relativos a uma origem zero, c c a posteriormente realocveis. a O tempo de vida de uma varivel, logicamente ir depender de onde foi declarado a a seu ponto de deniao. Se seu ponto de deniao estiver em um escopo Global c c (vis vel por todos os blocos do programa), seu tempo de vida ser o tempo de a execuao do programa, ou seja, desde da sua alocao na memria, at o m da c ca o e execuao do programa. Se o ponto de deniao estiver num escopo local (vis c c vel somente dentro do bloco), seu tempo de vida estar restrito ao tempo da execuo a ca do bloco. Pascal no apresenta variveis esttica, ou seja variveis que apresentam a a a a sensibilidade a histria. o Como Veremos mais adiante, Pascal apresenta escopo esttico, e j denimos que a a o tipo ligado a variveis estaticamente, bem como o tempo de ligao de variveis e a ca a a memria, dessa forma, as variveis so dinmicas de pilha. o a a a

2.4

Checagem de Tipos

A checagem de tipos de Pascal permite por exemplo, como de costume em outras e linguagens, somar uma varivel real a uma inteira e atribuir esse valor a uma terceira a varivel real. Porm, no permite coisas do tipo: a e a program c h e c a g e m d e t i p o s ; var a : integer ; b : real ; c : integer ; begin a := 2 ; b := 2 . 0 ; c := a + b ; writeln ( v a l o r de c : , c ) ; end . Se tentssemos compilar este cdigo, o compilador diria: a o tipos.pas(12,8) Error: Incompatible types: got "Real" expected "SmallInt" tipos.pas(15) Fatal: There were 1 errors compiling module, stopping Fatal: Compilation aborted

11

2.5

Compatibilidade de Tipos

A checagem de tipos por estrutura de tipo (STC). Isso permite, por exemplo, que e um varivel do tipo integer seja atribu a uma varivel do tipo indice (denido a da a como um subintervalo do tipo integer). No entanto, nesta linguagem, no h a a a vericaao dos limites, como abaixo: c program c o m p a t i b i l i d a d e ; type i n d i c e = 1 . . 9 ; var a : integer ; b : indice ;

begin a := 1 0 ; b := a ; writeln ( O Valor de b : , b ) ; end . O cdigo acima compilado sem problemas no FPC, gerando a seguinte sa quando o e da executado: O Valor de b: 10 Outra possibilidade, devido ao fato de Pascal utilizar STC, somar um tipo com e seu sub-intervalo: program c o m p a t i b i l i d a d e ; type i n d i c e = 1 . . 9 ; var a : integer ; b : indice ;

begin a := 1 ; b := 3 ; writeln ( a + b = , a+b ) ; end . Que teria a seguinte sa da: a + b = 4 A linguagem no diferencia dois tipos denidos pelo programador com a mesma a estrutura. Como no cdigo abaixo: o 12

program temperatura ; type c e l s i u s = r e a l ; type f a h r = r e a l ; var a : celsius ; b : fahr ;

begin a := 1 ; b := a ; writeln ( a + b = , a+b ) ; end . Com a seguinte sa da: a + b = 2 Com isso, observamos que a linguagem Pascal insegura do ponto de vista de e checagem de tipos pois permite diversas maneiras de quebrar o sistema de tipos, especialmente em tipos denidos pelo programador.

2.6

Escopo

Variveis devem ter um ponto de denio que identicado com a palavra reservada a ca e var. program t e s t e ; // ponto de d e f i n i o de v a r i v e i s c o m e a a b a i x o : var num1 : integer ; palavra : s t r i n g ; valor : real ; // ponto de d e f i n i o de v a r i v e i s termina a k i begin ... end . O ponto denio poder ter um escopo local (vis somente em um bloco), ou ca a vel escopo no-local (vis pelo bloco e subblocos). a vel program inc num ; // ponto de d e f i n i o com e s c o p o g l o b a l var num : integer ; soma : r e a l ; frase : string ; function i n c r e m e n t a r : integer ; begin 13

i n c (num ) ; ... end ; { i n c r e m e n t a r } procedure menu ; // ponto de d e f i n i o com e s c o p o l o c a l : var opcao : integer ; begin ... read ( opcao ) ; incrementar .... end ; {menu} begin ... read (num ) ; menu ; end . { p r i n c i p a l } Nesse programa a varivel num tem escopo no local, assim ela vis tanto no a a e vel bloco menu, como no bloco incrementar , como no bloco principal. J a varivel a a opo somente ser vis no bloco menu (escopo local). ca a vel O escopo de cada ponto de deniao formado pelo seu bloco (incluindo todos c e os blocos fechados por esta regio). a

2.6.1

Subprogramas

Subprogramas so procedimentos formados por um ou mais procedimentos/funoes a c e um bloco principal. Conforme a seguir: ... procedure b i g ; var x : integer ; procedure sub1 ; begin ... dec ( x ) ; ... end ; { sub1 } procedure sub2 ; var x : integer begin ... inc (x ) ; ... end ; { sub2 } 14

begin x := 1 ; ... end ; { b i g } ... So vlidas as seguintes regras de escopo: a a Procedimentos/Funoes externos ao subprograma big no so vis c a a veis pelos procedimentos/funoes que esto internos ao mesmo, bem como estes no so c a a a vis veis por aqueles; sub1 vis por sub2 , no entanto este no vis por aquele. Ou seja e vel a e vel um procedimento s ser vis em outro procedimento se o mesmo foi previo a vel amente declarado;

2.6.2

Tipo de Escopo implementado pela Linguagem

A Linguagem em estudo utiliza o escopo esttico. De forma que se uma varivel dea a clarada em um subprograma tiver o mesmo nome de uma varivel denida num suba programa fechado pelo anterior, teremos dois endereos para uma mesma varivel; c a assim, o compilador busca, primeiramente, pela declaraao de uma varivel localc a mente (no subprograma mais interno), no encontrando-a sobe na hierarquia dos a ancestrais estticos. Ou seja, se ele encontra-la denida localmente, o base-point a apontar para o endereo de memria da varivel denida no escopo local, caso a c o a contrrio, o base-point apontar para o endereo de memria da varivel denida a a c o a no suprograma mais externo.

2.6.3

Avaliao do Escopo da Linguagem ca

Perceba que no cdigo anterior denimos uma varivel com o mesmo nome no escopo o a local (no ponto de deniao do sub-bloco sub2 ) e no-local (no ponto de deniao c a c (global) do subprograma big ). Nesse caso, Em sub2, o base-point aponta para o endereo de memria da varivel denida no escopo local de sub2 , j em sub1, c o a a aponta para a denida em um escopo (global) do subprograma big . Veja esta outra situaao: c ... procedure b i g ; var x : integer ; procedure sub1 ; begin ... dec ( x ) ; ... end ; { sub1 } procedure sub2 ; 15

var x : integer begin ... inc (x ) ; sub1 ; ... end ; { sub2 } begin x := 1 ; ... end ; { b i g } ... Perceba que sub2 faz chamada ao procedimento sub1. Em sub1 a varivel x a sofre uma atribuio, assim o compilador alterar o valor da varivel denida em ca a a qual ponto de denio do subprograma big ? ca Note que x no possui escopo local em sub1, logo, o base-point apontar para a a o endereo de memria da varivel no-local, um n c o a a vel acima de sub1, assim, o x acessado ser o da deniao (global) do subprograma big , isto ocorre porque o a c escopo do tipo esttico, dessa forma, ele denido em tempo de compilao, o e a e ca que no ocorreria em linguagens que apresentam escopo dinmico (se assim o fosse, a a como x redenido em sub2, e sub2 chama sub1, o base-point apontaria para a o e endereo da varivel x denida no escopo local de sub2, ou seja, o escopo s seria c a o determinado em RT). Em Blocos como if()then, else, while()do, repeat until, entre outros, no possel a e v denir variveis, semelhante a linguagens como C e Java, como mensionamos antea riormente, as variveis devem ser declaradas no ponto de deniao, no in de um a c cio programa ou subprograma, com a palavra reservada var.

2.6.4

Tempo de vida das variveis a

No poss declarar variveis estticas. Ou seja, o tempo de vida de variveis a e vel a a a denidas em Subprogramas do in da sua execuo at o seu trmino. Havendo e cio ca e e novas chamadas dos subprogramas, tais variveis so redenidas na memria. a a o

2.6.5
Observe:

Ambientes de referncia e

program exemplo ; var c , d : integer ; procedure sub1 ; var a , b : integer ; begin ... 16

end ; procedure sub2 ; var b , c : integer ; begin sub1 ; ... end ; // b l o c o p r i n c i p a l ( programa ) begin ... c := d ; sub2 ; ... end .

O bloco principal enxerga: as variveis globais: c,d a os subprogramas: sub1, sub2. O bloco sub1 enxerga: as variveis locais: a, b (sub1) a as variveis globais: c, d; a O bloco sub2 enxerga: as variveis locais: b,c (sub2) a o subprograma: sub1 as variveis globais: c, d a

2.7

Constante com Nome

A declarao de Contantes dada em um ponto de denio com a palavra reservada ca e ca const. Essa palavra reservada, constitui um bloco para declaraao de constantes. c Na Declaraao da Constante deve-se especicar um identicador e denir o valor c da mesma com o simbolo (=), no necessrio especicar o tipo. a e a A unica atribuio para constante ocorre no momento de sua deniao, pois ela ca c possui v nculo para valor permanente.

17

2.8

Inicializao da Varivel ca a

No poss a inicializaao da varivel no momento de sua denio como ocorre a e vel c a ca na linguagem Ada como abaixo: List : array(1 .. 3) of INTEGER := (0,5,5);

Por tanto, em Pascal, inicializaao deve ser feita no in c cio do bloco principal do programa.

18

Cap tulo 3 Tipos de Dados


As variveis, constantes e funoes possuem um tipo associado. Os tipos podem ser a c classicados como a seguir: Primitivo : integer, char, boolean, real, etc. Estruturados ou compostos: array, records, le. Apontadores ou ponteiros: um apontador de uma varivel que contm o a e endereo de uma outra varivel alocada dinamicamente. Os tipos simples c a tambm so chamados tipos primitivos. Os tipos estruturados so constru e a a dos a partir dos tipos primitivos.

3.1

Tipos Primitivos

Oferece 6 tipos de dados primitivos. Para cada um destes tipos, h um limite de a valores que eles podem assumir e um conjunto de operadores que os manipulam ou permitem que eles sejam convertidos ou utilizados em conjunto com os outros tipos. Os tipos que a linguagem oferece so: INTEGER, BYTE, REAL, BOOLEAN, a CHAR e STRING. Destes, os tipos Byte e String no constavam na denio inia ca cial do Pascal e podem no ser encontrados em alguns compiladores. Para mais a informaoes sobre a variaao de tipos inteiros, real e booleanos, ver seao 2.2.3. c c c Integer: armazenam nmeros inteiros (naturais) cujos valores estejam entre u (MAXINT+1) e MAXINT. MAXINT uma constante predenida que pode e variar de sistema para sistema ou de compilador para compilador. No ambiente Free Pascal, por exemplo, MAXINT vale 32767. Isto signica que os nmeros u neste compilador variam entre -32766 a 32767 e ocupam dois bytes (16 bits, que geram 65536 combinaes poss co veis de armazenamento); Byte: subconjunto do tipo Integer que armazena valores entre 0 e 255. Este tipo ocupa 1 byte (8 bits, que geram 256 combinaoes); c u c Real: esse tipo armazena nmeros reais positivos e negativos (incluindo fraoes). No turbo Pascal este tipo ocupa 6 bytes de memria (48 bits), mas o nmero o u no armazenado como nos outros tipos. Neste caso, o numero armazenado a e e 19

num formato conhecido por formato cient co, onde ele dividido em duas pare tes: a mantissa e o expoente. A mantissa contm nmeros signicativos do e u numero real automaticamente normalizadas pelo computador para um valor fracionrio na faixa entre 1 e 10. O expoente um valor inteiro positivo ou a e negativo que indica a posiao da v c rgula no nmero. Para calcular o nmero u u armazenado, deve-se aplicar a seguinte frmula (isso feito automaticamente o e pelo computador): numero = mantissa 10expoente Veja o exemplo de alguns nmeros: u 10.45 = 0.1045*10^+2 0.00056993 = 0.56993*10^-3 ou ou 1.0450000000E+01 5.6993000000E-04

Esse tipo de representaao pode ocasionar alguns erros ou perdas, principalc mente quando se est calculando nmeros com muitas casas decimais ou muito a u grandes, pois se o nmero de casas de uma soma, por exemplo, ultrapassar o u nmero mximo de casas que o computador usa para armazenar o nmero, ele u a u ser arredondado; a c Char: abreviaao da palavra inglesa character, que signica caractere. Como o prprio nome indica, serve para armazenar um unico caractere (uma leo tra, d gito ou s mbolo). Ocupa 1 byte de memria, o que signica que pode o armazenar 256 combinaoes de bits. Esse exatamente o tamanho da tac e bela Americana de Cdigos Padro para a Troca de Informaes (ASCII), que o a co contm uma lista de 256 caracteres que variam entre caracteres de controle, e letras, d gitos e s mbolos. Cada um deles possui um cdigo (um nmero) xo. o u Atravs do nmero poss se descobrir o caractere correspondente na tabela e u e vel e vice-versa. String: Armazena cadeias de caracteres. No fundo o mesmo que um vetor e de Chars, cujo tamanho mximo o de 255 caracteres. Possui um byte (na a e posiao 0) que indica quantas letras a string possui armazenada dentro dela; c Boolean: armazena valores lgicos que variam entre true (verdadeiro) ou o false (falso). So muito utilizadas em variveis do tipo ag e em testes a a condicionais.

3.2

Tipos de String de Caracteres

A linguagem pascal fornece o tipo de dado STRING que nada mais do que e uma sequncia de caracteres com uma especicaao opcional de tamanho. O vae c lor mximo do tamanho de uma varivel do tipo STRING de 255 caracteres. a a e

20

3.2.1

Questes de Projeto o

Em pascal, o tipo STRING um tipo especial de vetor (array), pois permite e operaoes semelhantes `s de um vetor. c a Variveis de tipo STRING tm comprimento dinmico limitado.Ver 3.2.3. a e a

3.2.2

Strings e suas Operaes co

Em Pascal as strings so tratadas como um array de char, permitindo as operaoes a c do tipo: program s t r i n g s ; var mensagem : s t r i n g ; begin mensagem := H e l l o World ! ; ( writeln ( mensagem [ 2 ] ) ; end . Que resultaria na seguinte sa da: e Como STRINGS so vetores, muitas operaes do tipo array so permitidas. A a co a implementaao Free Pascal permite as seguintes funes para operaoes com o tipo c co c STRING mostradas na tabela 3.1.

3.2.3

Opes de tamanho de Strings co

Como j foi dito, em Pascal, as strings tm o comprimento dinmico limitado. Se a e a forem declaradas sem a especicaao do comprimento, podero crescer livremente c a at o comprimento mximo de 255 caracteres. Do contrrio, ou seja, se seu tamanho e a a for declarado, passar a ser o limite mximo da string. a a

3.2.4

Implementao de Strings ca

Pelo fato do tamanho das strings ser dinmico limitado, um descritor criado, a e durante a compilaao, com os seguintes dados: c Comprimento mximo; a Comprimento atual; Endereo. c Esse descritor mantido durante o tempo de execuo pois os dados de comprie ca mento atual e comprimento mximo so necessrios durante a execuo. a a a ca 21

Tabela 3.1: Funoes para Strings c Nome Descrio ca AnsiCompareStr Compara duas strings AnsiCompareText Compara duas strings, insens a caixa vel AnsiExtractQuotedStr Remove aspas da string AnsiLastChar Retorna o utimo caracter da string AnsiLowerCase Converte string para caixa baixa AnsiQuotedStr Pe aspas numa string o AnsiStrComp Compara strings, sens a caixa vel AnsiStrIComp Compara strings, insens a caixa vel AnsiStrLComp Compara caracteres L de strings, sens a caixa vel AnsiStrLIComp Compara caracteres L de strings, sens a caixa vel AnsiStrLastChar Retorna o utimo caracter da string AnsiStrLower Converte string para caixa baixa AnsiStrUpper Converte string para caixa alta AnsiUpperCase Converte string para caixa alta AppendStr Concatena 2 strings AssignStr Atribui valores para strings num heap CompareStr Compara duas strings, sens a caixa vel CompareText Compara duas strings, insens a caixa vel DisposeStr Remove uma string do heap IsValidIdent A string um identicador pascal vlido? e a LastDelimiter Ultima ocorrncia de um caracter numa string e

3.3
3.3.1

Tipos Ordinais Denidos pelo Usurio a


Enumerao ca

Em Pascal poss utlizar os chamados set types que permitem denies do tipo: e vel co Days = (Mon, Tue, Wed, Thu, Fri, Sat, Sun); No entanto, cada uma dessas constantes simblicas denidas como elementos pero tencentes ao tipo devem ser unicas. As mesmas tambm podem ser usadas como e subscritos em laos como for e seletores como case. Tambm so permitidas comc e a paraoes com base em suas posies relativas na enumerao. c co ca A tabela 3.3 lista as operaoes para os set types e os respectivos s c mbolos aos quais esto associadas. a

3.3.2

Subintervalos

Pascal permite que se dena tipos a partir de subintervalos de tipos pr existentes. e Pode se criar, por exemplo, um tipo hora como um subintervalo dos inteiros: type hora = 1 . . 2 4 ; ( d e f i n e um t i p o de dados hora ) Neste caso, o tipo de dados hora herda as operaoes do tipo base, ou seja, os c inteiros. 22

Tabela 3.2: Continuao: Funes para Strings ca co LeftStr Retorna os N primeiros caracteres da string LoadStr Carrega a string LowerCase Converte string para caixa baixa NewStr Alloca uma nova string no heap RightStr Retorna os ultimos N caracteres da string StrAlloc Aloca memria para a string o StrBufSize Reserva memria para a string o StrDispose Remove a string do heap StrPas Converte PChar para pascal string StrPCopy Copia pascal string StrPLCopy Copia N bytes da pascal string UpperCase Converte a string para caixa alta Tabela 3.3: Operaoes dos Set Types c Operaao c Operador Unio a + Diferena c Intersecao c * Adicionar elem. include Deletar elem. exclude

3.3.3

Implementao de tipos Ordinais ca

Em pascal os subintervalos no so checados, porm os tipos so checados via STC, a a e a veja seo 2.5. ca

3.4

Arrays

Um Array deve ser estruturado como um mapeamento de cada valor especicado por um indice para um componente distinto. Cada componente deve ter o mesmo tipo. O tipo, a vinculaao e o estado inicial denido pela deniao do tipo do c e c componente, ocorrendo em tempo de compilao. ca Um Array denido no bloco reservado para declarao de variveis da seguinte e ca a forma: lista_de_nomes : array[<min>..<max>] of <element_type>; Tambm permitido este tipo de sintaxe: e e lista_de_nomes : array[<min>..<max>] of array[<min2>..<max2>] of <element_type>; {or} lista de nomes : array[<min>..<max>, <min2>..<max2>] of <element_type>; Isto permitiria, por exemplo, denir uma lista com ndices de tipos diferentes. Vejamos um Exemplo de uma implementao de um array: ca 23

program l i s t a 2 ; var a : array [ A . . Z ] of integer ; s : string ; i : byte ; begin write ( D i g i t e uma f r a s e : ) ; readln ( s ) ; { l e r a s t r i n g } for i := 1 to l e n g t h ( s ) do { e x e c u t a o c o d i g o para cada l e t r a da s t r i n g } i f upcase ( s [ i ] ) in [ A . . Z ] then i n c ( a [ upcase ( s [ i ] ) ] ) ; { c o n t a o numero de v e z e s que uma l e t r a a p a r e c e } writeln ( The number o f t i m e s th e l e t t e r A a p p e a r s i n t h e s t r i n g i s , a [ { r e t o r n a 5 s e a S t r i n g eh Abracadabra } readln ( ) ; end . Isto criaria um array de [Newbie,,,,,John,,].

3.4.1

Questes de Projeto o

Os tipos admitidos como subscritos so : Integer, Real e Char. a Pascal Verica a validade dos limites do Array. Os intervalos dos subscritos so a de tamanhos xos e so vinculados, juntamente com todos os atributos que denem a o array em tempo de compilaao. c Como permitido em um mesmo array, subscritos com tipos diferentes, e ao e mesmo tempo poss e vel declaraes de matrizes n-dimensionais, de acordo com a o capacidade da memria, conclui-se que, no h limites de subscritos. o a a Arrays, anlogamente `s variveis normais, no podem ser inicializado no moa a a a mento da sua alocao, mas podem ser inicializados no bloco principal. ca

3.4.2

Arrays e ndice

Para fazermos referencia a um componente individual do array atravs dos e ndices, utilizamos []. Como ndice ou subscritos, usamos qualquer tipo ordinal escalar como: inteiros, booleanos, enum, ou caracteres. Segue um exemplo de um Array implementando ndices com caracteres: program l i s t a 2 ; var a : array [ integer ] of integer ; s : string ; i : byte ; begin write ( D i g i t e uma f r a s e : ) ; readln ( s ) ; { l e r a s t r i n g } for i := 1 to l e n g t h ( s ) do { e x e c u t a o c o d i g o para cada l e t r a da s t r i n g } i f upcase ( s [ i ] ) in [ A . . Z ] then i n c ( a [ upcase ( s [ i ] ) ] ) ; 24

{ c o n t a o numero de v e z e s que uma l e t r a a p a r e c e } writeln ( O numero de v e z e s que a l e t r a A a p a r e c e eh 5 , a [ A ] ) ; { r e t o r n a 5 s e a S t r i n g eh Abracadabra } readln ( ) ; end . Poderiamos declarar um Array com ndices booleanos da seguinte forma: logico : array [boolean] of real ;

3.4.3

Vinculao de Subscritos e Intervalo de Validade ca

A vinculao do tipo do subscrito do Array ocorre de forma esttica. ca a O intervalo de validade do Array vericado, ou seja se tentarmos atribuir um e valor para um ndice do array que esteja fora do intervalo, ser lanada uma excesso. a c a O limite inferior do array livre, o programador que dene. e A vinculaao do intervalo de validade do array dada em Pascal de forma c e esttica, em tempo de compilaao, na maioria dos compiladores de Pascal, como a c o caso do Turbo Pascal. e Apartir da verso 1.1 do Free Pascal, so implementados arrays dinmicos de a a a pilha xos: Neste caso o limite do array omitido. A sintaxe da declaraao de um e c array dinamico dada a seguir: e var a: array of byte; Em algum momento o tamanho do array deve ser denido, visto que a vinculaao c do intervalo de ndice esttica, dena-o com a funo setLength; e a ca SetLength( a, 10 ); Depois da chamada do setLength, os ndices vlidos do array so de 0 a 9. a a Note que o tamanho do array xado em elementos, no em bytes da memria e a o alocada (embora estas possam ser as mesmas). A quantidade de memoria atribu da o tamanho do array multiplicado pelo tamanho de 1 elemento do array. A memria e o ser liberada ao nal, no nal do bloco, ou, caso seja denida no ponto de deniao a c global, no nal do programa. O limite inferior desse array tem valor default 0 (zero), e seu tamanho length(a)e 1. Para retornar o tamanho corrente do array, use a funo length, semelhante ao ca tipo String. Tambm poss redimensionar o array: nesse caso, como grande parte dos e e vel elementos do array ir caber na nova dimenso, os elementos sero mantidos, a a a a matriz pode ser redimensionada para 0, o que efetivamente, reseta a o array. Arrays dinmicos so referncias contadas: A atribuiao de um array dinnico a a e c a para outro permitir que as duas variveis apontem para o mesmo array. Contrariaa a mente, a atribuio de um elemento de um array ser reetida no outro: no existe ca a a copy-on-write. Considere o seguinte exemplo:

25

Var A, B : TByteArray ; begin SetLength (A, 1 0 ) ; A[ 0 ] : = 3 3 ; B:=A; A[ 0 ] : = 3 1 ; Depois da segunda atribuiao, o primeiro elemento de B tambm ter valor 31. c e a Veja tambm o cdigo abaixo: e o program e x e m p l o d i n a m i c a r r a y ; var i : integer ; a : array of byte ; begin randomize ; s e t l e n g t h ( a , 1 0 ) ; { c o n t e r a 10 e l e m e n t o s ramdomicos } for i := 0 to l e n g t h ( a)1 do a [ i ] := random ( 1 0 ) + 1 ; end . A memria automaticamente liberada quando o array no mais usado, mas o e a e voc pode liber-la antes por atribuio de valor nulo para a varivel, o que equivale e a ca a a denir um array de length de 0.

3.4.4

N mero de u ndices

Como permitido em um mesmo array subscritos com tipos diferentes, e ao mesmo e tempo poss declaraes de matrizes n-dimensionais, de acordo com a capacidade e vel o da memria, conclui-se que, no h limites de subscritos. o a a

3.4.5

Inicializao ca

Arrays, analogamente `s variveis normais, no podem ser inicializados no momento a a a da suas alocaoes, mas podem ser inicializados no bloco principal. c

3.4.6

Operaes de Arrays co

Funo de Cpia e Redimensionamento ca o E poss copiar e / ou redimensionar um array dinmico com a funo Copy, que vel a ca atua como a funo para copiar texto: ca program t e s t a r r a y 3 ; Type TA = array of Integer ; 26

var A, B : TA; I : Integer ; begin S e t l e n g t h (A, 1 0 ) ; For I :=0 to 9 do A[ I ] : = I ; B:=Copy (A, 3 , 6 ) ; For I :=0 to 5 do Writeln (B [ I ] ) ; end . A funao Copy ir copiar 6 elementos do array para um novo array. Comeando c a c no elemento no ndice 3 (ou seja, o quarto elemento) do array. A funao low em um array dinmico sempre vai retornar 0, e a fun ao high c a c ir devolver o valor length-1, ou seja, o valor mais elevado do a ndice permitido no array. Empacotamento Arrays podem ser embalados e bitpacked. Dois tipos de Array que tm o mesmo e tipo de ndice e tipo de elemento, mas que so embalados de forma diferente no a a so de atribuies compat a co veis. No entanto, poss converter um array normal para um array bitpacked com e vel a rotina pack. A operao inversa tambm poss ca e e vel, um array bitpacked pode ser convertido para um array normalmente embalado usando a rotina de empacotamento, como no seguinte exemplo: program Var foo : = ( bar : baz : Oparray ; array [ a . . false , false , packed array array [ 0 . . f ] of Boolean true , f a l s e , f a l s e , f a l s e ) ; [ 4 2 . . 4 7 ] of Boolean ; 5 ] of Boolean ;

begin pack ( foo , a , bar ) ; unpack ( bar , baz , 0 ) ; end . As demais operaes podem ser emuladas via implementao. co ca

3.5

Tipos Registros

A linguagem Pascal suporta tipos registros xos e com partes variantes, esta ultima modalidade est bem descrita na seao 3.6. a c 27

3.5.1

Questes de Projeto o

A sintaxe das referncias aos campos de um record em pascal NomeDaVariae e vel.Campo. O exemplo da abaixo demonstra a sintaxe de um registro e da sua interface no programa: program R e g i s t r o ; type p e s s o a=record nome : s t r i n g [ 6 0 ] ; endereco : s t r i n g [ 6 0 ] ; fone : s t r i n g [ 1 3 ] ; email : s t r i n g [ 6 0 ] ; end ; var pes : array [ 1 . . 5 0 ] of p e s s o a ; i : integer ; quantpes : integer ; begin writeln ( Quantas p e s s o a s d e s e j a i n c l u i r ? l i m . de 50 p e s s o a s ) ; readln ( quantpes ) ; for i :=1 to quantpes do begin writeln ( d i g i t e o nome da , i , p e s s o a : ) ; readln ( pe s [ i ] . nome ) ; writeln ( d i g i t e o e n d e r e c o da , i , p e s s o a : ) ; readln ( pe s [ i ] . e n d e r e c o ) ; writeln ( d i g i t e o t e l e f o n e da , i , p e s s o a : ) ; readln ( pe s [ i ] . f o n e ) ; writeln ( d i g i t e o e m a i l da , i , p e s s o a : ) ; readln ( pe s [ i ] . e m a i l ) ; end ; end . Tambm podem ser feitas referncias el e e pticas usandos blocos with como veremos mais ` frente. a

3.5.2

Denies de Registros co

Em Pascal a hierarquia feita via registros aninhados, isso signica que poss e e vel declarar um registro dentro do outro e dessa forma a referncia aos campos ter a e a forma: RecordExterno.RecordInterno.Campo

3.5.3

Referncias a Campos de Registros e

Geralmente as referncias a campos de registros em Pascal so completamente quae a licadas, de forma que deve-se fazer refncias aos campos especicando os registros e 28

dos quais so oriundos. Mas tambm poss usar referncias el a e e vel e pticas por meio de blocos with, onde se especina no in do bloco a hierarquia dentro da qual cio estaro os campos refernciados dentro do bloco: a with REC EMP.EMP NOME begin NOME=Joaquim ; end ;

3.5.4

Operaes em Registros co

A linguagem Pascal no permite operaoes com registros. Nem mesmo atribuioes a c c entre campos de mesmo tipo.

3.5.5

Implementao de Tipos Registros ca

Free Pascal armazena os campos do registro de forma sequencial na memria, porm, o e para obter melhor desempenho, aloca na memria o nmero de bytes equivalente ` o u a potncia de 2 mais prxima do nmero de bytes requeridos por aquele campo. e o u

3.6

Tipo Unio a

Em algumas situaoes se torna dif escolher o tipo de uma varivel, uma vez que c cil a durante a execuo seria conveniente que ela pudesse assumir valores de mais de um ca tipo. Assim, se uma varivel pode assumir valores de dois tipos t1 e t2, torna-se a conveniente construir para ela um tipo que compreenda valores de ambos: a unio a de t1 e t2. A simples unio entretanto, no resolve o problema, e necessrio a a e a preservar, para consulta posterior, o tipo original do valor corrente da varivel. A a unio discriminada de dois tipos t1 e t2 um tipo que abrange os valores de t1 e t2, a e mas, adicionalmente, preserva o tipo original de cada valor, e, assim, seu uso permite evitar, durante a execuao, que uma operaao denida para valores de um tipo seja c c aplicada a valores de outro, o que tem usualmente consequncias desastrosas. e

3.6.1

Unio Discriminada a

A vericaao de tipos em unies exige que cada construo inclua um indicador de c o ca tipo. Esse indicador chamado marca ou discriminante. e Foi o Pascal que introduziu o conceito de integrar unies discriminadas com o uma estrutura de registro. A uni o descriminada, nesse caso chamada registro a e variante ou parte variante de um registro. O discriminante uma varivel acess e a vel ao usurio no registro que armazena o valor do tipo atual da variante. O exemplo a seguinte ilustra um registro Pascal com uma parte variante: type t = record case ta g : boolean of true : ( a , b : r e a l ; ) ; f a l s e : ( c : integer ; ) ; 29

end ; var v : t ;

3.6.2

Questes de Projeto o

As Unies em Pascal so implementadas atravs de variantes em Registros. o a e H Vericaao de tipo, no entanto no so vericados todos os casos poss a c a a veis. Mesmo tendo havido uma tentativa de, pelo menos, considerar esta vericaao em c seus registros variantes, h dois problemas distintos. O primeiro que o programa a e no pode trocar o discriminante sem fazer a correspondente mudana na variante. a c Portanto, mesmo que o sistema verique o tipo da variante em tempo de execuo ca ao examinar o discriminante antes de us-lo, ele poderia no detectar todos os erros a a de tipo; o programa pode ter mudado o discriminante, de modo que seu valor, agora, incoerente com o tipo da varivel atual. e a O segundo problema que o programador pode simplesmente omitir a marca da e estrutura do registro variante, transformando-a em uma unio livre. Considere o a Seguinte exemplo: type forma = ( c i r c u l o , t r i a n g u l o , r e t a n g u l o ) ; c o r e s = ( vermelho , verde , a z u l ) ; f i g u r a = record ... case forma of c i r c u l o : ( diame tro : r e a l ) ; t r i a n g u l o : ( l a d o e s q u e r d o : integer ) ; ... end ; Com essa estutura, nem o usurio, nem o sistema tm qualquer maneira de a e determinar o tipo variante atual. Suponhamos que o valor de minhagura.dimetro a seja 2,73. No existe maneira alguma de proteger-se de referncias incorretas como, a e por exemplo Lado := minhafigura.ladoesquerdo;

3.6.3

Avaliao ca

Unio so construes potencialmente inseguras. No caso de Pascal, proporcionam a a co exibilidade programao, ao permitir a aritimtica de ponteiors. ca e

3.6.4

Implementao de Tipos Unio ca a

As unies so implementadas simplesmente usando-se o mesmo endereo para toda o a c variante poss vel. alocado um armazenamento suciente para a maior variante. A e marca de uma unio discriminada armazenada com a variante em uma estrutura a e assemelhada a registros. 30

Durante a compilaao, a descriao completa de cada variante deve ser armazec c nada. Isso pode ser feito associando-se uma tabela de casos com a entrada da marca no descritor.

3.7

Tipos Ponteiros

Uma das caracter sticas mais marcantes do pascal permitir a criaao e destruio e c ca de variveis durante a execuo do programa. O uso dessas variveis possibilita a a ca a implementaao das estruturas de dados dinmicas. Essas variveis criadas e desc a a tru das durante a execuo do programa so chamadas variveis dinmicas. Uma ca a a a varivel dinmica no declarada na parte de declaraao de variveis porque esta a a a e c a ainda no existe antes do seu tempo de execuao, ela no possui sequer um nome, a c a cando a cargo dos ponteiros desempenhar esta funo de nome. Uma varivel ca a dinmica sempre referenciada indiretamente por um apontador, ou seja, para cada a e varivel dinmica criada deve existir um apontador, que literalmente aponta para a a ela, permitindo a sua manipulaao. c

3.7.1

Questes de Projeto o

Os ponteiros so usados somente para gerenciamento de armazenamento dinmico a a de variveis annimas. a o As variveis dinmicas so criadas e destru a a a das durante a execuo do proca grama. Deve-se indicar qual o tipo da varivel o ponteiro ir armazenar o endereo a a c

3.7.2

Operaes com Ponteiros co

Inclui as duas operaoes fundamentais: atribuio e desreferenciamento. A atribuiao c ca ocorre com new e o desreferenciamento ocorre com dispose. A primeira operao xa ca o valor de uma varivel de ponteiro em em endereo util. As variveis de ponteiros a c a so usadas somente para armazenamento dinmico , logo, o mecanismo de alocao a a ca serve para inicializ-la. A segunda operao (ver seao 3.7.5) a ca c

3.7.3

Problemas com Ponteiros

Os principais problemas decorrem da operaao de desreferenciamento (ver seao c c 3.7.5), que nem sempre implementada. e

3.7.4

Ponteiros Pendurados

Podem ser criados facilmente porque Pascal inclui uma operaao de desalocaao c c expl cita. Um programador Pascal cria variveis dinmicas no monte com new e as a a destri com dispose (ver seo 3.7.5). o ca

31

3.7.5

Variveis Dinmicas de Heap Perdidas a a

Um programador Pascal cria variveis dinmicas no monte com new e as destri a a o com dispose. Para destru -las com segurana, seria necessrio que a funao dispose c a c localizasse e xasse em nil todos os ponteiros que apontam para aquela que est a sendo destru da. Infelizmente, esse processo complexo e custoso e, em consequencia e disso, raramente implementado dessa maneira. e Os implementadores do Pascal escolhem entre as seguintes alternativas para desalocao expl ca cita: c e Simplesmente ignorar o dispose em cujo caso nenhuma desalocaao feita, e nenhum dos ponteiros que estavam apontando para o objeto dinmico no a monte em questo mudado. a e No incluir dispose na linguagem, tornando-o uma instruao ilegal. a c Desalocar, de fato, a varivel dimica no monte em questo e xar em nil o a a a ponteiro de parmetro para dispose, criando, assim, ponteiros pendurados a a partir de quaisquer outros ponteiros que estejam apontando para o objeto. Implementar dispose completa e corretamente, inibindo os ponteiros pendurados.

3.7.6

Ponteiros No Pascal

No Pascal, os ponteiros so usados somente para acessar variveis annimas alocaa a o das dinamicamente. Quanto a ponteiros pendurados (ver seao 3.7.4). Segue um c exemplo de manipulaao de ponteiros: c program M a n i p u l a c a o V a r i a v e i s D i n a m i c a s ; type nome = s t r i n g [ 3 0 ] ; p o n t e i r o = nome ; var p1 , p2 : p o n t e i r o ; begin new( p1 ) ; new( p2 ) ; readln ( p1 ) ; p2 := J o s Maria ;

p1 := p1 + + p2 ; writeln ( p1 ) ; end . 32

Cap tulo 4 Expresses e Instruoes de o c Atribuio ca


4.1
4.1.1

Expresses Aritimticas o e
Expresses Aritmticas o e

Apenas existem operadores aritmticos unrios ou binrios, e necessrio explicitar e a a e a os operadores binrios entre cada dois operandos: 1 + 2 + 3. Um operador deste tipo a diz-se inxo (in signica entre). Se se pretender um operador ternrio (ou outro) a j no se consegue escrever do mesmo modo, sendo necessrio implement-lo como a a a a uma funao. Operadores unrios so not (booleano negao), e + (muda o sinal c a a ca de um operando). Operadores binrios so: =,-,div,/, mod e *. a a Com excesso do Div e Mod, que aceitam somente expresses e operandos ina o teiros, todos os demais operadores aceitam expresses e operandos inteiros e reais. o Para operadores binarios, o tipo de resultado sera inteiro se ambos operandos so a tipos inteiros. Se um operando tipo real, ento o resultado real. Uma excesso e a a e a diviso, que resulta sempre valores reais. a Para operadores unrios, o tipo de resultado sempre equivale ao tipo da exa presso. A diviso (/) e Mod causaro erros em tempo de execuao se o segundo a a a c argumento zero. e Os operadores que ns denimos usam-se exatamente da mesma maneira que os o operadores da linguagem: operador primeiro e operandos a seguir. Em Pascal, os operadores so inxos, isto , esto entre os operandos, e as funes e procedimentos a e a co por ns denidos so prexos, i.e., primeiro a funao ou procedimento e depois os o a c operandos. Isto impede a extenso da linguagem de uma forma coerente, ou seja, a sua ortogonalidade. Para exemplicar este ultimo aspecto, consideremos a operao de exponenciaao ca c em Pascal. Para ser coerente com o resto da linguagem, deveria existir um operador, por exemplo que permitisse escrever 3 4 para indicar a quarta potncia de 3. e Como esse operador no existe na linguagem (standard), somos obrigados a criar a uma funo que o substitua mas, neste caso, a sintaxe muda radicalmente. Esta ca funao, como se usa de forma prexa no se pode tornar coerente com as restantes c a operaes do Pascal, como a soma e a multiplicao. co ca 33

4.1.2

Questes de Projeto o

As regras de precedncia para operadores veremos detalhes na proxima sesso. A e a regra de associatividade ocorre da esquerda para a direita conforme; Pascal no a admite sobrecarga de operadores;

4.1.3

Ordem de Avaliao de Operadores ca

Precedncia e
As regras de precedncia para operadores so as seguintes: e a mais alta : *,/,div, mod; mas baixa : todos, +,-;

Associatividade
Considere a seguinte expresso: a a-b+c-d Como os operadores de adio e subtrac co tm o mesmo nivel de precedncia, ca a e e as regras de precedncia nada dizem sobre a ordem de avaliao dos operadores e ca nessa expresso. a Quando uma expresso contm duas ocorrncias adjacentes de operadores com a e e o mesmo n de precedncia, a avaliaao ocorre da da esquerda para direita, sigvel e c nicando que a primeira ocorrncia ser avaliada antes. e a

Expresses Condicionais o
Pascal no d suporte a expresses condicionais ternrias, ou seja no d suporte a a a o a a a ?: como em C e Java.

4.1.4

Ordem de Avaliao dos Operandos ca

A linguagem no garante nenhuma ordem. a

Efeitos Colaterais
veja o cdigo a seguir: o program c o l a t e r a l ; var a : integer ; function fun ( a : integer ) : integer ; begin fun := a div 2 ; end ; 34

procedure fun2 ; var a : integer ; begin a := 1 0 ; a := a + fun ( a ) ; writeln ( a ) ; end ; begin fun2 ; end . Fica a dvida se fun modica ou no o valor de a, antes de resolver a expressao: u a a = a + fun() Ou seja ca a dvida se o valor de a 10 ou 15. Tomando como base que o escopo u e em Pascal esttico, o valor de a o valor da inicializao no bloco principal, logo e a e ca o valor dessa expresso 10. a e

4.2

Sobrecarga de Operadores

A linguagem Pascal evita a sobrecarga de operadores em tempo de design. Um bom exemplo operador de diviso que diferente para operandos inteiros e do tipo oat. e a e Por exemplo, quando se quer dividir um inteiro por outro e armazenar o resultado em uma varivel do tipo oat (j que o resultado pode ser no inteiro), pode-se a a a fazer: f := b/c;

Mas se quisermos que o resultado seja truncado para um inteiro, precisamos usar o operador de diviso inteira Div: a n := a Div b; Embora a sobrecarga de operadores seja evitada em tempo de design, a linguagem permite que o usurio sobrecarregue operadores, por exemplo: a var R : real ; C, Z : complex ; begin C:=RZ ; end ; Operator ( r : r e a l ; z1 : complex ) z : complex ;

35

begin z . r e := z1 . r e r ; z . im := z1 . im r ; end ; Em casos como este o compilador tentar utilizar o operador padro, porm, a a e como a checagem de tipos no permitir isso, ele procurar algum operador denido a a a para aquela combinaao de tipos. c

4.3
4.3.1

Converso de Tipo a
Coero em Expresses ca o

Nas atribuioes entre tipos ordinais (integer, byte, char, word, boolean, enumeraes), c co ou entre tipos e subtipos, o cast impl e cito, conforme vimos em 2.2.3, independentemente de ser converso de alargamento ou de estreitamento. Nas atribuioes de a c alargamento, como por exemplo, atribuies de tipo integer para real, ocorre cast co impl cito. O contrrio, no permitido, a menos que se faa um truncamento, a a e c atravs da funo trunc, da varivel do tipo real. Ou seja operaoes entre variveis e ca a c a real e integer atribu das a uma varivel do tipo real permitido, j tais operaes a e a co atribu das a variveis tipo integer no vlido. Concluimos assim, que somente so a a e a a poss veis converses impl o citas de alargamento.

4.3.2

Converso de Tipo Expl a cita

Algumas vezes necessrio mudar o tipo de uma expresso, ou parte da expresso, e a a a para termos tipos compat veis. Isto feito atravs de typecast de valor. Typecast de e e valor no pode ser usado no lado esquerdo de atribuies, como typecasts variveis. a co a Aqui esto alguns typecasts vlidos: a a Byte(A) Char(48) Boolean(1) longint(@Buffer) Em geral, o tamanho do tipo de uma expresso e o tamanho do cast do tipo a deve ser o mesmo. No entanto, para tipos ordinais (byte, char, word, boolEean, enumeraoes), eles podem ser usados indiferentemente. No Free Pascal poss c e vel fazer typecasts de variveis conforme exemplo: a Var C : Char; B : Byte; begin B:=Byte(C); Char(B):=C; end; 36

4.4

Expresses Relacionais e Booleanas o

Alm de expresses aritimticas, Pascal tambm permite expresses booleanas e reo e e o lacionais.

4.4.1

Expresses Relacionais o

Em Pascal as expresses relacionais podem ser construidas com os seguintes operao dores relacionais (Tabela 4.4.1). Operao ca Igual No Igual a Maior que Menor que Maior ou igual Menor ou igual S mbolo Pascal = <> > < >= <=

Tabela 4.1: Operadores relacionais em Pascal Em pascal, como na maioria das linguagens, esses operadores tm precedncia e e menor que operadores aritimticos. e

4.4.2

Expresses Booleanas o

Uma expresso booleana em pascal pode ser composta de variveis booleanas, consa a tantes booleanas e expresses relacionais. A tabela 4.4.2 seguinte expe os operadoo o res booleanos em Pascal: Operao ca Negaao lgica c o E lgico o OU lgico o OU exclusivo S mbolo Pascal not and or xor

Tabela 4.2: Operadores booleanos em Pascal E interessante enfatizar que em pascal os operadores booleanos tm precedncia e e maior que os relacionais, de forma que a seguinte expresso resultaria em um erro a de compilao: ca A > B or C < D

Se quisssemos avaliar a forma acima precisar e amos do uso de parnteses. Outro e fato interessante que a avaliao sempre ser feita em curto circuito. Por exemplo, e ca a se um operando de um and for falso, o outro operando nem sequer ser avaliado, a pois j se sabe, desde j, que o resultado da expresso ser falso. a a a a

37

4.5

Avaliao em Curto-circuito ca

Como j foi dito na seao anterior, em Pascal, as expresses booleanas sempre so a c o a avaliadas em curto-circuito.

4.6

Atribuio de Modo Misto ca

Pascal inclui alguma coerao de atribuio; por exemplo, valores integer podem ser c ca atribu dos a variveis real, mas no o contrrio. a a a

4.7
4.7.1

Instrues de Atribuio co ca
Atribuioes Simples c

A sintaxe bsica de uma atribuiao em Pascal , como na maioria das linguagens, a a c e seguinte: <variavel_alvo> <operador_de_atribuicao> <expressao> Para evitar confuso com o s a mbolo do operador relacional de igualdade =, a linguagem opta pelo s mbolo := para o operador de atribuio. ca

4.7.2

Atribuioes com M ltiplos Alvos c u

Free Pascal no permite atribuies com mltiplos alvos, ou seja, os seguinte sega co u mento de cdigo so invlidos: o a a a , b := 5; a := b := 5;

4.7.3

Operadores de Atribuio Compostos ca

Tal como C, C++ e Java, Pascal tambm permite, desde que especicada a opao e c Sc na linha de comando, os seguintes operadores: a a a a += -= *= /= b b b b Soma b com a, e armazena o resultado em a. Subtrai b de a, e armazena o resultado em a. Multiplica a por b, e armazena o resultado em a. Divide a por b, e armazena o resultado em a.

Obviamente, esses operadores servem apenas para ajudar na escritabilidade, mas o cdigo produzido ser o mesmo que seria produzido por atribuies padro. o a co a

38

Cap tulo 5 Estruturas de Controle


5.1
5.1.1

Instrues de Seleo co ca
Exemplo de Seletor Bidirecional

A Estrutura bidirecional de pascal eh o if. Sua sintaxe : e if(condicao)then ... else ... Se a condico for verdadeira ento a instruao aps o then ser executada, caso a a c o a contrrio else ser executado. Nunca ambas sero executadas. a a a

5.1.2

Aninhamento de Seletores

Condioes bidirecionais podem ser aninhadas: c i f soma = 0 then begin i f cont = 0 then resulado :=0; end else r e s u l t a o :=1;

5.1.3

Construes de Seleo M ltipla co ca u

Pascal utiliza a estrutura case para esse m. Suporta os seguintes tipos: enumerao, ca tipos ordinais (exceto booleano) e chars. E ao contrario do Turbo Pascal, case duplo nao eh permitido no Free Pascal,logo o cdigo a seguir produziria um erro de o compilaao, ja que o 3 aparece em dois intervalos: c Var i : integer ; ... 39

Case i of 3 : DoSomething ; 1 . . 5 : DoSomethingElse ; end ;

5.2

Instrues Iterativas co

As seoes seguintes especicam as instrues iterativas em Pascal, que suporta tanto c co loops controlados por contador quanto loops controlados por uma expresso lgica. a o Alternativamente, o loop tambm pode ser controlado pelo usurio utillizando inse a truoes Break ou Continue. c

5.2.1

Loops Controlados por Contador

Loops controlados por contador so uteis quando se quer repetir uma sequncia de a e comandos por um nmero denido (e especicado) de vezes. Pascal suporta uma u forma de loop controlado por contador, a instruao for, como veremos a seguir. c A Instruo For .. to .. do ca A instruao For em Pascal pode assumir duas formas, uma para contagem ascenc dente e outra descendente (ou regressiva). For I := 1 to 100 do WriteLn ( Counting up : , i ) ;

For I := 100 downto 1 do WriteLn ( C o u n t i n g down :

, i );

For I := 1 to 75 do Something ; Nos segmentos de cdigo acima, foram usadas as duas formas da instruo For, o ca na primeira linha, a instruo dentro do bloco For ser executada 100 vezes e a ca a varivel I ser incrementada de 1 a 100 e portanto, o comando WriteLn apresentaria a a uma contagem de 1 a 100 na tela. Na segunda linha a contagem regressiva, atravs e e do uso do downto, e a terceira linha demonstra que uma expresso tambm pode a e ser utilizada como um dos limites do For. E importante notar que a varivel de controle, neste caso, a varivel I, no pode a a a ser alterada dentro do bloco, ou seja, no podemos atribuir valor ` mesma dentro do a a bloco For, assim, o seguinte segmento de cdigo resultaria num erro de compilaao: o c For I :=0 to 100 do begin DoSomething ; I := I 2 ; 40

end ; Se o bloco for composto, ou seja, se contiver mais de uma instruo e o usurio ca a desejar sair em um certo ponto (aps uma certa condio ser satisfeita, por exemo ca plo) podem ser usados os comandos Break para pular para o m da sequncia de e instruoes e Continue para pular para o ponto do programa imediatamete aps o c o For.

5.2.2

Loops Controlados por Expresses Lgicas o o

Em algumas situaoes, precisamos repetir operaoes at que uma ou mais condies c c e co sejam satisfeitas, em Pascal isso pode ser feito de duas maneiras: A Instruo Repeat .. Until ca O comando Repeat utilizado para garantir que a instruao (ou uma sequncia) e c e ser executada pelo menos uma vez. Ou seja, a instruao ser executada na primeira a c a vez sem que a condio seja testada, e a partir da s ser executada se o valor da ca o a expresso aps o Until for falsa. Exemplo: a o repeat WriteLn ( I := I +2; u n t i l I >100; I = , i );

Os comandos Break e Continue tambm podem ser utilizados aqui. e A Instruo While .. do ca O comando While garante que a instruao somente ser executada caso a condiao c a c seja verdadeira. while x>=10e3 do X := X/ 2 ; Os comandos Break e Continue tambm podem ser utilizados aqui. e

5.3

Desvio Incondicional

Free Pascal suporta a instruao de salto goto. Quando usada, a instruao goto c c e considerada uma prtica pergiosa em certas ocasies e deve ser evitada o mximo a o a poss vel. O estamento goto afeta bastante a legibilidade. Segue um exemplo da implementaao do goto: c label jumpto; ... Jumpto : Statement; ... 41

Goto jumpto; ...

5.4

Comandos com Guarda

A linguagem Pascal no implementa estruturas de seleao do tipo comandos com a c guarda tal como Ada (por exemplo) o faz. Mas isso pode ser simulado usando blocos if .. then .. else: i f exp1 then a c t i o n 1 i f exp2 then a c t i o n 2 i f exp3 then a c t i o n 3 else action4

42

Cap tulo 6 Subprogramas


6.1
6.1.1

Fundamentos de Subprogramas
Procedimentos e Funes co

Pascal Suporta o uso de Funo e procedimentos. ca A declaraao de um procedimento da seguinte forma: c e procedure nome_procedure(<parametro> : tipo,...); begin ... end; A declaraao de uma funo da seguinte forma: c ca e function nome_function(<parametro>:tipo,...):tipo_retorno; begin ... end;

6.2

Ambientes de Referncia Locais e

Os subprogramas em Pascal somente possuem variveis locais dinmicas na pilha. a a

6.3

Mtodos de Passagem de Parmetros e a

A linguagem Pascal, tal como a maioria das linguagens suporta dois mtodos de e passagem de parmetros: Passagem por valor ( o padro), e Passagem por referncia a e a e (indicada pela palavra chave var na frente da varivel). a

6.3.1

Passagem por Valor

Quando no se quer alterar o valor do parmetro a ser passado, passamos apenas a a seu valor para o procedimento ou funo. Neste caso o parmetro pode ser uma ca a 43

varivel ou at mesmo uma expresso.O exemplo abaixo demonstra passagem por a e a valor em procedimento: Procedure DoSomething (Param : String); begin Writeln (Peguei o parametro : ,Param); Writeln (Parametro em maiusculas : ,Upper(Param)); end; Neste caso, apenas o valor da string passado para o procedimento, o qual e obtem apenas uma cpia da string para manipular. A string original no alteo a e importante notar que uma Procedure pode chamar a si mesma, sendo ento rada. E a recursiva.

6.3.2

Passagem Por Referncia e

Para passar um parmetro por referncia em Pascal, devemos indicar a palavra a e chave var antes do mesmo. Neste caso, o parmetro deve ser obrigatriamente uma a o varivel, expresses no so permitidas (pois nem sequer possuem rvalue!). a o a a Um bom exemplo de passagem por referncia em Pascal: Imagine que queiramos e ordenar um vetor, ento chamamos um procedimento de ordenamento o qual deve a alterar o vetor original: procedure Sort(var V: Vector);

6.4

Parmetros que So Subprogramas a a

Quando um nome de subprograma passado como parmetro, os tipos dos parmetros e a a formais so incluidos na lista de parametros formais do subprograma recebedor. Asa sim, a coerncia de tipos de parmetro na chamada real ao subprograma passado e a pode ser estaticamente vericada. Por exemplo, considere o programa abaixo:

procedure i n t e g r a l ( function fun ( x : r e a l ) : r e a l ; l i m i n f , limsup : r e a l ; v var f u n v a l : r e a l begin ... f u n v a l := fun ( l i m i n f ) ; ... end ; O parmetro real na chamada a fun em integral pode ser estaticamente vericado a quanto ` coerncia com o tipo do parmetro formal de fun, que aparece na lista dos a e a formais de integral.

6.5

Sobrecarga de Subprogramas

Sobrecarga de subprogramas utilizada quando queremos que uma mesma funo, e ca ou procedimento, seja declarada de vrias maneiras, uma para cada tipo ou quantia 44

dade de parmetros. Por exemplo a funao Dec() da RTL que pode ser usada para a c decrementar um inteiro poderia ser denida de vrias formas: a ... Dec(Var Dec(Var Dec(Var Dec(Var ... I I I I : : : : Longint;decrement : Longint); Longint); Byte;decrement : Longint); Byte);

Note que se o programamdor utilizar, por exemplo, Dec(A) onde A uma e varivel do tipo LongInt, o compilador utilizar a segunda denio acima e decrea a ca mentar A do valor padro 1. J se o usurio utilizar Dec(A,3), a primeira linha a a a a da denio ser utilizada e a varivel A ser decrementada de 3. ca a a a

6.6
6.6.1

Questes de Design de Funes o co


Efeitos Colaterais de Funes co

Em Pascal, j que permite passagem por referncia, funes podem ter efeitos coa e co laterais. Deve-se apenas utilizar passagem por referncia quando estritamente nee cessrio. a

6.6.2

Tipos de Valores Que Podem Ser Retornados

Basicamente, uma funo em Pascal pode retornar qualquer tipo de dados, exceto ca procedures e funoes. c

6.7

Co-rotinas

Pascal no d suporte a co-rotinas. a a

45

Referncias Bibliogrcas e a
[1] Extended Pascal ISO 10206:1990. www.pascal-central.com/docs/iso10206.ps. [2] Pascal (linguagem de programao). Wikipedia, a enciclopdia livre., 2008. ca e [3] Michael Van Canneyt. Free Pascal : Reference guide for Free Pascal, version 2.2. http://www.freepascal.org/docs-html/ref/ref.html#refch3.html, 2008. [4] Robert W. Sebesta. Concepts of Programming Languages. Greg Tobin, 7th edition, 2005.

46

Você também pode gostar