Você está na página 1de 86

TURBO PASCAL

NDICE
1. INTRODUO................................................................. 5 2. PROGRAMA EM PASCAL.................................................. 7
2.1. ESTRUTURA DE UM PROGRAMA..................................................... 7 2.2. PALAVRAS RESERVADAS.............................................................. 9 2.3. IDENTIFICADORES ...................................................................... 9 2.4. NMEROS .................................................................................. 9 2.5. CADEIA DE CARACTERES (STRING) ..............................................10 2.6. PRIMEIRO PROGRAMA ................................................................10 2.7. AMBIENTE DE TRABALHO DO TURBO PASCAL ................................11 2.8. COMPILADORES E INTERPRETADORES .........................................19
2.8.1. INTERPRETADORES ........................................................................ 19 2.8.2. COMPILADORES ............................................................................. 19

3. TIPOS SIMPLES DE DADOS E DECLARAES................ 21


3. 1. TIPOS SIMPLES DE DADOS .........................................................21
3.1.1. TIPO INTEIRO (INTEGER) ................................................................ 21 3.1.2. TIPO REAL (REAL) ........................................................................... 22 3.1.3. TIPO LGICO (BOOLEAN) ................................................................ 22 3.1.4. TIPO CARACTER (CHAR) .................................................................. 23 3.1.5. TIPO ENUMERADO (ENUMERATED) ................................................... 24 3.1.6. TIPO SUBGAMA (SUBRANGE) ........................................................... 25

3.2. DECLARAES...........................................................................25
3.2.1. DECLARAO DE CONSTANTES........................................................ 25 3.2.1. DECLARAO DE VARIVEIS............................................................ 26 3.2.2. DECLARAO DE TIPOS................................................................... 26

4. ESTRUTURAS SEQUENCIAIS ........................................ 29


4.1. CARACTERSTICAS PRINCIPAIS DO PASCAL ..................................29 4.2. COMANDOS SEQUNCIAIS ..........................................................30
4.2.1. ATRIBUIO .................................................................................. 30 4.2.2. ENTRADA DE DADOS (INPUT)........................................................... 31 4.2.3. SADA DE DADOS (OUTPUT) ............................................................ 33

4.3. EXERCCIO RESOLVIDO ..............................................................35 4.4. EXERCCIOS PROPOSTOS............................................................36

5. ESTRUTURAS CONDICIONAIS...................................... 37
5.1. ESTRUTURA CONDICIONAL IF......................................................37 5.2. ESTRUTURA CONDICIONAL CASE.................................................40 5.3. IF VERSUS CASE ........................................................................41 5.4. EXERCCIOS PROPOSTOS............................................................41
5.1.1. ESTRUTURA ENCADEADA DE COMANDOS IF ...................................... 39

6. ESTRUTURAS REPETITIVAS ......................................... 43


6.1. ESTRUTURA REPETITIVA WHILE...................................................43 6.2. ESTRUTURA REPETITIVA REPEAT .................................................45 6.3. ESTRUTURA REPETITIVA FOR ......................................................46

Manual de Curso

TURBO PASCAL
6.4. A ESCOLHA DE UMA ESTRUTURA REPETITIVA ................................47 6.5. EXERCCIOS PROPOSTOS............................................................47

7. PROCEDIMENTOS E FUNES ...................................... 49


7.1. PROCEDIMENTOS EM PASCAL ......................................................50
7.1.1. ESTRUTURAS EM BLOCOS................................................................ 51 7.1.2. PARMETROS................................................................................. 53

7.2. FUNES EM PASCAL .................................................................58 7.3. RECURSIVIDADE........................................................................59 7.4. EXERCCIOS PROPOSTOS............................................................60

8. UNITS .......................................................................... 61
8.1. UNIT CRT ..................................................................................61
8.1.1. FUNES DA UNIT CRT................................................................... 61 8.1.2. PROCEDIMENTOS DA UNIT CRT........................................................ 61 8.1.3. TABELA DE CORES/CDIGOS........................................................... 62

8.2. TABELA ASCII ............................................................................62 8.3. EXERCCIOS RESOLVIDOS ..........................................................63 8.4. EXERCCIOS PROPOSTOS............................................................65

9. TIPOS ESTRUTURADOS................................................ 67
9.1. ARRAYS ....................................................................................67
9.1.1. DECLARAO DE ARRAYS................................................................ 68 9.1.2. REPRESENTAO DE CADEIAS DE CARACTERES (STRINGS) ................ 70 9.1.3. EXERCCIOS RESOLVIDOS............................................................... 71 9.1.4. EXERCCIOS PROPOSTOS ................................................................ 73 9.1.5. PROJECTO ..................................................................................... 73

9.2. REGISTOS (RECORDS)................................................................73


9.2.1. DECLARAO DE RECORDS EM PASCAL ............................................ 74 9.2.2. INSTRUO WITH........................................................................... 75 9.2.3. REGISTO DE ESTRUTURA VARIVEL.................................................. 77 9.2.4. REGISTOS COMPACTADOS (PACKED RECORDS)................................. 80 9.2.5. EXERCCIOS PROPOSTOS ................................................................ 80

9.3. FICHEIROS (FILES).....................................................................81

9.3.1. DECLARAO DE FICHEIROS ........................................................... 81 9.3.2. OPERAES SOBRE FICHEIROS....................................................... 82 9.3.3. FICHEIROS DE TEXTO ..................................................................... 85 9.3.4. EXTENSES AO TURBO PASCAL........................................................ 86 9.3.5. EXERCCIO PROPOSTO.................................................................... 88 9.3.6. PROJECTO ..................................................................................... 88

Manual de Curso

TURBO PASCAL

1. INTRODUO
O Pascal uma linguagem de programao de alto nvel , que foi desenvolvida a partir do Algol-60. As suas instrues so formadas por expresses do tipo algbrico e por algumas palavras inglesas, tais como BEGIN, END, WHILE, IF, etc. Neste aspecto, o Pascal assemelha-se a muitas outras linguagens de alto nvel (Clipper, Cobol, Basic, etc), contendo, no entanto, alguns aspectos nicos que foram especificamente projectados para estimular o uso da programao estruturada. Por esta razo, muitos formadores e programadores profissionais preferem o Pascal a outra linguagem de programao. A designao de Pascal foi atribuda em honra a Blaise Pascal (16231662), o cientista e matemtico francs que inventou a primeira calculadora mecnica do mundo. O Pascal foi originalmente desenvolvido, nos princpios dos anos setenta, por Niklaus Wirth, na Universidade Tcnica de Zurique - Sua. O objectivo original de Wirth foi o desenvolver uma linguagem de alto nvel para ensinar a programao estruturada. A definio da linguagem original de Wirth , por vezes, referenciada como Pascal padro (standard). Esta linguagem de programao agora amplamente usada numa grande variedade de aplicaes, quer como linguagem de ensino, quer como linguagem de desenvolvimento. Este manual (curso) principalmente orientado para a utilizao do Pascal padro, apesar de tambm serem referenciadas algumas caractersticas no padro.

Manual de Curso

TURBO PASCAL

2. PROGRAMA EM PASCAL
Um programa uma sequncia de passos que o computador segue ordenadamente, usando a notao que este entende. Escrever programas programar. A percepo de que a maioria das vezes a forma como um computador executa as tarefas depende de como o instrumos. A escrita de um bom programa um desafio e um fascinante exerccio intelectual que no difcil, mas que requer muita disciplina.

2.1. ESTRUTURA DE UM PROGRAMA


Um programa em Pascal composto por trs partes: 1. cabealho 2. bloco 3. ponto final (.) O cabealho indica o nome do programa e os recursos externos necessrios sua execuo, ou seja, os dispositivos de entrada e sada de dados. O bloco constitudo por duas partes: declaraes - contm a descrio das constantes e variveis usadas, dos tipos que no so pr-definidos no Pascal, a declarao de etiquetas e a declarao de funes e procedimentos. instrues - contm as instrues que fazem com que as aces sejam executadas. O ponto final determina o fim do programa. Sendo assim, e resumidamente, um programa em Pascal ter a seguinte estrutura: 1. Cabealho 2. Bloco Declaraes Etiquetes Constantes Tipos Variveis Funes e Procedimentos Instrues 3. Ponto final (.)

Manual de Curso

TURBO PASCAL
A construo do cabealho obedece a regras muito simples: em primeiro lugar coloca-se a palavra reservada PROGRAM, seguida do nome que identifica o programa (apenas uma palavra com um comprimento mximo de oito caracteres - limitao do sistema operativo MS-DOS), aps o qual se coloca entre parntesis os dispositivos de entrada e sada de dados (INPUT, OUTPUT). O fim do cabealho identificado por um ponto e virgula(;). Num programa em Pascal, a parte de declaraes pode ser omitida. Por sua vez, a parte de instrues iniciada com a palavra reservada BEGIN, seguida de instrues e comandos encadeados e finalizada com a palavra reservada END. As instrues so separadas umas das outras por um ponto e vrgula (;), com a excepo das instrues imediatamente antes da palavra reservada ELSE. Tendo em conta o que foi referido, a estrutura evolui para a seguinte forma: PROGRAM nome_do_programa (INPUT, OUTPUT); Bloco Declaraes Etiquetes Constantes Tipos Variveis Funes e Procedimentos BEGIN Instrues END. Podem ser inseridas linhas brancas em qualquer ponto do programa. Elas no tem qualquer efeito no comportamento do mesmo e so ignoradas pelo compilador. O seu objectivo separar os componentes do programa, melhorando assim, a legibilidade do mesmo. Com o mesmo objectivo, pode-se inserir comentrios em qualquer ponto do programa, no tendo estes qualquer influncia na execuo do mesmo. Os comentrios so frases em linguagem natural, que explicam certas partes mais relevantes do programa. Em Pascal padro, qualquer sequncia de caracteres limitada por chavetas ({ e }) considerada um comentrio.

Manual de Curso

TURBO PASCAL
2.2. PALAVRAS RESERVADAS
Existem certas palavras reservadas que tm em Pascal um significado pr-definido e no podem ser redefinidas pelo utilizador. AND ARRAY BEGIN CASE CONST DIV DO DOWNTO ELSE END FILE FOR FUNCTION GOTO IF IN LABEL MOD NIL NOT OF OR PACKED PROCEDURE PROGRAM RECORD REPEAT SET THEN TO TYPE UNTIL VAR WHILE WITH

2.3. IDENTIFICADORES
Um identificador um nome que dado a um programa ou a um dos seus elementos, tal como uma constante, uma varivel, um procedimento ou uma funo. Os identificadores so compostos por letras e/ou dgitos, por qualquer ordem, desde que o primeiro caracter seja uma letra. permitido usar maisculas e maisculas, no sendo feita distino entre elas, assim como o caracter underscore(_). Exemplos: Identificadores Identificadores invlidos: vlidos: 1var um identificador tem de comear por uma letra. temp_nor teste-1 um identificador no pode conter total1 um hfen. Somador num bi um identificador no pode conter espaos. conveniente que um identificador seja suficientemente sugestivo para indicar claramente o seu significado. Dever-se- tambm ter cuidado na extenso do identificador pois o compilador poder no fazer qualquer distino a partir do oitavo caracter.

2.4. NMEROS
Os nmeros podem ser escritos em Pascal de vrias formas diferentes. Em particular, um nmero pode incluir um sinal, um ponto decimal e um expoente ou factor de escala (smbolo E), caso se deseje. As seguintes regras aplicam-se a todos os nmeros: vrgulas e espaos no se podem incluir dentro de um nmero; o nmero pode ser precedido por um sinal mais (+) ou menos (-). Se no existir sinal, o nmero considerado positivo; um nmero no pode conter caracteres especiais; os nmeros no podem exceder os valores mximos e mnimos especificados. estes valores dependem do tipo de nmero, do computador e do compilador especfico que esteja a ser utilizado.

Manual de Curso

TURBO PASCAL
Exemplos: nmeros vlidos: -21345 8E-02 = 0.08 8.90

nmeros invlidos: $4500 - um nmero no pode conter caracteres especiais; 2,57 - a vrgula no pode ser utilizada como ponto decimal; 8 E-02 - no podem existir espaos entre dgitos e o E;

2.5. CADEIA DE CARACTERES (STRING)


Uma cadeia de caracteres , tal como o nome indica uma sequncia de caracteres entre plicas ( ). Entende-se como caracter, qualquer letra, algarismo ou smbolo especial. Exemplos de strings: O total e 2 x 5 = De notar que para se colocar o caracter plica numa string, este ter se ser duplicado para no ser confundido com a plica de fim de string.

2.6. PRIMEIRO PROGRAMA


PROGRAM Primeiro (INPUT, OUTPUT); BEGIN WRITELN (Vamos aprender o PASCAL); END.

Este programa identificado pelo nome Primeiro. No bloco do programa a parte de declaraes omitida e a parte de instrues iniciada com a palavra BEGIN seguida da instruo WRITELN que compe o programa e termina com a palavra reservada END. A instruo WRITELN, envia a mensagem, que se encontra entre plicas, para um perifrico de sada, que neste caso o ecr, podendo tambm ser uma impressora ou um ficheiro.

10

Manual de Curso

TURBO PASCAL
2.7. AMBIENTE DE TRABALHO DO TURBO PASCAL
Para escrever e testar o programa acima descrito utiliza-se o editor de texto do Turbo Pascal. Para isso, necessrio colocar-se na directria onde est instalado o Turbo Pascal 6.0 e seguidamente digitar TURBO, para aceder ao Turbo Pascal . Carregado o Turbo Pascal mostrado no cran um sistema de Menus do tipo pull-down (desenrolveis). Num Menu do tipo pull-down ao seleccionar uma opo do menu principal, aparecem as sub-opces desse menu numa janela. Para seleccionar uma sub-opco, s deslocar o cursor com as teclas de movimento do cursor (setas), ficando o fundo da opo com a cor verde, ou digitar o caracter vermelho da opo desejada. As prximas oito figuras e respectivos comentrios explicam todas as opes disponveis no ambiente de trabalho do Turbo Pascal.

Figura 1. Opo File. Open - l (abre) um arquivo do suporte magntico utilizado (disco ou disquete) para o editor. Se o arquivo no existir, ser criado. New - limpa o editor e deixa o nome do ficheiro com NOME00.PAS. Save - grava o ficheiro da memria para o suporte magntico. Se este tiver o nome NOME00.PAS ser pedido um novo nome. Save as ... - escreve o contedo do editor num determinado ficheiro, indicado pelo utilizador. Save all - grava todos os ficheiros que esto em aberto no editor. Se algum tiver o nome NOME00.PAS ser pedido um novo nome. Change dir ... - permite trocar de directria.

Manual de Curso

11

TURBO PASCAL
Print - imprime o arquivo que est activo no edit. Para se imprimir o texto seleccionado faz-se Ctrl - KP. Get info ... - apresenta um conjunto de informao sobre o arquivo que est activo no edit. DOS shell - sai do Turbo Pascal e volta temporariamente para o sistema operativo; para voltar ao turbo, basta digitar EXIT. Exit - permite abandonar o Turbo Pascal, voltando ao sistema operativo.

Figura 2. Opo Edit. Restore line - repe a ltima linha que foi anulada. Cut - remove o texto seleccionado do arquivo e coloca-o no clipboard. Copy - copia o texto seleccionado do arquivo para o clipboard. Paste - insere o texto que est residente no clipboard na posio do arquivo onde se encontra o cursor. Copy example - exemplos de procedimentos e funes que podem ser inseridos no arquivo atravs do Edit-Copy e Edit-Paste. Show Clipboard - abre uma janela com o titulo clipboard e mostra o texto que est residente no clipboard. Clear - remove o texto seleccionado, mas no o coloca no clipboard.

12

Manual de Curso

TURBO PASCAL

Figura 3. Opo Search. Find - edita uma caixa de dilogo, onde o utilizador dever digitar o texto a procurar. Existem vrios tipos de procura. Replace ... - edita uma caixa de dilogo, onde o utilizador dever digitar o texto a ser substitudo e o texto a substituir. Existe vrias opes de substituio de texto. Search again - repete o ltimo Find ou Replace. Go to line number ... - desloca o cursor para o nmero de linha digitado. O Turbo Pascal mostra o nmero de linha corrente (onde est o cursor) no canto inferior esquerdo. Find procedure ... - posiciona o cursor na 1 linha do procedimento a procurar. Find error ... - posiciona o cursor na linha onde um erro do tipo runtime ocorreu.

Manual de Curso

13

TURBO PASCAL

