Você está na página 1de 16

LINGUAGEM PASCAL

NOES BSICAS USANDO TURBO PASCAL

Silvio do Lago Pereira

SUMRIO
1. Introduo .................................................. 01 1.1. O Sistema Turbo Pascal ........................ 01 1.2. Um Primeiro Exemplo........................... 01 1.3. Algumas Explicaes ............................. 01 1.4. Exerccios ............................................... 01 1.5. A Unidade CRT ...................................... 02 1.6. Exerccios ............................................... 02 2. A Estrutura de Seleo ............................ 02 2.1. Um Exemplo de Aplicao..................... 03 2.2. Utilizando Blocos de Comandos ...... 03 2.3. Exerccios ............................................... 03 3. Repetio com Contador ......................... 04 3.1. Fazendo Tabuadas ................................. 04 3.2. Contagem Decrescente ...................... 04 3.3. Exerccios ................................................04 4. Repetio com Precondio ................... 05 4.1. Exibindo os Dgitos de um Nmero ...... 05 4.2. Exerccios ................................................05 5. Repetio com Poscondio ................... 06 5.1. Automatizando o Caixa ......................... 06 5.2. Forando uma entrada ......................... 06 5.3. Exerccios ................................................06 6. Modularizao............................................ 07 6.1. Mdulos .................................................. 07 6.2. Funes .................................................. 07 6.3. Exerccios .............................................. 08 6.4. Procedimentos.........................................08 6.5. Exerccios .............................................. 09 6.6. Passagem de Parmetros .......................09 6.7. Valor versus Referncia ....................... 10 6.8. Exerccios ................................................10 7. Vetores ......................................................... 10 7.1. As Temperaturas Acima da Mdia ....... 11 7.2. Exerccios .............................................. 11 8. Registros ...................................................... 12 8.1. Registros Aninhados ............................. 12 8.2. Tabelas .................................................. 12 8.3. Exerccios .............................................. 13 9. Arquivos ....................................................... 13 9.1. Principais Operaes em Arquivos....... 13 9.2. Gravando um Arquivo .......................... 14 9.3. Lendo um Arquivo ................................ 14 9.4. Exerccios .............................................. 14

1. INTRODUO
A linguagem Pascal, cujo nome uma homenagem ao matemtico francs Blaise Pascal, foi desenvolvida na dcada de 60 pelo professor Niklaus Wirth. Inicialmente, sua finalidade era ser uma linguagem para uso didtico, que permitisse ensinar com clareza os principais conceitos envolvidos na programao estruturada de computadores. Hoje, numa verso mais moderna denominada Delphi, essa linguagem tambm utilizada por profissionais de diversas reas tais como processamento de dados, computao e engenharia. 1.1. O Sistema Turbo Pascal Para criar um programa na linguagem Pascal, usaremos o Turbo Pascal. Esse software engloba: um editor de textos que nos permite digitar e salvar em disco o programa codificado em Pascal; um compilador, que traduz o programa escrito em Pascal para a linguagem de mquina. Aps ter digitado o programa, usamos: F2: para salvar em disco o programa digitado; Ctrl+F9: para compilar e executar o programa; Alt+F5: para ver o resultado da execuo. 1.2. Um Primeiro Exemplo Vamos criar um programa que dadas as duas notas obtidas por um aluno, informe a sua mdia. Para realizar esta tarefa, o programa dever executar os seguintes passos: 1o Solicitar a primeira nota; 2o Ler o valor e armazen-lo na memria; 3o Solicitar a segunda nota; 4o Ler o valor e armazen-lo na memria; 5o Calcular a mdia com os valores fornecidos; 6o Exibir o resultado do clculo; Em Pascal, esses passos so indicados assim:
program media; real; var p1, p2, m : real begin write('Primeira nota? '); write readln(p1); readln write('Segunda nota? '); write readln(p2); readln m := (p1+p2)/2; writeln eln('A mdia ', m:0:1); writeln end. end

1.3. Algumas Explicaes A palavra program serve para definir o nome do programa, que deve ser digitado logo em seguida; Os locais de memria onde os dados so armazenados, denominados variveis, so identificados por nomes que devem iniciar com letras; A palavra var serve para declarar o tipo das variveis que sero usadas no programa. Variveis que armazenam nmeros inteiros devem ser do tipo integer e aquelas que permitem nmeros com parte fracionria devem ser do tipo real; A palavra begin marca o incio do programa; Todas as mensagens a serem exibidas na tela do computador devem ser colocadas entre apstrofos. Uma varivel, entretanto, no; caso contrrio, o computador exibir o seu nome e no o seu valor. O comando write exibe uma informao na tela e deixa o cursor na mesma linha em que a informao foi exibida. J o comando writeln, faz com que o cursor salte para o incio da linha seguinte.

Para que no sejam exibidas em notao cientfica, variveis do tipo real devem ser formatadas da seguinte maneira: varivel : tamanho_campo : casas_decimais

O comando readln aguarda at que o usurio digite um valor e pressione <enter> e, em seguida, armazena o valor na varivel especificada. O final do programa indicado pela palavra end. 1.4. Exerccios Para cada problema, codifique um programa Pascal: 1.1. Dada a medida dos lados de um quadrado, informe a sua rea. 1.2. Dada a medida do raio de uma circunferncia, informe o seu permetro. 1.3. Dada uma distncia (km) e o total de combustvel (l) gasto por um veculo para percorr-la, informe o consumo mdio (km/l). 1.4. Sabe-se que com uma lata de tinta pinta-se 3m2. Dadas a largura e a altura de uma parede, em metros, informe quantas latas de tinta sero necessrias para pint-la completamente. 1.5. Dadas as medidas dos catetos de um tringulo retngulo, informe sua hipotenusa. [Dica: em Pascal, x escreve-se sqrt(x) ].

Noes de Pascal / Prof. Silvio Lago

