Você está na página 1de 92

Universidade Catlica de Pelotas

Escola de Informtica

Linguagem Pascal
por
Dr. Paulo Roberto Gomes Luzzardi
luzzardi@atlas.ucpel.tche.br
http://gcg.ucpel.tche.br/luzzardi

Reviso: Agosto, 2003

Bibliografia
CARROLL, David W. - Programao em TURBO PASCAL McGraw-Hill
RAMALHO, Luciano & PRATES, Rubens - Turbo Pascal, Carto de Referncia, Livros Tcnicos
e Cientficos Editora S.A.
1

Contedo Programtico
1. Introduo Linguagem Pascal
1.1 Histrico
1.2 Objetivos
1.3 Caractersticas de um Sistema em uma Linguagem Ideal
2. Ambiente Turbo Pascal
2.1 File
2.2 Edit
2.3 Run
2.4 Compile
2.5 Options
2.6 Debug
2.7 Break/watch
2.8 Como usar o DEBUG
3. Estrutura de um Programa Pascal
3.1 Identificadores
3.2 Comentrios
3.3 Estrutura Geral
3.4 Definio de Tipos (Type)
4. Tipos de dados
4.1 Integer
4.2 Real
4.3 Byte
4.4 Char
4.5 Boolean
4.6 String
4.7 Array
4.8 Word
4.9 ShortInt
4.10 LongInt
5. Operadores
5.1 Operadores Aritmticos
5.1.1 Com Reais
5.1.2 Com Inteiros
5.1.3 Hierarquia dos Operadores
2

5.2 Operadores Relacionais


5.3 Operadores Lgicos
5.3.1 Not
5.3.2 And
5.3.3 Or
5.4 Operador de Incluso (In)
5.5 Procedimentos Especiais
5.5.1 Inc
5.5.2 Dec
6. Funes Padres
6.1 Abs
6.2 ArcTan
6.3 Cos
6.4 Sin
6.5 Exp
6.6 Frac
6.7 Int
6.8 Sqr
6.9 Sqrt
6.10 Ln
6.11 Chr
6.12 Ord
6.13 Round
6.14 Trunc
6.15 Pi
6.16 Random
7. Comandos
7.1 Tipos de Comandos
7.1.1 Seqncia
7.1.2 Seleo
7.1.3 Repetio
7.1.4 Atribuio
7.2 Comando SIMPLES e COMPOSTO
7.3 Comando If ... Then ... Else
7.4 Comando Case ... Of ... Else ... End
7.5 Comando For ... Do
7.6 Comando While ... Do
3

7.7 Comando Repeat ... Until


7.8 Comando Halt
7.9 Comando Exit
8. Entrada e Sada
8.1 Entrada pelo Teclado
8.2 Sada no Vdeo
8.3 Sada na Impressora
9. Controle do Vdeo
9.1 ClrScr
9.2 GotoXY
9.3 ClrEol
9.4 DelLine
10. Comandos Especiais
10.1 Delay
10.2 TextBackGround
10.3 TextColor
10.4 Window
10.5 Sound e NoSound
10.6 WhereX e WhereY
10.7 TextMode
11. Vetores e Matrizes
11.1 Vetores
11.2 Matrizes
11.3 Sort (Ordenao)
12. Manipulao de "Strings"
12.1 Chr
12.2 Ord
12.3 Concat
12.4 Copy
12.5 Delete
12.6 Insert
12.7 Lenght
12.8 Pos
12.9 Str
12.10 UpcCse
12.11 Val
4

12.12 FillChar
13. Procedures e Functions
13.1 Variveis Locais e Globais
13.2 Parmetros
13.3 Passagem de Parmetro por Valor
13.4 Passagem de Parmetro por Referncia
13.5 Function
13.6 Procedure
14. Arquivos
14.1 Procedimentos
14.1.1 Assign
14.1.2 Close
14.1.3 Erase
14.1.4 Read
14.1.5 Write
14.1.6 ReName
14.1.7 Reset
14.1.8 ReWrite
14.1.9 Seek
14.2 Funes
14.2.1 Eof
14.2.2 FilePos
14.2.3 FileSize
14.2.4 SizeOf
14.3 Como Definir um Registro (Record)
15. Grficos
15.1 Placas Grficas
15.1.1 CGA
15.1.2 EGA
15.1.3 VGA
15.2 Coordenadas de Tela
15.2.1 CGA
15.2.2 EGA
5

15.2.3 VGA
15.3 Deteco e Inicializao da Tela Grfica
15.4 PutPixel (Pontos)
15.5 Line (Linhas)
15.6 Rectangle (Retngulos)
15.7 Circle (Crculos)
15.8 Arc (Arcos)
15.9 DrawPoly (Polgonos)
15.10 SetColor e SetBkColor (Cor de Frente e Cor de Fundo)
15.11 OutTextXY e SetTextStyle (Textos)
15.12 Preenchimento (Pintura)
15.12.1 Retngulos (Bar)
15.12.2 Polgonos (FillPoly e FloodFill)
15.13 Ativao de Janelas
15.13.1 Janela Ativa
15.13.2 Limpar Janela Ativa
15.13.3 Salvar e Recuperar Janelas Grficas
16. Criao de Unidades ("Units")
16.1 Como Criar um Unidade
16.2 Exemplo de Criao de uma Unidade
16.3 Exemplo de Programa que usa uma Unidade
17. Memria de Vdeo
18. Passagem de Parmetros pela Linha de Comandos do Sistema Operacional
19. Ponteiros
19.1 Tipos de Alocao de Memria
19.1.1 Alocao Esttica
19.1.2 Alocao Dinmica
19.2 Acesso Direto a Memria
19.3 Acesso Direto a Memria de Vdeo
19.4 Listas Encadeadas
19.5 Filas e Pilhas
19.6 Listas Duplamente Encadeadas
20. Interrupes
6

1. Introduo Linguagem Pascal


1.1 Histrico
Desenvolvido em 1970 pelo Prof. Nicklaus Wirth no Technical University - Zurique Suia.Nome em homenagem Blaise Pascal (Sc. XVII).

1.2 Objetivos
a) Ensino da Programao, pois uma linguagem didtica;
b) Programao Estruturada.

1.3 Caractersticas do Sistema em uma Linguagem Ideal


a) Produzir programas-objeto compactos e eficientes;
b) Usar uma linguagem de alto nvel, de fcil entendimento;
c) Permitir ao programador fazer alteraes e visualizar os resultados rapidamente
d) Produzir programas portteis para serem rodados em qualquer outro computador.

2. Ambiente Turbo Pascal 5.5


F ile

E dit

Line 1

R un C ompile P roject O ptions D ebug B reak/watch


Edit
Col 1
Insert Ident Tab Fill Unident A:NONAM E.PAS

janela de edio

M essage / Watch
janela de mensagens do ambiente
janela de assistncia (debug)
F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-M ake F10-M enu
Alt: F1-Last help F3-Pick F6-Swap F7/F8-Prev/next error

2.1 File (Arquivo) [ALT][F]


Permite carregar arquivo, salvar arquivo, listar diretrio, criar novos fontes, renomear
arquivos, sada temporria ao Sistema Operacional e sada definitiva ao sistema operacional.

Load (Carregar) [F3]


exibida uma caixa de dilogo solicitando o nome do arquivo a ser carregado, se for
pressionado a tecla <ENTER> exibida outra caixa de dialgo contendo os nomes de todos os
arquivos "*.pas" contidos no disco. O programador seleciona um arquivo (seta direita, esquerda,
acima ou abaixo) e pressiona <ENTER> logo aps, o arquivo carregado do Disco para o Editor.

Pick (Pegar)[ALT][F3]
exibida uma lista com os nomes dos ltimos arquivos que foram carregados. O
programador pode selecionar um deles (seta acima ou abaixo) e ento carreg-lo do Disco para o
Editor. Os nomes dos arquivos ficam armazenados em um arquivo chamado "TURBO.PCK".

New (Novo)
Permite ao programador editar um "novo" arquivo. Este arquivo possui o nome de
"NONAME.PAS", este nome deve ser renomeado quando o arquivo for salvo no disco (F2).

Save (Salvar) [F2]


Salva o contedo do Editor no Disco. Se o arquivo no tiver nome ("NONAME.PAS"), pode
ento, ser renomeado. Todo arquivo deve ter um nome que no seja "NONAME.PAS".

Write to (Escrever Como)


Escreve (grava) o contedo do editor num outro arquivo indicado pelo usurio (conserva o
antigo no disco e o novo no editor).

Directory (Diretrio)
Exibe o diretrio do disco corrente, de acordo com uma mscara especificada, permite ainda,
que um arquivo seja carregado.

Change dir (Mudar Diretrio)


Permite mudar o subdiretrio (drive:\path) corrente.
8

Os Shell (Sada Temporria ao Sistema Operacional)


Sada temporria do Turbo Pascal para o Sistema Operacional. Para retornar ao Ambiente
digita-se Exit.

Quit (Sair) [ALT][X]


Sada definitiva do Ambiente Turbo Pascal. Volta o controle ao Sistema Operacional.

2.2 Edit (Editar) [ALT][E]


Permite a criao ou edio de programas. Para sair do editor pressiona-se a tecla F10 ou
ALT mais a letra maiscula da opo do menu principal.

2.3 Run (Correr, Executar) [ALT][R]


Run (Executa) [CTRL][F9]
Compila o programa, linka as unidades e executa o programa.

Program reset (Reseta Programa) [CTRL][F2]


Termina a execuo de um programa que foi executado com o "Debug". Desmarca a linha
atual do "Debug".

Go to cursor (V para Cursor) [F4]


Fora o "Debug" executar todas as linhas at a posio do cursor, ou seja, pula as instrues
intermedirias.

Trace into (Traa Dentro) [F7]


Fora o "Debug" a executar linha a linha entrando obrigatoriamente dentro das "procedure"
e "function".

Step over (Passa Ssobre) [F8]


Fora o "Debug" a executar linha a linha sem entrar nas "procedure" e "function".

User screen (Tela do Usurio) [ALT][F5]


9

Exibe a tela de execuo do programa.

2.4 Compile (Compilar) [ALT][C]


Compile (Compilar) [ALT][F9]
Compila o programa fonte e linka as unidades.

Make (Fazer) [F9]


Compila o arquivo primrio ("Primary File: ") ou o arquivo presente no editor; e todos os
arquivos que dependem deste, inclusive as unidades ("unit") que foram alteradas.

Build (Construir)
Recompila todos os arquivos relacionados ao arquivo primrio ("Primary File").

Destination (Destinao) [Memory ou Disk]


Especifica o destino do programa executvel. Se "Memory" o executvel temporrio, se
"Disk" o arquivo executvel armazenado em disco (como .EXE).

Find error (Achar Erro)


Localiza um erro de execuo "RunTime Error" (Erro em Tempo de Execuo).

Primary file (Arquivo Principal)


Usado para definir o arquivo principal, usado pelo "Make" e "Build".

Get info (Mostra Informaes)


Exibe uma janela contendo informaes do arquivo fonte.

10

2.5 Options (Opes) [ALT][O]


Compiler (Compilador)
Permite a insero de diretivas de compilao sem escrev-las no programa-fonte.
Range checking (ON ou OFF): Se ligada, verifica se os "array" e "string" esto dentro das
faixas definidas pelo programador.
Stack checking (ON ou OFF): Se ligada, o compilador verifica se h espao na pilha para as
variveis locais, antes das chamadas das "procedure" e "function".
I/O checking (ON ou OFF): Se ligada, verifica se h erros de entrada e sada. Em OFF
pode-se testar erros de entrada e sada atravs da funo IoResult.
Force for calls (ON ou OFF): Se ligada, o compilador gera chamadas Near para
"procedure" e "function" que estiverem sendo compiladas.
Overlays allowed (ON ou OFF): Permite a gerao de cdigo "OverLay" para uma unidade
(".OVL").
Align data (Word ou Byte): Em "Word" todos os dados maiores que "Byte" so tratados
como tipo "Word".
Var-string checking (Strict ou Relaxed): Se "Strict" (rigorosa) verifica o tamanho das
"string" passadas como parmetro, se "Relaxed" (moderada) no verifica.
Boolean evaluation (Short circuit ou Complete): Se "Short circuit" os testes de uma
expresso booleana so mais rpidos, se "complete" todas as condies so testadas.
Numeric processing (Software ou 8087-80287): Com 8087-80287 permitido o uso dos
tipos: Single, Double, Extended ou Comp. Se "Software" permite somente o uso dos tipos comuns
do Turbo.
Emulation (ON ou OFF): Emula (simula) um coprocessador aritmtico, se ele no existir.
Debug information (ON ou OFF): Gera um arquivo de informaes de depurao de um
arquivo que est sendo compilado.
Local symbols (ON ou OFF): Gera informaes sobre smbolos locais (nomes e tipos de
todas as variveis e constantes locais de um smbolo).
Conditional defines: Define smbolos que podem ser referenciados em diretivas de
compilao condicionais no arquivo fonte.

11

Memory Sizes (Stack size, Low heap limit ou High heap limit): Permite configurar o mapa
de memria de um arquivo de cdigo resultante, ou seja, o tamanho da memria.
Stack size: Permite especificar o tamanho do segmento da pilha em bytes.
Low heap limit: Permite especificar o limite inferior da pilha.
High heap limit: Permite especificar o limite superior da pilha.

