Escolar Documentos
Profissional Documentos
Cultura Documentos
APOSPOO
APOSPOO
CERTIFICADO DE REGISTRO
N REGISTRO: 179.755 LIVRO : 304 FOLHA : 407
Sergio Santos
M
P
A
Nvel
bloco
P, Q
A, R, S
Q
R
S
P e Q internos a M
M externos a P e Q
A interno a P
P externo a A
B interno a A
A externo a B
R e S so internos a Q
Q externo a R e S
Conforme foi mostrado, uma varivel declarada dentro de um bloco s conhecida dentro deste
bloco.
Se uma varivel A declarada em um bloco j foi declarada com mesmo nome num bloco mais
externo, a varivel ativa no bloco aquela declarada localmente. A varivel A deixa de ser global para
aquele bloco.
Exemplo:
Procedimento TROCA;
incio
inteiro: AUX;
AUX
X;
Y;
AUX;
fim; {TROCA}
A declarao de um procedimento deve vir sempre no incio do bloco em que estiver sendo
declarado (antes de qualquer comando executvel). Um procedimento s executado sob a chamada. A
chamada no procedimento feita por um comando que se resume no nome do procedimento. O exemplo
a seguir esclarece a utilizao do procedimento TROCA declarado anteriormente. O que ser impresso
no algoritmo abaixo?
Sergio Santos
Y;
AUX;
fim; {TROCA}
A
5;
X;
Sero impressos:
5
5 e
3;
escreva(A, B);
X
A;
B;
TROCA;
A
X;
Y;
4;
9;
C;
D;
TROCA;
C
Y
X;
D;
Sergio Santos
Sergio Santos
A <especificao dos parmetros> consiste na declarao dos tipos das variveis que compem a
lista de parmetros. No exemplo do procedimento TROCA, X e Y deixariam de ser variveis globais e
passariam a fazer parte da lista de parmetros:
Procedimento TROCA(X, Y);
inteiro: X, Y;
incio
AUX := X;
inteiro: AUX;
X := Y;
AUX
X
Y
X;
Y;
Y := AUX;
end;
AUX;
fim; {TROCA}
Modifique, agora, o exemplo anterior adaptando-o ao novo procedimento.
Sergio Santos
end;
Sergio Santos
Y * 2;
ABS(-3) * 2;
Isto possvel utilizando um tipo especial de procedimento, denominado funo cuja sintaxe a
seguinte:
Funo <nome da funo> (<lista de parmetros formais>): <tipo bsico>;
<especificao dos parmetros>;
incio
<declarao de variveis locais>;
C1;
C2;
C3;
.
.
.
<nome da funo>
<expresso>;
Cn;
fim;{<nome da funo>}
O procedimento ABS(X, Y) visto anteriormente poderia ser transformado na funo ABS(X), da
seguinte maneira:
Sergio Santos
ento ABS
X;
-X;
end;
fim se;
fim; {ABS}
Funes Recursivas
Existem casos em que um procedimento ou funo chama a si prprio. Diz-se ento que o
procedimento ou funo recursivo. Por exemplo, o fatorial de um nmero n pode ser definido
recursivamente, ou seja:
n (n 1)!, se n >= 1
n! =
1, se n = 0
Sergio Santos
10
Exerccios:
1) Escrever um procedimento para imprimir o cabealho:
UNESA SISTEMA DE PROGRAMAO
XX/XX/XX
PG. 9999
2) Escrever uma funo que receba dois nmeros inteiros, positivos, e determine o produto dos
mesmos, utilizando o seguinte mtodo de multiplicao:
somar os nmeros da segunda coluna que tenham como correspondente na primeira coluna
um nmero mpar. O total o produto procurado.
Exemplo:
9x6
9
12
24
48
+ 48
--------54
A seguir escrever um algoritmo que leia 10 pares de nmeros e calcule os respectivos produtos,
usando a funo acima.
3) Escrever uma funo que, ao analisar se um nmero recebido via parmetro est no intervalo 5
< NMERO < 20, retorne o valor verdadeiro e falso em caso contrrio.
Sergio Santos
11
M6 = 100 x (1 + 22/100)6
7) Faa um programa que contenha um procedimento (procedure) para verificar se um ano
bissexto ou no. Utilize a seguinte regra:
Um ano bissexto se divisvel por 4, mas no por 100, ou ento se divisvel por 400.
Sergio Santos
12
8) Em relao tabela abaixo, deseja-se calcular a somatria dos valores de x. Faa um programa
para armazenar essa tabela numa matriz e determinar a soma desejada, servindo-se de uma
funo para o clculo da soma. O programa deve tambm imprimir a tabela e a soma.
10
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.1
15,6
10
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.1
10
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.1
Sergio Santos
13
0.01
0.04
0.09
0.16
0.25
0.36
0.49
0.64
0.81
1.21
ltimo dia
Jan
20
CAPRICRNIO
Fev
19
AQURIO
Mar
20
PEIXES
Abr
20
RIES
Mai
20
TOURO
Jun
20
GMEOS
Jul
21
CNCER
Ago
22
LEO
Set
22
VIRGEM
Out
22
LIBRA
Nov
21
ESCORPIO
Dez
21
SAGITRIO
De 22/dez a 31/dez
Signo
CAPRICRNIO
11) O dia da Pscoa o primeiro domingo depois da lua cheia que ocorre a partir do vigsimoprimeiro dia do ms de maro. Se a lua cheia ocorre num domingo, ento a Pscoa no
domingo seguinte. Ao clculo do dia da Pscoa deu-se o nome de Computus. Em 1800, Carl
Friedrich Gauss, um dos maiores matemticos de todos os tempos, resumiu o clculo do dia da
Pscoa num frmula bastante simples. O processo de Gauss para determinar em que dia se
comemora a Pscoa no ano X o seguinte:
Sergio Santos
14
1582-1699
1700-1799
1800-1899
1900-2099
2100-2229
22
23
23
24
25
Sergio Santos
15
Programao Orientada
Objeto
Sergio Santos
16
INTRODUO
A programao orientada para objeto uma nova disciplina do Desenvolvimento de Software.
Ela apresenta uma estratgia diferenciada de organizar, planejar, conceitualizar, escrever, atualizar e fazer
manuteno do software.
As linguagens de alto nvel representam uma conexo inteligente entre o programador e o
computador. Sua evoluo paralela s tcnicas e mtodos do Desenvolvimento do Software, sendo
inspirada pelo anseio de criar componentes de softwares robustos e reutilizveis que reduzem os ciclos e
o tempo da produo do software. Esta diminuio no tempo de produo ainda mais relevante quando
uma equipe de programadores est trabalhando em um projeto de software.
A histria das linguagens de programao reflete a evoluo de linguagens no-estruturadas para
linguagens estruturadas e destas para as orientadas ao objeto. A linguagem Pascal desempenha um papel
de destaque na promoo da programao estruturada, tanto na rea profissional quanto na rea
acadmica pena que a borland tenha cancelado a distribuio deste programa e das disciplinas de
programao que a acompanham. O Pascal e outras linguagens estruturadas chamaram a ateno do
programador e professores universitrios por serem linguagens organizadas e didticas, que alm de
economizar tempo, permitem uma melhor programao, com cdigo robusto e reutilizvel, de fcil
legibilidade, manutenibilidade, atualizao e acesso a bibliotecas de software.
As linguagens estruturadas so linguagens procedurais, onde um programa particionado em um
conjunto de procedimentos e funes. A seqncia de rotinas descreve como os dados so manipulados.
Especificamente, o programador controla a interao entre o cdigo e os dados. O foco principal das
linguagens procedurais a rotina, enquanto o foco secundrio so os dados que esto sendo manipulados.
Neste captulo, abordaremos uma introduo programao orientada para objeto. Procuro ser o
mais simples e didtico possvel, espero que o contedo aqui apresentado seja de grande valia para o
estudante ou pesquisador.
Sergio Santos
17
Objeto
Um objeto um membro de uma classe, similar tradicional varivel em Pascal.
Mensagem
Uma mensagem uma solicitao enviada a um objeto para chamar um de seus mtodos.
Mtodo
Um mtodo o procedimento ou funo chamado para atuar num objeto. Um mtodo define
como uma mensagem deve ser executada.
A POO (Programao Orientada a Objeto) permite uma abordagem mais simples para a
utilizao de dados usando objetos que respondem a mensagens. Esta abordagem demonstram uma noo
de que objetos em um programa so similares a alunos em uma sala de aula voc passa um exerccio ou
um trabalho para um aluno ou um grupo de alunos (o objeto, neste caso) solicitando que lhe seja
apresentado uma soluo para um determinado problema. Supondo-se que o trabalho seja passado ao
aluno ou grupo certo, ele responder usando sua experincia e recursos. O mtodo pelo qual o trabalho
executado depende do objeto receptor (aluno). Os detalhes da resposta so transparentes ao professor
(emissor da mensagem).
Herana
Uma outra caracterstica da POO a herana, um recurso que produz um grande efeito, que lhe
permite criar subclasses. Cada subclasse recebe as caractersticas de sua classe-me (da mesma forma que
um criana traz consigo caractersticas peculiares de seus
atributos s classes herdadas e pode tambm substituir qualquer atributo herdado. O Turbo Pascal, que
implementa o Object Pascal, permite apenas herana simples (tambm conhecida como linear). Este um
esquema de herana simples onde cada subclasse tem apenas uma classe-me.
A figura demonstra um exemplo de classe com suas subclasses. A subclasse O filha da
subclasse N, que filha da classe M. As subclasses P e Q so filhas da classe M. As classes N, P e Q
herdam os vrios atributos da classe M. Os atributos de M no precisam ser redefinidos quando se declara
as subclasses N, P e Q apenas os novos atributos e os atributos anulados precisam ser declarados. Do
Sergio Santos
18
Classe M
(Mantenedora)
Classe N
Universidade
Classe Q
Colgio de Aplicao
Classe O
Politcnico
Classe P
Administrao
Sergio Santos
19
CLASSE O
EXISTE O
EXECUTA O
MTODO ?
MTODO
N
CLASSE N
EXISTE O
EXECUTA O
MTODO ?
MTODO
N
CLASSE M
EXECUTA O
MTODO
EXISTE O
MTODO ?
N
ERRO
A procura de um mtodo que combine com a chamada nas classes hierarquicamente superior
demonstra a hereditariedade.
Sergio Santos
20
INTERFACE
Este bloco conter os cabealhos dos procedimentos que faro parte da biblioteca (unidade) e
que sero definidos na INTERFACE.
IMPLEMENTATION
o local onde sero codificados os procedimentos ou funes que foram declarados no bloco
IMPLEMENTATION.
Como Utilizar
Aps ter sido criada, a sua utilizao bem simples, basta mencionar o nome da unidade no
bloco USES e chamar um dos procedimentos ou funes no corpo principal do programa onde a unidade
fora inserida.
Para melhorar o entendimento do leitor, demonstro um cdigo muito importante para os
programadores em Pascal. Este cdigo permite que o programador defina uma ou vrias molduras de
tamanhos diferentes em seus programas.
Sergio Santos
21
unit moldura;
interface
uses crt;
procedure mold(C1,L1,L2,C2:integer);
implementation
procedure mold(C1,L1,L2,C2:integer);
var X : byte;
begin
gotoxy(C1,L1);write(chr(201));
for X := (C1+1) to C2 do
begin
gotoxy(X, L1);write(chr(205));
gotoxy(X,L2);write(chr(205));
end;
gotoxy(C1,L2);write(chr(200));
for X := (L1+1) to (L2-1) do
begin
gotoxy(C1, X);write(chr(186));
gotoxy(C2,X);write(chr(186));
end;
gotoxy(C2,L1);write(chr(187));
gotoxy(C2,L2);write(chr(188));
end;
end.
A chamada do Unit Crt se d devido ao uso do comando gotoxy, que um procedimento
exclusivo desta unidade.
Para demonstrar a utilidade desta unidade apresentarei um programa mais adiante onde utilizei a
unidade Moldura.
As Classes
Definir uma classe hierrquica significa estabelecer a classe principal e as subclasses que
definem aperfeioamentos praticados na classe principal. A escolha da classe principal e das subclasses
no uma tarefa das mais simples. A regra prtica a seguir a relao Um (Uma). Por exemplo, entre
as seguintes classes: cadeira, cadeira de balano, cadeira universitria, cadeira de diretor e cadeira de
secretria, fcil identificar a classe base cadeira. Uma cadeira de balano uma cadeira. Da mesma
Sergio Santos
22
Sergio Santos
23
MembroNoConj (Achar:char):boolean;
End;
Procedure CLCarConj.limpa;
Begin
CDConj := [];
CDMembro := 0;
end;
Procedure CLCarConj.EscreveConj;
const Aspas = ;
var I : byte;
begin
write([);
for I := 0 to 255 do
if chr(I) in CDConj then
write(Aspas, chr(I), aspas,,);
write(#8); {retrocesso}
writeln(]);
end;
Procedure CLCarConj.InsereMembro (achar:char);
begin
if not(achar in CDConj) then begin
CDConj := CDConj +[Achar];
inc(CDMembro)
end;
end;
procedure CLCarConj.EliminaMembro (Achar: char);
begin
if Achar in CDConj then begin
CDConj := CDConj [Achar];
Dec(CDMembro)
end;
end;
function CLCarConj.MembroNoConj(Achar: char): Boolean;
begin
MembroNoConj := Achar in CDConj;
end;
procedure PressioneUmaTecla;
Sergio Santos
24
caractere
est
no
conjunto?
conjunto?,Conjunto.MembroNoConj(P));
writeln(O
caractere
z
Conjunto.MembroNoConj(z));
est
no
PressioneUmaTecla;
end.
Sergio Santos
25
MembroNoConj (Achar:char):boolean;
End;
Existem dois campos de dados, a saber, CDConj e CDMembro. O campo CDConj toma nota dos
caracteres que so membros do objeto de conjunto. O campo CDMembro armazena o tamanho do
conjunto (nmero de membros). A classe CLCarConj define cinco mtodos para alterar o estado dos
objetos que so instncias da classe CLCarConj. O mtodo Limpa usado para inicializar e reinicializar
o objeto. O mtodo EscreveConj exibe os membros do conjunto. O mtodo InsereMembro insere um
membro no-existente e atualiza o tamanho do conjunto. O mtodo EliminaMembro remove um
membro existente e diminui o tamanho do conjunto e retorna TRUE se o caracter Achar for membro, ou
FALSE se este no for o caso.
Ao analisar o cdigo relativo aos mtodos, observe o seguinte:
A. Que o nome do mtodo precedido pelo nome da classe e pelo ponto que o operador de
acesso. Esta uma exigncia para informar ao compilador sobre a propriedade dos mtodos.
B. O programa cria o objeto CONJUNTO na seo de declarao VAR, exatamente como
qualquer outra varivel.
C. As
mensagens
so
enviadas
ao
objeto
CONJUNTO
usando
formato
Sergio Santos
26
Sergio Santos
@, #, %,
27
MembroNoConj (Achar:char):boolean;
End;
mtodos
herdados
satisfazem
as
suas
necessidades,
exceto
mtodo
CLCarConj.InsereMembro e uma nova verso precisa ser definida, isto cancelar a antiga.
Com base nesta anlise, a definio da classe SubLeMai a seguinte:
SubLeMai = object (CLCarConj)
Procedure InsereMembro (Achar : Char); {cancelar}
End;
Observe que Object(CLCarConj) usada para informar ao compilador que a classe SubLeMai
uma subclasse de CLCarConj e no uma nova classe base. As instncias de SubLeMai tm acesso direto a
todos os campos de dados e mtodos da classe base. A sobrescrio do mtodo InsereMembro a nova
verso do mtodo herdado.
A segunda subclasse de CLCarConj o conjunto de dgitos 0 a 9; chame-a Digitos. Do mesmo
modo que em SubLetMai, os campos herdados, bem como, os seus mtodos, satisfazem subclasse
SubDigito, menos CLCarConj.InsereMembro que deve ser redefinida. A declarao da subclasse
SubDigito a seguinte:
SubDigito = object (CLCarConj)
Sergio Santos
28
End;
O poder da herana fica evidente nesta declarao, que inclui um nico mtodo novo todo o
mais herdado da classe-me CLCarConj!
A subclasse SubLeMai ser usada como base para a criao da subclasse SubAlfa, que
armazenar as letras maisculas e minsculas. Apesar dos campos de dados herdados da classe-me
CLCarConj serem adequados, iremos inserir mais dois campos de dados CDLetMai, CDLetMin, que
serviro para armazenar as quantidades de letras maisculas e minsculas, respectivamente.
Como nas outras subclasses, devemos sobrescrever o mtodo InsereMembro. Como inserimos
dois campos de dados, precisamos de um novo cdigo para o mtodo Limpa.
A declarao da nova subclasse a que vemos a seguir:
CAlfabeto = object(SubLeMai)
FSubLeMa, fLetMin : byte;
Procedure Limpa;
Procedure InsereMembro (Achar : char); {cancelar}
End;
Sergio Santos
29
SubDigito = object(CLCarConj)
Procedure InsereMembro(Achar:Char); {Sobrescrever}
end;
SubAlfa = object(SubLeMa)
CDSubLeMa, CDLetMin : byte;
Procedure Limpa; {Sobrescreve}
Procedure InsereMembro(Achar:char); {sobrescreve}
end;
SubCarEsp = object(CLCarConj)
Procedure InsereMembro (achar:char); {sobrescreve}
end;
Const
ALFA : CarConj = ['A'..'Z','a'..'z'];
MAIUS: CarConj = ['A'..'Z'];
CDIGITOS : CarConj = ['0'..'9'];
procedure CLCarConj.Limpa;
begin
CDConj := [];
CDMembro := 0;
end;
Procedure SubAlfa.Limpa;
begin
SubLeMa.limpa;
CDSubLeMa := 0;
CDLetMIn := 0;
end;
Sergio Santos
30
Procedure CLCarConj.InsereMembro(Achar:Char);
begin
if not (Achar in CDConj) then begin
CDConj := CDConj + [Achar];
inc(CDMembro);
end;
end;
Procedure SubAlfa.InsereMembro(Achar:Char);
begin
if not(Achar in CDConj) and (Achar in Alfa) then begin
CDConj := CDConj + [Achar];
inc(CDMembro);
if Achar in Maius then
inc(CDSubLeMa)
else
inc(CDLetMin);
end;
end;
Procedure SubLeMa.InsereMembro(Achar:char);
begin
if not(Achar in CDConj) and (Achar in Alfa) and (Achar in
Maius) then begin
CDConj := CDConj + [AChar];
inc(CDMembro);
end;
end;
Sergio Santos
31
Procedure SubDigito.InsereMembro(Achar:char);
begin
if not(Achar in CDConj) and (Achar in CDigitos) then begin
CDConj := CDConj + [AChar];
inc(CDMembro);
end;
end;
Procedure SubCarEsp.InsereMembro(Achar:char);
begin
if not(Achar in CDConj) and not(Achar in Alfa) and not(Achar
in Maius) and not(Achar in CDigitos) then begin
CDConj := CDConj + [AChar];
inc(CDMembro);
end;
end;
Procedure CLCarConj.EliminaMembro(Achar:char);
begin
if Achar in CDConj then begin
CDConj := CDConj - [Achar];
Dec(CDMembro);
end;
end;
Function CLCarConj.MembroNoConj(Achar:char):boolean;
begin
MembroNoConj := Achar in CDConj;
end;
Procedure PressioneUmaTecla;
var Sai : char;
begin
writeln;
write('Pressione uma tecla para dar nova entrada ');
sai := readkey;
writeln;
writeln;
end;
Sergio Santos
32
: CLCarConj;
OBJLetras : SubAlfa;
OBJMai
: SubLeMa;
OBJDigito : SubDigito;
OBJSimbolo
: SubCarEsp;
op, op1
: byte;
let
:char;
begin
OBJConj.Limpa;
ObJMai.Limpa;
ObjLetras.limpa;
OBJDigito.Limpa;
OBJSimbolo.Limpa;
repeat
clrscr;
gotoxy(6,5);writeln('para sair escolha digite 5');
gotoxy(6,10);writeln('ENTRE COM UMA DAS OPCOES ABAIXO');
gotoxy(7,15);write('1 - Inclusao de caracteres');
gotoxy(7,16);write('2 - Eliminacao de caracteres');
gotoxy(7,17);write('3 - Consulta de caracteres');
gotoxy(7,18);write('4 - Mostrar Caracteres');
gotoxy(7,19);read(op);
clrscr;
case op of
1:begin
op := 0;
gotoxy(7,15);write('1 - Inclusao no conjunto Global');
gotoxy(7,16);write('2
Maiusculos');
Inclusao
no
conjunto
dos
Inclusao
no
conjunto
de
gotoxy(7,19);write('5
Digitos');
Inclusao
no
conjunto
de
gotoxy(7,20);readln(op1);
case op1 of
1: begin
clrscr;
write;
Gotoxy(5,4);write('Qual o Caracter? ');
Sergio Santos
33
2: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
gotoxy(5,5);read(let);
OBJMai.InsereMembro(Let);
OBJLetras.InsereMembro(Let);
end;
3: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
gotoxy(5,5);read(let);
OBJLetras.InsereMembro(Let);
OBJMai.InsereMembro(Let);
end;
4: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
gotoxy(5,5);read(let);
OBJSimbolo.InsereMembro(Let);
end;
5: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
gotoxy(5,5);read(let);
OBJDigito.InsereMembro(Let);
end;
end;
end;
2 : begin
gotoxy(7,15);write('1
Global');
gotoxy(7,16);write('2
Maiusculos');
Eliminacao
Eliminacao
no
no
conjunto
conjunto
dos
gotoxy(7,17);write('3 - Eliminacao
letras Maiusculas e Minusculas');
no
conjunto
de
gotoxy(7,18);write('4
Caracteres especiais');
no
conjunto
de
Sergio Santos
Eliminacao
34
Eliminacao
no
conjunto
de
gotoxy(7,20);readln(op1);
case op1 of
1: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
gotoxy(5,5);read(let);
OBJConj.EliminaMembro(Let);
end;
2: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
gotoxy(5,5);read(let);
OBJMai.EliminaMembro(Let);
end;
3: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
gotoxy(5,5);read(let);
OBJLetras.EliminaMembro(Let);
end;
4: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
gotoxy(5,5);read(let);
OBJSimbolo.EliminaMembro(Let);
end;
5: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? );
gotoxy(5,5);read(let);
OBJDigito.EliminaMembro(Let);
end;
end;
end;
3: begin
gotoxy(7,15);write('1 - Consulta no conjunto Global');
gotoxy(7,16);write('2
Maiusculos');
Sergio Santos
Consulta
no
conjunto
dos
35
Consulta
no
conjunto
de
gotoxy(7,19);write('5
Digitos');
Consulta
no
conjunto
de
gotoxy(7,20);readln(op1);
case op1 of
1: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
read(let);
Gotoxy(5,7);write('O caracter ',let,'
conjunto ? ', OBJConj.MembroNoConj(Let));
esta
no
esta
no
esta
no
esta
no
readln;readln;
end;
2: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
read(let);
Gotoxy(5,7);write('O caracter
conjunto ? ', OBJMai.MembroNoConj(Let));
',let,'
readln;readln;
end;
3: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
read(let);
Gotoxy(5,7);write('O caracter ',let,'
conjunto ? ', OBJletras.MembroNoConj(Let));
readln;readln;
end;
4: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
read(let);
Gotoxy(5,7);write('O caracter ',let,'
conjunto ? ', OBJSimbolo.MembroNoConj(Let));
readln;readln;
end;
5: begin
clrscr;
Gotoxy(5,4);write('Qual o Caracter? ');
Sergio Santos
36
esta
no
readln;readln;
end;
end;
end;
4: begin
gotoxy(7,15);write('1 - Mostra o
gotoxy(7,16);write('2
Maiusculos');
conjunto Global');
Mostra
conjunto
dos
Sergio Santos
37
Sergio Santos
38
1.
2.
3.
para cada nome digitado, ser ser mostrado na tela a relao dos nomes j includos
juntamente com o nmero da posio que ele ocupa no vetor;
4.
a remoo de um nome do vetor feito a partir do nmero da posio que ele ocupa no vetor.
5.
Aps a remoo, o vetor dever ser reorganizado, no podendo ficar nenhum elemento em
branco entre duas posies do vetor;
6.
program exemplo;
uses crt,
moldura;
var
PegNom : string;
Op, P
: byte;
type v = array [1..30] of string;
vetnomObj = object
Nome : v;
I
: integer;
procedure inicio;
procedure PegaNome;
procedure ConverteNome(Nom:string);
procedure IncluiNOme (Nom : string);
procedure Mostra;
function InibeRemocao : boolean;
procedure Remocao (posi : byte);
procedure Arranjo (PosiSai : byte);
end;
procedure vetnomObj.Inicio;
var ind : byte;
begin
for ind := 1 to 30 do
nome[ind] := ' ';
i := 1;
end;
Sergio Santos
39
');
40
then
41
Sergio Santos
42
Program Teste_de_Inicializao;
Uses Crt;
{$R-}
CONST TAM_INICIAL = 100;
TYPE
UmElemVetor = array [1..1] of real;
UmElemPtr = ^UmElemVetor;
VetorDin = Object
CDSituao : string;
CDTamMax : Word;
CDVetPtr : UmElemPtr;
Procedure Incio (PTamMax : word);
Function PegaTam : word;
Procedure Enche (X : Real);
Procedure Remove;
End;
Procedure VetorDin.Incio(PTamMax : Word)
Begin
CDMaxTam := PTamMax;
If CDMaxTam < 1 then
CDTamMax := TAM_INICIAL;
GetMem (CDVetPtr, CDTamMax * SizeOf(real));
CDSituao := INICIALIZADA;
End;
Function VetorDin.PegaTam:Word;
Sergio Santos
43
Sergio Santos
44
Sobre o Programa
Diretivas de compilao
Erros durante a execuo Verificao da Faixa {$R} Quando esta opo ativada, gerado
um cdigo que verifica subscritos de cadeia e de array e condies fora da faixa referentes a tipos
escalares de dados. Quando esta opo desativada, esse cdigo no gerado e o seu programa se torna
menor. Esses tipos de erro so difceis de detectar, de forma que voc deve manter essa diretiva no seu
cdigo at que ele esteja depurado.
Function SizeOf(Varivel Var):word
Retorna o nmero de bytes exigido por uma varivel ou um tipo de dados.
Procedure GetMem (Var P : pointer; I: Integer);
Reserva a quantidade de bytes especificada em I na pilha e armazena o endereo inicial na
varivel P.
Procedure FreeMem(Var P: pointer; I : integer);
Libera a quantidade de bytes especificada em I, corresponde rea de memria de pilha,
associada varivel P, que deve ter sido previamente alocada por GetMem.
Sergio Santos
45
Construa um programa em Pascal que calcule o valor futuro de um investimento com base no
valor presente, a taxa de juros e o nmero de perodos do investimento. O programa deve
conter uma classe que empregue um mtodo separado de inicializao. A frmula para o
clculo do valor futuro a seguinte:
M = C X (1 + I / 100)N
em que
C = Valor Presente
I = Taxa de Juros
n = nmeros de perodos
M = Valor Futuro
Sergio Santos
46
Sergio Santos
47
48
2.
3.
Um destrutor deve ser chamado para que haja limpeza adequada dos campos dados.
2.
3.
4.
Exerccios
1.
2.
3.
4.
O que um construtor?
5.
O que um destrutor?
Sergio Santos
49
NOME
NOME2 (NOME)
NOM1
NOM1 chama NOM2
NOM2
1.
NOM2
2.
3.
4.
Na ausncia da vinculao tardia, o sistema em execuo teria inserido incorretamente (do ponto
de vista da lgica do programa) o cdigo do mtodo NOME.NOM2 para resolver a chamada feita pelo
mtodo NOME.NOM1.
O programa-exemplo ilustra como funciona a vinculao tardia. A classe CLNOME declara um
construtor Incio e dois mtodos, BoasVindas e PegNome. A classe SUBNOME, uma classe-filha de
CLNOME, emprega um mtodo PegNome virtual para pedir que voc fornea o nome utilizando uma
Sergio Santos
50
Program Teste_de_Vinculao_Tardia;
Uses Crt;
Type
CLNOME = OBJECT
CDNome : STRING;
CONSTRUCTOR Incio;
PROCEDURE BoasVindas;
PROCEDURE PegNome; VIRTUAL;
End;
SubNome = OBJECT(CLNOME)
PROCEDURE PegNome; VIRTUAL;
End;
CONSTRUCTOR CLNOME.Incio;
Begin
cdNome := ;{Inicializar o campo Nome em uma string nula}
End;
PROCEDURE CLNOME.PegNome;
Begin
WRITE(Seu nome, por favor? );
READLN(cdNome); WRITELN;
End;
PROCEDURE CLNOME.BoasVindas;
Begin
PegNome;
WRITELN(Ol , cdNome, , como vai?);
WRITELN;
End;
PROCEDURE SubNome.PegNome;
Begin
Sergio Santos
51
Sergio Santos
52
Sergio Santos
53
Program Objetos_Dinmicos;
Uses Crt;
{-$R}
const Tamanho = 5;
type
Ponteiro = record
x, y : byte;
end;
UmElemPont = array[1..1] of Ponteiro;
VetorPtr = ^UmElemPont;
Cursor = Object
Posicao : VetorPtr;
CDTam, CDIndice : word;
Sergio Santos
54
55
Sergio Santos
56
Nome
Endereo
Telefone
Para gerar o arquivo contendo vrios registros do tipo ilustrado no esquema anterior (RECORD
Registro) pode-se aventar o seguinte tipo de cabealho no programa:
Program ArquivoObjeto;
Uses Crt;
Type
Registro = RECORD
Nome : string[30];
Endereco : string[40];
Telefone: string[15];
end;
Arquivo = file of Registro;
Aps termos criado nosso registro, este passar a ser o objeto de nosso estudo, podemos, agora
definir uma classe que encapsule este objeto, juntamente com seus mtodos.
ClassReg = Object
DadosPessoais : array [1..100] of Registro;
procedure CriaArquivo;
Sergio Santos
57
: ClassReg;
RegA, RegB
: Arquivo;
Sai
: char;
UltReg
: integer;
ou
with DadosPessoais[1] do
begin
Nome
Endereco
Telefone
end;
Sergio Santos
58
ASSIGN
utilizado para associar o nome dado ao arquivo no programa Turbo com o designado para
represent-lo no disco ou disquete. Ambos so escolhidos pelo desenvolvedor.
O nome do arquivo :
RegA
no programa Turbo
Teste.dat
Aps o ASSIGN, qualquer aluso ao arquivo externo feita atravs de seu nome no programa
Turbo, como o caso de RegA para designar a entrada de Teste.dat.
RESET
Deixa o arquivo externo pronto para ser lido, a partir de seu registro inicial.
Exemplo:
Reset (RegA);
REWRITE
O procedimento REWRITE prepara um arquivo externo para ser gravado. Aps a sua execuo,
o primeiro registro do arquivo, que sempre o de nmero zero, fica disponvel para ser escrito. Se j
houver algum cadastro com o mesmo nome do que aparece no Rewrite, o antigo destrudo.
EOF
End Of File uma funo incumbida de situar o ltimo registro de um arquivo. Ela tem meios de
verificar se o usurio mandou ler alguma coisa situada aps o fim do cadastro.
Exemplo:
Sergio Santos
59
Exemplo: Close(RegA);
READ
L arquivos em disco ou disquetes, cuja forma geral :
WRITE
Quando se tratar de gravao de informaes em disco ou disquetes sua sintaxe a seguinte:
Exemplo:
FILESIZE
Funo que gera um nmero inteiro, que simboliza a quantidade de registros gravados em um
arquivo.
Exemplo:
Filesize(RegA);
SEEK
Procedimento que permite localizar determinado registro num arquivo em disco ou disquete.
K := Filesize(RegA) 1;
Sergio Santos
60
situa o ltimo registro do cadastro RegA, pois o primeiro deles o de nmero zero.
program ArquivoObjeto;
uses crt;
type
Registro = record
Nome : string[30];
Endereco : string[40];
Telefone : string[15];
end;
arquivo = file of Registro;
ClassReg = object
DadosPessoais : array [1..100] of Registro;
procedure CriaArquivo;
procedure MostraArquivo;
procedure IncluiRegistro;
end;
var
A : ClassReg;
RegA,RegB : arquivo;
sai : char;
ultReg : integer;
procedure ClassReg.CriaArquivo;
var
i : integer;
begin
assign(RegA,'Teste.dat');
rewrite(RegA);
with DadosPessoais[1] do
begin
nome := Rosane Santos ;
Endereco := 'Barra';
Telefone :='99992111';
end;
write(RegA,DadosPessoais[1]);
with DadosPessoais[2] do
begin
nome := 'Sergio Santos';
Endereco := 'Estacio de Sa - Barra';
Telefone :='96789061';
end;
Sergio Santos
61
',Telefone);
{****************************************}
procedure ClassReg.IncluiRegistro;
var IncNome : String[30];
IncEnd : String[40];
IncTel : String[15];
i,j
: integer;
begin
assign(RegA,'Teste.dat');
assign(RegB,'TesteB.dat');
reset(RegA);
rewrite(RegB);
j:=1;
i :=ultreg;
read(RegA,DadosPessoais[j]);
while not eof(RegA) do
begin
write(RegB,DadosPessoais[j]);
inc(j);
read(RegA,DadosPessoais[j]);
end;
write(RegB,dadosPessoais[j]);
Close(RegA);
Sergio Santos
62
Sergio Santos
63
REFERNCIAS BIBLIOGRFICAS
FORBELLONE, Andr Luiz Villar, EBERSPCHER, Henri Frederico. Lgica de Programao: A
Construo de Algoritmos e Estruturas de Dados. So Paulo: Makron Books. 1993.
TERADA, Routo, SETZER, Valdemar W. Introduo Computao e Construo de Algoritmos. So
Paulo: Makron Books, 1992.
WIRTH, Niklaus. Algoritmos e Estrutura de Dados. Rio de Janeiro: PHB, 1989.
GUIMARES, ngelo de Moura, LAGES, Newton Alberto de Castilho. Algoritmos e Estruturas de
Dados. Rio de Janeiro: LTC, 1994.
OBRIEN, Stephen. Turbo Pascal 6 Completo e Total. So Paulo: Makron Books, 1993.
BARBOSA, Lisbete Madsen. Pascal II. So Paulo: McGraw Hill, 1990
TREMBLAY, Jean-Paul, BUNT, Richard B. Cincia dos Computadores: uma abordagem algortmica.
Trad. Moacir de Souza Prado; ver. tc. Joo Pedro Perotti. So Paulo: McGraw-Hill, 1983.
JAMSA, Kris. Turbo Pascal 4: Guia de referncia bsica. trad. Lars Erik Gustav Unonius. ver. tec. Flvio
Silva Gianini. So Paulo: McGraw-Hill, 1988.
TERADA, Routo. Desenvolvimento de algoritmos e estruturas de dados. So Paulo: McGraw-Hill,
Makron, 1991.
Sergio Santos
64