1.5. A Unidade CRT A unidade CRT consiste de um conjunto de comandos adicionais que so oferecidos no Turbo Pascal. Como esses comandos no fazem parte da linguagem Pascal padro, para utiliz-los, precisamos incluir a seguinte instruo no programa: uses crt; Essa instruo indica ao compilador que iremos usar os comandos adicionais contidos na unidade CRT. Sem ela, os comandos adicionais no podem ser reconhecidos pelo compilador.

1.6. Exerccios Para cada problema a seguir, codifique um programa Pascal. Use os comandos adicionais disponveis em CRT e, para no ter que ficar digitando Alt+F5 para ver os resultados, inclua readln1 como a ltima instruo do programa (antes do end). 1.6. Dada uma distncia (km ) e o tempo (h ) gasto por um veculo para percorr-la, informe a velocidade mdia do veculo (km/h ). 1.7. Dada uma medida em centmetros (c), informe o valor correspondente em polegadas (p). Utilize a frmula: p = c / 2,54. 1.9. Dada uma temperatura em graus Celsius (C ), informe a correspondente em graus Fahrenheit (F ). Utilize a frmula: F = (9/5) C+32. 1.10. Sabe-se que 1m2 de carpete custa R$ 35,00. Dados o comprimento e a largura de uma sala, em metros, informe o valor que ser gasto para forrar todo o seu piso. 1.11. Dadas as coordenadas de dois pontos P e Q do plano cartesiano, informe a distncia entre eles. [Dica: use o teorema de Pitgoras] y Q yQ

Essa instruo deve ser a segunda linha do programa, conforme indicado a seguir:
program exemplo; uses crt; ...

Temos a seguir a descrio dos comandos definidos em CRT que so mais utilizados em Turbo Pascal: clrscr: limpa a tela e posiciona o cursor no incio da primeira linha; textcolor(cor): seleciona a cor na qual os textos sero exibidos no vdeo. As cores so representadas por nmeros de 0 a 15 ou, ento, por palavras em ingls (red, blue, ...). Para exibir texto piscante, adicione a palavra blink cor selecionada; por exemplo, red+blink; textbackground(cor): seleciona a cor do fundo sobre o qual os textos sero exibidos. As cores so representadas da mesma maneira que no comando anterior. Para que a tela toda aparea na cor de fundo selecionada, execute o comando clrscr logo aps o textbackground; gotoxy(col, lin): posiciona o cursor na posio de tela indicada. Caso o valor de col (1 a 80) ou lin (1 a 25) esteja fora do intervalo permitido, o cursor no movimentado.

yP 0

P xP xQ x

2. A ESTRUTURA DE SELEO
A estrutura de seleo, ou condicional, uma estrutura que nos permite selecionar e executar apenas um entre dois comandos possveis. Para decidir qual comando dever ser executado, emprega-se uma expresso lgica, denominada condio: se esta for verdadeira, seleciona-se a primeira alternativa; caso contrrio, se for falsa, seleciona-se a segunda. if condio then comando1 else comando2;

1 2 3 1 2 3 ... lin ... 25

...

col

...

80

Quando usado sem variveis, o comando readln apenas aguarda que o usurio pressione a tecla <enter>.

Noes de Pascal / Prof. Silvio Lago

Observe que os comandos no if-else so mutuamente exclusivos, isto , a seleo de um deles impede que o outro seja executado, e vice-versa.

vezes, no h duas alternativas, apenas uma: ou o comando executado ou, ento, nada feito. Nestas ocasies, pode-se omitir a parte else do comando if-else.

A expresso lgica, usada como condio, pode ser formada pelos seguintes tipos de operadores: aritmticos: +, , , /, div e mod; relacionais: =, <>, <, >, <= e >=; lgicos: not, and e or. 2.1. Um Exemplo de Aplicao Temos a seguir um exemplo de como empregar a estrutura de seleo ao codificar um programa em Pascal. Neste exemplo, so fornecidas as duas notas de um aluno e o programa informa se ele est aprovado ou reprovado: program situacao; uses crt; real; var p1, p2, m : real begin clrscr; clrscr write('Informe as duas notas: '); write readln(p1,p2); readln m := (p1+p2)/2; writeln('Mdia: ', m:0:1); writeln write('Situao: '); write if m >= 7.0 writeln('aprovado') then writeln writeln('reprovado'); else writeln readln; readln end. end

... if m >= 7.0 then begin textcolor(blue); textcolor writeln('aprovado'); writeln end else begin textcolor(red); textcolor writeln('reprovado'); writeln end; end ...

2.3. Exerccios Para cada problema, codifique um programa Pascal: 2.1. Dado um nmero, informe se ele par. 2.2. Dados dois nmeros distintos, informe qual deles o maior. 2.3. Dada a idade de uma pessoa, informe se ela pode ou no ter carta de motorista. 2.4. O ndice de massa corporal (imc) de uma pessoa dado pelo seu peso dividido pelo quadrado da sua altura. Se o imc superior a 30, a pessoa considerada obesa. Dados o peso (kg) e a altura (m) de uma pessoa, informe seu imc e indique se ela precisa de regime. 2.5. Numa empresa paga-se R$ 14,50 por hora e recolhe-se 15% dos salrios acima de R$ 1.200,00 para o imposto de renda. Dado o nmero de horas trabalhadas por um funcionrio, informe o valor do seu salrio bruto, do desconto de I.R. e do seu salrio lquido. 2.6. Numa faculdade, os alunos com mdia pelo menos 7,0 so aprovados, aqueles com mdia inferior a 3,0 so reprovados e os demais ficam de recuperao. Dadas as duas notas de um aluno, informe sua situao. Use as cores azul, vermelho e amarelo para as mensagens aprovado, reprovado e recuperao, respectivamente. 2.7. Dados os coeficientes (a0, b e c) de uma equao do 2o grau, informe suas razes reais. Utilize a frmula de Bskara:
x1,2 = b b2 4.a.c 2.a

2.2. Utilizando Blocos de Comandos Sempre que for necessrio executar mais que um comando quando a condio for verdadeira (ou falsa) preciso agrupar os diversos comandos em um nico bloco, isto , precisamos coloc-los entre as palavras begin e end. Por exemplo, suponha que fosse necessrio alterar o programa anterior de modo que a mensagem aprovado fosse exibida em azul e reprovado, em vermelho. Ento, teramos que codificar a estrutura de seleo do seguinte modo:

2.8. Dados trs nmeros, verifique se eles podem ser as medidas dos lados de um tringulo e, se puderem, classifique o tringulo em equiltero, issceles ou escaleno.

Noes de Pascal / Prof. Silvio Lago

3. REPETIO COM CONTADOR


A estrutura de repetio com contador uma estrutura que nos permite executar uma ou mais instrues, um determinado nmero de vezes. Para controlar o nmero de repeties, empregamos uma varivel denominada contador. for cnt := vi to vf do comando; ; Ao encontrar o for, o computador primeiro atribui o valor inicial vi ao contador cnt. A partir da, o comando associado estrutura executado repetidamente, at que o contador atinja o valor final vf. A cada vez que o comando executado, o contador incrementado automaticamente pelo computador. O fluxograma a seguir ilustra o funcionamento do comando for:
...

Para repetir vrios comandos no for, agrupe-os em um bloco, usando begin e end.

3.2. Contagem Decrescente Algumas vezes, ao invs de fazer o contador aumentar, prefervel faz-lo diminuir. Para indicar que a contagem deve ser decrescente, usamos a palavra downto em vez de to. O programa a seguir exibe uma contagem decrescente usando downto: program regressivo; integer; var n, c: integer begin write('Digite um nmero: '); write readln(n); readln downto for c:=n downto 1 do writeln(c); writeln( ); readln; readln end. end

cnt := vi 3.3. Exerccios


cnt <= vf
V F

Para cada problema, codifique um programa Pascal:


...

comando cnt := cnt+1

3.1. Faa um programa para ler 10 nmeros e exibir sua mdia aritmtica. 3.2. Dado um nmero n, informe a soma dos n primeiros nmeros naturais. Por exemplo, se n for igual a 5, o programa dever exibir a soma 1+2+3+4+5, ou seja, 15. 3.3. O quadrado de um nmero n igual soma dos n primeiros nmeros mpares. Por exemplo, 22 = 1+3 = 4 e 52 = 1+3+5+7+9 = 25. Dado um nmero n, informe seu quadrado usando essa idia. 3.4. Dados um nmero real x e um nmero natural n, calcule e informe o valor de xn. [Dica: xn = x.x...x (com n termos x)] 3.5. Dado um nmero natural n, calcule e informe o valor do seu fatorial. [Dica: n! = (n1).n...3.2.1] 3.6. Dadas as temperaturas registradas diariamente durante uma semana, informe que dia da semana foi mais frio e que dia foi mais quente. 3.7. Dado um nmero n, desenhar um tabuleiro de xadrez nn. Por exemplo, para n=4, temos:

O Pascal exige que a varivel utilizada como contador seja declarada como integer.

3.1. Fazendo Tabuadas... A seguir, mostramos como o comando for pode ser usado para criar um programa que exibe a tabuada de um nmero fornecido pelo usurio: program tabuada; var integer; var n, c, r : integer begin write('Digite um nmero: '); write readln(n); readln for c:=1 to 10 do writeln(n,' x ',c,' = ',n*c); writeln readln; readln end. end Noes de Pascal / Prof. Silvio Lago

4. REPETIO COM PRECONDIO


Atravs da estrutura de repetio com precondio, um comando pode ser executado repetidamente, sem que tenhamos que escrev-lo diversas vezes no programa. Para controlar a repetio, a execuo do comando fica condicionada ao valor de uma expresso lgica, denominada condio, que avaliada a cada nova repetio, sempre antes que o comando seja executado. Enquanto essa expresso verdadeira, o comando repetido.

while condio do comando; ; Veja a seguir o fluxograma que ilustra o funcionamento desta estrutura de repetio:

program digitos; integer; var n, r : integer begin write('Digite um nmero: '); write readln(n); readln while n>0 do begin r := n mod 10; n := n div 10; writeln(r); writeln end; end readln; readln end. end

4.2. Exerccios Para cada problema, codifique um programa Pascal: 4.1. Dado um nmero n, exibir todos os mpares menores que n. Por exemplo, para n=10 devero ser exibidos os mpares: 1, 3, 5, 7 e 9.
F

...

condio V

...

comando

4.2. A soma de n mpares consecutivos, a partir de 1, equivalente a n2. Por exemplo, 12 =1, 22 =1+3, 32 =1+3+5, 42 =1+3+5+7, ... Inversamente, o nmero n de mpares consecutivos que podem ser subtrados de um nmero x (sem produzir resultado negativo) igual raiz quadrada inteira de x. Por exemplo, se tivermos x=18, poderemos subtrair dele no mximo 1+3+5+7=16, e a resposta ser n=4. Dado um nmero x, informe sua raiz quadrada inteira n, usando essa idia. 4.3. A Srie de Fibonacci : 1, 1, 2, 3, 5, 8, 13, ... Note que os dois primeiros termos desta srie so iguais a 1 e, a partir do terceiro, o termo dado pela soma dos dois termos anteriores. Dado um nmero n 2, exiba todos os termos da srie que sejam menores ou iguais a n. 4.4. Numa certa agncia bancria, as contas so identificadas por nmeros de at quatro dgitos. Por motivo de consistncia, a cada nmero n associado um dgito verificador d calculado da seguinte maneira: Seja n = 7314 o nmero da conta. 1 Adiciona-se todos os dgitos de n, obtendose a soma s. Para o n considerado, a soma seria: s = 4+1+3+7 = 15; 2 O dgito verificador d dado pelo resto da diviso de s por 10. Para o s considerado, o dgito verificador seria d = 5

Para repetir vrios comandos no while, agrupe-os em um bloco com begin e end.

4.1. Exibindo os Dgitos de um Nmero... No exemplo a seguir mostramos como a estrutura de repetio com precondio pode ser usada para criar um programa que exibe um a um os dgitos que compem um nmero natural. Por exemplo, sendo fornecido como entrada o nmero 8315, o programa dever exibir como sada os dgitos 5, 1, 3 e 8. A estratgia ser dividir o nmero sucessivamente por 10 e ir exibindo os restos obtidos. O processo pra somente quando o quociente obtido numa das divises zero:
8315 8310 5 10 831 830 1