Linker
Permite especificar diferentes modalidades de gerao do mapa do "linker" e o destino do
"link buffer".
Map file (OFF, Segments, Publics ou Detailed):
OFF: Arquivo "*.MAP" no gerado.
Segments: Inclui informaes do segmento de memria no arquivo *.MAP.
Publics: Inclui informaes sobre smbolos, procedure/function no arquivo *.MAP.
Detailed: Informaes mais detalhadas do que as anteriores.
Link buffer (Memory ou Disk): Define o destino do "Link buffer".
Memory: Mais rpido, mas no aceita programas grandes;
Disk: Mais lento, mas aceita programas maiores.

Environment (Ambiente)
Permite configurar o ambiente de trabalho.
Config auto save (ON ou OFF): Se ligado, atualiza o arquivo de configurao
("TURBO.TP") quando o programador sai do Turbo Pascal.
Edit auto save (ON ou OFF): Salva automaticamente o arquivo fonte quando o arquivo for
executado ("Run") ou quando da sada para o Sistema Operacional ("Quit" ou "Os shell").
Backup files (ON ou OFF): Gera arquivo "*.BAK" quando o arquivo fonte for salvo.
Tab size 8: Especifica o tamanho da tabulao horizontal do editor (tab) (2 at 16 brancos).
Zoom windows (ON ou OFF): se ligada, as janelas Edit, Watch ou OutPut esto
expandidas.
Screen size (25 line display ou 43/50 line display): Permite selecionar o nmero de linhas na
tela: 25 placa CGA, 43 placa EGA e 50 placa VGA.

12

Directories (Diretrio)
Permite especificar drive:\path para diretrios dos arquivos usados e gerados pelo turbo.
Turbo Directory: Diretrio dos arquivos do Turbo Pascal (drive:\path), normalmente:
C:\LING\TP.
EXE & TPU Diretory: Diretrio dos arquivos "*.EXE" (executveis) e "*.TPU"
(unidades).
Include Diretories: Especifica o diretrio dos arquivos utilizados pela diretiva de incluso
de fontes {$I}.
Unit Diretories: Especifica o diretrio dos arquivos fontes de unidades ("*.PAS" das
unidades).
Object Directories: Especifica o diretrio dos arquivos objetos "*.OBJ".
Pick File Name: Especifica o drive, caminho e nome do arquivo de seleo "*.PCK".
Current Pick File: Indica o drive, caminho e nome do arquivo de seleo corrente.

Parameters (Parmetros)
Permite a especificao de parmetros para que o programa possa ser compilado na
memria.

Save options (Salva Opes)


Salva o arquivo de configurao "*.TP" (default "TURBO.TP").

Retrieve options (Recuperar Opes)


Carrega o arquivo de configurao "*.TP" (default "TURBO.TP").

2.6 Debug (Depurao) [ALT][D]


Evaluate [CTRL][F4]: Exibe uma janela de avaliao com trs opes: (Evaluate, Result e
New name)
Evaluate: Permite identificar uma expresso ou uma varivel a ser submetida ao
Debug.

13

Result: exibido o resultado da avaliao da expresso ou varivel selecionada


acima.
New name: Permite atribuir um novo valor.
Call stack [CTRL][F3]: Durante a depurao, permite chamar uma janela com a
pilha que contm uma lista de "procedure" e "function" que mostram a posio atual, mostrando
tambm, os parmetros de cada chamada.
Find procedure: Posiciona o cursor no incio de uma "procedure" ou "function".
Integrated debugging (ON ou OFF): Se ligado, aciona o debugger, "BreakPoints" (pontos
de parada) podem ser colocados.
Standalone debugging (ON ou OFF): Se ligado com "Compile/Destination" em "Disk", as
informaes do "Debugger" so anexadas ao arquivo "*.EXE" para uso com o "Turbo Debugger".
Display swapping (None, Smart ou Always): Permite estabelecer modos de visualizao de
"OutPut" de tela durante a depurao do programa.
None: No mostra a tela de sada do programa.
Smart: Mostra os efeitos da tela somente quando houver um comando de sada.
Always: Mostra sempre a tela resultante.
Refresh display: Retorna para a tela do ambiente.

2.7 Break/watch [ALT][B]


Se a opo "Integrated debugging" do menu "Debug" estiver em "On" pode-se adicionar,
deletar, editar, remover todos os "watches" ou colocar, retirar ou procurar "BreakPoints".
Add watch [CTRL][F7]: Permite que a varivel sob o cursor seja exibida na janela de
assistncia quando o "debug" for executado
Delete watch: Permite que uma varivel da janela de assistncia seja deletada.
Edit watch: Permite que uma varivel da janela de assistncia seja editada (alterada).
Remove all watches: Remove todas as variveis da janela de assistncia.
Toggle breakpoint [CTRL][F8]: Permite que "BreakPoints" (pontos de parada) sejam
colocados ou retirados.
Clear all breakpoints: Permite que todos os "BreakPoints" sejam removidos.
View next breakpoint: Permite visualizar o prximo "BreakPoint".

14

2.8 Como usar o DEBUG


Passo 1: Ter as duas janelas na tela: janela de edio e janela de assistncia [F5];
Passo2: Marcar um "BreakPoint" (ponto de parada) [CTRL][F8] ou opo "Toggle breakpoint" do
menu "Break/watch";
Passo 3: Rodar o programa "Run" ou [CTRL][F9], o programa executado at a linha anterior ao
"BreakPoint";
Observao: Para visualizar o resultado obtido na tela de execuo [ALT][F5] ou a opo "User
screen" do menu "Run";
Passo 4: Para selecionar as variveis que se deseja assistir, posiciona-se o cursor em cima da
varivel e [CTRL][F7] ou a opo "Add watch" do menu "Break/watch", aps aparecer uma janela
com a varivel no seu interior (podendo-se alterar ou mudar a varivel) pressiona-se [RETURN];
Passo 5: Para visualizar a execuo do programa linha linha pressiona-se [F8] (opo "Step over"
do menu "Run") ou [F7] (opo "Trace into" do menu "Run"):
[F8]: executa o programa linha linha sem entrar nas "procedure" e "function";
[F7]: executa o programa linha linha entrando tambm nas "procedure" e "function";
Passo 6: Pode-se ainda "Delete watch" (deletar varivel), "Edit watch" (editar varivel) ou
"Remove all watches" (remover todas as variveis) no menu "Break / watch".
Passo 7: Pode-se ainda desviar a execuo do "debug" para a linha que est o cursor [F4] ou a
opo "Goto cursor" do menu "Run";
Passo 8: Para encerrar a execuo do "debug" [CTRL][F2] ou a opo "Program reset" do menu
"Run", deve-se ainda desmarcar todos os "breakpoints" atravs da opo "Clear all breapoints" do
menu "Break/watch".

15

3. Estrutura de um Programa Pascal


3.1 Identificadores
So os nomes criados pelo programador para:
- nomes de Constantes (Const);
- nomes de Variveis (Var);
- nomes de Tipos (Type);
- nomes de Procedimentos (Procedure);
- nomes de Funes (Function);
- nomes de Unidades (Unit);
- nomes de Programas (Program).
Regras:
- Todo identificador deve comear com uma letra ou subscrito (_);
- No pode conter espaos;
- Os caracteres vlidos so letras, dgitos, subscrito;
- Pode conter qualquer quantidade de caracteres, mas somente os primeiros 63 so significativos.

3.2 Comentrios
O programador pode, dentro do seu programa, fazer comentrios sem que o cdigo seja
compilado, isto pode ser feito de duas maneiras:
(* aqui comea o programa *)
ou
{ aqui comea o programa }

3.3 Estrutura Geral


(* ----------------------------------------- Nome do programa *)
Program nome_do_programa;

(* opcional *)

(* ------------------------------------------------- Unidades *)
Uses Crt,Printer,Graph;

// unidades

(* ---------------------------------------------- Declaraes *)
Const

x = 100;
PI = 3.1415;
16

UP = #72;
LEFT = #75;
RIGHT = #77;
DOWN = #80;
PGUP = #73;`
PGDN = #81;
ENTER = #13;
ESC = #27;
BACKSPACE = #8;

{tecla acima}
{tecla esquerda}
{tecla direita}
{tecla abaixo}
{tecla pagina acima}
{tecla pagina abaixo}
{tecla RETURN ou ENTER}
{tecla ESC}
{tecla BACKSPACE}

Type Nome = String[80];


Var

A,B: Integer;
C: Real;
N: Nome;

(* ----------------------------------------------- Definies *)
Procedure nome_do_procedimento(parmetros);
Begin
comandos;
End;
Function nome_da_funo(parmetros): TIPO DA FUNAO;
Begin
comandos;
End;
(* --------------------------------------- Programa Principal *)
Begin
comandos;
End.

3.4 Definio de Tipos (Type)


Em Pascal o programador pode definir seus prprios tipos de dados.
Uses Crt;
Type

TIPO_DATA = Record
ano: Integer;
mes: 1..12;
dia: 1..31;
End;
TIPO_NOME: String[80];
17

Var

Data: TIPO_DATA;
Nome: TIPO_NOME;

Begin
ClrScr;
Data.ano := 1995;
Data.mes := 12;
Data.dia := 19;
Nome := _UCPel';

4. Tipos de Dados
4.1 - Integer: (2 bytes)

Faixa: [-32768 32767]

Var Contador,Acumulador: Integer;


Begin
Contador := 1000;
Acumulador := -32000;

4.2 - Real: (6 bytes)

Faixa: [1.0E-38 1.0E+38]

Var Pi,Inflacao,Juros,Nota,Salario: Real;


Begin
Pi := 3.1415;
Inflacao := 13.6;
Juros := 25.7;
Nota := 5.99;
Salario := 87657.99;

4.3 - Byte: (1 byte)

Faixa: [0 255]

Var Dia,Mes,Idade,Numero_de_Dentes: Byte;


Begin
Dia := 31;
Mes := 12;
Idade := 33;
Numero_de_Dentes := 12;

4.4 - Char: (1 byte)

Faixa: [0 255] caracteres

Var Sexo,Opcao,Letra,Operacao: Char;


Begin
18

Sexo := 'F';
Opcao := '1';
Letra := 'a';
Operacao := '+';
Caracter := #65;
Letra := CHR(66);

{ Letra A }
{ Letra B }

4.5 - Boolean: (1 byte)


Var

Faixa: [True ou False]

Continua: Boolean;
X,Y: Integer

Begin
Continua := FALSE;
Repeat
ReadLn(X);
ReadLn(Y);
If X = Y then
Continua := TRUE;
Until Continua;

4.6 - String[n]: (n+1 bytes)


Var Nome: String[40];
Begin
ClrScr;
Nome := 'Turbo Pascal 5.5';
Write('Nome: ',Nome);

4.7 - Array[faixa] Of Tipo:


Var

Nome: Array[1..10] of String[80];


Nota: Array[1..10] of Real;
Letra: Array[1..40] of Char;
I: Byte;

Begin
ClrScr;
For I := 1 to 10 do
Begin
Write('Nome: ');
Readln(Nome[I]);
Write('Nota: ');
Readln(Nota[I]);
End;
For I := 1 to 40 do
19

Begin
Write('Letra: ');
Letra[I] := ReadKey;
End;

4.8 - Word: (2 bytes)

(0 65535)

Var Numero_de_Alunos_Catolica,Numero_de_Funcionarios: Word;

4.9 - ShortInt: (1 byte)

(-128 127)

4.10 - LongInt: (4 bytes)

(-2147483648 2147483647)

5. Operadores
5.1 - Operadores Aritmticos
5.1.1 - Com REAIS
+
*
/

Adio
Subtrao
Multiplicao
Diviso

5.1.2 - Com INTEIROS


+
*
/
Div
Mod

Adio
Subtrao
Multiplicao
Diviso com resultado real
Resultado inteiro da diviso
Resto da diviso

Uses Crt;
Var

X,Y: Integer;
Divisao: Real;
Resto,Quociente: Integer;

Begin
ClrScr;
X := 7;
20

Y := 2;
Divisao := X / Y;
Resto := X Mod Y;
Quociente := X Div Y;

7
1

{ Divisao = 3,5 }
{ Resto = 1 }
{ Quociente = 3 }

2
3

5.1.3 HIERARQUIA (Precedncia)


1. Parnteses: ()
2. Operador unrio: -(valor)
3. Funes
4. Operador Not
5. * / Div Mod And
6. + - Or Xor
7. = <> > < >= <= (Operadores Relacionais)

5.2 - Operadores Relacionais


=
<>
>=
<=
<
>

Igual
Diferente
Maior ou igual
Menor ou igual
Menor
Maior

5.3 - Operadores Lgicos


5.3.1 - Not (negao):
NOT

Not A

21

5.3.2 - And (e):


Condio A
AND

Condio B

5.3.3 - Or (ou):
Condio A
OR

Condio B

5.3.4 - Xor (ou exclusivo):


Condio A
XOR

Condio B

5.4 Operador de Incluso (In)


Operador que testa a incluso de uma varivel em uma lista de constantes.

Exemplo (1):
Repeat
Ch := ReadKey;
Until Ch In ['S','s','N','n'];
(* verdadeiro quando Ch igual a: 'S','s','N','n' *)
igual a:
22

Repeat
Ch := ReadKey;
Until (Ch = 'S') Or (Ch = 's') Or (Ch = 'N') Or (Ch = 'n');
(* verdadeiro quando Ch igual a: 'S','s','N','n' *)

Exemplo (2):
Repeat
ReadLn(X);
Until X In [1,2,3,4,5];
(* verdadeiro quando X igual a: 1,2,3,4,5 *)

(* ou X In [1..5]; *)

igual a:
Repeat
ReadLn(X);
Until (X=1) or (X=2) Or (X=3) Or (X=4) Or (X=5);
(* verdadeiro quando X igual a: 1,2,3,4,5 *)

