16
LINGUAGEM PASCAL NOÇÕES BÁSICAS USANDO TURBO PASCAL Silvio do Lago Pereira

Slago Pascal

Embed Size (px)

Citation preview

  • 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

  • Noes de Pascal / Prof. Silvio Lago 1

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

    varivel : tamanho_campo : casas_decimais

    programprogramprogramprogram media; varvarvarvar p1, p2, m : realrealrealreal; beginbeginbeginbegin writewritewritewrite('Primeira nota? '); readlnreadlnreadlnreadln(p1);

    writewritewritewrite('Segunda nota? '); readlnreadlnreadlnreadln(p2);

    m := (p1+p2)/2;

    writwritwritwritelnelnelneln('A mdia ', m:0:1); endendendend.

    1. INTRODUO

    A linguagem Pascal, cujo nome uma homenagem ao matemtico francs Blaise Pascal, foi desenvolvi-da na dcada de 60 pelo professor Niklaus Wirth. Inicialmente, sua finalidade era ser uma linguagem para uso didtico, que permitisse ensinar com clare-za os principais conceitos envolvidos na programa-o estruturada de computadores. Hoje, numa ver-so mais moderna denominada Delphi, essa lingua-gem tambm utilizada por profissionais de diver-sas reas tais como processamento de dados, compu-tao e engenharia.

    1.1. O Sistema Turbo Pascal

    Para criar um programa na linguagem Pascal, usa-remos o Turbo Pascal. Esse software engloba:

    um editor de textos que nos permite digitar e sal-var 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:

    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 armaze-nados, denominados variveis, so identificados por nomes que devem iniciar com letras;

    A palavra var serve para declarar o tipo das vari-veis 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 informa-o foi exibida. J o comando writeln, faz com que o cursor salte para o incio da linha seguinte.

    *

    O comando readln aguarda at que o usurio digi-te um valor e pressione 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, in-forme 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 combust-vel (l) gasto por um veculo para percorr-la, in-forme 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 2

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

    ifififif condio thenthenthenthen comando1 elseelseelseelse comando2;;;;

    1.5. A Unidade CRT A unidade CRT consiste de um conjunto de coman-dos adicionais que so oferecidos no Turbo Pascal. Como esses comandos no fazem parte da lingua-gem Pascal padro, para utiliz-los, precisamos in-cluir a seguinte instruo no programa:

    uses crt;

    Essa instruo indica ao compilador que iremos u-sar os comandos adicionais contidos na unidade CRT. Sem ela, os comandos adicionais no podem ser reconhecidos pelo compilador.

    *

    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 representa-das por nmeros de 0 a 15 ou, ento, por palavras em ingls (red, blue, ...). Para exibir texto piscan-te, adicione a palavra blink cor selecionada; por exemplo, red+blink;

    textbackground(cor): seleciona a cor do fundo so-bre o qual os textos sero exibidos. As cores so representadas da mesma maneira que no coman-do 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.

    1.6. Exerccios

    Para cada problema a seguir, codifique um progra-ma 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 velo-cidade 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 sa-la, 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 e-les. [Dica: use o teorema de Pitgoras]

    2. A ESTRUTURA DE SELEO A estrutura de seleo, ou condicional, uma estru-tura 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.

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

    y Q yQ yP P 0 xP xQ x

    1 2 3 ... col ... 80 1 2 3 ... lin ... 25

  • Noes de Pascal / Prof. Silvio Lago 3

    programprogramprogramprogram situacao; uses uses uses uses crt; varvarvarvar p1, p2, m : realrealrealreal; beginbeginbeginbegin clrscrclrscrclrscrclrscr;

    writewritewritewrite('Informe as duas notas: '); readlnreadlnreadlnreadln(p1,p2);

    m := (p1+p2)/2;

    writelnwritelnwritelnwriteln('Mdia: ', m:0:1); writewritewritewrite('Situao: ');

    ifififif m >= 7.0 thenthenthenthen writelnwritelnwritelnwriteln('aprovado') elseelseelseelse writelnwritelnwritelnwriteln('reprovado');

    readlnreadlnreadlnreadln; endendendend.

    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.

    ...

    ifififif m >= 7.0 thenthenthenthen

    begin begin begin begin

    textcolor textcolor textcolor textcolor(blue);

    writelnwritelnwritelnwriteln('aprovado');

    endendendend elseelseelseelse beginbeginbeginbegin textcolortextcolortextcolortextcolor(red); writelnwritelnwritelnwriteln('reprovado'); endendendend; ...

    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.

    *

    A expresso lgica, usada como condio, pode ser formada pelos seguintes tipos de operadores:

    aritmticos: +, , , /, div e mod; relacionais: =, , , =;

    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 apro-vado ou reprovado:

    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 ni-co bloco, isto , precisamos coloc-los entre as pala-vras begin e end. Por exemplo, suponha que fosse necessrio alterar o programa anterior de modo que a mensagem aprovado fosse exibida em azul e re-provado, em vermelho. Ento, teramos que codifi-car a estrutura de seleo do seguinte modo:

    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 de-les o maior.

    2.3. Dada a idade de uma pessoa, informe se ela po-de 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 re-colhe-se 15% dos salrios acima de R$ 1.200,00 para o imposto de renda. Dado o nmero de ho-ras 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 me-nos 7,0 so aprovados, aqueles com mdia infe-rior 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, verme-lho e amarelo para as mensagens aprovado, re-provado e recuperao, respectivamente.

    2.7. Dados os coeficientes (a0, b e c) de uma equa-o do 2o grau, informe suas razes reais. Utili-ze a frmula de Bskara:

    a.

    c.a.bbx , 2

    4221

    =

    2.8. Dados trs nmeros, verifique se eles podem ser as medidas dos lados de um tringulo e, se pu-derem, classifique o tringulo em equiltero, i-ssceles ou escaleno.

  • Noes de Pascal / Prof. Silvio Lago 4

    forforforfor cnt := vi totototo vf dodododo comando;;;;

    programprogramprogramprogram tabuada; vavavavarrrr n, c, r : integerintegerintegerinteger; beginbeginbeginbegin write write write write('Digite um nmero: '); readlnreadlnreadlnreadln(n);

    forforforfor c:=1 totototo 10 dodododo writeln writeln writeln writeln(n,' x ',c,' = ',n*c);

    readln readln readln readln; endendendend.

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

    programprogramprogramprogram regressivo; varvarvarvar n, c: integerintegerintegerinteger; beginbeginbeginbegin write write write write('Digite um nmero: '); readlnreadlnreadlnreadln(n);

    forforforfor c:=n downtdowntdowntdowntoooo 1 dodododo writeln( writeln( writeln( writeln(c););););

    readln readln readln readln; endendendend.

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

    3. REPETIO COM CONTADOR

    A estrutura de repetio com contador uma estru-tura que nos permite executar uma ou mais instru-es, um determinado nmero de vezes. Para con-trolar o nmero de repeties, empregamos uma varivel denominada contador.

    Ao encontrar o for, o computador primeiro atribui o valor inicial vi ao contador cnt. A partir da, o co-mando associado estrutura executado repetida-mente, 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 co-mando for:

    *

    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:

    *

    3.2. Contagem Decrescente

    Algumas vezes, ao invs de fazer o contador aumen-tar, 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:

    3.3. Exerccios

    Para cada problema, codifique um programa Pascal:

    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 pri-meiros 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 se-mana 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:

    cnt

  • Noes de Pascal / Prof. Silvio Lago 5

    whilewhilewhilewhile condio dodododo comando;;;;

    programprogramprogramprogram digitos; varvarvarvar n, r : integerintegerintegerinteger; beginbeginbeginbegin write write write write('Digite um nmero: '); readlnreadlnreadlnreadln(n);

    whilewhilewhilewhile n>0 dodododo begin begin begin begin r := n modmodmodmod 10; n := n divdivdivdiv 10; writeln writeln writeln writeln(r); endendendend;

    readlnreadlnreadlnreadln; endendendend.

    Seja n = 7314 o nmero da conta.

    1 Adiciona-se todos os dgitos de n, obtendo-se 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, a-grupe-os em um bloco com begin e end.

    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 expres-so lgica, denominada condio, que avaliada a cada nova repetio, sempre antes que o comando seja executado. Enquanto essa expresso verda-deira, o comando repetido.

    Veja a seguir o fluxograma que ilustra o funciona-mento desta estrutura de repetio:

    *

    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 es-tratgia ser dividir o nmero sucessivamente por 10 e ir exibindo os restos obtidos. O processo pra somente quando o quociente obtido numa das divi-ses zero:

    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.

    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 n-mero n de mpares consecutivos que podem ser subtrados de um nmero x (sem produzir re-sultado negativo) igual raiz quadrada intei-ra de x. Por exemplo, se tivermos x=18, pode-remos 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 i-guais 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 i-dentificadas por nmeros de at quatro dgitos. Por motivo de consistncia, a cada nmero n associado um dgito verificador d calculado da seguinte maneira:

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

    8315 10 8310 831 10 5 830 83 10 1 80 8 10 3 0 0 pra 8

    condio

    comando

    V

    F

    ...

    ...

  • Noes de Pascal / Prof. Silvio Lago 6

    repeat repeat repeat repeat comando;;;; until until until until condio;;;;

    programprogramprogramprogram caixa; usesusesusesuses crt; varvarvarvar s, p : realrealrealreal; beginbeginbeginbegin clrscr clrscr clrscr clrscr;

    s := 0;

    repeatrepeatrepeatrepeat write write write write('Preo? '); readlnreadlnreadlnreadln(p);

    s := s+p;

    untiluntiluntiluntil p=0;

    writeln writeln writeln writeln('Total a pagar: R$',s:0:2);

    readlnreadlnreadlnreadln; endendendend.

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

    Saldo inicial? 1000.00

    Operao? 200 Operao? -50 Operao? -10 Operao? 170 Operao? -500 Operao? 0 --------------

    Crditos..: R$ 370.00 Dbitos...: R$ 560.00 C.P.M.F...: R$ 2.24 Saldo.....: R$ 807.76

    programprogramprogramprogram tab; usesusesusesuses crt; varvarvarvar n, c, r : integerintegerintegerinteger; beginbeginbeginbegin clrscr; clrscr; clrscr; clrscr;

    repeat repeat repeat repeat gotoxy gotoxy gotoxy gotoxy(1,1); writewritewritewrite('Digite um nmero: '); clreolclreolclreolclreol; readlnreadlnreadlnreadln(n); untiluntiluntiluntil (n>=1) and (n

  • Noes de Pascal / Prof. Silvio Lago 7

    As variveis locais e os parmetros so cri-ados na memria apenas no momento em que a rotina entra em execuo e deixam de existir assim que a execuo concluda.

    6. MODULARIAO A modularizao uma tcnica de desenvolvimento baseada no princpio de "diviso e conquista": para resolvermos um problema complexo, primeiro iden-tificamos e resolvemos subproblemas mais simples e, ento, combinamos as solues desses subproble-mas para obter a soluo do problema original. Esse processo de decomposio de problemas em subpro-blemas representado atravs de um diagrama hie-rrquico funcional (D.H.F.), conforme segue:

    No exemplo acima, o problema original P foi decom-posto em trs subproblemas: A, B e C. Eventual-mente, aps uma decomposio, podem surgir sub-problemas 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 suficien-temente simples para que sejam resolvidos direta-mente. Cada mdulo do D.H.F. corresponde a uma rotina que dever ser codificada no programa Pas-cal. Note que o projeto feito de cima para baixo (top-down), enquanto a implementao deve ser fei-ta de baixo para cima (botton-up). Isso quer dizer que, no programa Pascal, um mdulo s deve apare-cer quando todos aqueles dos quais ele depende j foram codificados anteriormente. Sendo assim, o mdulo principal ser sempre o ltimo a ser codifi-cado no programa.

    6.1. Mdulos

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

    2 O mesmo que rotina ou comando.

    sentam perguntas, procedimentos representam or-dens. Por exemplo, considere os comandos a seguir:

    ... clrscr; write('Num? '); readln(n);

    r := sqrt(n); writeln('Raiz de ',n:0:1,' ',r:0:1); ...

    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 qua-drada de n e, portanto, uma funo. O procedi-mento 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 co-mando 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:

    Toda funo deve ter um nome, atravs do qual ela possa ser chamada no programa. Para executar, uma funo pode precisar receber alguns parme-tros de entrada e, ao final de sua execuo, devolve uma resposta do tipo especificado. Se a funo pre-cisa de outras variveis, alm dos parmetros, essas devem ser declaradas como variveis locais. Para indicar a resposta final devolvida pela funo, de-vemos atribuir seu valor ao nome da funo.

    *

    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.

    P

    A B C

    E D F

    Top

    Down

    Up

    Botton

    functionfunctionfunctionfunction nome(parmetros) : tipo; variveis locais; beginbeginbeginbegin

    instrues; ... nome := resposta; endendendend;

  • Noes de Pascal / Prof. Silvio Lago 8

    Em Pascal, comentrios so indicados en-tre chaves e so ignorados na compilao.

    Para usar essa funo num programa, basta lem-brar que a implementao deve ser botton-up e que, portanto, o cdigo da funo deve aparecer antes do cdigo do mdulo principal3 do programa.

    A execuo do programa inicia-se sempre no mdulo principal e se o comando no chamado nesse m-dulo ele no executado. No exemplo acima, o co-mando 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.

    *

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

    6.3 Exerccios

    Para cada problema a seguir, crie uma funo e co-difique 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 ab-soluto, 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 verifi-cador conforme definido no exerccio 4.4.

    6.4. Procedimentos Procedimentos tm o seguinte formato:

    Assim como funes, procedimentos devem ter um nome, atravs do qual ele possa ser chamado. Pro-cedimentos podem receber parmetros de entrada, mas no fornecem um valor de sada e, portanto, no precisamos declarar o tipo de resposta.

    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 conten-do 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 apare-cer codificado aps ele (similarmente ao que foi feito no programa TesteHip).

    functionfunctionfunctionfunction hip(a, b : realrealrealreal) : realrealrealreal; varvarvarvar c : realrealrealreal; beginbeginbeginbegin

    c := sqrtsqrtsqrtsqrt(sqrsqrsqrsqr(a)+sqrsqrsqrsqr(b));

    hip := c; endendendend;

    procedureprocedureprocedureprocedure nome(parmetros); variveis locais; beginbeginbeginbegin

    instrues; ... endendendend;

    procedureprocedureprocedureprocedure msg(c,l:integerintegerintegerinteger; m:stringstringstringstring); beginbeginbeginbegin

    gotoxygotoxygotoxygotoxy(c,l);

    writewritewritewrite(m); endendendend;

    programprogramprogramprogram TesteHip; usesusesusesuses crt; varvarvarvar x, y, h : real; { clculo da hipotenusa }

    functionfunctionfunctionfunction hip(a, b : realrealrealreal) : realrealrealreal; varvarvarvar c : realrealrealreal; beginbeginbeginbegin

    c := sqrtsqrtsqrtsqrt(sqrsqrsqrsqr(a)+sqrsqrsqrsqr(b));

    hip := c; endendendend; { mdulo principal }

    beginbeginbeginbegin writewritewritewrite('Catetos? '); readlnreadlnreadlnreadln(x,y);

    h := hip(x,y); writewritewritewrite('Hipotenusa: ',h:0:1); endendendend.

  • Noes de Pascal / Prof. Silvio Lago 9

    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 li-nha horizontal com n caracteres de compri-mento, 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 es-t na posio (Ci,Li) e cujo canto direito inferi-or est na posio (Cf,Lf); entretanto, ela con-tm alguns erros. Codifique um programa pa-ra 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.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 posi-o (c,l) da tela. Usando essa rotina e horiz(), codifique uma nova verso do comando M, que desenha molduras.

    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 com-partilha 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 diretamen-te o argumento original. Para indicar que a passa-gem deve ser feita por referncia, devemos prefixar a declarao do parmetro com a palavra var.

    Para entender a utilidade da passagem por refern-cia, vamos considerar um exemplo: criar um coman-do 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)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.

    Como podemos ver acima, parmetros passados por valor so criados como cpias dos argumentos origi-nais. 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. Retornan-do ao programa principal, os valores de x e y estaro inalterados e, portanto, teremos 57 como sada.

    ... procedureprocedureprocedureprocedure troca(a,b:integerintegerintegerinteger); varvarvarvar c : integerintegerintegerinteger; beginbeginbeginbegin

    c := a;

    a := b;

    b := c; endendendend; ...

    beginbeginbeginbegin ...

    x := 5; y := 7;

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

    b: 7

    a: 5

    X: 5

    y: 7

    c: ?

    Os parmetros so cpias dos argumentos!

    Argumentos originais.

  • Noes de Pascal / Prof. Silvio Lago 10

    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 acres-centar a palavra var na declarao dos parmetros:

    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 mem-ria 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 ver-so, 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 ori-ginais para uso futuro no programa. Essa seguran-a, 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 refern-cia deve ser feita com base na seguinte regra: se esperado que um argumento seja alterado pela exe-cuo de uma rotina, ento a sua passagem deve ser feita por referncia.

    6.8. Exerccios

    6.14. No comando readln(n), o argumento n pas-sado por valor ou por referncia? Por qu?

    6.15. Explique por que o parmetro n da funo pa-ra clculo de dgito verificador, criada no e-xerccio 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 exem-plo, 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 cor-rente 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 ocu-pam posies consecutivas de memria. Cada vari-vel 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].

    Antes de criar um vetor preciso declarar o seu ti-po, ou seja, especificar a quantidade e o tipo dos e-lementos que ele ir conter. Isso feito atravs do comando type, conforme exemplificado a seguir.

    typetypetypetype vetor = arrayarrayarrayarray[1..5] ofofofof integerintegerintegerinteger; varvarvarvar v : vetor;

    A primeira linha define um novo tipo de vetor, de-nominado 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 qual-quer 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] cau-sar um erro de compilao; j que a expresso i/2 tem valor igual a 1.5, que no um ndice permitido.

    ... procedureprocedureprocedureprocedure troca(varvarvarvar a,b:integerintegerintegerinteger); varvarvarvar c : integerintegerintegerinteger; beginbeginbeginbegin

    c := a;

    a := b;

    b := c; endendendend; ...

    beginbeginbeginbegin ...

    x := 5; y := 7;

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

    a,X: 5

    7

    c: ? varivel local

    Parmetros e argumentos compartilham o mesmo espao!

    b,y:

    1 2 3 n

    v:

    nome do vetor ndices

    elementos

  • Noes de Pascal / Prof. Silvio Lago 11

    A declarao const usada para criar cons-tantes, disponveis a todo o programa.

    7.1. As temperaturas Acima da Mdia

    Dadas as temperaturas que foram registradas dia-riamente, durante uma semana, deseja-se determi-nar em quantos dias dessa semana a temperatura esteve acima da mdia. A soluo para esse proble-ma 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 so-luo contribui para a soluo do problema origi-nalmente proposto. Ento, supondo que eles j esti-vessem solucionados, o programa poderia ser codifi-cado como segue:

    *

    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:

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

    rotina e que, portanto, os valores armazenados se-ro perdidos se a passagem for por valor. Note tam-bm que, na rotina que calcula a mdia a seguir, a passagem poderia ser por valor, pois no pretende-mos alterar a varivel original; entretanto, a passa-gem por referncia torna o cdigo mais eficiente.

    Finalmente, a rotina que faz a contagem das tempe-raturas acima da mdia fica assim:

    7.2. Exerccios

    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:

    Supondo que i seja uma varivel do tipo integer e que seu valor seja 5, que valores estaro ar-mazenados em w aps a execuo das atribui-es 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];

    programprogramprogramprogram TAM;

    constconstconstconst max = 7;

    TypeTypeTypeType Temp = arrayarrayarrayarray[1..max] ofofofof realrealrealreal; var var var var T : Temp; m : realrealrealreal; ...

    beginbeginbeginbegin obtem(T); m := media(T); writelnwritelnwritelnwriteln('Total = ',conta(T,m)); endendendend.

    procedureprocedureprocedureprocedure obtem(varvarvarvar T : Temp); varvarvarvar i : integerintegerintegerinteger;

    beginbeginbeginbegin writeln('Informe temperaturas: ');

    forforforfor i:=1 totototo max dodododo beginbeginbeginbegin writewritewritewrite(i,'o valor? '); readlnreadlnreadlnreadln(T[i]); endendendend; end;end;end;end;

    functionfunctionfunctionfunction media(varvarvarvar T : Temp) : reareareareallll; varvarvarvar i : integerintegerintegerinteger; S : realrealrealreal; beginbeginbeginbegin

    S := 0; ForForForFor i:=1 totototo Max dodododo

    S := S + T[i]; media := S/max; end;end;end;end;

    functionfunctionfunctionfunction conta(varvarvarvar T:Temp; m:real) : intintintinteeeegergergerger; varvarvarvar i, c : integerintegerintegerinteger; beginbeginbeginbegin c := 0; forforforfor i:=1 totototo Max dodododo ifififif T[i] > m thenthenthenthen

    c := c+1; Conta := c; end;end;end;end;

    1 2 3

    w: 4 5 6 7 8 9

  • Noes de Pascal / Prof. Silvio Lago 12

    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 duran-te a semana. Por exemplo, se as temperaturas em T forem 19, 21, 25, 22, 20, 17 e 15C, a roti-na dever exibir: D:

    S:

    T:

    Q:

    Q:

    S:

    S:

    Suponha que as temperaturas em T sejam to-das positivas e que nenhuma seja maior que 80C. [Dica: crie uma rotina que exibe uma li-nha com tamanho proporcional temperatura.]

    7.5. Usando as rotinas desenvolvidas nos dois exer-ccios anteriores, altere o programa TAM para exibir a temperatura mdia, a mnima, a m-xima e tambm o histograma de temperaturas.

    8. REGISTROS

    Um registro uma coleo de variveis logicamente relacionadas que no precisam ser do mesmo tipo. Como no vetor, essas variveis tambm comparti-lham 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 re-gistro, ento r.x, r.y e r.z. so os campos de r.

    Por exemplo, as declaraes a seguir permitem a criao de uma varivel capaz de armazenar datas:

    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:

    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 ar-mazenar uma agenda contendo informaes sobre vrios amigos:

    Por exemplo, para atribuir valores ao segundo ele-mento 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;

    x y z r:

    nome do registro nomes dos campos

    campos

    typetypetypetype Data = recordrecordrecordrecord dia : integerintegerintegerinteger; mes : integerintegerintegerinteger; ano : integerintegerintegerinteger; endendendend;

    varvarvarvar hoje : Data;

    typetypetypetype Pessoa = recordrecordrecordrecord nome : string[31]string[31]string[31]string[31]; fone : string[20]string[20]string[20]string[20]; nasc : Data; endendendend;

    VarVarVarVar amigo : Pessoa;

    const const const const max = 10;

    type type type type Agenda = arrayarrayarrayarray[1..max] ofofofof Pessoa; VarVarVarVar a : Agenda;

  • Noes de Pascal / Prof. Silvio Lago 13

    Um vetor cujos elementos so registros denomina-do tabela e representado com os elementos dispos-tos em linhas e os campos em colunas.

    8.3. Exerccios

    8.1. Defina um tipo de registro para armazenar da-dos 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 (supo-nha 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 conten-do as informaes de vos e a exiba na tela.

    8.4. Crie uma rotina que receba uma tabela conten-do 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 de-seje parar.

    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 tama-nho 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, con-seqentemente, o uso de arquivos torna a execuo do programa mais lenta. Para melhorar a eficincia, em geral, partes do arquivo so carregadas em tabe-las armazenadas na memria antes de serem mani-puladas. Isso diminui o nmero de acessos em disco e aumenta a velocidade do programa.

    Para usar um arquivo, preciso primeiro definir o seu tipo. Por exemplo, a seguir definimos um arqui-vo para armazenar dados de funcionrios

    9.1. Principais Operaes em Arquivos

    Seja A uma varivel arquivo e R uma varivel regis-tro, do tipo daqueles armazenados em A. Para ma-nipular arquivos, temos os seguintes comandos b-sicos:

    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 ar-quivo 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 pr-xima posio;

    seek(A,P): torna P (os registros so numerados a partir de zero) a posio corrente no arquivo re-presentado por A;

    filepos(A): devolve a posio corrente no arquivo representado por A;

    filesize(A): devolve o tamanho (nmero de regis-tros 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

    Itivaldo Buzo 850-9973 27/07/1970

    Roberto Soares 266-0879 15/11/1971

    Maria da Silva 576-8292 09/05/1966

    1

    2

    3

    Pedro Pereira 834-0192 04/08/1973 10

    nome fone nasc

    typetypetypetype data = recordrecordrecordrecord dia, mes, ano: intintintinteeeegergergerger; endendendend;

    typetypetypetype func = recordrecordrecordrecord nome : stringstringstringstring[30]; salario : realrealrealreal; admissao: Data; endendendend;

    typetypetypetype cadastro = file of = file of = file of = file of func;

    varvarvarvar A : cadastro; R : func;

  • Noes de Pascal / Prof. Silvio Lago 14

    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 fun-cionrio:

    9.3. Lendo um Arquivo

    A execuo do programa cadastra, codificado acima, far com que seja criado em disco um arquivo cha-mado FUNC.DAT. Agora, vamos criar um programa que seja capaz de ler esse arquivo e listar seus da-dos em tela. Para que o arquivo seja lido correta-mente, preciso usar a mesma definio de tipo.

    9.3. Exerccios

    9.1. Altere o programa sobre horrios de vos, codi-ficado no exerccio 8.5, de tal forma que o usu-rio 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 apa-ga 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 posi-o p e ento elimine apenas o ltimo registro. Com base nessa idia, codifique um programa, denominado exclui, que permite ao usurio ex-cluir qualquer um dos registros do arquivo FUNC.DAT, criado pelo programa cadastra. Pa-ra 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 lei-tura para no perder os dados]

    9.3. Para acrescentar um registro num arquivo exis-tente, abra o arquivo no modo de leitura, posi-cione-se na primeira posio disponvel no final do arquivo e grave o novo registro. Usando essa idia, crie um programa para incluso.

    program program program program cadastra;

    typetypetypetype data = recordrecordrecordrecord dia, mes, ano: intintintinteeeegergergerger; endendendend;

    func = recordrecordrecordrecord nome : stringstringstringstring[30]; salario : realrealrealreal; admissao: Data; endendendend;

    cadastro = file of = file of = file of = file of func;

    varvarvarvar A : cadastro; R : func; beginbeginbeginbegin assignassignassignassign(A,'FUNC.DAT'); rewriterewriterewriterewrite(A);

    repeatrepeatrepeatrepeat writewritewritewrite('Nome? '); readlnreadlnreadlnreadln(R.nome);

    ifififif R.nome'.' thenthenthenthen beginbeginbeginbegin writewritewritewrite('Salario? '); readlnreadlnreadlnreadln(R.salario); writelnwritelnwritelnwriteln('Admissao: '); writewritewritewrite('Dia? '); rrrreeeeadlnadlnadlnadln(R.admissao.dia); writewritewritewrite('Ms? '); rrrreeeeadlnadlnadlnadln(R.admissao.mes); writewritewritewrite('Ano? '); rrrreeeeadlnadlnadlnadln(R.admissao.ano); writewritewritewrite(A,R); endendendend;

    untiluntiluntiluntil R.nome='.';

    closeclosecloseclose(A); endendendend.

    program program program program lista;

    typetypetypetype data = recordrecordrecordrecord dia, mes, ano: intintintinteeeegergergerger; endendendend;

    func = recordrecordrecordrecord nome : stringstringstringstring[30]; salario : realrealrealreal; admissao: Data; endendendend;

    cadastro = file of = file of = file of = file of func;

    varvarvarvar A : cadastro; R : func; beginbeginbeginbegin assignassignassignassign(A,'FUNC.DAT'); resetresetresetreset(A);

    while not eofwhile not eofwhile not eofwhile not eof(A) do do do do begin begin begin begin readreadreadread(A,R); writewritewritewrite(R.nome,', '); write write write write(R.salario:0:2,', '); write write write write(R.admissao.dia,'/'); write write write write(R.admissao.mes,'/'); writeln writeln writeln writeln(R.admissao.ano); end end end end;

    close close close close(A); endendendend.