Figura 4. Opo Run. Run - executa o programa que est activo. Se o cdigo fonte estiver alterado desde da ltima compilao, o Turbo Pascal ir compilar e linkar automticamente o programa. Reset - termina a execuo do programa, anula os pontos de controlo do debugging, liberta a memria que o programa tem alocado e fecha os ficheiros abertos Go to cursor - permite executar o programa a partir da posio do cursor no editor. Trace into - executa o prximo comando do programa, sendo os subprogramas chamados executados duma s vez. Step over - executa a prxima instruo do procedimento corrente. No faz o trace a procedimentos de nvel inferior. Parameters ... - permite digitar numa caixa de dilogo os argumentos do programa, do mesmo modo que digitaria ao iniciar a execuo do programa em linha de comando DOS.

14

Manual de Curso

TURBO PASCAL

Figura 5. Opo Compile. Compile - compila o programa-fonte activo. Make - compila o programa, verificando se alguma unidade foi alterada desde a ltima operao, recompilando-a. Build - funciona de maneira semelhante opo Make, porm fora a recompilao de todo o programa. Destination - selecciona o destino do ficheiro compilado entre a memria e o disco. Primary file ... - selecciona-se o ficheiro pelo qual o Turbo Pascal comea a compilar.

Manual de Curso

15

TURBO PASCAL

Figura 6. Opo Debug. Evaluate/modify ... - permite ver o valor actual de uma varivel ou expresso e alter-lo. Watches - abre o seguinte menu de comandos: Add watch - permite especificar uma varivel ou expresso e colocar os seus valores na janela Watch durante a depurao de um programa. Delete watch - apaga a varivel ou expresso da janela Watch. Edit watch - permite editar a varivel ou expresso colocada na janela watch. Remove all - apaga todas as variveis e expresses contidas na janela Watch. Toggle breakpoint - liga ou desliga um breakpoint do programa. Breakpoints ... - permite inserir, editar ou, apagar breakpoints.

16

Manual de Curso

TURBO PASCAL

Figura 7. Opo Options. Compiler ... - permite a insero de directivas de compilao sem escrev-las no programa-fonte. Memory sizes ... - permite configurar a memria para a execuo do programa, ou seja, definir o comprimento do stack e os valores do low e high heap limit. Linker ... - permite ajustar as opes do linker, como ligar ou desligar o envio de informaes a arquivos mapa (MAP). Debugger ... - permite configurar o debugger. Directories ... - define em que directrios devem ser procurados os ficheiros. Environment ... Preferences ... - define o tamanho do ecr, gravao automtica, etc. Editor ... - define algumas opes, como por exemplo, a criao de ficheiros de backup. Mouse ... - define alguns itens do rato, por exemplo, o que acontece quando se prime o boto direito do rato. Startup ... - define opces de arranque do Turbo Pascal (startup). Colors ... - configura o ambiente de trabalho ao nvel das cores. Save options ... - grava todas as opes realizadas num ficheiro do tipo TP. Por defeito o Turbo Pascal assume o ficheiro Turbo.TP. Retrieve options ... - Carrega um ficheiro do tipo TP.

Manual de Curso

17

TURBO PASCAL

Figura 8. Opo Window. Size/Move - permite alterar o tamanho da janela activa, usenado a tecla shift e as setas. Zoom - maximiza a janela activa. Tile - divide a rea de visualizao das janelas pelo nmero de janelas abertas (forma Tile). Cascade - apresenta as janelas abertas em forma de cascata. Next - coloca activa a prxima janela. Previous - coloca activa a janela anterior. Close - fecha a janela activa. No caso de fechar uma janela com cdigofonte alterado, pergunta se quer gravar as ltimas alteraes. Watch - edita as variveis e expresses inseridas na janela watch. Register - apresenta uma janela com os registos do CPU. Output - abre uma janela output com o ecr de sada do programa. Call stack - permite visualizar, durante a depurao, as chamadas a procedimentos ou funes. User screen - permite visualizar o ecr de sada do programa. List ... - apresenta uma lista das janelas que esto abertas.

18

Manual de Curso

TURBO PASCAL
2.8. COMPILADORES E INTERPRETADORES
Aps escrever o programa necessrio traduzir esse programa escrito em PASCAL para uma linguagem que o computador entende que conhecida por linguagem de mquina. Portanto todos os programas que comunicam com a mquina devem estar em linguagem de mquina. A forma como os programas so traduzidos para linguagem de mquina classifica-os em duas categorias: INTERPRETADOS COMPILADOS Os programas que fazem estas tradues so chamados interpretadores e compiladores. 2.8.1. INTERPRETADORES Um interpretador l a primeira instruo do programa, faz uma consistncia da sua sintaxe e se no houver um erro converte-a para linguagem de mquina para finalmente execut-la. Segue, ento, para a prxima instruo, repetindo o processo at que a ltima instruo seja executada ou a consistncia aponte algum erro. O interpretador precisa estar presente todas as vezes que vamos executar o nosso programa e o trabalho de checagem da sintaxe e traduo dever ser repetido. Se uma parte do programa necessitar ser executada muitas vezes, o processo feito o mesmo nmero de vezes. 2.8.2. COMPILADORES Um compilador l a primeira instruo do programa, faz uma consistncia da sua sintaxe e se no houver erro converte-a para linguagem de mquina, em vez de execut-la, segue para a prxima instruo repetindo o processo at que a ltima instruo seja atingida ou a consistncia aponte algum erro. Se no houver erros, o compilador gera um programa em disco com o sufixo . OBJ com as intruses traduzidas. Este programa no pode ser executado at que sejam agregadas a ele rotinas em linguagem de mquina que lhe permitiro a sua execuo. Este trabalho feito por um programa chamado linkeditor que, alm de juntar as rotinas necessrias ao programa .OBJ, cria um produto final em disco com o sufixo .EXE que pode ser executado directamente do sistema operacional.

Manual de Curso

19

TURBO PASCAL

nome.pas

nome.obj

librarias, units

compilao programa fonte linkagem

nome.exe

Com isto a velocidade de execuo do programa chega a ser 15 a 20 vezes mais rpida do que quando o programa interpretado. Alm da velocidade, outras vantagens podem ser mencionadas: desnecessria a presena do interpretador ou do compilador para executar o programa j compilado e linkeditado; programas .EXE no podem ser alterados, o que protege o cdigofonte. Apesar de um compilador ter muitas vantagens sobre um interpretador, algumas consideraes devem ser feitas: os interpretadores permitem que se produzam programas com maior facilidade na fase de aprendizagem, pois podem ser criados e executados imediatamente, enquanto um compilador requer muito mais tempo para que um programa possa ser executado. um compilador no criar um programa em linguagem de mquina que esteja absolutamente livre de erros, e durante o processo de aprendizagem de uma linguagem a quantidade de erros gerados relativamente grande, o que faz com que um interpretador seja muito mais conveniente.

20

Manual de Curso

TURBO PASCAL

3. TIPOS SIMPLES DE DADOS E DECLARAES


3. 1. TIPOS SIMPLES DE DADOS
Em programao cada constante, varivel ou funo pertence a um dado tipo. Os elementos de cada tipo possuem determinadas caractersticas comuns que os distingue de todos os outros. Uma das caractersticas mais interessantes do Pascal, a sua capacidade de tratar muitos tipos diferentes de dados. Estes incluem dados de tipo simples, estruturado e apontador. Os dados de tipo simples so elementos individuais (nmeros, caracteres). Existem vrios tipos diferentes de dados simples: os prdefinidos - inteiros, reais, lgicos e caracteres - e aqueles que so definidos pelo utilizador - enumerados e sub-gama. Os dados de tipo estruturado compem-se de mltiplos elementos relacionados entre si de forma especifica e dependentes do tipo de estrutura associada. Cada um desses elementos ou grupo de elementos ser, por sua vez, de um tipo de dados simples ou de um tipo de dados estruturado. Em Pascal existem quatro tipos de dados estruturados: arrays, registos, conjuntos e ficheiros. Os dados de tipo apontador so usados para construir tipos dinmicos de informao estruturada. Neste captulo iremos debruar-nos sobre os tipos de dados simples. Os outros tipos de dados referidos sero tratados em captulos posteriores. 3.1.1. TIPO INTEIRO (INTEGER) Ao tipo inteiro pertencem todos os nmeros que no possuam parte decimal, podendo esses nmeros ser negativos, positivos ou nulos. O valor mximo que um inteiro pode assumir depende do computador onde o programa vai ser executado, assim como, do compilador usado para gerar o cdigo objecto. A constante inteira MAXINT representa o maior valor inteiro (em valor absoluto) que representado pelo computador em questo. Existe um conjunto de operaes aritmticas passveis de serem realizadas com os dados do tipo inteiro, sendo elas as seguintes: Adio + Subtraco Multiplicao * Diviso real / Diviso inteira DIV

Manual de Curso

21

TURBO PASCAL
Resto da diviso inteira MOD A operao DIV calcula a parte inteira do quociente da diviso enquanto que a operao MOD produz o resto da diviso. excepo da operao diviso real (/), cujo resultado um valor do tipo real, todas as outras operaes do origem a um resultado do tipo inteiro, quando usadas com operadores do tipo inteiro. Exemplos de operaes: 8+13+145 tem como resultado 166 5/2 tem como resultado 2.5 --> Real 7 DIV 2 tem como resultado 3 7 MOD 2 tem como resultado 1 3.1.2. TIPO REAL (REAL) Ao tipo Real pertencem todos os nmeros que possuem parte decimal, podendo esses nmeros ser positivos, negativos ou nulos. O valor mximo e mnimo, em mdulo, que um real pode assumir depende do computador onde o programa vai ser executado, assim como, do compilador usado para gerar o cdigo objecto, tal como nos inteiros. Em Pascal existem dois modos de representar um tipo real: 1. Notao decimal, onde o nmero representado por uma parte inteira, um ponto e uma parte decimal. O Pascal requer que ambas as partes, decimal e inteira, tenham pelo menos um dgito. Exemplos: 7.89 -14.123 -0.7840983 2. Notao cientfica, onde o nmero representado por uma parte fraccionria e um expoente (potncia de base 10), separados pelo smbolo E. De notar que o expoente ter que ser sempre um inteiro. Exemplos: 7.7E-2 = 0.077 8.56E+2 = 856 Existe um conjunto de operaes aritmticas passveis de serem realizadas com os dados do tipo real, sendo elas as seguintes: Adio + Subtraco Multiplicao * Diviso real / Todas as operaes, realizadas com operadores do tipo real, do origem a um resultado do tipo real. De notar que o resultado duma operao, em que um dos operandos um dado do tipo real e o outro do tipo inteiro, ser um valor do tipo real. 3.1.3. TIPO LGICO (BOOLEAN) Os dados pertencentes ao tipo lgico apenas podem tomar um de dois valores, TRUE (verdadeiro) ou FALSE (falso). Estes dois valores constituem um conjunto ordenado, com o valor lgico falso a preceder o

22

Manual de Curso

TURBO PASCAL
verdadeiro. Sobre os dados pertencentes ao tipo lgico, apenas se podero executar operaes lgicas. Sendo assim, os operadores disponveis so: AND OR NOT e lgico ou lgico negao lgica conjuno disjuno negao

Todos estes operadores do origem a um resultado do tipo lgico. Chama-se a ateno para o facto de o operador NOT ser um operador unrio, ou seja, utilizado apenas com um operando. Apresenta-se de seguida uma tabela correspondente s operaes lgicas: a falso falso b falso verdadeir o falso a AND b falso falso a OR B falso NOT a verdad eiro verdad eiro falso

verdadeir o verdadeir falso verdadeir o o verdadeir verdadeir verdadeir verdadeir falso o o o o Existe ainda um outro conjunto de operadores, que se caracterizam por darem origem a um resultado do tipo lgico, mas que podem ser usados com operandos do tipo real, inteiro e caracter, para alm dos dados do tipo lgico. A estes operadores d-se o nome de operadores relacionais e so os seguintes: = igual a <> diferente de < menor que <= menor ou igual que > maior que >= maior ou igual que Caso se verifique a relao estabelecida pelo operador, o resultado da operao o valor lgico verdadeiro, caso contrrio, obtm-se o valor lgico falso. Exemplos: 88<1 tem como resultado falso 2.7<=18 tem como resultado verdadeiro 3.1.4. TIPO CARACTER (CHAR) Pertencem ao tipo caracter todos os caracteres existentes, formando um conjunto ordenado de smbolos. Esse conjunto poder variar em contedo e em nmero dependendo do computador onde se executa o programa. Por defeito, todos os computadores suportam um subconjunto

Manual de Curso

23

TURBO PASCAL
padro desses caracteres, constitudo por 26 letras, 10 dgitos, o espao em branco e alguns smbolos. A maior parte dos computadores e praticamente todos os microcomputadores fazem uso do cdigo ASCII (American Standard Code for Information Interchange), no qual cada caracter se encontra codificado numericamente. Os caracteres encontram-se assim ordenados segundo os seus cdigos respectivos. Um dado do tipo caracter representado, em Pascal, entre plicas. Exemplos: g; 9; %. No caso de se necessitar de usar o caracter plica, ele dever ser escrito duas vezes e dever ser colocado entre plicas. Interessa recordar aqui, a um conjunto de caracteres colocado entre plicas, se d o nome de cadeia de caracteres ou string. 3.1.5. TIPO ENUMERADO (ENUMERATED) Os tipos de dados referidos nos pontos anteriores so apropriados para a representao de dados numricos, lgicos ou de caracteres. No entanto, podem ser necessrios outros tipos de dados, caractersticos duma dada aplicao, para os quais a descrio em termos dos tipos bsicos prdefinidos pode no ser a mais adequada ou a suficiente. Por exemplo, um programa pode ter de tratar dados referentes aos dias da semana ou a cores, os quais no so naturalmente descritos por qualquer um dos tipos j abordados. Em Pascal, o programador tem a possibilidade de definir novos tipos de dados, indicando todos os identificadores pertencentes a esse tipo, ou seja, enumerando-os. os vrios identificadores devero encontrar-se entre parntesis e separados uns dos outros por vrgulas. A um tipo definido desta forma d-se o nome de tipo enumerado. Exemplo: (domingo, segunda, tera, quarta, quinta, sexta, sbado) A cada identificador de um tipo enumerado, e tal como o nome indica, atribudo um nmero de ordem. Sendo assim, possvel a aplicao de operadores relacionais a este tipo de dados. Como exemplo, podemos referir as seguintes operaes: segunda<tera tem como resultado verdadeiro sbado<=quinta tem como resultado falso Tambm as funes ord, pred e succ, que sero definidas posteriormente, se podem aplicar aos dados de tipo enumerado. Se o resultado da aplicao de uma destas funes for um valor que no pertence aos indicados na definio de tipo, o resultado indefinido.

24

Manual de Curso

TURBO PASCAL
3.1.6. TIPO SUBGAMA (SUBRANGE) No caso de existirem dados que apenas tomem valores situados numa gama restrita de valores de um dos tipos bsicos ou enumerados, existe a possibilidade de se definir um novo tipo, constitudo pelos elementos que formam um subconjunto de um tipo j existente, ao qual se d o nome de tipo subgama. A definio de um destes tipos feita, especificando os limites inferior e

superior do novo tipo, separados pelo smbolo especial .., como nos seguintes exemplos: A..Z tipo subgama, composto pelos caracteres de A a Z inclusive; 0..255 tipo subgama, composto pelos inteiros de 0 a 255 inclusive; tera..sexta tipo subgama, composto pelos elementos que constituem o tipo enumerado semana e que se encontram compreendidos entre tera e sexta inclusive. A aplicao de operadores ou funes a dados pertencentes a um tipo subgama, no tem forosamente que produzir valores a esse tipo. No caso de algum desses resultados exceder os limites especificados na definio do tipo, ser ento considerado como pertencente ao tipo a partir do qual se definiu o tipo subgama. Chama-se a ateno para o facto de no ser permitido criar tipos subgama definidos custa de dados do tipo real, visto que no possvel identificar todos os valores existentes entre dois nmeros reais.

3.2. DECLARAES
Tal como foi referido no captulo anterior, todos os dados a usar num programa escrito em Pascal tm que ser declarados antes de serem utilizados. Essas declaraes so realizadas no incio do programa, na zona do bloco a que se chamou parte de declaraes. 3.2.1. DECLARAO DE CONSTANTES Em programao uma constante um valor que no alterado durante a execuo do programa. Associa-se um nome simblico (identificador) constante e por esse identificador que ela reconhecida ao longo de todo o programa. Em Pascal, a sintaxe de declarao de constantes iniciada pela palavra reservada CONST, seguida de uma sequncia de definies de constantes cada uma delas da forma: identificador=constante;

Manual de Curso

25