5.5 Procedimentos Especiais


5.5.1 Inc
Procedimento que permite o incremento de uma varivel inteira.
Modo de Usar: Inc(varivel,passo);
Inc(i);
Inc(i,5);

(* i := i + 1 *)
(* i := i + 5 *)

5.5.2 Dec
Procedimento que permite o decremento de uma varivel inteira.
Modo de Usar: Dec(varivel,passo);
Dec(i);
Dec(i,5);

(* i := i - 1 *)
(* i := i - 5 *)

6. Funes Padres
6.1 - Exp(x): Funo exponencial ex
6.2 - Abs(x): Valor absoluto (valor sempre positivo).
23

6.3 - ArcTan(valor): Funo arco tangente (resultado em radianos).


6.4 - Cos(ang): Funo cosseno (ngulo em radianos).
6.5 - Sin(ang): Funo seno (ngulo em radianos).
6.6 - Frac(x): Retorna a parte fracionria.
6.7 - Int(x): Retorna a parte inteira.
6.8 - Sqr(x): Retorna x elevado a segunda potncia.
6.9 - Sqrt(x): Retorna a raiz quadrada de x.
6.10 - Ln(x): Logaritmo Natural.
6.11 - Chr(x): Transforma ordinal em caracter.
6.12 - Ord(x): Transforma caracter em ordinal.
6.13 - Round(x): Converte real em inteiro arredondando.
6.14 - Trunc(x): Converte real em inteiro sem arredondar.
6.15 - Pi: Valor Pi = 3.1415926535897932385.
6.16 - Random(v): Gera um nmero aleatrio de zero at (v-1).

7. Comandos
7.1 Tipos de Comandos
7.1.1 Seqncia
um tipo de comando que no fluxo lgico do programa executado e o controle passa para
o prximo comando.
Exemplo:
Var Nome: String;
Begin
ClrScr;
Write('Nome: ');
Readln(Nome);

7.1.2 Seleo (If e Case)


um tipo de comando que no fluxo de execuo do programa permite que, atravs de
condies, desvios sejam feitos, ou seja, alguns comandos so executados e outros no.
Exemplo:
If numero = 0 Then
WriteLn('Zero')
Else
If numero > 0 Then
WriteLn('Positivo')
24

Else
WriteLn('Negativo');

7.1.3 Repetio (For, While e Repeat)


um tipo de comando que no fluxo de execuo do programa, permite que outros comandos
sejam repetidos at que uma condio seja satisfeita ou enquanto uma condio satisfeita. Por
exemplo:
Exemplo:
i := 1;
Repeat
(* repete at que uma tecla seja pressionada *)
WriteLn('i = ',i);
Inc(i);
(* inc(i) igual a i := i+1 *)
Until KeyPressed;

7.1.4 Atribuio
um tipo de comando que permite que uma expresso (equao) seja resolvida e o seu valor
atribudo (igualado a uma varivel).
Exemplo:
i := 1;
x := x + 1;
x1 := (- b + sqrt(sqr(b) - 4 * a * c)) / (2 * a);

7.2 - Comando SIMPLES e COMPOSTO:


Simples: Quando h apenas um comando ligado a outro.
For i := 1 to 100 do
WriteLn(i);
Composto: Quando mais de um comando est ligado a outro, usar-se os delimitadores Begin, End;
For i := 1 to 100 do
Begin
WriteLn('i = ',i);
ch := ReadKey;
End;

7.3 - Comando If ... Then ... Else (Comando de Seleo)


25

Modo de usar:
If condio Then
comando;
Se a condio verdadeira ento o comando executado, seno executado o prximo
comando.
ou
If condio Then
comando 1
Else
comando 2;
Se a condio verdadeira o comando 1 executado seno executado o comando 2.
Comando, comando 1 e comando 2 podem ser simples ou compostos.

7.4 - Comando Case ... Of ... Else ... End (Comando de Seleo)
Modo de usar:
Case varivel
OF
constante 1: comando 1;
constante 2: comando 2;
.
.
.
.
constante n: comando n;
End;
Se a varivel igual a alguma constante o comando correspondente executado, se
nenhuma constante for encontrada o comando ser terminado.
ou
Case varivel
Of
constante 1: comando 1;
constante 2: comando 2;
.
.
.
.
.
.
constante n: comando n;
Else
26

comandos;
End;
Se a varivel for igual a alguma constante, o comando correspondente executado, se
nenhuma constante for encontrada os comandos aps o Else so executados, logo aps o comando
Case terminado.
Observao: A varivel no pode ser Array, String e Real.
Case letra
Of
'a'..'z': WriteLn('Minsculas');
'A'..'Z': WriteLn('Maisculas');
'0'..'1': WriteLn('Nmero');
Else
WriteLn('Caracter Especial');
End;
Case digito
Of
'0': WriteLn('Zero');
'1': WriteLn('Um');
'2': WriteLn('Dois');
:
'9': WriteLn('Nove');
Else
WriteLn('ERRO: No um Nmero');
End;

7.5 Comando For ... Do (Comando de Repetio)


Modo de usar:
For Varivel_de_Controle := Valor_Inicial (To) Valor_Final Do
comando;
A varivel de controle no deve ser alterada no corpo do comando, pode-se ter comando
simples ou comando composto, a varivel de controle no deve ser real, array ou string.
To: Comando de repetio crescente
DownTo: Comando de repetio decrescente
For i := 0 To 255 Do
Begin
WriteLn('Cdigo: ',i,'- Caracter ASCII:',Chr(i));
ch := ReadKey;
27

End;
For i := 1 To n-1 Do
For j := i+1 To n Do
Begin
WriteLn('i=',i,' | j=',j);
ch := ReadKey;
End;

7.6 Comando While ..Do (Comando de Repetio)


Modo de Usar:
While condio Do
comandos;
Enquanto a condio verdadeira os comandos so repetidos. Pode-se usar comando
simples ou comando composto.
Exemplo:
i := 1;
While i <= 10 Do
Begin
WriteLn('i = ',i);
i := i+1;
End;

7.7 Comando Repeat ... Until (Comando de Repetio)


Modo de Usar:
Repeat
comandos;
Until condio;
Os comandos so repetidos, at que a condio se torne verdadeira, enquanto a condio
falsa os comandos so repetidos.
Exemplo:
i := 1;
Repeat
WriteLn('i = ',i);
i := i+1;
28

Until i >= 10;

{ Repete at i ser igual a 10 }

i := 0;
Repeat
WriteLn('i = ',i);
i := i+1;
Until KeyPressed;

{ Repete at que uma tecla seja pressionada }

7.8 O Procedimetro Halt


Fora o trmino do programa (aborta o programa), retornando ao sistema operacional, se o
programa for executvel ou ao ambiente do Turbo Pascal, se o programa for um arquivo fonte.
Modo de Usar:
Halt (x: Word);
ou
Halt;

7.9 O Procedimento Exit


Fora a sada de um lao, passando a execuo para a prxima instruo.
Repeat
:
If KeyPressed then Exit;
:
Until False;

8. Entrada e Sada
8.1 Entrada pelo Teclado
ReadLn: Procedimento que permite entrada de dados via teclado. A varivel x pode ser de
qualquer tipo.
ReadLn(x);
ReadKey: Funo que permite a entrada de um caracter sem pressionar a tecla <ENTER>. A
varivel deve ser do tipo Char e necessrio usar a unidade Crt;.
Uses Crt;
Var Tecla: Char;
Begin
29

ClrScr;
Write('Digite uma TECLA: ');
Tecla := ReadKey;
WriteLn('Voc digitou: ',Tecla);
End.

8.2 Sada no Vdeo


Procedimento que permite escrita no vdeo:
Write(x);
ou
WriteLn(x);
ou
WriteLn;

(* Imprime x e cursor fica ao lado *)


(* Imprime x e cursor vai para prxima linha *)
(* Deixa uma linha em branco na tela *)

8.3 Sada na Impressora


necessrio usar a unidade Printer.
Uses Crt,Printer;
Begin
ClrScr;
WriteLn(Lst);
Write(Lst,'x = ');
WriteLn(Lst,x);
End.

(* Pula uma linha na impressora *)

