Você está na página 1de 78

Linguagem Pascal

Introduo a Linguagem Pascal

Autor:
Silvestre Santos

Linguagem Pascal

Introduo a linguagem Pascal

Linguagem Pascal

Captulo 1 - Conceitos bsicos de programao 1.1 O programa de computador


Conforme j vimos, um computador, para realizar uma tarefa especfica, como, por exemplo, somar 10 nmeros em seqncia, requer que seja instrudo, passo a passo para efetivamente realizar a tarefa. Necessita, pois, que seja projetado com a capacidade de realizar (interpretar e executar) um determinado conjunto de operaes, cada uma sendo constituda de uma instruo especfica (instruo de mquina). O conjunto de instrues ou comandos organizados em uma certa seqncia, para obter o resultado da soma dos 10 nmeros, compe o que denominamos programa de computador.

1.2 Linguagens de programao


Uma linguagem de programao uma linguagem criada para instruir um computador a realizar suas tarefas. Um programa completo, escrito em uma linguagem de programao, freqentemente denominado de cdigo. Uma linguagem de programao um conjunto de ferramentas, regras de sintaxe e smbolos ou cdigos que nos permitem escrever programas de computador, destinados a instruir o computador para a realizao de suas tarefas.

1.2.1 Linguagem de mquina


O tipo mais primitivo de linguagem de programao a linguagem que o computador entende diretamente, isto , as instrues que podem ser diretamente executadas pelo hadware, isto , pela CPU. a linguagem de mquina, que foi utilizada pela primeira gerao de programadores. A nica verdadeira linguagem de programao a linguagem de mquina, mas, para a maioria das pessoas, a linguagem de mquina ininteligvel. Um programa em linguagem de mquina uma longa seqncia de nmeros, alguns dos quais representam instrues e outros, os dados a serem manipulados pelas instrues. A figura abaixo mostra um exemplo de um trecho de um programa em linguagem de mquina, na sua forma binria e hexadecimal. Programa em linguagem binria 0010 0100 1001 0001 0100 0100 1001 1111 0100 0100 1001 0011 0001 0100 1001 0010 1000 0100 1001 1000 Programa em haxadecimal 2491 449F 4493 1492 8498

Para escrever um programa em linguagem de mquina, o programador deve conhecer todas as instrues disponveis para aquela mquina e seus respectivos cdigos de operao e formatos, assim como os registradores da CPU disponveis e os endereos das clulas de memria onde sero armazenadas as instrues e os dados. Um programa real em linguagem de mquina, pode conter milhares de instrues, o que uma tarefa extremamente tediosa e difcil, pelos detalhes que precisam ser observados pelo programador. Em um programa escrito em linguagem de mquina, cada instruo escrita pelo programador ser individualmente executada, isto , a cada instruo do programa corresponder uma ao do computador. A relao portanto 1 para 1 - uma instruo do programa corresponde a uma operao do computador. Cada famlia de computadores possui sua prpria linguagem de mquina. Um programa em linguagem de mquina dependente do computador ou seja, tendo sido escrito para um determinado computador, somente poder ser executado em computadores da mesma famlia, que lhe sejam 100% compatveis.

Linguagem Pascal

1.2.2 Linguagem Assembly


Para os cientistas que desenvolveram o primeiro programa para traduzir instrues em cdigo de mquina, qualquer linguagem mais fcil de compreender do que a linguagem de mquina teria sido considerada uma linguagem de alto nvel. Para tentar minimizar esta ineficincia (dificuldade de entendimento do significado dos nmeros, todos semelhantes), foi desenvolvida, ainda para a primeira gerao de computadores, uma linguagem que representasse as instrues por smbolos e no por nmeros. A linguagem assenbly est mais prxima da linguagem humana, mas tambm no apresenta legibilidade nem portabilidade. Esta linguagem simblica foi denominada Linguagem de Montagem (Assembly Language). Veja abaixo um trecho de um programa em linguagem assembly. DOSSEG .MODEL SMALL EXTRN _IntDivide:PROC .CODE PUBLIC _Average ... Segundo os padres dos dias de hoje, a linguagem assembly uma linguagem de nvel muito baixo, porque seus comandos correspondem, um a um, ao conjunto de instrues de uma CPU. Na verdade no existe apenas uma linguagem assembly. Cada tipo de CPU que tem um conjunto de instrues exclusivo tem sua prpria linguagem assembly. Para usar-se linguagem de montagem em um computador, necessrio que haja um meio de converter os smbolos alfabticos utilizados no programa em cdigo de mquina, de modo a poder ser compreendido pela CPU. O processo de converso (tambm denominado traduo) chamado de montagem e realizado por um programa chamado Montador (Assembler). O montador l cada instruo em linguagem de montagem e cria uma instruo equivalente em linguagem de mquina. A linguagem assembly continua, apesar de ser de uso tedioso e complexo, a ser importante, porque d aos programadores total controle sobre a CPU do computador. Alm disso produz-se um cdigo compacto, rpido e eficiente. Vantagens:

Os programas escritos apresentam grande velocidade de execuo; Os programas gerados so mais compactos, portanto ocupam menos espao em memria; programador tem sua disposio todos os recursos da mquina, sem limitaes da linguagem.

Desvantagens:

Os programadores devem ter altssimo nvel tcnico; Os programas levam muito tempo para serem desenvolvidos e apresentam grande dificuldade para alteraes futuras; Os programas so muito especficos para cada microprocessador (no so portveis).

1.2.3 Linguagem de alto nvel


A linguagem de alto nvel uma linguagem de fcil aprendizado, apresenta uma melhor legibilidade, alm de ser independente da mquina, isto , apresenta portabilidade. Da mesma forma que os programas com instrues de mquina, os programas feitos em uma linguagem de alto nvel, tambm requerem uma converso para instrues de mquinas. Este processo denominado compilao. Normalmente, a converso de um simples comando Cobol ou C, redunda em dezenas de instrues de mquina, diferentemente de um programa em linguagem de montagem, no qual cada instruo implica uma nica instruo de mquina. Veja abaixo um trecho de um programa em linguagem C (linguagem de alto nvel).

Linguagem Pascal