10 83 80 3

10 8 0 8

10 0

pra

Dado um nmero de conta n, informe o dgito verificador correspondente.

Noes de Pascal / Prof. Silvio Lago

5. REPETIO COM POSCONDIO


A estrutura de repetio com poscondio permite que um comando seja executado at que uma determinada condio seja satisfeita. Esse tipo de repetio garante que o comando seja executado pelo menos uma vez antes que a repetio termine. repeat comando; ; until condio; ; O fluxograma a seguir ilustra o funcionamento do comando repeat-until: ... comando
F

Note que as palavras repeat e until servem como delimitadores de bloco e, assim, dispensam o uso de begin e end.

5.2. Forando uma Entrada O comando repeat-until muito utilizado em situaes em que o usurio deve ser forado a digitar um valor dentro de um certo intervalo. Por exemplo, poderamos alterar o programa da tabuada, visto na seo 3.1, de tal forma que o usurio fosse obrigado a digitar um valor entre 1 e 10. program tab; uses crt; integer; var n, c, r : integer begin clrscr; repeat gotoxy(1,1); gotoxy write('Digite um nmero: '); write clreol; clreol readln(n); readln until (n>=1) and (n<=10); for c:=1 to 10 do writeln(n,' x ',c,' = ',n*c); writeln readln; readln end. end

condio V

...

5.1. Automatizando o Caixa Considere o problema: "Dada uma srie de valores, representando os preos dos itens comprados por um cliente, informe o total a ser pago". Como cada cliente pode comprar um nmero diferente de itens, no h como prever o nmero exato de valores de entrada. Ento, vamos convencionar que o final da srie ser determinado por um valor nulo. Isso razovel, j que no possvel que um item custe R$ 0,00. Assim, o programa dever solicitar os preos e adicion-los at que um preo nulo seja informado; nesse momento, o valor total dever ser exibido. program caixa; uses crt; real; var s, p : real begin clrscr; clrscr s := 0; repeat write('Preo? '); write readln(p); readln s := s+p; until p=0; writeln('Total a pagar: R$',s:0:2); writeln readln; readln end. end Noes de Pascal / Prof. Silvio Lago

5.3. Exerccios Para cada problema, codifique um programa Pascal: 5.1. Dado o saldo inicial e uma srie de operaes de crdito/dbito, informe o total de crditos, o total de dbitos, a C.P.M.F. paga (0,40% do total de dbitos) e o saldo final da conta.
Saldo inicial? Operao? 200 Operao? -50 Operao? -10 Operao? 170 Operao? -500 Operao? 0 -------------Crditos..: R$ Dbitos...: R$ C.P.M.F...: R$ Saldo.....: R$ 1000.00

370.00 560.00 2.24 807.76

5.2. Refaa o exerccio 2.7, sobre equaes do 2o grau, de tal modo que o usurio seja forado a informar um valor diferente de zero para o coeficiente a da equao.

6. MODULARIAO
A modularizao uma tcnica de desenvolvimento baseada no princpio de "diviso e conquista": para resolvermos um problema complexo, primeiro identificamos e resolvemos subproblemas mais simples e, ento, combinamos as solues desses subproblemas para obter a soluo do problema original. Esse processo de decomposio de problemas em subproblemas representado atravs de um diagrama hierrquico funcional (D.H.F.), conforme segue: Top P Up

sentam perguntas, procedimentos representam ordens. Por exemplo, considere os comandos a seguir:
... clrscr; write('Num? '); readln(n); r := sqrt(n); writeln('Raiz de ',n:0:1,' ',r:0:1); ...

D Down

F Botton

O comando clrscr ordena que o computador limpe a tela e, portanto, um procedimento. J o comando sqrt(n) pergunta ao computador qual a raiz quadrada de n e, portanto, uma funo. O procedimento clrscr produz um efeito como resultado de sua execuo, enquanto a funo sqrt devolve um valor. Evidentemente, os comandos write e writeln so procedimentos e o efeito que produzem alterar o estado da tela, exibindo informaes. Mas e o comando readln? uma funo ou um procedimento? Note que readln(n) corresponde ordem "leia n" e, portanto, tambm um procedimento; seu efeito alterar o valor da varivel n. 6.2. Funes Ao definir uma funo, usamos o seguinte formato:

No exemplo acima, o problema original P foi decomposto em trs subproblemas: A, B e C. Eventualmente, aps uma decomposio, podem surgir subproblemas que ainda so muito complexos. Nesse caso, fazemos mais uma decomposio. No nosso exemplo, o subproblema A foi decomposto em D e E e o subproblema C foi decomposto em F. No h limite para esse processo de decomposio e ele s termina quando atingimos subproblemas suficientemente simples para que sejam resolvidos diretamente. Cada mdulo do D.H.F. corresponde a uma rotina que dever ser codificada no programa Pascal. Note que o projeto feito de cima para baixo (top-down), enquanto a implementao deve ser feita de baixo para cima (botton-up). Isso quer dizer que, no programa Pascal, um mdulo s deve aparecer quando todos aqueles dos quais ele depende j foram codificados anteriormente. Sendo assim, o mdulo principal ser sempre o ltimo a ser codificado no programa. 6.1. Mdulos

function nome(parmetros) : tipo; variveis locais; begin instrues; ... nome := resposta; end; end Toda funo deve ter um nome, atravs do qual ela possa ser chamada no programa. Para executar, uma funo pode precisar receber alguns parmetros de entrada e, ao final de sua execuo, devolve uma resposta do tipo especificado. Se a funo precisa de outras variveis, alm dos parmetros, essas devem ser declaradas como variveis locais. Para indicar a resposta final devolvida pela funo, devemos atribuir seu valor ao nome da funo. As variveis locais e os parmetros so criados na memria apenas no momento em que a rotina entra em execuo e deixam de existir assim que a execuo concluda.