TURBO PASCAL
As constantes definidas podem ser do tipo inteiro, real, lgico ou caracter. Para melhorar a legibilidade dum programa normal escrever cada constante numa linha separada, por exemplo: CONST pi = 3.14159; resp=S; 3.2.1. DECLARAO DE VARIVEIS Uma varivel definida na parte de declarao de variveis e possui um valor que pode ser alterado durante a execuo do programa. No entanto, em cada instante, cada varivel possui apenas um valor. Uma varivel caracterizada por um nome ( usado para referenciar a varivel) e por quatro atributos: a mbito, o ciclo de vida, o tipo e o valor. mbito - a zona do programa, em que a varivel conhecida e portanto passvel de ser usada. Fora do seu mbito, a varivel no conhecida pelo programa. ciclo de vida (tempo de vida) - quando uma varivel criada pelo programa, reservada para si uma zona de memria, que, assim que a varivel deixa de ser conhecida, libertada. tipo - especifica o domnio de valores que lhe esto associados e o conjunto de operaes que podem ser executadas sobre ela. valor - quando atribudo varivel um novo valor, o valor anterior perdido. obrigatrio, em Pascal, que toda a varivel usada seja declarada, isto , que lhe seja atribudo um nome e um tipo antes do incio da execuo do programa. A sintaxe de declarao iniciada pela palavra reservada VAR, seguida de uma sequncia de definies de variveis uma delas da forma: identificador1,identificador2,..,identificadorn:tipo_de_dados; Exemplo: Var numero, soma:INTEGER; taxa, media: REAL; resp:CHAR; continua:BOOLEAN; Uma referncia ao valor da varivel uma operao que acede ao seu valor, mas que no o altera. Os nomes das variveis devem ser escolhidos cuidadosamente de forma a que o seu nome sugira qual o seu papel no programa. 3.2.2. DECLARAO DE TIPOS Os tipos bsicos, por se encontrarem pr-definidos na linguagem Pascal, podem ser usados sem uma declarao prvia. O mesmo j no se passa

26

Manual de Curso

TURBO PASCAL
com os tipos definidos pelo programador. Estes devero ser declarados na parte de declarao de tipos, com a sintaxe composta pela palavra reservada TYPE seguida de uma sequncia de definies de tipo com a sintaxe composta pela palavra reservada TYPE seguida de uma sequncia de definies de tipo com a seguinte forma: identificador=definio_de_tipo; A expresso definio_do_tipo est dependente do tipo a definir. Exemplo: TYPE semana=(domingo, segunda, tera, quarta, quinta, sexta, sbado); diames=1..31; Coresbas=(amarelo, vermelho, azul); Como j vimos anteriormente, que um tipo enumerado se apresenta com a especificao de todos os seus elementos (por ex. semana), enquanto o tipo subgama especifica um intervalo (ex. diames). Aps a sua declarao, os nomes atribudos a cada tipo passam a identific-lo do mesmo modo que as palavras INTER, REAL, BOOLEAN e CHAR identificam os tipos bsicos. Exemplo de um programa em Pascal que inclui o cabealho e a parte de declaraes. program inicio (input,output); const xmax=250; ymax=100; xmin=0; ymin=-ymax; type abcissas=xmin..xmax; ordenadas=ymin..ymax; coresbas=(amarelo, vermelho, azul); var x:abcissas: y:ordenadas; npontos:integer; cor:coresbas; begin instruses end.

Manual de Curso

27

TURBO PASCAL

4. ESTRUTURAS SEQUENCIAIS
4.1. CARACTERSTICAS PRINCIPAIS DO PASCAL
O conceito de controlo da execuo dum programa tem um papel fundamental no comportamento do mesmo. Por esta razo, o Pascal como as restantes linguagens de programao, fornece estruturas que permitem especificar a ordem da execuo dos comandos num programa. O uso de estruturas de controlo adequadas aumenta a legibilidade e a facilidade de manuteno dos programas. De facto, para entender completamente um programa, muito importante que os seus comandos estejam dispostos segundo princpios simples e naturais. Consideram-se trs estruturas de controlo: sequencial condicional repetitiva A estrutura de controlo sequencial ser abordada neste captulo, enquanto que as restantes sero alvo de estudo em captulos posteriores. A estrutura sequencial especifica que os comandos no programa devem ser executados um aps outro pela mesma ordem em que aparecem escritos. Se A e B representam comandos, a especificao de que o comando B deve ser executado imediatamente depois da execuo do comando A, representado em Pascal por: A; B; O ponto e virgula (;) representa o operador sequencial e utilizado para separar instruses. Embora seja permitido colocar mais do que uma instruo por linha, como de resto se acabou de demonstrar, prtica corrente escrev-las em linhas separadas. A razo para isto bvia: tornar os programas mais legveis e perceptveis. Em Pascal possvel especificar que um grupo de instrues deve ser considerado como um nico bloco e que os comandos que fazem parte desse grupo devem ser executados em sequncia. A estrutura resultante o bloco composto, que definido por: begin begin instruo; instruo; end; ou instruo; ..... end;

Manual de Curso

29

TURBO PASCAL
As palavras reservadas BEGIN e END delimitam o bloco composto e, sendo assim, no so comandos da linguagem Pascal. Dentro de um bloco composto, poder existir um ou mais blocos compostos, ou seja, um ou mais conjuntos de instrues sequenciais delimitados pelas palavras BEGIN e END, como de resto se ver nos prximos captulos. Agora que j se sabe especificar uma sequncia em Pascal, h que aprender alguns comandos elementares e pr-definidos que permitem escrever programas completos.

4.2. COMANDOS SEQUNCIAIS


Os trs tipos de comandos em Pascal so: atribuio; leitura de dados (input); escrita de dados (output). 4.2.1. ATRIBUIO A instruo de atribuio permite atribuir um a valor a uma varivel, possuindo a seguinte sintaxe: varivel:=expresso;
varivel := o identificador da varivel; o operador de atribuio (que no deve ser confundido com o operador relacional =); express algo que representa um valor, podendo ser numrico, lgico ou o caracter.

em que

A execuo desta instruo atribui o resultado da expresso direita do operador, varivel referida esquerda desse operador. Em Pascal, o valor da expresso tem que ser de um tipo compatvel com o tipo definido para a varivel. Uma varivel e uma expresso so compatveis se: 1. so do mesmo tipo; 2. a varivel real e a expresso inteira; 3. o valor resultante de uma expresso pertencer a um tipo subgama e a varivel for de um tipo que englobe essa subgama. Exemplos: operando1:=5; contador:=contador+1; acumulador:=acumulador+operando1; No primeiro exemplo, e sendo operando1 uma varivel do tipo inteiro ou real, aps a execuo desta instruo, a varivel operando1 ter o valor 5 ou 5.0 respectivamente. Se operando1 no uma varivel do tipo inteiro ou real, este comando est incorrecto.

30

Manual de Curso

TURBO PASCAL
No segundo exemplo, a instruo de atribuio fornece varivel contador (que tem de ser do tipo inteiro ou real), o seu valor anterior acrescido de uma unidade, ou seja, tem o efeito de incrementar uma unidade ao valor corrente da varivel contador, actualizando-a com o novo valor. No ltimo exemplo, a instruo de atribuio fornece varivel acumulador (que tem de ser do tipo inteiro ou real para o caso do tipo da varivel operando1 ser inteiro, se for do tipo real, o tipo da varivel acumulador ser obrigatoriamente real), o resultado da soma do seu valor anterior com o valor da varivel operando1, ou seja, tem o efeito de incrementar o valor da varivel operando1 ao valor corrente da varivel acumulador, actualizando-a com o novo valor. Antes de terminar este ponto, de referir um facto muito importante, mas que muitas vezes os iniciados na programao tendem a esquecer: ao fazer a atribuio de um novo valor a uma varivel, destri-se o antigo valor, pelo que, se este ainda tiver algum interesse, ter de ser guardado numa outra varivel. Por exemplo, se quisesse trocar os valores das variveis var1 e var2, ter-se-ia de recorrer a uma varivel auxiliar, aux, para a efectuar: aux:=var1; var1:=var2; var2:=aux; 4.2.2. ENTRADA DE DADOS (INPUT) A instruo de entrada de dados (input) permite receber informao de todo o ambiente exterior ao programa. Esta instruo requer o conhecimento do local onde a informao reside e das as variveis onde vo ser guardados os valores a receber. A linguagem Pascal tem dois comandos de entrada de dados: READ e READLN. O comando READ tem a seguinte sintaxe: read(informao_de_entrada); em que: informao_de_entrada o nome de um dispositivo de entrada de dados, seguido de uma lista de variveis separadas por vrgulas. Quando o computador executa o comando: read(nome_ficheiro,var1,var2,...varn); o computador l n valos contidos no ficheiro indicado (nome_ficheiro) e atribui esses valores, respectivamente a var1,var2,...varn. Note-se que a instruo: read(var1, var2, var3); equivalente sequncia de instrues: read(var1); read(var2);

Manual de Curso

31

TURBO PASCAL
read(var3); Se no identificado um ficheiro de entrada, ento, o ambiente de entrada de dados (input) ser o definido por defeito em cada modo de execuo do programa. Por exemplo, se o programa executado iterativamente, este ambiente o teclado do terminal. OS valores que sero lidos pelo comando READ, podem estar dispersos por vrias linhas do dispositivo de entrada. No entanto, este comando obriga a que sejam satisfeitas as seguintes condies: 1. o valor a ser lido tem que obedecer sintaxe do Pascal. Por exemplo, se o valor a ser lido for um nmero real, ento, o ponto decimal deve estar precedido e seguido de pelo menos um dgito; 2. o tipo do valor a ser lido tem que ser compatvel com o tipo da varivel que o vai receber; 3. os valores a serem lidos tm de ser separados por uma ou mais espaos em branco (ou fim de linha). Estes espaos permitem que o computador identifique onde o valor a ser lido termina. A nica excepo o caso em que valor do tipo caracter(CHAR) est a ser lido, porque um valor deste tipo composto por um nico caracter e no necessita de delimitador; 4. cada valor tem que estar completamente definido numa linha, no pode ser separado em vrias linhas; 5. o valor a ser lido no pode pertencer a um tipo enumerado. Um valor enumerado no pode ser lido nem escrito por um programa em Pascal. O mesmo acontece para um valor lgico. Enquanto l a informao, o computador mantm uma marca no prximo caracter a ser lido. Esta marca colocada no incio do dispositivo de entrada de dados quando se inicia a execuo de um programa. Sempre que um comando READ executado, a marca colocada imediatamente depois do ltimo valor tipo. H situaes em que o programa ao ler sequencialmente dados dum ficheiro, encontra o seu fim. A funo que permite ao programa testar se a marca est colocada no fim do ficheiro a funo EOF, que retorna um valor do tipo lgico (boolean), como j foi referido anteriormente. Esta funo baseia-se no facto de todos os ficheiros conterem caracteres especiais (no visveis quando um ficheiro inspeccionado pelo utilizador atravs do terminal) que indicam o fim de linha (EOLN) e o fim de ficheiro (EOF). preciso algum cuidado quando se usam as funes EOF e EOLN: um fim de ficheiro sempre precedido por um fim de linha. Para alm do comando READ, o Pascal possui o comando READLN com a seguinte sintaxe: readln(informao_de_entrada); A diferena entre os comandos READ e READLN identificada aps a operao de leitura. Enquanto que o comando READ coloca o cursor

32

Manual de Curso

TURBO PASCAL
imediatamente depois do valor lido, o comando READLN coloca o cursor imediatamente depois da primeira ocorrncia do caracter (EOLN). Por outras palavras, o comando READLN aps efectuar a operao de leitura, posiciona o cursor no incio da linha seguinte, ignorando qualquer informao que possa existir no resto da linha onde o cursor se encontrava inicialmente posicionado. Como consequncia disto, a prxima operao de leitura comear numa nova linha de dados. Em tudo o resto estes dois comandos so iguais, pelo que a informao_de_entrada tem o mesmo significado. Note-se que: readln(var1, var2, var3); equivalente a: read(var1,var2,var3); readln; 4.2.3. SADA DE DADOS (OUTPUT) Depois de manipular a informao, importante que o computador seja capaz de enviar para um determinado local os resultados obtidos. Para isso utilizado o comando de sada de dados (output). Este comando requer o conhecimento do lugar onde a informao ser transmitida e dos os valores que devem ser transmitidos. Em Pascal h dois comandos de sada: os comandos WRITE e WRITELN. O comando WRITE tem a seguinte sintaxe: write(informao_de_sada); em que: informao_de_sada. composta por um dispositivo de sada de dados, seguido de um conjunto de expresses matemticas, variveis, constantes, valores e/ou, strings separadas por vrgulas. Quando o comando: write(nome_ficheiro,expresso1,...expresson); encontrado, calculado o valor de sada para cada expresso e os valores obtidos so escritos no ficheiro indicado (nome_ficheiro), pela mesma ordem em que foram encontrados no comando WRITE. Se no identificado um dispositivo de sada, ento, o ambiente de sada (output) ser definido em cada modo de execuo do programa. Por exemplo, se o programa executado iterativamente, este ambiente o monitor do computador. Um exemplo possvel : write(Exemplo do write: ,x,*,y,=,x*y); em que x e y so duas variveis de tipo inteiro (integer), com valores 4 e 8 respectivamente, a execuo desta instruo produziria o seguinte resultado: Exemplo do write: 4*8=32. Ao contrrio do que acontecia na entrada de dados, possvel fazer a sada de valores do tipo lgico. Neste caso, o resultado obtido so as palavras TRUE e FALSE. Exemplo: write(4 = 2 + 2 ,4=2+2); o resultado seria 4 = 2 + 2 TRUE

Manual de Curso

33

TURBO PASCAL
Para alm do comando WRITE, em Pascal existe tambm o comando WRITELN, que possui a seguinte sintaxe: writeln(informao_de_sada); A diferena entre os comandos WRITE e WRITELN surge aps a escrita dos valores especificados. Enquanto que o comando WRITE, aps ser executado, posiciona o cursor imediatamente depois do ltimo caracter escrito, o comando WRITELN escreve o caracter (EOLN) no dispositivo de sada, posicionando o cursor no incio da linha seguinte. Se o comando WRITELN escrito sem argumentos o seu efeito introduzir o caracter (EOLN) no ficheiro, provocando assim uma mudana de linha. Em tudo o resto, estes dois comandos so iguais, pelo que informao_de_entrada tem o mesmo significado. Por exemplo: writeln (exemplo 1); write (exemplo 2); writeln (**** continua a linha ******); writeln; write (exemplo 3); Como resultado da sua execuo obteramos o seguinte resultado: exemplo 1 exemplo 2**** continua a linha ****** exemplo 3 Aps se ter conhecimento de como se enviam dados para um dispositivo de sada, importante saber como dispor a informao nesse mesmo dispositivo. Para isso, e aps cada parmetro de escrita, coloca-se um campo associado, constitudo pelo smbolo :, seguido por um nmero inteiro que especifica quantas colunas sero reservadas para a escrita do parmetro. Opcionalmente, e para o caso do parmetro a ser escrito ser to tipo real, poder voltar a ser colocado o smbolo : seguido de um valor inteiro, que representar o nmero de colunas que sero ocupadas pela parte decimal. Exemplo: Sendo x e y duas variveis reais com o s valores 7.25 e 3.25 respectivamente, a seguinte instruo: write(x*y:5:2); obriga a que o resultado da multiplicao ocupe cinco posies, das quais duas so decimais (no esquecer que o ponto decimal est incluido nessas cinco posies). Esta instruo dar origem ao seguinte resultado: 23.56.

34

Manual de Curso

TURBO PASCAL
Os seguintes pontos devero ser tidos em considerao: 1. Se o campo associado no existe, cada um dos valores escritos ocupa um nmero de colunas dependendo do seu tipo e da verso do Pascal em uso. 2. Se o campo associado apenas constitudo por um valor inteiro, ento esse valor representar o nmero de colunas que o valor ir ocupar no dispositivo de sada. 3. Se o campo associado for constitudo por dois inteiros, o que s pode acontecer com um valor real, ento o valor escrito ocupa no dispositivo de sada um nmero total de colunas dado pelo primeiro inteiro, e impresso com o nmero total de casas decimais dado pelo segundo inteiro. No exemplo seguinte, em que x representa uma varivel real e tem o valor de -35.7, so perceptveis as diferenas entre as vrias representaes: write(x); tem como resultado -3.57000E+01 write(x:10); -3.57E+01 write(x:5:1); -35.7 write( x = ,x:5:1); a=-35.7 Em qualquer um dos casos, se o valor a ser escrito ocupar menos posies do que as especificadas, ento as posies em falta sero ocupadas por espaos em branco no incio da linha, sendo o valor alinhado direita. Se o valor a escrever ocupar mais do que as posies especificadas, ento o tamanho do campo ser automaticamente aumentado para o tamanho necessrio.

4.3. EXERCCIO RESOLVIDO


{Este programa calcula a rea de um rectngulo ou quadrado, aps introduzidos pelo utilizador os valores do lado e do comprimento. Programador: Jos Carlos P. Almeida Data: Maio/95 } program exerc1 (input,ouput); var xlado,xcomp:real; begin write (Digite o valor do lado..................: ); readln(xlado); write (Digite o valor do comprimento....: ); readln(xcomp); writeln(A rea ,xlado*xcomp, metros quadrados); end.

