Linguagem e Programacao I 2017 PDF
Linguagem e Programacao I 2017 PDF
Linguagem e Programacao I 2017 PDF
Linguagem de Programao I
iel a sua misso de interiorizar o ensino superior no estado Cear, a UECE,
como uma instituio que participa do Sistema Universidade Aberta do
Computao
Brasil, vem ampliando a oferta de cursos de graduao e ps-graduao
na modalidade de educao a distncia, e gerando experincias e possibili-
dades inovadoras com uso das novas plataformas tecnolgicas decorren-
tes da popularizao da internet, funcionamento do cinturo digital e
massificao dos computadores pessoais.
Linguagem de Programao I
Comprometida com a formao de professores em todos os nveis e
a qualificao dos servidores pblicos para bem servir ao Estado,
os cursos da UAB/UECE atendem aos padres de qualidade
estabelecidos pelos normativos legais do Governo Fede-
ral e se articulam com as demandas de desenvolvi-
mento das regies do Cear.
12
Histria
Educao
Fsica
Cincias Artes
Qumica Biolgicas Plsticas Computao Fsica Matemtica Pedagogia
Informtica
Linguagem de Programao I
Geografia
12
3 edio
a 3
Fortaleza
2015 Histria
Educao
Fsica
Cincias
Cincias Artes
Artes
Qumica
Qumica Biolgicas
Biolgicas Plsticas Computao
Plsticas Informtica Fsica
Fsica Matemtica
Matemtica Pedagogia
Pedagogia
Copyright 2015. Todos os direitos reservados desta edio UAB/UECE. Nenhuma parte deste
material poder ser reproduzida, transmitida e gravada, por qualquer meio eletrnico, por fotocpia
e outros, sem a prvia autorizao, por escrito, dos autores.
Editora Filiada
Parte 3 Modularizao........................................................................135
Captulo 5 Modularizao..................................................................137
1. Noes de Controle e Processo........................................................137
2. Parmetros Formais e Reais..............................................................139
3. Modos de Passagem de Argumentos................................................140
4. Recursividade ...................................................................................145
5. Aninhamento Modular........................................................................148
6. Unidades............................................................................................150
Captulo 6 Arquivos.............................................................................157
1. Memria Secundria..........................................................................157
2. Fluxos.................................................................................................159
3. Modos de Acesso...............................................................................161
4. Utilizando Arquivos Binrios...............................................................165
5. Utilizando Arquivos de Texto..............................................................172
Sobre o autor.............................................................................................179
Apresentao
Sejam bem vindos ao mundo da programao de computadores! Trata-
se de um mundo fascinante e sofisticado que evolui constantemente no intuito
de agilizar o trabalho das pessoas envolvidas com tecnologia da informao.
No existe apenas uma forma de programar um computador. Na realidade
cada rea de conhecimento abrangida pela computao est ligada a alguma
categoria de programao que se caracterizam por suas prprias ferramentas
e linguagens.
Assim, por exemplo, um programador de sistemas operacionais traba-
lha no desenvolvimento de ferramentas que permitam melhor acessibilidade
do hardware, um programador de jogos almeja usar ao mximo o potencial
grfico disponvel para desenvolver aplicativos para entretenimento, um pro-
gramador de sistemas informativos cria softwares que permitam s pessoas
interagirem atravs de uma rede particular ou da internet, um programador
de interfaces objetiva maximizar o aproveitamento de aplicaes locais ou
remotas utilizando todo aparato visual moderno e assim por diante. Cada uma
destas reas requer especializao.
Entretanto em todos os casos os programadores precisam de conhe-
cimentos essenciais adquiridos em disciplinas bsicas sobre programao
de computadores. Estes conhecimentos passam pela estudo das chamadas
linguagens de programao que, de forma geral, consistem de poderosos arti-
fcios para a expresso de instrues a serem executadas por computadores.
Este livro tem por objetivo apresentar e explorar conceitos essenciais
da linguagem de programao Pascal. Esta linguagem foi desenvolvida para
ser fcil de compreender e utilizar. De fato ela foi criada para ser ensinada e
por essa razo tem boa aceitao entre iniciantes em programao. Alm do
mais uma vez compreendida a linguagem Pascal torna-se consideravelmente
mais simples tanto migrar para outras linguagens como ingressar numa rea
de especializao como aquelas citadas ante- riormente.
A estrutura bsica do livro consiste de seis captulos divididos em trs
unidades. A primeira unidade trata de toda parte fundamental da linguagem de
forma que possvel ao final dela j construir aplicaes que funcionem. As
duas unidades finais so adendos para sofisticao e potencializao do que
foi aprendido na primeira unidade. Em termos gerais o objetivo do livro per-
mitir que o leitor programe o mais prematu- ramente possvel de forma prtica,
desafiadora e estimulante.
O autor
Parte 1
Introduo Programao de
Computadores
Captulo 1
Fundamentos
Objetivos:
Esta unidade tem por objetivo introduzir o estudante no aprendizado da
linguagem de programao Pascal. No Captulo 1 so apresentadas a
sintaxe bsica bem como as estruturas fundamentais para implementa-
o de pequenos programas funcionais. No Captulo 2 a linguagem
expandida atravs do estudo de estruturas sequenciais que permitem a
representao e manipulao de listagens de dados auxiliando o estu-
dante a lidar com a resoluo de problemas mais complexos.
1. Introduo Programao de
Computadores
No princpio no havia a distino entre hardware e software e os primeiros
computadores eram programados diretamente em seus circuitos. Consistia de
uma tarefa ardua e exigia profundo conhecimento da arquitetura e do funcio-
namento do equipamento. Tarefas elementares exigiam considervel tempo
de trabalho e erros eram frequentes. A evoluo do hardware e a concepo
do conceito de software deram uma guinada na histria dos computadores. Sistema Operacional:
O software passou a representar a alma de um computador e sua inoculao O sistema operacional
nos circuitos dos equipamentos passou a ser referenciada como instalao um conjunto de
softwares que trabalham
de software. cooperativamente para
Softwares so instalados em camadas, ou seja, um software, para proporcionar ao usurio
funcionar, utiliza outros softwares. A exceo naturalmente a camada de acesso a recursos
do computador. Ele
software instalada diretamente sobre o hardware: o sistema operacional. As esconde detalhes,
demais camadas se instalam sobre este ou sobre uma ou mais camadas exis- muitas vezes complexos,
tentes. considerado um programa um software de aplicao especfica. H de funcionamento do
programas para edio de imagens, reproduo de arquivos de som, navega- hardware atravs de
abstraes simples.
o na internet, edio de texto e etc. Exemplos so Linux,
Um programa um arquivo que contm uma listagem de instrues de Windows, OS2, Unix e etc
mquina. Estas instrues devem ser executadas por uma CPU na ordem
que se apresentam no arquivo. Este processo denominado execuo do
10
RICARDO REIS PEREIRA
2. A Linguagem Pascal
A linguagem de programao Pascal foi originalmente projetada por Niklaus
Wirth na dcada de 1970. A linguagem tem absorvido desde essa poca mui-
tas contribuies que convergiram para a criao de diversos compiladores
importantes. Atualmente possvel encontrar na Internet mais de 300 com-
piladores ou interpretadores da linguagem (alguns pagos, outros gratuitos
e muitos descontinuados, ou seja, no possuem mais suporte). Veja www.
Pascaland.org para uma lista completa de compiladores Pascal. As mais
notveis contribuies para o desenvolvimento do Pascal foram feitas pela
Borland (empresa americana de desenvolvimento de software) com a criao
do Turbo Pascal e posteriormente do Delphi Pascal.
A linguagem Pascal originalmente estruturada, ou seja, os programas
so construdos como um conjunto de pequenos subprogramas que se co-
nectavam por chamadas (uma chamada de um determinado subprograma
a solicitao de execuo de outros subprogramas a partir dele). A linguagem
absorveu com o passar do tempo o paradigma da orientao a objetos (que
se baseia nos conceitos de classes e objetos) dando origem ao Object Pascal.
12
RICARDO REIS PEREIRA
Compiling teste.pas
Linking teste
e no Unix e Linux:
Um compilador no
./teste pode corrigir os erros
que lista porque, em sua
Quando erros esto presentes no cdigo-fonte o compilador reportar abrangente viso, h
muitas possibilidades de
uma lista de todos eles (neste caso, no prprio terminal) indicando a linha onde
correo de um mesmo
cada um ocorre. Alguns erros so facilmente corrigveis como erros de sintaxe erro. Para ajudar ento no
(algo foi escrito erroneamente). J outros requerem uma anlise mais apurada trabalho do programador
do programador para serem corretamente diagnosticados e corrigidos. o compilador gera o
mximo de documentao
Alm de erros, um compilador pode gerar tambm advertncias. Uma de erro que permite mais
advertncia (Warning) um alerta que o compilador envia para indicar que facilmente a soluo do
algum recurso no est sendo apropriadamente utilizado. Erros impedem que problema. O processo de
resoluo de erros num
o compilador crie o executvel do programa ao contrrio das advertncias.
programa conhecido
Um programa compilado que gera somente advertncias produz um binrio. como depurao (em
Na prtica os efeitos de uma advertncia para o programa que ser executa- ingls, debug).
do pode ser imperceptvel em alguns casos e prejudicial em outros. Consulte
14
RICARDO REIS PEREIRA
Para mais detalhes sobre a Free Pascal IDE consulte o guia do usurio
(users guide) na documentao do compilador.
{ declaraes }
begin
{ bloco principal }
4.3. Variveis
Uma varivel um artifcio das linguagens de programao que permite o
programador utilizar de forma iterativa a memria do computador. O progra-
mador define que variveis o programa dever utilizar e elas sero criadas na
memria quando o programa for executado. Cada varivel se vincula a uma
clula de memria real de forma que as operaes programadas em cdigo
afetaro a memria quando o programa estiver rodando.
Basicamente uma varivel pode verificar ou modificar a clula de me-
mria a qual est ligada. As operaes de mudana e verificao de valor, por
uma varivel so chamadas respectivamente de operaes de escrita e leitura.
A leitura no afeta o contedo da varvel ao passo que a escrita sobrescreve o
valor que a varivel contm com um novo valor (o valor sobrescrito perdido).
A sesso de declarao de variveis a sesso do programa destinada
a identificao (definio) de todas as variveis que sero utilizadas. Tentar
usar uma varivel no declarada faz o compilador emitir um erro de sintaxe.
Cada nova varivel precisa de um nome (que um identificador) e um
tipo (que uma palavra reservada). O tipo dir ao compilador que valores e
operaes sero suportados por aquela varivel. Tipos podem ser primitivos e
derivados. Os tipos primitivos so aqueles definidos nativamente pelo Pascal
ao passo que os derivados so construdos pelo programador a partir de tipos
primitivos (veja os Captulos 2, 3 e 4 para mais detalhes).
20
RICARDO REIS PEREIRA
...
4.4. Constantes
Uma constante um artifcio das linguagens de programao que permite a
manuteno de valores invariantes durante toda execuo do programa. Uma
constante pode aparecer num cdigo como parte integrante de uma expres-
so (veja prxima sesso) ou vinculada a uma clula de memria indepen-
dente (como nas variveis), mas com suporte apenas a verificao (nunca a
escrita). Nas expresses,
23
Linguagem de Programao I
x*25
3.45-y
a + ch
hoje foi + st
b/100
<nome_da_constante> = <valor>;
q: integer = 11;
ex: real = 3;
st: string = x;
24
RICARDO REIS PEREIRA
Listagem 2
01 program atribuicoes;
02 var
03 i: integer;
04 x, info_2: real;
05 db: double;
06 b: boolean;
07 begin
08 i := 35;
09 x := 4.87;
10 info_2 := x * i;
11 db := x*x + 6.0*i + 45;
12 b := True;
13 end.
33 div 2 div 5
16 div 5
utiliza o operador relacional maior que (>) e retorna verdadeiro (se o valor em
x maior que 10) ou falso (se o valor em x menor ou igual a 10). A tabela
seguinte lista os operadores relacionais da linguagem Pascal e seus respec-
tivos significados:
Operador Relacional Significado
> Maior que
< Menor que
> = Maior ou igual a
<= Menor ou igual a
<> Diferente de
= Igual a
Tabela 6 - Operadores relacionais em Pascal
false or false
false
Listagem 3
01 program entrada_e_saida;
02 var
03 x: integer;
04 begin
05 write('Fornecer valor de x: ');
06 read(x);
07 writeln('o dobro de x vale ', x*2);
08 readln;
09 end.
Uma deciso unidirecional aquela que deve decidir entre executar um bloco
de cdigo ou no fazer nada. Sua estrutura fundamental em Pascal dada por,
if <teste> then
<bloco>;
if <teste> then
<bloco_1>
else
<bloco_2>;
1 if <teste1> then
2 if <teste2> then
<bloco1>
2 else
<bloco2>
1 else
3 if <teste3> then
<bloco3>
Uma deciso mltipla em Pascal aquela que lida com diversas possibilida-
des de caminhos a se seguir. Cada possibilidade representada por um bloco
de cdigo e apenas um destes blocos ter o contedo executado. Como as
expresses booleanas s encaminham para no mximo duas rotas, elas no
so a base de construo de uma deciso mltipla em Pascal. Ao invs disso
utilizam-se expresses aritmticas que resultem em valores inteiros. Desta for-
ma cada bloco de deciso fica atrelado a um valor inteiro distinto. A estrutura
de deciso mltipla em Pascal tem sintaxe,
case <expressao_aritmetica_inteira> of
<rotulo_1>: <bloco_1>;
<rotulo_2>: <bloco_2>;
<rotulo_n>: <bloco_n>;
else <bloco_alternativo>;
end;
Listagem 4
01 program operacoes_basicas;
02 var op: integer;
03 a, b: real;
04 begin
05 writeln('Menu');
06 writeln('1-- somar');
07 writeln('2 - subtrair');
08 writeln('3 - multiplicar');
09 writeln('3 - dividir');
10 readln(op);
11 writeln('valores:');
12 readln(a, b);
13 case op of
14 1: writeln('soma: ', a+b:0:3);
15 2: writeln('subtracao: ', a-b:0:3);
16 3: writeln('multiplicacao: ', a*b:0:3);
17 4: if abs(b)>1.0e-5 then
18 writeln('divisao: ', a/b:0:3);
19 else writeln('opcao invalida');
20 end;
21 end.
case x of
1,2,3: write('ok');
4: write('tchau!');
else write('invalido!');
end;
for i:= 1 to 10 do
for j := 1 to 10 do
write(i*j);
h dois nveis de aninhamento. Diz-se que o segundo lao for est ani-
nhado no primeiro. Semanticamente cada iterao do primeiro lao for provo-
ca a execuo das dez iteraes do segundo lao for. Assim a instruo write
executada um total de 100 vezes. No exemplo,
for j := 1 to 10 do write(i+j);
for j := 1 to 10 do write(i+j);
end;
o primeiro lao aninha outros dois laos que por sua vez no se ani-
nham. Assim existem apenas dois nveis de aninhamento neste exemplo. O
comando write executado 200 vezes.
j := 1; os inteiros de 1 a 99 so impressos em
while j < 100 do sada padro.
begin
write(j, ' ');
j := j+1;
end;
a varivel j age como contador que iniciado fora do lao. A atribuio, j := j+1,
permite que a expresso booleana de entrada do lao, j<=100, diferencie sua
avaliao de uma iterao para outra. Na primeira iterao do lao, j contm 1
e este o valor impresso por write. Nas demais iteraes a incrementao de
j geram novas impresses. Quando 99 impresso o valor em j incrementado
para 100 na linha seguinte. Quando o teste de entrada executar na prxima
vez (e ele ainda o ser), o avaliador encontrar a instruo 100<100 que re-
sulta falso: neste ponto o lao encerrado. Assim 99 o ltimo valor impresso.
O lao anterior pode ser facilmente substitudo por um lao de conta-
gem. H situaes entretanto que os laos de contagem no podem resol-
ver, como em,
repeat
<bloco>
until <expressao>;
j := 1;
repeat
j := j+1;
until j>100;
Listagem 5
01 program media;
02 var s, x, n: integer;
03 begin
04 s := 0;
05 n := 0;
06 repeat
07 write('Valor: ');
08 readln(x);
09 if x <> 0 then
10 begin
11 s := s+x;
12 n := n+1;
13 end;
14 until x=0;
15 if n>0 then
16 write('media: ', s/n :0:2)
17 else
18 write('nenhum valor fornecido!');
19 end.
write('Valor: ');
readln(x);
if x = 0 then break;
s := s+x;
n := n+1;
end;
...
...
end;
end;
...
...
end;
end;
43
Linguagem de Programao I
if (i mod 2 = 0) continue;
end;
begin
...
goto <rotulo>;
end.
Listagem 6
01 program desvio;
02 var
03 n: integer;
04 label
05 rot;
06 begin
07 n := 1;
08 rot:
09 write(n, ' ');
10 n := n+1;
11 if n<100 then goto rot;
12 end.
constri uma chamada ao mdulo teste que requer dois argumentos de en-
trada. J em,
teste;
Listagem 7
01 program usando_procedimento;
02 procedure meu_teste;
03 begin
04 writeln('chamada feita com sucesso');
05 end;
06 begin
07 meu_teste;
08 end;
Listagem 8
01 program teste_de_procedimentos;
02 var
03 n: integer;
04 { mdulos }
05 procedure print(n: integer);
06 begin
07 writeln('O quadrado de ', n, ' vale ', n*n);
08 end;
09
10 procedure listar(m, n: integer);
11 var i: integer;
12 begin
13 for i := m to n do
14 print(i);
15 end;
16 { programa principal }
17 begin
18 readln(n);
19 listar(0, n);
20 listar(2*n, 3*n);
21 end.
O quadrado de 0 vale 0
O quadrado de 1 vale 1
O quadrado de 2 vale 4
O quadrado de 3 vale 9
O quadrado de 6 vale 36
O quadrado de 7 vale 49
O quadrado de 8 vale 64
O quadrado de 9 vale 81
begin
res := fat(i);
end;
end;
Fatorial de 0 = 1
Fatorial de 1 = 1
Fatorial de 2 = 2
Fatorial de 3 = 6
Fatorial de 4 = 24
Fatorial de 5 = 120
50
RICARDO REIS PEREIRA
Listagem 9
01 program teste_de_funcoes; 13 procedure listar(max: integer);
02 var 14 var i: integer;
03 n: integer; 15 begin
04 16 for i := 0 to max do
05 function fat(n: integer): integer; 17 writeln('Fatorial de ', i, ' = ', fat(i));
06 var i: integer; 18 end;
07 begin 19
08 fat := 1; 20 begin
09 for i := 1 to n do 21 readln(n);
10 fat := fat*i; 22 listar(n);
11 end; 23 end.
12
begin
teste_1 := x*x;
end;
var
y: real;
procedure teste_2;
begin
writeln('ol');
end;
5. Estudos de Caso
Os estudos de casos a seguir aplicam a sintaxe bsica da linguagem Pascal
estudada neste captulo.
C (F 32)
=
5 9
52
RICARDO REIS PEREIRA
Listagem 10
01 program Celsius_para_Fahrenheit;
02 var
03 C, F: real;
04 begin
05 write('Valor de temperatura em Celsius: ');
06 read(C);
07 F := C*9/5 + 32;
08 writeln(C:0:1, 'oC = ', F:0:1, 'oF');
09 end.
27.0oC = 80.6oF
p
IMC = 2
h
Listagem 11
01 program Calculo_IMC; 10 write('IMC = ', imc:0:1, '. ');
02 var 11 if (imc<20) then
03 peso, altura, imc: real; 12 writeln('Magro!')
04 begin 13 else
05 write('Fornecer altura em metros: '); 14 if (imc>25) then
06 readln(altura); 15 writeln('Gordo!')
07 write('Fornecer peso em kg: '); 16 else
08 readln(peso); 17 writeln('Normal!');
09 imc := peso/(altura*altura); 18 end.
Fornecer numeros: 5 11 3
Max(5,11,3) = 11
Listagem 13
01 program Ordenacao_Tres_Numeros; 13 t := a;
02 var 14 a := c;
03 a, b, c, t: integer; 15 c := t;
04 begin 16 end;
05 write('Fornecer numeros: '); 17 if b>c then begin
06 readln(a,b,c); 18 t := b;
07 if a>b then begin 19 b := c;
08 t := a; 20 c := t;
09 a := b; 21 end;
10 b := t; 22 writeln('Ordenacao: ',a,', ',b, ', ',c);
11 end; 23 end.
12 if a>c then begin
55
Linguagem de Programao I
Fornecer numeros: 32 11 9
Ordenacao: 9, 11, 32
Listagem 14
01 program Somatorio_Quadratico;
02 var
03 i, max, S: integer;
04 begin
05 S := 0;
06 write('Fornecer limite superior: ');
07 readln(max);
08 for i := 0 to max do
09 S := S + i*i;
10 writeln('Soma de quadrados entre 0 e ', max, ' = ', S);
11 end.
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71
Atividades de avaliao
1. Faa um programa para o computador calcular o quadrado de um nme-
ro.
2. Faa um programa para o computador determinar o valor mximo entre
dois nmeros inteiros A e B.
3. Faa o programa para calcular a mdia das notas de uma turma de 20
alunos.
4. Faa um programa que receba as dimenses de uma caixa dgua e
calcule o seu volume.
5. Modifique o programa da questo 04 de forma que a sada seja a quanti-
dade em metros quadrados de material necessrio a construo da cai-
xa. Considere a presena de tampa.
6. Dois alunos fizeram trs provas cada um cujas notas so conhecidas
Faa um programa que diga qual deles tem a maior mdia.
7. Construa um programa que receba dois valores inteiros a e b e retorne
como sada ab.
8. Construa um programa que receba os lados de um tringulo e indique se
ele existe ou no. Em caso afirmativo imprimir tambm: a) se ele retn-
gulo, acutngulo ou obtusngulo; b) valor de sua rea.
9. Faa um programa para calcular o fatorial de um nmero N inteiro dado.
59
Linguagem de Programao I
1. Caracteres e Strings
A maior parte de toda informao gravada em mdias digitais, incluindo aquela
disponvel via internet, est em formato texto. Textos, em computadores, so
representados por strings que por sua vez so representadas pela unio se-
quencial (concatenao) de unidades grficas de informao denominadas
caracteres. A presena de recursos de manipulao de strings numa lingua-
gem de programao essencial. Tais recursos so normalmente disponibi-
lizados atravs de bibliotecas ou de comandos nativos (previstos no projeto
original da linguagem e implementados juntamente com ela). Pascal conta
com recursos nativos para a manipulao de texto.
1.1. Caracteres
Pascal possui o tipo de dados primitivo char para representar caracteres inde-
pendentes (que no fazem parte de uma string). Assim,
var
ch: char;
cod ASCII cod ASCII cod ASCII cod ASCII cod ASCII
32 42 * 52 4 62 > 72 H
33 ! 43 0 53 5 63 ? 73 I
34 44 0 54 6 64 @ 74 J
35 # 45 0 55 7 65 A 75 K
36 $ 46 . 56 8 66 B 76 L
37 % 47 / 57 9 67 C 77 M
38 & 48 0 58 : 68 D 78 N
39 49 1 59 ; 69 E 79 O
40 ( 50 2 60 < 70 F 80 P
41 ) 51 3 61 = 71 G 81 Q
cod ASCII cod ASCII cod ASCII cod ASCII cod ASCII
#27 ESC
#9 TAB
#8 BACKSPACE
writeln('B', '%'); // B%
ch: char;
begin
end.
st1: string;
st2: string[120];
Os comandos read e readln podem ser usados para ler strings curtas e
longas sem adicional de sintaxe como em,
read(fulano);
z := x + y; // ola!ola!mundo
onde x uma string. Uma nova string criada do lado direito da atribuio pela
concatenao do contedo de x e fim. Com a atribuio, a antiga string inicial
em x eliminada da memria e x passa a se referenciar nova string oriunda
da concatenao.
Strings podem ser tambm concatenadas com caracteres, como em,
x := Caractere de ASCII 38 e: + #38; // Caractere de ASCII 38 e: &
onde V denota o valor (inteiro ou real) para ser convertido e armazenado na string
S (curta ou longa). A Listagem 18 ilustra o uso de str. As converses nas Linhas
09 e 10 colocam respectivamente nas variveis si e sp as verses string do inteiro
em idade e do real em peso. Observe que possvel converter a parte do valor real
que realmente interessa utilizando a notao de dois-pontos (:0:2 denota todas as
casas antes da vrgula e apenas duas depois). A string final gerada pela conca-
tenao da Linha-11, armazenada na varivel s e impressa na Linha-12.
Listagem 18
01 program usando_str;
02 var
03 s, si, sp: string;
04 idade: integer;
05 peso: real;
06 begin
07 idade := 25;
08 peso := 60.5;
09 str(idade, si);
10 str(peso:0:2, sp);
11 s := 'Ela tem '+si+' anos de idade e pesa '+sp+'
12 quilos';
13 writeln(s);
end.
68
RICARDO REIS PEREIRA
inteiro invalido!
inteiro invalido!
Valor inteiro> /
inteiro invalido!
Valor inteiro> 7
O quadrado vale 49
69
Linguagem de Programao I
Listagem 19
01 program valor_seguro;
02
03 function inteiro_valido: integer;
04 var
05 entrada: string;
06 err: integer;
07 begin
08 repeat
09 write('Valor inteiro> ');
10 readln(entrada);
11 val(entrada, inteiro_valido, err);
12 if err<>0 then
13 writeln('inteiro invalido!')
14 else
15 break;
16 until False; // Lao infinito
17 end;
18
19 var x: integer;
20 begin
21 x := inteiro_valido;
22 writeln('O quadrado vale ', x*x);
23 end.
write(s[3], s[2]); // cb
ch := s[7]; // g
var
begin
s := 'abcdefg';
writeln( length(s) ); // 7
end.
Inverso> gfedcba
Listagem 20
01 program de_tras_pra_frente; 07 readln(s);
02 var 08 write('Inverso> ');
03 s: string[100]; 09 for i := length(s) downto 1 do
04 i: integer; 10 write( s[i] );
05 begin 11 writeln;
06 write('Entrada> '); 12 end.
onde s pode ser uma string curta ou longa. O lao de contagem cres-
cente varre a cadeia completa e modifica cada caractere para a sada
da chamada da funo maiuscula (que por sua vez recebe o caractere da
cadeia de entrada).
Strings podem ser comparadas com operadores relacionais. O critrio
de comparao adotado pelo compilador Pascal denominado critrio lexi-
cogrfico. exatamente o mesmo critrio utilizado para fazer comparaes
e ento ordenar uma lista, por exemplo, de nomes de pessoas. Dadas duas
strings, a comparao lexicogrfica executa comparaes entre caracteres
de uma e de outra na mesma posio.
As comparaes partem do incio de cada string e se mantm enquanto
os caracteres forem idnticos ou uma das cadeias no extrapolar seu ndice
mximo. Quando surge no processo dois caracteres distintos, a comparao
termina e ser lexicograficamente maior a string cujo caractere comparado
tiver maior cdigo ASCII. Exemplos,
'casar' > 'casado' // TRUE pois ASCII de 'r' maior que o de 'd'
'MEDALHA' > 'MEDICO' // FALSE pois ASCII de 'A' menor que o de 'I'
'mata' <= 'pata' // TRUE pois ASCII de 'm' menor que o de 'p'
s := 'ABCDEFG';
writeln( copy(t, 2, 2) ); // DE
s := s + copy(s,4,4); // ABCDEFGDEFG
Quebrar uma string
significa subdividi-la onde s e t so variveis strings. A primeira extrao atribuda a t, a se-
em substrings cuja gunda repassada como parmetro de writeln e a terceira componente
concatenao origina
de uma expresso.
a string original. Por
exemplo, a string abcxyzw Strings podem ser inseridas em outras, ou seja, possvel, utilizando
pode ser quebrada no um nico comando, quebrar uma string W em W1 e W2 e depois fazer W se
conjunto {abc, xyzw} ou
tornar W1 + X + W2 onde X a string inserida. Para inserir uma string em outra,
em {ab, cxy, yz, w}.
utiliza-se o comando insert, unidade system, seguindo a sintaxe bsica,
insert(S1, S2, p);
onde S1 representa a string que ser inserida e S2 a string que sofrer a inser-
o. A posio de insero em S2 dada pelo inteiro p. No exemplo,
s := '123';
tex := 'abcdef';
a string s inserida na string tex. A insero quebra tex em abc e def e depois
atribui a tex o resultado da concatenao abc + 123 + def. Insert no possui re-
torno (procedimento) mas modifica a string passada como segundo argumento.
Para remover caracteres de uma string utiliza-se o comando delete, uni-
dade system, de sintaxe bsica,
delete(S, p, cont);
onde S denota a string que sofrer retrao, p a posio onde deve princi-
piar a deleo e cont a quantidade de caracteres que devero ser eliminados.
Internamente delete efetua a quebra da string e concatena as partes que de-
vem ser mantidas. Exemplo,
s := 'abcdefgh';
delete(s, 3, 4);
writeln(s); // abgh
2. Arrays
Uma array uma estrutura de dados que permite o armazenamento sequen-
cial de dados de mesmo tipo. Cada unidade constituinte de uma array de-
nominada clula e o tipo de dados comum a todas as clulas denominado
tipo base. Uma array referenciada em cdigo por uma nica varivel e suas
clulas por uma associao desta varivel, do operador de indexao, [ ], e de
um ou mais valores de ndices.
Strings so exemplos de arrays cujo tipo base char mas comumente
no recebem o ttulo (de array) por possurem propriedades prprias no pre-
sentes em arrays de outros tipos base. Manteremos a conveno distinguindo
strings de arrays. Arrays no podem ser diretamente concatenadas, compara-
das, impressas por write/writeln ou lidas por read/readln. Veremos alguns cdigos
que permitiro gerar comportamentos equivalentes em arrays.
O comprimento de uma array igual ao total de clulas que a constitui e
pode tambm ser determinado pelo comando length que receber, neste caso,
a varivel array como argumento. Arrays no fazem distino entre compri-
mento teto e comprimento utilizado como nas strings. Dessa forma length retor-
na sempre o total de clulas alocadas em memria para a array, independente
do contedo.
Arrays em Pascal podem ser estticas e dinmicas. Uma array est-
tica aquela cujo comprimento predefinido na declarao e no pode ser
mais modificado em tempo de execuo. Arrays dinmicas so aquelas cujo
comprimento pode ser modificado a qualquer momento da execuo (tanto
expandindo como contraindo).
As clulas de arrays, sejam estticas ou dinmicas, suportam leitura/escrita
deste que o ndice utilizado esteja na faixa apropriada. A faixa apropriada em ar-
rays estticas pode ser definida pelo programador tendo comumente como limite
inferior o valor 1. O ndice inferior de arrays dinmicas sempre zero.
Arrays podem possuir mais de uma dimenso. Uma array unidimensio-
nal representa, por exemplo, uma lista e necessita de um nico ndice para
referenciar suas clulas. Uma array bidimensional representa, por exemplo,
uma tabela ou uma matriz e precisa de dois ndices. Uma array tridimensional
utiliza trs ndices e assim por diante. No h restries em Pascal no nmero
de dimenses que uma array pode possuir.
74
RICARDO REIS PEREIRA
x: array[1..100] of integer;
neste exemplo os ndices limites so 1 e 100. Para alterar uma dada clula de
x usa-se,
x[34] := 152;
neste caso a trigsima quarta clula recebe o valor 152. Para fazer x receber
os 100 primeiros mpares, pode-se escrever,
for i := 1 to length(x) do
x: array[0..99] of integer;
A: array[1..100] of integer;
B: array[1..100] of integer;
C: array[0..99] of integer;
128 256
64 128
32 64
16 32
quanto,
var
Exemplo,
var
x: array of integer;
begin
write( length(x) );
setlength(x, 25);
end.
deve ser,
0 25
79
Linguagem de Programao I
i: integer;
w: array of integer;
begin
setlength(w, 100);
for i := 0 to length(w)-1 do
w[i] := 2*i + 1;
end.
Listagem 22
01 program arrays_dinamicas;
02 var
03 i: integer;
04 x, y: array of integer;
05 const
06 max = 5;
07 begin
08 setlength(x, max);
09 for i := 0 to max-1 do
10 x[i] := 2*i+1;
11 y := x;
12 for i := 0 to max-1 do
13 y[i] := 2*y[i];
14 for i := 0 to max-1 do
15 writeln( x[i], ' ', y[i] );
16 end.
80
RICARDO REIS PEREIRA
A atribuio direta de uma array dinmica a outra no gera uma nova ar-
ray dinmica. Ao invs disso passam a existir duas referncias ao mesmo local
de memria. Isso ilustrado no programa da Listagem - 22. A array x alocada
na Linha-08 e recebe os valores dos primeiros cinco mpares (Linhas 09 e 10).
A atribuio direta na Linha-11 cria uma nova referncia para a memria
de x, ou seja, x e y agora se referem a mesma array dinmica. Nas Linhas 12
e 13 o contedo de cada clula da array dinmica y multiplicado por dois o
que equivalente a dobrar os valores das clulas de x. Assim as impresses
nas linhas 14 e 15 geram a sada,
2 2
6 6
10 10
14 14
18 18
e a alocao,
readln(n);
setlength(mat, n, n);
else
onde lin e col so inteiros. Observe que na segunda chamada a length o argu-
mento mat[0]. De fato se mat tivesse, por exemplo, cinco dimenses, o com-
primento delas seriam calculados pelas respectivas instrues,
length( mat );
length( mat[0] );
length( mat[0][0] );
length( mat[0][0][0] );
length( mat[0][0][0][0] );
3. Estudos de Caso
3.1. Palndromos Numricos
Um palndromo qualquer sequencia de informao cuja disposio dos ele-
mentos na ordem reversa (de trs para a frente) origina a mesma sequencia.
As strings asa, abbba e tomamot so exemplos de palndromos. Palndromos
numricos so inteiros cuja sequencia de dgitos so palndromos. Exemplos
so 2, 121, 5665 e 10101.
A funo e_palind da Listagem 23 determina se seu argumento de entra-
da ou no um palndromo numrico. A primeira hiptese da funo de que
seja e por essa razo a varivel interna e_palind recebe true na Linha-05. O lao
entre as Linhas 08 e 11 determina quantos dgitos, t, possui o valor da entrada
em n. Para isso uma cpia deste valor feito para x e t iniciado com zero.
Cada iterao do lao reduz o valor em x para o quociente de sua ra-
zo por dez (Linha-10) e o lao encerra quando zero alcanado. Como t
incrementa da unidade em cada iterao, esta varivel conter no final das
iteraes a quantidade de dgitos do valor em n. Na Linha-12 a array dinmica
digs alocada para registrar os dgitos do valor em n e o lao entre as Linhas
13 e 16 carrega os dgitos. O lao decrescente para preencher os dgitos de
trs para frente (porque nesta ordem que eles so extrados). A expresso,
n mod 10, Linha-14, retorna o ltimo dgito do valor em n ao passo que, n := n div
10, Linha-15, fora sua extrao.
82
RICARDO REIS PEREIRA
94 17 31 50 20 73 64 84 69 59
17 20 31 50 59 64 69 73 84 94
Listagem 24
01 program ordenacao_selecao; 14 for i := 1 to n-1 do begin
02 const 15 k := i;
03 n = 10; 16 for j := i+1 to n do
04 var 17 if dat[j] < dat[k] then k := j;
05 dat: array[1..n] of integer; 18 x := dat[i];
06 i, j, k, x: integer; 19 dat[i] := dat[k];
07 begin 20 dat[k] := x;
08 randomize; 21 end;
09 writeln; 22 writeln;
10 for i:= 1 to n do begin 23 for i:= 1 to n do
11 dat[i] := random(100); 24 write( dat[i], #9 );
12 write( dat[i], #9 ); 25 writeln;
13 end; 26 end.
84
RICARDO REIS PEREIRA
d (contador do lao) multiplicado pela array data e por essa razo ac sempre
reiniciado em zero (Linha-17). O valor calculado com p em cada iterao do
lao interno usa a i-sima clula de data que varrido de trs para frente. Os
operadores mod (na Linha-20) e div (na Linha-21) so respectivamente res-
ponsveis pela extrao do novo dgito que ir sobrepor aquele na posio i
corrente em data e pela atualizao de ac. As Linhas 24 e 25 imprimem a sada
obtida dgito a dgito, desta vez varrendo data na sequncia crescente. Um
exemplo de sada do programa ,
Valor> 50
Fatorial> 30414093201713378043612608166064768844377641568960512000000000000
Sntese da Parte 1
Foram apresentadas no Captulo-1 as estruturas bsicas de construo de
um programa em Pascal incluindo sintaxe bsica, utilizao de variveis e
constantes, uso de operadores e expresses, entrada e sada padres, con-
trole de fluxo e fundamentos sobre procedimentos e funes. No Captulo-2
foram apresentadas as estruturas homogneas sequenciais da linguagem, ou
seja, strings que permitiram a representao e manipulao de informao
textual e as arrays que possibilitaram o sequenciamento de dados dos
mais diversos tipos nativos existentes.
Atividades de avaliao
1. Criar funo que receba um caractere e, caso seja uma letra, retorne sua
verso maiscula, quando a entrada for minscula, e minscula quando
a entrada for maiscula. Se a entrada no uma letra, o mesmo carac-
tere deve ser retornado.
2. Escreva uma funo que receba uma string s e um caractere ch e retorne
o nmero de vezes que ch aparece em s.
3. Escreva programa que receba uma string da entrada padro e imprima
quantas palavras ela contm. Considere palavras como sendo pedaos
da string separados por espaos em branco.
4. Construa programa que receba uma array de inteiros e imprima como
sada o maior e o menor valor contidos nela.
87
Linguagem de Programao I
5. Construa programa que busque numa array os dois maiores valores contidos.
6. Construa um programa que receba uma array e altere seus valores de
forma a ficarem em ordem inversa.
7. Construir programa que carregue em uma array de comprimento n os
primeiros n valores primos.
8. Rotao o procedimento de deslocamento dos itens de uma array para
casas vizinhas. Numa rotao a direita todos os itens migram para posi-
es logo a frente, exceto o ltimo que vai para a posio 1, ex: se v =
{1,2,3,4}, uma rotao a direita modifica v para {4,1,2,3}. De forma an-
loga uma rotao a esquerda de v geraria {2,3,4,1}. Construir programas
para os dois processos de rotao.
9. Construa um programa que calcule a mdia dos nmeros menores que
5000 que sejam divisveis por 7 mas no sejam divisveis por 3.
10. Considere uma array V que contenha os coeficientes de um polin-
mio P(x) de grau n. Construa programa que receba V, n e um valor de
x0 e imprima P(x0).
11. Seja uma lista L formada por n valores reais. Dado que: ,
Referncias
SEBESTA, Robert W., Concepts of Programming Languages, Addison
Wesley; 9 edition (April 2, 2009)
CANNEYT, Michal Van, Reference guide for Free Pascal, Document
version 2.4 , March 2010
http://www.freepascal.org/docs-html/
90
RICARDO REIS PEREIRA
Parte 2
Tipos de Dados Personalizados
Captulo 3
Tipos de Dados
Personalizados
Objetivos:
Esta unidade tem por objetivo introduzir estruturas sofisticadas da lingua-
gem Pascal. No Captulo-1 so apresentadas estruturas que permitem
abstrair e operar modelos ligados a objetos enumerveis, descritos por
campos ou associados a conjuntos. No Captulo-2 estudado o podero-
so recurso dos ponteiros que tanto potencializam construes nativas do
Pascal quanto permitem um mais flexvel gerenciamento da memria do
computador. Alm das vantagens so tambm estudados os problemas
com ponteiros. Um estudo de caso prtico procura aplicar as principais
estruturas abordadas no captulo.
type
inteiro = integer;
o identificador inteiro passa a funcionar, aps essa definio, como o tipo pri-
mitivo integer. A declarao,
var x: inteiro;
<identificador_do_novo_tipo> = <tipo_de_dados>;
<identificador> = <limite_inferior>..<limite_superior>;
No exemplo,
type
faixa1 = 10..20;
var
x: faixa1;
um tipo denominado faixa1 definido para que suas variveis (tais como o
exemplo x) possam representar inteiros entre 10 e 20. Atribuies explcitas
de valores fora da faixa definida (como, x := 89, neste exemplo) fazem o com-
pilador emitir uma advertncia, mas no um erro.
O tamanho em bytes de uma varivel de tipo faixa o menor valor in-
teiro n tal que 28n seja maior ou igual ao total de inteiros cobertos pelo tipo.
Por exemplo na faixa 10..20, so cobertos 11 inteiros e o menor valor de n
1-byte pois 281= 28= 256> 11. Para a faixa 10..1000, que cobre 991 inteiros, n vale
2-bytes pois 282= 216= 65536> 991. Vaiveis de tipo faixa so operadas normalmen-
te como qualquer outra variveis inteira.
95
Linguagem de Programao I
Tipos arrays estticas podem tambm ser definidos numa sesso type.
No exemplo,
type
c: tarr = (5,4,1,3,2,0,9,7,8,6);
var
x: tarr;
mensagem = string[100];
const
var
s: mensagem;
begin
s := erro_1;
writeln(s);
end.
96
RICARDO REIS PEREIRA
Listagem 26
01 program tipo_array_dinamico;
type
02
tdyarr = array of integer;
03 var
x, y: tdyarr;
04 i: integer;
05 begin
setlength(x, 20);
06 for i := low(x) to high(x) do x[i] := i*i;
07 y := x;
for i := low(x) to high(x) do y[i] := y[i]*2;
08 for i := low(x) to high(x) do write(x[i], );
09 end.
10
11
12
13
2. Enumeraes
Uma enumerao um tipo faixa especial cujos inteiros cobertos possuem
cada um seu prprio identificador. A sintaxe geral de um tipo enumerao
Pascal a seguinte,
type
hoje: dia;
begin
hoje := dom;
end.
a nova sequncia de equivalentes numricos 25, 26, 27, 28, 29, 30 e 31.
Os comandos low e high, da unidade system, podem ser utilizados para
determinar os identificadores de um tipo enumerao respectivamente de me-
98
RICARDO REIS PEREIRA
begin
a := ter;
b := qui;
end.
var d: dia;
begin
end.
ter equivale a 1
qua equivale a 2
qui equivale a 3
sex equivale a 4
sab equivale a 5
dom equivale a 6
3. Estruturas Heterogneas
Uma estrutura heterognea em Pascal um tipo de dados construdo pelo
encapsulamnto de outros tipos de dados que podem ser nativos ou pernona-
lizados. O encapsulamento funciona pela definio de identificadores e seus
tipos cada qual responsvel por uma fatia dos dados que uma varivel ou
constante desta estrutura dever conter. Cada par identificador/tipo de uma
estrutura heterognea denominado campo. A sintaxe geral de um tipo estru-
tura heterognea em Pascal ,
type
<nome> = record
<campo_1>: <tipo_1>;
<campo_2>: <tipo_2>;
<campo_3>: <tipo_3>;
...
<campo_n>: <tipo_n>;
end;
onde a palavra reservada record (que significa registro) forma com end o blo-
co encapsulador de campos. O exemplo,
type
aluno = record
nome: string[25];
idade: byte;
media: real;
end;
x: aluno;
x.idade := 25;
x.media := 8.7;
begin
{ corpo }
end;
onde o corpo contm cdigo Pascal que utiliza os campos da varivel dispos-
ta entre with e do. Estas palavras reservadas significam com e faa respecti-
vamente. No exemplo,
with x do begin
idade := 25;
media := 8.7;
writeln('Nome: ', aluno, ' Idade: ', idade, ' Media: ', media:0:1);
end;
erro: integer;
end;
a,b,c: real;
r: root;
begin
readln(a,b,c);
r := eq2g(a,b,c);
case r.erro of
1: writeln(Polinomio invalido);
2: writeln(Raizes complexas);
end;
end.
103
Linguagem de Programao I
nome: string[30];
turma: record
serie: byte;
letra: char;
end;
end;
x.notas[2] := 8.7;
x.notas[3] := 8.0;
x.notas[4] := 6.2;
serie := 8;
letra := C;
turno := manha;
end;
x.turma.letra := C;
x.turma.turno := manha;
var y: record
check: boolean;
lote: integer;
end;
Nestes casos o novo tipo fica ancorado e de uso exclusivo das variveis
definidas juntamente com ele. O acesso a campos descrito anteriormente fun-
ciona da mesma forma.
Para definir uma constante de estrutura heterognea utiliza-se a sintaxe
geral seguinte,
const
<nome>: <tipo_estrutura_heterogenea> =
(<campo1>:<valor1>;
<campo2>:<valor2>;
<campo3>:<valor3>;
...
<campon>:<valorn>);
aplicado: estudante =
( nome: 'raul';
end;
x := 5.0 + 45.0*(i-1)/99;
y := sqr( x );
end;
4. Conjuntos
As trs opes mais comuns de estilos de formatao de texto so o negrito,
o itlico e o sublinhado. Tais estilos podem ocorrer ao mesmo tempo, aos
pares, apenas um ou mesmo nenhum deles fazendo um total de oito possibili-
dades. Aos estilos de formatao denominamos de domnio de representao
do problema e s possibilidades combinatrias de conjuntos. De forma geral
um domnio com n elementos rende um total de 2n conjuntos.
A linguagem Pascal suporta a implementao de conjuntos. Um con-
junto em Pascal construdo sobre um tipo inteiro, faixa ou enumerao
(denominado tipo base) e registra quaisquer uma das combinaes que os
elementos deste tipo podem formar. A sinaxe bsica de definio de um tipo
conjunto Pascal ,
type
Remoo
Verificao
Numa atribuio a varivel conjunto recebe integralmente os itens que
dever conter. Se ela contm outras informaes, estas so sobrepostas. A
sintaxe geral de uma atribuio para uma varivel conjunto ,
<variavel_conjunto> := [ <lista_de_itens> ];
s := [italico];
s := [negrito, sublinhado];
t := t + [sublinhado, negrito];
writeln(Texto em negrito!);
Atividades de avaliao
1. Construa uma estrutura heterognea que modele uma data incluindo dia,
ms e ano. Use uma enumerao para representar os meses.
2. Utilizando o modelo de data do problema-1 construa programa que leia
duas datas e diga qual delas est a frente da outra.
3. So considerados anos bissextos todos os anos mltiplos de 400 ou os
mltiplos de 4 e no mltiplos de 100. Utilizando essas informaes, uma
estrutura heterognea para datas e uma enumerao para os dias da
semana, construir programa que determine em que dia da semana cai
determinada data.
4. Utilizando estruturas heterogneas montar um modelo para nmeros
complexos e implementar funes que efetuem as operaes de soma,
subtrao, multiplicao e diviso de dois complexos dados.
5. Expandir o modelo da questo anterior e criar uma funo que retorne
razes reais ou complexas de um polinmio de segundo grau.
6. Vetores no espao possuem trs componentes referentes aos eixos x, y e
z. Construir modelo para vetor e implementar funo que retorne o mdulo
de um vetor recebido como argumento. O mdulo de um vetor calculado
pela raiz quadrada da somatria dos quadrados de suas componentes.
108
RICARDO REIS PEREIRA
1. Fundamentos
Ponteiro um tipo de varvel utilizada para armazenar endereos de outras
variveis. Assim a informao registrada em um ponteiro um endereo de
memria. Como a forma de endereamento pode mudar entre arquiteturas
distintas, ento o contedo de um ponteiro vai depender do hardware utilizado
e do sistema operacional instalado.
Mas convenientemente, num mesmo sistema em operao, qualquer
referncia a memria feita com a mesma nomenclatura e cada varivel ins-
tanciada tem um endereo distinto. Dificilmente um programador que trabalha
com uma linguagem de alto nvel, como Pascal, ter diretamente que tratar
com valores de endereos das variveis de seus programas. Como se ver
neste captulo o uso de ponteiros quase sempre para uma operao indireta.
A ttulo de visualizao, abstraindo-se a memria como uma estrutura
linear, possvel conceber um modelo que define o endereo como a quanti-
dade de bytes que antecede a varivel endereada (Figura - 7).
Endereo de memria
Varivel armazenada
Memria Principal
2. Declarao e Inicializao
de Ponteiros
Existem duas categorias de ponteiros em linguagem Pascal: os ponteiros tipa-
dos, que conhecem o tipo das variveis para onde apontam, e os no-tipados,
que no conhecem o tipo da varivel para onde apontam, mas que em contra
partida, podem apontar para variveis de quaisquer tipo.
A sintaxe para declarar um ponteiro tipado em Pascal ,
var
<ponteiro>: ^<tipo_base>;
var
p: ^integer; Diz-se que p um ponteiro para
inteiro, q para real e pt para
q: ^real;
booleano.
pt: ^boolean;
TReg = record
x, y, z: Byte;
end;
var
reg: ^TReg;
112
RICARDO REIS PEREIRA
var
pVec: ^MyVec;
MyPtInt = ^integer;
var
pp: ^MyPtInt;
<variavel>: pointer;
p := @i;
Figura 8
Listagem 28
01 program PonteiroAplicado; 07 p := @i;
02 var 08 writeln(p^);
03 i: integer; 09 p^ := 231;
04 p: ^integer; 10 writeln(' ', i);
05 begin 11 end.
06 i := 127;
Um modelador um i := 127;
recurso da Linguagem p := @i;
Pascal que obriga um valor
de um tipo a se tornar de q := p; // Cpia de ponteiro
outro tipo. a chamada writeln(q^); // A cpia mantm a indireo
coero de dados. A
sintaxe de uma coero A atribuio q:=p copia o endereo armazenado em p para o ponteiro
tipo(valor) onde tipo denota q. Assim q^ funciona como p^, ou seja, duas referncias varivel i. Se o tipo
o tipo de dados para o qual base do ponteiro q no for o mesmo do ponteiro p a atribuio falhar (ocorre
valor deve ser coagido.
um erro de compilao). Entretanto, utilizando a coero de modeladores
possvel driblar essa restrio.
Listagem 29
01 program PonteiroAplicado2;
02 type
03 PtInt = ^integer;
04 PtReal = ^real;
05 var
06 i: integer;
07 p, q: PtInt;
08 r: PtReal;
09 begin
10 i := 127;
11 p := @i;
12 r := PtReal(p); // Coero de ponteiro de inteiro para real
13 q := PtInt(r); // Coero de ponteiro de real para inteiro
14 writeln(q^);
15 end.
Listagem 30
01 program PonteiroAplicado3; 08 begin
02 type 09 i := 127;
03 PtInt = ^integer; 10 p := @i;
04 var 11 q := @p;
05 i: integer; 12 writeln(i, ' ', p^, ' ', q^^);
06 p: PtInt; 13 end.
07 q: ^PtInt;
3. Ponteiros e Arrays
Se um ponteiro aponta para uma array possvel utilizar este ponteiro como se
fosse a prpria array. O operador de indexao, [], igualmente ps-fixo no pon-
teiro e o valor de ndice um nmero entre 0 e len-1, onde len o comprimento
do array. No h conservao dos limites de ndices adotados no array original.
Listagem 31
01 program AplicacaoPonteiro4;
02 var
03 arr: array[1..5] of integer = (7,4,11,8,6);
04 pt: ^integer;
05 i: integer;
06 begin
07 pt := @arr[1];
08 for i := 0 to 4 do
09 write(pt[i], ' ');
10 end.
Listagem 32
01 program ponteiros_e_strings;
02 var
03 s: string[20] = 'ola mundo!';
04 p: ^char;
05 begin
06 p := @s[1];
07 write(p);
08 end.
Contador de referncia
uma metodologia Na Listagem 32 o ponteiro p recebe o endereo da cadeia s (Linha-06).
utilizada para otimizar o A impresso (Linha-07) feita diretamente via ponteiro.
gerenciamento de memria
dinmica associado aos
O tipo PChar em Pascal denota ponteiro de caractere (^char) com a
ponteiros. Baseia-se na convenincia de permitir atribuies diretamente. Internamente uma varivel
definio implcita de Pchar aloca e desaloca memria convenientemente utilizando contadores
um contador para cada de referncia de forma a manter strings de tamanho variante.
ponteiro que armazena
o nmero de variveis A Listagem 33 ilustra o uso de Pchar. Nas Linhas 06 e 08 so respecti-
que se referem a ele. vamente inicializadas, com caracteres de constantes strings, as variveis p de
Quando este contador zera tipo PChar e s de tipo string. Quando p recebe o endereo da cadeia apontada
a memria apontada
por s (Linha-09), o contador de referncia de teste de uso de PChar zerado
desalocada. Dessa forma
o programador no precisa e esta string desalocada. A string uma string possui agora contador de refe-
se preocupar em desalocar rncia igual a dois e pode ser tanto acessada por s quanto por p (Linha-10). A
memria dinmica que sada deste programa ,
requisitou pois isso ocorre
automaticamente. teste de uso do PChar
uma string
117
Linguagem de Programao I
Listagem 33
01 program uso_de_pchar;
02 var
03 p: Pchar;
04 s: string;
05 begin
06 p := 'teste de uso do PChar';
07 writeln(p);
08 s := 'uma string';
09 p := @s[1];
10 writeln(p);
11 end.
4. Ponteiros em Mdulos
Argumentos ponteiros em mdulos, sejam procedimentos ou funes, so co-
mumente utilizados para se referir a variveis fora do escopo do mdulo (ou
seja, variveis que no so locais ao mdulo). Esse mecanismo permite que
provisoriamente seja possvel ler ou alterar variveis alheias, sejam elas esca-
lares ou vetoriais.
Argumentos ponteiros funcionam como quaisquer ponteiros permitindo
aritmtica e desreferenciamento clula de memria endereada. H o incon-
veniente entretanto de, para se declarar um argumento ponteiro em um mdulo
Pascal, necessrio definir previamente um tipo ponteiro como em,
type PtInt = ^integer;
Listagem 34
01 program equacao_do_segundo_grau;
02 type
03 ptreal = ^real;
04
05 function eq2g(a,b,c: real; p, q: ptreal): boolean;
06 const TOL = 1.0e-8;
07 var delta: real;
08 begin
09 delta := b*b - 4*a*c;
10 if (abs(a) < TOL) or (delta<0) then begin
11 eq2g := false;
12 exit;
13 end;
14 p^ := (-b + sqrt(delta))/(2*a);
15 q^ := (-b - sqrt(delta))/(2*a);
16 eq2g := true;
17 end;
18
19 var
20 a,b,c,x1,x2: real;
21 begin
22 writeln('Coeficientes: ');
23 readln(a,b,c);
24 if eq2g(a, b, c, @x1, @x2) then
25 writeln('Raizes: ', x1:0:2, ' e ', x2:0:2)
26 else
27 writeln('Razes no podem ser calculadas!');
28 end.
a x 2+ b x+ c= 0
b , onde
x= = b2 4 a c
2a
23 82 50 49 81 90 80 73 17 32 79 45 86 56 39 89 57 49 1 26
Valor mximo = 90
121
Linguagem de Programao I
Listagem 35
01 program extremos;
02
03 type
04 PtReal = ^real;
05
06 function Max(vec: PtReal; len: integer): real;
07 var i: integer;
08 begin
09 Max := vec[0];
10 for i:= 1 to len-1 do
11 if vec[i]>Max then
12 Max := vec[i];
13 end;
14
15 var
16 x: array[1..20] of real;
17 i: integer;
18 begin
19 randomize;
20 for i := 1 to length(x) do begin
21 x[i] := random(100);
22 write(x[i]:0:0, );
23 end;
24 writeln;
25 writeln(Valor mximo = , Max( @x[1], length(x) ):0:0);
26 end.
5. Alocao Dinmica
Novas variveis podem ser criadas em tempo de execuo atravs do meca-
nismo de alocao dinmica. Estas variveis no possuem nomes e depen-
dem de ponteiros para serem manipuladas. Ponteiros tipados possuem em
Pascal duas abordagens de alocao, a escalar e a vetorial, que so estuda-
das nas Sesses 5.1 e 5.2 . A alocao com ponteiros no tipados estudada
Sesso 5.3 .
122
RICARDO REIS PEREIRA
ou ainda,
<ponteiro> := getmem(<memria_em_bytes>);
aloca um bloco de memria que compota dez inteiros e atribui para pt o en-
dereo.
O comando freemem similar a dispose contendo como argumento
nico o ponteiro para a rea de memria que deve ser liberada. No exemplo,
freemem(pt);
a memria apontada por pt liberada.
Listagem 38
01 program Alocacao_Dinamica_3; 14 q^ := i;
02 var 15 q := q + sizeof(integer);
03 i, j, n: integer; 16 inc(j);
04 p, q: ^integer; 17 end;
05 begin 18 inc(i);
06 write('Total: '); 19 end;
07 read(n); 20 for i := n-1 downto 0 do begin
08 i := 0; 21 q := p + i * sizeof(integer);
09 j := 0; 22 write(q^, ' ');
10 getmem(p, sizeof(integer)*n); 23 end;
11 q := p; 24 freemem(p);
12 while j<n do begin 25 end.
13 if (i mod 3 = 0) and (i mod 7 <> 0) then begin
124
RICARDO REIS PEREIRA
q := p + sizeof(integer)*i;
q^ := 21;
equivalente a,
p[i] := 21;
Listagem 39
01 program Alocacao_Dinamica_4; 11 while j<n do begin
02 var 12 if (i mod 3 = 0) and (i mod 7 <> 0) then begin
03 i, j, n: integer; 13 p[j] := i;
04 p: ^integer; 14 inc(j);
05 begin 15 end;
06 write('Total: '); 16 inc(i);
07 read(n); 17 end;
08 i := 0; 18 for i := n-1 downto 0 do write(p[i], ' ');
09 j := 0; 19 freemem(p);
10 getmem(p, sizeof(integer)*n); 20 end.
<ponteiro>^[<indice>]
Listagem 40
01 program Alocacao_Dinamica_5;
02 type
03 IntVec = array[0..0] of integer;
04 var
05 vec: ^IntVec;
06 i: integer;
07 const
08 max = 10;
09 begin
10 vec := getmem( sizeof(integer)*max );
11 vec^[0] := 1;
12 vec^[1] := 1;
13 for i := 2 to max-1 do
14 vec^[i] := vec^[i-1] + vec^[i-2];
15 for i := max-1 downto 0 do
16 write(vec^[i], ' ');
17 freemem(vec);
18 end.
Listagem 41
01 procedure zerar(p: pointer; size: longint);
02 var i: longint;
03 b: ^byte;
04 begin
05 for i := 0 to size-1 do begin
06 b := p + i;
07 b^ := 0;
08 end;
09 end;
Se y for uma varivel de uma estrutura heterognea chamada Reg, seus bytes
podem ser zerados com,
zerar(@y, sizeof(Reg));
Se vec for uma array de inteiros que precisa ter os bytes zerados ento deve-
-se escrever,
zerar( @vec[1], sizeof(integer)*length(vec) );
q^ := 1000/(i+1);
end;
o bloco alocado via p recebe os valores 1000.0, 500.0, 333.4, 250.0 40.0.
128
RICARDO REIS PEREIRA
for i := 0 to 24 do
q[i] := 1000/(i+1);
dispose(p);
Listagem 42
01 program Vazamento_de_Memoria;
02 var
03 p: ^integer;
04 i: integer;
05 begin
06 new(p);
07 p := @i;
08 dispose(p);
09 end.
Lista Encadeada
Figura 10 Elementar: uma lista
de objetos, denominados
nodos, cujo tipo
Um exemplo crtico de vazamento de memria, conhecido como ladro corresponde a um tipo
de memria, usa um lao infinito para gerar incontveis blocos perdidos em estruturado heterogneo
contendo um campo da
heap. Em Pascal implementa-se, chave e outro de ponteiro
while true do new(p); do prprio tipo estrutura
heterognea em questo.
No recomendada a execuo do ladro de memria. Isso permite que o primeiro
nodo da lista contenha
uma chave e o endereo
7. Estudo de Caso: Lista Escadeada Elementar para o segundo nodo que
contm outra chave e o
O primeiro passo para implementar uma lista encadeada elementar em endereo para o terceiro
Pascal a definio de uma estrutura heterognea para os nodos da lista. nodo e assim por diante.
Considerando uma lista de valores inteiros ento o tipo nodo proposto , O ltimo nodo da lista
aquele que contm uma
chave e um endereo para
parte alguma.
130
RICARDO REIS PEREIRA
pnodo = ^nodo;
nodo = record
chave: integer;
prox: pnodo;
end;
raiz: pnodo;
total: integer;
end;
plista = ^lista;
Este novo tipo mantm um ponteiro raiz para o primeiro nodo da lista
e o total de nodos listados. Apesar de no serem visveis diretamente nessa
estrutura, os demais nodos estaro presentes pois o primeiro aponta para o
segundo, que aponta para o terceiro e assim sucessivamente. O tipo plista
necessrio para possibilitar a mdulos afetarem uma lista que recebam como
argumento. Por exemplo para inicializar uma lista deve-se utilizar o procedi-
mento,
procedure Init(Q: plista);
begin
Q^.raiz := nil;
Q^.total := 0;
end;
init zera uma lista tanto em nodos quanto em contagem. Pode ser chamado
assim,
131
Linguagem de Programao I
var
L: lista;
begin
init(@L);
...
Para inserir uma nova chave numa lista prope-se o seguinte algoritmo:
(i) constri-se dinamicamente um novo nodo contendo a chave de insero; (ii)
Faz-se o prox desse novo nodo apontar para o primeiro nodo da lista, ou seja,
raiz, (iii) faz-se raiz da lista apontar para este nodo e (iv) incrementar o campo
total da lista em uma unidade para indicar que um novo nodo foi inserido.
Assim a ltima chave inserida sempre a primeira da lista e a proporo
que novas chaves so inseridas as mais antigas vo ficando mais distantes de
raiz. O procedimento da Listagem 43 implementa a insero. A lista repassa-
da via ponteiro Q e a chave de insero via inteiro x. As etapas so marcadas
como comentrios.
Listagem 43
01 procedure inserir(Q: plista; x: integer);
02 var p: pnodo;
03 begin
04 new(p);
05 p^.chave := x; // (i)
06 p^.prox := Q^.raiz; // (ii)
07 Q^.raiz := p; // (iii)
08 inc(Q^.total); // (iv)
09 end;
Listagem 45
01 procedure limpar(Q: plista);
02 var p: pnodo;
03 begin
04 while Q^.raiz <> nil do begin // i
05 p := Q^.raiz; // ii
06 Q^.raiz := p^.prox; // iii
07 dispose(p); // iv
08 end;
09 Q^.total := 0;
10 end;
Sntese da Parte 2
No Captulo - 3 foi tanto apresentada a sintaxe bsica de definio de
tipos personalizados quanto as estruturas nativas do Pascal que permitem a
modelagem de objetos enumerados (enumeraes), de objetos segmentados
por campos (estruturas heterogneas) e objetos agrupveis (conjuntos). No
Captulo - 4 foram introduzidos e contextualizados os ponteiros. Foram apre-
sentadas que relaes eles mantm com outras construes da linguagem
como arrays e mdulos assim como a importante participao que exercem
no mbito da alocao dinmica de memria. Problemas com ponteiros so
tambm abordados. O captulo encerra com o estudo de caso da lista enca-
deada elementar.
133
Linguagem de Programao I
Atividades de avaliao
1. Reescreva o programa da Listagem-4.7 de forma que seja possvel, com
as informaes de sada, saber o tipo de problema que inviabilizou o cl-
culo das razes, quando esse for o caso.
2. Construir mdulo que inverta a sequncia dos caracteres de uma string
(use Pchar).
3. Construa mdulo que receba um vetor e retorne o maior e menor valor
existente.
4. Construa mdulo que receba um vetor e retorne os dois maiores valores
existentes.
5. Escrever duas verses de programa, uma utilizando arrays dinmicas e
outra utilizando alocao dinmica, para resolver o problema de receber
uma quantidade arbitrria de notas de alunos (esta quantidade de notas
tambm entrada) e determine o valor do desvio padro da amostra. O des-
vio padro de uma amostra x 1 , x 2 , x 3 , ... , x n dada por, ,
onde x i se refere a i-sima nota e mdia de todas as notas.
6. Seja P um ponteiro que aponta para um bloco de memria alocado dina-
micamente. Se P precisar apontar para um bloco de memria maior, sem
perder as informaes para as quais j aponta, deve-se: (I) alocar o novo
espao, maior que o anterior; (II) copiar todo contedo do bloco apontado
por P para a nova memria alocada; (III) desalocar o espao apontado
por P; (IV) apontar P para a nova memria alocada. O processo de cpia
deve ser de tal forma que independa do tipo de informao apontada.
Construir mdulo com este fim e contextualiz-lo num programa.
7. Crie uma estrutura vector (usando estruturas heterogneas) que mante-
nha dois campos: um ponteiro de real data e um inteiro n. O campo data
refere-se a um vetor de real cujo comprimento o valor do campo n.
Construa tambm mdulos que permitam as seguintes operaes com
variveis de tipo vector: (a) construtor (recebe um comprimento qualquer
e retorna um vector novo com tal comprimento e com todos os elementos
de data iguais a zero); (b) valor modular (retorna raiz quadrada da soma-
tria dos quadrados dos elementos de data); (c) normalizador (modifica
um vector de forma que todos os elementos em data sejam divididos
pelo valor modular); (d) destrutor (recebe um vector, desaloca a memria
apontada por data e zera seu comprimento).
134
RICARDO REIS PEREIRA
Referncias
CANNEYT, Michal Van, Reference guide for Free Pascal, Document
version 2.4 , March 2010
http://www.freepascal.org/docs-html/
http://en.wikipedia.org/wiki/Tower_of_Hanoi
Parte 3
Modularizao
Captulo 5
Modularizao
Objetivos:
A modularizao, estudada no Captulo-1 desta unidade, uma tcnica
que permite a segmentao de um programa em unidades menores mais
fceis de gerenciar. So as funes e os procedimentos. Para estud-la
com mais detalhes o captulo aborda noes sobre controle e processo
bem como um estudo mais aprofundado sobre o mecanismo de passa-
gem de argumentos introduzido no Captulo-1. O captulo ainda cobre
outros importantes conceitos relacionados como a recursividade e o ani-
nhamento modular. O Captulo-2 finaliza a unidade apresentado os recur-
sos que o Pascal disponibiliza para a manipulao de arquivos. Isso inclui
desde fundamentos sobre o funcionamento da memria secundria at
recursos e comandos que permitiro a implementao de programas que
manipulem arquivos.
begin
write(n);
n = n div 3;
end;
end;
caso a entrada seja um valor negativo, ento a funo deve retornar imediata-
O piso de um valor real x
mente ao chamador com retorno zero. Para implementar esse comportamento o maior inteiro menor ou
associou-se uma estrutura de deciso (que verifica a possvel negatividade de igual a x. Representa-se
n), uma atribuio direta do valor 0 a fnc (varivel interna) e uma chamada a exit. por.O teto de um valor real
x o menor inteiro maior
Um programa tambm pode devolver diretamente o controle ao sistema ou igual a x. Representa-se
operacional independendo do mdulo que esteja executando. Isso representa por.
matar o programa e em Pascal conseguido com uma chamada ao comando
halt, unidade system.
Neste caso o 6 inteiro convertido para um valor real. Se for porm a situao
seguinte,
teste(5.0, 6.0);
causar um erro de compilao porque 5.0 (que real) no pode ser trans-
formado em inteiro diretamente. Estas situaes caracterizam a coero em
Pascal. Coagir um valor significa transform-lo noutro tipo. A coero pode ser
de estreitamento ou de alargamento. No estreitamento o tipo final do valor
menos expressivo (possui menor memria ou representa faixas mais restritas
de valores) e por isso pode ocorrer perda de dados. Exemplos so, de real
para integer, de longint para char, extended para real e etc. No alargamento
ocorre exatamente o inverso e logo no h perda de dados.
Em Pascal a coero de alargamento entre parmetros reais e for-
mais normalmente aceita pelo compilador desde que haja compatibilidade.
Entretanto a coero de estreitamento frequentemente reporta um erro. A rigor
as restries de coero tambm ocorrem em atribuies explcitas como,
x := y;
type
ptint = ^integer;
begin
q^:= q^ + 1;
end;
inc(@x);
write(x); // 57
Neste caso como deve ser repassado uma array de inteiros, ento o primeiro
argumento um ponteiro de inteiro (ir receber o endereo para o primeiro
inteiro da array). O comprimento da array deve ser repassada como segundo
argumento (por valor) e as clulas individuais podero ser acessadas pelo
operador ps-fixo [] (os valores de ndice esto entre 0 e len-1). Para usar a
funo max deve-se repassar naturalmente o endereo da primeira clula de
uma array de inteiros existente como,
142
RICARDO REIS PEREIRA
var
x: integer;
begin
{...}
x := max(@data[1], 10);
{...}
{...}
begin
x := x*2;
end;;
q: integer;
begin
q := 26;
dobrar(q);
writeln(q); // 52
end.
4. Recursividade
A recursividade um recurso de linguagem que permite um mdulo, seja
Alm da palavra reservada
ele funo ou procedimento, fazer uma chamada de si mesmo, ou seja, var, as sesses de
dentro do corpo de cdigo do mdulo possvel fazer uma ou mais cha- argumentos formais em
madas daquele mdulo. A recursividade permite implementaes mais mdulos contam com a
palavra reservada out
claras de diversos algoritmos e por essa razo um recurso nativo do
para definir referncias.
Pascal. Para calcular, por exemplo, o fatorial de um inteiro pode-se usar Out ajuda, pelo menos em
a seguinte funo, ingls, a lembrar que o
argumento deve funcionar
function fat(n: integer): integer;
como sada.
begin
if n<2 then
fat := 1
else
fat := n * fat(n-1);
end;
5 * 4 * 3 * 2 * 1 // 4 chamadas pendentes
5 * 4 * 3 * 2 // 3 chamadas pendentes
5 * 4 * 6 // 2 chamadas pendentes
5 * 24 // 1 chamada pendente
120 // resolvido
Listagem 48
01 program torre_de_hanoi;
02
03 procedure hanoi(n: integer; A, B, C: char);
04 begin
05 if n = 0 then exit;
06 hanoi(n-1, A, C, B);
07 write(A, ' > ', B, ' | ');
08 hanoi(n-1, C, B, A);
09 end;
10
11 begin
12 hanoi(3, 'A', 'B', 'C');
13 end.
148
RICARDO REIS PEREIRA
5. Aninhamento Modular
Em Pascal possvel construir um mdulo (funo ou procedimento) dentro
do corpo de outro mdulo. Este recurso conhecido como aninhamento mo-
dular e os mdulos aninhados de mdulos internos. No exemplo,
procedure teste;
begin
return a+b;
end;
begin
write( soma(3, 8) );
end;
Listagem 49
01 program busca_binaria;
02
03 function busca_bin(L: array of integer; x: integer): integer;
04 function rbusca(min, max: integer): integer;
05 var med: integer;
06 begin
07 rbusca := -1;
08 if max<min then exit;
09 med := (min + max) div 2;
10 if L[med] = x then
11 rbusca := med
12 else if L[med]>x then
13 rbusca := rbusca(min, med-1)
14 else
15 rbusca := rbusca(med+1, max);
16 end;
17 begin
18 busca_bin := rbusca( 0, length(L)-1 );
19 end;
20
21 const
22 M: array[0..11] of integer = (2,3,6,11,21,24,38,39,44,50,70,78);
23 var
24 x: integer;
25 begin
26 x := busca_bin(M, 11);
27 if x > 0 then
28 writeln(x)
29 else
30 writeln('nao encontrado');
31 end.
6. Unidades
A sada gerada pelo compilador quando recebe como entrada um arquivo
de cdigo de um programa um arquivo binrio executvel. Ele representa
o cdigo de mquina que pode ser executado diretamente em hardware e
ao mesmo tempo est atrelado a servies do sistema operacional sobre o
qual se procedeu a compilao. Se sesses de clusula uses esto presen-
tes, ento o compilador acessar e anexar recursos de outros arquivos que
so binrios mas que no so executveis. Em Pascal estes arquivos so
denominados unidades e so tambm provenientes de outros processos de
compilao mas a estrutura bsica de implementao diferente.
A estrutura bsica para implementao de uma unidade Pascal a se-
guinte,
unit <nome_da_unidade>;
<recursos>
interface
<interfaces>
implementation
<implementaes>
end.
151
Linguagem de Programao I
interface
procedure ola;
implementation
procedure ola;
begin
write('OLA');
end;
procedure tchau;
begin
write('TCHAU');
end;
end.
152
RICARDO REIS PEREIRA
uses teste;
begin
ola;
tchau;
end;
(1.0,8.0)
(5.0,-4.0)
(-18.0,14.0)
(0.2,-0.6)
Atividades de avaliao
1. Se uma array for passada por referncia a um mdulo, ele poder modi-
fic-lo. Utilizando este recurso implemente uma funo capaz receber e
ordenar uma array de comprimento qualquer.
2. Implemente uma verso de resoluo do problema da Torre de Hani uti-
lizando quatro pinos (um origem, um destino e dois auxiliares) de forma
a diminuir, para uma mesma quantidade de discos dada, o nmero de
movimentaes.
3. Implementar uma verso no recursiva (iterativa) para a busca binria.
4. A sequncia de Fibonacci uma srie infinita de nmeros naturais cujos
dois primeiros termos so 1 e os demais so calculados pela soma dos
dois termos anteriores. Os seis primeiros termos da sequncia so ento
1, 1, 2, 3, 5 e 8. Criar duas verses de procedimentos, uma iterativa e
outra recursiva, que imprimam os n primeiros termos da sequncia de
Fibonacci, onde n um argumento de entrada.
155
Linguagem de Programao I
1. Memria Secundria
Executar um programa significa processar sequencialmente suas instrues
de mquina. Este processo requer no apenas uma CPU de processamento
eficiente, mas tambm de memria onde possam ser armazenadas e bus-
cadas rapidamente as instrues. a chamada memria principal. A perfor-
mance desta memria justificada pela associao de duas caractersticas:
o acesso aleatrio e a volatilidade. O acesso aleatrio a capacidade que o
hardware possui de permitir que qualquer clula de memria seja acessada
num tempo constante e muito pequeno. A volatilidade refere-se a condio
de presena de corrente eltrica no dispositivo para que alguma informao
esteja presente.
Memria Secundria um termo utilizado para se referir a qualquer
dispositivo que almeje o armazenamento no voltil de informaes (estaro
registradas mesmo aps o desligamento do dispositivo). De forma geral, de-
vido a diferena funcional, existe maior quantidade de memria secundria
em relao a primria (que tambm mais cara). A memria secundria
representada por dispositivos como discos rgidos, pendrivers e cartes de
memria (de cmeras digitais, celulares e etc).
O gerenciamento de memria principal e secundria pelo sistema ope-
racional feita de forma distinta. A disposio dos programas em execuo
na memria principal no diretamente visvel ao usurio que apenas pode
obter informaes gerais como o total de memria utilizado. No caso da me-
mria secundria toda informao visualizvel em forma de uma rvore de
diretrios e arquivos.
Um arquivo tecnicamente uma sequencia de bytes com nome pr-
prio, tamanho definido e endereo exclusivo (veja Figura - 10). Um diretrio ou
pasta um continer de arquivos e tambm de outras pastas (por isso a hie-
rarquia de dados em memria secundria anloga a uma rvore). A primeira
158
RICARDO REIS PEREIRA
Partio Lgica pasta, aquela que contm todas as demais, chamada de raiz e o conjunto
possvel aos sistemas de todas as pastas e seus respectivos arquivos, de sistema de arquivos. H
operacionais atuais definir
que parte, por exemplo,
regras para montar um sistema de arquivos e elas mudam conforme o sistema
de um disco ser utilizada. operacional e o dispositivo utilizados.
Na prtica, uma vez O mesmo dispositivo de memria secundria, como por exemplo discos
estabelecido isso, todas
as operaes de leitura
rgidos, pode inclusive possuir mais de um sistema de arquivo com mesmas
e gravao de arquivos regras ou regras diferentes. Cada fatia lgica em memria secundria, que
ocorrero nessa parte. No mantm um sistema de arquivos, denominada de partio. Usualmente as re-
existe uma barreira fsica gras de montagem de um sistema de arquivos so referenciadas simplesmente
de acesso ao restante do
disco e por essa razo diz-
como sistema de arquivos. Assim so exemplos de sistemas de arquivos o FAT
se que o particionamento e o NTFS da Microsoft, o ext3, ext4 e reiserFS do Linux e o HPFS da IBM.
lgico. Discos rgidos representam a mais comum forma de memria secund-
ria que permite o armazenamento macio de informao. Internamente eles
Para acessar informaes so formados por discos magnticos rgidos (da a origem do nome) fixos a
num dispositivo de um eixo central que gira em uma alta velocidade sobre um mancal de preci-
armazenamento primrio so. Um brao mecnico, com liberdade angular de movimentao, mantm
ou secundrio necessrio
inicialmente deslocar-
diversas extenses com agulhas magnetizadas que interagem com a superf-
se at o endereo onde cie de cada uma das faces dos discos rgidos efetuando operaes de leitura
fica o dado pretendido e gravao.
e s ento efetuar a
leitura e/ou gravao.
Essa parafernlia justifica a lentido das operaes em discos rgidos,
Em alguns hardwares pelo menos quando comparadas quelas em memria principal (que devido
esse deslocamento a volatilidade, dispensa partes mecnicas). Apesar disso ainda representam
instantneo, mas em a melhor opo para armazenamento macio no voltil no que diz respeito
outros toma um tempo
considervel. Essa
a anlise custo versus quantidade de memria versus velocidade de acesso.
disparidade ocorre devido
a presena de partes Tamanho do Arquivo
mveis no segundo caso
(inrcia de dispositivo).
Assim os dispositivos do
Memria Arquivo
primeiro caso esto haptos
Endereo do incio do arquivo
ao acesso aleatrio, ou
seja, acesso a qualquer
parte do disco em qualquer
tempo enquanto os da H dispositivos de memria secundria de acesso aleatrio e de aces-
segunda categoria so so sequencial. Nos dispositivos de acesso aleatrio, como os discos rgidos, o
melhores aproveitados tempo de acesso a blocos fundamentais de bytes ocorre num tempo aproxima-
no acesso sequencial, ou damente constante definido pelo fabricante, mas que ir variar de modelo para
seja, ao invs de saltar
entre dados distantes modelo. Nos dispositivos de acesso sequencial, como as fitas magnticas, o
mais interessante efetuar tempo de acesso a blocos fundamentais de bytes muda consideravelmente.
acessos seguidos a clulas Nestes dispositivos uma agulha magnetizada de leitura fica fixa enquan-
sequenciais minimizando o
efeito do deslocamento.
to dois rolos, compartilhando uma mesma fita magntica (como num cassete)
giram levando ou trazendo a fita conforme a posio que ela deva ficar sob a
159
Linguagem de Programao I
<manipulador>: file;
F: file;
F: file of <tipo_base>;
onde file of so palavras reversavas que significam arquivo de. O tipo base
define o tipo comum dos dados concatenados no arquivo. No exemplo,
var
F: file of integer;
assign(F, teste.dat);
Posio dois
000110010111101111001000000011100011011101010100
Posio trs
000110010111101111001000000011100011011101010100
Final do Arquivo
000110010111101111001000000011100011011101010100
no Linux ou,
assign('.\data\teste.dat'); //Windows
3. Modos de Acesso
Depois da vinculao, o passo seguinte definir o modo de acesso do arqui-
vo. O modo de um arquivo define basicamente o suporte s operaes de
leitura (verificao dos dados que ele contm) e escrita (adio de novos da-
dos ou modificao de dados j existentes). O modo de um arquivo tambm
define a sua chamada posio corrente que equivale a um ponto de entrada
de uma nova operao de leitura ou escrita no arquivo.
A posio corrente representada por uma medida em registros entre o
incio do arquivo e o ponto de operao. Assim, por exemplo, a posio zero
indica que zero registros precedem a posio corrente (incio do arquivo). Na
Figura-6.2 uma seta ilustra a posio corrente em quatro pontos distintos de
um mesmo arquivo cujos registros possuem um byte cada.
H trs modos de acesso de arquivos em Pascal,
Modo de Escrita
Modo de Leitura
Modo de Anexao
162
RICARDO REIS PEREIRA
rewrite(F);
...
reset(F);
...
append(F);
...
Nem sempre possvel abrir um arquivo. Quando este for o caso en-
to um erro em tempo de execuo ocorrer e o programa ser suspenso.
Utilizando a diretiva {$I-}, antes do cdigo de abertura do arquivo, possvel
desligar a emisso explcita do erro e manter a execuo. O custo desta desa-
bilitao a necessidade de checar manualmente se ocorreu silenciosamen-
te um erro e impedir que ele cause outros erros mais adiante.
Essa checagem manual feita com a funo IOResult que retorna o
status da ltima operao executada pelo sistema de manipulao de arqui-
vos. Se IOResult retornar zero, nenhum erro ter ocorrido. Do contrrio o valor
de retorno, que um inteiro, corresponder ao cdigo de um erro. A Tabela-6.1
lista os possveis cdigos de erros de sada de IOResult e seus respectivos
significados. Para religar a emisso de erros usa-se a diretiva {$I+}.
Tabela 1
Listagem 52
01 function existe(nome: string): boolean;
02 var F : file;
03 begin
04 {$I-}
05 assign (F, nome);
06 reset (F);
07 {$I+}
08 existe := (IoResult = 0) and (nome <>
'');
09
close(F);
10
end;
var
F: file;
begin
assign(F, 'teste.dat');
remove(F);
end.
Listagem 53
01 program arquivo_de_inteiros;
02 var
03 f: file of integer;
04 i: integer;
05 begin
06 assign(f, 'teste.dat');
07 rewrite(f);
08 randomize;
09 for i := 1 to 100 do
10 write(f, random(100));
11 close(f);
12 end.
Listagem 54
01 program lendo_arquivo_de_inteiros; 08 while not eof(f) do begin
02 var 09 read(f, i);
03 f: file of integer; 10 write(i, ' ');
04 i: integer; 11 end;
05 begin 12 close(f);
06 assign(f, 'teste.dat'); 13 end.
07 reset(f);
Posio corrente 2
Figura 11
Listagem 55
01 procedure inserir(fnome: string; pos, x: integer);
02 var F: file of integer;
03 tmp, a: integer;
04 begin
05 assign(F, fnome);
06 reset(F);
07 seek(F, pos);
08 read(F, tmp);
09 seek(F, pos);
10 write(F, x);
11 while not eof(F) do begin
12 read(F, a);
13 seek(F, filepos(F)-1);
14 write(F, tmp);
15 tmp := a;
16 end;
17 write(F, tmp);
18 close(F);
19 end;
tmp tmp
tmp
Figura 12
reset(F);
truncate(F);
close(F);
final do arquivo deve-se efetuar sucessivas trocas entre ele e o registro logo
esquerda. Isso deslocar tal registro em direo ao final do arquivo ao mes-
mo tempo que trar em uma posio para trs todos os demais registros que
inicialmente se encontravam a sua frente. Na Figura 14 o registro indesejado
possui valor 9. Aps seis trocas ele atinge a ltima posio, onde eliminado.
Movimentao de dados
para o fim do arquivo
Truncamento
Figura 13
2 7 9 1 3 6 4 7 1
2 7 1 9 3 6 4 7 1
2 7 1 3 9 6 4 7 1
2 7 1 3 6 9 4 7 1
2 7 1 3 6 4 9 7 1
2 7 1 3 6 4 7 9 1
2 7 1 3 6 4 7 1 9
2 7 1 3 6 4 7 1
Figura 14
Listagem 56
01 procedure remover(fnome: string; pos: integer); 09 read(F, a, b);
02 var F: file of integer; 10 seek(F, filepos(F)-2);
03 a, b: integer; 11 write(F, b, a);
04 begin 12 seek(F, filepos(F)-1);
05 assign(F, fnome); 13 end;
06 reset(F); 14 truncate(F);
07 seek(F, pos); 15 close(F);
08 while filepos(F) < filesize(F)-1 do begin 16 end;
171
Linguagem de Programao I
aluno = record
nome: string[25];
idade: byte;
media_final: real;
end;
var
G: file of aluno;
x.idade := 30;
x.media_final := 9.5;
write(G, x);
172
RICARDO REIS PEREIRA
append(F);
close(F);
174
RICARDO REIS PEREIRA
var F: text;
linha: string;
begin
{$I-}
assign(F, 'aluno.txt');
reset(F);
{$I+}
if ioResult=0 then
readln(F, linha);
writeln(linha);
end;
close(F);
end;
read(F, ch);
write(ch);
end;
Sntese da Parte 3
No Captulo 1 foi estudada a modularizao que incluiu noes so-
bre controle de execuo em um processo monothread, aspectos so-
bre a passagem de argumentos em procedimentos e funes, noes
sobre uso e aplicaes da recursividade, a importncia do aninha-
mento modular e por fim a compilao de mdulos afins numa uni-
dade Pascal. No Captulo 2 foi estudado o sistema padro de ma-
nipulao de arquivos da Linguagem Pascal incluindo a noo de
fluxo de informaes entre memria principal e secundria. Os prin-
cipais comandos desde sistema foram apresentados convenientemen-
te em suas respectivas categorias (dos arquivos binrio e de texto)
e adicionalmente exemplificados para melhor fixar suas funcionalidades.
Atividades de avaliao
1. Construir programa que gere um arquivo binrio contendo 1000 inteiros
aleatrios entre 200 e 5000.
2. Construir programa que crie um arquivo contendo apenas inteiros pares
oriundos de um arquivo gerado pelo programa da questo anterior.
3. Construir programa que crie uma cpia de um arquivo dado, mas com
nome distinto.
4. Construir programa que leia um arquivo gerado pelo programa do proble-
ma-1 e inverta sua sequencia original de inteiros.
5. Uma estrutura heterognea chamado ponto mantm dois campos, x e y,
que representam uma coordenada no plano. Utilizando este tipo de da-
dos, construir programa que crie um arquivo binrio contendo 200 pontos
da funo f(x) = 5x3 - 7x com x no intervalo [5, 50]. Escolha valores de x
equidistantes.
6. Construir programa que leia o arquivo gerado na questo anterior e crie
uma verso texto dele.
7. O procedimento da Listagem-6.5 ilustra como movimentar um re-
gistro para o fim do arquivo e depois elimin-lo por truncamento.
Reconstruir o procedimento de forma que seja possvel movimentar
178
RICARDO REIS PEREIRA
Referncias
CANNEYT , Michal Van, Reference guide for Free Pascal, Document
version 2.4 , March 2010
http://www.freepascal.org/docs-html/
179
Linguagem de Programao I
Sobre o autor
Ricardo Reis Pereira: Possui graduao em Engenharia Mecnica pela
Universidade Federal do Cear (2000) e mestrado em Programa de Mestrado
em Enganha ria Qumica pela Universidade Federal do Cear (2004).
Atualmente professor assistente do curso Sistemas de Informao do
Campus de Quixad da Universidade Federal do Cear. Ministra as discipli-
nas de fundamentos de programao, clculo diferencial e integral, estruturas
de dados e computao grfica e atua nas reas de algoritmos, computao
grfica e mais recentemente em viso computacional.
Computao
Linguagem de Programao I
iel a sua misso de interiorizar o ensino superior no estado Cear, a UECE,
como uma instituio que participa do Sistema Universidade Aberta do
Computao
Brasil, vem ampliando a oferta de cursos de graduao e ps-graduao
na modalidade de educao a distncia, e gerando experincias e possibili-
dades inovadoras com uso das novas plataformas tecnolgicas decorren-
tes da popularizao da internet, funcionamento do cinturo digital e
massificao dos computadores pessoais.
Linguagem de Programao I
Comprometida com a formao de professores em todos os nveis e
a qualificao dos servidores pblicos para bem servir ao Estado,
os cursos da UAB/UECE atendem aos padres de qualidade
estabelecidos pelos normativos legais do Governo Fede-
ral e se articulam com as demandas de desenvolvi-
mento das regies do Cear.
12
Histria
Educao
Fsica
Cincias Artes
Qumica Biolgicas Plsticas Computao Fsica Matemtica Pedagogia