Observao:
WriteLn(lst,#12);
WriteLn(lst,#15);

(* Salta uma pgina na impressora *)


(* Comprime os caracteres na impressora *)

9. Controle do Vdeo e Teclado:


9.1 ClrScr (Clear Screen)
Procedimento que permite limpar a tela, o cursor permanece no canto superior esquerdo.
obrigatrio o uso da unidade Crt. A tela limpa com a cor de fundo corrente.
Uses Crt;
Begin
ClrScr;
30

9.2 GotoXY(coluna,linha) (V para posio X,Y)


Procedimento que permite o posicionamento do cursor em qualquer posio da tela.
obrigatrio o uso da unidade Crt.

80

40 ou 80 Colunas

25 Linhas

Tela

25
Uses Crt;
Begin
ClrScr;
GotoXY(30,12);
Write('Turbo Pascal');
GotoXY(34,13);
Write('5.5');

9.3 ClrEol (Clear End Of Line)


Procedimento que permite que uma linha seja apagada desde a posio do cursor at o final
da linha. obrigatrio o uso da Unidade Crt.
Uses Crt;
Var L: Byte;
Begin
TextBackGround(WHITE);
ClrScr;
TextColor(BLACK);
For L := 1 to 24 do
Begin
GotoXY(40,L);
ClrEol;
End;
End.

{ Altera a cor de fundo}


{ Altera a cor do Texto }

9.4 DelLine (Delete Line)


31

Procedimento que permite que uma linha seja apagada. obrigatrio o uso da Unidade Crt.
Uses Crt;
Var L: Byte;
Begin
TextBackGround(WHITE);
ClrScr;
TextColor(BLACK);
For L := 1 to 24 do
Begin
GotoXY(40,L);
DelLine;
End;
End.

{ Altera a cor de fundo}


{ Altera a cor do Texto }

10 Comandos Especiais (Unidade Crt)


10.1 Delay (Atraso)
Procedimento que permite uma parada temporrio da execuo por parte do computador.
Modo de Usar:
Delay(x);

{ x em milisegundos }

10.2 TextBackGround (Cor de Fundo)


Procedimento que permite mudana na cor de fundo do vdeo.
Modo de Usar:
TextBackGround(cor);

{ cor: nmero ou nome }

Nmero

Nome

Cor

0
1
2
3
4
5
6
7

Black
Blue
Green
Cyan
Red
Magenta
Brown
LightGray

preto
azul
verde
azul claro
vermelho
rosa
marrom
cinza
32

10.3 TextColor (Cor de Frente)


Procedimento que permite mudana na cor de texto do vdeo.
Modo de Usar:
TextColor(cor);

{ cor: nmero ou nome }

Nmero

Nome

Cor

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Black
Blue
Green
Cyan
Red
Magenta
Brown
LightGray
DarkGray
LightBlue
LightGreen
LightCyan
LightRed
LightMagenta
Yellow
White

preto
azul
verde
azul claro
vermelho
rosa
marrom
cinza
cinza brilhante
azul brilhante
verde brilhante
azul claro brilhante
vermelho brilhante
rosa brilhante
amarelo
branco

Observao: Piscante (Blink cor a 128)

10.4 Window (Janela)


Procedimento que permite definir a janela de texto ativa, ou seja, parte do vdeo ativo onde
as escritas so feitas. Normalmente a janela ativa toda tela, ou seja: Window(1,1,80,25);

(Xi,Yi)

(Xf,Yf)
33

Modo de Usar:
Window(Xi,Yi,Xf,Yf);
Observao: Aps setar uma janela ativa a posio (1,1) passa ser o canto superior esquerdo.

10.5 Sound e NoSound (Som e Sem Som)


Sound: Procedimento que ativa o auto-falante do computador.
Modo de Usar:
Sound(nota: Word);
Uses Crt;
Begin
Sound(220);
Delay(200);
NoSound;
End.

(* ativa o auto-falante com a nota 220 *)


(* perodo de durao do som *)
(* desativa o auto-falante *)

NoSound: Procedimento que desativa o auto-falante do computador.


Modo de Usar:
NoSound;

10.6 WhereX e WhereY (Localizao do Cursor)


Funes que indicam a posio corrente do cursor [x (coluna) e y (linha)].
Uses Crt;
Var Coluna,Linha: Byte;
Begin
Coluna := WhereX;
Linha := WhereY;
WriteLn('Coluna: ',Coluna);
WriteLn('Linha : ',Linha);
End.

10.7 TextMode (Modo do Texto)

34

Procedimento que define o tipo de modo texto, colorido ou preto e branco e 40 ou 80


colunas.
C80 - Colorido com 80 colunas
C40 - Colorido com 40 colunas
BW80 - Preto e Branco com 80 colunas
BW40 - Preto e Branco com 40 colunas

11. Vetores e Matrizes


Vetores e matrizes so variveis que possuem vrios elementos de mesmo tipo, cada
elemento possui um ou mais ndices que os referenciam e os diferenciam. Uma caracterstica
importante que todos os valores permanecem na memria ao mesmo tempo. Os elementos so
alocados com contigidade fsica, ou seja, um ao lado do outro.

11.1 Vetores
um tipo particular de matriz onde cada elemento possui s um ndice (unidimensional).
O programa exemplo abaixo, permite a entrada de nomes e idades, logo aps imprime todos
os nomes e idades contidos na memria.
Program Vetor;
Uses Crt;
Const QUANT = 255;
Var Nome: Array[1..QUANT] of String[40];
Idade: Array[1..QUANT] of Byte;
I,N: Byte;
Ch: Char;
Begin
ClrScr;
I := 1;
Repeat
Write('Nome: ');
ReadLn(Nome[i]);
(* entrada de um nome *)
Write('Idade: ');
ReadLn(Idade[i]);
(* entrada de uma idade *)
Inc(I);
Write('Continua [S]im ou [N]o ? ');
Repeat
Ch := ReadKey;
Until Ch IN ['S','s','N','n'];
Until (Ch IN ['N','n']) Or (I > QUANT);
N := I - 1;
(* nmero de elementos *)
For I := 1 To n Do
Begin
35

WriteLn('Nome: ',Nome[i]);
WriteLn('Idade: ',Idade[i]);
Ch := ReadKey;
End;
End.

11.2 Matriz
um tipo de dado que permite que uma varivel contenha vrios elementos de mesmo tipo.
Cada elemento possui dois ou mais ndices (bidimensional, tridimensional, etc) que o diferencia dos
outros elementos.
O programa abaixo, calcula a soma de duas matrizes: C = A + B.
Program vetor;
Uses Crt;
Const QUANT = 10;
Var
A,B,C: Array[1..QUANT,1..QUANT] of Real;
Col,Lin,J,M,N: Byte;
Ch: Char;
Begin
ClrScr;
Write('Informe a ORDEM da MATRIZ (MxN): ');
Repeat
Write('Nmero de Linhas (M): ');
Readln(M);
Until (M >= 1) And (M <= QUANT);
Repeat
Write('Nmero de Colunas (N): ');
Readln(N);
Until (N >= 1) And (N <= QUANT);
For Lin := 1 To M Do
For Col := 1 To N Do
Begin
Write('A[',Lin,',',Col,'] = ');
Readln(a[Lin,Col]);
Write('B[',Lin,',',Col,'] = ');
Readln(b[Lin,Col]);
End;
For Lin := 1 To M Do
For Col := 1 To N Do
Begin
C[Lin,Col] := A[Lin,Col]+B[Lin,Col];
Write('C[',Lin,',',Col,'] = ',C[Lin,Col]);
Ch := ReadKey;
End;
End.
36

11.3 Sort (Ordenao)


Mtodo de classificao de dados. Para exemplificar melhor as variveis do tipo vetor,
abaixo dado dois tipos de Sort:
Program Sort;
Uses Crt;
Const QUANT = 255;
Type TIPO = String[40];
Var
Nome: Array[0..QUANT] of TIPO;
Temp: TIPO;
I,J,N: Byte;
Ch: Char;
Begin
ClrScr;
I := 0;
Repeat
Write('Nome: ');
Readln(Nome[i]);
(* Entrada de um nome *)
Inc(I);
Write('Continua [S]im ou [N]o ? ');
Repeat
Ch := ReadKey;
Until Ch IN ['S','s','N','n];
Until (Ch IN ['N','n']) Or (I > QUANT);
N := I - 1;
(* Nmero de Elementos *)
For I := 1 to N do
For J := I+1 to N do
If Nome[I] > Nome[J] then
Begin
Temp := Nome[i];
Nome[i] := Nome[j];
Nome[j] := Temp;
End;
WriteLn('Nomes ORDENADOS');
For I := 0 to N do
Begin
WriteLn('Nome: ',Nome[i]);
Ch := ReadKey;
End;
End.
Program Buble_Sort;
Uses Crt;
Const QUANT = 255;

(* Mtodo da Bolha - Buble Sort*)

37

Type TIPO = String[40];


Var
Nome: Array[0..QUANT] of TIPO;
Temp: TIPO;
I,N,K: Byte;
Ch: Char;
Ordenado: BOOLEAN;
Begin
ClrScr;
I := 0;
Repeat
Write('Nome: ');
Readln(Nome[i]);
(* Entrada de um Nome *)
Inc(I);
Write('Continua [S]im ou [N]o ? ');
Repeat
Ch := ReadKey;
Until Ch IN ['S','s','N','n'];
Until (Ch IN ['N','n']) Or (I > QUANT);
N := I - 1;
(* Nmero de Elementos *)
K := N - 1;
Repeat
Ordenado := TRUE;
For I := 0 to K do
If Nome[I] > Nome[I+1] then
Begin
Temp := Nome[i];
Nome[I] := Nome[I+1];
Nome[I+1] := Temp;
Ordenado := FALSE;
End;
K := K - 1;
Until Ordenado;
WriteLn('Nomes ORDENADOS');
For I := 0 to N do
Begin
WriteLn('Nome: ',Nome[i]);
Ch := ReadKey;
End;
End.

12. Manipulao de String


12.1 Chr
Funo que retorna o caracter correspondente ao cdigo da tabela ASCII.
38

Modo de Usar: Chr(cdigo: Byte): Char;


Uses Crt;
Var
Codigo: Byte;
Caracter: Char;
Begin
ClrScr;
Repeat
Write('Cdigo: ');
Readln(Codigo);
Caracter := Chr(Codigo);
WriteLn('Cdigo :',Codigo,' Caracter ASCII: ',Caracter);
Until Codigo = 0;
End.

12.2 Ord
Funo que retorna o cdigo ASCII correspondente ao caracter da tabela ASCII.
Modo de Usar: Ord(caracter: Char): Byte;
Uses Crt;
Var
Codigo: Byte;
Caracter: Char;
Begin
Repeat
ClrScr;
Write('Caracter: ');
Caracter := ReadKey;
Codigo := Ord(Caracter);
WriteLn('Caracter :',Caracter,' Cdigo ASCII: ',Codigo);
Until Caracter = #13;
(* #13 o cdigo da tecla <ENTER> *)
End.

12.3 Concat
Funo que retorna as strings s1,s2,... sn concatenadas, ou seja, unidas.
Modo de Usar: Concat(s1,s2,... sn: String[]): String[];
Uses Crt;
Var
S1,S2,S3: String[7];
Sr: String[21];
Begin
39

ClrScr;
S1 := 'Turbo ';
S2 := 'Pascal ';
S3 := '5.5';
Sr := Concat(S1,S2,S3);
WriteLn(S1);
WriteLn(S2);
WriteLn(S3);
WriteLn(Sr);
Repeat Until KeyPressed;

(* Sr := 'Turbo Pascal 5.5' *)

End.

12.4 Copy
Funo que retorna uma substring a partir de outra string.
Modo de Usar: Copy(s: String[], incio, tamanho: Byte): String[];
Uses Crt;
Var
Velha: String[15];
Nova: String[10];
Begin
ClrScr;
Velha := 'MICROCOMPUTADOR';
Nova := Copy(velha,6,10);
WriteLn(Velha);
WriteLn(Nova);
Repeat Until KeyPressed;
End.

(* Nova := 'COMPUTADOR' *)

12.5 Delete
Procedimento que remove caracteres de uma string.
Modo de Usar: Delete(s: String[],incio,tamanho: Byte);
Uses Crt;
Var Velha: String[15];
Begin
ClrScr;
Velha := 'MICROCOMPUTADOR';
Delete(Velha,6,10);
WriteLn(Velha);
(* Velha := 'MICRO' *)
Repeat Until KeyPressed;
End.
40

12.6 Insert
Procedimento que insere s1 em s2 na posio desejada gerando uma nova string.
Modo de Usar: Insert(s1,s2: String[],posio: Byte);
Uses Crt;
Var
S1: String[2];
S2: String[17];
Begin
ClrScr;
S1 := 'ES';
S2 := 'MICROCOMPUTADOR';
Insert(S1,S2,16);
WriteLn(S1);
WriteLn(S2);
(* S2 := 'MICROCOMPUTADORES' *)
Repeat Until KeyPressed;
End.

12.7 Length
Funo que retorna o nmero de caracteres de uma string
Modo de Usar: Length(s: String[]): Byte;
Uses Crt;
Var Nome: String[40];
Begin
ClrScr;
Write('Digite seu Nome: ');
Readln(Nome);
Write(Nome,' seu Nome tem: ',Length(Nome),' caracteres');
Repeat Until KeyPressed;
End.

12.8 Pos
Funo que retorna a posio de s1 em s2 (0 se no encontrar).
Modo de Usar: Pos(s1,s2: String[]): Byte;
Uses Crt;
Var
S1: String[6];
41

S2: String[15];
Posicao: Integer;
Begin
ClrScr;
S1 := 'COMPUT';
S2 := 'MICROCOMPUTADOR';
Posicao := Pos(S1,S2);
If Posicao<>0 then
Write('String Encontrada na Posio: ',Posicao)
Else
Write('String no encontrada');
Repeat Until KeyPresssed;
End.

12.9 Str
Procedimento que converte um valor nmerico (Real ou qualquer tipo de inteiro) em String.
O tamanho do nmero dado pelo tamanho da String, sendo que um byte deixado para o sinal.
Modo de Usar: Str(valor: Integer ou Real, s: String[]);
Uses Crt;
Var
N: Real;
S: String[7];
Begin
ClrScr;
N := 3.14151617;
Str(N,S);
WriteLn('String: ',S);
Repeat Until KeyPressed;
End.

(* S := '3.1415' *)

12.10 UpCase
Funo que retorna o caracter convertido em letra maiscula.
Modo de Usar: UpCase(ch: Char): Char;
Uses Crt;
Var Ch: Char;
Begin
ClrScr;
Repeat
Write('Digite uma Tecla: ');
Ch := ReadKey;
42

WriteLn(UpCase(Ch));
Until UpCase(Ch) = 'F';
End.
Uses Crt;
Var Ch: Char;
Begin
ClrScr;
Repeat
Write('Confirma [S]im ou [N]o ?');
Ch := UpCase(ReadKey);
Until Ch In ['S','N'];
End.

12.11 Val
Procedimento que converte uma string em valor nmerico (Real ou qualquer tipo de
inteiro), se a string possuir letras, a varivel erro retorna a posio da letra (pois no nmerica),
seno retorna zero.
Modo de Usar: Val(s: String[], valor: Real ou Integer, erro: Integer);
Uses Crt;
Var
S: String[10];
Valor: Integer;
Erro: Integer;
Begin
ClrScr;
Repeat
Write('Digite alguma coisa [Fim para Finalizar]: ');
Readln(S);
Val(S,Valor,Erro);
If Erro=0 then
Begin
WriteLn('SEM ERRO');
WriteLn('Nmero: ',Valor);
End
Else
WriteLn('ERRO: ',Erro);
Until (S = 'FIM') or (S = 'fim');
End.

12.12 FillChar
Procedimento que inicializa uma varivel string com caracteres repetitivos.
43

Modo de Usar:FillChar(varivel: Qualquer_tipo; quantidade: Word; constante);


Uses Crt;
Var
Linha: String[80];
Espacos: String[40];
Begin
FillChar(Linha,80,'-');
Linha[0] := #80;
FillChar(Espacos,40,#32);
Espacos[0] := #40;

(* indicar o nmero de caracteres *)

13. Procedimentos (Procedure) e Funes (Function)


13.1 Variveis Locais e Globais
Varivel Local
Todas as variveis definidas dentro de uma funo ("function") ou procedimento
("procedure") so chamadas locais, s podem ser referenciadas dentro do mdulo que a definiu.

Varivel Global
Todas as variveis definidas fora de todas as funes so chamadas globais e podem ser
referenciadas em qualquer parte do programa inclusive dentro das funes e procedimentos.
Observaes:
a)Todas as variveis usadas no programa principal so globais e devem, obrigatoiamente ser
definidas no "Var".
b)As variveis locais tem prioridade sobre as variveis globais.
c)Tambm existem constantes ("Const"), tipos ("Type"), procedimentos ("Procedure") e funes
("Function") locais.
d)Todos os parmetros so locais, por esta razo, no necessitam ter o mesmo nome das variveis
de chamada.
Program Exemplo;
Uses Crt;
Var
Base,Expoente,Resultado: Real;
Tecla: Char;
Procedure TROCA(Var x,y:Real);
Var temp: Real;
Begin
temp := x;

(* Var passagem por referncia *)

44

x := y;
y := temp;
End;
Function ELEVA (b,e: Real): Real;
Var pot: Real;
Begin
pot := exp(log(b)*e);
ELEVA := pot;
(* Sada da Funo *)
End;
Begin
Repeat
ClrScr;
WriteLn('Base: ');
Readln(Base);
WriteLn('Expoente: ');
Readln(Expoente);
Resultado := ELEVA(Base,Expoente);
WriteLn('Resultado: ',Resultado:7:2);
TROCA(Base,Expoente);
(* Chamada do Procedimento *)
Resultado := ELEVA(Base,Expoente);
(* Chamada da Funo *)
WriteLn('Resultado: ',Resultado:7:2);
WriteLn('Continua [S]im [N]o ? ';
Repeat
Tecla := ReadKey;
Until Tecla IN ['S','s','N','n'];
Until Tecla IN ['N','n'];
End.
Variveis Globais: Base, Expoente, Resultado e Tecla.
Variveis Locais:

- Procedure TROCA: x, y e temp.


- Funtion ELEVA: b, e, pot.

13.2 Parmetros
So todas as variveis que num procedimento ("Procedure") ou Funo ("Function") esto
entre parnteses. Existem parmetros de entrada e sada (so os mesmos, a diferena se so
alterados ou no).
Chamada: TROCA(Var x,y: Real); (* Procedimento *)

Entrada
e
Sada

x
y

TROCA

45

13.3 Passagem de Parmetros por Valor


Quando os parmetros passados para as funes ("Function") ou procedimentos
("Procedure") no alteram os valores das variveis de chamada, isto chamado passagem de
parmetro por Valor. No exemplo abaixo, "b" e "e" so passados por valor, logo no alteram as
variveis do programa principal.
Function ELEVA (b,e: Real): Real;
Var pot: Real;
Begin
pot := exp(log(b)*e);
ELEVA := pot;
End;

13.4 Passagem de Parmetros por Referncia


Quando os parmetros passados para as funes ("Function") ou procedimentos
("Procedure") alteram os valores das variveis de chamada, isto chamado passagem de parmetro
por Referncia. No exemplo abaixo, "x" e "y" so passados por referncia, logo alteram as variveis
do programa principal.
Procedure TROCA(Var x,y:Real);
Var temp: Real;
Begin
temp := x;
x := y;
y := temp;
End;

13.5 Function (Funes)


Mdulo desenvolvido pelo programador. Permite a criao de uma funo prpria. Pode ter
vrios parmetros de entrada (passagem por valor) e ou sada (passagem por referncia), mas
apenas um retorno de sada. O retorno dado pelo nome da funo, assim, pode-se considerar que
uma funo nada mais do que uma varivel.
Function nome_da_funo (parmetros: tipo): tipo_do_resultado;
Type
Const
Var varivel: tipo_do_resultado;
Begin
comandos;
nome_da_funo := varivel;
(* Retorno da Funo *)
46

End;

Entrada
e
Sada

x
y

Funo

Resultado

Retorno

13.6 Procedure (Procedimento)


Mdulo desenvolvido pelo programador. Permite a criao de um comando prprio. Pode ter
vrios parmetros de entrada e vrios de sada. Os parmetros podem ser alterados ou no. Permite
passagem de parmetros por valor ou por referncia.
Procedure nome_do_procedimento (parmetros: tipo);
Type
Const
Var
Begin
comandos;
End;

Entrada
e

x
y
z

Procedimento

Sada

Tipo A: O procedimento acima possui parmetros de entrada e sada.


x e y passagem por valor
z passagem por referncia

Entrada

x
y
z

Procedimento

Tipo B: O procedimento acima somente possui parmetros de entrada


x, y e z passagem por valor

47

a
Sada

Procedimento
b

Tipo C: O procedimento acima possui somente parmetros de sada


a e b passagem por referncia
Observao: Os parmetros de sada podem ser usados como parmetros de entrada.

Procedimento

Tipo D: O procedimento acima no possui parmetros.


Exemplos:
Program Comandos;
(* Procedimento Tipo B *)
Uses Crt;
Var
A,B,C: Real;
Tecla: Char;
Procedure BASCARA (a,b,c: Real);
Var delta,x1,x2,r,i: Real;
Begin
delta := sqr(b)-4*a*c;
(* Clculo do Determinante *)
If delta >= 0 then
(* Razes REAIS *)
Begin
x1 := (-b+sqrt(delta))/(2*a);
x2 := (-b-sqrt(delta))/(2*a);
WriteLn('x1 = ',x1:7:2);
WriteLn('x2 = ',x2:7:2);
Repeat Until KeyPressed;
End
Else
(* Razes COMPLEXAS *)
Begin
r := -b/(2*a);
i := sqrt(abs(delta))/(2*a);
WriteLn('x1 = ',r:7:2,' + ',i:7:2,' j');
WriteLn('x2 = ',r:7:2,' - ',i:7:2,' j');
Repeat Until KeyPressed;
48

End;
End;
Begin
Repeat
ClrScr;
WriteLn('Calcula Razes');
WriteLn;
WriteLn('Qual o valor de A: ');
Readln(A);
WriteLn('Qual o valor de B: ');
Readln(B);
WriteLn('Qual o valor de C: ');
Readln(C);
BASCARA(A,B,C);
Write('Continua [S]im ou [N]o ? ');
Repeat
Tecla := UpCase(ReadKey);
Until Tecla IN ['S','N'];
Until Tecla = 'N';
End.
Program Comandos;
(* Procedimento Tipo A *)
Uses Crt;
Var
A,B,C: Real;
Delta,R,I: Real;
X1,X2: Real;
Tecla: Char;
Procedure BASCARA (a,b,c: Real;VAR delta,r,i: Real);
Var delta,x1,x2,r,i: Real;
Begin
delta := sqr(b)-4*a*c;
(* Determinante *)
r := -b/(2*a);
(* Parte Real *)
i := sqrt(abs(delta))/(2*a);
(* Parte imaginaria *)
End;
Begin
Repeat
ClrScr;
WriteLn('Calcula Raizes');
WriteLn;
WriteLn('Qual o valor de A: ');
Readln(A);
WriteLn('Qual o valor de B: ');
Readln(B);
WriteLn('Qual o valor de C: ');
Readln(C);
BASCARA(A,B,C,Delta,R,I);
49

If Delta >= 0 then (* Raizes REAIS *)


Begin
X1 := r+i;
X2 := r-i;
WriteLn('x1 = ',X1:7:2);
WriteLn('x2 = ',X2:7:2);
Repeat Until KeyPressed;
End
Else
(* Raizes COMPLEXAS *)
Begin
WriteLn('x1 = ',R:7:2,' + ',I:7:2,' j');
WriteLn('x2 = ',R:7:2,' - ',I:7:2,' j');
Repeat Until KeyPressed;
End;
Write('Continua [S]im ou [N]o ? ');
Repeat
Tecla := UpCase(ReadKey);
Until Tecla IN ['S','N'];
Until Tecla = 'N';
End.

14. Arquivos
a
Ponteiro

a
b,c,d
e,f,g,h

3
:

Identificao do Registro
Campos
Registros

a) Um arquivo formado por registros;


b) Cada registro formado de campos;
c) O arquivo possui um nome (8 caracteres para o nome mais 3 caracteres para a extenso), este
nome chamado de nome externo (DOS);
d) Cada registro possui um ndice interno e o arquivo possui um ponteiro que indica a posio atual
do arquivo;
e) Quando o arquivo aberto ("Reset") ou criado ("ReWrite") o ponteiro aponta para o registro
ZERO;
50