Manual de Curso

35

TURBO PASCAL
4.4. EXERCCIOS PROPOSTOS
1. Pretende-se um programa que apresente a soma de dois nmeros digitados pelo utilizador. 2. Pretende-se um programa que troque os valores de duas variveis. O programa dever ler dois valores inteiros guardando os seus valores em duas variveis, dever escrev-los, trocar os valores das variveis e mostrar o resultado. 3. Elabore um programa que apresente a tabuada (de 1 at 10) de um valor pedido. A representao da tabuada deve ter o seguinte formato: 4*1= 4 4*2= 8 4 * 3 = 12

36

Manual de Curso

TURBO PASCAL

5. ESTRUTURAS CONDICIONAIS
Nos programas em Pascal que encontrmos at agora, cada instruo era executada pela ordem em que aparecia no programa. Programas deste tipo so irrealisticamente simples, uma vez que no incluem estruturas de controlo que tornen possvel decidir, dependendo do valor de uma expresso, se uma instruo ou um grupo de instrues deve ou no ser executado, ou qual, de entre vrios grupos de instrues, dever ser executado. A estas estruturas dar-se- o nome de estruturas condicionais. De forma a abordar problemas mais realistas, o prximo passo ser o de aprender a utilizar estruturas de controlo condicionais nos programas . As estruturas condicionais existentes em Pascal so as seguintes: IF e CASE.

5.1. ESTRUTURA CONDICIONAL IF


A estrutura condicional IF permite a execuo condicional de uma instruo (ou conjunto de intrues), ou seja, permite que uma instruo (ou um conjunto de instrues) seja executada, dependendo de uma condio lgica ser verdadeira ou falsa. Este comando tambm utilizado para seleccionar entre dois ou mais conjuntos de instrues a serem executados a alternativa correcta. A sua sintaxe : IF expresso THEN instrues1 ELSE instrues2; em que: expresso tem de ter um resultado do tipo lgico. Quando uma estrutura condicional IF encontrada, a expresso avaliada. Se o resultado da expresso for verdadeiro, apenas a primeira instruo (ou o primeiro bloco de instrues) executado (instrues1); se o resultado da expresso for falso, so por sua vez, executadas as instrues correspondentes ao bloco de instrues2. Sempre que qualquer um destes blocos (instrues1 ou instrues2) forem constitudos por mais de uma instruo, tero de ser delimitados pelas palavras reservadas BEGIN e END, marcando o incio e o fim do bloco, respectivamente. Chama-se ateno para o facto de no se colocar um (;) antes da palavra reservada ELSE, porque seria interpretado como o fim do comando IF. No caso de isso acontecer, seria gerado um erro pelo compilador, pois a palavra reservada ELSE, por si s, no constitui um comando vlido.

Manual de Curso

37

TURBO PASCAL
Vejamos de seguida dois exemplos: Exemplo 1: if estado=S then taxa:=0.20 * salario else taxa:=0.14 * salario; Exemplo 2: if (var1>var2) and (saida=true) then writeln(Mximo = ,var1) else writeln(Mximo = ,var2);

A segunda parte da estrutura condicional IF, constituda pelo ELSE, opcional dependendo do facto de existirem ou no mais hipteses possveis a considerar. Atendendo a isto, a estrutura em causa pode ser alterada, apresentando-se sob uma outra forma mais simples: IF expresso THEN instrues; Esta segunda forma da estrutura condicional IF, pode ser vista como um caso especial da primeira, onde o comando que segue imediatamente palavra reservada ELSE o comando vazio (o comando vazio corresponde a no executar nada de facto). Ou seja, IF expresso THEN instrues; ELSE; {no faz nada} Atende-se no seguinte exemplo, demonstrativo do que acabou de ser referido: IF erro=TRUE THEN Writeln (Ocorreu um erro! ); Aps a estrutura condicional IF ter sido executada, passa-se s restantes instrues do programa, caso existam. Para maior facilidade de leitura, normal usar a indentao, nomeadamente em comandos que englobem um conjunto de instrues, como no caso do IF. De notar que a indentao no altera o significado de um programa, sendo apenas usada para tornar os programas mais fceis de ler. H que ter muito cuidado ao usar a indentao para que no haja leituras erradas. Considere o exemplo: if x>0 then x:=x+1 else begin y:=x; z:=z+3; end; As instrues de cada grupo so indentadas para a direita e as palavras reservadas IF e ELSE aparecem salientes esquerda, separando as duas

38

Manual de Curso

TURBO PASCAL
alternativas. Note-se que o conjunto de instrues a seguir ao ELSE formam um bloco composto, sendo portanto, delimitadas pelas palavras BEGIN e END. 5.1.1. ESTRUTURA ENCADEADA DE COMANDOS IF Na sintaxe da estrutura condicional IF, no h nenhuma restrio ao tipo de instrues a serem usadas a seguir s palavras reservadas THEN e ELSE. Assim, essas instrues podem ser, por sua vez, outras estruturas IF. Quando isto acontece, diz-se que estamos em presena de uma estrutura encadeada de estruturas condicionais IF. Quando se tm vrias estruturas encadeadas, umas nas outras, o uso da indentao tende a gerar programas cujas linhas so cada vez mais longas. Para evitar esta situao, e quando h mais do que 3 ou 4 alternativas, poder usar-se uma indentao em que, cada um dos comandos IF encadeado escrito imediatamente depois da palavra ELSE anterior, como se pode ver no seguinte exemplo: if x>0 then x:=x+1 else if x>1 then x:=x+2 else if x>2 then x:=x+3 necessrio algum cuidado quando se escrevem estruturas encadeadas de estruturas condicionais IF. Por exemplo, para este comando: if x>0 then if y>=0 then writeln (Ambos so maiores que zero.) else writeln (A varivel Y menor que zero e X maior que zero.); Para resolver o problema da associao dos pares IF/ELSE para cada estrutura condicional IF, o compilador usa como conveno, que um ELSE sempre associado ao IF mais prximo que ainda no tenha um ELSE. Se pretender associar um ELSE a um IF que no seja o ltimo em uso, tem de se usar um par BEGIN/END. No entanto, se estes pares forem redundantes poder haver uma diminuio considervel da legibilidade do programa.

Manual de Curso

39

TURBO PASCAL
5.2. ESTRUTURA CONDICIONAL CASE
Como alternativa estrutura condicional IF encadeada, algumas linguagens de programao oferecem estruturas de seleco mltipla, como o caso da estrutura condicional CASE, em Pascal. A estrutura condicional CASE no deve ser considerada como uma verso mais legvel da estrutura condicional IF. A estrutura condicional IF encadeada apropriada para condies separadas por operadores lgicos e para testes baseados em valores de intervalos contnuos, enquanto que a estrutura condicional CASE apropriada para condies discretas (valores nicos). A sintaxe da estrutura CASE a seguinte: CASE expresso OF etiqieta1:instrues1; etiqieta2:instrues2; etiqietan:instruesn; OTHERWISE instrues; END; em qu e: expr ess o etiqu eta tem se ser de um tipo ordinal (no pode ser um valor real); consoante o resultado, ser escolhida uma das opes possveis (ou seja, umas das etiquetas) e executadas as respectivas instrues. constituda por uma ou mais constantes (do mesmo tipo da expresso), separadas por vrgulas. A mesma constante no pode aparecer em duas opes diferentes.

Quando uma estrutura condicional CASE encontrada, calculado o valor da expresso; so ento executadas as instrues que se encontram frente da opo que contenha uma constante com o valor da expresso (isto explica a razo porque a mesma constante no pode surgir em duas etiquetas diferentes). Caso o valor da expresso no seja igual a nenhuma das constantes existentes na s opes, ento no ser executada qualquer instruo. A clusula OTHERWISE, introduzida de modo a ser possvel tratar o caso em que o valor da expresso no igual a nenhum dos valores especificados nas opes. Um exemplo tpico do comando CASE incluindo a clusula OTHERWISE ilustrado abaixo. Neste exemplo assume-se que escolha uma varivel do tipo caracter. case escolha of V,v: writeln(Vermelho); B,b: writeln(Branco); A,a: writeln(Azul); otherwise writeln (Cor invlida); end;

40

Manual de Curso

TURBO PASCAL
Outro exemplo tpico da estrutura CASE o que a seguir se apresenta. Neste caso x e y so variveis reais. O valor de x/10 truncado e consequentemente convertido num inteiro. Se este inteiro for igual a um, ento y ser incrementado 5 unidades. Da mesma forma, se o valor for 3, 5 ou 6 ser atribudo a y o valor 2*(y+1). O valor de y manter-se- inalterado se o resultado da expresso for 2 ou 4. Por fim ser atribudo 0 a y se a expresso tiver o valor 9 e enviada uma mensagem de aviso para o exterior (por se tratarem de duas instrues, necessrio utilizar o par BEGIN/END). Para todos os outros valores que a expresso assuma a aco ser indefinida, uma vez que no foi utilizada a clusula OTHERWISE.

case trunc(x/10) of 1 : y:=y+5; 3,5,6 : y:=2*(y+1); 2,4 : ; {no realizada nenhuma aco} 9 : begin y:=o; writeln(Ateno! Varivel y nula.); end; {da opo em que trunc (x/10)=9} end; {da estrura CASE}

5.3. IF VERSUS CASE


Em geral, um comando IF usado quando o nmero de alternativas no muito grande, quando se pretende impor uma ordem de avaliao das expresses usadas para seleco, ou quando as alternativas correspondem a intervalos. O comando CASE tem o efeito de mostrar todas as alternativas possveis e , portanto, mais legvel. Sempre que possvel, o comando CASE deve ser usado quando se seleccionam alternativas em vrios e quando esses valores so discretos.

5.4. EXERCCIOS PROPOSTOS


1. Elabore um programa que determine o maior de trs nmeros digitados pelo utilizador. 2. Pretende-se um programa que apresente o seguinte Menu: 1 - Adio 2 - Subtraco 3 - Multiplicao 4 - Diviso 0 - Sair

Manual de Curso

41

TURBO PASCAL
opo? Qual a

aps o utilizador seleccionar uma das primeiras quatro opes, so pedidos dois valores e posteriormente ser mostrado o resultado da operao seleccionada; no caso de seleccionar a ltima opo o programa deve dar uma mensagem e voltar para a prompt do sistema.

42

Manual de Curso

TURBO PASCAL

6. ESTRUTURAS REPETITIVAS
Alm das estruturas sequncias e condicionais tratadas nos captulos anteriores, existem tambm em Pascal estruturas que permitem repetir uma instruo ou um conjunto de instrues designadas por estruturas repetitivas. D-se o nome de ciclo execuo de um conjunto de instrues. Este conjunto composto por uma ou mais instrues e constitui o interior da estrutura repetitiva. Se for composto por mais que uma instruo, este bloco de instrues ter de ser delimitado pelo par BEGIN/END. Como regra geral, a execuo de um ciclo est sujeita a uma condio que controla o nmero de vezes que este executado, ou mais propriamente, controla a paragem da sua execuo. feito um passo atravs do ciclo quando executada uma das instrues que constitui o ciclo. De notar que o nmero de vezes que um ciclo executado ter de ser finito; erros semnticos podem ser causados por uma execuo interminvel do cdigo que constitui a estrutura repetitiva. Quando isso acontece, podemos dizer que estamos na presena de um ciclo infinito. H trs estruturas diferentes em Pascal que permitem a execuo destes ciclos: so as estruturas repetitivas WHILE, REPEAT e FOR. No h qualquer restrio, quando ao tipo de instrues que qualquer uma destas estruturas pode conter, pelo que podero existir estruturas sequnciais, condicionais e repetitivas encadeadas.

6.1. ESTRUTURA REPETITIVA WHILE


Tal como para as estruturas anteriores, sempre que o corpo do ciclo tiver mais do que uma instruo necessrio utilizar o par BEGIN/END (caso contrrio apenas a primeira instruo do ciclo executada). A sintaxe da estrutura WHILE a seguinte: WHILE expresso DO BEGIN instruo1; instruo2; instruon; END; em qu e: expr ess o do tipo lgico e representa a condio de paragem da execuo do ciclo.

Na sua forma mais simples esta sintaxe apresentar-se-: WHILE expresso DO

Manual de Curso

43

TURBO PASCAL
instruo; Quando encontrada uma estrutura repetitiva WHILE, a expresso avaliada: se o seu valor for verdadeiro ento o ciclo executado passo a passo, ou seja, o conjunto de instrues que compem o corpo da estrutura executado sequencialmente. Cada vez que isto acontece, o valor da expresso novamente calculado. Este processo repetido at que o valor da expresso seja falso, altura em que a sua execuo termina. A execuo do programa recomea imediatamente a seguir ltima instruo da estrutura repetitiva. Como bvio, as instrues que constituem o ciclo tm de modificar o valor da expresso, caso contrrio, o ciclo poderia nunca terminar. Se o valor da expresso TRUE, no incio da execuo da estrutura e se as instrues que compem o ciclo no modificarem essa expresso, ento, estaremos de certeza, perante um ciclo infinito. Exemplo de um ciclo infinito:
program total (input,output); var soma,num,i:integer; begin i:=0; while i<20 do begin writeln (Indique o nmero..: ); read(num) soma:=soma+num; end;

Chama-se a ateno para o facto de que, se o valor inicial da expresso for FALSE as instrues que constiuem a estrutura repetitiva nunca sero executadas. Em geral, o nmero de vezes que o ciclo ser executado no conhecido partida. Vejamos o seguinte exemplo:
program quadrado1(input,output); var inicial,final:integer; begin inicial:=1; write(Introduza o valor final: ); readln(final); while inicial<=final do begin writeln( x = , inicial, quadrado= ,sqr(final)); inicial:=inicial+1; end; end.

44

Manual de Curso

TURBO PASCAL
O resultado da execuo deste programa consiste em fazer sair uma lista de inteiros, e respectivos quadrados, entre um valor inicial e um valor final.

6.2. ESTRUTURA REPETITIVA REPEAT


Quando a estrutura repetitiva REPEAT encontrada, so primeiramente executadas as instrues que constituem o bloco de instrues. No fim deste, calculado o valor da expresso. Se o valor for FALSE, ento o bloco de instrues ser executado de novo, realizando mais um ciclo, e assim sucessivamente. Logo que o valor da expresso seja TRUE, a execuo do ciclo em causa termina. Note-se que, ao contrrio do comando WHILE, a expresso testada aps a execuo do ciclo, ou seja, o bloco de instrues sempre executado pelo menos uma vez e a condio de teste reaje ao FALSE e no ao TRUE conforme acontece no WHILE. O comando REPEAT possui a seguinte sintaxe: REPEAT instrues; UNTIL expresso; Em oposio estrutura WHILE, no necessrio utilizar o par BEGIN/END, quando o bloco de instrues tem mais do que uma instruo. Uma vez que esta estrutura delimitada pelas palavras reservadas REPEAT e UNTIL, no h ambiguidade quanto s instrues que devem ser repetidas, ou seja, quais as que pertencem ao bloco de instrues. Tal como na estrutura repetitiva WHILE, o nmero de vezes que o ciclo executado no pode ser calculado partida. De modo a que as diferenas entre o WHILE e o REPEAT possam ser observadas, apresenta-se em seguida o exemplo utilizado na demonstrao da estrutura repetitiva WHILE, mas fazendo agora uso da estrutura REPEAT:
program quadrado2 (input,output); var inicial,final:integer; begin inicial:=1; write(Introduza o valor final: ); readln(final); repeat writeln( x = , inicial, quadrado= ,sqr(final)); inicial:=inicial+1; until inicial>final end.

Manual de Curso

45

TURBO PASCAL
Um outro exemplo de aplicao desta estrutura o que se apresenta a seguir, servindo para controlar a entrada de dados (validao):
program valida (input,output); var numero:integer; begin write(Introduza o nmero: ); repeat readln(numero); if (numero<0) or (numero>9) then writeln (Erro. nmero invlido. Digite novamente: ); until (numero>=0) and (numero<=9); end.

O comando REPEAT inserido neste programa garante que a varivel numero s pode conter valores pertencentes ao intervalo [0,9].

6.3. ESTRUTURA REPETITIVA FOR


A sintaxe da estrutura repetitiva FOR a seguinte:
FOR varivel:=inicial TO final DO BEGIN instrues; END; FOR varivel:=inicial DOWNTO final DO BEGIN instrues; END;

ou