Detail_procedure() { int file_status, current_line, id_num; char *name; float current_sales, ytd_sales, total_sales; ... Vantagens:

programador no se preocupa com aspectos muito tcnicos, permitindo que ele se preocupe com o problema a ser resolvido; Permitem rpido desenvolvimento de novos sistemas; Permitem que os programadores aprendam mais rapidamente, programem com mais eficincia e faam alteraes mais facilmente em programas anteriormente escritos; Maior portabilidade, ou seja, facilidade de transferncia de programas para mquinas diferentes.

Desvantagens:

Os programas (cdigo) ocupam mais espao de memria; A estrutura da linguagem tira parte da liberdade do programador e pode dificultar a implementao de instrues mais tcnicas, aproveitando menos os recursos da mquina. A velocidade de execuo dos programas tende a ser mais lenta.

Foram desenvolvidas diversas linguagens de programao, buscando afastar-se do modelo centrado no computador. Essas linguagens foram estruturadas buscando refletir melhor os processos humanos de soluo de problemas. Essas linguagens orientadas a problema so tambm chamadas linguagens de alto nvel, por serem afastadas do nvel de mquina. As primeiras linguagens foram FORTRAN (1957), usada basicamente para manipulao de frmulas; ALGOL (1958), para manipulao de algoritmos; COBOL (1959), para processamento comercial e ainda hoje bastante usada, especialmente em computadores de grande porte (mainframes) em bancos. Nas dcadas de 60 e 70, podemos citar Pascal, a primeira linguagem de alto nvel estruturada; BASIC, linguagem criada para facilitar a programao por no-profissionais; e ADA, linguagem para processamento em tempo real criada sob encomenda do DoD (Department of Defense norte-americano) e ainda hoje a nica linguagem aceita para programas escritos sob encomenda do DoD. Na dcada de 80, surgiu o C e depois o C++ (com suporte a objetos), que esto entre as linguagens mais utilizadas hoje. Cada nova linguagem criada visa atingir nveis de abstrao mais altos, isto , afastam cada vez mais o programador do nvel de mquina. Se por um lado essas novas linguagens facilitam muito o trabalho do programadores (e reduzem sua necessidade de conhecer o hardware da mquina), elas cobram um alto preo em termos de desempenho (isto , so cada vez mais lentas, ao consumir cada vez mais ciclos de mquina e espao em memria). Esse aumento de exigncia ao poder de processamento dos computadores compensado (e desta forma se faz menos notado) pelo aumento acelerado do poder de processamento dos novos chips (exemplificado pela chamada Lei de Moore, que afirma que o poder de processamento dos chips dobra a cada 18 meses) e pelos avanos na arquitetura dos computadores. Dentre as importantes tendncias atuais, citamos as linguagens de manipulao de bancos de dados (como dBase, Clipper, FoxPro, Paradox, Access, etc) e as linguagens visuais, como o Visual Basic, Visual C e Delphi.

Linguagem Pascal

1.3 O processo de traduo


Um programa escrito por um programador (chamado cdigo fonte) em uma linguagem de alto nvel um conjunto de instrues que clara para programadores, mas no para computadores. Ou seja, os computadores entendem nica e exclusivamente suas linguagens nativas, as linguagens de mquina. Programas em linguagem de alto nvel, a exemplo dos programas escritos em linguagem de Montagem, tambm precisam ser traduzidos para linguagem de mquina para poderem ser submetidos ao computador e processados. O processo de traduo do programa escrito em uma linguagem simblica pelo programador, chamado cdigo fonte (source code) para a linguagem de mquina do computador chamada cdigo objeto (object code), chamado compilao e realizado por um programa chamado Compilador (Compiler). Vimos que programas de computador no so escritos na linguagem que o computador entende (linguagem de mquina), mas sim em outras formas simblicas de representar as instrues que o programador deseja que sejam realizadas. No entanto, verificamos que as mquinas continuam entendendo somente em binrio e, por isso, sempre h a necessidade da converso ou traduo de um programa em linguagem simblica para outro, equivalente em linguagem numrica binria.

1.3.1 Montagem
o tipo de traduo mais rpido e simples que existe e realizada por um programa denominado montador (assembler). Como o nome j explica, a montagem realizada para traduzir um programa em linguagem de montagem para seu equivalente em linguagem binria, executvel. Cada ordem do programador convertida diretamente em uma nica ordem de mquina. Neste processo o programa escrito em linguagem de montagem, chamado de cdigo fonte, examinado, instruo por instruo, e, em seguida, convertido (traduzido) para um outro programa em linguagem binria de mquina, denominado cdigo objeto.

Cdigo Fonte

Programa escrito pelo programad

Montage m Programa resultante, em linguagem

Cdigo Objeto

Linguagem Pascal

1.3.2 Compilao
Quando se deseja converter para linguagem de mquina um programa escrito em linguagem de mais alto nvel que o da linguagem de montagem, ento o mtodo utilizado se chama compilao. Nas linguagens de alto nvel, todo programa escrito em uma determinada linguagem de programao (chamado de cdigo fonte ou programa fonte) convertido em sua verso em linguagem de mquina (cdigo objeto ou programa objeto), sendo esta traduo feita antes de qualquer tentativa de execuo. No processo de montagem, h uma relao de 1:1, ou seja, cada instruo do cdigo fonte resulta em uma instruo de mquina, enquanto na compilao a relao mltipla, cada instruo do cdigo fonte gerando vrias instrues de mquina.

Cdigo Fonte Open file_entrada Read A,B,C While not eof (file_entrada) do Programa escrito pelo programad or em linguagem

Programa compilad or

Compila o Cdigo Objeto 1011 0011 0000 0011 1010 0000 0000 0100

Programa resultante, em linguagem

1.3.2.1 Bibliotecas
O desenvolvimento de um programa certamente utilizar diversas operaes que so comuns a muitos outros programas. Por exemplo, a execuo de uma instruo de entrada e sada, a classificao dos dados de um arquivo, o clculo de funes matemticas, etc. Uma linguagem de alto nvel geralmente incorpora diversas rotinas prontas (que fazem parte da linguagem) e que compem bibliotecas (librarys) de funes prprogramadas que podero ser utilizadas pelo programador, poupando tempo, aumentando a eficincia e evitando erros. Dessa forma, um programa em alto nvel possivelmente conter diversas chamadas de biblioteca (library calls). Essas funes no devem ser confundidas com as instrues da linguagem - na realidade, so pequenos programas externos que so chamados atravs de instrues especiais de chamada de biblioteca. Para serem executadas, essas rotinas precisam ser incorporadas ao cdigo do programador, isto , a chamada de biblioteca precisa ser substituda pelo cdigo propriamente dito, incluindo os parmetros necessrios.

1.3.2.2 Ligao
Assim, o cdigo objeto preparado pelo compilador em geral no imediatamente executvel, pois ainda existe cdigo (as rotinas de biblioteca) a ser incorporado ao programa. A cada chamada de biblioteca encontrada no cdigo fonte, o compilador precisar incluir uma chamada para a rotina e o endereo dos dados que devam ser passados para a rotina. A tarefa de examinar o cdigo objeto, procurar as referncias a rotinas de biblioteca (que constituem referncias externas no resolvidas), buscar a rotina da biblioteca, substituir a chamada pelo cdigo ("resolver as
. 7

Linguagem Pascal

referncias externas") e obter os parmetros para inclu-los no cdigo objeto executada por um programa chamado Ligador (LinkEditor). O resultado da execuo do Ligador o cdigo final pronto para ser executado pelo computador, chamado mdulo de carga ou cdigo executvel. Uma biblioteca uma coleo de cdigos objeto, um para cada rotina especfica, e indexada pelo nome da rotina. Quando um programa de aplicao deseja usar uma dessas rotinas, ele insere uma chamada de biblioteca no seu cdigo (library call).

Cdigo Fonte

Programa compilad or

Programa escrito pelo programad or em linguagem

Compila o Cdigo Objeto Programa Programa resultante, resultante, em em linguagem linguagem


Biblioteca

Ligao

Ligador
Biblioteca B Biblioteca C

Cdigo Executvel
O mdulo de carga, aps testado e depurado (isto , depois de resolvidos todos os erros, tambm chamados "bugs") armazenado em memria de massa para ser executado quando necessrio. O processo de compilao e ligao executado apenas pelo programador na fase de desenvolvimento e no mais precisar ser executado pelo usurio, quando da execuo do programa.

1.3.3 Interpretao
Com o processo de execuo de um programa em fases distintas (compilao / ligao / execuo) apresentado, um programa para ser executado precisa primeiro ter sido convertido para cdigo objeto pelo compilador e depois ter passado pelo ligador. Esse processo o mais largamente utilizado, porm no o nico. O mtodo alternativo chama-se de interpretao e, a partir do programa fonte, realiza as trs fases (compilao, ligao e execuo), comando por comando, em tempo de execuo. No existem fases distintas nem se produzem cdigos intermedirios. Todo o processo de converso efetuado em tempo de execuo e imediatamente executado. Ou seja, cada comando lido, verificado, convertido em cdigo executvel e imediatamente executado, antes que o comando seguinte seja sequer lido. Linguagens como C, Pascal, COBOL, etc, so linguagens tipicamente compiladas, enquanto o BASIC foi desenvolvido como linguagem interpretada (hoje tambm existem linguagens BASIC compiladas e o programador pode optar). As linguagens de programao tipicamente de usurio, tais como das planilhas Excel, o Word Basic (linguagem de construo de Macros do Word), o Access, etc, so todas linguagens interpretadas.

1.3.4 Compilao e Interpretao - comparao


Sempre que houver duas opes, haver vantagens e desvantagens para cada uma delas (pois se assim no fosse, a que apresentasse sempre desvantagem seria abandonada). Vamos comparar os mtodos:

Linguagem Pascal

1.3.4.1 Tempo de execuo


No mtodo de interpretao, cada vez que o programa for executado, haver compilao, ligao e execuo de cada um dos comandos. No mtodo de Compilao, o tempo de execuo do programa reduzido, porque todos os passos preliminares (compilao e ligao) foram previamente cumpridos.

1.3.4.2 Consumo de memria


No mtodo de interpretao, o interpretador um programa geralmente grande e que precisa permanecer na memria durante todo o tempo que durar a execuo do programa, pois um programa necessita do interpretador para ter traduzidos cada um dos seus comandos, um a um, at o trmino de sua execuo (o interpretador somente descarregado depois do trmino da execuo do programa). No mtodo de compilao, o compilador carregado e fica na memria apenas durante o tempo de compilao, depois descarregado; o ligador carregado e fica na memria apenas durante o tempo de ligao, depois descarregado. Essas so funes realizadas pelo programador e executadas apenas durante o desenvolvimento do programa. Quando o usurio for executar o programa, apenas o mdulo de carga (cdigo executvel) carregado e fica na memria durante a execuo. Desta forma, vemos que o mtodo de interpretao acarreta um consumo de memria muito mais elevado durante a execuo do programa.

1.3.4.3 Repetio de interpretao


No mtodo de compilao, um programa compilado e ligado apenas uma vez, e na hora da execuo carregado apenas o mdulo de carga, que diretamente executvel. No mtodo de interpretao, cada programa ter que ser interpretado toda vez que for ser executado. Outro aspecto que, em programas contendo loops, no mtodo de interpretao as partes de cdigo pertencentes ao loop sero vrias vezes repetidas e tero que ser interpretadas tantas vezes quantas o loop tiver que ser percorrido. No mtodo de compilao, a traduo do cdigo do loop se faz uma nica vez, em tempo de compilao e ligao. Estas caractersticas levam a um maior consumo de tempo no mtodo de interpretao, que portanto mais lento.

1.3.4.4 Desenvolvimento de programas e depurao de erros


No mtodo de compilao, a identificao de erros durante a fase de execuo fica sempre difcil, pois no h mais relao entre comandos do cdigo fonte e instrues do executvel. No mtodo de interpretao, cada comando interpretado e executado individualmente, a relao entre cdigo fonte e executvel mais direta e o efeito da execuo (certa ou errada) direta e imediatamente sentido. Quando a execuo de um comando acarreta erro, quase sempre o erro pode ser encontrado no comando que acabou de ser executado. Assim, o interpretador pode informar o erro, indicando o comando ou varivel causador do problema. Essa caracterstica, que a rigor a maior vantagem do mtodo de interpretao sob o ponto de vista do usurio, faz com que esse mtodo seja escolhido sempre que se pretende adotar uma linguagem que v ser usada por no-profissionais ou para a programao mais expedita. Por exemplo, o mtodo de interpretao usado pela maioria dos Basic (uma linguagem projetada para ser usada por iniciantes), e por todas as linguagens tpicas de usurio como dBase, Access, Excel, etc.

Linguagem Pascal

1.3.5 Fluxograma Compilao x Interpretao


A figura abaixo ilustra o fluxograma do processo de desenvolvimento e depurao de programas, utilizando os mtodos de compilao e interpretao.

10

Linguagem Pascal

Captulo 2 Fundamentos de Pascal 2.1 Introduo a linguagem Pascal


A programao deve ser entendida como uma arte ou tcnica de se construir algoritmos, sendo que estes so mtodos ou receitas para se resolver problemas. O Pascal uma linguagem de programao de alto nvel e de fins genricos, que foi desenvolvida a partir do Algol-60. As suas instrues so formadas por expresses do tipo algbrico e certas palavras inglesas, tais como BEGIN, END, read, write, IF, THEN, REPEAT, WHILE, DO. Neste aspecto, o Pascal assemelha-se a muitas outras linguagens de alto nvel. Contudo, o Pascal contm ainda alguns aspectos nicos, que foram especificamente projetados para estimular o uso da programao estruturada o mtodo ordenado e disciplinado de programao que tem como resultado programas claros, eficientes e livres de erros. Por esta razo, muitos educadores e programadores profissionais preferem utilizar o Pascal em vez de outras linguagens de fins genricos.

2.1.1 2.1.1 A histria


A linguagem de programao Pascal foi criada para ser uma ferramenta educacional isto no incio da dcada de 70 pelo Professor Niklaus Wirth do Techinical University em Zurique, Sua. Foi batizada pelo seu idealizador de PASCAL, em homenagem Blaise Pascal, brilhante cientista e matemtico francs que entre outros feitos inventou a primeira calculadora mecnica do mundo. O pascal ganhou popularidade quando foi adotado pela Universidade da Califrnia, San Diego, em 1973. No msmo perodo, em seus cursos, tambm foram feitas implementaes para minis e microcomputadores. Nas suas primeira implementaes, no era muito amigvel ao programador, pois eram necessrios vrios passos para se obter um programa executvel. Primeiro devia se escrever o programa em um editor de texto, depois compila-lo, linc-lo e mont-lo. Quando era feita uma manuteno no mesmo, todos estes passos deviam ser refeitos. Isto de certa forma desistimulava os programadores a usar a linguagem Pascal. Apesar de todas as dificuldades iniciais, de seu propsito educacional e a facilidade de programao, o Pascal comeou a ser utilizado por programadores de outras linguagens, tornando-se para surpresa do prprio Nicklaus, um produto comercial. Em 1983, a soft-house americana Borland International, lanou o Turbo Pascal para microcomputadores, aliado ao lanamento no mercado de microcomputadores. O Turbo Pacal consegue em um nico ambiente, colocar um editor de textos, bastante parecido com o Wordstar e SideKick, um cdigo fonte ligado a um sistema de deteco de erros, um compilador de 1 passo, o que o torna bastante veloz, com a desvantagem de que apenas um erro localizado por vez, e tambm um linkador que permite a ligao do programa Pascal com objetos, mesmos os gerados por outras linguagens. Hoje o Pascal amplamente usado numa grande variedade de aplicaes, quer como linguagem de ensino quer como uma poderosa linguagem de fins genricos.

2.1.2 Por que Turbo Pascal?


Como j vimos, um compudor no pode entender nem to pouco executar instrues em linguagens de alto nvel. Ele s entende linguagem de mquina. Desta forma, os programas em linguagens de alto nvel devem ser traduzidos antes de serem executados pelo computador. Quem faz essa traduo so os programas tradutores. Existem basicamente 2 tipos de programa tradutor: o interpretador e o compilador. Os dois aceitam como entrada um programa em linguagem de alto nvel (programa fonte) e produzem como sada um programa em linguagem de mquina (programa objeto). A diferena entre eles est na forma de executar a tarefa de traduo. O interpretador traduz para a linguagem de mquina e roda uma linha por vez, at, que todo programa seja executado. J o compilador traduz para a linguagem de mquina todo o programa fonte e s ento ele executado.
. 11

Linguagem Pascal

Assim, existem linguagens de programao interpretadas e compiladas. O Cobol compilado, o Basic pode ser tanto compilado como interpretado e assim por diante. A linguagem Pascal, tradicionalmente compilada. Por outro lado, o processo de compilao, de certa forma pode se tornar moroso, pois deve seguir as seguintes etapas: 1. Devemos utilizar um editor de textos para escrever e armazenar em disco o nosso programa fonte. 2. Utilizar um compilador para traduzir o programa fonte para um programa em linguagem de mquina. 3. Finalmente, devemos juntar ao programa compilado as diversas rotinas necessrias que, normalmente, ficam armazenadas numa biblioteca. Aps estes passos, suponha que voc chegue a concluso de queo programa tenha que sofrer modificaes, pois bem, voc ter que repetir os trs passos descritos, e assim sucessivamente at que o programa fique ao seu gosto. O compilador Turbo Pascal facilita todo esse processo, pois ele possui numa forma integrada, um editor de textos compatvel com o Wordstar, um compilador e um linkeditor. O processo de compilao pode ser feito tanto em disco como em memria, o que faz com que ele seja muito rpido. Alm disso, o Turbo Pascal atende aos padres da linguagem Pascal definidos por Niklaus Wirth, o pai da linguagem. Na realidade, o Turbo Pascal vai muito alm, pois ele possui inmeras procedures e funes a mais do que as existentes no padro da linguagem Pascal.

2.2 Estrutura de um programa em Pascal


Todo programa em Pascal subdividido em 3 reas: 1-Cabealho do Programa, 2-rea de Declaraes e o 3-Corpo do Programa. Este o layout geral de um programa Turbo Pascal: program ... ; uses label const type var procedure function begin statement; ... end. { Cabecalho do programa } ... ; ... ; ... ; ... ; ... ; ... ; ... ; { clusula Uses} { declarao de Labels } { declarao de Constantes } { declarao de Tipos } { declarao de Variveis} { declarao de Procedures } { declarao de Funes}
1 -Cabealho do Programa

2-rea de Declaraes

{ Instrues }
3-Corpo do Programa

2.2.1 Cabealho do programa


Esta rea utilizada para se fazer a identificao do programa com um nome, sendo que este deve seguir as mesmas regras de formao utilizadas para nomear as variveis. Sintaxe: Program <identificador>;

12

Linguagem Pascal

Exemplo: PROGRAM circulo; (*O Cabealho do programa*) ...

Observaes: A primeira linha contm o nome do programa (crculo). Este o cabealho do programa. Esta parte do programa tem s uma linha e no obrigatria. No poder existir nenhuma varivel no programa com o mesmo nome do cabealho do programa.

2.2.2 rea de declaraes


Esta rea utilizada para definir o uso de qualquer tipo de identificador que no seja os predefinidos, estando esta subdvidida em sete subreas, a saber: Uses, label, const, type, var, procedure e function. Exemplo: PROGRAM circulo; (*Incio da rea de Declaraes*) Uses WinCrt; Var area, raio : Real; (*Fim da rea de Declaraes*) Begin Read(raio); Area := 3.14159*Sqr(raio); Write(raio,area); End. Observaes: Deve ser salientado que os componentes da seco rea de declaraes no tem a obrigatoriedade de existir, todos, em cada programa em Pascal. S so obrigatrias caso ns estejamos precisando. As declaraes de label, constantes, variveis, procedures e de funes podem ser listadas em qualquer ordem e repetidos um nmero de vezes qualquer.

2.2.3 O corpo do programa


O Corpo do programa contm as instrues que fazem com que se efetuem as aes do programa propriamente dito. Esta rea tem incio com a instruo begin e finalizada pela instruo end seguida do smbolo (.) ponto final . Sintaxe: ... begin <intruo1>; <intruo2>;
. 13

Linguagem Pascal

... <intruoN>; end. Um programa exemplo: Eis um programa em Pascal elementar chamado crculo, que uma vez fornecido o raio de um crculo calcula a sua rea, e escreve em seguida o raio e rea calculada. PROGRAM circulo; Uses WinCrt; Var area, raio : Real; (*Incio do Corpo do Programa*) Begin Read(raio); Area := 3.14159*Sqr(raio); Write(raio,area); End. (*Fim do Corpo do Programa*) Observaes: As trs linhas que esto em evidncia entre Begin e End so as instrues do programa. Elas fazem com que o valor do raio seja introduzido no computador, o valor da rea seja calculado e os valores do raio e da rea seja escritos para o exterior. Finalmente, note-se a pontuao no fim de cada linha. A maioria das linhas acaba por ponto e vrgula; algumas no tm pontuao e a ltima linha acaba com um ponto final. Isto faz parte da sintaxe do Pascal.

2.3 O conjunto de caracteres do Pascal


Os caracteres que podem ser utilizados no Turbo Pascal so divididos em: letras, nmeros e os caracteres especiais. Letras: de A at Z e de a at z. Nmeros: os dgitos de 0 a 9. Caracteres especiais: + [ ^ ] . * , @ / ( { = ) } < : $ > ; #

Alguns caracteres especiais so construdos por dois caracteres distintos e consecutivos: <= (*
.

>= *)

:= (.

.. .)
14

Linguagem Pascal

Observaes: Turbo pascal no faz distino entre letras maisculas e minsculas.

2.4 Palavras reservadas


As palavras reservadas do Turbo Pascal so palavras que fazem parte da sua estrutura e tm significados pr-determinados. Elas no podem ser redefinidas e no podem ser utilizadas como identificadores de variveis, procedures, functions etc. As palavras reservadas do Pascal so: and const dowton for in mod or repeat then uses asm constructor else function Inline nil packed set to var array destructor end goto interface not procedure shl type while begin div exports if label object program shr unit with case do file implementation library of record string until xor

2.5 Identificadores
Um identificador um nome que dado a um elemento do programa, tal como uma constante, campos de registro, tipo, varivel, units, procedimento, programa, etc.. Os identificadores so compostos de letras ou dgitos, em qualquer ordem, desde que o primeiro caracter seja uma letra. permitido usar maisculas ou minsculas, que so consideradas da mesma forma. Regras para formao de identificadores: 1. Um identificador pode ter qualquer tamanho, entretanto, apenas os primeiros 63 caracteres so significativos. 2. O primeiro caracter do identificador deve ser obrigatoriamente uma letra ou um trao de sublinhar ( _ ), tambm chamado de undescore. 3. Os demais caracteres podem ser letras, dgitos ou undescores e no espaos. 4. Um identificador no pode ser palavra reservada. 5. Como regra, um identificador deve conter caracteres suficientes para indicar claramente o seu significado. Tambm como regra, dever ser evitado o nmero excessivo de caracteres. 6. No se pode utilizar os caracteres especiais do Turbo Pascal na formao de identificadores. O Turbo Pascal possui inmeros identificadores pr-definidos, que no fazem parte da definio padro da linguagem Pascal. Esses identificadores consistem em Procedures e Funes, que podem ser utilizados normalmente na construo de programas. Exemplos: ClrScr (limpa a tela de vdeo) e DelLine (deleta a linha em que est o cursor). Exemplos de identificadores vlidos: Meu_Nome MEU_NOME _Variavel01 Exemplo01 Exemplos de identificadores invlidos: Valor=Valor_Anterior 2teste Exemplo 23

15

Linguagem Pascal

Exemplo: PROGRAM circulo; (*CABEALHO DO PROGRAMA*) { Este programa tem como objetivo o clculo da rea de um crculo a partir da entrada do valor do raio deste crculo } Uses WinCrt; Var area, raio : Real; begin Read(raio); Area := 3.14159*Sqr(raio); Write(raio,area); end.

2.6 Comentrios
Comentrios so textos que introduzimos no meio do programa fonte com a inteno de torn-lo mais claro. uma boa prtica em programao inserir comentrios no meio dos nossos programs. No Turbo Pascal, tudo que estiver entre os smbolos (* e *) ou { e } ser considerado como comentrio. Os comentrios so ignorados pelo compilador. Exemplo: PROGRAM circulo; (*CABEALHO DO PROGRAMA*) { Este programa tem como objetivo o clculo da rea de um crculo a partir da entrada do valor do raio deste crculo } Uses WinCrt; Var area, raio : Real; begin Read(raio); Area := 3.14159*Sqr(raio); Write(raio,area); end.

2.7 Instrues no Pascal


Uma Instruo no Pascal uma ordem, ou um conjunto de ordens, que obriga o computador a executar certas aes. Existem dois tipos bsicos de instrues em Pascal: simples e compostas. As instrues simples so essencialmente instrues nicas e incondicionais que executam uma ou mais tarefas, como por exemplo a declarao de uma varivel, a atribuio de um valor a uma varivel ou uma chamada a uma funo ou procedimento do Pascal. Exemplos: a) taxa := 0.14*bruto; b) clrscr; A linguagem Pascal reconhece inmeros tipos de instrues compostas, tambm chamadas de instrues estruturadas. As instrues compostas incluem:

16

Linguagem Pascal

a) instrues compostas, que consistem numa seqncia de duas ou mais instrues consecutivas. Neste caso as instrues simples que formam o bloco de instrues compostas devem estar entre as palavras reservadas begin e end. b) Instrues repetitivas, que envolvem a execuo de forma repetida de vrias instrues simples. c) Instrues condicionais, em que uma ou mais instrues simples so executadas apenas se uma expresso lgica especificada for atendida. Observaes: O ponto e vrgula da ltima instruo do bloco de instrues compostas tpica opcional. O conjunto de instrues consecutivas delimitadas entre as palavras reservadas begin e end podem ser tratadas como uma nica instruo simples.

Exemplo 1: Abaixo voc pode ver um exemplo de instruo composta tpica. begin X:= 1.5; Y:= 2.5; end; Exemplo 2: Abaixo voc pode ver um exemplo de instruo composta repetitiva. For i := to 100 Do writeln(i); Esta instruo ser executa 100 vezes. Cada vez que a instruo for executada o valor atual da varivel i ser visualizado na tela. Assim a instruo far com que os valores 1, 2, 3, e respectivamente at o valor 100 sejam apresentados no monitor. Exemplo 3: Abaixo voc pode ver um exemplo de instruo composta condicional. If (salario < 2000.0) Then writeln(Salrio Baixo!) Else writeln(Salrio Bom!); Esta instruo faz com que a mensagem Salrio Baixo! seja mostrada caso a varivel salrio seja menor do que 2000.0. Se a varivel salrio tiver um valor armazenado maior ou igual a 2000.0 ento a mensagem mostrada ser Salrio Bom!.

17

Linguagem Pascal

Exemplo 4: Program exemplo; ... begin writeln('Digite o valor de read (A); writeln('Digite o valor de read (B); if A = B then begin X:= 1.5; Y:= 2.5 end else begin X:= -1.5; Bloco Y:= -2.5 end; writeln ('O valor de X writeln ('O valor de Y end.

A: '); B: ');

instruo simples

de instrues compostas

:', X:4:1); :', Y:4:1);

Captulo 3 Tipos de dados e instrues primitivas 3.1 Tipos de dados predefinidos


Uma das mais interessantes caractersticas do Pascal a sua capacidade de tratar muitos tipos diferentes de dados. Estes incluem dados de tipo simples e dados de tipo estrututado. Dados de tipo simples (padro) Char (caracteres) Boolean (booleanos) Integer (inteiros) Real (reais)

Dados de tipo estruturado (padro) String (cadeia de caracteres) Array (matriz) Record (registro) File (arquivos) Set (conjuntos) Text (texto)

Os dados de tipo simples so elementos individuais (nmeros, caracteres, etc.) que esto associados com identificadores simples um a um. Os dados de tipo estruturado compe-se de mltiplos elementos relacionados entre si de forma especificada. Cada grupo de elementos de informao est associado a um nico identificador. Os elementos de informao individuais, dentro de cada grupo, podem tambm estar associados com os correspondentes identificadores individuais. Inicialmente iremos estudar os dados de tipo simples e o tipo String pela sua utilizao prtica incial. Os demais tipos estruturados sero vistos mais para a frente.

18

Linguagem Pascal

3.2 Formando nmeros no Pascal


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 caso se deseje. As regras seguintes aplicam-se a todos os nmeros: 1. Vrgulas e espaos no se podem incluir dentro de um nmero. 2. O nmero pode ser precedido por um sinal positivo (+) ou negativo (-), caso se deseje. Se no existir sinal o nmero considerado positivo. 3. Os nmeros no podem exceder seus valores mximos e mnimos especificados. Estes valores dependem do tipo de nmero, do computador e do compilador (verso) especfico que voc esteja utilizando.

3.3 Nmeros inteiros


Um nmero inteiro no contm um ponto decimal nem um expoente. Um nmero inteiro simplesmente uma seqncia de dgitos, precedida (opcionalmente) por um sinal. Nmeros inteiros permitidos: 25 0 1 +1 -315 Nmeros inteiros no permitidos: 123,456 36.50 -10 20 34

O Turbo Pascal fornece cinco tipos pr-definidos de nmeros inteiros. Veja a tabela abaixo. Tipo Shortint Integer Longint Byte Word Faixa -128..127 -32768..32767 -2147483648..2147483647 0..255 0..65535 Formato Sinalizado 8-bit Sinalizado 16-bit Sinalizado 32-bit No Sinalizado 8-bit No Sinalizado 16-bit