f) A cada leitura ou gravao o ponteiro aponta para o prximo registro (Acesso seqencial);
g) Pode-se ainda, apontar para qualquer registro (Acesso Randmico) atravs do procedimento
Seek.

Tipos de Arquivos:
Texto
Tipo de Arquivo formado de caracteres organizados em linhas. No final de cada linha
existem dois caracteres de controle LF (#10) + CR (#13).
Como Definir:
Var Arquivo: Text;
Reg: Char;

(* ou Arquivo: File Of Char; *)


(* Reg a varivel que representa o registro *)

Binrio
Tipo de Arquivo usado para armazenar tipos de dados diferentes.
Type Registro = Record
Nome: String[30];
Idade: Byte;
Salrio: Real;
End;
Var Arquivo: File Of Registro;
Reg: Registro;

14.1 Procedimentos
14.1.1 Assign
Procedimento que associa o nome externo do arquivo (DISCO) ao nome interno do
arquivo dentro do programa (File Of).
Modo de Usar: Assign(Arq: File Of ..., nome_arquivo: String[]);
Exemplo: Arquivo Genrico
Var

Arq: File Of Byte;


Reg: Byte;
Nome_arquivo: String[14];

Begin
51

ClrScr;
Write('Informe o Nome do Arquivo: ');
Readln(Nome_arquivo);
Assign(Arq,Nome_arquivo);
ou
Exemplo: Arquivo Especfico
Var

Arq: File Of Integer;


Reg: Integer;

Begin
ClrScr;
Assign(Arq,'B:\FILES\AGENDA.DAT');

(* Drive:\Path\Nome *)

14.1.2 Close
Procedimento que permite fechar um arquivo.
Modo de Usar: Close(Arq: File Of ...);

14.1.3 Erase
Procedimento que permite deletar um arquivo no disco.
Modo de Usar: Erase(drive: Arq: File Of ...);

14.1.4 Read
Procedimento que permite ler campos ou registros do arquivo contido no disco.
Modo de Usar: Read(Arq: File Of ..., registro ou campo);

14.1.5 Write
Procedimento que permite gravar campos ou registros no arquivo contido no disco.
Modo de Usar: Write(Arq: File Of ..., registro ou campo);

14.1.6 ReName
Procedimento que permite renomear o arquivo no disco.

52

Modo de Usar:ReName(drive:Arq: File Of ..., novo_nome_para_o_arquivo);

53

14.1.7 Reset
Procedimento que permite abrir de um arquivo.
Modo de Usar: Reset(Arq: File Of ...);
Na abertura de um arquivo, deve ser verificado sua existncia, pois se o arquivo no existir
haver um erro em tempo de execuo (Run Time Error), e o programa ser abortado, para que isto
no acontea feito o seguinte:
Program Exemplo;
Uses Crt;
Var
Arq: File Of Integer;
Reg; Integer;
Nome_arquivo: String[14];
Begin
ClrScr;
Write('Nome do Arquivo: ');
ReadLn(Nome_arquivo);
Assign(Arq,Nome_arquivo);
{$I-} Reset(Arq) {$I+};
Observao: {$I-} e {$I+} so diretivas de compilao que foram o compilador a no abortar se
houver um erro em tempo de execuo (RunTime Error), fazendo ainda com que a varivel prdefinida "IoResult" retorne com a informao se houve erro ou no da seguinte maneira:
IoResult = 0
IoResult <> 0

Arquivo EXISTE
Arquivo NO EXISTE

If IoResult = 0 Then
WriteLn('Arquivo EXISTE')
Else
WriteLn('ERRO: Arquivo NO EXISTE')

14.1.8 ReWrite
Procedimento que permite criar um arquivo em disco, se o arquivo no existe, criado, se
existe apagado, e o ponteiro do arquivo posicionado no registro zero.
Modo de Usar: ReWrite(Arq: File Of ...);

14.1.9 Seek

54

Procedimento que permite posicionar o ponteiro do arquivo no registro especificado


(Acesso Randmico).
Modo de Usar: Seek(Arq: File Of ..., nmero_do_registro);

14.2 Funes
14.2.1 EOF (End Of File)
Funo que retorna TRUE se o ponteiro do arquivo chegou ao fim do arquivo, FALSE
enquanto no for fim de arquivo.
Modo de Usar: EOF(Arq: File Of ...): Boolean;

14.2.2 FilePos
Funo que retorna a posio do registro corrente, ou seja, a posio do ponteiro no arquivo
(o primeiro registro Zero).
Modo de Usar: FilePos(Arq: File Of ...): Integer;

14.2.3 FileSize
Funo que retorna o nmero de registros do arquivo, "zero" se no existir nenhum registro.
Modo de Usar: FileSize(Arq: File Of ...): Integer;

14.2.4 SizeOf
Funo que retorna o nmero de bytes ocupado por uma varivel.
Modo de Usar: SizeOf(tipo ou varivel): Word;

14.3 Como Definir um Registro


Uses Crt;
Type REGISTRO = Record
Nome: String[40];
Idade: Byte;
Fone: String[12];
End;
Var
Arq: File Of REGISTRO;
(* Definio do Arquivo Interno *)
55

Reg: REGISTRO;
Nome_do_arquivo: String[14];
Ch: Char;

(* Definio do Registro *)

Begin
ClrScr;
Write('Nome do Arquivo: ');
ReadLn(Nome_do_arquivo);
Assign(Arq,Nome_do_arquivo);
{$I-} Reset(Arq) {$I+};
If IoResult <> 0 Then
Begin
ReWrite(Arq);
Repeat
Write('Nome: ');
ReadLn(Reg.nome);
Write('Idade: ');
ReadLn(Reg.idade);
Write('Fone: ');
ReadLn(Reg.idade);
Write(Arq,Reg);
(* Grava um Registro no Disco *)
Write('Continua [S]im ou [N]o ? ');
Repeat
Ch := UpCase(ReadKey);
Until Ch IN ['S','N'];
Until Ch ='N';
End
Else
WriteLn('ERRO: Arquivo EXISTE')
Close(Arq);
End.

15. Grficos
15.1 Placas Grficas
15.1.1 CGA
Resoluo:

640x200 alta resoluo (2 cores)


320x200 baixa resoluo (4 cores)

Observao: Palette um conjunto de cores disponveis, sendo que na placa CGA possui 16 cores.

15.1.2 EGA
56

Resoluo:

640x350 alta resoluo (16cores, 2 pgs. grficas)


640x200 baixa resoluo (16 cores, 4 pgs. grficas)

15.1.3 VGA
Resoluo:

640x480 alta resoluo (16 cores, 1 pgina)


640x350 mdia resoluo (16 cores, 2 pginas. grficas)
640x200 baixa resoluo (16 cores, 4 pginas. grficas)

15.2 Coordenadas de Tela


15.2.1 CGA
x
y

0 639 ou 319
0 199

15.2.2 EGA
x
y

0 639 ou 319
0 199 ou 349

15.2.3 VGA
x
y

0 639 ou 319
0 199, 349 ou 479

15.3 Deteco e Inicializao da Tela Grfica


Para sair do modo texto e inicializar o modo Grfico, o programador deve definir duas
variveis: Placa e Modo (podem ter qualquer nome).
Placa: a varivel responsvel pelo tipo de placa a ser usada. Pode assumir os seguintes tipos:
Nmero

Nome

0
1
2
3
4
5
6

DETECT
CGA
MCGA
EGA
EGA64
EGAMONO
IBM8514
57

7
8
9
10

HERCMONO
ATT400
VGA
PC3270

Modo: responsvel pelo modo da placa (alta, mdia ou baixa resoluo):


CGAC0
CGAC1
CGAC2
CGAC3
CGAHi
EGALo
EGAHi
VGALo
VGAMed
VGAHi

(320 x 200) 4 cores, 1 pgina grfica


(320 x 200) 4 cores, 1 pgina grfica
(320 x 200) 4 cores, 1 pgina grfica
(320 x 200) 4 cores, 1 pgina grfica
(640 x 200) sem cor, 1 pgina grfica
(640 x 200) 16 cores, 4 pginas grficas
(640 x 350) 16 cores, 2 pginas grficas
(640 x 200) 16 cores, 4 pginas grficas
(640 x 350) 16 cores, 2 pginas grficas
(640 x 480) 16 cores, 1 pginas grficas

Program Detecta_Placa;
Uses Crt,Graph;
Var Placa,Modo: Integer;
Begin
Placa := DETECT;
InitGraph(Placa,Modo,'');
(* Procura Arquivos BGI no Diretrio Corrente *)
If GraphResult <> GrOk then
WriteLn('ERRO: Inicializao Grfica');
ou
Program Seta_Placa_VGA;
Uses Crt,Graph;
Var Placa,Modo: Integer;
Begin
Placa := VGA;
(* Placa VGA *)
Modo := VGAHI;
(* Modo 640 x 480, 16 cores *)
InitGraph(Placa,Modo,'D:\\TP\\BGI');
(* Path dos Arquivos *.BGI *)
If GraphResult <> GrOk then
WriteLn('ERRO FATAL: Inicializao Grfica');

15.4 PutPixel (Pontos)


PutPixel: Procedimento que permite plotar um pixel (ponto ) na tela grfica.
Modo de Usar: PutPixel(x,y: Integer; Cor_Pixel: Word);
Program Pontos;
58

Uses Crt,Graph;
Var
Placa,Modo: Integer;
X,Y: Integer;
Cor: Byte;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
(* Procura arquivos *.BGI no diretrio corente *)
Randomize;
Repeat
X := Random(640);
Y := Random(480);
Cor := Random(16);
PutPixel(X,Y,Cor);
Until KeyPressed;
CloseGraph;
End.

15.5 Line (Linhas)


Line: Procedimento que permite plotar uma linha atravs de dois pontos, Pi (Xi,Yi) e Pf (Xf,Yf).
Modo de Usar: Line(Xi,Yi,Xf,Yf: Integer);
Program Retas;
Uses Crt,Graph;
Var
Placa,Modo: Integer;
Xi,Yi,Xf,Yf: Integer;
Cor: Byte;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
Randomize;
Repeat
Xi := Random(640);
Yi := Random(480);
Xf := Random(640);
Yf := Random(480);
Cor := Random(16);
SetColor(Cor);
Line(Xi,Yi,Xf,Yf);
Until KeyPressed;
CloseGraph;
End.
59

15.6 Rectangle (Retngulos)


Rectangle: Procedimento que permite plotar um retngulo na tela grfica atravs de dois pontos, Pi
(Xi,Yi) e Pf (Xf,Yf), estes dois pontos representam a diagonal do retngulo.
Modo de Usar: Rectangle(Xi,Yi,Xf,Yf: Integer);
Program Retangulos;
Uses Crt,Graph;
Var
Placa,Modo: Integer;
Xi,Yi,Xf,Yf: Integer;
Cor: Byte;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
Repeat
Xi := Random(640);
Yi := Random(480);
Xf := Random(640);
Yf := Random(480);
Cor := Random(16);
SetColor(Cor);
Rectangle(Xi,Yi,Xf,Yf);
Until KeyPressed;
CloseGraph;
End.

15.7 Circle (Crculos)


Circle: Procedimento que permite plotar um crculo na tela grfica, atravs de um ponto central
(Xc,Yc) e um Raio.
Modo de Usar: Circle(Xc,Yc: Integer; Raio: Word);
Program Circulos;
Uses Crt,Graph;
Var
Placa,Modo: Integer;
Xc,Yc: Integer;
Cor,Raio: Word;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
Repeat
60

Xc := Random(640);
Yc := Random(480);
Cor := Random(16);
Raio := Random(100);
SetColor(Cor);
Circle(Xc,Yc,Raio);
Until KeyPressed;
CloseGraph;
End.

61

15.8 Arc (Arcos)


Arc: Procedimento que permite plotar um arco na tela grfica, atravs de um ponto central (Xc,Yc),
um Raio e dois ngulos (Inicial e Final).
Modo de Usar:Arc(Xc,Yc: Integer; Ang_Inic, Ang_Fim: Word; Raio:Word);
Program Arcos;
Uses Crt,Graph;
Var
Placa,Modo: Integer;
Xc,Yc: Integer;
Ang_Inic,Ang_Fim: Word;
Raio,Cor: Word;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
Repeat
Xc := Random(640);
Yc := Random(480);
Ang_Inic := Random(360);
Ang_Fim := Random(360);
Cor := Random(16);
Raio := Random(100);
SetColor(Cor);
Arc(Xc,Yc,Ang_Inic,Ang_Fim,Raio);
Until KeyPressed;
CloseGraph;
End.

15.9 DrawPoly (Polgonos)


DrawPoly: Procedimento que permite plotar um polgono na tela grfica, atravs de n pontos
(P1,P2,...Pn).
Procedimento: DrawPoly(Nmero_de_Pontos: Word; Vetor_de_pontos);
Program Boneco;
Uses Crt, Graph;
Const Rosto: Array[1..9,1..2] of Integer = ((109,149),(209,149),(259,124), (259, 74),
(209, 39),(109, 39),( 59, 74),( 59,124),(109,149));
Var Placa,Modo: Integer;
Begin
Placa := VGA;
Modo := VGAHI;
62

InitGraph(Placa,Modo,'');
(* ------------------------------------ rosto *)
DrawPoly(9,Rosto);
(* ------------------------------------ olho esquerdo *)
Circle(109,74,7);
(* ------------------------------------ olho direito *)
Circle(209,74,7);
(* ------------------------------------ nariz *)
Circle(159,99,15);
(* ------------------------------------ boca *)
Rectangle(109,120,209,128);
(* ------------------------------------ orelha esquerda *)
Arc(59,99,90,270,20);
(* ------------------------------------ orelha direita *)
Arc(259,99,270,90,20);
(* ------------------------------------ cabelos *)
Arc(139,39,0,105,20);
Arc(179,39,75,180,20);
Repeat Until KeyPressed;
CloseGraph;
End.

15.10 Cores (SetColor e SetBkColor)


SetColor: Procedimento que permite a mudana da cor de frente (ForeGround).
Modo de Usar: SetColor(nmero ou nome_cor: Word);
SetBkColor: Procedimento que permite mudana da cor de fundo (BackGround).
Modo de Usar: SetBKColor(nmero ou nome_cor: Word);
GetColor: Funo que retorna a cor de frente corrente.
Modo de Usar: GetColor: Word;
GetBkColor: Funo que retorna a cor de fundo corrente.
Modo de Usar: GetBKColor: Word;

15.11 OutTextXY e SetTextStyle (Textos)


SetTextStyle: Modifica o tipo de caracter (Fonte), direo e o tamanho do texto.
Modo de Usar: SetTextStyle(fonte, direo, tamanho: Word);
63

Nmero

Fontes

Direes

Tamanhos

0
1
2
3
4

DefaultFont
TriplexFont
SmallFont
SansSerifFont
GothicFont

HorizDir
VertDir

0
1
2
:
10

OutTextXY: Permite que um texto seja escrito na tela grfica na posio P (x,y).
Modo de Usar: OutTextXY(X,Y: Integer; Texto: String[]);
Program Texto;
Uses Crt; Graph;
Var Placa,Modo: Integer;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
SetBkColor(Cyan);
Bar(0,0,639,479);
SetColor(Blue);
SetTextStyle(GothicFont,HorizDir,5);
OutTextXY(100,100,'Turbo Pascal V5.5');
Repeat Until KeyPressed;
End.

15.12 Preenchimento (pintura)


15.12.1 Retngulos
Bar: Usado para pintar um retngulo. Antes, deve-se definir o estilo de preenchimento, usando
SetFillStyle.
Modo de Usar: Bar(Xi,Yi,Xf,Yf: Word);
SetFillStyle: Usado para escolher o estilo de preenchimento.
Modo de Usar: SetFillStyle(estilo: Byte; cor: Byte);
Nmero

Estilos

0
1

EmptyFill
SolidFill

(Preenche com a cor de fundo)

64

2
3
4
5
6
7
8
9
10
11
12

LineFill
LTSlashFill
SlashFill
BKSlashFill
LTBKSlashFill
HatchFill
XhatchFill
InterLeaveFill
WideDotFill
CloseDotFill
UserFill

Program ESTILOS;
Uses Crt, Graph;
Var
Placa,Modo: Integer;
Estilo: Byte;
Cor: Byte;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
For Estilo := 1 to 12 do
Begin
Cor := 1 + Random(15);
SetFillStyle(Estilo,a);
Bar(0,0,100,100);
ReadLn;
End;
CloseGraph;
End.

15.12.2 Polgonos
a) FillPoly: usado para pintar um polgono, usando o estilo definido pelo procedimento
SetFillStyle. Este procedimento preenche qualquer polgono fechado, se o polgono estiver aberto
este procedimento preenche at encontrar um objeto fechado.
Modo de Usar: FillPoly(Estilo: Byte; Cor: Byte);
Program Preenche_Polgono;
Uses Crt, Graph;
Const Objeto: Array[1..5,1..2] of Integer = ((159,0),(0,50),(159,199),(319,50),(159,0));
Var
Placa,Modo: Integer;
Estilo: Byte;
Begin
Placa := VGA;
65