A execuo do conjunto de instrues ciclicamente controlada por uma varivel chamada varivel de controlo do ciclo (que tem de ser um tipo ordinal). No incio da execuo do ciclo atribudo um valor a essa varivel. Depois de cada passo atravs do ciclo, esse valor incrementado (FOR...TO) ou decrementado (FOR...DOWNTO) de uma unidade. Quando o valor da varivel de controlo do ciclo for maior que o final, a execuo do ciclo termina para o primeiro caso. Para a estrutura FOR...DOWNTO ser ao contrrio, ou seja, a repetio das instrues termina quando o valor da varivel de controlo for menor que o final. Num ciclo FOR, possvel saber partida o nmero de vezes que o ciclo ser executado atravs das expresses:
valor_final - valor_inicial +1 (TO) e valor_inicial - va lor_final +1 (DOWNTO)

Rescrevendo o exemplo dado para a estrutura FOR:

program quadrado3 (input,output); var inicial,final:integer; begin inicial:=1; write(Introduza o valor final: ); readln(final); for i:=inicial to final do writeln( x = , inicial, quadrado= ,sqr(final)); end.

46

Manual de Curso

TURBO PASCAL
6.4. A ESCOLHA DE UMA ESTRUTURA REPETITIVA
Para se decidir qual a estrutura a usar, dever analisar-se o problema de forma a poder determinar qual a que melhor se adapta situao especfica. As seguintes questes devem ser colocadas na tomada de deciso: os comandos devem ser repetidos at que uma certa condio se verifique? se sim, usar o comando REPEAT. os comandos devem ser repetidos enquanto uma certa condio se verifica? Se sim, usar o comando WHILE. pode saber-se partida quantas vezes o ciclo ser repetido? Se sim, usar o comando FOR. Um outro ponto a ter em considerao quando se escolhe a estrutura de controlo repetitiva diz respeito eficincia de um programa. A estrutura FOR, na maioria dos casos, mais eficiente do que as estruturas REPEAT e WHILE, logo, dever se usado sempre que possvel.

6.5. EXERCCIOS PROPOSTOS


1. Elabore um programa que apresente no cran a palavra PASCAL, o nmero de vezes desejado pelo utilizador. 2. Pretende-se um programa que apresente os primeiros 10 nmeros pares ou impares consoante seja a escolha do utilizador. 3. Elabore um programa que apresente a soma dos primeiros 100 nmeros pares. No incio do programa utilizado um MENU, para que o utilizador possa seleccionar a estrutura de repetio (REPEAT, WHILE ou FOR), que o computador vai utilizar para calcular a soma.

Manual de Curso

47

TURBO PASCAL

7. PROCEDIMENTOS E FUNES
O mtodo utilizado na construo de um programa, tal como foi referido, consiste em, partindo de um problema inicial, decompo-lo sucessivamente em problemas cada vez menores, at que se obtenha algo fcil de analisar. Quanto maior a envergadura do problema inicial, mais til se torna esta abordagem. Em Pascal, possvel formar subprogramas agrupando as instrues e os comandos que os iro constituir, permitindo assim dividir o programa em vrias partes, sendo cada uma delas desenvolvida separada e independentemente das outras. Um subprograma executa as mesmas aces que um programa, podendo receber dados do exterior, manipulando a informao e produzindo novos resultados que podero vir ou no a ser enviados para o exterior. No entanto, um subprograma usado para realizar um fim especfico, dentro de um objectivo geral, o do programa. Quando um programa executa uma destas partes, diz-se que houve uma chamada ao subprograma. Um subprograma pode ser chamado por outro, e assim sucessivamente. A chamada a um subprograma pode ser realizada em qualquer ponto do corpo do programa. Podem enumerar-se algumas vantagens em usar subprogramas: os programas tornar-se-o fceis de escrever, de ler, de alterar e mais curtos; quando se desenvolve um programa, pode expressar-se o problema principal em termos de subproblemas que o constituem e assim, libertar o programa principal das especificaes e detalhes de cada um desses subproblemas. Deste modo, pode seguir-se a metodologia top-down design; quando se l um programa, encontram-se referncias a resultados das suas operaes e evita-se assim entrar em detalhe de como esses resultados foram obtidos. Trata-se do que se convencionou chamar abstraco procedimental; se for necessrio executar alguma aco em vrios locais do programa, apenas se far uma chamada ao subprograma que contm as instrues que realizam a aco, optimizando assim o cdigo; se pretender-se modificar uma certa especificao de um programa, essa modificao feita no subprograma que a realiza, tornando-a assim intrnseca apenas a uma parte do programa; A sintaxe da chamada a um subprograma a seguinte: identificador_de_subprograma (lista_de_parmetros);

Manual de Curso

49

TURBO PASCAL
em qu e: identificador_de_subp rograma lista de parmetros representa o nome do subprograma; um assunto a ser abordado um pouco mais adiante neste captulo.

Em Pascal, existem dois tipos de subprogramas: os procedimentos e as funes sendo o seu uso dependente do tipo de comunicao de dados pretendido entre o subprograma e o programa principal.

7.1. PROCEDIMENTOS EM PASCAL


A estrutura dum procedimento em Pascal segue em todos os aspectos a estrutura de um programa, excepo do cabealho de ambos e do facto de o programa finalizar com um ponto final (.), enquanto um procedimento termina com um ponto e vrgula (;). A criao de um procedimento feita pela declarao do mesmo, na zona de declaraes de procedimentos ou funes, sendo a sintaxe para realizar esta aco a seguinte: PROCEDURE identificador_de_procedimento (parmetros_formais); BEGIN corpo_de_procedimento END;
em que: identificador_procedimento parmetros_formais corpo_de_procedimento representa o nome do procedimento. descrevem o nome e o tipo dos argumentos passados para o interior do procedimento podendo estar presentes ou no. representa o conjunto de instrues a serem seguidas durante a execuo do procedimento. O corpo_do_procedimento delimitado pelas palavras reservadas BEGIN e END, seguida de um ponto e vrgula (;).

Como exemplo, mostra-se a declarao de um procedimento, mas neste caso, sem passagem de parmetros:

procedure escrevecabecalho; begin for i:=1 to 20 do writel( ); {escreve 20 espaos para centrar texto no cran} writeln (Turma A - Notas Finais ); end;

50

Manual de Curso

TURBO PASCAL
7.1.1. ESTRUTURAS EM BLOCOS Foi referido que a estrutura de um procedimento idntica de um programa. Deste modo, dentro do bloco de um procedimento possvel declarar constantes, tipos, variveis e mesmo outros procedimentos e funes. Cria-se assim uma estrutura de blocos encadeados, habitualmente designada por estrutura imbrincada, em que procedimentos ou funes esto inseridos dentro de outros procedimentos ou funes e assim sucessivamente. Este tipo de estrutura pode ser observada atravs do exemplo que a seguir se apresenta:
program exemplo (input,output); const a=15.34; var y:char; procedure p1; type byte=0..255; var a,b:integer; c:char; procedure p2; var k:real; begin {procedimento p2} {corpo principal do procedimento p2} end; begin {procedimento p1} {corpo principal do procedimento p1} end; begin {programa principal} {corpo principal do programa} end.

Os identificadores declarados dentro de um procedimento dizem-se locais a esse procedimento. Deste modo, a varivel k declarada no procedimento p2 dita uma varivel local a esse procedimento. Por oposio, os identificadores declarados no bloco do programa principal so designados como globais, pois so acessveis em todos os procedimentos, funes e no programa principal. Assim, a varivel y uma varivel global. Um problema que surge com a introduo da estrutura de blocos imbrincados, o de saber em que blocos visvel cada identificador, seja varivel constante ou qualquer outro tipo de identificador. A zona de visibilidade de cada identificador, designada vulgarmente por mbito (scope), determinada em funo do ponto em que declarado, de acordo com as seguintes regras: um identificador s conhecido no bloco onde foi declarado, e em todos os blocos interiores a esse, com a restrio expressa pela regra seguinte; se um identificador declarado no bloco A, for redeclarado num bloco interior B, a declarao feita em A deixa de ter validade no bloco B,

Manual de Curso

51

TURBO PASCAL
e em todos os blocos interiores a este. Esse identificador passa a ser vlido em B, apenas no contexto em que a foi declarado, sendo de novo aplicvel a regra anterior para determinar a sua zona de validade. Estas regras ficam mais claras se nos debruarmos sobre o seguinte exemplo:
program ambito (input,output); var i,j:integer; procedure um; const i=16; var k:char; procedure dois; var j:real; begin end; begin

end; begin {programa principal} end.

Na zona podem ser usados: a varivel local: j a constante no local: i a varivel no local: k o procedimento dois Na zona podem ser usados: a varivel global: j a constante local: i a varivel local: k os procedimentos dois e um No programa principal podem ser usados: as variveis globais: i,j os procedimentos dois e um De notar que o facto de se redeclarar um identificador em alguns blocos imbrincados, usualmente com significados diferentes, uma possvel fonte de erros, alm de tornar mais confusa a leitura do programa. O uso de variveis locais tem grandes vantagens, das quais se salienta:

52

Manual de Curso

TURBO PASCAL
minimiza o espao em memria necessrio para guardar os valores dessas mesmas variveis, uma vez que o tempo de vida se restringe ao subprograma; evita que ocorram erros de execuo provocados pelo uso indevido dessas variveis noutras zonas do programa; as variveis s tm significado dentro dos procedimentos onde foram declarados; da resulta uma considervel simplificao para quem l o programa. 7.1.2. PARMETROS Uma das grandes vantagens no uso de procedimentos a possibilidade de poderem ser chamados de vrios pontos do programa, executando as instrues que os constituem, como se essas instrues estivessem colocadas no local onde ocorre a chamada. Vamos supor ento que pretendamos criar um procedimento que trocasse os valores de dois nmeros:
program trocar (input,output); var x,y,z:integer; procedure troca1; var t:integer; begin t:=x; x:=y; y:=t; end; procedure troca2; var t:integer; begin t:=x; x:=z; z:=t; end; begin x:=10; y:=20; z:=30; troca1; troca2; end.

Aps a chamada do procedimento troca1 os valores que as variveis x e y continham sero trocados, obtendo-se no final o valor de 20 e 10, para x e y, respectivamente. Depois da chamada do procedimento troca2 os valores das variveis x e z sero 30 e 20. Existe, no entanto, um inconveniente em usar procedimentos na forma indicada: temos de construir dois procedimentos para executar a mesma aco (trocar o valor a duas variveis), ou seja h uma repetio de cdigo que poderia ser evitada. Seria assim vantajoso, ter a possibilidade

Manual de Curso

53

TURBO PASCAL
de trocar os valores de quaisquer duas variveis utilizando apenas um procedimento. Isso seria possvel se na chamada ao procedimento e junto com o nome do identificador, fossem fornecidos os identificadores a trocar. A estas variveis, usadas tanto na chamada ao procedimento, como na sua declarao, chamam-se parmetros. Usando estes novos conhecimentos, o programa trocar, atrs apresentado, ser ento alterado do seguinte modo:
program trocar (input,output); var x,y,z:integer; procedure troca(var a,b:integer); var t:integer; begin t:=a; a:=b; b:=t; end; begin x:=10; y:=20; z:=30; troca(x,y); troca(x,z); end.

A necessidade de utilizao da palavra reservada VAR que precede os parmetros formais ser referida posteriormente neste captulo. assim possvel utilizar o procedimento troca com os pares de variveis x/y e x/z. importante referir que, o tipo de dados usado em cada par de variveis tem de ser o mesmo, ou seja, se o parmetro x inteiro, o parmetro a ter de ser inteiro tambm. s variveis usadas na chamada do procedimento (no exemplo dado, os pares x/y e x/z), d-se o nome de parmetros actuais, sendo usadas do seguinte modo: identificador_deprocedimento (parmetro_actual [; parmetro_actual]); s variveis usadas na declarao do procedimento (as variveis a e b do exemplo anterior), iremos ento chamar parmetros formais do mesmo. Ser de salientar que, o uso de parmetros formais exige a declarao de qual o tipo de dados a que pertence cada parmetro; neste exemplo, cada parmetro uma varivel do tipo inteiro. Se, porventura, os parmetros forem de tipos diferentes necessrio declar-los individualizados por cada tipo de dados, separando-os por um ponto e vrgula (;). Alm disso , as variveis podem ser indicadas por cada tipo de dados, separando-as por vrgulas. Por exemplo:
procedure exemplo (i,a:integer; r:real); begin corpo_do_procedimento; end;

54

Manual de Curso

TURBO PASCAL
Assim sendo, a lista de parmetros formais constituda por um ou mais conjuntos de variveis separados por um ponto e vrgula (;) e colocadas entre parntesis. A sintaxe a seguinte: procedure identificador_procedimento (parmetros_formais:tipo [; parmetro_formais:tipo]); begin corpo_do_procedimento; end; Cada conjunto de variveis introduz um ou mais parmetros da mesma classe. Existem duas classes possveis, cada uma das quais com a sintaxe que se apresenta: parmetros por valor - lista_identificadores: identificador__tipo_dados; parmetros por referncia - var lista_identificadores_parmetros: Daqui se pode inferir que uma classe que no seja precedida pela palavra reservada VAR, introduz parmetros por valor. Muito importante o facto de existirem algumas regras a serem mantidas entre a lista de parmetros formais e a lista de parmetros actuais: ambas tm de ter o mesmo nmero de parmetros; cada parmetro formal corresponde ao parmetro actual que ocupa a mesma posio de ordem, lista correspondente; cada parmetro formal tem de ser do mesmo tipo do seu correspondente parmetro actual, tal como j foi referido. Importa agora distinguir entre cada uma das classes atrs referidas. Ser esse o assunto que iremos abordar de seguida. 7.1.2.1. Parmetros por valor Estes parmetros so tambm chamados de parmetros de entrada de dados, uma vez que a sua nica funo a de passar valores para o interior de um procedimento ou funo. O modo de usar parmetros por valor, o modo utilizado no exemplo trocar e que aqui simplificado no intuito de nos ajudar na compreenso deste item.
program trocar (input,output); var x,y:integer; procedure troca(a,b:integer); var z:integer; begin z:=a; {1 estado} a:=b; {2 estado} b:=z; {3 estado} end; begin x:=10; y:=20; troca(x,y); end. identificador_tipo_dados;

Manual de Curso

55

TURBO PASCAL
Quando ocorre a chamada ao procedimento troca, os valores de x e y so respectivamente 10 e 20; sendo ento passados para as variveis a e b, parmetros do procedimento troca. Assim, esto em jogo neste momento quatro variveis; qualquer alterao aos valores das variveis a e b ser sentido por elas e somente por elas, uma vez que so perfeitamente independentes das variveis xe y. As variveis a e b passam por trs estados diferentes, enquanto que as variveis x e y (globais) se mantm inalteradas:
Esta do 1 2 3 vari vel a 10 20 20 vari vel b 20 20 10 vari vel z 10 10 10 vari vel x 10 10 10 vari vel y 20 20 20

Findo estes estados, o procedimento troca acaba, dando origem a que as variveis a, b e z terminem o seu ciclo de vida, no tendo havido interaco entre estas e as variveis x e y. Os valores de x e y no forma alterados, possuindo x e y, neste momento, os valores 10 e 20, respectivamente. Como concluso, podemos dizer que estamos em presena de parmetros por valor, quando ocorre apenas uma passagem de valor entre variveis (a e b tomam os valores de x e y), no ocorrendo mudana dos valores de x e y em funo da mudana de valores de a e b. De um modo mais geral, poder-se- definir passagem de parmetros por valor quando, quaisquer que sejam as aces efectuadas sobre um parmetro formal, estas no so sentidas pelo parmetro actual. 7.1.2.2. Parmetros por referncia O uso de parmetros por referncia poder ser observado atravs do uso da palavra reservada VAR na instruo de declarao de procedimento. De notar novamente o uso do mesmo exemplo, no intuito de observar as diferenas entre este mtodo e o anterior.
program trocar (input,output); var x,y:integer; procedure troca(var a,b:integer); var z:integer; begin z:=a; {1 estado} a:=b; {2 estado} b:=z; {3 estado} end; begin x:=10; y:=20; troca(x,y); end.

56

Manual de Curso

TURBO PASCAL
Quando ocorre uma passagem por referncia, o que acontece o seguinte: durante a execuo do procedimento, atribudo um novo identificador (nome do parmetro formal) ao parmetro real correspondente. Assim sendo, quando ocorre a chamada ao procedimento, esto em jogo neste momento no quatro variveis, como no exemplo precedente, mas sim duas variveis, x e y, com outro nome, a e b. Qualquer alterao aos valores das variveis a e b ser sentido por elas e pelas variveis x e y, dado que apenas houve alterao no nome. O valor final de x e y ser ento o ltimo valor atribudo ao parmetro formal a e b, respectivamente. Vamos ento proceder anlise detalhada das variaes de valor para as variveis a e b e ao mesmo tempo para as variveis x e y;
Esta do 1 2 3 vari vel a 10 20 20 vari vel b 20 20 10 vari vel z 10 10 10 vari vel x 10 20 20 vari vel y 20 20 10