3.4 Nmeros reais


Um nmero real deve conter um ponto decimal ou um expoente (ou ambos). Se existir um ponto decimal, este deve aparecer entre dois dgitos. Um nmero real no pode ento comear ou acabar com um ponto decimal. Nmeros reais permitidos: 0.0 1.0 -0.2 827.602 3.0E+10 (3.0x1010) 5.026E-17 (5.026x10-17) Nmeros reais no permitidos: 1. 1,000.0 .3333

19

Linguagem Pascal

O Turbo Pascal fornece cinco tipos pr-definidos de nmeros reais. Veja a tabela abaixo. Tipo Real Single Double Extended Comp Observao:

Faixa 2.9e-39..1.7e38 1.5e-45..3.4e38 5.0e-324..1.7e308 3.4e4932..1.1e4932 -9.2e18..9.2e18

Dgitos 11-12 7-8 15-16 19-20 19-20

Bytes 6 4 8 10 8

Uma varivel do tipo real pode armazenar um valor inteiro, mas no o contrrio.

3.5 Tipos de dados caracteres


So caracterizados tipo caracteres as seqncias contendo os caracteres de A a Z (mausculo e minsculo), os dgitos de 0 a 9, o espao em branco e os caracteres especiais. Uma strings de caracteres so um conjunto de caracteres entre aspas (apstrofos) simples. No Pascal este tipo de dado referenciado pelo identificador string, podendo armazenar de 1 at 255 caracteres. Existe ainda o tipo char, utilizado da mesma forma que o tipo string, porm com uma pequena diferena: utilizado para strings com apenas um caracter de tamanho. Cadeias de caracteres permitidas: Exemplo de cadeia de caracteres R$19,95 Please dont go! 217 - 32 Abc Observaes:

Se uma cadeia de caracteres incluir uma aspas, esta (a aspas) deve ser escrita duas vezes. Neste caso s aparecer uma das aspas quando a cadeia for impressa ou visualizada. Uma string de caracteres de tamanho 0 (zero) chamado de string nula e s compatvel com o tipo string. Uma string de caracteres de tamanho 1 (um) compatvel com o tipo char e tambm o tipo string.

3.6 Dados booleanos (ou lgicos)


So caracterizados tipos booleanos (lgicos) os dados que podem assumir os valores true (verdadeiro) e false (falso), sendo que este tipo de dado somente poder representar um dos dois valores. Esta categoria inclui as constantes do tipo booleano, as variveis, funes e expresses. As expresses do tipo booleano so formadas combinando operandos do mesmo tipo com operadores relacionais. Dados booleanos: true (1) false (0)

20

Linguagem Pascal

3.7 Operadores aritmticos


Operador + * / div mod Operao Adio Subtrao Multiplicao Diviso Diviso de inteiros Resto de diviso Tipos de Operandos Inteiro (integer) Real (real) Inteiro (integer) Real (real) Inteiro (integer) Real (real) Inteiro (integer) Real (real) Inteiro (integer) Inteiro (integer) Tipo de Resultado Inteiro (integer) Real (real) Inteiro (integer) Real (real) Inteiro (integer) Real (real) Real (real) Real (real) Inteiro (integer) Inteiro (integer)

As expresses aritmticas so escritas linearmente, usando-se a notao matemtica. Voc pode observar que toda expresso aritmtica, ao ser avaliada produz um valor que se constitui no resultado da expresso. Esse valor possui um tipo, que pode ser inteiro ou real, conforme a natureza dos operados e operandos envolvidos. Exemplos de expresses aritmticas em Pascal: a) X+Y b) Total/N e) 11 div 4 f) Soma*Soma i) Sqrt(F1+G*G)-H c) X-Y g) 2*Nota d) SqRt(P) h) 11 mod 4

Observaes: No pascal no existe sinal para potenciao e radiciao, devendo-se indic-las com combinaes de produtos ou funes predefinidas. div e mod so operadores que s podem ser aplicados com operandos inteiros dando, respectivamente, o quociente inteiro e o resto inteiro da diviso entre operandos. Uma expresso que s tenha operandos inteiros e operadores *, mod, div, + e ter como resultado um valor inteiro. Se, pelo menos, um dos operandos for real e se os operadores forem *,/,+ ou -, o resultado da expresso ser real. O operador / sempre conduz a um resultado do tipo real, mesmo que os dois operandos sejam inteiros. Programa exemplo:
Program Operadores_aritmeticos; Uses CRT; Var x,y,z : integer; r1,r2 : real; Begin ClrScr; (* limpa a tela *) x:=10; y:=20; z:=x+y; writeln(z); (* escreve o valor de z na tela de video *) x:= 20 DIV 3; y:= 20 MOD 3; writeln(x); (* escreve 6 na tela *) writeln(y); (* escreve 2 na tela *) r1:=3.24; r2:=r1/2.3; writeln(r2); end. 21

Linguagem Pascal

Este programa resultaria na seguinte tela:


--------------------------------------------------------30 6 2 1.4086956522E+00 ---------------------------------------------------------

3.7.1 Prioridades nas expresses aritmticas


A expresso 5 mod 2 + 5 div 2 demonstra uma possvel fonte de confuso: se houver vrios operadores, qual operao ser executada primeiro? Para evitar isso, e da mesma forma que na matemtica, podemos usar parnteses ou a precedncia dos operadores, que indicam a seqncia em que devem ser efetuadas as operaes: Prioridade 1a. 2a. 3a. Operadores - (unrio) * / div mod +-

A ordem de precedncia acima indica que primeiro so aplicados os - unrios, depois as potenciaes, em seguida so efetuadas todas as operaes de multiplicao, diviso, resto de diviso inteiro, e s aps estas so efetuadas as adies e subtraes. Exemplo: ... begin writeln(51 div 16 + 48 8 mod 5); {resultado: 3+48-3=48} writeln( (51 div 16) + (48 8) mod 5); {resultado: 3+0=3} writeln( -3*(43/(52 div 3) )); {resultado: -3*(43/17) = -7.588} writeln( 6/3*2 ); {resultado: 4 (real)} ... Observaes: 1) Um operando entre dois operadores de diferentes prioridade relacionado ao operador de maior prioridade. 2) Um operando entre dois operadores de igual prioridade relacionado ao primeiro operador sua esquerda. 3) Operaes com operadores de igual prioridade so normalmente executadas (avaliadas) da esquerda para a direita. 4) Se a expresso tem parnteses , estes tm precedncia superior a todos os operadores, isto , qualquer expresso entre parnteses executada primeiro. Dica: use parnteses sempre que puder!.

3.8 Operadores relacionais


O Turbo Pascal possui ao todo 7 operadores relacionais que so muito utilizados nas tomadas de decises. Uma expresso relacional uma comparao realizada entre valores do mesmo tipo. Estes valores so representados na relao por constantes, variveis ou expresses do tipo correspondente. So eles:

22

Linguagem Pascal

Operadores = <> > < >= <= in Observao:

Operao Igual Diferente Maior Menor Maior ou igual que Menor ou igual que Contido em (conjunto)

Tipo de resultado Booleano Booleano Booleano Booleano Booleano Booleano Booleano

Toda expresso relacional retornar um resultado do tipo booleano: verdadeiro (true) ou falso (false).

Exemplos: program exemplo; uses WinCrt; var x, y:integer; begin x:= 3; y:= 5; Writeln(2 = 3); Writeln(0.6 <= 1.5); Writeln(-4 <> 4); Writeln(x <= 10); Writeln(x+y > 10); Writeln(2*1 >= x div 2); Writeln( (x div 2) > (y+6) ); end. Este programa resultaria na seguinte tela:
--------------------------------------------------------FALSE TRUE TRUE TRUE FALSE TRUE FALSE ---------------------------------------------------------

Operadores 3.9 Operadores lgicos


No Pascal, assim com em qualquer outra linguagem, existiram ocasies em que se far necessrio trabalhar com o relacionamento de duas ou mais condies ao mesmo tempo em uma instruo, efetuando desta forma testes mltiplos. Para esses casos necessrio ento trabalhar com a utilizao dos operadores lgicos, tambm conhecidos por operadores boleanos. So trs os operadores lgicos: and, or e not. Veja a tabela abaixo. Operadores AND OR NOT
.

Operao E lgico OU lgico NO lgico (unrio)

Operadores Booleano Booleano Booleano

Tipo de resultado Booleano Booleano Booleano


23

Linguagem Pascal

3.9.1 Operador lgico AND


O operador and faz com que uma determinada operao seja executada, se e somente se as expresses avaliadas resultarem simultaneamente um valoro lgico verdadeiro. Veja a tabela verdade para este operador: Expresso 1 Falso Verdadeiro Falso Verdadeiro Expresso 2 Falso Falso Verdadeiro Verdadeiro Resultado Falso Falso Falso Verdadeiro

Sejam as variveis lgicas P, Q, R, S contendo, respectivamente, os valores true, false, false e true. Exemplo: O valor lgico das expresses: a) P and S b) P and R ser: a) true b) false c) false d) false c) Q and S d) Q and R

3.9.2 Operador lgico OR


O operador or faz com que uma determinada operao seja executada, se pelo menos uma das expresses avaliadas resultarem um valor lgico verdadeiro. Veja a tabela verdade para este operador: Expresso 1 Falso Verdadeiro Falso Verdadeiro Exemplo: O valor lgico das expresses: a) P or S c) Q or S b) P or R d) Q or R ser: a) true b) true c) true d) false Expresso 2 Falso Falso Verdadeiro Verdadeiro Resultado Falso Verdadeiro Verdadeiro Verdadeiro

3.9.3 Operador lgico NOT


O operador not faz com que uma determinada operao seja executada, invertendo o resultado lgico da expresso avaliada. Veja a tabela verdade para este operador:

24

Linguagem Pascal

Expresso 1 Verdadeiro Falso Exemplo:

Resultado Falso Verdadeiro

O valor lgico das expresses: a) not P ser: a) false Observaes:


b) not R

b) true

Estes operadores s aceitam como operandos, valores lgicos, ou seja : TRUE e FALSE. Com o operador AND a expresso resulta verdadeiro (TRUE) unicamente se ambos os operandos forem verdadeiros (TRUE). Com o operador OR a expresso resulta verdadeiro (TRUE) se qualquer um dos operandos for verdadeiro, ou se ambos forem verdadeiros. O operador NOT utilizado para negar (isto , para inverter) o valor de um operando booleano.

Veja abaixo um pequeno programa que utiliza operador lgico AND: Program testa_logica_and; Uses WinCrt; var numero := integer; begin write(Digite um nmero inteiro: ); readln (numero); if (numero >=20) and (numero <=90) then writeln (O nmero est na faixa de 20 a 90!) else writeln(O nmero est fora da faixa de 20 a 90!); end. Este programa resultaria na seguinte tela:
---------------------------------------------------------

Digite um nmero inteiro: 99 O nmero est fora da faixa de 20 a 90!


---------------------------------------------------------

3.9.4 Prioridades entre operadores aritmticos, lgicos e relacionais


Como j vimos anteriormente, pode-se ter mais de um operador lgico na mesma expresso, alm dos operadores relacionais e dos operadores aritmticos. Em Pascal, a prioridade das operaes est dada no quadro abaixo.

25

Linguagem Pascal

Prioridade 1a. 2a. 3a. 4a. Exemplo1:

Operadores not *, /, div, mod, and +, -, or =, <>, <, <=, >=, >, in

program Exemplo; uses WinCrt; var A, B, C, K: integer; begin A:= 2; B:= 3; C:= 10; K:= 1; writeln ((A=1) and ((B+C<>0) or (K<=2))); end. Este programa resultaria na seguinte tela:
--------------------------------------------------------FALSE ---------------------------------------------------------

Exemplo2: ... not ((Total >=2) and (A<>B)) or Teste ...

3.10 Concatenao
O Turbo Pascal permite que voc use o operador + para concatenar dois operandos do tipo string. O resultado da concatenao compatvel com o tipo string. Operador + Observao: Se o resultado da concatenao for maior do que 255 caracteres, a strig resultante ser truncada aps o caracter 255. Exemplo: program exemplo; Uses WinCrt; var caracter1, caracter2 :char; string1, string2, string3 :string; begin
. 26

Operao Concatenao

Tipos de operandos String ou Char

Tipo do resultado String

Linguagem Pascal

'A'; ''; 'linguagem Pascal'; 'legal'; caracter1+' '+string1+' '+caracter2+' '+string2+'!'; write (string3); end. Este programa resultaria na seguinte tela:
--------------------------------------------------------A linguagem Pascal legal! ---------------------------------------------------------

caracter1:= caracter2:= string1 := string2 := string3 :=

Captulo 4 Declaraes no Pascal 4.1 Declarao de variveis


Varivel pode ser definido, no sentido de programao, como uma regio de memria de um computador, previamente identificada e que tem por finalidade armazenar as informaes (dados) de um programa temporariamente. Uma varivel armazena apenas um valor por vez. Uma varivel um identificador cujo valor pode variar durante a execuo do programa. Todas as variveis dever ser individualmente declaradas (isto , definidas) antes de poderem aparecer numa instruo do programa.

4.1.1 A declarao Var


Esta a sub-rea onde devemos declarar todas as variveis que iremos utilizar em nosso programa. A sua sintaxe geral : Var <lista-de-identificadores> : <tipo>; ... <lista-de-identificadores> : <tipo>; onde: Var uma palavra-chave (palavra reservada) que inicia uma parte do programa para a definio de variveis; lista-de-identificadores so os identificadores que representam os nomes individuais das variveis. Existindo mais de um identificador na declarao, estes tero de ser separados por vrgula. tipo o tipo das variveis, ou seja, define o conjunto ordenado de valores que podem ser atribudos a estas variveis.

Exemplo: Program Exemplo; Uses WinCrt; Var idade, numero_de_filhos altura sexo nome : : : : byte; real; char; string [30];
27

Linguagem Pascal

sim_ou_no quantidade Begin idade:= 34; numero_de_filhos:=2; sexo := M; nome := Jos; sim_ou_nao :=TRUE; quantidade := 3245; End.

: boolean; : integer;

4.1.2 Atribuindo valores as variveis


Uma instruo de atribuio uma instruo simples que usada para atribuir um valor de uma expresso a uma varivel. Esta instruo escrita na forma: Varivel := expresso; onde: varivel qualquer identificador previamente declarado na sub-seo Var da rea de declaraes. Expresso pode ser um elemento nico por exemplo, uma constante, outra varivel, uma referncia de funo ou pode ser uma expresso (aritmtica ou lgica por exemplo).

Observao: O resultado da expresso deve ter o mesmo tipo da varivel. Existe uma exceo a esta regra: um valor inteiro pode ser atribudo a uma varivel do tipo real.

Exemplo1: X := Y + Z; conta := conta+1; area := 3.14159*sqr(raio); Exemplo2: X := (I >= 1) and (I < 100); Suponha que X uma varivel booleana, e I seja uma varivel inteira. Ento a instruo faz com que X seja atribudo o valor verdadeiro (TRUE) ou falso (FALSE), conforme determinado pela expresso booleana.

4.1.3 Incrementando uma varivel - A procedure Inc


Esta procedure incrementa uma varivel do tipo ordinal. Esta uma procedure da unit System. Sintaxe: Inc(identificador, incremento); Onde: identificador o nome da varivel. Um identificador vlido do pascal. incremento um nmero inteiro que define em quanto a varivel ser incrementada. Caso este valor seja omitido assume-se que o incremento ser de 1 em 1.
. 28

Linguagem Pascal

Exemplo: Var numero: integer; ...


{Incrementa varivel numero em 1. o mesmo que numero := numero+1; }

Inc(numero);
{Incrementa varivel numero em 3. o mesmo que numero := numero+3; }

Inc(numero,3); ... Observaes: O valor de incremento poder ser precedido pelo sinal de menos (-). Desta forma a procedure ir decrementar o valor da varivel. O incremento um valor do tipo longint e conseqntemente no poder ultrapassar a faixa deste tipo.

4.2 Declarao de constantes


Tem-se como definio de constante tudo aquilo que fixo ou estvel. Quando estivermos programando em Pascal, existiro vrios momentos em que este conceito dever ser aplicado. Identificadores podem ser usados, dentro de um bloco, como sinnimos de constantes, desde que tenham sido previamente definidos como tal. Na sub-rea Const, podemos definir quantas constantes forem necessrias.

4.2.1 A declarao const


A sua sintaxe geral : const <identificador> = <expresso>; ... <identificador> = <expresso>; Onde: const uma palavra reservada que inicia uma parte do programa para a definio de constantes; identificador qualquer identificador permitido pela linguagem Pascal; expresso um nmero (com ou sem sinal), valor lgico, literal ou identificador de constante j definido.

Exemplo: ... const Pi = 3.1416; cor_preferida = verde; numero_maximo = 24345; ... Observaes:
.

Toda vez que nos referirmos s constantes dentro do programa, o Turbo Pascal substituir-las pelos seus respectivos valores declarados. Aps declaradas as constantes, estas no podem receber atribuies posteriormente.
29

Linguagem Pascal

4.2.2 Constantes tipadas


A declarao de variveis na sub-rea Var, apenas reserva espao de memria para elas, mas no as inicializa, ou seja, at que se atribua valores a elas, seus valores sero desconhecidos. Sob certas circunstncias, seria interessante que pudssemos ao mesmo tempo em que declaramos a varivel, dar seu valor inicial. Isto possvel com o conceito de constante tipada. Diferente da constante no tipada a declarao de uma constante tipada especifica o tipo e o valor desta constante. Sintaxe: ... const <identificador> : <tipo> = <valor>; ... <identificador> : <tipo> = <valor>; Onde: Const uma palavra reservada que inicia uma parte do programa para a definio de constantes; identificador qualquer identificador permitido pela linguagem Pascal; tipo o tipo das variveis, ou seja, define o conjunto ordenado de valores que podem ser atribudos a estas variveis. valor pode ser um nmero (com ou sem sinal), valor lgico, literal, uma expresso ou identificador de constante j definido.

