Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Linguagem Pascal, Notas de estudo de Cultura

Linguagem de Progrmação Pascal

Tipologia: Notas de estudo

2011

Compartilhado em 13/07/2011

marco-sousa-19
marco-sousa-19 🇧🇷

3 documentos

1 / 16

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
L
INGUAGEM
P
ASCAL
N
OÇÕES
B
ÁSICAS
U
SANDO
T
URBO
P
ASCAL
Silvio do Lago Pereira
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Pré-visualização parcial do texto

Baixe Linguagem Pascal e outras Notas de estudo em PDF para Cultura, somente na Docsity!

LINGUAGEM PASCAL

NOÇÕES BÁSICAS USANDO TURBO PASCAL

Silvio do Lago Pereira

SUMÁRIO

    1. Introdução
    • 1.1. O Sistema Turbo Pascal
    • 1.2. Um Primeiro Exemplo...........................
    • 1.3. Algumas Explicações
    • 1.4. Exercícios
    • 1.5. A Unidade CRT......................................
    • 1.6. Exercícios
    1. A Estrutura de Seleção
    • 2.1. Um Exemplo de Aplicação.....................
    • 2.2. Utilizando Blocos de Comandos
    • 2.3. Exercícios
    1. Repetição com Contador
    • 3.1. Fazendo Tabuadas
    • 3.2. Contagem Decrescente
    • 3.3. Exercícios ................................................
    1. Repetição com Precondição
    • 4.1. Exibindo os Dígitos de um Número
    • 4.2. Exercícios ................................................
    1. Repetição com Poscondição
    • 5.1. Automatizando o Caixa
    • 5.2. Forçando uma entrada
    • 5.3. Exercícios ................................................
    1. Modularização............................................
    • 6.1. Módulos
    • 6.2. Funções
    • 6.3. Exercícios
    • 6.4. Procedimentos.........................................
    • 6.5. Exercícios
    • 6.6. Passagem de Parâmetros .......................
    • 6.7. Valor versus Referência
    • 6.8. Exercícios ................................................
    1. Vetores
    • 7.1. As Temperaturas Acima da Média
    • 7.2. Exercícios
        1. Registros
        • 8.1. Registros Aninhados
        • 8.2. Tabelas
        • 8.3. Exercícios
        1. Arquivos
        • 9.1. Principais Operações em Arquivos.......
        • 9.2. Gravando um Arquivo
        • 9.3. Lendo um Arquivo
        • 9.4. Exercícios

Essa instrução deve ser a segunda linha do programa, conforme indicado a seguir: program exemplo; uses crt; ...

ifif^ ifif^ condição thenthenthenthen comando 1 elseelseelseelse comando 2 ;;;;

1.5. A Unidade CRT

A unidade CRT consiste de um conjunto de coman- dos adicionais que são oferecidos no Turbo Pascal. Como esses comandos não fazem parte da lingua- gem Pascal padrão, para utilizá-los, precisamos in- cluir a seguinte instrução no programa:

uses crt;

Essa instrução indica ao compilador que iremos u- sar os comandos adicionais contidos na unidade CRT. Sem ela, os comandos adicionais não podem ser reconhecidos pelo compilador.