Findos estes estados, o procedimento troca acaba, dando origem a que as variveis a,b e z terminem o seu ciclo de vida. As variveis x e y foram alterados, possuindo x e y, neste momento, os valores 20 e 10, respectivamente. De um modo mais formal, poder-se- definir parmetros por referncia quando, quaisquer que sejam as aces efectuadas sobre o parmetro formal correspondente ao parmetro actual passado na chamada do procedimento, essas aces so sentidas pelo parmetro actual. De notar o seguinte aspecto: as alteraes foram sentidas pelas variveis x e y, porque a palavra reservada VAR est posicionada atrs de um conjunto de parmetros formais do mesmo tipo. Se estivesse posicionada apenas atrs de um parmetro formal (por exemplo do a) as alteraes seriam sentidas pelo parmetro actual correspondente ao parmetro formal que possusse a palavra VAR (seriam sentidas pela varivel x). Todos os outros parmetros se comportariam como se de parmetros por valor se tratassem. de salientar, e como resumo, que um programa deve usar uma maior quantidade de parmetros nos procedimentos e funes em detrimento de variveis globais, dado que assim a gesto da memria ficar facilitada.

Manual de Curso

57

TURBO PASCAL
7.2. FUNES EM PASCAL
At este momento todas as funes utilizadas nos diversos exemplos correspondem s funes padro em Pascal. No entanto, permitido que o programador defina as suas prprias funes. De um modo geral, poder-se- definir funo, como um conjunto de aces que realizam um subproblema, mas que ao contrrio dos procedimentos, retorna um valor ao local onde a funo foi chamada. As funes so bastante semelhantes aos procedimentos, sendo-lhes aplicadas as mesmas regras (incluem-se tambm as respeitantes passagem de parmetros por valor e por referncia). As principais diferenas so: no cabealho da declarao usada a palavra reservada FUNCTION em substituio da palavra reservada PROCEDURE: o seu identificador tem uma utilizao adicional dentro do corpo da funo, servindo para guardar o resultado produzido pela execuo da funo; devolve um nico valor (tal como foi dito) do tipo atribudo na declarao, identificado pelo nome da funo; quando efectuada uma chamada funo, ter de ser atribudo o seu resultado a uma varivel que ter de ser do mesmo tipo do resultado retornado. A sintaxe de declarao de uma funo a seguinte: FUNCTION identificador_funo(lista_parmetros_formais):tipo_resultado; BEGIN corpo_da_funo; END; o tipo de dados do valor retornado pela funo, tendo que ser obrigatriamente de um tipo elementar (integer, real, char, boolean, pointer ou enumerado). de salientar que no corpo de uma funo tem de existir, pelo menos, uma instruo que atribua um valor (do tipo do resultado) ao seu identificador (nome), sendo esse valor o resultado da chamada funo. Esse valor retornado para o ponto onde a funo foi chamada e a execuo do programa continua a partir desse ponto. em qu e: tipo_res ultado

58

Manual de Curso

TURBO PASCAL
Um exemplo da declarao de uma funo que determina o maior de dois nmeros inteiros, passados como parmetros, :
program maior (input,output); var num1,num2,res:integer; function max(num1,num2:integer):integer; begin if num1>num2 then max:=num1 else max:=num2; end; begin write (Introduza um nmero: ); readln(num1); write (Introduza um nmero: ); readln(num2); res:=max(num1,num2); {chamada funo} writeln (Omaior nmero introduzido foi: ,res); end.

7.3. RECURSIVIDADE
Como foi referido, o corpo de um procedimento ou funo um bloco, pelo que, atendendo definio de bloco, no existe qualquer restrio quanto ao tipo de instrues que a podem ser utilizadas,, excepo daquelas que vimos referindo ao longo deste manual. Em particular, permitido que um procedimento ou funo se chame a si prprio. Neste caso, estamos em presena de um subprograma recursivo. Um exemplo poder ilustrar melhor o que acima foi referido: Pretende-se conceber a funo matemtica factorial, cuja definio a seguinte: 0! = 1 1! = 1 2! = 2 * 1 3! = 3 * 2 * 1 n! = n * (n-1) * (n-2) * ..... * 2 * 1 Um modo de construir uma funo em Pascal que realize a funo factorial ser o modo no recursivo, ou mais correctamente, o mtodo iterativo:
function factorial (n:integer):integer; var x,i:integer; begin x:=1; for i:=1 to n do x:=x*1; factorial:=x; end;

Manual de Curso

59

TURBO PASCAL
Um outro modo de atingir o mesmo objectivo, ser o de realizar uma funo recursiva. O exemplo apresentado encontra-se mais completo que o anterior.
function factorial (n: integer): integer; begin if n<o then writeln( ERRO! ) else if n=0 then factorial:=1 else factorial:= n * factorial(n-1); end;

Se, por exemplo, pretendermos calcular o factorial de 4, a execuo passo a passo da funo recursiva ser: factorial(4) = 4 * factorial(3) = 4 * ( 3 * factorial(2)) = 4 * ( 3 * (2* factorial(1))) = 4 * ( 3 * (2* (*1 factorial(0)))) = 4 * ( 3 * (2* (*1 * 1))) = 24 O conceito fundamental num subprograma recursivo definir um problema em termos de uma verso simples dele prprio. Esta definio repetida com sucesso at que seja encontrada a soluo. A soluo ento usada para calcular o resultado de cada subprograma gerado, produzindo assim o resultado final. Como resumo, poder-se- dizer que uso de subprogramas recursivos permite obter solues muito elegantes e simples para problemas que partida se revelam bastante complicados. Ser assim desejvel que o uso de subprogramas recursivos seja prefervel em relao a subprogramas iterativos.

7.4. EXERCCIOS PROPOSTOS


1. Pretende-se um programa que calcule a mdia, a melhor e pior das notas introduzidas e respeitantes aos 5 alunos da disciplina de Introduo Programao. Valide a entrada dos valores para as notas (>=0 e <=20). 2. Elabore um programa que aps introduzir 2 valores inteiros, permita atravs de um MENU, calcular o resultado de uma das quatro operaes aritmticas (+; -; *; /). No esquecer na diviso a validao do denominador.

60

Manual de Curso

TURBO PASCAL

8. UNITS
UNITS so unidades de cdigo que contm procedimentos ou funes e so compiladas separadamente do programa principal. A vantagem de usar UNITS que no necessrio recompilar o programa inteiro aps uma pequena alterao, recompilando-se somente a UNIT afectada. Ao necessitar de algum procedimento ou funo contida numa UNIT basta cham-lo com o comando USES.

8.1. UNIT CRT


A UNIT CRT, fornecida pelo Turbo Pascal, implementa uma variedade de poderosas rotinas (funes e procedimentos) que permitem dar um total controlo do PC. A grande vantagem de usar a UNIT CRT aumentar a velocidade e flexidade ads operaes relacionadas com o cran, pois esta UNIT trabalha directamente com BIOS e a videomemory. 8.1.1. FUNES DA UNIT CRT keypresse d readkey wherex wherey retorna TRUE, no caso de ter sido primida uma tecla e FALSE em caso contrrio. l um caracter do keyboard, mas no mostra-o no cran como acontece com o comando read. retorna o nmero da coluna onde o cursor est posicionado. retorna o nmero da linha onde o cursor est posicionado.

8.1.2. PROCEDIMENTOS DA UNIT CRT ctreol clrscr delay delline gotoxy highvideo limpa todos os caracteres, desde da posio do cursor at ao fim da linha. limpa o cran e coloca o cursor no campo superior esquerdo (1linha e 1 coluna). para a execuo do programa durante um determinado tempo (milisegundos). apaga a linha onde est posicionado o cursor e sobe uma linha todas as linhas que estavam abaixo da linha anulada. posiciona o cursor numa determinada posio, em que x representa o nmero da coluna e y o nmero da linha. activa os caracteres com alta intensidade (mais

Manual de Curso

61

TURBO PASCAL
insline lowvideo normvide o nosound sound textbackg round textcolor luminosos). insere uma linha onde est posicionado o cursor. activa os caracteres com baixa intensidade (menos luminosos). activa os caracteres com a intensidade normal. desactiva o autofalante (som) do computador. activa o autofalante (som) do computador, com uma determinada frequncia. selecciona a cor de fundo com uma determinada cor (cdigo da cor). selecciona a cor de escrita com uma determinada cor (cdigo da cor).

8.1.3. TABELA DE CORES/CDIGOS As cores so representadas por cdigos ( de 0 a 15). Assim, a cada cor corresponde um nmero, constitundo a seguinte tabela: COR CDIGO Preto 0 Azul 1 Verde 2 Cyan 3 Vermelho 4 Magenta 5 Castanho 6 Cinzento claro 7 Cinzento 8 escuro Azul claro 9 Verde claro 10 Cyan claro 11 Vermelho 12 claro Magenta claro 13 Amarelo 14 Branco 15 Piscar 128

8.2. TABELA ASCII


Todos os caracteres (letras, dgitos ou caracteres especiais) so representados, no computador, por um nmero. O cdigo ASCII (American Standard for Information Interchange) dispe de nmeros de 0 a 127 (decimal) cobrindo letras, dgitos de 0 a 9, carateres de pontuao, caracteres de controle, etc. Os cdigos de 128 a 255

62

Manual de Curso

TURBO PASCAL
consistem em smbolos de lnguas estrangeiras e caracteres grficos. Junta-se em anexo a tabela ASCII. Existem algumas funes especficas para trabalhar com o cdigo ASCII. ord( devolve o cdigo decimal da tabela ASCII do caracter x. x) chr( devolve o caracter cujo cdigo ASCII x. x) pre devolve o caracter anterior a y no cdigo ASCII d(y) suc devolve o caracter posterior a y no cdigo ASCII c(y)

8.3. EXERCCIOS RESOLVIDOS


1. {Programa de demonstrao de cores
Programador: J. Carlos P. Almeida Maio/95} program cores (input,output); uses crt; var i,j:integer; begin for i:=0 to 15 do begin textbackground(i); {cor de fundo} clrscr; gotoxy(2,1); {posiciona o cursor na coluna 2, linha1} writeln('Cor de fundo --> ',i); for j:=0 to 15 do begin textcolor(j); {color de escrita} gotoxy(30,2+j); writeln('Cor de texto --> ',j); end; textcolor(128); {128 --> piscar} gotoxy(30,23); writeln('Texto a piscar -> ',128); readln; end; end.

Manual de Curso

63

TURBO PASCAL
2. {Programa Parabns

Programador: J. Carlos P. Almeida Maio/95} program parabens (input, output); uses crt ; begin sound (400); write ('pa'); delay (250); sound (400); write ('ra'); delay (250); sound (450); write ('bens '); delay (500); sound (400); write ('a '); delay (500); sound (540); write ('vo'); delay (500); sound (500); write ('ce , '); delay (1000); sound (400); write ('nes'); delay (250); sound (400); write ('ta '); delay (250); sound (450); write ('da'); delay (500); sound (400); write ('ta '); delay (500); sound (600); write ('que'); delay (500); sound (540); write ('rida'); delay (500); nosound; end. {desactiva a ltima frequncia do autofalante}

3.

{Este programa simula um sistema de acesso. O sistem a de acesso constitudo por um cdigo (3 carateres) e uma senha (3 digitos). Programador: Jos Carlos P. Almeida Junho/95 } program acesso (input,output); uses crt; var i,xsenha,cen,dez:integer; tecla:char; xcodigo:string[3]; begin textbackground(1); textcolor(7); clrscr; textbackground(5); gotoxy(30,10); writeln(''); gotoxy(30,11); writeln(' CDIGO: '); gotoxy(30,12); writeln(' SENHA.: '); gotoxy(30,13); writeln(' '); gotoxy(41,11); readln(xcodigo); gotoxy(41,12); i:=0; repeat i:=i+1; tecla:=readkey; if (tecla>=char(48)) and (tecla<=char(57)) then {digitos 0 a 9} begin val(tecla,xsenha,xsenha); case i of 1:begin cen:=xsenha*100; gotoxy(41,12); end; 2:begin dez:=xsenha*10; gotoxy(42,12); end;

64

Manual de Curso

TURBO PASCAL
3:begin xsenha:=cen+dez+xsenha; gotoxy(43,12); end; end; write('*'); end else i:=i-1; until i=3; textbackground(1); gotoxy(27,22); writeln('Prima uma tecla p/Sair'); repeat until keypressed; textbackground(0); clrscr; end.

8.4. EXERCCIOS PROPOSTOS


1. Elabore um programa que apresenta como resultado o cdigo ASCII da tecla primida. 2. Elabore um programa que apresente o seguinte output:

Manual de Curso

65

TURBO PASCAL

9. TIPOS ESTRUTURADOS
Os tipos de dados que j foram referidos so, por vezes, designados por tipos elementares, porque uma varivel de um desses tipos assume um nico valor de cada vez. Alm disso, no possvel referir-nos a valores diferentes para um mesmo identificador. Assim, surge a necessidade de introduzir um novo tipo de dados, a que se chama estruturado. A este tipo de dados iro pertencer os arrays, os registos e os fiicheiros.

9.1. ARRAYS
Um array pode ser definido como algo que pode agrupar vrios valores do mesmo tipo, partilhando um identificador comum, ou seja, uma estrutura que guarda informao toda do mesmo tipo e que se referencia apenas por um nome. As dimenses de um array so definidas partida para um valor mximo de elementos (nmero de elementos na figura 10) e a sua estrutura pode ser esquematizada da seguinte forma: nome_do_array
1 2 3 4 5 6 7 8 9 10

Como o nome da varivel, no caso do array, se refere a mais do que um elemento, para acedermos a cada um deles, teremos de indicar a sua posio dentro do conjunto. Considerando a seguinte array, como o nome notas: notas
1 2 3 4 5

12 14 15 13 11 Se pretendermos notas[4]:=17; colocar o valor 17 na posio 4, faremos:

Do mesmo modo, se pretendermos adicionar uma unidade ao valor contido na posio n3, a qual possui um valor igual a 15, deveremos escrever: notas[3]:=notas[3]+1; aps esta instruo o valor da posio trs ser 16. A array apresentada at ao momento tm apenas uma dimenso (unidimensionais), mas podem possuir n dimenses. Por exemplo, supondo que necessrio guardar 7 apostas de um totoloto de 6 nmeros cada uma, utilizaremso um array de duas dimenses

Manual de Curso

67

TURBO PASCAL
(bidimensional), e cuja representao a seguinte (os valores contidos em cada uma das posies no relevante, neste momento); apostas
1 2 3 4 5 6 7 1 2 3 4 5 6

43 24 35 47 6 17

4 35 41 32 17 35

32 11 13 12 14 2

6 45 29 30 9 35

8 23 27 46 11 23

9 22 3 41 19 8

44 9 41 38 3 1

O array bidimensional no mais do que uma matriz; com tal, para acedermos a uma posio do array necessrio fornecer dois valores: o ndice da linha e o ndice da coluna nos quais o elemento se encontra. Por exemplo: apostas[2,4]:=15; seria a instruo correcta para o valor 15 na posio correspondente linha 2 e coluna 4, substituindo no array apostas o valor 45 por 15; 9.1.1. DECLARAO DE ARRAYS Tal como todos os outros tipos anteriormente referidos, tambm os arrays tm de ser declarados. Assim sendo, h que especificar: o seu nome, a sua dimenso (atravs dos seus limites inferior e superior ou, em sua substituio, o tipo do(s) ndice(s)), e o tipo de dados a que pertencem todos os seus elementos. A sintaxe da declarao de arrays a seguinte: identificador:ARRAY[lim_inf..limp_sup [,lim_inf..limp_sup]] of tipo_elementos; em que: lim_inf..lim_s up representa os limites inferior e superior de cada dimenso do array. Cada um deste limites podero ser do tipo char, boolean, enumerado ou subgama. de notar que os segundos parntesis, so opcionais, ou seja, representam as vrias sries de limites, usadas no caso do array possuir mais do que uma dimenso. tipo_element o tipo dos elementos que constituem o array, os podendo ser do tipo char, boolean, enumerado, subgama, array ou registo (que ser apresentado seguidamente).

Os arrays podem ser declarados na zona de declarao de variveis ou ento utilizando conjuntamente a zona de declarao de tipos e a zona de declarao de variveis. Vejamos cuidadosamente os seguintes exemplos:
type grau=array[A..D] of integer; infclass= array[15..22] of integer;

68

Manual de Curso

TURBO PASCAL
ponto= array[0..20,0..50] of char; {array bidimensional} mesesf=(julho,agosto,setembro); horas= array[julho..setembro] of integer; numgrau:grau; num_est,soma:infclass; cubos: array[1..9] of integer; grafico:ponto; nhoras:horas;

var