Observaes:

Constantes tipadas podem ser usadas exatamente como variveis do mesmo tipo, podendo inclusive receber atribuies posteriormente.

Exemplo: ... const Minimo: Integer = 0; Maximo: Integer = 9999; Contador: Integer = 100; C : char = A; ...

4.3 Constantes predefinidas


O Turbo Pascal for Windows inclui ainda dois idenficadores predefinidos padro que representam constantes. So eles: maxint, maxlongint. - maxint a constante maxint especifica o maior valor que pode ser atribudo a uma quantidade do tipo inteiro (integer). Este valor 32.767. - maxlongint a constante maxlongint especifica o maior valor que pode ser atribudo a uma quantidade do tipo inteiro longo (longint) . Este valor 2.147.483.647.

30

Linguagem Pascal

4.3 A declarao de tipos


Alm dos tipos de dados predefinidos no Turbo Pascal , podemos tambm definir novos tipos atravs da declarao Type. Um novo tipo criado atravs de um definio de tipo que determina um conjunto de valores e associa um identificador a este conjunto. Uma vez definido o tipo passa a ser referenciado pelo seu identificador. como se a cada nova definio fosse acrescentando um novo tipo ao conjunto que, inicialmente, constitui-se dos tipos predefinidos.

4.3.1 Dados do tipo enumerado


Um dado do tipo enumerado consite numa sequncia ordenada de identificadores, em que cada um destes interpretado como um elemento individual. Estes elementos esto coletivamente associados a um nome particular que serve para identificar o tipo de informao. A associao entre o nome do tipo de informao e os seus elementos individuais estabelecida pelas definies de tipo (type). A sua sintaxe geral : Type identificador= (elemento1,elemento2,...,elementoN); ... identificador= (elemento1,elemento2,...,elementoN); Onde: Type uma palavra reservada que inicia uma parte do programa contendo definies de tipo; identificador qualquer identificador permitido pela linguagem, que passar a identificar o novo tipo. O identificador segue as regras dadas anteriormente; o nome do novo tipo. elementoN um identificador que passar a representar um elemento do conjunto.

Exemplo: ... Type cor dia_util sexo ... Observaes: Note que os elementos do novo tipo devem ser separados por vrgulas. Deve ser entendido que estes elementos so os nicos valores que podem estar associados com o tipo definido. Uma vez que os dados do tipo enumerado esto definidos numa sequncia ordenada, os operadores relacionais podem ser aplicados de modo a formar uma expresso booleana. As funes preexistentes Succ(X), Pred(X) e Ord(X) tambm podem ser utilizadas. Considerando os conceitos introduzidos at aqui, a definio do tipo boolean seria, ento: Type boolean = (false, true); = (azul,vermelho,branco,verde,amarelo); = (segunda,tera,quarta,quinta,sexta); = (masculino,feminino);

Exemplo: Vamos considerar a definio do tipo: Type dias = (domingo, segunda, tera, quarta, quinta, sexta, sabado);
.

domingo < tera - retorna true.


31

Linguagem Pascal

quinta >= sbado - retorna false. segunda <> sexta retorna true. Succ(segunda) = tera retorna true. Ord(quinta) = 4 o nmero inteiro 4 indica a ordem do valor quinta no conjunto (a enumerao comea de zero, contando da esquerda para a direita).

Program exemplo; uses WinCrt; type Cores = (VERMELHO,AZUL,VERDE); begin Writeln(O AZUL tem um nmero ordinal = ,Ord(BLUE)); Writeln('C em cdigo ASCII ',Ord('c'), ' decimal'); end.

4.3.2 Dados do tipo gama de valores


Uma gama de valores refere-se a uma parte do intervalo original de um tipo de dados simples e ordenados. O tipo original de dados referido como o tipo suporte. Cada elemento que esteja dentro da gama de valores considerado tambm como pertencendo ao tipo suporte. O conceito gama de valores pode ser aplicado a qualquer conjunto de dados ordenados e simples. Sintaxe: Type identificador= primeiro elemento..ltimo elemento; ... identificador= primeiro elemento..ltimo elemento; Onde: Type uma palavra reservada que inicia uma parte do programa contendo definies de tipo; identificador qualquer identificador permitido pela linguagem, que passar a identificar o novo tipo. O identificador segue as regras dadas anteriormente; o nome do novo tipo. primeiro elemento o primeiro dos elementos ordenados dentro da gama de valores; ltimo elemento o ltimo dos elementos ordenados, dentro da gama de valores;

Exemplo: ... Type dias = (domingo,segunda,tera,quarta,quinta,sexta,sabado); Dias_da_semana = segunda..sexta; ms = 1..31; maiuscula = A..Z; ... Observaes: Os dados do tipo inteiro, caracter e booleanos podem ser usados para definir uma gama de valores. Os dados do tipo real no podem ser usados para definir uma gama de valores. Note que dois pontos consecutivos devem separar o primeiro e o ltimo elementos da gama de valores.

32

Linguagem Pascal

Captulo 5 - Entrada e sada de dados 5.1 Write e Writeln


Estas so as principais procedures destinadas a exibir todos os tipos de dados no vdeo. A diferena entre write e writeln reside no fato de que a procedure write escreve o parmetro, e mantm o cursor na mesma linha em que foi escrito, enquanto que writeln passa o cursor para a prxima linha. A sua sintaxe geral : Write (<lista-de-identificadores e/ou constantes e/ou expresses>) Writeln (<lista-de-identificadores e/ou constantes e/ou expresses>) onde:

write e writeln so identificadores com significado predefinido em PASCAL. lista de identificadores so os nomes de variveis do tipo string, char, integer, real ou boolean, cujos valores sero enviados unidade de sada. constantes e/ou expresses de mesmo tipo das variveis tambm podem aparecer nos comandos de sada.

Observao: A instruo Write e Writeln aceita mltiplos parmetros. Estes parmetros devem ser separados por vrgula.

Exemplo:
Program Exemplo; Uses CRT; Var i : integer; r : real; c : char; s : string[20]; Begin ClrScr; Writeln('Exemplos de aplicacao de writeln e write'); writeln; i:=100; r:=3.14; c:='Muito'; s:='interessante!'; writeln('Valor de i e igual a ',i); write('valor de r = '); writeln(r); writeln(c,'',s); end.

Este programa resultaria na seguinte tela:


--------------------------------------------------------Exemplos de aplicacao de writeln e write Valor de i e igual a 100 valor de r = 3.1400000000E+00 Muito interessante! ---------------------------------------------------------

33

Linguagem Pascal

5.2 Sadas formatadas


A informao de sada pode normalmente ser tornada mais legvel alterando as dimenses de campos associados com os dados numricos e booleanos. Isto pode ser conseguido facilmente adicionando algumas especificaes de formatao nas instrues write ou writeln. A sua sintaxe geral : write(p1,...,pn); writeLn(p1,...,pn); onde:

p1 um parmetro com uma das formas:

e e:e1 e:e1:e2 , sendo e, e1, e2 expresses.


e representa o valor a ser escrito e pode ser do tipo integer, real, char, string e boolean, podendo inclusive ser uma constante ou uma expresso. e1 representa um valor inteiro positivo e indica o nmero mnimo de caracteres a ser escrito. Se e1 for insuficiente para representar o valor a ser escrito, ento ser alocado mais espao. Se e1 for excessivo, o espao excedente ser preenchido com brancos. e2 s se aplica se e for do tipo real; neste caso, e2 um valor inteiro positivo e especifica o nmero de dgitos que devem ser escritos aps o ponto decimal. Caso e2 no seja fornecido o valor real ser escrito no formato exponencial.

Exemplo: program Exemplo; uses WinCrt; var A, B: real; K, L: char; begin A:= 3.2; B:= 5.81; K:= 'x'; L:= 'y'; writeln (A:4:2); writeln (K:2); writeln (B:5:2); writeln (A+B:6:3); writeln (A:4:2, K:2, ' +', B:5:2, L:2,' =', A+B:6:3); end. Este programa resultaria na seguinte tela:
--------------------------------------------------------3.20 x 5.81 9.010 3.20 x + 5.81 y = 9.010 --------------------------------------------------------. 34

Linguagem Pascal

5.3 Read e Readln


O comando read usado para ler dados via teclado e atribu-los variveis do tipo inteiro, real ou do tipo caracter (char ou string). A procedure Read l dados do teclado at que se pressione a tecla ENTER, sendo que cada tecla pressionada ecoada para o vdeo. Aps pressionarmos ENTER, o cursor permanecer no mesma posio no vdeo. A sua sintaxe geral : read(variveis de entrada); onde:

read e readln so identificadores predefinidos em Pascal; variveis de entrada so os nomes das variveis do tipo string, char, integer ou real, cujos valores sero lidos na unidade de entrada.

Observao:

As variveis de entrada devem estar separadas por vrgulas. Note que as variveis do tipo booleano no podem ser includas na lista de variveis de entrada. A diferena entre as instrues read e readln que a instruo readln obriga a prxima instruo read ou readln a comear a ler em uma nova linha de dados. J a instruo read permite que a prxima instruo read ou readln comece na mesma linha. Os dados numricos devem ser separados uns dos outros por espaos ou por indicaes de fim de linha (ENTER). Qualquer nmero pode ser precedido por um sinal de mais ou menos, desde que no haja um espao entre o sinal e o nmero. O dado do tipo caracter no deve ser colocado entre aspas.

Exemplo:
Program teste; Uses WinCrt; Var i r c s : : : : integer; real; char; string[10];

Begin ClrScr; Write('Digite um numero inteiro ------> '); Readln(i); Write('Digite um numero real ---------> '); Readln(r); Write('Digite um caractere -----------> '); Readln(c); Write('Digite uma string -------------> '); Readln(s); Writeln;Writeln; (* pula duas linhas *) Writeln(i); Writeln(r); Writeln(c); Writeln(s); End.

35

Linguagem Pascal

Este programa resultaria na seguinte tela:


--------------------------------------------------------Digite um numero inteiro ------> 10 Digite um numero real ---------> 10.5 Digite um caractere -----------> a Digite uma string -------------> abc 10 1.0500000000E+01 a abc ---------------------------------------------------------

Captulo 6 - Funes padro predefinidas 6.1 Funes matemticas


No pascal esto disponveis funes predefinidas para o clculo de vrias operaes matemticas. Funo Abs(Num) ArcTan(Num) Cos(Num) Exp(Num) Frac(Num) Int(Num) Ln(Num) Round(Num) Sin(Num) Sqr(Num) SqRt(Num) Trunc(Num) Descrio Valor absoluto Arco tangente Co-seno Exponencial (ex) e=2.71882818... Parte fracionria Parte inteira Logaritmo natual (base e) (Num > 0) Arrendondamento ao inteiro mais prximo Seno Quadrado Raiz quadrada (Num > 0) Extrao da parte inteira, ou seja perde a parte decimal Tipo de entrada Inteiro ou Real Inteiro ou Real Inteiro ou Real Inteiro ou Real Real Real Inteiro ou Real Real Inteiro ou Real Inteiro ou Real Inteiro ou Real Real Tipo de valor retornado Inteiro ou Real (o mesmo que Num) Real Real Real Real Real Real Inteiro Real Inteiro ou Real (o mesmo que Num) Real Inteiro

Exemplo: ... begin Writeln(2*Sin(3.14)); End. ... A chamada da funo precede as demais operaes; se uma funo um operando de uma expresso, ela deve ser calculada antes que as demais operaes possam ser efetuadas. Observe a seqncia de execuo da instruo acima:

36

Linguagem Pascal

1o) calculado o seno; 2o) o resultado deste clculo multiplicado ento por 2; 3o) e por fim mostrado na tela o resultado. Observaes:

Como parmetros de funes voc pode usar expresses e at outras funes.

6.2 Funes literais


O tipo predefinido char formado pelos caracteres existentes na configurao considerada. Operaes neste tipo so definidas no Turbo Pascal. As expresses do tipo char so formadas por uma constante, ou uma varivel ou a ativao de uma funo do tipo char. Existem, porm funes predefinidas, tais como: Nome Ord (X) Chr(EA) Descrio Tipo de entrada Char Tipo de valor retornado Integer

Succ(X) Pred(X)

Retorna um nmero decimal que indica a ordem X no conjunto de caracteres ASCII. Retorna o caracter que corresponde Integer Char ordem, dada pelo valor da expresso aritmtica EA, se existir, no conjunto de caracteres ASCII. Retorna o sucessor de X no Integer ou Char Integer ou Char conjunto de caracteres ASCII, se existir. Retorna o predecessor de X no Integer ou Char Integer ou Char conjunto de caracteres ASCII, se existir.

Observao: As funes Ord(X), Succ(X), Pred(X) aplicam-se no apenas s variveis ou constantes do tipo char, mas de qualquer tipo predefinido, exceto o tipo real.

Exemplo: a) Succ(A) B; Pred(D) C; b) Succ(1) 2; Pred(100) 99; c) Ord(C) 67; Chr(65) A no cdigo ASCII.

37

Linguagem Pascal

subCaptulo 7 - As sub-rotinas do Pascal sub7.1 Utilizando as sub-rotinas


No geral, problemas complexos exigem algoritmos complexos, mas sempre possvel dividir um problema grande em problemas menores. Desta forma, cada parte menor tem um algoritmo mais simples, e este trecho menor que chamado de sub-rotina. Quando uma sub-rotina chamada por um programa principal, ela executada e ao seu trmino o controle de processamento do programa retorna automaticamente para a primeira linha de instruo aps a linha que efetuou a sua chamada.

sub7.2 Tipos de sub-rotinas


A linguagem Pascal permite a utilizao de dois tipos de rotinas definidas pelo programador: Procedure (procedimento) e Function (funo). Uma procedure ou function , na verdade, um bloco de programas contendo incio e fim, identificado por um nome, atravs do qual ser referenciado em qualquer parte do programa principal ou do programa chamador da rotina. A diferena entre os dois tipo de sub-rotina est no fato de uma procedure poder ou no retornar um valor aps seu processamento, enquanto uma function sempre ir retornar um valor aps seu processamento. Alm das rotinas definidas pelo programador, existe no Turbo Pascal um conjunto de rotinas embutidas predefinidas, ou seja, fornecidas pela Borland. Este tipo de rotina embutida conhecido pelo nome de unidade, em ingls Unit, que ser apresentada a seguir.

7.3 Unidades predefinidas As Units


As Units so um conjunto de rotinas prontas para serem usadas pelo programador. As Units so rotinas compiladas separadamente do programa principal. Uma unit na realidade uma biblioteca de funes e procedures predefinidas. Neste momento o que nos interessa o conhecimento das Units j disponveis no Pascal. O conceito de Units foi incorporado no Pascal na sua verso 4. As units padro do Turbo Pascal so: Strings System WinCrt WinDOS WinProcs WinTypes

As units mais importantes para o nosso estudo so a System e a WinCrt. Antes de utilizarmos algumas das rotinas predefinidas do Pascal devemos antes declarar as Units na rea de Declaraes do programa Pascal. A declarao uses indica ao compilador onde buscar as definies (cdigo objeto) de certas instrues. Sintaxe da declarao uses: Uses <identificador>, ... <identificador>; Onde: Uses uma palavra reservada do Pascal. Identificador o nome de uma das unidades padro do Pascal.

38

Linguagem Pascal

7.3.1 A unit System


A Unit System a nica que pode ser utilizada sem ser citada num programa Pascal, ou seja, no necessrio a sua declarao na rea de declaraes do Pascal. Nela est contida a maior parte das rotinas padres do Pascal. Algumas procedures e funes da unit System: Read, Readln, Write e Writeln, Chr, Eof. Lenght.

7.3.1.1 Convertendo de caixa baixa para caixa alta (UpCase)


Esta funo converte um caracter para o seu correspondente em caixa alta. uma funo da Unit System. Sintaxe: UpCase(expresso caracter); Onde: expresso caracter um nico caracter ou uma expresso do tipo caracter (Char). Um programa exemplo: ... Writeln(Digite um caracter qualquer............> ); Readln(c); Writeln(O caracter ,,c,, em caixa alta fica assim: ,UpCase(c)); ... Este programa resultaria na seguinte tela: Considerando que o caracter digitado pelo usurio o caracter a o programa resulta na seguinte tela: --------------------------------------------------------------O caracter a em caixa alta fica assim: A ---------------------------------------------------------------

7.3.1.2 Verificando o tamanho de uma string (Lenght)


Esta funo retorna o tamanho de uma string. uma funo da Unit System. Sintaxe: Lenght(expresso caracter); Onde: expresso caracter uma string de caracteres, uma varivel ou uma expresso do tipo string de caracteres (String). Um programa exemplo:

39

Linguagem Pascal

Program exemplo; Uses WinCrt; Var x:string; y:integer; begin Write('Digite uma string qualquer...: '); readln(x); y := Length(x); Write('Esta string tem ',y,' carateres.'); end. Este programa resultaria na seguinte tela: Considerando que a string digitada pelo usurio foi Pascal o programa resulta na seguinte tela: --------------------------------------------------------------Digite uma string qualquer...:Pascal Esta string tem 6 carateres. ---------------------------------------------------------------

7.3.2 A unit WinCrt


Esta a unit mais utilizada na programao do Turbo Pascal. Por esta razo, ela possui a maior parte das rotinas e variveis de gerao de som, controle de vdeo e teclado, por exemplo. Por exemplo, para fazer uso do recurso de limpar e posicionar mensagens na tela do computador, ser usada a principal e mais utilizada unidade do Turbo Pascal: a WinCrt. Algumas procedures e funes da unit WinCrt: ClrScr, GotoXY, KeyPressed, etc.

7.3.2.1 Limpando a tela (ClrScr)