Modo := VGAHI;
InitGraph(Placa,Modo,'');
DrawPoly(5,objeto);
(* Plota Polgono Vazado*)
Repeat Until KeyPressed;
For Estilo := 0 to 12 do
Begin
SetFillStyle(Estilo,YELLOW);
(* Define Estilo e Cor *)
FillPoly(5,Objeto);
(* Pinta Polgono *)
ReadLn;
End;
CloseGraph;
End.
b) FloodFill: usado para preencher um polgono, usando o estilo definido pelo procedimento
SetFillStyle. O preenchimento parte de um ponto central Pc (Xc,Yc) do objeto e preenche ao redor
deste ponto at encontrar uma borda com a cor especificada (funo recursiva).
Modo de Usar: FloodFill(Xc,Yc: Integer; Cor_da_Borda: Word);
Program Rosa_dos_Ventos;
Uses Crt, Graph;
Const Pontos = 17;
Rosa: Array[1..pontos,1..2] of Integer = ((159,0),(189,49),(279,24),(239,72),(319,99),
(239,123),(279,173),(189,149),(159,199),(109,149), (39,173),(79,123),
(0,99),(79,72),(39,24),(109,49),(159,0));
Var

Placa,Modo: Integer;
Estilo: Byte;

Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
SetColor(YELLOW);
DrawPoly(Pontos,Rosa);
Circle(159,99,20);
SetFillStyle(SOLID_FILL,BLUE);
FloodFill(10,99,YELLOW);
ReadLn;
CloseGraph;

(* Cor da borda *)
(* Imprime Rosa dos Ventos *)
(* Imprime Crculo *)
(* Define Estilo e Cor de Preenchimento *)
(* Preenche a partir do ponto 10,99 *)

End.

15.13 Ativao de Janelas Grficas


15.13.1 Janela Ativa
66

SetViewPort: Procedimento define uma janela ativa

(0,0)
(xi,yi)

(xf,yf)

(Xmax,Ymax)
Modo de Usar: SetViewPort(Xi,Yi,Xf,Yf: Integer; Recorta: Boolean);
Pi (Xi,Yi): Ponto Inicial
Pf (Xf,Yf): Ponto Final
Recorta: TRUE ou FALSE (Varivel que indica se haver recorte na janela ou no).
Program Janela_Ativa_com_Recorte;
Uses Crt,Graph;
Const ENTER = #13;
ESC = #27;
UP = #72;
DOWN = #80;
LEFT = #75;
RIGHT = #77;
Var
Placa,Modo: Integer;
X,Y: Integer;
Tecla: Char;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
SetFillStyle(SOLID_FILL,GREEN);
Bar(0,0,639,479);
SetViewPort(19,19,300,180,TRUE); (* Teste o programa usando FALSE *)
SetColor(RED);
ClearViewPort;
(* Limpa Janela Ativa *)
X := 319;
Y := 239;
Repeat
SetColor(RED);
Rectangle(X,Y,X+10,Y+10);
Tecla := ReadKey;
SetColor(BLACK);
67

Rectangle(X,Y,X+10,Y+10);
Case Tecla
Of
UP: Dec(Y,5);
DOWN: Inc(Y,5);
LEFT: Dec(X,5);
RIGHT: Inc(X,5);
End;
Until Tecla IN [ENTER,ESC];
End.

15.13.2 Limpar Janela Ativa


ClearViewPort: Procedimento que limpa, com a cor de fundo, a janela ativada pelo procedimento
SetViewPort, se nenhuma janela for ativada, por falta (default), a janela ativa toda a tela.
Modo de Usar: ClearViewPort;

15.13.3 Salvar e Recuperar Janelas Grficas


GetImage e PutImage: Quando necessrio colocar janelas sobrepostas na tela, deve-se antes de
exibir a janela, salvar o local onde a janela ser exibida. Para salvar e recuperar (respectivamente)
janelas so usados os seguintes procedimentos:
Modo de Usar: GetImage(Xi,Yi,Xf,Yf: Word; Var P: Pointer);
Modo de Usar: PutImage(Xi,Yi: Word; P: Pointer; Modo: Word);
Nmero

Modos

Funo

0
1
2
3
4

CopyPut
XorPut
OrPut
AndPut
NotPut

{ Mov }
{ XOr }
{ Or } ou NormalPut
{ And }
{ Not }