Existe uma grande diferena entre declarar um array exclusivamente na zona de declarao de variveis e uma declarao do mesmo array usando a zona de definio de tipos e a zona de definio de variveis; enquanto que num tipo de declarao s se define um objecto, no outro, conjuntamente com a definio do objecto tambm se define um tipo; esta ltima a mais adoptada, pois faz uma generalizao de um novo tipo de dados aceite para definir variveis em qualquer ponto do programa. de notar que os elementos de um array podem ser, por sua vez, outros arrays. Considere-se o seguinte exemplo:
type var cont_idad = array[15 .. 35] of integer; cont_aux = array[1 .. 2] of cont_idad; conta:cont_aux;

No exemplo acima transcrito, so definidos 2 arrays como tipos, sendo o primeiro (cont_idad) constitudo por nmeros inteiros; o segundo (cont_aux) definido custa do primeiro, ou seja, um array de arrays. Por outras palavras, cada posio do array cont_Aux um array cont_idad de inteiros. Na zona de declarao de variveis, define-se uma varivel de nome conta que do tipo cont_aux (aaray de arrays) e guarda valores inteiros. Para acedermos a uma posio deste array, por exemplo, posio (2, 20) na tentativa de lhe atribuir o valor 55, teremos de executar a instruo: conta[2] [20]:=55; desta forma estamos a aceder segunda posio do primeiro array (cont_aux) e vigsima posio do array cont_idad. Ser necessrio alguma cautela quando se definem os limites inferior e superior de um ndice de um array, porque, de facto, esto a definir-se os valores possveis para o ndice. Se o programa violar esta definio, ou seja, se um dos ndices sair fora dos limites definidos, gerado um erro de execuo. A grande vantagem, quando trabalhamos com arrays a possibilidade de usar expresses com ndices. Os valores obtidos atravs dessas expresses so depois utilizados nas estruturas de repetio (REPEAT, FOR, WHILE) para aceder aos elementos pretendidos.

Manual de Curso

69

TURBO PASCAL
De forma a colocar 33 elementos de um array unidimensional, definido para conter dados do tipo INTEGER, com o valor 3, basta percorrer todas as posies e igual-las a esse valor:
for i:=1 to 10 do apostas[i]:=3;

Do mesmo modo, para colocar todos os elementos da varivel apostas (array bidimensional com 10 colunas e 6 linhas) a zero, podia implementar-se o seguinte cdigo:
for i:=1 to 10 do for j:=1 to 6 do apostas[i,j]:=0;

conveniente no esquecer que os ndices (i,j) tambm so variveis e por isso tm de ser declaradas (variveis do tipo integer). 9.1.2. REPRESENTAO DE CADEIAS DE CARACTERES (STRINGS) As operaes tpicas que podem ser executadas com cadeias de caracteres so: comparao; ordenao por ordem alfabtica; concatenao de duas strings numa nica string; diviso de strings em vrias substrings; pesquisa de modelos (substrings) numa dada string. Em Pascal, as cadeias de caracteres podem ser representadas usando arrays unidimensionais. Para o fazer, define-se um array cujos elementos sejam do tipo caracter (char) e cujo nmero de elementos seja o tamanho mximo de oitenta caracteres, pode usar-se a seguinte type especificao:
var palavra = array [1..80] of char linha:palavra;

No exemplo anterior, cada elemento do array linha, representa um caracter. Suponhamos que pretendamos introduzir dentro deste array, a seguinte frase tipos estruturados composto por 18 caracteres. Tendo o array capacidade para 80 caracteres, ao usar um tipo de dados deste gnero, muito espao de memria ficar desperdiado. Assim sendo, para poupar memria na representao de cadeias de caracteres, a linguagem Pascal oferece um tipo de array especial - o packed array que guarda apenas o nmero de caracteres introduzidos. Para definir packed array, a palavra packed deve preceder a palavra array na declarao do mesmo. Por exemplo: type
char; var

palavra = packed array [1..80] of linha:palavra;

70

Manual de Curso

TURBO PASCAL
define uma cadeia de caracteres como packed array. Um packed array tem um srie de propriedades especiais: 1. A atribuio de um valor a uma varivel do tipo packed array pode ser efectuada de uma s vez e no elemento a elemento. Supondo a seguinte declarao:
var curso:packed array [1..30] of char;

poder fazer-se a seguinte atribuio: nome:=Introduo Programao; A. II. As variveis deste tipo podem ser escritas como um todo, usando os comandos WRITE e WRITELN, em vez de se escrever um caracter de cada vez. Considerando a declarao e a atribuio dadas, podemos escrever a varivel curso da seguinte forma: writeln(Curso.....: ,curso); Note-se que as variveis do tipo packed array tambm podem ser inspeccionadas elemento a elemento como num vulgar array. 9.1.3. EXERCCIOS RESOLVIDOS
{Este programa destina-se a inverter uma frase com o comprimento mximo de 50 caracteres. Ao digitar ponto final termina a leitura da frase e inicia-se o processo de inverso. Programador: Jos Carlos P. Almeida Maio/1995} PROGRAM INVERTE (INPUT,OUTPUT); USES CRT; TYPE TFRASE=ARRAY[1..50] OF CHAR; VAR INDICE,IND_INV:TFRASE; CONT:INTEGER; PROCEDURE LIMPA; BEGIN FOR CONT:=1 TO 50 DO INDICE[CONT]:=' '; END; PROCEDURE LER; BEGIN CONT:=1; WHILE CONT<=50 DO BEGIN READ(INDICE[CONT]); IF (INDICE[CONT]='.') THEN BEGIN INDICE[CONT]:=' ';

Manual de Curso

71

TURBO PASCAL
CONT:=CONT+51; END; CONT:=CONT+1; END; END; { --> obriga a sair do ciclo}

PROCEDURE CONTRARIO; BEGIN CONT:=1; WHILE CONT<=50 DO BEGIN IND_INV[CONT]:=INDICE[51-CONT]; CONT:=CONT+1; END; END; PROCEDURE ESCREVER; BEGIN WRITELN(' ============> TEXTO INVERTIDO <============ '); WRITELN; CONT:=1; WHILE (CONT<=50) AND (INDICE[CONT]<>'.') DO BEGIN WRITE (IND_INV[CONT]); CONT:=CONT+1; END; END; BEGIN {programa principal} CLRSCR; LIMPA; WRITELN; WRITELN; WRITELN (' ======> PROGRAMA DE INVERTER UM VECTOR<======== '); WRITELN; WRITELN; WRITELN('- INTRODUZA O TEXTO A INVERTER e TERMINE COM PONTO FINAL'); LER; CONTRARIO; WRITELN; WRITELN; ESCREVER; REPEAT UNTIL KEYPRESSED; END.

72

Manual de Curso

TURBO PASCAL

9.1.4. EXERCCIOS PROPOSTOS 1. Um aluno tem as seguintes cadeiras, Portugus, Informtica, Ingls e Matemtica. Recorrendo ao uso de arrays, implemente um programa que indique o aproveitamento do aluno, mediante as seguintes regras: mdia <10 --> Reprova 10<=mdia<12 --> Oral mdia <=12 --> Dispensado 2. Dada a seguinte matriz [7,3,2,8,9,5], elabore um programa que ordene a matriz, por ordem crescente.

9.1.5. PROJECTO Pretende-se um programa que ao receber um nmero, transforme-o numa matriz (dimenso de 5 por 4), em que essa matriz represente o desenho desse nmero e que cada clula seja preenchida pelo respectivo nmero. Como exemplo, se digitarmos o nmero 3, dever aparecer no cran a seguinte matriz.

No esquecer as validaes na entrada de dados e o interface (aspecto) do programa.

9.2. REGISTOS (RECORDS)


Um record (tambm designado por ficha ou registo), um conjunto de elementos que no tero de ser obrigatoriamente do mesmo tipo. Por exemplo, a informao relativa a um aluno, tal como o seu nome (cadeia de caracteres), o curso (cadeia de caracteres), o ano de nascimento (inteiro) e o seu nmero interno (inteiro) poderia ser guardada num registo. Cada um destes componentes designado por campo e tem um nome associado. de notar que os registos so semelhantes aos arrays, no sentido em que podem guardar um conjunto de elementos. No entanto, diferem deles pelo facto de os seus elementos poderem ser de tipos diferentes

Manual de Curso

73

TURBO PASCAL
(nos arrays todos os seus elementos tm de ser obrigatoriamente do mesmo tipo) e pelo processo de acesso a cada um dos seus elementos. No exemplo seguinte, representado um registo identificado por livro, composto pelos campos titulo, autor e ano de publicao (ano_pub).

livro
titulo autor ano_p ub

9.2.1. DECLARAO DE RECORDS EM PASCAL Para definir um record, h que declarar um identificador como sendo do tipo record, seguindo-se os seus campos e os tipos de dados que os compem. A sintaxe da declarao de records a seguinte: RECORD campos_do_registo; END; em que: campos_do_regi representa um ou mais campos que so sto separados por ponto e vrgula e em que cada campo composto pelo par identificador: tipo.

Assim, a declarao do registo livro, seria do seguinte modo:


type tipo_liv=record titulo:packed array[1..20] of char; autor:packed array[1..20] of char; ano_pub:1900..2000; end; var livro:tipo_liv; {string[20]} {string[20]}

Na definio sintctica de um registo, no h restries no que diz respeito ao tipo de dados de cada um dos seus campos. Isto significa que cada campo de um record pode ser, por sua vez, um outro registo. Para aceder a um campo do registo (record), preciso indicar o nome do

registo e o nome do campo, separados por um ponto (.). Fazendo uso do registo declarado no exemplo anterior, iremos passar agora ao seu preenchimento:
livro.titulo=PASCAL; livro.autor=Niklaus Wirth; livro.ano_pub=1980;

74

Manual de Curso

TURBO PASCAL
O nome simblico que referencia um elemento do record (livro.titulo, por exemplo) uma varivel e portanto, poder ser sujeita a qualquer operao vlida sobre variveis desse tipo. Apesar de um nico registo ser til, muitas aplicaes obrigam a ter conjuntos de registos. Os arrays so estruturas ideais para representar um conjunto de objectos semelhantes. Assim, muitos programas usam arrays de registo, em que cada posio do array um registo. Por exemplo, pretende-se guardar toda a informao referente a uma mini-biblioteca de 8 livros. Simbolicamente a estrutura a usar a seguinte:
livro titulo autor ano_pub bib

Em Pascal, a definio da estrutura acima referida ser:


type tipo_liv=record titulo:packed array[1..20] of {string[20]} autor:packed array[1..20] of {string[20]} ano_pub:1900..2000; end; {definio do registo do livro} var bib=array[1..8] of tipo_liv; char; char;

Por exemplo, para ler alguns dos dados referentes a um livro, colocando essa informao numa determinada posio do array (vamos supor, a posio 3) podemos fazer:
read(bib[3].titulo); read(bib[3].autor); read(bib[3].ano_pub);

9.2.2. INSTRUO WITH Na leitura de valores para o registo, no exemplo anterior, foi necessrio repetir o nome do registo para cada leitura. Isto pode torna-se bastante fastidioso ou mesmo desagradvel, sobretudo quando o nmero de campos grande. Para evitar este inconveniente, o PASCAL tem um comando especial que permite facilmente aceder a vrios campos de um dado registo: a instruo WITH. A sintaxe deste comando a seguinte:

Manual de Curso

75

TURBO PASCAL
WITH identificador_do_registo DO BEGIN instrues; END; em que: identificador_do_registo o identificador com o qual se vai trabalhar, ou, na forma mais geral, de uma srie de identificadores de registo separados por uma vrgula.

De modo a ficar mais clara a utilizao da instruo WITH, vamos novamente utilizar o exemplo anterior, escrevendo alguns dados with referentes a um livro. Deste modo, podemos fazer:
bib[3] do begin writeln(autor); writeln(ano_pub); end;

Como se pode ver a utilizao da instruo WITH, recomendada, uma vez que, no s reduz o comprimento do texto do programa, como aumenta a legibilidade do mesmo. A instruo WITH tambm bastante vantajosa nos casos em que se tm estruturas de registos compostas. Por exemplo, na estrutura de registos definida da seguinte forma:
type tdata = record dia:1..31; mes:1..12; ano:0..2999; end; tb_ident = record numero:integer; dt_nasc:tdata; end; tendr = record morada:packed array[1..25] of char; cod_post:integer; end; tcliente = record bi:tb_ident; nome:packed array[1..15] of char; endereco:tendr; end; var cliente:tcliente;

Neste caso, para ler os valores de cada campo do registo data poder fazer-se, de uma forma prtica, o seguinte:
with cliente.bi.dt_nasc do begin read(dia); read(mes); read(ano); end;

76

Manual de Curso

TURBO PASCAL
Ainda referente s declaraes anteriores e com o intuito de clarificar melhor este assunto, apresentam-se as seguintes instrues que so equivalentes:
write (cliente.endereco.cod_post); with cliente do write (endereco.cod_post); with cliente.endereco do write (cod_post);

9.2.3. REGISTO DE ESTRUTURA VARIVEL Todos os registos que tratmos at aqui foram absolutamente rgidos nas suas estruturas, de modo que, todos os registos de um mesmo tipo tenham o mesmo nmero de campos, os mesmos nomes e o mesmo tipo. No entanto, algumas vezes conveniente usar registos com uma estrutura mais flexvel. Por esta razo a linguagem Pascal permite a utilizao de registos variveis em que o nmero e o tipo dos campos pode variar em certa medida. A representao de registos com estruturas alternativas efectuada atravs da introduo na definio de tipo do registo, de um componente varivel. Isto permite definir um registo cuja composio (ou parte) possa variar ao longo do programa, dependendo do valor que atribudo a um dado campo do mesmo registo (conhecido como tag field). Esta varivel, aparece a seguir parte fixa, caso esta exista, ou seja, a declarao das componentes comuns precede a declarao das componentes variveis. Considerando um registo com o nome Pessoa, suponhamos que queremos distinguir a nacionalidade de cada pessoa (assumindo-se que nompess e data estariam j definidos prior): type
pessoa = record nome:nompess; datanasc:data; origem:(nacional,estrangeiro); end;

Se pretender-se armazenar mais informao sobre cada pessoa, por exemplo, o local de nascimento no caso dos nacionais e nacionalidade, data e local de entrada no pas, no caso de estrangeiros, ser necessrio que o registo tenha duas estruturas alternativas, estruturas variveis, ou variantes dependendo da origem da pessoa.

Manual de Curso

77

TURBO PASCAL
A forma geral de uma definio de um registo contendo parte fixa e parte variante :
type nome_registo=record campo_fixo1; . . . campo_fixon; case campo_de_seleco:identificador_de_tipo of etiqueta1:list_de_campos_variantes1; etiqueta2:list_de_campos_variantes2; . . . etiquetan:lista_de_campos_variantes n; end; end;

Cada list_de_campos_variantes expressa sob a forma de uma enumerao de campos, isto : (campo_variante1, campo_variante1, ....., campo_varianten); O campo_de_seleco deve estar associado a um tipo ordenado que tenha sido definido anteriormente. De notar que cada valor possvel do campo de seleco, deste tipo ordenado, dever aparecer uma e uma s vez como etiqueta na estrutura CASE. Em relao ao tipo Pessoa, pode ser agora definido de uma forma mais completa, incluindo a declarao de uma varivel deste tipo de registo:
type tip_orig = (nacional,estrangeira); nome:nompess; datanasc:data; case origem:tip_orig of nacional:(localnas:nomelocal); estrangeiro:(paisorig:nomelocal); end; end;

De notar que no exemplo anterior no existe a possibilidade de se aceder a variantes incorrectas, j que a instruo CASE faz a seleco dos campos a referenciar.

78

Manual de Curso

TURBO PASCAL
tambm possvel definir uma variante para a qual no se pretenda guardar qualquer informao, ou seja uma variante com uma lista de campos vazia. Por exemplo, se no se quiser guardar qualquer informao sobre as pessoas de nacionalidade estrangeira, o registo poderia ser definido da seguinte forma:
type tip_orig = (nacional,estrangeira); pessoa = record nome:nompess; datanasc:data; case origem:tip_orig of nacional:(localnas:nomelocal); estrangeiro:(); end; end; var novapess:pessoa:

Como j referimos, um registo pode no ter parte fixa, o que acontecer sempre que as estruturas alternativas no tenham campos em comum. Se quisermos descrever, por exemplo, uma carta de poker, incluindo os jokers pode definir-se:
type naipe=(copas, ouros, paus, espadas); valor=(as, rei, dama, valete, dez, nove, oito, sete, sena, quina, quadra, terno, duque); joker=(jokerpreto,jokervermelho); tipcarta=(normal,especial); cartapk=record case tipo: tipcarta of normal:(np:naipe; v1:valor); especial:(jk:joker); end; end;