ClrScr um comando, e significa limpe a tela e coloque o cursor no canto superior esquerdo (linha 1, coluna 1 do monitor). O ponto e vrgula aps o ClrScr importante: ele indica ao compilador que terminou uma instruo. Este comando uma procedure da unit WinCrt. Exemplo: Program exemplo; Uses WinCrt; begin ClrScr; Writeln(O primeiro programa a gente nunca esquece!); Readkey; ClrScr; Writeln(O segundo a gente tambm nunca esquece!); Readkey; end. Observao: O comando ClrScr limpar a tela e posicionar o cursor no canto superior esquerdo da tela.

40

Linguagem Pascal

7.3.2.2 Determinando o pressionar de uma tecla (KeyPressed)


KeyPressed um comando que determina se uma tecla qualquer foi pressionada ou no atravs do teclado. Usamos este comando para fazer com que o programa pare de ser executado e fique aguardando que alguma tecla seja pressionada; enquanto isso no ocorre, a execuo do programa fica parada. Diferentemente da funo ReadKey, que retorna o valor da tecla pressionada, KeyPressed simplesmente retorna true ou false; false enquanto nenhuma tecla for pressionada e true quando uma tecla qualquer for pressionada. Este comando tambm uma funo da unit WinCrt . Exemplo: Program exemplo; uses WinCrt; var C: Char; begin repeat Writeln(Por favor pressione uma tecla qualquer!'); until KeyPressed; Writeln(Uma tecla qualquer foi pressionada!'); end. Este programa resultaria na seguinte tela: Obs.: O programa escrever na tela a frase Por favor pressione uma tecla qualquer! um nmero indefinido de vezes, at que uma tecla qualquer seja pressionada. Neste momento o programa encerra a estrutura de repetio Repeat-Until e executa a instruo Writeln(Uma tecla qualquer foi pressionada!'); e finaliza.
---------------------------------------------------------

Por favor pressione Por favor pressione Por favor pressione ... Por favor pressione Voc pressionou uma

uma tecla qualquer! uma tecla qualquer! uma tecla qualquer! uma tecla qualquer! tecla qualquer!

---------------------------------------------------------

7.3.2.3 Aguardando pressionar uma tecla (ReadKey)


ReadKey um comando que l um caracter atravs do teclado, sem contudo, eco-lo para a tela do computador. Usamos este comando para fazer com que o programa pare de ser executado e fique aguardando que alguma tecla seja pressionada; enquanto isso no ocorre, a execuo do programa fica parada. Este comando tambm uma funo da unit WinCrt e h ainda outros usos para ela. Exemplo: Program exemplo; uses WinCrt; var C: Char; begin Writeln(Por favor pressione uma tecla qualquer !'); C := Readkey;
. 41

Linguagem Pascal

Writeln('Voc pressionou a tecla ', C, '. Seu valor em ASCII ', Ord(C), '.'); end. Este programa resultaria na seguinte tela: Obs.: Vamos supor que voc tenha pressionado a tecla A (caixa alta).
---------------------------------------------------------

Por favor pressione uma tecla qualquer !


Voc pressionou a tecla A. Seu valor em ASCII 65. ---------------------------------------------------------

7.3.2.3 Posicionando o cursor na tela (GotoXY)


Este procedimento permite posicionar o cursor em um determinado ponto da tela. Este comando um procedimento da unit WinCrt. Sintaxe: GotoXY(parmetroX,parmetroY); Para utiliz-lo necessrio informar dois parmetros: o primeiro representa o valor da coluna que dever ser um valor numrico do tipo inteiro positivo entre 1 e 80 e o segundo parmetro representa o nmero da linha que dever ser um valor numrico tambm do tipo inteiro positivo entre 1 e 25. Exemplo: Program exemplo; uses WinCrt; var C: char; begin GotoXY(10,10); Writeln('Ol!'); end. Este programa resultaria na seguinte tela: O comando GotoXY posicionar o cursor na linha 10, coluna 10 da tela do computador. A mensagem Ol! ser mostrada ento a partir desta coordenada.
---------------------------------------------------------

Ol!
---------------------------------------------------------

42

Linguagem Pascal

Captulo 8 A tomada de decises 8.1 A estrutura de deciso IF


A estrutura de deciso IF pode se apresentar de duas formas: a estrutura de deciso simples (IF-THEN) e a estrutura de deciso composta (IF-THEN-ELSE). Esta estrutura de deciso permite que uma ao se realize, se e somente se uma condio lgica for atendida.

de (IF8.1.1 A estrutura de deciso simples (IF-THEN)


Sintaxe: If <condio> Then <bloco de comando>; Onde:

If Then so palavras reservadas do Pascal. condio a expresso booleana que ser avaliada no comando If-Then. Esta expresso retorna verdadeiro (true) ou falso (false). bloco de comando um nico comando (bloco de instruo simples) ou um conjunto de comandos (bloco de instruo composta) que sero executados, caso a expresso booleana avaliada retorne verdadeiro (true).

Exemplo: Program exemplo; Uses WinCrt; var A, B, C: real; begin read (A, B, C); if A+B < C then write (A soma de A com B menor que C!) end. ou ... begin read (A, B, C); if A+B < C then write (A soma de A com B menor que C!) end. ... Neste exemplo, aps as variveis A, B e C serem declaradas reais, os valores de A, B e C sero lidos; em seguida, o comando If-Then ir avaliar a expresso booleana (A+B<C) e se a resposta for verdadeira (true), ser escrito a mensagem A soma de A com B menor do que C, e a execuo ento terminar; caso contrrio, se a expresso retornar falso (false), cessa a execuo do programa sem nenhuma mensagem exibida. Observaes: Caso a instruo, a ser executada aps a avaliao da expresso booleana, seja uma instruo composta, ou seja, com mais de um comando, deve-se delimitar o bloco de comandos por begin e end.
43

Linguagem Pascal

(IF-THEN8.1.2 A estrutura de deciso composta (IF-THEN-ELSE)


Sintaxe: If<condio> Then <bloco de comando1> Else <bloco de comando2>; Onde:

If Then-Else so palavras reservadas do Pascal. condio a expresso booleana que ser ser avaliada no expresso retorna verdadeiro (true) ou falso (false). bloco de comando1 um nico comando (bloco de instruo comandos (bloco de instruo composta) que sero executados, (condio) avaliada retorne verdadeiro (true). bloco de comando2 um nico comando (bloco de instruo comandos (bloco de instruo composta) que sero executados, (condio) avaliada retorne falso (false).

comando If-Then-Else. Esta simples) ou um conjunto de caso a expresso booleana simples) ou um conjunto de caso a expresso booleana

Exemplo1: Program exemplo1; Uses WinCrt; var A, B, C: real; begin read (A, B, C); if A+B < C then write (A soma de A com B menor que C!) else write (A soma de A com B maior que C!); end. Neste exemplo, aps as variveis A, B e C serem declaradas reais, os valores de A, B e C sero lidos; em seguida o comando if-then-else ir avaliar a expresso booleana (A+B<C) e se a resposta for verdadeira (true), ser escrito a mensagem A soma de A com B menor do que C, e a execuo ento terminar; caso contrrio, se a expresso retornar falso (false), ser escrito a mensagem A soma de A com B maior do que C, e a execuo ento terminar. Exemplo2: Program exemplo2; Uses WinCrt; var A, B, X, Y: real; begin writeln('Digite o valor de A: '); read (A); writeln('Digite o valor de B: '); read (B); if A = B then begin X:= 1.5;
. 44

Linguagem Pascal

Y:= 2.5 end else begin X:= -1.5; Y:= -2.5 end; writeln ('O valor de X :', X:4:1); writeln ('O valor de Y :', Y:4:1); end. Observaes: Caso a instruo, a ser executada aps a avaliao da expresso booleana, seja uma instruo composta, ou seja, com mais de um comando, deve-se delimitar o bloco de comandos por begin e end. O sinal de ponto e vrgula no deve aparecer numa estrutura If-Then-Else, exceto como separador dentro de um bloco de instruo composta (entre o begin e o end). Colocar um ponto e vrgula antes da palavra reservada Else resultar num erro de compilao.

8.2 Estrutura de deciso com mltipla escolha - CASE


A estrutura CASE uma estrutura de controle condicional que permite que alguns grupos particulares de instrues (bloco de comandos) sejam escolhidos e executados dentre os vrios grupos de instrues disponveis. Exemplo utilizando a estrutura if-then: program exemplo; ... begin opcao := 0; while (opo <> 5) do begin clrscr; gotoxy(33,1); write (Menu Principal); gotoxy(28,6); write ([ 1 ] - Soma); gotoxy(28,8); write ([ 2 ] - Subtrao); gotoxy(28,10); write ([ 3 ] - Multiplicao); gotoxy(28,12); write ([ 4 ] - Diviso); gotoxy(28,14); write ([ 5 ] Fim de Programa); gotoxy(28,18); write (Escolha uma opo.....:); readln(opo); if (opo = 1) then rot_adicao; if (opo = 2) then rot_subtracao; if (opo = 3) then rot_multiplicacao; if (opo = 4) then rot_divisao; end; end. Perceba que neste exemplo o selecionamento das sub-rotinas feito com instrues if-then. Voc pode observar tambm que se voc tivesse um menu com quinze opes, devero ser definidas quinze instrues do
. 45

Linguagem Pascal

tipo if-then para verificar a escolha do operador. Esta forma pode ser simplificada com a utilizao da estrutura case-of. Syntaxe: Case <varivel> Of <opo1>: <instruo1>; <opo2>: <instruo1>; ... <opoN>: <instruoN>; Else <instruo>; End; ou Case <varivel> Of <opo1>: begin <instruo1.1>; <instruo1.2>; <instruo1.N>; end; <opo2>: begin <instruo2.1>; <instruo2.2>; <instruo2.N>; end; <opoN>: begin <instruoN.1>; <instruoN.2>; <instruoN.N>; end; Else <instruo-else>; End; Onde: Case Of-Else so palavras reservadas do Pascal. varivel o nome da varivel a ser controlada na estrutura de deciso Case-Of-Else. opo o contedo da varivel a ser verificado (lista de constantes), separadas por vrgula, cujo tipo seja o mesmo da varivel de controle da estrutura. instruo - um nico comando (bloco de instruo simples) ou um conjunto de comandos (bloco de instruo composta) que sero executados.

Observaes: A opo consite de uma ou mais constantes ou gama de valores, separadas por vrgulas. As constantes ou gama de valores da opo tem que ser do mesmo tipo da varivel de controle da estrutura Case-of-end. Instrues (bloco de comando) vazias so permitidas, para indicar que nenhuma ao deve ser tomada para certos valores. As instrues no necessitam ser nicas, isto , a mesma instruo pode ser usada com duas ou mais listas de opo do case. A instruo pode ser uma instruo simples do pascal ou uma chamada a uma rotina, por exemplo.

46

Linguagem Pascal

A instruo else s ser executada se nenhuma das opes anteriormente testadas, na estrutura case, for atendida.

Exemplo utilizando a estrutura Case-Of-End: program principal; ... begin while (opcao <> '5') do begin clrscr; gotoxy(33,1); write ('Menu Principal'); gotoxy(28,6); write ('[ 1 ] - Soma'); gotoxy(28,8); write ('[ 2 ] - Subtrao'); gotoxy(28,10); write ('[ 3 ] - Multiplicao'); gotoxy(28,12); write ('[ 4 ] - Diviso'); gotoxy(28,14); write ('[ 5 ] - Fim de Programa'); gotoxy(28,18); write ('Escolha uma opo.....:'); readln(opcao); case opcao of '1': rot_adicao; '2': rot_subtracao; '3': rot_multiplicacao; '4': rot_divisao; else writeln(' o fim do programa!'); end; end; end.

47

Linguagem Pascal

Captulo 9 Estruturas de repetio While9.1 A estrutura de repetio condicional While-Do


A estrutura de repetio While-Do utilizada para efetuar ciclos condicionais. O bloco de comando, dentro da estrutura While-Do, ser executado repetidamente, enquanto a expresso booleana se mantiver verdadeira (true). Quando isto no mais ocorrer, a repetio interrompida, e a seqncia de comandos, que vier logo aps a estrutura While-Do, passa a ser executada. Sintaxe: While <expresso> Do <bloco de comando>; Onde: While-do so palavras reservadas do pascal; expresso uma expresso booleana que retorna verdadeiro (true) ou falso (false). bloco de comando - um nico comando (bloco de instruo simples) ou um conjunto de comandos (bloco de instruo composta) que sero executados enquanto a expresso booleana for verdadeira (true).

Observaes: O bloco de comando pode ser do tipo simples ou composto, apesar de normalmente ser composto. Quando o bloco de comando for constitudo por um nico comando, o begin e o end podem ser omitidos. Quando o bloco de comando for constitudo por mais de um comando obrigatrio o begin e o end. A expresso booleana do comando While-do avaliada antes do bloco de comando ser executado. Se esta expresso retornar um valor falso (false) na primeira vez em que a expresso for avaliada, os comandos do bloco de comando no sero executados nenhuma vez.

Exemplo: Vamos supor, por exemplo, que queremos escrever os nmeros inteiros 1,2,...,20, com um inteiro em cada linha. Isso pode ser conseguido com a seguinte estrutura While-Do: Program exemplo; Uses WinCrt; var digito: integer; begin digito:= 1; while digito <= 20 do begin writeln('O ',digito,' digito :',digito); digito := digito+1; end; end. Este programa resultaria na seguinte tela:
--------------------------------------------------------O 1o digito :1 O 2o digito :2 ... . 48

Linguagem Pascal O 20o digito :20 ---------------------------------------------------------

Repeat9.2 A estrutura de repetio condicional Repeat-Until


A estrutura de repetio Repeat-Until utilizada para efetuar ciclos condicionais. O bloco de comando ser executado repetidamente, at que a expresso booleana se torne verdadeira (true). Quando isto ocorrer, a repetio interrompida, e a seqncia de comandos, que vier logo aps a estrutura Repeat-Until, passa a ser executada. Sintaxe: Repeat <instruo1>; <instruo2>; ... <instruoN> Until <expresso>; Onde: Repeat-Until so palavras reservadas do pascal; expresso uma expresso booleana que retorna verdadeiro (true) ou falso (false). instruo - um nico comando (bloco de instruo simples) ou um conjunto de comandos (bloco de instruo composta) que sero executados at que a expresso booleana se torne verdadeira (true).

Observaes: Note que nesta estrutura o bloco de comando ser sempre executado pelo menos uma vez, dado que a expresso booleana no testada no ncio e sim no fim da estrutura de repetio. A seqncia de instrues dentro da estrutura Repeat-Until no necessita ser includa dentro de um bloco Begin e End. A expresso booleana do comando Repeat-Until avaliada aps a instruo ou instrues serem executadas.

Exemplo: Vamos supor, por exemplo, que queremos escrever os nmeros inteiros 1,2,...,20, com um inteiro em cada linha. Isso pode ser conseguido com a seguinte estrutura Repeat-Until: Program exemplo; Uses WinCrt; var digito: integer; begin digito:= 1; Repeat writeln('O ',digito,' digito :',digito); digito := digito+1; Until digito > 20; end. Este programa resultaria na seguinte tela:
--------------------------------------------------------O 1o digito :1 O 2o digito :2 ... . 49

Linguagem Pascal O 20o digito :20 ---------------------------------------------------------

9.3 A estrutura de repetio incondicional For


A estrutura de repetio For utilizada para efetuar ciclos incondicionais. Isto , esta estrutura permite que uma ao seja repetida um nmero especificado de vezes. O bloco de comando ser executado repetidamente, para cada um de vrios valores consecutivos atribudos varivel de controle. O nmero de valores atribudos varivel de controle determina, portanto, o nmero de vezes que o bloco de comando executado. Sintaxe da primeira forma: For <varivel de controle> := <valor inicial> to <valor final> do <bloco de comando>; Onde: For-to-do e For-downto-do - so palavras reservadas do pascal; varivel de controle um identificador de varivel, que controlar os ciclos da estrutura For-todo; valor inicial o primeiro valor que a varivel de controle assume; valor final o valor mximo que a varivel de controle pode assumir. bloco de comando - um nico comando (bloco de instruo simples) ou um conjunto de comandos (bloco de instruo composta) que sero executados enquanto a estrutura For-to-do estiver ativa.

Observaes: Esta estrutura muito utilizada quando conhecemos de antemo o nmero de ciclos a executar. Se a varivel de controle uma varivel do tipo inteira, ento aumentar automaticamente uma unidade, cada vez que o bloco de comando da estrutura For-to-do for executado; portanto, a instruo (bloco de comando) ser executada (valor final valor inicial +1) vezes. A varivel de controle, o valor inicial e o valor final devem pertencer ao mesmo tipo predefinido (excluindo o real). A varivel de controle no pode ser alterada, por qualquer instruo, que esteja dentro do bloco de comando. A varivel de controle deve ter sido previamente declarada. O valor inicial e o valor final, caso sejam dados como expresso, so calculados uma nica vez antes da primeira execuo da estrutura For-to-do. Os valores de valor inicial e valor final podem ser expressos como constantes, variveis ou expresses. Contudo, estes valores devem ser do mesmo tipo que a varivel de controle. O valor de valor incial deve ser menor do que valor final se pretendemos que a instruo dentro da estrutura For-to-do seja executada mais de uma vez. Se valor incial for igual a valor final , a instruo ser executada somente uma vez; se valor incial for maior que valor final, a instruo no chegar a ser executada.

Exemplo: Program exemplo; Uses WinCrt; var i: integer; begin for i:= 1 to 20 do writeln('O ',i,' digito :',i); end.
. 50

Linguagem Pascal

Sintaxe da Segunda forma: For <varivel de controle> := <valor inicial> downto <valor final> do <bloco de comando>; A segunda forma da estrutura for semelhante primeira, exceto no uso da palavra reservada Downto em vez de To. A ao produzida por esta forma da estrutura For semelhante primeira forma, exceto pelo fato de que a varivel de controle decrementada. Esta varivel decrementada automaticamente de uma em uma unidade, desde o valor incial at o valor final, durante as sucessivas passagens pelo ciclo. Observaes: O valor inicial deve ser maior que o valor final se pretendemos que a instruo dentro da estrutura For-downto-do seja executada mais de uma vez. Se os dois valores forem iguais, ento a instruo ser executada uma nica vez; e se o valor inicial for menor que o valor final, ento a instruo no ser sequer executada.

Exemplo: Program exemplo; Uses WinCrt; var i: integer; begin for i:= 20 downto 1 do writeln('O ',i,' digito :',i); end. Este programa resultaria na seguinte tela:
--------------------------------------------------------O 1o digito : 20 O 2o digito : 19 ... O 20o digito :1 ---------------------------------------------------------

9.4 Labels e Goto


A instruo Goto permite desviar a seqncia de execuo do programa para um determinado Label pr-definido. Para utilizarmos algum Label, ele deve, obrigatoriamente, ser declarado na sub-rea Label, na rea de declaraes. Veja um exemplo abaixo: Program CALCULO; { Este programa demonstra como quebrar a estrutura for-to-do utilizando a instruo goto. } Uses WinCrt; label sai_do_loop; var A, B, R, i: integer;
. 51

Linguagem Pascal

resp: char; begin For i:= 1 to 5 do begin ClrScr; Write('Entre com o valor para A: '); readln(A); Write('Entre com o valor para B: '); readln(B); Writeln; R := A+B; Writeln('O resultado da soma de A com B : ',R); Writeln; Write('Deseja continuar? '); Readln(resp); if (resp <> 's') and (resp <> 'S') then Goto sai_do_loop; end; sai_do_loop: Writeln('Sa do loop for-to-do!'); end.

52

Linguagem Pascal

Captulo 10 - Estrutura de dados homogneas I


Veremos neste tpico uma tcnica de programao que permitir trabalhar com o agrupamento de vrias informaes dentro de uma mesma varivel. As variveis homogneas correspondem a posies de memria, identificadas por um nico nome, individualizadas por ndice e cujo o contedo de um mesmo tipo, e por esta razo que recebe a denominao de estrutura de dados homognea. O tipo de dado homogneo recebe diversos outros nomes, tais como: variveis indexadas, variveis compostas, variveis subscritas, arranjos, vetores, matrizes, tabelas em memria ou arrays. Vamos tratar esta estrutura simplesmente como matriz.

10.1 Matriz de uma dimenso ou vetores


Este tipo de estrutura, em particular, tambm denominado por alguns profissionais como matrizes unidimensionais, sendo que sua utilizao mais comum est vinculada criao de tabelas. Caracteriza-se por ser definida uma nica varivel dimensionada com um determinado tamanho. A dimenso de uma matriz constituda por constantes inteiras e positivas. Como j dissemos os nomes dados s matrizes seguem as mesmas regras de nomes utilizados em variveis simples. O nome dado a uma varivel composta um identificador que obedece s mesmas regras de formao de identificadores das variveis simples. Este nome refere-se, coletivamente, a todos os elementos da varivel composta. Para podermos fazer referncia a um elemento da varivel composta, necessrio colocar o nome da varivel, seguido de um ou mais ndices, entre colchetes. Exemplo 1: Supondo-se que as notas de 10 alunos estejam armazenadas em uma varivel composta, identificada por Nota, e queiramos fazer referncia ao terceiro elemento desta varivel devemos proceder assim: Nota[3] O contedo armazenado neste posio 65. O ndice a constante inteira 3. Nota 55 60
1 2

65
3

55 100 70
4 5 6

85
7

90
8

55 100
9 10

Se utilizarmos uma varivel I como ndice de Nota, tem-se a possibilidade de acesso a qualquer uma das notas armazenadas, atravs da notao Nota[I]. Exemplo 2: Vamos considerar um trecho de programa que faa a leitura de 10 notas dos alunos de uma disciplina, digitadas uma em cada linha, armazene-as na varivel composta Nota (vetor Nota) e calcule a sua mdia. Program exemplo3; . . begin for I := 1 to 10 do begin readln(Nota[I]); soma := soma+Nota[I]; end; media := soma/10; . . end.
. 53

Linguagem Pascal

Exemplo 3: Considerando o trecho de programa abaixo, podemos tambm comparar o contedo da stima posio da varivel Nota com o valor 60. Program exemplo3; . . begin if Nota[7] > 60 then . . else . . end. Podemos tambm, neste caso, utilizar uma varivel ndice: Program exemplo3; . . begin indice := 7; if Nota[indice] > 60 then . . else . . end. Exemplo 4: Considerando a varivel composta montada no exemplo 3, podemos codificar um trecho de programa que calcule e escreva o nmero de alunos com nota superior Media. Program exemplo4; . . begin quant := 0; for I := 1 to 10 do if Nota[I] > Media then Inc(quant); Writeln(Nmero de alunos c/ nota superior a mdia :,quant); . . end.

54

Linguagem Pascal

10.2 Operaes com matrizes do tipo vetor


Uma matriz de uma dimenso ou vetor representada por seu nome, tamanho (dimenso) entre colchetes e seu tipo, tendo assim, a seguinte sintaxe: <lista de identificadores> : array[li..ls] of <tipo de dado>; Onde: lista de identificadores so nomes atribudos s variveis que se deseja declarar. array-of so palavras-chave. li o limite inferior do intervalo de variao do ndice, que define a dimenso da varivel. ls o limite superior do intervalo de variao do ndice, que define a dimenso da varivel. tipo de dado o tipo de dado dos elementos da varivel.

Observaes:

As regras para a formao dos identificadores das variveis compostas so as mesmas que a dos identificadores das variveis simples. O tipo de dado dos elementos da varivel pode ser qualquer tipo de dado vlido no pascal. O ndice da varivel, li e ls, deve ser do tipo ordinal: inteiro, caracter, booleano, enumerado ou uma gama de valores. Quando acessamos os elementos individuais das variveis compostas o valor do ndice pode ser expresso como uma constante, uma varivel ou uma expresso. Contudo o valor do ndice deve ser do tipo correto e deve estar dentro do intervalo correto. Os elementos individuais da varivel do tipo vetor podem ser usados em expresses, instrues de atribuio, instrues read e write, etc., como se fossem variveis de tipo simples.

Exemplo 1: Vamos observar o programa a seguir. Este programa efetua a leitura de dez elementos de uma matriz A tipo vetor e em seguida constroi uma matriz B de mesmo tipo, acompanhando a seguinte lei de formao: se o valor do ndice for par, o valor dever ser multiplicado por 5; sendo mpar, dever ser somado com 5. Ao final, mostrar os contedos das duas matrizes. Este exemplo demonstra como fazer o tratamento da condio do ndice. program check_indice; Uses WinCrt; var A, B : array[1..10] of integer; I : integer; begin writeln('Clculo com checagem do indice da matriz'); writeln; { Entrada dos Dados } for I := 1 to 10 do begin write('Informe o ', I:2,' o. valor: '); readln(A[I]); end; { Processamento Par ou mpar } for I := 1 to 10 do begin if (I mod 2 = 0) then
. 55

Linguagem Pascal

B[I] := A[I]*5 else B[I] := A[I]+5; end; writeln; { Apresentao das Matrizes} for I := 1 to 10 do writeln('A[',I:2,'] = ',A[I]:2,' ', 'B[',I:2,'] = ',B[I]:2); writeln; writeln('Tecle <ENTER> para encerrar...'); readkey; end. Este programa resultaria na seguinte tela:
---------------------------------------------------------

Clculo com checagem do indice da matriz Informe Informe Informe ... Informe A[ 1] A[ 2] A[ 3] ... A[ 1] o o o 1 o. valor: 10 2 o. valor: 10 3 o. valor: 10

o 10 o. valor: 10 B[ 1] = 15 B[ 2] = 50 B[ 3] = 15 B[10] = 50

= 10 = 10 = 10 = 10

Tecle <ENTER> para encerrar...


---------------------------------------------------------

No programa acima, so utilizados trs loopings do tipo for: o primeiro looping controla a entrada dos dados na matriz A, o segundo looping verifica se cada elemento da matriz A par ou mpar e faz as operaes de soma ou multiplicao atribuindo o resultado na matriz B, e o terceiro looping utilizado para apresentar as duas matrizes.

56

Linguagem Pascal

10.3 Classificao dos elementos de uma matriz do tipo vetor


Em algumas situaes seria bastante til, que antes de apresentar os dados de uma matriz, pudssemos efetuar a classificao desses dados, colocando-os em uma ordem qualquer (alfabtica, numrica, etc.). Aps a insero dos dados numa matriz do tipo vetor, podemos ordenar (classificar) os seus elementos sejam eles do tipo numrico ou alfabtico , de forma que todos esses elementos, aps a ordenao estaro em uma ordem particular. Isso muito til, pois assim poderemos mostrar todos os seus elementos em ordem, independentemente daquela em que foram inseridos na matriz, facilitando desta forma a localizao de algum elemento, quando for efetuada uma pesquisa visual. Imagine ento colocar em ordem crescente cinco valores numricos armazenados numa matriz A, e em seguida apresent-los. Vejamos a tabela a seguir: Matiz A ndice 1 2 3 4 5 Elemento 9 7 5 3 1

Os valores esto armazenados na ordem: 9, 7, 5, 3 e 1 e devero ser apresentados na ordem 1, 3, 5, 7 e 9. A tabela acima, no formato matricial, ficaria assim: A[1] = 9, A[2] = 7, A[3] = 5, A[4] = 3, A[5] = 1. Para efetuar o processo de troca necessrio aplicar o mtodo de propriedade distributiva: a) o elemento que estiver em A[1] dever ser comparado com os elementos que estiverem em A[2], A[3], A[4] e A[5]. b) depois o elemento que estiver em A[2] no necessita ser comparado com o elemento que estiver em A[1], pois j foram anteriormente comparados, passando a ser comparado somente com os elementos que estiverem em A[3], A[4] e A[5]. c) na seqncia, o elemento que estiver em A[3] comparado com os elementos que estiverem em A[4] e A[5] e por fim, d) o elemento que estiver em A[4] comparado apenas com o elemento que estiver em A[5]. Seguindo este conceito faz-se a troca dos elementos desta forma: a) basta comparar o valor do elemento armazenado em A[1] com o valor do elemento armazenado em A[2]. Se o primeiro for maior que o segundo, ento trocam-se os seus valores. Podemos observar na tabela acima que a condio verdadeira e assim o elemento 9 de A[1] maior que o elemento 8 de A[2], passa-se para A[1] o elemento 8 e para A[2] passa-se o elemento 9. b) desta forma passa-se a fazer as trocas sucessivas at que se alcance o ltimo elemento da matriz, ou seja, a comparao entre o valor armazenado em A[4] com o valor de A[5] . Observao: Este procedimento de troca ser o mesmo para dados do tipo caracter (char ou string), uma vez que cada letra possui um valor diferente da outra. A letra A, por exemplo, tem valor menor que a letra B, e assim por diante. Se a letra A maiscula for comparada com a letra a minscula, estas tero valores diferentes. O processo de ordenao para caracteres no Pascal baseado no uso da tabela ASCII (American Standard Code for Information Interchange Cdigo Americano para Troca de Informaes).
. 57