Um mdulo2 pode ser codificado como uma funo ou como um procedimento. O mdulo ser uma funo se ele deve devolver um valor como resultado de sua execuo e ser um procedimento se apenas deve produzir um efeito quando executado. Uma maneira interessante de diferenciar funes de procedimentos observar que enquanto funes repre2

Por exemplo, a funo a seguir calcula a medida da hipotenusa c de um tringulo retngulo a partir das medidas dos seus catetos a e b.

O mesmo que rotina ou comando.

Noes de Pascal / Prof. Silvio Lago

function hip(a, b : real) : real; real real real; var c : real begin c := sqrt sqr(a)+sqr sqrt(sqr sqr(b)); sqr sqr hip := c; end; end Para usar essa funo num programa, basta lembrar que a implementao deve ser botton-up e que, portanto, o cdigo da funo deve aparecer antes do cdigo do mdulo principal3 do programa. program TesteHip; uses crt; var x, y, h : real; { clculo da hipotenusa } real) real; function hip(a, b : real : real real; var c : real begin c := sqrt sqr sqrt(sqr sqr(a)+sqr sqr(b)); sqr hip := c; end; end { mdulo principal } begin write('Catetos? '); write readln(x,y); readln h := hip(x,y); write('Hipotenusa: ',h:0:1); write end. end

6.3 Exerccios Para cada problema a seguir, crie uma funo e codifique um programa para test-la: 6.1. Dado um nmero natural, determine se ele par ou mpar. 6.2. Dado um nmero real, determine seu valor absoluto, ou seja, seu valor sem sinal. 6.3. Dados dois nmeros reais, determine o mximo entre eles. 6.4. Dados dois nmeros reais, determine a mdia aritmtica entre eles. 6.5. Dados um nmero real x e um nmero natural n, determine xn. 6.6. Dado um nmero natural n, determine n!. 6.7. Dado um nmero n, determine seu dgito verificador conforme definido no exerccio 4.4. 6.4. Procedimentos Procedimentos tm o seguinte formato: procedure nome(parmetros); variveis locais; begin instrues; ... end; end

A execuo do programa inicia-se sempre no mdulo principal e se o comando no chamado nesse mdulo ele no executado. No exemplo acima, o comando hip() chamado com os argumentos x e y, cujos valores so copiados, respectivamente, para os parmetros a e b da funo. Esses parmetros so ento utilizados no clculo da hipotenusa c. Para indicar que o valor em c deve ser devolvido como resposta da funo, devemos atribu-lo ao nome da funo. Quando a funo termina, as variveis a, b e c deixam de existir; entretanto, o valor de c no perdido, j que foi preservado no momento em que foi atribudo como resposta da funo.

Assim como funes, procedimentos devem ter um nome, atravs do qual ele possa ser chamado. Procedimentos podem receber parmetros de entrada, mas no fornecem um valor de sada e, portanto, no precisamos declarar o tipo de resposta. integer; string); procedure msg(c,l:integer m:string integer string begin gotoxy(c,l); gotoxy write(m); write end; end O comando msg(c,l,m), definido acima, exibe uma dada mensagem m numa determinada posio (c,l) da tela. Ao codificar um programa completo contendo esse comando, preciso lembrar que um mdulo no pode se referir a outro que no tenha ainda sido codificado e, portanto, qualquer outro mdulo do programa que utilize o comando msg() deve aparecer codificado aps ele (similarmente ao que foi feito no programa TesteHip).

Em Pascal, comentrios so indicados entre chaves e so ignorados na compilao.

No Pascal, o mdulo principal o bloco finalizado com end seguido de ponto final.

Noes de Pascal / Prof. Silvio Lago

6.5. Exerccios 6.8. O comando sound(f), cujo parmetro f um nmero inteiro, liga o alto-falante para emitir som com freqncia de f hertz. Para desligar o alto-falante, temos o comando nosound e, para dar uma pausa, temos delay(t), cujo parmetro t indica o nmero de milissegundos a aguardar. Usando esses comandos disponveis em CRT, crie o comando beep, que emite um "bip". 6.9. Usando os comandos de som, crie um comando para simular o som de uma sirene. [Dica: sons graves tm freqncias baixas e sons agudos tm freqncias altas] 6.10. Crie o comando centraliza(l,m), que exibe a mensagem m centralizada na linha l, e faa um programa para test-lo. [Dica: a funo length(s) devolve comprimento da string s.] 6.11. Crie o comando horiz(c,l,n), que exibe uma linha horizontal com n caracteres de comprimento, a partir da posio (c,l) da tela. [Dica: para obter uma linha contnua, use o caracter cujo cdigo ASCII 196] 6.12. A rotina a seguir tem como objetivo desenhar uma moldura cujo canto esquerdo superior est na posio (Ci,Li) e cujo canto direito inferior est na posio (Cf,Lf); entretanto, ela contm alguns erros. Codifique um programa para testar seu funcionamento e corrija os erros que voc observar:
procedure M(Ci,Li,Cf,Lf,cor:integer); var i: integer; begin textcolor(cor); gotoxy(Ci,Li); write(#191); gotoxy(Cf,Li); write(#192); gotoxy(Ci,Lf); write(#217); gotoxy(Cf,Lf); write(#218); for i:= Ci+1 to Cf-1 do begin gotoxy(i,Li); write(#179); gotoxy(i,Lf); write(#179); end; for i:= Li+1 to Lf-1 do begin gotoxy(Ci,i); write(#196); gotoxy(Cf,i); write(#196); end; end;

6.6. Passagem de Parmetros Um parmetro pode ser passado a uma rotina de duas maneiras distintas: por valor ou por referncia. Quando passado por valor, o parmetro criado numa nova rea de memria, ainda no utilizada, e o valor do argumento copiado para essa rea. Quando passado por referncia, o parmetro compartilha o mesmo espao de memria j utilizado pelo argumento. Na passagem por valor, a rotina tem acesso apenas a uma cpia do argumento; j na passagem por referncia, a rotina acessa diretamente o argumento original. Para indicar que a passagem deve ser feita por referncia, devemos prefixar a declarao do parmetro com a palavra var. Para entender a utilidade da passagem por referncia, vamos considerar um exemplo: criar um comando que permuta os valores de duas variveis que lhe so passadas como argumentos. Supondo que esse comando se chame troca, o cdigo
... x := 5; y := 7; troca(x,y); troca(x,y) write(x,y); ...

dever produzir 75 como sada. Primeiro vamos entender por que a passagem por valor no funciona nesse caso. ... integer); procedure troca(a,b:integer integer integer; var c : integer begin a: 5 Os parmetros c := a; so cpias dos b: 7 a := b; argumentos! b := c; c: ? end; end ... begin
... x := 5; y := 7; X: 5 y: 7 Argumentos originais.

troca(x,y); troca(x,y) write(x,y); ... end. end

6.13. Baseando-se na rotina acima, crie o comando vert(c,l,n), que exibe uma linha vertical com n caracteres de comprimento, a partir da posio (c,l) da tela. Usando essa rotina e horiz(), codifique uma nova verso do comando M, que desenha molduras. Noes de Pascal / Prof. Silvio Lago

Como podemos ver acima, parmetros passados por valor so criados como cpias dos argumentos originais. Quando a rotina executada, de fato, ela troca os valores das variveis a e b, que so destrudas assim que a execuo da rotina termina. Retornando ao programa principal, os valores de x e y estaro inalterados e, portanto, teremos 57 como sada.

Para funcionar como esperado, o comando troca() deve permutar diretamente os valores das variveis x e y. Isso s possvel se a passagem for feita por referncia. Para indicar essa alterao, basta acrescentar a palavra var na declarao dos parmetros: ... integer); procedure troca(var a,b:integer var integer integer; var c : integer begin c: ? varivel local c := a; a := b; b := c; end; end ... begin
... x := 5; y := 7; a,X: 5 b,y: 7 Parmetros e argumentos compartilham o mesmo espao!

6.8. Exerccios 6.14. No comando readln(n), o argumento n passado por valor ou por referncia? Por qu? 6.15. Explique por que o parmetro n da funo para clculo de dgito verificador, criada no exerccio 6.7, deve ser passado por valor. 6.16. Crie o comando incr(v,n), que incrementa o valor da varivel v em n unidades. Por exemplo, se v vale 5, aps a execuo de incr(v,3), a varivel v dever estar valendo 8. 6.17. As funes wherex e wherey, definidas em CRT, devolvem a coluna e a linha em que se encontra o cursor. Usando essas funes, crie a rotina cursor(x,y), que devolve a posio corrente do cursor atravs dos parmetros x e y.

7. VETORES
Um vetor uma coleo de variveis de um mesmo tipo, que compartilham o mesmo nome e que ocupam posies consecutivas de memria. Cada varivel da coleo denomina-se elemento e identificada por um ndice. Se v um vetor indexado de 1 a n, seus elementos so v[1], v[2], v[3], ..., v[n].
nome do vetor
1 2 3

troca(x,y); troca(x,y) write(x,y); ... end. end

Agora, os parmetros compartilham a mesma rea de memria j utilizada pelos argumentos passados rotina. Evidentemente, qualquer alterao feita nos parmetros tambm feita nos argumentos. Ao final da execuo da rotina, as variveis a, b e c so destrudas; entretanto, somente o espao de memria utilizado pela varivel local c pode ser liberado, j que os espaos utilizados por a e b foram apenas tomados "emprestados" e devem continuar sendo usados pelos argumentos x e y. Com essa nova verso, obteremos a sada 75, como era esperado. 6.7. Valor versus Referncia A passagem por valor tem como vantagem o fato de que ela garante a segurana dos argumentos que so passados rotina, preservando seus valores originais para uso futuro no programa. Essa segurana, porm, obtida a custa de um gasto adicional de espao, para criar a cpia na memria, e tempo, para transferir os valores do original para a cpia. Por outro lado, a passagem por referncia no garante a segurana dos argumentos, j que esses podem ser alterados pela rotina. Porm, mais eficiente em termos de espao e tempo, j que os argumentos no precisam ser duplicados na memria. A deciso entre usar passagem por valor ou referncia deve ser feita com base na seguinte regra: se esperado que um argumento seja alterado pela execuo de uma rotina, ento a sua passagem deve ser feita por referncia. Noes de Pascal / Prof. Silvio Lago

ndices

v:
elementos

Antes de criar um vetor preciso declarar o seu tipo, ou seja, especificar a quantidade e o tipo dos elementos que ele ir conter. Isso feito atravs do comando type, conforme exemplificado a seguir. array[1..5] of integer integer; type vetor = array var v : vetor; A primeira linha define um novo tipo de vetor, denominado vetor, cujos elementos indexados de 1 a 5 so do tipo integer. A segunda linha declara uma varivel, denominada v, do tipo recm definido. Em geral, um vetor v pode ser indexado com qualquer expresso cujo valor seja um nmero inteiro. Essa expresso pode ser uma simples constante, uma varivel ou ento uma expresso propriamente dita, contendo operadores aritmticos, constantes e variveis. Por exemplo, seja i uma varivel do tipo integer e v o vetor criado no exemplo anterior. Se i=3, ento v[i div 2] v[1], v[i1] v[2], v[i] v[3], v[i+1] v[4] e v[2i1] v[5]. Entretanto, v[i/2] causar um erro de compilao; j que a expresso i/2 tem valor igual a 1.5, que no um ndice permitido.

10

7.1. As temperaturas Acima da Mdia Dadas as temperaturas que foram registradas diariamente, durante uma semana, deseja-se determinar em quantos dias dessa semana a temperatura esteve acima da mdia. A soluo para esse problema envolve os seguintes passos: obter os valores das temperaturas; calcular a mdia entre esses valores; verificar quantos deles so maiores que a mdia. Lembrando da tcnica de modularizao, cada um desses passos representa um subproblema cuja soluo contribui para a soluo do problema originalmente proposto. Ento, supondo que eles j estivessem solucionados, o programa poderia ser codificado como segue: program TAM; const max = 7; Type Temp = array[1..max] of real; array real T : Temp; var m : real real; ... begin obtem(T); m := media(T); writeln('Total = ',conta(T,m)); writeln end. end

rotina e que, portanto, os valores armazenados sero perdidos se a passagem for por valor. Note tambm que, na rotina que calcula a mdia a seguir, a passagem poderia ser por valor, pois no pretendemos alterar a varivel original; entretanto, a passagem por referncia torna o cdigo mais eficiente. real function media(var T : Temp) : real; var var i : integer; integer S : real real; begin S := 0; For i:=1 to Max do S := S + T[i]; media := S/max; end;

Finalmente, a rotina que faz a contagem das temperaturas acima da mdia fica assim: function conta(var T:Temp; var m:real) : integer integer; integer; var i, c : integer begin c := 0; for i:=1 to Max do if T[i] > m then c := c+1; Conta := c; end;

A declarao const usada para criar constantes, disponveis a todo o programa. 7.2. Exerccios

O programa ficou extremamente simples; mas, para ser executado, preciso que as rotinas obtem, media e conta sejam definidas. A rotina para a obteno dos dados pode ser codificada da seguinte maneira:

7.1. Crie tipos de vetores para armazenar: as letras vogais do alfabeto; as alturas de um grupo de 10 pessoas; e os nomes dos meses do ano. 7.2. Considere um vetor w cujos 9 elementos so do tipo integer:
1 2 3 4 5 6 7 8 9

procedure obtem(var T : Temp); var integer; var i : integer begin writeln('Informe temperaturas: '); for i:=1 to max do begin write(i,'o valor? '); write readln(T[i]); readln end; end end;

w: Supondo que i seja uma varivel do tipo integer e que seu valor seja 5, que valores estaro armazenados em w aps a execuo das atribuies a seguir?
w[1] := 17; w[i div 2] := 9; w[2i-1] := 95; w[i-1] := w[9] div 2; w[i] := w[2]; w[i+1] := w[i]+ w[i-1]; w[w[2]-2] := 78; w[w[i]-1] := w[1]* w[i];

Note que o parmetro T passado por referncia, j que desejamos preencher o vetor originalmente passado rotina e no uma cpia dele. Lembre-se de que as cpias so destrudas ao final da execuo da Noes de Pascal / Prof. Silvio Lago

11

7.3. Codifique a rotina minimax(T,x,y), que devolve atravs dos parmetros x e y, respectivamente, a mnima e a mxima entre as temperaturas armazenadas no vetor T. 7.4. Codifique a rotina Histograma(T), que exibe um histograma da variao da temperatura durante a semana. Por exemplo, se as temperaturas em T forem 19, 21, 25, 22, 20, 17 e 15C, a rotina dever exibir:
D: S: T: Q: Q: S: S:

Para atribuir valores aos campos do registro hoje, podemos escrever: hoje.dia := 25; hoje.mes := 2; hoje.ano := 2000; 8.1. Registros Aninhados possvel criar um registro em que um ou mais de seus campos tambm sejam registros, desde que tais registros tenham sido previamente definidos. Por exemplo, temos a seguir a criao de um registro contendo um campo do tipo Data j definido:

Suponha que as temperaturas em T sejam todas positivas e que nenhuma seja maior que 80C. [Dica: crie uma rotina que exibe uma linha com tamanho proporcional temperatura.] 7.5. Usando as rotinas desenvolvidas nos dois exerccios anteriores, altere o programa TAM para exibir a temperatura mdia, a mnima, a mxima e tambm o histograma de temperaturas.

type Pessoa = record nome : string[31] string[31]; fone : string[20] string[20]; nasc : Data; end; end Var amigo : Pessoa;

8. REGISTROS
Um registro uma coleo de variveis logicamente relacionadas que no precisam ser do mesmo tipo. Como no vetor, essas variveis tambm compartilham o mesmo nome e ocupam posies consecutivas de memria. Cada varivel da coleo um campo do registro e identificada por um nome de campo. Se x, y e z so nomes de campo vlidos e r um registro, ento r.x, r.y e r.z. so os campos de r.

Para atribuir valores aos campos do registro amigo, podemos escrever: amigo.nome := 'Itivaldo Buzo'; amigo.fone := '850-9973'; amigo.nasc.dia := 27; amigo.nasc.mes := 7; amigo.nasc.ano := 1970; 8.2. Tabelas Tambm possvel combinar vetores e registros de muitas maneiras interessantes. A combinao mais comum um vetor cujos elementos so registros. Como exemplo, vamos criar uma varivel para armazenar uma agenda contendo informaes sobre vrios amigos: const max = 10; array[1..max] of Pessoa; type Agenda = array Var a : Agenda;

nome do registro x y z

r:
campos

nomes dos campos

Por exemplo, as declaraes a seguir permitem a criao de uma varivel capaz de armazenar datas: type Data = record dia : integer integer; mes : integer integer; ano : integer integer; end; end var hoje : Data;

Por exemplo, para atribuir valores ao segundo elemento do vetor a, escrevemos: a[2].nome := Roberta Soares; a[2].fone := 266-0879; a[2].nasc.dia := 15; a[2].nasc.mes := 11; a[2].nasc.ano := 1971;

Noes de Pascal / Prof. Silvio Lago

12

Um vetor cujos elementos so registros denominado tabela e representado com os elementos dispostos em linhas e os campos em colunas.
nome 1 2 3 Itivaldo Buzo Roberto Soares Maria da Silva fone 850-9973 266-0879 576-8292 nasc 27/07/1970 15/11/1971 09/05/1966

Para usar um arquivo, preciso primeiro definir o seu tipo. Por exemplo, a seguir definimos um arquivo para armazenar dados de funcionrios type data = record dia, mes, ano: integer integer; end; end type func = record nome : string string[30]; salario : real real; admissao: Data; end; end type cadastro = file of func; var A : cadastro; R : func;

10

Pedro Pereira

834-0192

04/08/1973

8.3. Exerccios 8.1. Defina um tipo de registro para armazenar dados de um vo, como por exemplo os nomes das cidades de origem e de destino, datas e horrios de partida e chegada. Crie uma varivel desse tipo e atribua valores aos seus campos. 8.2. Usando o tipo j definido no exerccio anterior, defina um tipo de tabela para armazenar os dados de todos os vos de um aeroporto (suponha que o total de vos seja 5) e codifique uma rotina para preencher uma tabela dessas. 8.3. Crie uma rotina que receba uma tabela contendo as informaes de vos e a exiba na tela. 8.4. Crie uma rotina que receba uma tabela contendo as informaes de vos e uma data e exiba na tela todos os vos para a data indicada. 8.5. Usando as rotinas j definidas, codifique um programa completo para (1) preencher a tabela de vos, (2) exibir a tabela de vos na tela e (3) permitir ao usurio realizar consultas sobre os vos de uma determinada data at que ele deseje parar.

9.1. Principais Operaes em Arquivos Seja A uma varivel arquivo e R uma varivel registro, do tipo daqueles armazenados em A. Para manipular arquivos, temos os seguintes comandos bsicos: assign(A,'nome do arquivo'): associa varivel A o nome do arquivo que ela ir representar; reset(A): abre arquivo representado por A, no modo de leitura, e posiciona o primeiro registro como corrente; caso o arquivo no exista em disco, ocorre um erro de execuo; rewrite(A): abre o arquivo representado por A, no modo de gravao, e torna corrente sua primeira posio; caso o arquivo j exista, ele apagado. eof(A): devolve true se j foi atingido o final do arquivo representado por A. close(A): fecha o arquivo representado por A. read(A,R): l em R o registro corrente no arquivo representado por A e pula para o prximo; write(A,R): grava o registro R na posio corrente do arquivo representado por A e pula para a prxima posio; seek(A,P): torna P (os registros so numerados a partir de zero) a posio corrente no arquivo representado por A; filepos(A): devolve a posio corrente no arquivo representado por A; filesize(A): devolve o tamanho (nmero de registros armazenados) do arquivo representado por A; truncate(A): trunca (elimina todos os registros) a partir da posio corrente, at o final, do arquivo representado por A. 9.2. Gravando um Arquivo

9. ARQUIVOS
Um arquivo semelhante a um vetor, exceto por dois motivos: primeiro, o vetor fica armazenado na memria RAM, enquanto o arquivo fica armazenado em disco; segundo, o vetor deve ter um tamanho fixo, definido em sua declarao, enquanto o tamanho do arquivo pode variar durante a execuo do programa. A vantagem no uso de arquivos que, diferentemente do que ocorre com vetores, os dados no so perdidos entre uma execuo e outra do programa. A desvantagem que o acesso a disco muito mais lento do que o acesso memria e, conseqentemente, o uso de arquivos torna a execuo do programa mais lenta. Para melhorar a eficincia, em geral, partes do arquivo so carregadas em tabelas armazenadas na memria antes de serem manipuladas. Isso diminui o nmero de acessos em disco e aumenta a velocidade do programa. Noes de Pascal / Prof. Silvio Lago

13

Vamos codificar um simples programa que solicita os dados dos funcionrios ao usurio e os armazena em um arquivo em disco. Como a quantidade exata de funcionrios desconhecida, vamos convencionar que a entrada de dados termina se o usurio digita ponto final quando lhe solicitado o nome do funcionrio:

program lista; type data = record dia, mes, ano: integer integer; end; end func = record nome : salario : admissao: end; end var A : cadastro; R : func; begin assign(A,'FUNC.DAT'); assign reset(A); reset while not eof(A) do eof begin read(A,R); read write(R.nome,', '); write write(R.salario:0:2,', '); write write(R.admissao.dia,'/'); write write(R.admissao.mes,'/'); write writeln(R.admissao.ano); writeln end; end close(A); close end. end string[30]; string real; real Data;

program cadastra; type data = record dia, mes, ano: integer integer; end; end func = record nome : salario : admissao: end; end var A : cadastro; R : func; begin assign(A,'FUNC.DAT'); assign rewrite(A); rewrite repeat write('Nome? '); write readln(R.nome); readln if R.nome<>'.' then begin write('Salario? '); write readln(R.salario); readln writeln('Admissao: '); writeln write('Dia? '); write adln(R.admissao.dia); readln write('Ms? '); write adln(R.admissao.mes); readln write('Ano? '); write readln(R.admissao.ano); adln write(A,R); write end; end until R.nome='.'; close(A); close end. end 9.3. Lendo um Arquivo A execuo do programa cadastra, codificado acima, far com que seja criado em disco um arquivo chamado FUNC.DAT. Agora, vamos criar um programa que seja capaz de ler esse arquivo e listar seus dados em tela. Para que o arquivo seja lido corretamente, preciso usar a mesma definio de tipo. string[30]; string real; real Data;

cadastro = file of func;

cadastro = file of func;

9.3. Exerccios 9.1. Altere o programa sobre horrios de vos, codificado no exerccio 8.5, de tal forma que o usurio tenha a opo de gravar a tabela em disco ou carregar a tabela com dados lidos do disco. 9.2. Com o comando truncate no possvel remover um registro do meio do arquivo, j que ele apaga tudo desde a posio corrente at o final do arquivo. A soluo a seguinte: para remover o registro de uma posio p, no meio do arquivo, copie o ltimo registro do arquivo para a posio p e ento elimine apenas o ltimo registro. Com base nessa idia, codifique um programa, denominado exclui, que permite ao usurio excluir qualquer um dos registros do arquivo FUNC.DAT, criado pelo programa cadastra. Para cada operao de excluso, o programa deve listar os registros, e suas respectivas posies, e solicitar ao usurio o nmero do registro a ser excludo. [Dica: abra o arquivo no modo de leitura para no perder os dados] 9.3. Para acrescentar um registro num arquivo existente, abra o arquivo no modo de leitura, posicione-se na primeira posio disponvel no final do arquivo e grave o novo registro. Usando essa idia, crie um programa para incluso.

Noes de Pascal / Prof. Silvio Lago

14

Você também pode gostar