Para definir o ponteiro, que ir conter os pixels da tela, necessrio saber a quantidade de
bytes (poro de memria) para salvar a janela grfica, isto feito da seguinte maneira:
ImageSize: Retorna o nmero de bytes necessrios para conter a janela definida pelos pontos Pi
(Xi,Yi) e Pf (Xf,Yf).
Modo de Usar: ImageSize(Xi,Yi,Xf,Yf: Word): Word;
GetMem: Procedimento que faz alocao dinnica de memria para o ponteiro p, o qual ocupar n
bytes na memria.
68

Modo de Usar: GetMem(Var P: Pointer; Nmero_Bytes: Word);


FreeMem: Procedimento que libera a rea de memria ocupada pelo ponteiro p.
Modo de Usar: FreeMem(P: Pointer; Nmero_Bytes: Word);
Program Janelas;
Uses Crt,Graph;
Type TIPO = String[20];
Var
Placa,Modo: Integer;
P: Array[1..5] of Pointer;
Cor: Byte;
Num_Bytes: Array[1..5] of Word;
Procedure Moldura(xi,yi,xf,yf:Word; cor_frente,cor_fundo:Byte);
Begin
SetColor(cor_fundo);
SetFillStyle(SolidFill,cor_fundo);
Bar(xi,yi,xf,yf);
SetColor(cor_frente);
Rectangle(xi,yi,xf,yf);
Rectangle(xi+2,yi+2,xf-2,yf-2);
End;
Procedure Salva_Janela(janela,xi,yi,xf,yf: Word);
Begin
Num_Bytes[janela] := ImageSize(xi,yi,xf,yf);
GetMem(p[janela],Num_Bytes[janela]);
GetImage(xi,yi,xf,yf,P[janela]^);
End;
Procedure Restaura_Janela(janela,xi,yi,xf,yf: Word);
Begin
SetFillStyle(0,BLACK);
Bar(xi,yi,xf,yf);
PutImage(xi,yi,P[janela]^,NormalPut);
FreeMem(p[janela],Num_Bytes[janela]);
End;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
SetFillStyle(SOLID_FILL,BLACK);
Bar(0,0,639,479);
69

Salva_Janela(1,10,10,100,50);
Moldura(10,10,100,50,0,1);
ReadLn;
Salva_Janela(2,30,30,130,80);
Moldura(30,30,130,80,1,2);
ReadLn
Salva_Janela(3,50,50,150,100);
Moldura(50,50,150,100,2,3);
ReadLn;;
Restaura_Janela(3,50,50,150,100);
ReadLn;
Restaura_Janela(2,30,30,130,80);
ReadLn;
Restaura_Janela(1,10,10,100,50);
ReadLn;
CloseGraph;
End.

16. Criao de Unidades (Units)


Uma unidade um conjunto de procedimentos e funes, que podem ser usados por
qualquer programa.

16.1 Como Criar uma Unidade


O programador pode definir suas prprias unidades Units. Por exemplo: Uses Crt,Graph;
que so unidades do "Turbo Pascal 5.5". A definio de uma unidade feita da seguinte maneira:
Unit nome_da_unidade;
Interface
Uses
Const
Type
Var
Procedure
Procedure ...
Function
Function

(* Cabealho de todos os Mdulos *)

Implementation
Procedure
70

Const
Type
Var
Begin
comandos;
End;
Function
Const
Type
Var
Begin
comandos;
End;
End.
Observao: Uma unidade um programa Fonte Pascal sem programa principal. Possui extenso
"nome.PAS" e aps compilada, "nome.TPU". A vantagem de uma unidade definida pelo
programador que permite que as "procedure" e "function" sejam usadas em qualquer programa.

16.2 Exemplo de Criao de uma Unidade:


Unit Luzzardi;
Interface
Uses Crt;
Type TIPO = String;
Function Pot(x,y: Real): Real;
Procedure Troca(VAR x,y: Real);
Procedure Imprime_String(c,l: Byte; s: String);
Procedure Moldura_Simples(xi,yi,xf,yf: Byte);
Procedure Imprime_Char(c,l: Byte; ch: Char);
Procedure Moldura_Dupla(xi,yi,xf,yf: Byte);
Procedure Limpa_Area(xi,yi,xf,yf: Byte; cor: Byte);
Procedure Entrada(c,l,t: Byte; VAR nome: TIPO; mensagem: TIPO);
Implementation
(* ----------------------------------- Pot *)
Function Pot(x,y: Real): Real;
Begin
Pot := Exp(Ln(x)*y);
71