Linguagem Pascal

10.3.1O programa de ordenao


Veja abaixo o codificao de ordenao no programa. Observe o detalhe das estruturas for-to-do encadeadas. Program Ordena_Matriz; Uses WinCrt; var nomes : array[1..10] of string; i, j : integer; nome, temp : string; resp : char; begin resp := 'S'; while (Upcase(resp) = 'S') do begin ClrScr; writeln('Classifica Nomes em Ordem Crescente'); writeln('==================================='); {*** Entrada dos nomes na matriz ***} for i:= 1 to 5 do begin write('Digite o ',i:2,' nome...> ');readln(nomes[i]); end; {*** A Rotina de Ordenao/Classificao ***} for i:= 1 to 4 do for j := i+1 to 5 do {*** a troca dos elementos comea aqui ***} if (nomes[i] > nomes[j]) then begin temp := nomes[i]; nomes[i] := nomes[j]; nomes[j] := temp; end; {*** Mostra os Valores Classificados ***} writeln; writeln('Os Nomes Ordenados Alfabticamente');writeln; writeln(' i Nome '); writeln('============================='); for i:= 1 to 5 do writeln(i:2,' ',nomes[i]); writeln; write('Deseja Digitar Outros Valores?(S/N)'); readln(resp); end; donewincrt; end.

58

Linguagem Pascal

Observaes: importante observar que no caso do encadeamento das estrutura for-to-do, ser executado primeiro a rotina mais interna, no caso a rotina de contagem da varivel J, passando o processamento para a rotina mais externa, quando a rotina mais interna fechar o seu ciclo. O segundo ponto a se observar a utilizao de uma segunda varivel no processo de ordenao, no caso , a varivel J. Observe que somente quando a varivel J atinge o valor 5 que este looping se encerra, retornando ao looping da varivel I, acrescentando mais um em I at que I atinja o seu limite e ambos os loopings sejam encerrados. Veja abaixo o quadro que mostra o comportamento dos valores das variveis I e J durante o processo de ordenao: Comportamento de I e J Quando I for J ser 1 2, 3, 4, 5 2 3, 4, 5 3 4, 5 4 5

10.3.2 A troca dos elementos


A troca dos elementos de posio efetuada pelo algoritmo de troca mostrado abaixo: if (nomes[i] > nomes[j]) then begin temp := nomes[i]; nomes[i] := nomes[j]; nomes[j] := temp; end; Considere o vetor NOMES[I] com o valor CARLOS e o vetor NOMES[J] com o valor ALBERTO. Ao final, NOMES[I] dever estar com a informao ALBERTO e NOMES[J] dever estar com CARLOS. Para se conseguir esta troca necessrio a utilizao de uma varivel de apoio, a qual ser chamada TEMP. Para que o vetor NOMES[I] fique livre para receber o valor do vetor NOMES[J], TEMP dever receber o valor do vetor NOMES[I], assim sendo TEMP passa a ter o valor CARLOS. Neste momento, pode-se atribuir ao vetor NOMES[I] o valor do vetor NOMES[J]. Assim o vetor NOMES[I] passa a possuir o valor ALBERTO. Em seguida atribui-se ao vetor NOMES[J] o valor da varivel TEMP. Ao final deste processo, teremos os valores trocados, sendo o vetor NOMES[I] com o valor ALBERTO e NOMES[J] com o valor CARLOS.

59

Linguagem Pascal

10.4 Pesquisa em matrizes


A utilizao de matrizes em Pascal poder gerar grandes tabelas onde tornaria difcil localizar um determinado elemento na matriz de forma rpida. Imagine uma matriz possuindo 5000 elementos (5000 nomes de pessoas). Voc dificilmente conseguiria encontrar rapidamente um elemento desejado de forma manual (visual), mesmo que esta lista de nomes estivesse em ordem alfabtica. Para solucionar este tipo de problema no Pascal, voc poder atravs do uso da programao, fazer pesquisa em matrizes. Existem dois mtodos para pesquisa em matrizes: o mtodo da Pesquisa Seqncial e o mtodo da Pesquisa Binria.

seqencial 10.4.1 A pesquisa seqencial


Este mtodo consiste em efetuar a busca da informao desejada, a partir do primeiro elemento da matriz , seqencialmente, at o ltimo elemento. Encontrando a informao procurada, esta apresentada. Este mtodo de pesquisa lento em relao ao mtodo de pesquisa binria, porm eficiente nos casos em que uma matriz encontra-se com seus elementos desordenados. Veja abaixo um programa que efetua uma pesquisa seqencial numa matriz de dez elementos do tipo string: Program Pesquisa_Sequencial; Uses WinCrt; var nomes : array[1..10] of string; i : integer; nome : string; resp : char; achou : boolean; begin writeln('Pesquisa Seqencial de Nomes'); writeln('============================'); {*** Entrada dos nomes na matriz ***} for i:= 1 to 10 do begin write('Digite o ',i:2,' nome...> ');readln(nomes[i]); end; {*** A Rotina de Pesquisa na Matriz ***} resp := 'S'; while (Upcase(resp) = 'S') do begin writeln; write('Digite o nome a ser pesquisado: ');readln(nome); i := 1; achou := false; while (i <= 10) and (achou=false) do if (nomes[i] = nome) then achou := true else Inc(i); writeln; if (achou = true) then writeln(nome,' foi localizado na posio ',i:2,' !')
. 60

Linguagem Pascal

else writeln(nome,' no foi localizado!'); writeln; write('Deseja Continuar a Pesquisa? (S/N) '); readln(resp); end; donewincrt; end. Analisando o trecho da pesquisa seqencial: Primeiro solicitado ao usurio a digitao do nome a ser pesquisado. Este nome atribudo ento varivel NOME. varivel I (varivel contadora do ndice) ento atribudo o valor 1 (ndice 1) e varivel ACHOU atribudo o valor falso (false). Isto necessrio para que a expresso da instruo while (i <= 10) and (achou=false) do seja validada no seu primeiro teste da condio. As instrues que se encontram dentro da estrutura while-do sero executadas enquanto o valor da varivel I for menor ou igual a 10 e simultaneamente o valor da varivel ACHOU for igual a falso (false). A estrutura if-then-else, localizada dentro da estrutura While-do citada acima, verifica se o valor digitado pelo usurio e atribudo varivel NOME igual ao valor do elemento da varivel indexada NOMES[I] (i variando de 1 at 10). Se o valor da varivel NOME for diferente do valor do elemento da varivel indexada NOMES[I] a varivel I ser incrementada em 1. Ser executada a prxima verificao de NOME com NOMES[I], e assim por diante. Caso seja igual, a varivel ACHOU passa a ter o valor verdadeiro (true), indicando que o nome procurado foi encontrado. Assim o fluxo de execuo do programa desviado para fora da estrutura whiledo e o programa informar ao usurio, atravs de uma mensagem, que o valor procurado foi encontrado. Caso o processamento das instrues da estrutura while-do (while (i <= 10) and (achou=false) do) chege ao seu final sem encontrar uma equivalncia entre a varivel NOME e a varivel NOMES[I], a varivel ACHOU permanece com o valor falso. Assim o programa ir informar ao usurio, atravs de uma mensagem, que o valor procurado no foi encontrado. Observe que a varivel ACHOU exerce um papel importante dentro da rotina de pesquisa, pois esta serve como um piv, estabelecendo um valor verdadeiro quando uma determinada informao localizada. Este tipo de tratamento de varivel conhecido como FLAG (Bandeira). A varivel ACHOU o flag, podendo-se dizer que ao comear a rotina a bandeira estava abaixada falsa, e quando a informao foi encontrada, a bandeira foi levantada verdadeira, indicando a localio da informao desejada.