Temos a seguir a descrição dos comandos definidos em CRT que são mais utilizados em Turbo Pascal:

 clrscr: limpa a tela e posiciona o cursor no início da primeira linha;

 textcolor(cor): seleciona a cor na qual os textos serão exibidos no vídeo. As cores são representa- das por números de 0 a 15 ou, então, por palavras em inglês (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 serão exibidos. As cores são representadas da mesma maneira que no coman- do anterior. Para que a tela toda apareça na cor de fundo selecionada, execute o comando clrscr logo após o textbackground;

à gotoxy(col, lin): posiciona o cursor na posição de tela indicada. Caso o valor de col ( 1 a 80 ) ou lin ( 1 a 25 ) esteja fora do intervalo permitido, o cursor não é movimentado.

1.6. Exercícios

Para cada problema a seguir, codifique um progra- ma Pascal. Use os comandos adicionais disponíveis em CRT e, para não ter que ficar digitando Alt+F para ver os resultados, inclua readln^1 como a última instrução do programa (antes do end).

1.6. Dada uma distância (km ) e o tempo (h ) gasto por um veículo para percorrê-la, informe a velo- cidade média do veículo (km/h ). 1.7. Dada uma medida em centímetros (c), informe o valor correspondente em polegadas (p). Utilize a fórmula: p = c / 2 , 54. 1.9. Dada uma temperatura em graus Celsius (ºC ), informe a correspondente em graus Fahrenheit (ºF ). Utilize a fórmula: F = ( 9 / 5 ) ×C+ 32. 1.10. Sabe-se que 1m^2 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 distância entre e- les. [Dica: use o teorema de Pitágoras]

2. A ESTRUTURA DE SELEÇÃO

A estrutura de seleção, ou condicional, é uma estru- tura que nos permite selecionar e executar apenas um entre dois comandos possíveis. Para decidir qual comando deverá ser executado, emprega-se uma expressão lógica, denominada condição: se esta for verdadeira, seleciona-se a primeira alternativa; caso contrário, se for falsa, seleciona-se a segunda.

(^1) Quando usado sem variáveis, o comando readln apenas aguarda que o usuário pressione a tecla .

y Q yQ

yP P

0 xP xQ x

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

programprogramprogramprogram situacao; usesusesusesuses crt; varvarvarvar p1, p2, m : realrealrealreal; beginbeginbeginbegin clrscrclrscr;clrscrclrscr writewrite('Informe as duas notas: ');writewrite readlnreadln(p1,p2);readlnreadln m := (p1+p2)/2; writelnwriteln('Média:writelnwriteln^ ',^ m:0:1); writewrite('Situação: ');writewrite ifififif m >= 7. thenthenthenthen writelnwritelnwritelnwriteln('aprovado') elseelseelseelse writelnwritelnwritelnwriteln('reprovado'); readlnreadln;readlnreadln endendendend.

À vezes, não há duas alternativas, apenas uma: ou o comando é executado ou, então, nada é feito. Nestas ocasiões, pode-se omitir a parte else do comando if-else.

ifififif m >= 7.0 thenthenthenthen beginbeginbeginbegin textcolortextcolortextcolortextcolor(blue); writelnwritelnwritelnwriteln('aprovado'); endendendend elseelseelseelse beginbeginbeginbegin textcolortextcolor(red);textcolortextcolor writelnwriteln('reprovado');writelnwriteln endendendend; ...

Observe que os comandos no if-else são mutuamente exclusivos, isto é, a seleção de um deles impede que o outro seja executado, e vice-versa.

A expressão lógica, usada como condição, pode ser formada pelos seguintes tipos de operadores:

 aritméticos: +, −, ∗, /, div e mod;

 relacionais: =, <>, <, >, <= e >=;

 lógicos: not, and e or.

2.1. Um Exemplo de Aplicação

Temos a seguir um exemplo de como empregar a estrutura de seleção ao codificar um programa em Pascal. Neste exemplo, são 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 necessário executar mais que um comando quando a condição 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 necessário alterar o programa anterior de modo que a mensagem aprovado fosse exibida em azul e re- provado, em vermelho. Então, teríamos que codifi- car a estrutura de seleção do seguinte modo:

2.3. Exercícios

Para cada problema, codifique um programa Pascal:

2.1. Dado um número, informe se ele é par. 2.2. Dados dois números distintos, informe qual de- les é o maior. 2.3. Dada a idade de uma pessoa, informe se ela po- de ou não 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 salários acima de R$ 1.200, 00 para o imposto de renda. Dado o número de ho- ras trabalhadas por um funcionário, informe o valor do seu salário bruto, do desconto de I.R. e do seu salário líquido. 2.6. Numa faculdade, os alunos com média pelo me- nos 7,0 são aprovados, aqueles com média infe- rior a 3,0 são reprovados e os demais ficam de recuperação. Dadas as duas notas de um aluno, informe sua situação. Use as cores azul, verme- lho e amarelo para as mensagens aprovado, re- provado e recuperação, respectivamente. 2.7. Dados os coeficientes (a≠0, b e c) de uma equa- ção do 2o^ grau, informe suas raízes reais. Utili- ze a fórmula de Báskara:

. a

x b b .a.c , (^2)

(^24) 12 =− ±^ −

2.8. Dados três números, verifique se eles podem ser as medidas dos lados de um triângulo e, se pu- derem, classifique o triângulo em equilátero, i- sósceles ou escaleno.

whilewhilewhilewhile condição dodododo comando;;;;

programprogram programprogram digitos; varvarvarvar n, r : integerintegerintegerinteger; beginbeginbeginbegin writewritewritewrite('Digite um número: '); readlnreadlnreadlnreadln(n); whilewhilewhilewhile n>0 dodododo beginbeginbeginbegin r := n modmodmodmod 10; n := n divdivdivdiv 10; writelnwritelnwritelnwriteln(r); endend;endend readlnreadlnreadlnreadln; endend.endend

Seja n = 7314 o número da conta. 1 º^ Adiciona-se todos os dígitos de n, obtendo- se a soma s. Para o n considerado, a soma seria: s = 4 + 1 + 3 + 7 = 15 ; 2 º^ O dígito verificador d é dado pelo resto da divisão de s por 10. Para o s considerado, o dígito verificador seria d = 5

Para repetir vários comandos no while, a- grupe-os em um bloco com begin e end.

4. REPETIÇÃO COM PRECONDIÇÃO

Através da estrutura de repetição com precondição, um comando pode ser executado repetidamente, sem que tenhamos que escrevê-lo diversas vezes no programa. Para controlar a repetição, a execução do comando fica condicionada ao valor de uma expres- são lógica, denominada condição, que é avaliada a cada nova repetição, sempre antes que o comando seja executado. Enquanto essa expressão é verda- deira, o comando é repetido.

Veja a seguir o fluxograma que ilustra o funciona- mento desta estrutura de repetição:

4.1. Exibindo os Dígitos de um Número...

No exemplo a seguir mostramos como a estrutura de repetição com precondição pode ser usada para criar um programa que exibe um a um os dígitos que compõem um número natural. Por exemplo, sendo fornecido como entrada o número 8315 , o programa deverá exibir como saída os dígitos 5 , 1 , 3 e 8. A es- tratégia será dividir o número sucessivamente por 10 e ir exibindo os restos obtidos. O processo pára somente quando o quociente obtido numa das divi- sões é zero:

4.2. Exercícios

Para cada problema, codifique um programa Pascal: 4.1. Dado um número n, exibir todos os ímpares menores que n. Por exemplo, para n= 10 deverão ser exibidos os ímpares: 1 , 3 , 5 , 7 e 9. 4.2. A soma de n ímpares consecutivos, a partir de 1 , é equivalente a n^2. Por exemplo, 1^2 =1, 22 = 1 + 3 , 32 = 1 + 3 + 5 , 42 = 1 + 3 + 5 + 7 , ... Inversamente, o nú- mero n de ímpares consecutivos que podem ser subtraídos de um número x (sem produzir re- sultado negativo) é igual à raiz quadrada intei- ra de x. Por exemplo, se tivermos x=18, pode- remos subtrair dele no máximo 1 + 3 + 5 + 7 = 16 , e a resposta será n= 4. Dado um número x, informe sua raiz quadrada inteira n, usando essa idéia. 4.3. A Série de Fibonacci é: 1 , 1 , 2 , 3 , 5 , 8 , 13 , ... Note que os dois primeiros termos desta série são i- guais a 1 e, a partir do terceiro, o termo é dado pela soma dos dois termos anteriores. Dado um número n ≥ 2 , exiba todos os termos da série que sejam menores ou iguais a n. 4.4. Numa certa agência bancária, as contas são i- dentificadas por números de até quatro dígitos. Por motivo de consistência, a cada número n é associado um dígito verificador d calculado da seguinte maneira:

Dado um número de conta n, informe o dígito verificador correspondente.

8315 10 8310 831 10 5 830 83 10 1 80 8 10 3 0 0 pára 8

condição

comando

V

F

repeatrepeatrepeatrepeat comando;;;; untiluntiluntiluntil condição;;;;

programprogramprogramprogram caixa; usesusesusesuses crt; varvarvarvar s, p : realrealrealreal; beginbeginbeginbegin clrscrclrscrclrscrclrscr; s := 0; repeatrepeatrepeatrepeat writewritewritewrite('Preço? '); readlnreadlnreadlnreadln(p); s := s+p; untiluntiluntiluntil p=0; writelnwritelnwritelnwriteln('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. Operação? 200 Operação? - Operação? - Operação? 170 Operação? - Operação? 0


Créditos..: R$ 370. Débitos...: R$ 560. C.P.M.F...: R$ 2. Saldo.....: R$ 807.

programprogram programprogram tab; usesusesusesuses crt; varvarvarvar^ n,^ c,^ r :^ integerinteger;integerinteger beginbeginbeginbegin clrscr;clrscr;clrscr;clrscr; repeatrepeatrepeatrepeat gotoxygotoxygotoxygotoxy(1,1); writewritewritewrite('Digite um número: '); clreolclreolclreolclreol; readlnreadlnreadlnreadln(n); untiluntiluntiluntil (n>=1) and (n<=10); forforforfor c:=1 totototo 10 dodododo writelnwritelnwritelnwriteln(n,' x ',c,' = ',n*c); readlnreadlnreadlnreadln; endend.endend

5. REPETIÇÃO COM POSCONDIÇÃO

A estrutura de repetição com poscondição permite que um comando seja executado até que uma de- terminada condição seja satisfeita. Esse tipo de re- petição garante que o comando seja executado pelo menos uma vez antes que a repetição termine.

O fluxograma a seguir ilustra o funcionamento do comando repeat-until:

5.1. Automatizando o Caixa

Considere o problema: "Dada uma série de valores, representando os preços dos itens comprados por um cliente, informe o total a ser pago". Como cada clien- te pode comprar um número diferente de itens, não há como prever o número exato de valores de entra- da. Então, vamos convencionar que o final da série será determinado por um valor nulo. Isso é razoável, já que não é possível que um item custe R$ 0,00. As- sim, o programa deverá solicitar os preços e adicio- ná-los até que um preço nulo seja informado; nesse momento, o valor total deverá ser exibido.

5.2. Forçando uma Entrada

O comando repeat-until é muito utilizado em situa- ções em que o usuário deve ser forçado a digitar um valor dentro de um certo intervalo. Por exemplo, poderíamos alterar o programa da tabuada, visto na seção 3.1, de tal forma que o usuário fosse obrigado a digitar um valor entre 1 e 10.

5.3. Exercícios

Para cada problema, codifique um programa Pascal: 5.1. Dado o saldo inicial e uma série de operações de crédito/débito, informe o total de créditos, o to- tal de débitos, a C.P.M.F. paga (0,40% do total de débitos) e o saldo final da conta.

5.2. Refaça o exercício 2.7, sobre equações do 2 o grau, de tal modo que o usuário seja forçado a informar um valor diferente de zero para o coe- ficiente a da equação.

condição

comando

V

F

Em Pascal, comentários são indicados en- tre chaves e são ignorados na compilação.

Para usar essa função num programa, basta lem- brar que a implementação deve ser botton-up e que, portanto, o código da função deve aparecer antes do código do módulo principal^3 do programa.

A execução do programa inicia-se sempre no módulo principal e se o comando não é chamado nesse mó- dulo ele não é executado. No exemplo acima, o co- mando hip() é chamado com os argumentos x e y, cujos valores são copiados, respectivamente, para os parâmetros a e b da função. Esses parâmetros são então utilizados no cálculo da hipotenusa c. Para indicar que o valor em c deve ser devolvido como resposta da função, devemos atribuí-lo ao nome da função. Quando a função termina, as variáveis a, b e c deixam de existir; entretanto, o valor de c não é perdido, já que foi preservado no momento em que foi atribuído como resposta da função.

(^3) No Pascal, o módulo principal é o bloco finalizado com end seguido de ponto final.

6.3 Exercícios

Para cada problema a seguir, crie uma função e co- difique um programa para testá-la:

6.1. Dado um número natural, determine se ele é par ou ímpar. 6.2. Dado um número real, determine seu valor ab- soluto, ou seja, seu valor sem sinal. 6.3. Dados dois números reais, determine o máximo entre eles. 6.4. Dados dois números reais, determine a média aritmética entre eles. 6.5. Dados um número real x e um número natural n, determine xn. 6.6. Dado um número natural n, determine n!. 6.7. Dado um número n, determine seu dígito verifi- cador conforme definido no exercício 4.4.

6.4. Procedimentos

Procedimentos têm o seguinte formato:

Assim como funções, procedimentos devem ter um nome, através do qual ele possa ser chamado. Pro- cedimentos podem receber parâmetros de entrada, mas não fornecem um valor de saída e, portanto, não precisamos declarar o tipo de resposta.

O comando msg(c,l,m), definido acima, exibe uma dada mensagem m numa determinada posição (c,l) da tela. Ao codificar um programa completo conten- do esse comando, é preciso lembrar que um módulo não pode se referir a outro que não tenha ainda sido codificado e, portanto, qualquer outro módulo do programa que utilize o comando msg() deve apare- cer codificado após 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;

procedureprocedure^ procedureprocedure^ nome(parâmetros); variáveis locais; beginbegin beginbegin instruções; ... endend; endend

procedureprocedure procedureprocedure msg(c,l:integerintegerintegerinteger; m:stringstringstringstring); beginbeginbeginbegin gotoxygotoxygotoxygotoxy(c,l); writewritewritewrite(m); endend;endend

programprogramprogramprogram TesteHip; usesusesusesuses crt; varvarvarvar x, y, h : real;

{ cálculo da hipotenusa } functionfunctionfunctionfunction hip(a, b : realrealrealreal) : realrealrealreal; varvarvarvar c : realrealrealreal; beginbeginbeginbegin c := sqrtsqrtsqrtsqrt(sqrsqrsqrsqr(a)+sqrsqrsqrsqr(b)); hip := c; endendendend;

{ módulo principal } beginbeginbeginbegin writewritewritewrite('Catetos? '); readlnreadlnreadlnreadln(x,y);

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

6.5. Exercícios

6.8. O comando sound(f), cujo parâmetro f é um número inteiro, liga o alto-falante para emitir som com freqüência de f hertz. Para desligar o alto-falante, temos o comando nosound e, para dar uma pausa, temos delay(t), cujo parâmetro t indica o número de milissegundos a aguardar. Usando esses comandos disponíveis 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 têm freqüências baixas e sons agudos têm freqüências altas]

6.10. Crie o comando centraliza(l,m), que exibe a mensagem m centralizada na linha l, e faça um programa para testá-lo. [Dica: a função 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 posição (c,l) da tela. [Dica: para obter uma linha contínua, use o caracter cujo código ASCII é 196 ]

6.12. A rotina a seguir tem como objetivo desenhar uma moldura cujo canto esquerdo superior es- tá na posição (Ci,Li) e cujo canto direito inferi- or está na posição (Cf,Lf); entretanto, ela con- tém 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 versão do comando M, que desenha molduras.

6.6. Passagem de Parâmetros

Um parâmetro pode ser passado a uma rotina de duas maneiras distintas: por valor ou por referência. Quando é passado por valor, o parâmetro é criado numa nova área de memória, ainda não utilizada, e o valor do argumento é copiado para essa área. Quando é passado por referência, o parâmetro com- partilha o mesmo espaço de memória já utilizado pelo argumento. Na passagem por valor, a rotina tem acesso apenas a uma cópia do argumento; já na passagem por referência, a rotina acessa diretamen- te o argumento original. Para indicar que a passa- gem deve ser feita por referência, devemos prefixar a declaração do parâmetro com a palavra var. Para entender a utilidade da passagem por referên- cia, vamos considerar um exemplo: criar um coman- do que permuta os valores de duas variáveis que lhe são passadas como argumentos. Supondo que esse comando se chame troca, o código ... x := 5; y := 7; troca(x,y)troca(x,y)troca(x,y)troca(x,y); write(x,y); ... deverá produzir 75 como saída. Primeiro vamos entender por que a passagem por valor não funciona nesse caso.

Como podemos ver acima, parâmetros passados por valor são criados como cópias dos argumentos origi- nais. Quando a rotina é executada, de fato, ela troca os valores das variáveis a e b, que são destruídas assim que a execução da rotina termina. Retornan- do ao programa principal, os valores de x e y estarão inalterados e, portanto, teremos 57 como saída.

procedureprocedure procedureprocedure troca(a,b:integerintegerinteger);integer varvarvarvar c : integerinteger;integerinteger beginbeginbeginbegin c := a; a := b; b := c; endend;endend ... beginbeginbeginbegin ... x := 5; y := 7; troca(x,y)troca(x,y)troca(x,y)troca(x,y); write(x,y); ... endend.endend

b: (^7)

a: (^5)

X: 5

y: (^7)

c: (^)?

Os parâmetros são cópias dos argumentos!

Argumentos originais.

A declaração const é usada para criar cons- tantes, disponíveis a todo o programa.

7.1. As temperaturas Acima da Média

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 média. A solução para esse proble- ma envolve os seguintes passos:

 obter os valores das temperaturas;  calcular a média entre esses valores;  verificar quantos deles são maiores que a média.

Lembrando da técnica de modularização, cada um desses passos representa um subproblema cuja so- lução contribui para a solução do problema origi- nalmente proposto. Então, 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 obtenção dos dados pode ser codificada da seguinte maneira:

Note que o parâmetro T é passado por referência, já que desejamos preencher o vetor originalmente pas- sado à rotina e não uma cópia dele. Lembre-se de que as cópias são destruídas ao final da execução da

rotina e que, portanto, os valores armazenados se- rão perdidos se a passagem for por valor. Note tam- bém que, na rotina que calcula a média a seguir, a passagem poderia ser por valor, pois não pretende- mos alterar a variável original; entretanto, a passa- gem por referência torna o código mais eficiente.

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

7.2. Exercícios

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 são do tipo integer:

Supondo que i seja uma variável do tipo integer e que seu valor seja 5 , que valores estarão ar- mazenados em w após a execução das atribui- ções a seguir?  w[1] := 17;  w[i div 2] := 9;  w[2∗i-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; varvarvarvar T : Temp; m : (^) realreal;realreal ... 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;

functionfunction functionfunction media(varvarvarvar T : Temp) : reareareareallll; varvarvarvar i : integerinteger;integerinteger S : realrealrealreal; beginbeginbeginbegin S := 0; ForForForFor i:=1 totototo Max dodododo S := S + T[i]; media := S/max; end;end;end;end;

functionfunction functionfunction conta(varvarvarvar T:Temp; m:real) : intintinteinteeegergergerger; 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

7.3. Codifique a rotina minimax(T,x,y), que devolve através dos parâmetros x e y, respectivamente, a mínima e a máxima entre as temperaturas armazenadas no vetor T.

7.4. Codifique a rotina Histograma(T), que exibe um histograma da variação da temperatura duran- te a semana. Por exemplo, se as temperaturas em T forem 19, 21, 25, 22, 20, 17 e 15°C, 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 80 °C. [Dica: crie uma rotina que exibe uma li- nha com tamanho proporcional à temperatura.]

7.5. Usando as rotinas desenvolvidas nos dois exer- cícios anteriores, altere o programa TAM para exibir a temperatura média, a mínima, a má- xima e também o histograma de temperaturas.

8. REGISTROS

Um registro é uma coleção de variáveis logicamente relacionadas que não precisam ser do mesmo tipo. Como no vetor, essas variáveis também comparti- lham o mesmo nome e ocupam posições consecutivas de memória. Cada variável da coleção é um campo do registro e é identificada por um nome de campo. Se x, y e z são nomes de campo válidos e r é um re- gistro, então r.x, r.y e r.z. são os campos de r.

Por exemplo, as declarações a seguir permitem a criação de uma variável 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

É possível criar um registro em que um ou mais de seus campos também sejam registros, desde que tais registros tenham sido previamente definidos. Por exemplo, temos a seguir a criação 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

Também é possível combinar vetores e registros de muitas maneiras interessantes. A combinação mais comum é um vetor cujos elementos são registros. Como exemplo, vamos criar uma variável para ar- mazenar uma agenda contendo informações sobre vários 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;

typetype typetype 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;

constconst constconst max = 10; typetypetypetype Agenda = arrayarrayarrayarray[1..max] ofofofof Pessoa; VarVar^ VarVar^ a :^ Agenda;

Vamos codificar um simples programa que solicita os dados dos funcionários ao usuário e os armazena em um arquivo em disco. Como a quantidade exata de funcionários é desconhecida, vamos convencionar que a entrada de dados termina se o usuário digita ponto final quando lhe é solicitado o nome do fun- cionário:

9.3. Lendo um Arquivo

A execução 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 definição de tipo.

9.3. Exercícios

9.1. Altere o programa sobre horários de vôos, codi- ficado no exercício 8.5, de tal forma que o usuá- rio tenha a opção de gravar a tabela em disco ou carregar a tabela com dados lidos do disco. 9.2. Com o comando truncate não é possível remover um registro do meio do arquivo, já que ele apa- ga tudo desde a posição corrente até o final do arquivo. A solução é a seguinte: para remover o registro de uma posição p, no meio do arquivo, copie o último registro do arquivo para a posi- ção p e então elimine apenas o último registro. Com base nessa idéia, codifique um programa, denominado exclui, que permite ao usuário ex- cluir qualquer um dos registros do arquivo FUNC.DAT, criado pelo programa cadastra. Pa- ra cada operação de exclusão, o programa deve listar os registros, e suas respectivas posições, e solicitar ao usuário o número do registro a ser excluído. [Dica: abra o arquivo no modo de lei- tura para não 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 posição disponível no final do arquivo e grave o novo registro. Usando essa idéia, crie um programa para inclusão.

programprogramprogramprogram cadastra; typetypetypetype data = recordrecordrecordrecord dia, mes, ano: intinteintinteegeregerger;ger endendend;end func = recordrecordrecordrecord nome : stringstringstring[30];string salario : realrealreal;real admissao: Data; endendend;end cadastro (^) ==== filefilefilefile (^) ofofofof func; varvarvarvar A : cadastro; R : func; beginbeginbeginbegin assignassignassignassign(A,'FUNC.DAT'); rewriterewriterewriterewrite(A); repeatrepeatrepeatrepeat writewritewritewrite('Nome? '); readlnreadlnreadlnreadln(R.nome); ifififif R.nome<>'.' thenthenthenthen beginbeginbeginbegin writewritewrite('Salario? ');write readlnreadlnreadln(R.salario);readln writelnwritelnwritelnwriteln('Admissao: '); writewritewrite('Dia? write '); rrrereeeadlnadlnadlnadln(R.admissao.dia); writewritewrite('Mês?write '); rrrereeeadlnadlnadlnadln(R.admissao.mes); writewritewrite('Ano?write^ '); rrrereeeadlnadlnadlnadln(R.admissao.ano); writewritewrite(A,R);write endendendend; untiluntiluntiluntil R.nome='.'; closeclosecloseclose(A); endendendend.

programprogram programprogram lista; typetypetypetype^ data =^ recordrecordrecordrecord dia, mes, ano: intintintinteeeegergergerger; endendendend; func = recordrecordrecordrecord nome : stringstring[30];stringstring salario : realreal;realreal admissao: Data; endendendend; cadastro ==== filefilefilefile ofofofof func; varvarvarvar A : cadastro; R : func; beginbeginbeginbegin assignassignassignassign(A,'FUNC.DAT'); resetresetresetreset(A);

whilewhilewhilewhile notnotnotnot eofeofeofeof(A) dodododo beginbeginbeginbegin readreadreadread(A,R); writewritewritewrite(R.nome,', '); writewritewritewrite(R.salario:0:2,', '); writewritewritewrite(R.admissao.dia,'/'); writewritewritewrite(R.admissao.mes,'/'); writelnwritelnwritelnwriteln(R.admissao.ano); endend;endend closeclose(A);closeclose endend.endend