Tambm neste caso existe um campo de seleco chamado tipo que contm a indicao do tipo de carta em questo e ao qual possvel atribuir valores do tipo declarado. Uma vez que os campos com estrutura variantes so acedidos da mesma forma que um campo normal, no necessrio ter um campo especfico para guardar a variante a escolher. Neste caso, pode omitir-se o identificador no campo_de_seleco, indicando-se apenas o tipo, de modo a determinar as variantes possveis. Na definio do registo seguinte, que se destina a descrever o contedo das pginas de um livro, poder-se- verificar este facto.

Manual de Curso

79

TURBO PASCAL
Na primeira pgina apenas existe informao referente catalogao, enquanto que nas seguintes se guarda o texto propriamente dito.
type tipopag=(primeira, seguintes); pagina=record case tipopag of primeira: (titulo:nomlivro;autor:nomautor;isbn:codigo); seguintes:(texto:array[1..66] of linha); end; end;

Uma varivel do tipo pagina tem, ou trs componentes, ttulo, autor e cdigo de isbn ou apenas uma componente, texto. Nestes casos, em que, tratando-se de registos com variantes em que o campo_de_seleco no utilizado, os cuidados a ter pelo programador devero ser maiores. H ainda alguns cuidados a referir, quando se utilizam registos com estruturas variveis. Um deles prende-se com o ciclo de vida de cada uma das variantes, descrito da seguinte forma: sempre que feita uma referncia a um campo de uma das estruturas possveis, as componentes da anterior deixam de existir, pelo que os campos dessa nova variante passam a estar indefinidos. Alm disso, para evitar algumas situaes inconvenientes na manipulao de registos com estruturas variveis, dever-se- ainda ter em ateno as seguintes restries: No se pode mudar de variante quando um campo de uma variante do mesmo registo est a ser usado como um parmetro por referncia, ou como uma varivel de registo numa instruo WITH. Um campo de seleco no pode ser passado como parmetro por referncia para um procedimento ou funo. 9.2.4. REGISTOS COMPACTADOS (PACKED RECORDS) Como j foi referido anteriormente, todos os tipos estruturados podem ser compactados, atravs da utilizao do prefixo packed na sua definio. As vantagens e as desvantagens so as mesmas das referidas para os packed arrays. 9.2.5. EXERCCIOS PROPOSTOS 1. Elabore um programa que permita guardar a informao de um aluno, num registo com a seguinte estrutura: nome - comprimento mximo 30 caracteres morada - comprimento mximo 50 caracteres curso - comprimento mximo 15 caracteres idade - entre 10 e os 99 anos 2. Com base no exerccio anterior, elabore um programa que permita introduzir e alterar alunos (num total de 10). Como faria para anular um aluno.

80

Manual de Curso

TURBO PASCAL

9.3. FICHEIROS (FILES)


Muitos dos programas do mundo real tm de ter mltiplas fontes de entrada de dados e mltiplos destinos de sada de dados. Alguns desses dados podero ter de ser guardados para futuramente serem usados pelo mesmo programa ou por outros programas. A estrutura tpica para guardar informao o chamado ficheiro (file). As variveis do tipo ficheiro (file) so diferentes das variveis que considermos at agora, no sentido em que, podem existir independentemente de qualquer programa; um ficheiro, assim como os dados que ele contm, podem existir antes da execuo de um programa comear e/ou podem permanecer depois de ter terminado a execuo do mesmo. Os ficheiros partilham com os arrays a caracterstica dos seus elementos terem de ser obrigatoriamente do mesmo tipo; no entanto, diferem no mtodo de aceder aos seus elementos - por posio, no caso dos arrays, e sequencialmente, no caso dos ficheiros. Sendo assim, ir ser introduzido no conjunto de tipos de dados que conhecemos mais um elemento: tipo de dados file. 9.3.1. DECLARAO DE FICHEIROS Os ficheiros tm a seguinte sintaxe de declarao: FILE OF tipo_de_dados: Os elementos (ou componentes) de um ficheiro podem pertencer a qualquer tipo de dados (estruturado ou no), com excepo de dados do prprio tipo file. Exemplificando:

type cores=file of (vermelho, verde, branco, preto); texto =file of char; pessoas=file of record nome: array[1..20]of char; idade:0..110; sexo:(masculino,feminino); end; {do record pessoas}

As respectivas variveis, em relao definio de dados apresentada acima, podem ser:


var fcores:cores; ftext:texto; fpessoas:pessoas;

A varivel cores indica o tipo de ficheiro com que estamos a trabalhar, e ainda nos define um identificador para, internamente ao programa, identificarmos o ficheiro.

Manual de Curso

81

TURBO PASCAL
Um ficheiro reside normalmente num dispositivo de memria secundria. Em cada momento, apenas acessvel ao programa um dos elementos do ficheiro. Sempre que se declara um ficheiro num bloco, automaticamente criada uma varivel auxiliar de ficheiro (file buffer), do mesmo tipo das componentes do ficheiro, permitindo que o(s) valor(es) sejam transferidos entre o ficheiro e o programa que o gere. De facto, a varivel auxiliar de ficheiro um tipo especial de varivel que automaticamente criada sempre que o ficheiro correspondente definido. Sempre que se l um elemento do ficheiro, esta varivel ir conter os dados desse mesmo elemento. Para referenciarmos o contedo dessa varivel, ou seja, um dos elementos do ficheiro, necessrio indicarmos o nome da varivel (do tipo de dados contido no ficheiro) seguido do caracter (^). Quer isto dizer, e de uma maneira mais prtica, que o caracter(^) simboliza um apontador para o ficheiro. 9.3.2. OPERAES SOBRE FICHEIROS Existem procedimentos e funes que permitem controlar o acesso a ficheiros. Supondo que declaramos um ficheiro estruturado com o objectivo de armazenar a informao referente a alunos. Para o ficheiro ser estruturado deve ser constitudo por registos, em que cada registo representa um aluno, e cada um deve ser constitudo por um ou mais campos, os campos contem os dados pessoais dos alunos, por exemplo, o nome, o curso e nota. Assim vamos ter que construir um ficheiro com a seguinte estrutura: A declarao do ficheiro seria:
type t_aluno=record nome:string[40]; curso:string[40]; nota:0..20; end; {registo of t_aluno;

Ficheiro alunos

registos

campo

aluno:t_aluno; auxiliar} alunos: file {ficheiro}

var

EOF(alunos)

RESET(alunos)

while not eof(alunos) do begin instrues; end;

Funo End Of File retorna um valor lgico (TRUE ou FALSE), ou seja, sempre que o apontador do ficheiro (alunos) se encontra no fim do ficheiro, ento a funo EOF retorna o valor TRUE, caso contrrio retorna FALSE. A sua utilizao exemplificada em seguida:

Procedimento que prepara o ficheiro para leitura. Coloca a

82

Manual de Curso

TURBO PASCAL
funo EOF(alunos) a retornar o valor FALSE se o ficheiro no se encontrar vazio. Se o ficheiro estiver vazio ento a funo EOF(alunos)=TRUE e a varivel alunos ter um valor indefinido. Se o ficheiro contiver um ou mais elementos, o primeiro desses elementos ser lido e atribudo ao registo auxiliar. Os prximos elementos do ficheiro podem ser obtidos atravs do procedimento GET (que apresentado a seguir). O RESET do ficheiro dever ser sempre efectuado antes da leitura de um ficheiro. REWRITE(aluno Prepara o ficheiro para escrita, apagando o seu contedo s) anterior. A funo EOF(alunos) retorna o valor TRUE e a escrita de elementos no ficheiro efectuada a partir do incio do mesmo. Este procedimento dever ser sempre usado antes da escrita para um ficheiro. GET(alunos) Coloca o contedo do prximo elemento do ficheiro na varivel alunos. Quando no existe mais nenhum elemento, deixa a funo EOF(alunos) a retornar TRUE e o resultado da operao GET fica indefinido, gerando um erro. Quando se pretende trabalhar com o contedo da varivel alunos, ter de se lhe acrescentar o caracter (^). Supondo que alunos um registo com a seguinte declarao:
type t_aluno=record nome:string[40]; curso:string[40]; nota:0..20; end; alunos: file of t_morada; {ficheiro}

var

apresenta-se em seguida um exemplo de utilizao, considerando que previamente j foi efectuado o reset ao ficheiro:
if alunos^.nota<10 then numero:numero+1; get(alunos);

PUT(alunos)

Escreve o contedo da varivel alunos depois do ltimo elemento do ficheiro deixando EOF(alunos) igual a TRUE.

Os ficheiros criados fora do mbito de um programa e que so manipulados por ele, ou os ficheiros criados por um programa e passados para o exterior, so chamados ficheiros externos e tm de ser declarados no cabealho do programa. Por exemplo: program fichext1(fich1, fich2, input, output); program fichext(leitura, escrita); No ltimo caso no existe comunicao com os ficheiros de entrada e sada de dados considerados por defeito. Notas: Os ficheiros pr-definidos, INPUT e OUTPUT tambm tm de ser declarados no caso de se pretender utiliz-los.

Manual de Curso

83

TURBO PASCAL
Os ficheiros que no comunicam com o exterior so chamados ficheiros internos e no so declarados no cabealho do programa. Exemplo: Considere-se um ficheiro externo cujo nome telefone que contm os nomes de pessoas de uma instituio, o nmero da seco onde trabalham e os respectivos nmeros de telefone. Pretende-se construir um ficheiro com o nome lista1 contendo a informao respeitante seco n1. O programa testfic1 realiza as operaes descritas, ilustrando o uso de ficheiros externos.
program testfic1 (telefone, lista1, input, output); type registos=record nome: array [1..20] of char; {string[20]} seccao:1..10; telef:integer; end; var telefone:file of registos; {lista geral} lista1:file of registos; {lista da seco n1} numero:integer; begin numero:=0; reset(telefone); {preparar o ficheio telefones para leitura} rewrite(lista1); {preparar o ficheiro lista1 para escrita} while not eof(telefone) do begin if telefone^.seccao=1 then begin lista1^:=telefone^; put(lista1); numero:=numero+1; end; get(telefone); {leitura da ficha seguinte} end; write(Foi criado um ficheiro com: ,numero:5, elementos.); writeln; end.

Embora se possam usar as operaes normais de leitura e escrita num ficheiro, existem procedimentos especiais para manusear dados - READ, READLN, WRITE, WRITELN, estando o seu uso detalhadamente explicado anteriormente. O exemplo anterior, ser apresentado em seguida, com as alteraes referentes s operaes de entrada e sada de dados aqui referidas.

84

Manual de Curso

TURBO PASCAL
program testfic2 (telefone, lista1, input, output); type registos=record nome: array [1..20] of char; {string[20]} seccao:1..10; telef:integer; end; var aux_reg:registos; telefone:file of registos; {lista geral} lista1:file of registos; {lista da seco n1} numero:integer; begin numero:=0; reset(telefone); {preparar o ficheio telefones para leitura} rewrite(lista1); {preparar o ficheiro lista1 para escrita} while not eof(telefone) do begin read(telefone,aux_reg); {leitura da ficha seguinte} if aux_reg.seccao=1 then begin write(lista1,aux_reg); {escrita no ficheiro lista1, do registo aux_reg} numero:=numero+1; end; end; write(Foi criado um ficheiro com: ,numero:5, elementos.); writeln; end.

9.3.3. FICHEIROS DE TEXTO A linguagem Pascal possui um tipo especial de ficheiros, os ficheiros de texto, que so ficheiros de caracteres. O Pascal tem um tipo pr-definido, TEXT, para definir um ficheiro de texto, porque estes so os mais usados. Assim, so equivalentes as seguintes definies: meutexto=file of char; meutexto=text; Um ficheiro tipo TEXT, composto por vrias linhas separadas por um caracter especial (carriage_return e line feed), normalmente escrito com <RET>. Serve o exemplo seguinte para mostrar detalhadamente qual o conjunto de instrues que so executadas, usando os dois modo de entrada e sada de dados.

Manual de Curso

85

TURBO PASCAL
Exemplo: Considere-se um ficheiro com o nome texto que est escrito com letras maisculas e minsculas e que pretende escrever apenas com maisculas num ficheiro com o nome sada.

program maiuscul (texto, input, saida, output); var texto:text; saida:text; car:char; conv:integer; letras:set of char; {conjunto de letras} begin conv:=ord(a) - ord(A); {valor de diferena entre as maisculas e minsculas} letras:=[a..z]; reset(texto); rewrite(saida); while not eof(texto) do begin while not eoln(texto) do {EOLN -> funo que retorna TRUE se o apontador est begin apontar para o separador de linhas (End of Line), ou read(texto,car); FALSE em caso contrrio} if car in letras then {se o caracter pertence ao conjunto letras -- [a..z]} car:=chr(ord(car)-conv); write(saida,car); end; readln(texto); {muda para a linha seguinte} writeln(saida); {pr um separador de linhas no ficheiro saida} end; writeln (Converso Terminada !!); end.

9.3.4. EXTENSES AO TURBO PASCAL de referir que o modo de usar ficheiros tem algumas diferenas dependendo do compilador usado. Tomando o Turbo Pascal 6.0 como um exemplo demonstrativo das diferenas em relao ao Pascal Padro, podemos dizer que uma das mais importantes se prende com o facto de ser necessrio associar explicitamente o nome lgico do ficheiro com o nome fsico do mesmo; para esse efeito utiliza-se o comando ASSIGN (considerando fpessoas como o nome do ficheiro usado no programa e dados.dat como o nome do ficheiro fsico): Assign (fpessoas,dados.dat); Abre o ficheiro com o nome fsico dados.dat e com o nome lgico fpessoas, ou seja, relaciona o dispositivo fsico (dados.dat) com o dispositivo conhecido internamente ao programa (fpessoas).

Por outro lado (e fazendo uso do mesmo ficheiro), antes de terminar o programa, deve ser chamado o procedimento CLOSE:

86

Manual de Curso

TURBO PASCAL
Close(fpessoas Fecha o ficheiro reconhecido internamente com o nome ) lgico fpessoas. Voltam a ser representados aqui, os programas testfic1 e testfic2, mas desta feita, com as alteraes relativas s instrues ASSIGN e CLOSE, respectivamente testfic3 e testfic4:
program testfic3 (telefone, lista1, input, ouput); type registos=record nome:array [1..20] of char; seccao:1..10; telef:integer; end; {do record registo} var telefone:file of registos; {lista geral} lista1:file of registos; {lista da seco n1} numero:integer; begin numero:=0; assign(telefone,telefone.dat); assign(lista1,geral.dat); reset(telefone); {preparar o ficheiro telefones para leitura} rewrite(lista1); {preparar o ficheiro lista1 para escrita} while not eof(telefone) do begin if telefone^.seccao=1 then begin lista1^:=telefone^; put(lista1); numero:=numero+1; end; get(telefone); {leitura da ficha seguinte} end; write(Foi criado um ficheiro com: ,numero:5, elementos); writeln; close(telefone); close(lista1); end;

program testfic4 (telefone, lista1, input, ouput); type registos=record nome:array [1..20] of char; seccao:1..10; telef:integer; end; {do record registo} var aux_reg:registos; telefone:file of registos; {lista geral} lista1:file of registos; {lista da seco n1} numero:integer; begin numero:=0; assign(telefone,telefone.dat); assign(lista1,geral.dat); reset(telefone); {preparar o ficheiro telefones para leitura}

Manual de Curso

87

TURBO PASCAL
rewrite(lista1); {preparar o ficheiro lista1 para escrita} while not eof(telefone) do begin read(telefone,aux_reg); {leitura da ficha seguinte} if aux_reg=1 then begin write(lista1,aux_reg); numero:=numero+1; end; end; write(Foi criado um ficheiro com: ,numero:5, elementos); writeln; close(telefone); close(lista1); end;

9.3.5. EXERCCIO PROPOSTO 1. Elabore um programa que crie um ficheiro alunos.dat e que permita ao utilizador inserir novos e listar registos (nome e data de nascimento). O aluno caracterizado por:
nome - comprimento mximo de 30 caracteres morada rua - comprimento mximo de 30 caracteres numero - pode variar entre 0 e 999 cod_postal - pode varia entre 0 e 9999 nasci dia - varia entre 1 e 31 mes - varia entre 1 e 12 ano - varia entre 0 e 99

9.3.6. PROJECTO Elabore um programa que permita criar um ficheiro (com o nome banco.dat), inserir e consultar movimentos. O cliente caracterizado por: CDIGO -> Um valor compreendido entre 0 e 9999. NOME -> Comprimento mximo de 30 caracteres. MOV -> 0 - Dbito ou 1 - crdito. VALOR -> Um valor do tipo real com 2 casas decimais. Na consulta de movimentos pedido o cdigo do cliente, sendo depois apresentados os movimentos efectuados por esse cliente. No esquecer : Validaes. Apresentao do programa.

88

Manual de Curso

Você também pode gostar