61

Linguagem Pascal

Captulo 11 Estruturas de dados homogneas II 11.1 Matriz multidimensional ou arrays


Vimos anteriormente a utilizao de variveis indexadas (matrizes) do tipo vetor, ou seja, as matrizes de uma s dimenso. Voc aprendeu a trabalhar com a classificao dos seus elementos e a efetuar pesquisa dentro de sua estrutura. Podemos dizer que, o conjunto de dados referenciados por um nome e que necessite de mais de um ndice para ter seus elementos individualizados chamado de matriz multidimensional.

11.2 Matriz bidimensional (duas dimenses)


Uma matriz bidimensional (de duas dimenses) estar sempre fazendo referncia a linhas e colunas e ser representada por seu nome e seu tamanho (dimenso) entre colchetes . Abaixo podemos ver uma matriz de duas dimenses chamada TABELA. Colunas

Linhas

1 1 2 3 4 5

6 Posio 2,3

A matriz TABELA com duas dimenses. 5 linhas e 6 colunas (TABELA[1..5,1..6]).

Observando a matriz TABELA de duas dimenses acima podemos concluir: a) o seu nome, obviamente, TABELA; b) esta matriz possui duas dimenses (linhas e colunas): TABELA[1..5,1..6] ; c) esta matriz possui o tamanho de 5 linhas (de 1 a 5) e 6 colunas (de 1 a 6), ou seja, uma matriz de 5 por 6 e, d) nesta matriz podero ser armazenados at 30 elementos (5x6=30). Em matrizes bidimensionais, assim como em matrizes de uma s dimenso, os seus elementos sero tambm manipulados (acessados) de forma individualizada, sendo a referncia a esses elementos feita sempre atravs de dois ndices: convenciona-se que o primeiro ndice indica a linha da matriz e o segundo ndice indica a coluna. Assim, TABELA[2,3] indica que est sendo feita uma referncia ao elemento armazenado na linha 2 coluna 3 da matriz. Quando manipulamos uma matriz do tipo vetor utilizamos uma nica estrutura de repetio (um for-todo por exemplo) para acessarmos os seus elementos individuais. No caso de matrizes com mais de uma dimenso, dever ser utilizado tantas estruturas de repetio quantas forem as suas dimenses. Para uma matriz de duas dimenses, por exemplo, deveremos utilizar duas estruturas de repetio encadeadas para que possamos acessar todos os seus elementos. Uma matriz de duas dimenses representada por seu nome, tamanho (dimenso de linhas e colunas) entre colchetes e o seu tipo, tendo assim, a seguinte sintaxe: <lista de identificadores> : array[li1..ls1,li2..ls2] of <tipo de dado>; Onde:
.

lista de identificadores so nomes atribudos s variveis que se deseja declarar.


62

Linguagem Pascal

array-of so palavras-chave. li1 o limite inferior do intervalo de variao do ndice, que define a dimenso da linha varivel. ls1 o limite superior do intervalo de variao do ndice, que define a dimenso da linha varivel. li2 o limite inferior do intervalo de variao do ndice, que define a dimenso da coluna varivel. ls2 o limite superior do intervalo de variao do ndice, que define a dimenso da coluna varivel. tipo de dado o tipo de dado dos elementos da varivel.

da da da da

Observaes:

As regras para a formao dos identificadores das variveis compostas so as mesmas que a dos identificadores das variveis simples. O tipo de dado dos elementos da varivel pode ser qualquer tipo de dado vlido no pascal. O ndice da varivel, li1, ls1, li2 e ls2 deve ser do tipo ordinal (inteiro, caracter, booleano ou enumerado) ou uma gama de valores. Quando acessamos os elementos individuais das variveis compostas o valor do ndice pode ser expresso como uma constante, uma varivel ou uma expresso. Contudo o valor do ndice deve ser do tipo correto e deve estar dentro do intervalo correto. Os elementos individuais da varivel do tipo vetor podem ser usados em expresses, instrues de atribuio, instrues read e write, etc., como se fossem variveis de tipo simples.

Exemplo 1: Declarar a varivel composta (varivel bidimensional) MatrizA, de 4 linhas por 3 colunas, constituda de valores numricos reais. Var MatrizA : array[1..4,1..3] of real; Esta declarao cria uma estrutura de dados agrupados com o nome de MatrizA, com 4 x 3 = 12 elementos reais, endereveis por um par de ndices, com o primeiro deles indicando a linha e o outro indicando a coluna. Exemplo 2: Declarar a varivel composta (varivel bidimensional) MatrizB, de 5 linhas por 5 colunas, constituda de valores caracteres do tipo string. Var MatrizB : array[1..5,1..5] of string; Esta declarao cria uma estrutura de dados agrupados com o nome de MatrizB, com 5 x 5 = 25 elementos string, endereveis por um par de ndices, com o primeiro deles indicando a linha e o outro indicando a coluna. Exemplo 3: Exemplificando a utilizao de matrizes bidimensionais, vamos considerar o programa de entrada e sada de notas escolares de alunos . Assim como na leitura e escrita de uma matriz de uma dimenso, as operaes de entrada e sada com matrizes de duas dimenses processada passo a passo. Vamos considerar a manipulao de quatro notas de oito alunos. A tabela em questo (matriz) armazenar ento trinta e dois elementos (4x8=32). Um detalhe importante a ser considerado a utilizao de duas variveis para controlar os dois ndices de posicionamento de dados na tabela. Vejamos o programa abaixo.
. 63

Linguagem Pascal

Program Nota_aluno; Uses WinCrt; var Notas : array[1..8,1..4] of real; i,j : integer; resp: char; begin resp := 'S'; while (UpCase(resp)='S') do begin {Estrutura for-to-do encadeada - leitura das notas} for i:= 1 to 8 do {linha - alunos} begin clrscr; writeln('Leitura das Notas dos Alunos'); writeln('============================'); writeln('Entre com as notas do ',i:2,' aluno'); writeln; for j:= 1 to 4 do {coluna - notas} begin write('Digite a ',j:2,'a. nota: '); readln(Notas[i,j]); end; end; {Estrutura for-to-do encadeada-apresentao das notas} for i:= 1 to 8 do begin clrscr; writeln('Apresentao das Notas dos Alunos'); writeln('================================='); writeln; writeln('As notas do ',i:2,' aluno'); writeln; for j:= 1 to 4 do begin writeln(j:2,' a. Nota : ',Notas[i,j]:5:2); end; writeln; write('Tecle algo para ver as notas do prximo aluno...'); readkey; end; writeln; write('Deseja Continuar? (S/N) '); readln(resp); end; end. Analisando o trecho do programa acima, onde feita a leitura das notas dos alunos, podemos observar que foi utilizada a varivel I para controlar as posies dos elementos, a nvel de linha (alunos), dentro da matriz. Podemos observar tambm que foi utilizada a varivel J para controlar as posies dos elementos, a nvel de coluna (notas dos alunos). Observando o programa podemos verificar tambm que as variveis I e J so inicializadas com 1, ou seja, a leitura ou a apresentao, ser iniciada na primeira linha da primeira coluna da matriz. Assim sendo, ser ento digitada para o primeiro aluno a sua primeira nota, ou seja, aluno 1, nota 1. Logo em seguida ser
. 64

Linguagem Pascal

incrementado mais 1 varivel J, varivel que controla as posies da coluna (notas), passando ento para a posio Notas[1,2], ou seja, aluno 1, nota 2. Quando o contador de coluna, a varivel J, atingir o valor 4, a estrutura for-to-do ser ento encerrada. Em seguida o contador de linha, a varivel I, ser incrementado em 1, tornando-se 2. Ser ento inicializado novamente o contador J em 1, permitindo assim, que seja, digitado a nota 1 do aluno 2 (Notas[2,1]). A entrada dos dados estende-se- at que o valor do contador de linhas (varivel I) atinja o seu ltimo valor, no caso, 8. Esta estrutura for I:= 1 to 8 do tem a funo de controlar o posicionamento na tabela por aluno. A outra estrutura mais interna for J:= 1 to 4 do, controla o posicionamento das notas. Este programa resultaria na seguinte tela: Primeira tela - l as quatro notas dos oito alunos.
---------------------------------------------------------

Leitura das Notas dos Alunos ============================ Entre com as notas do 1 aluno Digite Digite Digite Digite a a a a 1a. 2a. 3a. 4a. nota: nota: nota: nota:

---------------------------------------------------------

Segunda tela - mostra as quatro notas dos oito alunos.


---------------------------------------------------------

Apresentao das Notas dos Alunos ================================= As notas do 1 aluno 1a. 2a. 3a. 4a. Nota Nota Nota Nota : : : :

Tecle algo para ver as notas do prximo aluno...


---------------------------------------------------------

11.3 Ordenao em matrizes de duas dimenses


O processo de ordenao de elementos de matrizes de duas dimenses o mesmo utilizado para ordenar matrizes de uma dimenso. Vamos ento, considerar um programa que cadastre o nome, endereo, cep, bairro e telefone de dez pessoas e ao final tenha que apresentar os seus elementos dispostos em ordem alfabtica, pelo nome da pessoa, independentemente da forma em que foram digitados. Veja abaixo a matriz AGENDA: Dados Pessoais Endereo CEP

Pessoas

1 2 3 4 ... 10

Nome Joo Andrea ... ... ... ...

Bairro

Telefone

65

Linguagem Pascal

Aps o cadastramento de todos os elementos na matriz AGENDA, ser iniciado o processo de classificao alfabtica pelo nome de cada pessoa. Este mtodo j foi anteriormente estudado. o mesmo processo de ordenao utilizado em matrizes de uma s dimenso. Aps a comparao do primeiro nome com o segundo por exemplo, sendo o primeiro maior que o segundo, estes devero ser trocados. importante observar que alm de trocar os nomes de posio, ou seja, o contedo de AGENDA[1,1] passa para a posio AGENDA [2,1] e o elemento de AGENDA [2,1] passa para a posio AGENDA [1,1], trocase tambm todos os elementos relacionados ao nome (o endereo, o cep, o bairro e o telefone). Veja abaixo a rotina de troca do nome e demais elementos relacionados a ele na mesma linha. {*** Rotina de entrada ***} ... {*** Ordenao e troca de elementos ***} for atual := 1 to 9 do for proximo := atual+1 to 10 do if (AGENDA[atual,1] > AGENDA[proximo,1]) then begin {troca do nome} temp := AGENDA[atual,1] AGENDA[atual,1] := AGENDA[proximo,1]; AGENDA[proximo,1]:= temp; {troca do endereo} temp := AGENDA[atual,2] AGENDA[atual,2] := AGENDA[proximo,2]; AGENDA[proximo,2]:= temp; {troca do cep} temp := AGENDA[atual,3] AGENDA[atual,3] := AGENDA[proximo,3]; AGENDA[proximo,3]:= temp; {troca do bairro} temp := AGENDA[atual,4] AGENDA[atual,4] := AGENDA[proximo,4]; AGENDA[proximo,4]:= temp; {troca do telefone} temp := AGENDA[atual,5] AGENDA[atual,5] := AGENDA[proximo,5]; AGENDA[proximo,5]:= temp; end; ... {*** Rotina de sada ***}

66

Linguagem Pascal

Captulo 12 - Estruturas de dados heterogneas


Anteriormente estudamos a utilizao de matrizes, um tipo de dados estruturado em que todos os elementos devem ser do mesmo tipo. Voc notou que somente foi possvel trabalhar com um tipo de dado por matriz. Em situaes onde se precisou trabalhar com mais de um tipo de dado diferente, se fez necessria a utilizao de duas matrizes, uma de cada tipo.

12.1 Registros
O Registro a principal estrutura de dados, cujos os elementos constituintes no necessitam ser do mesmo tipo. Podemos, desta forma, nos referir coletivamente a um conjunto de elementos que diferem entre si no seu tipo. Aos elementos individuais dessa estrutura damos o nome de campos do registro. Pelo fato de podermos trabalhar com os vrios dados de tipos diferentes (os campos) em uma mesma estrutura, este tipo de dado considerado heterogneo. A forma mais fcil de se definir um registro incluir a definio como parte de uma declarao de varivel. Isto nos permite declarar uma varivel individual do tipo registro, tal como declaramos variveis de tipo simples ou variveis do tipo array. Veja abaixo a sintaxe. Sintaxe Primeira Forma: Var <identificador> : record <campo 1: tipo>; <campo 2: tipo>; ... <campo n: tipo> end; Onde: Var, Record e End so palavras reservadas do Pascal. Identificador o nome da varivel do tipo registro que se deseja declarar; Campo representam as variveis que sero usadas como campos do registro. Tipo so os tipos das variveis (campos) e podem ser: real, integer, boolean, string entre outros existentes no Pascal. Observaes: Cada declarao de campo escrita seguindo as mesmas regras de declarao de variveis no Pascal. Alm dos tipos simples, vlidos no Pascal, os campos do registro podem ser outro tipo definido pelo usurio ou um outro registro previamente declarado.

Exemplo: Suponha que um registro de funcionrio de uma empresa consista na sua matrcula do tipo inteiro, no seu nome do tipo literal, na sua conta bancria do tipo real e no seu cargo do tipo literal. Representamos este registro como uma varivel do tipo registro chamada reg_funcionario. A declarao da varivel mostrada abaixo. Var reg_funcionario : record matricula : integer; nome : string[30]; conta : real; cargo : string[10]; end;

67

Linguagem Pascal

Outra maneira de definir um registro, que freqentemente mais utilizada do que a simples declarao de varivel a definio de um tipo registro. Assim, as variveis individuais podero ser declaradas como sendo deste tipo previamente declarado. Neste caso um tipo registro declarado em Pascal com a instruo type em conjunto com a instruo record. Veja abaixo a sintaxe. Sintaxe Segunda Forma: Type <identificador> = record <campo 1: tipo>; <campo 2: tipo>; ... <campo n: tipo> end; Var <identificador> : <tipo>; Onde: Type, Record e End so palavras reservadas do Pascal. Identificador na declarao Type o nome do tipo registro que se deseja declarar. Na declarao Var o nome da varivel que ser declarada como tipo registro; Campo representam as variveis que sero usadas como campos do registro. Tipo na declarao Type so os tipos das variveis (campos) e podem ser: real, integer, boolean, string entre outros existentes no Pascal. Na declarao Var refere-se ao tipo registro previamente declarado. Observe que aps a declarao do tipo registro (declarao Type) voc poder ento declarar as novas variveis individuais como sendo deste tipo declarado. Vale lembrar que a declarao acima tem o mesmo resultado que a declarao de varivel mostrada na primeira forma de declarao. Esta abordagem , contudo, mais geral, porque nos permite declarar variveis registro adicionais (com a mesma composio) medida que se faz necessrio. Observaes: Note que neste caso, os tipos registro devem ser declarados antes das declaraes das variveis do tipo registro, pois bastante comum ocorrer a necessidade de se declarar uma varivel com o tipo de registro previamente declarado. Cada declarao de campo escrita seguindo as mesmas regras de declarao de variveis no Pascal. Alm dos tipos simples, vlidos no pascal, os campos do registro podem ser outro tipo definido pelo usurio ou um outro registro previamente declarado.

Exemplo: Vamos utilizar o mesmo exemplo utilizado anteriormente do registro de funcionrio de uma empresa. A declarao da varivel mostrada abaixo. Type reg_funcionario = record matricula : integer; nome : string[30]; conta : real; cargo : string[10]; end; Var funcionario : reg_funcionario;

68

Linguagem Pascal

Observe que primeiro declaramos um o registro lgico chamado reg_funcionrio e logo em seguida declaramos a varivel funcionrio do tipo reg_funcionrio. O registro reg_funcionrio um conjunto de dados heterogneos (um campo integer, um campo real e dois campos string).

12.2 Fazendo referncia a um componente do registro


A referncia ao contedo de um componente (campo) do registro indicado pela notao: <nome da varivel do tipo registro>.<identificador do campo> Tanto a leitura quanto a escrita de um registro so efetuadas respectivamente com as instrues read/readln e write/writeln seguidas do nome da varivel do tipo registro e de seu campo correspondente separado por um caracter . (ponto), como exemplificado a seguir: Type reg_funcionario = record matricula : integer; nome : string[30]; conta : real; cargo : string[10]; end; Var funcionario : reg_funcionario; begin ... write(Informe o nome do funcionrio....: ); readln(funcionario.nome); ... end. A instruo readln(funcionario.nome) atribui o valor digitado pelo usurio ao campo nome da varivel funcionrio, que do tipo reg_funcionario.

12.3 Conjunto de registros