End;
(* ---------------------------------- Troca *)
Procedure Troca(VAR x,y: Real);
Var temp: Real;
Begin
temp := x;
x := y;
y := temp;
End;
(* ---------------------------------- Imprime_String *)
Procedure Imprime_String(c,l: Byte; s: String);
Begin
GotoXY(c,l);
Write(s);
End;
(* ---------------------------------- Imprime_Char *)
Procedure Imprime_Char(c,l: Byte; ch: Char);
Begin
GotoXY(c,l);
Write(ch);
End;
(* ---------------------------------- Moldura_Dupla *)
Procedure Moldura_Dupla (xi,yi,xf,yf: Byte);
Var c,l: Byte;
Begin
For c := xi to xf do
Begin
Imprime_Char(c,yi,#205);
Imprime_Char(c,yf,#205);
End;
For l := yi to yf do
Begin
Imprime_Char(xi,l,#186);
Imprime_Char(xf,l,#186);
End;
Imprime_Char(xi,yi,#201);
Imprime_Char(xf,yi,#187);
Imprime_Char(xf,yf,#188);
72

Imprime_Char(xi,yf,#200);
End;
(* ------------------------------------ Moldura_Simples *)
Procedure Moldura_Simples (xi,yi,xf,yf: Byte);
Var c,l: Byte;
Begin
For c := xi to xf do
Begin
Imprime_Char(c,yi,#196);
Imprime_Char(c,yf,#196);
End;
For l := yi to yf do
Begin
Imprime_Char(xi,l,#179);
Imprime_Char(xf,l,#179);
End;
Imprime_Char(xi,yi,#218);
Imprime_Char(xf,yi,#191);
Imprime_Char(xf,yf,#217);
Imprime_Char(xi,yf,#192);
End;
(* -------------------------------- Limpa_Area *)
Procedure Limpa_Area(xi,yi,xf,yf: Byte; cor: Byte);
Begin
TextColor(cor);
Window(xi,yi,xf,yf);
ClrScr;
Window(1,1,80,25);
End;
(* --------------------------- Entrada *)
Procedure Entrada(c,l,t: Byte; Var nome: TIPO; mensagem: TIPO);
Var
ch: Char;
tam,col,i: Byte;
Begin
nome := '';
Gotoxy(c,l);
Write(mensagem,nome);
tam := Length(mensagem);
col := c+tam;
Gotoxy(col,l);
73

i := 1;
Repeat
Repeat
ch := ReadKey;
Until ch IN [#65,#90,#97,#122,#13,#8,#75,#27,#32];
If ch IN [#8,#75] Then
Begin
If i >= 2 Then
Begin
Delete(nome,length(nome),1);
col := col-1;
Imprime_Char(col,l,' ');
Gotoxy(col,l);
i := i-1;
End;
End
Else
If (ch <> #13) and (ch <> #27) Then
Begin
Imprime_Char(col,l,ch);
col := col+1;
nome := nome+ch;
i := i+1;
End;
Until (ch In [#13, #27,]) Or (i >= t);
End;
End.

16.3 Exemplo de Programa que usa a Unidade Criada:


Uses Crt,Luzzardi;
Var
Nome: TIPO;
I: Byte;
Begin
Limpa_Area(1,1,80,25,WHITE);
Moldura_Simples(5,3,35,22);
Moldura_Dupla(45,3,75,22);
Entrada(6,5,20,Nome,'Nome: ');
Imprime_String(50,5,Nome);
GotoXY(50,7);
For I := 1 to Length(Nome) do
Begin
Imprime_Char(49+I,7,Nome[I]);
ReadLn;
End;
74

ReadLn;
End.
Observao: Para executar o programa e, obrigar que a unidade seja compilada novamente, deve-se
compilar com a opo Build do menu Compile.

17. Memria de Vdeo


Em Pascal, pode-se escrever direto na memria de vdeo sem ser atravs do comando Write
ou WhiteLn, isto feito endereando um vetor de 4000 bytes a partir do endereo $B800:0000 que
o incio da tela de texto (endereo na placa de vdeo), isto feito da seguinte maneira: a primeira
posio da tela p[0], a segunda p[2], pois p[1] e o atributo de cor do primeiro caracter. Para
calcular a posio no vetor unidimensional atravs da coluna e linha o seguinte:

80 colunas
1 2
1 0 2 4
2

80

25 linhas

25

Localizao na Memria de Vdeo


posio := 160 * (linha - 1) + 2 * (coluna - 1);

Atributo de COR: (1 Byte)


7

Fundo

Frente

P: Caracter Piscante (Bit 7)


Fundo: Cor do Fundo (Bits: 6,5,4)
I: Intensidade da Cor (Bit 3)
75

Frente: Cor de Frente (Bits: 2,1,0)


Program Memoria_Video;
Uses Crt;
Var

Video: Array[0..3999] of Char Absolute $B800:0000;


C,L: Byte;
Ch: Char;

(* ------------------------ Imprime *)
Procedure Imprime_Caracter(c,l: Byte; caracter: Char);
Var posicao: Word;
Begin
posicao := 160 * (l - 1) + 2 * (c - 1);
Video[posicao] := caracter;
End;
Begin
Repeat
For L := 1 To 24 Do
For C := 1 To 80 Do
Begin
GotoXY(C,L);
Write('A');
End;
Ch := ReadKey;
For L := 1 To 24 Do
For C := 1 To 80 Do
Imprime_Caracter(C,L,'B');
Until KeyPressed;

(* Imprime na Memria *)

End.

18. Passagem de Parmetros pela Linha de Comandos


do Sistema Operacional
Objetivo: Desenvolver programas que interagem com o Sistema Operacional, atravs de
parmetros.

Variveis Pr-Definidas
ParamCount: Armazena o nmero de parmetros da linha de comandos

76

ParamStr(n): Armazena a lista de strings da linha de comandos


Onde: n o ndice da string (0 at ParamCount)
C:\>Inverte PELOTAS
SATOLEP
C:\_
Onde: ParamCount = 1
ParamStr(0) = 'A:\INVERTE.EXE'
ParamStr(1) = 'PELOTAS'
Objetivo do Programa: Recebe uma string qualquer pela linha de comandos do Sistema
Operacional e a inverte.
Uses Crt;
Var
I,N: Byte;
S: String;
Begin
ClrScr;
If ParamCount <> 1 Then
WriteLn('Sintaxe: INVERTE <palavra>')
Else
Begin
S := ParamStr(1);
N := Length(S);
For I := N DownTo 1 Do
Write(S[I]);
End;
End.
A:\>lista LISTA.PAS
Onde: ParamCount = 1
ParamStr(0) = 'A:\LISTA.EXE'
ParamStr(1) = 'LISTA.PAS'
Objetivo do Programa: Recebe o nome de um arquivo texto, abre o arquivo e lista o contedo na
tela, numerando as linhas e parando quando a tela est cheia.
Uses Crt;
Var

Arq: File Of Char;


Reg: Char;
N: Byte;
Linha: Word;
77

N_Car: LongInt;
Begin
ClrScr;
If ParamCount <> 1 Then
WriteLn('Sintaxe: LISTA <nome_do_arquivo>')
Else
Begin
Assign(Arq,ParamStr(1));
{$I-} Reset(Arq) {$I+};
If IoResult <> 0 Then
WriteLn('ERRO: Arquivo No Existe')
Else
Begin
Linha := 1;
N := 1;
Read(Arq,Reg);
Write(Linha:3,': ');
While Not(Eof(Arq)) Do
Begin
Write(Reg);
If Reg = #13 Then
Begin
Inc(N);
Write(Linha:3,': ');
Inc(Linha);
If N = 23 Then
Begin
WriteLn;
WriteLn;
Write('Arquivo: ',ParamStr(1));
Write(' - Tecle <ENTER>');
ReadLn;
ClrScr;
End;
End;
Read(Arq,Reg);
End;
Close(Arq);
End;
End;
End;
End.
C:\>procura UNIVERSIDADE E
UNIVERSIDADE possui 2 letras E
C:\>_
78

Onde: ParamCount = 2
ParamStr(0) = 'A:\PROCURA.EXE'
ParamStr(1) = 'UNIVERSIDADE'
ParamStr(2) = 'E'
Objetivo do Programa: Recebe uma palavra e uma letra e verifica quantas vezes a letra est
presente dentro da palavra
Uses Crt;
Var
S,Saux: String;
Letra: Char;
I,N,T: Byte;
Begin
ClrScr;
If ParamCount <> 2 Then
WriteLn('Sintaxe: PROCURA <Palavra> <Letra>')
Else
Begin
S := ParamStr(1);
Saux := ParamStr(2);
Letra := Saux[1];
N := Length(S);
T := 0;
For I := 1 To N Do
If S[i] = Letra Then
Inc(T);
WriteLn(S,' possui ',T,' letras ',Letra);
End;
End.

19. Ponteiros (Varivel que Aponta)


19.1 Tipos de Alocao de Memria
19.1.1 - Alocao Esttica de Memria
Tipo de alocao de memria onde cada varivel global possui um nmero definido de
bytes alocados (reservados) na memria, no podendo ser aumentado ou diminudo durante todo o
programa.
Exemplo:
Var

x: Byte;

(* 1 byte alocado na memria *)


79

y: Integer;

(* 2 bytes alocados na memria *)

19.1.2 - Alocao Dinmica de Memria


Tipo de alocao onde cada varivel possui um nmero indefinido de bytes alocados na
memria, podendo ser alocado ou desalocado a qualquer momento com qualquer tamanho. Para
isto, necessrio usar uma varivel do tipo Ponteiro. As variveis locais so alocadas
dinamicamente.
Observao: Um ponteiro uma varivel que ocupa 4 bytes
Definio: Var nome_do_ponteiro: ^tipo_base;
Exemplo: Var p: ^Integer;

(* p aponta para um inteiro [2 Bytes] *)

Alocao: Espao reservado na memria RAM

Alocar um Ponteiro
New(p);
Procedimento que aloca memria do tamanho do tipo_base;
Exemplo:

New(p);
If p = Nil Then
WriteLn('ERRO: Falta de Memria')
Else
WriteLn('Ok, Ponteiro Alocado');

Nil: Palavra reservada que representa ponteiro nulo, ou seja, ponteiro no aponta para nada.
Desalocao: Liberao de espao alocado na memria

Desalocar o Ponteiro
Dispose(p);
Procedimento que desaloca a memria alocada pelo procedimento New(p);

Alocar uma rea


GetMem(p,nmero_de_bytes);
Procedimento que aloca uma rea com "n" bytes
80

Exemplo:
Uses Crt;
Var
P: ^Integer;
N: Byte;
Num_Bytes: Word;
Begin
ClrScr;
Write("Nmero de Elementos: ');
ReadLn(N);
Num_Bytes := N * SizeOf(Integer); (* Calcula o Nmero de Bytes *)
GetMem(P,Num_Bytes);
If P = Nil Then
WriteLn('ERRO: Falta de Memria')
Else
WriteLn('Ok, Ponteiro Alocado');

Desalocar uma rea


FreeMem(p,nmero_de_bytes);
Procedimento que desaloca uma rea com n bytes

Definies
p
p^
@n

Contm o endereo de memria apontada pelo ponteiro


Contm o contedo do ponteiro
Contm o endereo da varivel n

Uses Crt;
Var
N: Integer;
P: ^Integer;
Begin
ClrScr;
N := 65;
P := @N;
WriteLn('Contedo: ',P^);
End.

(* Ponteiro aponta para a varivel n *)

81

Memria RAM
1 Byte

@n

1000
65

n (2 bytes)

1000

p (4 bytes)

1001
@p

1002
1003
1004
1005
endereo

contedo

Endereo: [Segmento:OffSet]

Funes
a) MemAvail: Retorna o nmero de bytes disponvel na memria
b) MaxAvail: Retorna o nmero de bytes do maior bloco disponvel na memria
Exemplo:
Uses Crt;
Var
Livre: LongInt;
Bloco: LongInt;
Begin
ClrScr;
Livre := MemAvail Div 1024;
WriteLn(Livre,' K Bytes Livres na Memoria');
Bloco := MaxAvail Div 1024;
WriteLn(Bloco,' K Bytes do Maior Bloco Livre');
ReadLn;
End.

19.2 Acesso Direto a Memria


Varivel Pr -Definida

82

Mem[Segmento:OffSet]
Para acessar diretamente a memria usa-se a varivel pr-definida Mem. Com esta varivel,
pode-se listar ou modificar uma posio de memria.
Endereo do Vdeo: $B800:0000

Segmento
OffSet

$B800
$0000

Objetivo do Programa: Possui dois procedimentos, um para preencher a tela com caracteres
aleatrios e outro para limpar a tela (preencher com espaos) sem Write.
Uses Crt;
Procedure Limpa_Tela;
Var Segmento,OffSet: LongInt;
Begin
Segmento := $B800;
OffSet := $0000;
Repeat
Mem[Segmento:OffSet] := 32;
Inc(OffSet,2);
Until OffSet = 4000;
End;

(* 32 - Espao *)

Procedure Suja_Tela;
Var
Segmento,OffSet: LongInt;
Letra: Byte;
Begin
Segmento := $B800;
OffSet := $0000;
Repeat
Letra := Random(256);
Mem[Segmento:OffSet] := Letra;
Inc(OffSet,2);
Until OffSet = 4000;
End;
Begin
Repeat
Limpa_Tela;
Suja_Tela;
Until KeyPressed;
End.

19.3 Acesso Direto a Memria de Vdeo:


83

Uses Crt;
Var

Video: Array[0..3999] Of Char Absolute $B800:0000;


C,L: Byte;
Letra: Byte;

Procedure Imprime(c,l,Letra: Byte);


Var posicao: Integer;
Begin
posio := 160 * (l - 1) + (c - 1) * 2;
Video[posio] := Chr(Letra);
End;
Begin
Repeat
ClrScr;
For L := 1 To 24 Do
For C := 1 To 80 Do
Begin
Letra := Random(256);
Imprime(C,L,Letra);
End;
Until KeyPressed;
End.

19.4 Listas Encadeadas


Permitem alocao indeterminada de elementos. Tem por caracterstica um elo de ligao
entre um elemento e outro.
Possui um Header (cabea) que indica o primeiro elemento da lista.

Header
c
c

b
3

a
2

NIL

As listas so percorridas seqencialmente, apenas numa direo, ou seja, do primeiro ao


ltimo elemento. A informao do nmero de elementos da lista obtida somente com a varredura
de toda a lista. Para resolver estes dois problemas pode-se usar um descritor da seguinte maneira:

84

DESCRITOR
Primeiro

ltimo

19.5 Filas e Pilhas


As listas podem ser Filas ou Pilhas:
Fila: FIfO (First Input First Output), ou seja, o primeiro elemento a entrar na fila o primeiro
elemento a sair da fila.
Pilha: LIfO (Last Input First Output), ou seja, o ltimo elemento a entrar na pilha o primeiro a
sair.
E - Entrada de Dados
S - Sada de Dados

E
E/S
3

3
Pilha

Fila

S
Pilha:

Fila:

Entrada: 1,2,3
Sada: 3,2,1

Entrada: 1,2,3
Sada: 1,2,3

Implementao de uma Pilha


Objetivo do Programa: Inserir nmeros inteiros em uma pilha. Quando o nmero for igual zero
(0), todos os nmeros da pilha so listados.
Program Pilha;
Uses Crt;
Type PONTEIRO = ^ELEMENTO;
ELEMENTO = Record
85

dado: Integer;
elo: PONTEIRO;
Var

End;
P,Header: PONTEIRO;
N: Integer;

Begin
Header := Nil;
Repeat
ClrScr;
Write('Nmero: ');
ReadLn(N);
If N <> 0 Then
Begin
New(P);
If P = Nil Then
WriteLn('ERRO: Falta de Memria')
Else
Begin
P^.elo := Header;
P^.dado := N;
Header := P;
End;
End;
Until (N = 0) or (P = Nil);
P := Header;
While P^.elo <> Nil Do
Begin
WriteLn('Valor: ',P^.dado);
P := P^.elo;
End;
WriteLn('Valor: ',P^.dado);
ReadLn;
End.

Implementao de uma Fila


Objetivo do Programa: Inserir nmeros inteiros em uma fila. Quando o nmero for igual zero
(0), todos os nmeros da fila so listados.
Program Fila;
Uses Crt;
Type PONTEIRO = ^ELEMENTO;
ELEMENTO = Record
dado: Integer;
elo: PONTEIRO;
End;
86

Var

P,Q,Header: PONTEIRO;
N: Integer;

Begin
ClrScr;
Write('Nmero: ');
ReadLn(N);
New(P);
Header := P;
P^.elo := Nil;
P^.dado := N;
Repeat
ClrScr;
Write('Nmero: ');
ReadLn(N);
If N <> 0 Then
Begin
Q := P;
New(P);
If P = Nil Then
WriteLn('ERRO: Falta de Memria')
Else
Begin
Q^.elo := P;
P^.dado := N;
P^.elo := Nil;
End;
End;
Until N = 0;
P := Header;
While P^.elo <> Nil Do
Begin
WriteLn('Valor: ',P^.dado);
P := P^.elo;
End;
WriteLn('Valor: ',P^.dado);
ReadLn;
End.

19.6 Lista Duplamente Encadeada


Possui um elo para o elemento anterior e um elo para o elemento posterior. Possui uma
vantagem sobre a lista encadeada, pois pode ser percorrida em duas direes.
Objetivo do Programa: Inserir nmeros inteiros em uma lista duplamente encadeada. A insero
pode ser pela esquerda ou a direita. A exibio dos elementos da lista pode ser feita pela esquerda
ou direita.
87

Program Lista_Duplamente_Encadeada;
Uses Crt;
Type PONTEIRO = ^ELEMENTO;
ELEMENTO = Record
anterior: PONTEIRO;
dado: Integer;
posterior: PONTEIRO;
End;
DESCRITOR = Record
primeiro: PONTEIRO;
n: Word;
ultimo: PONTEIRO;
End;
Var

P: PONTEIRO;
D: DESCRITOR;
N: Integer;
Op: Char;

Procedure Inicializa_Descritor;
Begin
D.primeiro := Nil;
D.n := 0;
D.ultimo := Nil;
End;
Procedure Insere_Esquerda(n: Integer);
Var q: PONTEIRO;
Begin
New(P);
If P = Nil Then
WriteLn('ERRO: Falta de Memria')
Else
Begin
If D.n = 0 Then
Begin
P^.anterior := Nil;
P^.dado := N;
P^.posterior := Nil;
D.primeiro := P;
D.n := 1;
D.ultimo := P;
End
88

Else
Begin
q := D.primeiro;
P^.anterior := Nil;
P^.dado := n;
P^.posterior := q;
q^.anterior := P;
D.primeiro := P;
D.n := D.n + 1;
End;
End;
End;
Procedure Insere_Direita(n: Integer);
Var q: PONTEIRO;
Begin
New(P);
If P = Nil Then
WriteLn('ERRO: Falta de Memria')
Else
Begin
If D.n = 0 Then
Begin
P^.anterior := Nil;
P^.dado := n;
P^.posterior := Nil;
D.primeiro := P;
D.n := 1;
D.ultimo := P;
End
Else
Begin
q := D.ultimo;
P^.anterior := q;
P^.dado := n;
P^.posterior := Nil;
q^.posterior := P;
D.ultimo := P;
D.n := D.n + 1;
End;
End;
End;
Procedure Exibir_Lista_Direita;
Begin
P := D.ultimo;
89

While P^.anterior <> Nil Do


Begin
WriteLn('Valor: ',P^.dado);
P := P^.anterior;
End;
WriteLn('Valor: ',P^.dado);
End;
Procedure Exibir_Lista_Esquerda;
Begin
P := D.primeiro;
While P^.posterior <> Nil Do
Begin
WriteLn('Valor: ',P^.dado);
P := P^.posterior;
End;
WriteLn('Valor: ',P^.dado);
End;
Begin
Inicializa_Descritor;
Repeat
ClrScr;
Write('Nmero: ');
ReadLn(N);
If N <> 0 Then
Begin
Write('[E]squerda ou [D]ireita ?');
Repeat
Op := UpCase(ReadKey);
Until Op IN ['E','D'];
Case op
Of
'E': Insere_Esquerda(N);
'D': Insere_Direita(N);
End;
End;
Until N = 0;
ClrScr;
Repeat
Write('Listar: [E]squerda, [D]ireita ou [F]im?');
Repeat
Op := UpCase(ReadKey);
Until Op IN ['E','D','F'];
WriteLn(Op);
Case Op
90

Of
'E': Exibir_Lista_Esquerda;
'D': Exibir_Lista_Direita;
End;
Until Op = 'F';
End.

20. Interrupes
O Microcomputador PC (Personal Computer) possui um circuito integrado responsvel por
interromper o processamento do Microprocessador (8086) chamado PIC 8259 (Programmable
Interrupt Controller), possuindo 256 tipos de interrupes diferentes.
As interrupes podem ser de hardware ou software. Por exemplo Ctrl+Break uma
interrupo de hardware (teclado).

Procedimento de Interrupo
Intr(nmero_da_interrupo: Byte; Var regs: Registers);

Registers
Tipo de dado pr-definido do Pascal que permite manipular diretamente os registradores do
8086.
Ateno: Para usar este procedimento necessrio; Uses Dos;
Objetivo do Programa: Testar se a impressora (IBM 2390) est On-Line (Ligada) ou Off-Line
(Desligada)
Uses Crt, Dos;
Function Testa_Impressora: Boolean;
Var
regs: Registers;
status: Boolean;
Begin
regs.ah := $02;
regs.dx := $00;
Intr($17,regs);
If regs.ah = 144 Then
status := TRUE
Else
status := FALSE;
Testa_Impressora := status;
End;
91

Begin
ClrScr;
Repeat
If Testa_Impressora Then
WriteLn('Impressora On-Line')
Else
WriteLn('Impressora Off-Line');
Until KeyPressed;
End.
Objetivo do Programa: Posicionar o cursor na tela em qualquer posio c (coluna) e l (linha).
Uses Crt, Dos;
Const TEMPO = 100;
Var C,l: Byte;
Procedure Cursor(col,lin: Byte);
Var regs: Registers;
Begin
regs.ah := $02;
regs.bh := 0;
regs.dh := lin;
regs.dl := col;
Intr($10,regs);
End;

(* Nmero da Pgina *)

Begin
ClrScr;
For L := 1 To 24 Do
For C := 1 To 80 Do
Begin
Cursor(C,L);
Write(' =O-');
Delay(TEMPO);
End;

(* Controla a Velocidade *)

End.

92

Você também pode gostar