Com as tcnicas de programao expostas at este momento, passou-se a ter uma mobilidade bastante grande, podendo-se trabalhar de uma forma mais adequada com diversos problemas, principalmente os que envolvem a utilizao de dados heterogneos, facilitando a construo de programas mais eficientes. Porm os programas apresentados at aqui com a utilizao de registros, s fizeram meno leitura e escrita de um nico registro. Seria muito til poder construir um programa que permitisse trabalhar com vrios registros de alunos. Para exemplificar considere que voc dever fazer um programa que faa a entrada e a sada de nome e nota de oito alunos. Veja abaixo a definio do tipo registro e tambm a definio da matriz de registros para os oito alunos: Program cadastro_alunos; Uses WinCrt; {*** declarao do tipo reg_aluno ***} Type bimestre = array[1..4] of real; reg_aluno = record nome: string[20]; nota: bimestre; end;

69

Linguagem Pascal

{*** declarao do conjunto de registros aluno ***} Var aluno : array[1..8] of reg_aluno; ... Observe que a declarao VAR, declara uma varivel de registro chamada ALUNO, sendo esta um conjunto de oito registros (array[1..8]) do tipo reg_aluno, que por sua vez formado por dois tipos de dados: o nome (nome do aluno) como caractere e a nota (quatro notas do aluno) como bimestre.

i12.4 Fazendo referncia ao i-simo elemento do conjunto


A referncia ao i-simo elemento ou registro do conjunto feita pela seguinte notao: <identificador da varivel tipo registro [i]>.<identificador do campo> Podemos observar, que no programa cadastro_alunos mostrado abaixo, algumas instrues fazem referncia a campos dos i-simos elementos do conjunto (varivel ALUNO). Veja alguns exemplos: a) Na instruo readln(aluno[i].nome); ALUNO[I].NOME refere-se ao campo nome do i-simo elemento do conjunto de alunos (varivel ALUNO). Assim ALUNO[2].NOME estar fazendo referncia ao campo nome do segundo aluno do conjunto de registro alunos. b) Na instruo readln(aluno[i].nota[j]); ALUNO[I].NOTA[J] refere-se ao j-simo elemento do campo nota do i-simo elemento do conjunto de alunos (varivel ALUNO). Assim ALUNO[2].NOTA[1] refere-se primeira nota do segundo aluno do conjunto de registro alunos. Veja abaixo o programa completo que nos permite trabalhar com vrios registros de alunos. Este programa dever receber a entrada do nome e notas (quatro notas) de oito alunos e ao final mostrar os nomes e as notas dos mesmos. Program cadastro_alunos; Uses WinCrt; Type notas = array[1..4] of real; reg_aluno = record nome : string[20]; nota : notas end; Var aluno : array[1..8] of reg_aluno; i,j : byte; resp : char; begin resp := 'S'; while (UpCase(resp)='S') do begin {*** Cadastramento - 8 alunos com 4 notas cada***} for i := 1 to 8 do {linha - alunos} begin clrscr; writeln(Leitura das Notas dos Alunos'); writeln('============================'); writeln; write('Informe o nome do ',i:2,' aluno...: '); readln(aluno[i].nome);
. 70

Linguagem Pascal

writeln; for j := 1 to 4 do {coluna - notas} begin write('Informe a',j:2,'a. nota.........: '); readln(aluno[i].nota[j]); end; end; {*** Apresentao - 8 alunos com 4 notas cada***} for i := 1 to 8 do begin clrscr; writeln('Apresentao das Notas dos Alunos'); writeln('================================='); writeln; writeln('Aluno : ',aluno[i].nome); writeln; for j := 1 to 4 do writeln('Nota ',j:2,'......: ' ,aluno[i].nota[j]:5:2); writeln; write('Tecle <ENTER> para ver as notas do prximo aluno...'); readln; end; writeln; write('Deseja Continuar? (S/N) '); readln(resp); end; donewincrt; end. Este programa resultaria na seguinte tela: Primeira tela - l as quatro notas dos oito alunos.
---------------------------------------------------------

Leitura das Notas dos Alunos ============================ Informe o nome do 1 aluno...: XXXXXXXXXXXXXXXXXXXX Digite Digite Digite Digite a a a a 1a. 2a. 3a. 4a. nota: nota: nota: nota: 99.99 99.99 99.99 99.99

---------------------------------------------------------

Segunda tela - mostra as quatro notas dos oito alunos.


---------------------------------------------------------

Apresentao das Notas dos Alunos ================================= Aluno : XXXXXXXXXXXXXXXXXXXX 1a. 2a. 3a. 4a. Nota Nota Nota Nota : : : : 99.99 99.99 99.99 99.99

Tecle <ENTER> para ver as notas do prximo aluno...


--------------------------------------------------------. 71

Linguagem Pascal

Captulo 13 - Arquivos
J estudamos os conceitos de tabelas em memria (memria RAM) atravs da utilizao de VETORES e MATRIZES. Estudamos tambm o conceito de utilizao do tipo definido REGISTRO. Estes conceitos vistos anteriormente formaram a base para a utilizao de um arquivo, pois um arquivo na verdade uma estrutura de dados (tabela de informaes) gravada em um meio magntico como disquetes, discos rgidos ou fitas magnticas. As matrizes e os vetores so manipuladas atravs de um ndice de controle ao passo que os arquivos so manipulados por um ponteiro de registro. Os arquivos so usados principalmente em dois casos: a) Quando necessitamos armazenar as informaes permanentemente. O contedo da memria principal do computador se perde, quando se executa outro programa ou quando se desliga o computador, entretanto as informaes armazenadas em um meio magntico ficam guardadas permanentemente, podendo ser utilizadas a qualquer momento. b) Quando as informaes so muito numerosas para caber memria principal do computador. Utilizando arquivos podemos armazenar um nmero maior de informaes (registros) do que em uma tabela em memria, estando apenas limitado ao tamanho do meio fsico utilizado para a sua gravao.

13.1 Formas de acesso a um arquivo


Os arquivos criados em meio de armazenamento magntico podero ter os seus registros acessados para leitura e/ou gravao de trs formas: na forma seqencial, direta ou indexada. Para o propsito deste curso iremos nos ater apenas a forma de acesso direto.

13.1.1 13.1.1 O acesso seqencial


Em um arquivo de acesso seqencial o processo de leitura e gravao feito de forma contnua, um registro aps o outro. Assim, quando queremos gravar um novo registro necessrio percorrer todo o arquivo, passando por todos os registros, at localizar a primeira posio vazia aps o ltimo registro. Acontece o mesmo no processo de leitura. Se o registro a ser lido o ltimo, por exemplo, ser necessrio a leitura de todos os registros que o antecedem.

13.1.2 O acesso direto ou randmico


O acesso direto permite o acesso imediato a cada um dos registros, desde que se conhea a sua posio no arquivo. Este acesso ocorre atravs de um campo chave previamente definido. Este campo chave utilizado para estabelecer o campo de um registro que ser utilizado no processo de localizao de todo um registro dentro de um arquivo. Assim, ser possvel acessar um determinado registro diretamente, sem nos preocuparmos com os registros que o antecedem. As operaes de leitura e gravao em um arquivo de acesso seqencial ocorrem atravs do apontamento de um indicador de registro (o ponteiro do arquivo), que avana a cada operao executada, do primeiro at ao ltimo registro do arquivo. Este ponteiro do arquivo similar ao ndice de uma tabela em memria. No caso de arquivos de acesso direto este ponteiro ser movimentado para qualquer posio do arquivo, atravs da procedure seek.

13.2 Arquivo com tipo definido de registro


A manipulao de um arquivo em Pascal ocorrer com a definio do tipo file , o qual se caracteriza por ser uma estrutura formada por elementos do mesmo tipo dispostos de forma seqencial. Esta estrutura tem a finalidade de fazer a comunicao entre a memria principal (memria RAM) e a memria secundria (meios magnticos). Assim sendo este tipo ser definido com a utilizao da seguinte sintaxe:
. 72

Linguagem Pascal

A sintaxe: Var <identificador> : File Of <tipo registro>; Onde: Var e File Of so palavras reservadas do Pascal. Identificador o nome da nova varivel que ser usada para representar o arquivo; Tipo registro o tipo a que pertencem os registros do arquivo. Observaes: importante observar que devemos, antes de declarar a nova varivel do tipo arquivo, definir um tipo registro. O tipo registro, previamente declarado, definir ento a estrutura do registro do novo arquivo.

Exemplo: Type reg_agenda = record nome : rua : numero: cidade: end; string[30]; string[25]; integer; string[25];

Var arq_agenda : file of reg_agenda; agenda : reg_agenda; Neste exemplo, foi declarado uma varivel chamada arq_agenda, um arquivo com tipo definido de registro, composta por registros do tipo reg_agenda. A varivel arq_agenda representar o novo arquivo criado. Note ento que, conforme descrito anteriormente, o tipo registro reg_agenda foi previamente declarado e s depois foi declarada a varivel arq_agenda. A estrutura de arq_agenda foi definida na declarao do novo tipo record chamado reg_agenda. A figura abaixo mostra a representao do arquivo arq_agenda. Registro reg_agenda Nome Rua Campo numero Numero Cidade Arquivo arq_agenda

13.3 Operaes com arquivos 13.3.1 Associando um arquivo varivel de controle (assign)
A procedure assign tem por finalidade associar um nome lgico de arquivo (varivel arquivo) ao arquivo fsico (arquivo em meio magntico). importante frisar que esta instruo no criar o arquivo fsico. Antes de executarmos a abertura de um arquivo no Pascal devemos fazer uma associao do arquivo lgico declarado com o arquivo fsico. Para se fazer a associao desta identificao interna (a varivel arquivo) com a identificao externa (o arquivo fsico) usa-se a procedure assign. Ateno! Este comando deve anteceder a abertura do arquivo que feita usando-se a procedure reset. Veja abaixo sua sintaxe: A sintaxe:
73

Linguagem Pascal Assign(<varivel arquivo>,<arquivo>);

Onde: Assign palavra-chave do Pascal; Varivel arquivo o nome da varivel arquivo (arquivo lgico) declarada no programa, que se deseja associar ao arquivo fsico. Arquivo o nome do arquivo fsico (arquivo em meio magntico) pelo qual conhecido externamente ao programa. Ateno: este parmetro deve estar entre aspas simples. Observao: Pode-se acrescentar ao parmetro arquivo da procedure assing um caminho (path). Este caminho indicar o local (a unidade e a pasta) onde dever ser feita a gravao do arquivo, quando da sua criao pela procedure rewrite.

Exemplo: Assign(arq_agenda,agenda.dat); Esta instruo associa o arquivo lgico arq_agenda ao arquivo fsico agenda.dat que ser criado posteriormente com a procedure rewrite.

13.3.2 Criando um arquivo (rewrite)


A procedure rewrite tem por finalidade criar um arquivo fsico para uso e tambm gravar um registro em branco no mesmo. Devemos observar que caso o arquivo j exista, esta instruo o apagar e o criar novamente. A sintaxe:
Rewrite(<varivel arquivo>);

Onde: Rewrite palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo fsico (arquivo em meio magntico). Observao: Antes de se criar um arquivo utilizando a procedure rewrite obrigatrio fazer a associao do arquivo lgico (varivel arquivo) com o arquivo fsico, utilizando a procedure assing. Caso contrrio uma erro em tempo de execuo (Run-time error 102: File not assigned) ser apresentado. Cuidado! Caso o arquivo j exista a procedure rewrite ir apagar todos as informaes (registros) existentes. Quando um arquivo criado o ponteiro do arquivo posiciona-se no primeiro registro deste arquivo, ou seja, no registro de nmero 0 (zero).

Exemplo: rewrite(arq_agenda);

74

Linguagem Pascal

13.3.3 Abertura de um arquivo (reset)


A abertura de um arquivo no Pascal executada pela procedure reset. Esta procedure tem por finalidade abrir um arquivo j existente, colocando-o disponvel para leitura e escrita . A procedure reset abre o arquivo e deixa o primeiro registro deste arquivo disponvel para leitura e/ou escrita, ou seja, o ponteiro do arquivo aponta para o registro de nmero 0 (zero). A sintaxe:
Reset(<varivel arquivo>);

Onde: Reset palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo fsico (arquivo em meio magntico). Observao: Caso voc faa a tentativa de abrir um arquivo ainda no existente, ser apresentada a mensagem de erro em tempo de execuo (Run-time error 2: File not found). Esta mensagem representa uma tentativa de abertura de um arquivo inexistente. necessrio ento que se crie o arquivo (procedure rewrite) antes da sua abertura.

Exemplo: reset(arq_agenda);

13.3.4 Leitura de dados em um arquivo (read)


A procedure read tem por finalidade ler a informao (o registro) no arquivo indicado pela varivel arquivo e armazen-la numa varivel do tipo registro. A sintaxe:
Read(<varivel arquivo>,<varivel registro>);

Onde: Read palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo (arquivo fsico). varivel registro o nome de uma varivel , geralmente uma varivel do tipo registro. Esta varivel receber a informao lida no arquivo. Exemplo: read(arq_agenda,agenda); Esta instruo faz a leitura de um registro no arquivo arq_agenda e o armazena na varivel do tipo registro chamada agenda. A instruo l o registro para o qual o ponteiro do arquivo aponta no momento.

75

Linguagem Pascal

13.3.5 Gravao de dados em um arquivo (write)


A procedure write tem por finalidade gravar a informao (o registro) no arquivo fsico indicado pela varivel arquivo. A informao (registro) armazenada numa varivel registro ser ento gravada no arquivo indicado pela varivel arquivo. A sintaxe:
Write(<varivel arquivo>,<varivel registro>);

Onde: Write palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo (arquivo fsico). varivel registro o nome de uma varivel , geralmente uma varivel do tipo registro. Observao: Aps a gravao da informao no arquivo a instruo write posiciona o ponteiro do registro no prximo registro.

Exemplo: write(arq_agenda,agenda); Esta instruo grava o registro, que se encontra armazenado na varivel agenda, no arquivo arq_agenda. A instruo grava a informao no registro para o qual o ponteiro do arquivo aponta no momento.

13.3.6 Fechando um arquivo (close)


A procedure close tem por finalidade fechar um arquivo em uso dentro de um programa. O fechamento do arquivo desvincula o arquivo fsico do programa que o est utilizando. Nenhum programa deve ser encerrado antes de se fechar os arquivos por ele abertos. A sintaxe:
Close(<varivel arquivo>);

Onde: Close palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo fsico (arquivo em meio magntico). Exemplo: Close(arq_agenda);

13.3.7 Acessando um registro de forma direta (seek)


No Pascal o acesso a um registro qualquer de um arquivo, pode ser feito diretamente desde que se saiba a sua posio fsica neste arquivo. Assim no se faz necessrio processar todos os registros que esto fisicamente antes dele no arquivo. A procedure seek tem por finalidade efetuar o posicionamento do ponteiro do arquivo em um determinado registro, sem que haja a necessidade de processar todos os registros anteriores. Utilizando esta
. 76

Linguagem Pascal

procedure podemos acessar o n-simo registro de um arquivo. Lembre-se: No Pascal o primeiro registro de um arquivo o de nmero 0 (zero). A sintaxe:
Seek(<varivel arquivo>,<n>);

Onde: Seek palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo (arquivo fsico). n o nmero do registro que se quer acessar. Exemplo: Seek(arq_agenda,1); Esta instruo posiciona o ponteiro do arquivo no registro de nmero 1 (segundo registro) do arquivo associado varivel arquivo arq_agenda.

13.3.8 Verificando o valor do registro posicionado (filepos)


A funo filepos tem por finalidade retornar o valor do registro aonde se encontra posicionado o ponteiro do arquivo. A sintaxe:
FilePos(<varivel arquivo>);

Onde: FilePos palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo fsico (arquivo em meio magntico). Exemplo: ... Seek(arq_agenda,1); Writeln(FilePos(arq_agenda)); ... No exemplo acima a instruo Writeln(FilePos(arq_agenda)); mostrar na tela o valor 1 que corresponde posio do registro de nmero 1 do arquivo arq_agenda. Observe que a procedure seek forou o ponteiro do arquivo a se posicionar neste registro (o de nmero 1) atravs da instruo Seek(arq_agenda,1);.

13.3.9 Verificando o tamanho do arquivo (filesize)


A funo filesize tem por finalidade retornar nmero de registros presentes no arquivo. A sintaxe:
FileSize(<varivel arquivo>);

Onde:

77

Linguagem Pascal

FileSize palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo fsico (arquivo em meio magntico). Exemplo: ... Writeln(FileSize(arq_agenda)); ... No exemplo acima a instruo Writeln(FileSize(arq_agenda)); mostrar na tela a quantidade de registros do arquivo arq_agenda.

13.3.10 Identificando o final do arquivo - Eof


A funo Eof() (End of File) tem por finalidade identificar o final de um arquivo. Quando estamos programando, seja em Pascal ou em outra linguagem qualquer, muito comum ter que determinar o ltimo registro de um arquivo. No Pascal, para resolver esta questo utilizamos a funo lgica Eof() associada ao arquivo. Esta instruo assume o valor TRUE quando se tenta ler um registro aps o ltimo. A sintaxe:
Eof(<varivel arquivo>);

Onde: Eof palavra-chave do Pascal; varivel arquivo o nome da varivel arquivo (arquivo lgico) associada ao arquivo (arquivo fsico). Exemplo: ... while (not Eof(arq_agenda)) do begin read(arq_agenda,x); writeln(x.codigo, ,x.nome); end; ... No exemplo acima a instruo writeln(x.codigo, ,x.nome);; mostrar na tela os campos codigo e nome de todos os registros do arquivo arq_agenda at que seja encontrado o fim deste arquivo. Bibliografia: Aprendendo a Programa na Prtica Turbo Pascal Virglio V. Vilela Fevereiro 1999. Programando em Turbo Pascal 7.0 Jos Augusto N. G. Manzano, Wilson Y. Yamatumi, Editora rica, quarta edio 1996. Pascal Estruturado Uarry Farrer, Christiano G. Becker, Eduardo Chaves Faria, Frederico Ferreira Campos, e outros Editora LTC, terceira edio, 1999. Programao em Pascal Byron S. Gottfried, Ph. D.
McGraw-Hill, 1988.

78

Você também pode gostar