Buscar

Turbo_Pascal

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 88 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 88 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 88 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Universidade Católica de Pelotas
Escola de Informática 
L i n g u a g e m P a s c a l
por
Paulo Roberto Gomes Luzzardi
Revisão: Junho, 1996
Bibliografia
CARROLL, David W. - Programação em TURBO PASCAL McGraw-Hill
RAMALHO, Luciano & PRATES, Rubens - Turbo Pascal, Cartão de Referência, Livros Técnicos 
e Científicos Editora S.A.
1
Conteúdo Programático
1. Introdução à Linguagem Pascal
1.1 Histórico
1.2 Objetivos
1.3 Características 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 Comentários
3.3 Estrutura Geral
3.4 Definição 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 Aritméticos
5.1.1 Com Reais
5.1.2 Com Inteiros
5.1.3 Hierarquia dos Operadores
5.2 Operadores Relacionais
5.3 Operadores Lógicos
2
5.3.1 Not
5.3.2 And
5.3.3 Or
5.4 Operador de Inclusão (In)
5.5 Procedimentos Especiais
5.5.1 Inc
5.5.2 Dec
6. Funções Padrões
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 Seqüência
7.1.2 Seleção
7.1.3 Repetição
7.1.4 Atribuição
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
7.7 Comando Repeat ... Until
7.8 Comando Halt
7.9 Comando Exit
8. Entrada e Saída
3
8.1 Entrada pelo Teclado
8.2 Saída no Vídeo
8.3 Saída na Impressora
9. Controle do Vídeo
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 (Ordenação)
12. Manipulação 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
12.12 FillChar
13. Procedures e Functions
13.1 Variáveis Locais e Globais
13.2 Parâmetros
13.3 Passagem de Parâmetro por Valor
13.4 Passagem de Parâmetro por Referência
4
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 Funções
14.2.1 Eof
14.2.2 FilePos
14.2.3 FileSize
14.2.4 SizeOf
14.3 Como Definir um Registro (Record)
15. Gráficos
15.1 Placas Gráficas
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
15.2.3 VGA
15.3 Detecção e Inicialização da Tela Gráfica
15.4 PutPixel (Pontos)
15.5 Line (Linhas)
15.6 Rectangle (Retângulos)
15.7 Circle (Círculos)
15.8 Arc (Arcos)
15.9 DrawPoly (Polígonos)
15.10 SetColor e SetBkColor (Cor de Frente e Cor de Fundo)
15.11 OutTextXY e SetTextStyle (Textos)
5
15.12 Preenchimento (Pintura)
15.12.1 Retângulos (Bar)
15.12.2 Polígonos (FillPoly e FloodFill)
15.13 Ativação de Janelas
15.13.1 Janela Ativa
15.13.2 Limpar Janela Ativa
15.13.3 Salvar e Recuperar Janelas Gráficas
16. Criação de Unidades ("Units")
16.1 Como Criar um Unidade
16.2 Exemplo de Criação de uma Unidade
16.3 Exemplo de Programa que usa uma Unidade
17. Memória de Vídeo
18. Passagem de Parâmetros pela Linha de Comandos do Sistema Operacional
19. Ponteiros
19.1 Tipos de Alocação de Memória
19.1.1 Alocação Estática
19.1.2 Alocação Dinâmica
19.2 Acesso Direto a Memória
19.3 Acesso Direto a Memória de Vídeo
19.4 Listas Encadeadas
19.5 Filas e Pilhas
19.6 Listas Duplamente Encadeadas
20. Interrupções
6
1. Introdução à Linguagem Pascal
1.1 Histórico
Desenvolvido em 1970 pelo Prof. Nicklaus Wirth no Technical University - Zurique - 
Suiça.Nome em homenagem à Blaise Pascal (Séc. XVII).
1.2 Objetivos
a) Ensino da Programação, pois é uma linguagem didática;
b) Programação Estruturada.
1.3 Características do Sistema em uma Linguagem Ideal
a) Produzir programas-objeto compactos e eficientes;
b) Usar uma linguagem de alto nível, de fácil entendimento;
c) Permitir ao programador fazer alterações e visualizar os resultados rapidamente
d) Produzir programas portáteis para serem rodados em qualquer outro computador.
2. Ambiente Turbo Pascal 5.5
F ile E dit R un C ompile P roject O ptions D ebug B reak/watch
Edit
Message / Watch
Line 1 Col 1 Insert Ident Tab Fill Unident
janela de edição
janela de mensagens do ambiente
janela de assistência (debug)
F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu
A:NONAME.PAS
Alt: F1-Last help F3-Pick F6-Swap F7/F8-Prev/next error
7
2.1 File (Arquivo) [ALT][F]
Permite carregar arquivo, salvar arquivo, listar diretório, criar novos fontes, renomear 
arquivos, saída temporária ao Sistema Operacional e saída definitiva ao sistema operacional. 
Load (Carregar) [F3]
É exibida uma caixa de diálogo solicitando o nome do arquivo a ser carregado, se for 
pressionado a tecla <ENTER> é exibida outra caixa de dialógo 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 após, 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 então 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 conteúdo do Editor no Disco. Se o arquivo não tiver nome ("NONAME.PAS"), pode 
então, ser renomeado. Todo arquivo deve ter um nome que não seja "NONAME.PAS".
Write to (Escrever Como) 
Escreve (grava) o conteúdo do editor num outro arquivo indicado pelo usuário (conserva o 
antigo no disco e o novo no editor). 
Directory (Diretório)
Exibe o diretório do disco corrente, de acordo com uma máscara especificada, permite ainda, 
que um arquivo seja carregado.
Change dir (Mudar Diretório) 
Permite mudar o subdiretório (drive:\path) corrente.
Os Shell (Saída Temporária ao Sistema Operacional)
8
Saída temporária do Turbo Pascal para o Sistema Operacional. Para retornar ao Ambiente 
digita-se Exit.
Quit (Sair) [ALT][X]
Saída definitiva do Ambiente Turbo Pascal. Volta o controle ao Sistema Operacional.
2.2 Edit (Editar) [ALT][E]
Permite a criação ou edição de programas. Para sair do editor pressiona-se a tecla F10 ou 
ALT mais a letra maiúscula da opção 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 execução de um programa que foi executado com o "Debug". Desmarca a linha 
atual do "Debug".
Go to cursor (Vá para Cursor) [F4]
Força o "Debug" executar todas as linhas até a posição do cursor, ou seja, pula as instruções 
intermediárias.
Trace into (Traça Dentro) [F7]
Força o "Debug" a executar linha a linha entrando obrigatoriamente dentro das "procedure" 
e "function".
Step over (Passa Ssobre) [F8]
Força o "Debug" a executar linha a linha sem entrar nas "procedure" e "function".
User screen (Tela do Usuário) [ALT][F5]
Exibe a tela de execução do programa.
2.4 Compile (Compilar) [ALT][C]
9
Compile (Compilar) [ALT][F9]
Compila o programa fonte e linka as unidades.
Make (Fazer) [F9]
Compila o arquivo primário ("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 primário ("PrimaryFile"). 
Destination (Destinação) [Memory ou Disk]
Especifica o destino do programa executável. Se "Memory" o executável é temporário, se 
"Disk" o arquivo executável é armazenado em disco (como .EXE). 
Find error (Achar Erro)
Localiza um erro de execução "RunTime Error" (Erro em Tempo de Execução).
Primary file (Arquivo Principal) 
Usado para definir o arquivo principal, usado pelo "Make" e "Build".
Get info (Mostra Informações) 
Exibe uma janela contendo informações do arquivo fonte.
2.5 Options (Opções) [ALT][O]
10
Compiler (Compilador) 
Permite a inserção de diretivas de compilação sem escrevé-las no programa-fonte.
Range checking (ON ou OFF): Se ligada, verifica se os "array" e "string" estão dentro das 
faixas definidas pelo programador.
Stack checking (ON ou OFF): Se ligada, o compilador verifica se há espaço na pilha para as 
variáveis locais, antes das chamadas das "procedure" e "function".
I/O checking (ON ou OFF): Se ligada, verifica se há erros de entrada e saída. Em OFF pode-
se testar erros de entrada e saída através da função 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 geração de código "OverLay" para uma unidade 
(".OVL").
Align data (Word ou Byte): Em "Word" todos os dados maiores que "Byte" são tratados 
como tipo "Word".
Var-string checking (Strict ou Relaxed): Se "Strict" (rigorosa) verifica o tamanho das 
"string" passadas como parâmetro, se "Relaxed" (moderada) não verifica.
Boolean evaluation (Short circuit ou Complete): Se "Short circuit" os testes de uma 
expressão booleana são mais rápidos, se "complete" todas as condições são 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 aritmético, se ele não existir.
Debug information (ON ou OFF): Gera um arquivo de informações de depuração de um 
arquivo que está sendo compilado.
Local symbols (ON ou OFF): Gera informações sobre símbolos locais (nomes e tipos de 
todas as variáveis e constantes locais de um símbolo).
Conditional defines: Define símbolos que podem ser referenciados em diretivas de 
compilação condicionais no arquivo fonte.
Memory Sizes (Stack size, Low heap limit ou High heap limit): Permite configurar o mapa 
de memória de um arquivo de código resultante, ou seja, o tamanho da memória.
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.
11
Linker
Permite especificar diferentes modalidades de geração do mapa do "linker" e o destino do 
"link buffer".
Map file (OFF, Segments, Publics ou Detailed):
OFF: Arquivo "*.MAP" não é gerado.
Segments: Inclui informações do segmento de memória no arquivo *.MAP.
Publics: Inclui informações sobre símbolos, procedure/function no arquivo *.MAP.
Detailed: Informações mais detalhadas do que as anteriores.
Link buffer (Memory ou Disk): Define o destino do "Link buffer".
Memory: Mais rápido, mas não 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 configuração 
("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 saída 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 tabulação horizontal do editor (tab) (2 até 16 brancos).
Zoom windows (ON ou OFF): se ligada, as janelas Edit, Watch ou OutPut estão 
expandidas.
Screen size (25 line display ou 43/50 line display): Permite selecionar o número de linhas na 
tela: 25 placa CGA, 43 placa EGA e 50 placa VGA.
Directories (Diretório)
Permite especificar drive:\path para diretórios dos arquivos usados e gerados pelo turbo. 
Turbo Directory: Diretório dos arquivos do Turbo Pascal (drive:\path), normalmente: 
C:\LING\TP.
EXE & TPU Diretory: Diretório dos arquivos "*.EXE" (executáveis) e "*.TPU" 
(unidades).
12
Include Diretories: Especifica o diretório dos arquivos utilizados pela diretiva de inclusão 
de fontes {$I}.
Unit Diretories: Especifica o diretório dos arquivos fontes de unidades ("*.PAS" das 
unidades).
Object Directories: Especifica o diretório dos arquivos objetos "*.OBJ".
Pick File Name: Especifica o drive, caminho e nome do arquivo de seleção "*.PCK".
Current Pick File: Indica o drive, caminho e nome do arquivo de seleção corrente.
Parameters (Parâmetros)
Permite a especificação de parâmetros para que o programa possa ser compilado na memória.
Save options (Salva Opções)
Salva o arquivo de configuração "*.TP" (default "TURBO.TP"). 
Retrieve options (Recuperar Opções)
Carrega o arquivo de configuração "*.TP" (default "TURBO.TP"). 
2.6 Debug (Depuração) [ALT][D]
Evaluate [CTRL][F4]: Exibe uma janela de avaliação com três opções: (Evaluate, Result e 
New name)
Evaluate: Permite identificar uma expressão ou uma variável a ser submetida ao 
Debug.
Result: É exibido o resultado da avaliação da expressão ou variável selecionada 
acima.
New name: Permite atribuir um novo valor.
Call stack [CTRL][F3]: Durante a depuração, permite chamar uma janela com a 
pilha que contém uma lista de "procedure" e "function" que mostram a posição atual, mostrando 
também, os parâmetros de cada chamada.
Find procedure: Posiciona o cursor no início 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 
informações do "Debugger" são anexadas ao arquivo "*.EXE" para uso com o "Turbo Debugger". 
13
Display swapping (None, Smart ou Always): Permite estabelecer modos de visualização de 
"OutPut" de tela durante a depuração do programa.
None: Não mostra a tela de saída do programa.
Smart: Mostra os efeitos da tela somente quando houver um comando de saída.
Always: Mostra sempre a tela resultante.
Refresh display: Retorna para a tela do ambiente.
2.7 Break/watch [ALT][B]
Se a opção "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 variável sob o cursor seja exibida na janela de 
assistência quando o "debug" for executado
Delete watch: Permite que uma variável da janela de assistência seja deletada.
Edit watch: Permite que uma variável da janela de assistência seja editada (alterada).
Remove all watches: Remove todas as variáveis da janela de assistência.
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 próximo "BreakPoint".
14
2.8 Como usar o DEBUG
Passo 1: Ter as duas janelas na tela: janela de edição e janela de assistência [F5];
Passo2: Marcar um "BreakPoint" (ponto de parada) [CTRL][F8] ou opção "Toggle breakpoint" do 
menu "Break/watch";
Passo 3: Rodar o programa "Run" ou [CTRL][F9], o programa é executado até a linha anterior ao 
"BreakPoint";
Observação: Para visualizar o resultado obtido na tela de execução [ALT][F5] ou a opção "User 
screen" do menu "Run"; 
Passo 4: Para selecionar as variáveis que se deseja assistir, posiciona-se o cursor em cima da 
variávele [CTRL][F7] ou a opção "Add watch" do menu "Break/watch", após aparecer uma janela 
com a variável no seu interior (podendo-se alterar ou mudar a variável) pressiona-se [RETURN];
Passo 5: Para visualizar a execução do programa linha é linha pressiona-se [F8] (opção "Step over" 
do menu "Run") ou [F7] (opção "Trace into" do menu "Run"):
[F8]: executa o programa linha é linha sem entrar nas "procedure" e "function";
[F7]: executa o programa linha é linha entrando também nas "procedure" e "function";
Passo 6: Pode-se ainda "Delete watch" (deletar variável), "Edit watch" (editar variável) ou "Remove 
all watches" (remover todas as variáveis) no menu "Break / watch".
Passo 7: Pode-se ainda desviar a execução do "debug" para a linha que está o cursor [F4] ou a opção 
"Goto cursor" do menu "Run"; 
Passo 8: Para encerrar a execução do "debug" [CTRL][F2] ou a opção "Program reset" do menu 
"Run", deve-se ainda desmarcar todos os "breakpoints" através da opção "Clear all breapoints" do 
menu "Break/watch".
15
3. Estrutura de um Programa Pascal
3.1 Identificadores
São os nomes criados pelo programador para:
- nomes de Constantes (Const);
- nomes de Variáveis (Var);
- nomes de Tipos (Type);
- nomes de Procedimentos (Procedure);
- nomes de Funções (Function);
- nomes de Unidades (Unit);
- nomes de Programas (Program).
Regras:
- Todo identificador deve começar com uma letra ou subscrito (_);
- Não pode conter espaços;
- Os caracteres válidos são letras, dígitos, subscrito;
- Pode conter qualquer quantidade de caracteres, mas somente os primeiros 63 são significativos.
3.2 Comentários
O programador pode, dentro do seu programa, fazer comentários sem que o código seja 
compilado, isto pode ser feito de duas maneiras:
(* aqui começa o programa *)
ou
{ aqui começa o programa }
3.3 Estrutura Geral
(* ----------------------------------------- Nome do programa *)
Program nome_do_programa; (* opcional *)
(* ------------------------------------------------- Unidades *)
Uses Crt,Printer,Graph; // unidades
(* ---------------------------------------------- Declarações *)
Const x = 100;
PI = 3.1415;
UP = #72; {tecla acima}
LEFT = #75; {tecla esquerda} 
16
RIGHT = #77; {tecla direita} 
DOWN = #80; {tecla abaixo}
PGUP = #73;` {tecla pagina acima}
PGDN = #81; {tecla pagina abaixo}
ENTER = #13;{tecla RETURN ou ENTER}
ESC = #27; {tecla ESC}
BACKSPACE = #8; {tecla BACKSPACE}
Type Nome = String[80];
Var A,B: Integer;
C: Real;
N: Nome;
(* ----------------------------------------------- Definições *)
Procedure nome_do_procedimento(parâmetros);
Begin
comandos;
End;
Function nome_da_função(parâmetros): TIPO DA FUNÇAO;
Begin
comandos;
End;
(* --------------------------------------- Programa Principal *)
Begin
comandos;
End.
3.4 Definição de Tipos (Type)
Em Pascal o programador pode definir seus próprios tipos de dados.
Uses Crt;
Type TIPO_DATA = Record
ano: Integer;
mes: 1..12;
dia: 1..31;
 End;
TIPO_NOME: String[80];
Var Data: TIPO_DATA;
Nome: TIPO_NOME;
17
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
Sexo := 'F';
Opcao := '1';
Letra := 'a';
Operacao := '+';
Caracter := #65; { Letra A }
Letra := CHR(66); { Letra B }
18
4.5 - Boolean: (1 byte) Faixa: [True ou False]
Var 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
Begin
Write('Letra: ');
Letra[I] := ReadKey;
End;
4.8 - Word: (2 bytes) (0 à 65535)
Var Numero_de_Alunos_Catolica,Numero_de_Funcionarios: Word;
19
4.9 - ShortInt: (1 byte) (-128 à 127)
4.10 - LongInt: (4 bytes) (-2147483648 à 2147483647)
5. Operadores
5.1 - Operadores Aritméticos
5.1.1 - Com REAIS
+ Adição
- Subtração
* Multiplicação
/ Divisão
5.1.2 - Com INTEIROS
+ Adição
- Subtração
* Multiplicação
/ Divisão com resultado real
Div Resultado inteiro da divisão
Mod Resto da divisão
Uses Crt;
Var X,Y: Integer;
Divisao: Real;
Resto,Quociente: Integer;
Begin
ClrScr;
X := 7;
Y := 2;
Divisao := X / Y; { Divisao = 3,5 }
Resto := X Mod Y; { Resto = 1 }
Quociente := X Div Y; { Quociente = 3 }
7 2
1 3
5.1.3 HIERARQUIA (Precedência)
20
1. Parênteses: ()
2. Operador unário: -(valor) 
3. Funções
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 Lógicos
5.3.1 - Not (negação):
V FNOT
Not A F V
5.3.2 - And (e):
V F
V
F F
Condição A
Condição B
V
AND
F
F
5.3.3 - Or (ou):
21
V F
V
F F
V
Condição A
Condição B
OR
V
V
5.3.4 - Xor (ou exclusivo):
XOR V F
V
F
F
F
V
V
Condição A
Condição B
5.4 Operador de Inclusão (In)
Operador que testa a inclusão de uma variável 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:
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]; (* ou X In [1..5]; *)
(* verdadeiro quando X é igual a: 1,2,3,4,5 *)
É igual a:
22
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 variável inteira.
Modo de Usar: Inc(variável,passo);
Inc(i); (* i := i + 1 *)
Inc(i,5); (* i := i + 5 *)
5.5.2 Dec
Procedimento que permite o decremento de uma variável inteira.
Modo de Usar: Dec(variável,passo);
Dec(i); (* i := i - 1 *)
Dec(i,5); (* i := i - 5 *) 
6. Funções Padrões
 6.1 - Exp(x): Função exponencial ex
 6.2 - Abs(x): Valor absoluto (valor sempre positivo).
 6.3 - ArcTan(valor): Função arco tangente (resultado em radianos). 
 6.4 - Cos(ang): Função cosseno (ângulo em radianos).
 6.5 - Sin(ang): Função seno (ângulo em radianos).
 6.6 - Frac(x): Retorna a parte fracionária.
 6.7 - Int(x): Retorna a parte inteira.
 6.8 - Sqr(x): Retorna x elevado a segunda potência.
 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 número aleatório de zero até (v-1).
7. Comandos
23
7.1 Tipos de Comandos
7.1.1 Seqüência
É um tipo de comando que no fluxo lógico do programa é executado e o controle passa para o 
próximo comando.
Exemplo:
Var Nome: String;
Begin
ClrScr;
Write('Nome: ');
Readln(Nome);
7.1.2 Seleção (If e Case)
É um tipo de comando que no fluxo de execução do programa permite que, através de 
condições, desvios sejam feitos, ou seja, alguns comandos são executados e outros não.
Exemplo:
If numero = 0 Then
 WriteLn('Zero')
Else
 If numero > 0 ThenWriteLn('Positivo')
 Else
 WriteLn('Negativo');
7.1.3 Repetição (For, While e Repeat)
É um tipo de comando que no fluxo de execução do programa, permite que outros comandos 
sejam repetidos até que uma condição seja satisfeita ou enquanto uma condição é 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 Atribuição
24
É um tipo de comando que permite que uma expressão (equação) seja resolvida e o seu valor 
atribuído (igualado a uma variável).
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 Seleção)
Modo de usar: 
If condição Then
 comando;
Se a condição é verdadeira então o comando é executado, senão é executado o próximo 
comando.
ou
If condição Then
 comando 1
Else
 comando 2;
Se a condição é verdadeira o comando 1 é executado senão é executado o comando 2. 
Comando, comando 1 e comando 2 podem ser simples ou compostos.
7.4 - Comando Case ... Of ... Else ... End (Comando de Seleção) 
25
Modo de usar: 
Case variável 
OF
 constante 1: comando 1;
 constante 2: comando 2;
 . .
 . .
 constante n: comando n;
End;
Se a variável é igual a alguma constante o comando correspondente é executado, se nenhuma 
constante for encontrada o comando será terminado.
ou
Case variável 
Of
 constante 1: comando 1;
 constante 2: comando 2;
 . .
 . .
 . .
 constante n: comando n;
Else
 comandos;
End;
Se a variável for igual a alguma constante, o comando correspondente é executado, se 
nenhuma constante for encontrada os comandos após o Else são executados, logo após o comando 
Case é terminado.
Observação: A variável não pode ser Array, String e Real. 
Case letra
Of
 'a'..'z': WriteLn('Minúsculas');
 'A'..'Z': WriteLn('Maiúsculas');
 '0'..'1': WriteLn('Número');
Else
 WriteLn('Caracter Especial');
End;
Case digito
Of
 '0': WriteLn('Zero');
 '1': WriteLn('Um');
 '2': WriteLn('Dois');
 :
26
 '9': WriteLn('Nove');
Else
 WriteLn('ERRO: Não é um Número');
End;
7.5 Comando For ... Do (Comando de Repetição)
Modo de usar:
For Variável_de_Controle := Valor_Inicial (To) Valor_Final Do 
 comando;
A variável de controle não deve ser alterada no corpo do comando, pode-se ter comando 
simples ou comando composto, a variável de controle não deve ser real, array ou string.
To: Comando de repetição crescente
DownTo: Comando de repetição decrescente
For i := 0 To 255 Do
 Begin
 WriteLn('Código: ',i,'- Caracter ASCII:',Chr(i));
 ch := ReadKey;
 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 Repetição)
Modo de Usar:
While condição Do 
 comandos;
Enquanto a condição é verdadeira os comandos são repetidos. Pode-se usar comando simples 
ou comando composto.
Exemplo:
i := 1;
While i <= 10 Do
Begin
WriteLn('i = ',i);
i := i+1;
27
End;
7.7 Comando Repeat ... Until (Comando de Repetição)
Modo de Usar:
Repeat
 comandos;
Until condição;
Os comandos são repetidos, até que a condição se torne verdadeira, enquanto a condição é 
falsa os comandos são repetidos.
Exemplo:
i := 1;
Repeat
 WriteLn('i = ',i);
 i := i+1;
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
Força o término do programa (aborta o programa), retornando ao sistema operacional, se o 
programa for executável 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
Força a saída de um laço, passando a execução para a próxima instrução.
Repeat
 :
 If KeyPressed then Exit;
 :
Until False;
28
8. Entrada e Saída
8.1 Entrada pelo Teclado
ReadLn: Procedimento que permite entrada de dados via teclado. A variável x pode ser de 
qualquer tipo.
ReadLn(x);
ReadKey: Função que permite a entrada de um caracter sem pressionar a tecla <ENTER>. A 
variável deve ser do tipo Char e é necessário usar a unidade Crt;.
Uses Crt;
Var Tecla: Char;
Begin
 ClrScr;
 Write('Digite uma TECLA: ');
 Tecla := ReadKey;
 WriteLn('Você digitou: ',Tecla);
End.
8.2 Saída no Vídeo
Procedimento que permite escrita no vídeo:
Write(x); (* Imprime x e cursor fica ao lado *)
 ou
WriteLn(x); (* Imprime x e cursor vai para próxima linha *)
 ou
WriteLn; (* Deixa uma linha em branco na tela *) 
8.3 Saída na Impressora
É necessário usar a unidade Printer.
Uses Crt,Printer;
Begin
 ClrScr;
 WriteLn(Lst); (* Pula uma linha na impressora *)
 Write(Lst,'x = ');
 WriteLn(Lst,x);
End.
Observação: 
29
WriteLn(lst,#12); (* Salta uma página na impressora *)
WriteLn(lst,#15); (* Comprime os caracteres na impressora *) 
9. Controle do Vídeo e Teclado:
9.1 ClrScr (Clear Screen)
Procedimento que permite limpar a tela, o cursor permanece no canto superior esquerdo. É 
obrigatório o uso da unidade Crt. A tela é limpa com a cor de fundo corrente.
Uses Crt;
Begin
ClrScr;
9.2 GotoXY(coluna,linha) (Vá para posição X,Y)
Procedimento que permite o posicionamento do cursor em qualquer posição da tela. É 
obrigatório o uso da unidade Crt.
Tela
40 ou 80 Colunas
25 Linhas
80 1
1
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 posição do cursor até o final 
da linha. É obrigatório o uso da Unidade Crt.
Uses Crt;
30
Var L: Byte;
Begin
 TextBackGround(WHITE); { Altera a cor de fundo}
 ClrScr; 
 TextColor(BLACK); { Altera a cor do Texto }
 For L := 1 to 24 do
 Begin
 GotoXY(40,L);
 ClrEol;
 End; 
End.
9.4 DelLine (Delete Line)
Procedimento que permite que uma linha seja apagada. É obrigatório o uso da Unidade Crt.
Uses Crt;
Var L: Byte;
Begin
 TextBackGround(WHITE); { Altera a cor de fundo}
 ClrScr; 
 TextColor(BLACK); { Altera a cor do Texto }
 For L := 1 to 24 do
 Begin
 GotoXY(40,L);
 DelLine;
 End; 
End.
10 Comandos Especiais (Unidade Crt)
10.1 Delay (Atraso)
Procedimento que permite uma parada temporário da execução por parte do computador.
Modo de Usar: 
Delay(x); { x em milisegundos }
10.2 TextBackGround (Cor de Fundo)
Procedimento que permite mudança na cor de fundo do vídeo.
Modo de Usar: 
TextBackGround(cor); { cor: número ou nome }
31
Número Nome Cor
0 Black preto
1 Blue azul
2 Green verde
3 Cyan azul claro
4 Red vermelho
5 Magenta rosa
6 Brown marrom
7 LightGray cinza
10.3 TextColor (Cor de Frente)
Procedimento que permite mudança na cor de texto do vídeo.
Modo de Usar: 
TextColor(cor); { cor: número ou nome }
Número Nome Cor
 0 Black preto
 1 Blue azul
 2 Green verde
 3 Cyan azul claro
 4 Red vermelho
 5 Magenta rosa
 6 Brown marrom
 7 LightGray cinza
 8 DarkGray cinza brilhante
 9 LightBlue azul brilhante
10 LightGreen verde brilhante11 LightCyan azul claro brilhante
12 LightRed vermelho brilhante
13 LightMagenta rosa brilhante
14 Yellow amarelo
15 White branco
Observação: Piscante (Blink é cor a 128)
10.4 Window (Janela)
Procedimento que permite definir a janela de texto ativa, ou seja, parte do vídeo ativo onde as 
escritas são feitas. Normalmente a janela ativa é toda tela, ou seja: Window(1,1,80,25);
32
(Xi,Yi)
(Xf,Yf)
Modo de Usar: 
Window(Xi,Yi,Xf,Yf);
Observação: Após setar uma janela ativa a posição (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); (* ativa o auto-falante com a nota 220 *) 
 Delay(200); (* período de duração do som *) 
 NoSound; (* desativa o auto-falante *)
End.
NoSound: Procedimento que desativa o auto-falante do computador.
Modo de Usar: 
NoSound;
10.6 WhereX e WhereY (Localização do Cursor)
Funções que indicam a posição corrente do cursor [x (coluna) e y (linha)].
Uses Crt;
Var Coluna,Linha: Byte;
Begin 
 Coluna := WhereX;
 Linha := WhereY;
33
 WriteLn('Coluna: ',Coluna);
 WriteLn('Linha : ',Linha);
End.
10.7 TextMode (Modo do Texto)
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 são variáveis que possuem vários elementos de mesmo tipo, cada 
elemento possui um ou mais índices que os referenciam e os diferenciam. Uma característica 
importante é que todos os valores permanecem na memória ao mesmo tempo. Os elementos são 
alocados com contigüidade física, 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 após imprime todos 
os nomes e idades contidos na memória.
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'];
34
 Until (Ch IN ['N','n']) Or (I > QUANT);
 N := I - 1; (* número de elementos *)
 For I := 1 To n Do
 Begin
 WriteLn('Nome: ',Nome[i]);
 WriteLn('Idade: ',Idade[i]);
 Ch := ReadKey;
 End;
End. 
11.2 Matriz
É um tipo de dado que permite que uma variável contenha vários 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('Número de Linhas (M): ');
Readln(M);
Until (M >= 1) And (M <= QUANT);
Repeat
Write('Número 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;
35
End;
End.
11.3 Sort (Ordenação)
Método de classificação de dados. Para exemplificar melhor as variáveis 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; (* Número 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; (* Método da Bolha - Buble Sort*)
Uses Crt;
Const QUANT = 255;
36
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; (* Número 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. Manipulação de String
12.1 Chr
Função que retorna o caracter correspondente ao código da tabela ASCII.
Modo de Usar: Chr(código: Byte): Char;
37
Uses Crt;
Var Codigo: Byte;
Caracter: Char;
Begin
ClrScr;
Repeat
Write('Código: ');
Readln(Codigo);
Caracter := Chr(Codigo);
WriteLn('Código :',Codigo,' Caracter ASCII: ',Caracter);
Until Codigo = 0;
End.
12.2 Ord
Função que retorna o código 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,' Código ASCII: ',Codigo);
Until Caracter = #13; (* #13 é o código da tecla <ENTER> *)
End.
12.3 Concat
Função 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
ClrScr;
S1 := 'Turbo ';
S2 := 'Pascal ';
S3 := '5.5';
Sr := Concat(S1,S2,S3);
WriteLn(S1);
38
WriteLn(S2);
WriteLn(S3);
WriteLn(Sr); (* Sr := 'Turbo Pascal 5.5' *)
Repeat Until KeyPressed;
End.
12.4 Copy
Função que retorna uma substring a partir de outra string.
Modo de Usar: Copy(s: String[], início, 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); (* Nova := 'COMPUTADOR' *)
Repeat Until KeyPressed;
End.
12.5 Delete
Procedimento que remove caracteres de uma string.
Modo de Usar: Delete(s: String[],início,tamanho: Byte);
Uses Crt;
Var Velha: String[15];
Begin
ClrScr;
Velha := 'MICROCOMPUTADOR';
Delete(Velha,6,10);
WriteLn(Velha); (* Velha := 'MICRO' *)
Repeat Until KeyPressed;
End.
12.6 Insert
Procedimento que insere s1 em s2 na posição desejada gerando uma nova string.
Modo de Usar: Insert(s1,s2: String[],posição: Byte);
Uses Crt;
39
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
Função que retorna o número 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
Funçãoque retorna a posição de s1 em s2 (0 se não encontrar).
Modo de Usar: Pos(s1,s2: String[]): Byte;
Uses Crt;
Var S1: String[6];
S2: String[15];
Posicao: Integer;
Begin
ClrScr;
S1 := 'COMPUT';
S2 := 'MICROCOMPUTADOR';
Posicao := Pos(S1,S2);
If Posicao<>0 then
Write('String Encontrada na Posição: ',Posicao)
Else
Write('String não encontrada');
Repeat Until KeyPresssed;
40
End.
12.9 Str
Procedimento que converte um valor númerico (Real ou qualquer tipo de inteiro) em String. 
O tamanho do número é 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); (* S := '3.1415' *)
Repeat Until KeyPressed;
End. 
12.10 UpCase
Função que retorna o caracter convertido em letra maiúscula.
Modo de Usar: UpCase(ch: Char): Char;
Uses Crt;
Var Ch: Char;
Begin
ClrScr;
Repeat
Write('Digite uma Tecla: ');
Ch := ReadKey;
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.
41
12.11 Val
Procedimento que converte uma string em valor númerico (Real ou qualquer tipo de inteiro), 
se a string possuir letras, a variável erro retorna a posição da letra (pois não é númerica), senão 
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('Número: ',Valor);
End
Else
WriteLn('ERRO: ',Erro);
Until (S = 'FIM') or (S = 'fim');
End.
12.12 FillChar
Procedimento que inicializa uma variável string com caracteres repetitivos.
Modo de Usar:FillChar(variável: Qualquer_tipo; quantidade: Word; constante);
Uses Crt;
Var Linha: String[80];
Espacos: String[40]; 
Begin
FillChar(Linha,80,'-');
Linha[0] := #80; (* indicar o número de caracteres *)
FillChar(Espacos,40,#32);
Espacos[0] := #40;
13. Procedimentos (Procedure) e Funções (Function)
13.1 Variáveis Locais e Globais
42
Variável Local
Todas as variáveis definidas dentro de uma função ("function") ou procedimento 
("procedure") são chamadas locais, só podem ser referenciadas dentro do módulo que a definiu.
Variável Global
Todas as variáveis definidas fora de todas as funções são chamadas globais e podem ser 
referenciadas em qualquer parte do programa inclusive dentro das funções e procedimentos.
Observações:
a)Todas as variáveis usadas no programa principal são globais e devem, obrigatoiamente ser 
definidas no "Var".
b)As variáveis locais tem prioridade sobre as variáveis globais.
c)Também existem constantes ("Const"), tipos ("Type"), procedimentos ("Procedure") e funções 
("Function") locais.
d)Todos os parâmetros são locais, por esta razão, não necessitam ter o mesmo nome das variáveis de 
chamada.
Program Exemplo;
Uses Crt;
Var Base,Expoente,Resultado: Real;
Tecla: Char;
Procedure TROCA(Var x,y:Real); (* Var passagem por referência *)
Var temp: Real;
Begin
temp := x;
x := y;
y := temp; 
End;
Function ELEVA (b,e: Real): Real;
Var pot: Real;
Begin
pot := exp(log(b)*e);
ELEVA := pot; (* Saída da Função *)
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 *)
43
Resultado := ELEVA(Base,Expoente); (* Chamada da Função *)
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.
Variáveis Globais: Base, Expoente, Resultado e Tecla.
Variáveis Locais: - Procedure TROCA: x, y e temp.
- Funtion ELEVA: b, e, pot.
13.2 Parâmetros
São todas as variáveis que num procedimento ("Procedure") ou Função ("Function") estão 
entre parênteses. Existem parâmetros de entrada e saída (são os mesmos, a diferença é se são 
alterados ou não).
Chamada: TROCA(Var x,y: Real); (* Procedimento *)
TROCA
Entrada
Saída
x
y
e
13.3 Passagem de Parâmetros por Valor
Quando os parâmetros passados para as funções ("Function") ou procedimentos 
("Procedure") não alteram os valores das variáveis de chamada, isto é chamado passagem de 
parâmetro por Valor. No exemplo abaixo, "b" e "e" são passados por valor, logo não alteram as 
variáveis 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 Parâmetros por Referência
Quando os parâmetros passados para as funções ("Function") ou procedimentos 
("Procedure") alteram os valores das variáveis de chamada, isto é chamado passagem de parâmetro 
44
por Referência. No exemplo abaixo, "x" e "y" são passados por referência, logo alteram as variáveis 
do programa principal.
Procedure TROCA(Var x,y:Real);
Var temp: Real;
Begin
temp := x;
x := y;
y := temp; 
End;
13.5 Function (Funções)
Módulo desenvolvido pelo programador. Permite a criação de uma função própria. Pode ter 
vários parâmetros de entrada (passagem por valor) e ou saída (passagem por referência), mas 
apenas um retorno de saída. O retorno é dado pelo nome da função, assim, pode-se considerar que 
uma função nada mais é do que uma variável.
Function nome_da_função (parâmetros: tipo): tipo_do_resultado;
Type
Const
Var variável: tipo_do_resultado;
Begin
comandos;
nome_da_função := variável; (* Retorno da Função *)
End;
Função
x
y Resultado
Saída
Entrada
e Retorno
13.6 Procedure (Procedimento)
Módulo desenvolvido pelo programador. Permite a criação de um comando próprio. Pode ter 
vários parâmetros de entrada e vários de saída. Os parâmetros podem ser alterados ou não. Permite 
passagem de parâmetros por valor ou por referência.
Procedure nome_do_procedimento (parâmetros: tipo);
Type
Const
Var
Begin
comandos;
End;
45
Procedimento
x
y
z
Saída
Entrada
e
Tipo A: O procedimento acima possui parâmetros de entrada e saída.
x e y passagem por valor
z passagem por referência
Procedimento
x
y
z
Entrada
Tipo B: O procedimento acima somente possui parâmetros de entrada
x, y e z passagem por valor
Procedimento
a
b
Saída
Tipo C: O procedimento acima possui somente parâmetros de saída
a e b passagem por referência
Observação: Os parâmetros de saída podem ser usados como parâmetros de entrada.
Procedimento
Tipo D: O procedimento acima não possui parâmetros.
Exemplos:
46
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; (* Cálculo do Determinante *)
If delta >= 0 then (* Raízes 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 (* Raízes 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;
End;
End;
Begin
Repeat
ClrScr;
WriteLn('Calcula Raízes'); 
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;
47
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);
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
48
0
1
2
3
:
Ponteiro
a b c
e
f
g
h
d
a Identificação do Registro
b,c,d Campos
e,f,g,h 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 extensão), este 
nome é chamado de nome externo (DOS);
d) Cada registro possui um índice interno e o arquivo possui um ponteiro que indica a posição atual 
do arquivo; 
e) Quando o arquivo é aberto ("Reset") ou criado ("ReWrite") o ponteiro aponta para o registro 
ZERO;
f) A cada leitura ou gravação o ponteiro aponta para o próximo registro (Acesso seqüencial);
g) Pode-se ainda, apontar para qualquer registro (Acesso Randômico) através 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; (* ou Arquivo: File Of Char; *)
 Reg: Char; (* Reg é a variável que representa o registro *)
Binário
Tipo de Arquivo usado para armazenar tipos de dados diferentes.
Type Registro = Record
 Nome: String[30];
 Idade: Byte;
 Salário: Real;
49
 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 Genérico
Var Arq: File Of Byte;
Reg: Byte;
Nome_arquivo: String[14];
Begin
ClrScr;
Write('Informe o Nome do Arquivo: ');
Readln(Nome_arquivo);
Assign(Arq,Nome_arquivo);
ou
Exemplo: Arquivo Específico
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 ...);
50
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.
Modo de Usar:ReName(drive:Arq: File Of ..., novo_nome_para_o_arquivo);
51
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 existência, pois se o arquivo não existir 
haverá um erro em tempo de execução (Run Time Error), e o programa será abortado, para que isto 
não aconteça é 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+};
Observação: {$I-} e {$I+} são diretivas de compilação que forçam o compilador a não abortar se 
houver um erro em tempo de execução (RunTime Error), fazendo ainda com que a variável pré-
definida "IoResult" retorne com a informação se houve erro ou não da seguinte maneira:
IoResult = 0 Arquivo EXISTE
IoResult <> 0 Arquivo NÃO EXISTE
If IoResult = 0 Then
WriteLn('Arquivo EXISTE')
Else
WriteLn('ERRO: Arquivo NÃO EXISTE')
14.1.8 ReWrite
Procedimento que permite criar um arquivo em disco, se o arquivo não 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
Procedimento que permite posicionar o ponteiro do arquivo no registro especificado (Acesso 
Randômico).
Modo de Usar: Seek(Arq: File Of ..., número_do_registro);
52
14.2 Funções
14.2.1 EOF (End Of File)
Função que retorna TRUE se o ponteiro do arquivo chegou ao fim do arquivo, FALSE 
enquanto não for fim de arquivo.
Modo de Usar: EOF(Arq: File Of ...): Boolean;
14.2.2 FilePos
Função que retorna a posição do registro corrente, ou seja, a posição do ponteiro no arquivo 
(o primeiro registro é Zero).
Modo de Usar: FilePos(Arq: File Of ...): Integer;
14.2.3 FileSize
Função que retorna o número de registros do arquivo, "zero" se não existir nenhum registro.
Modo de Usar: FileSize(Arq: File Of ...): Integer;
14.2.4 SizeOf
Função que retorna o número de bytes ocupado por uma variável. 
Modo de Usar: SizeOf(tipo ou variável): 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; (* Definição do Arquivo Interno *)
Reg: REGISTRO; (* Definição do Registro *)
Nome_do_arquivo: String[14];
Ch: Char;
Begin
ClrScr;
Write('Nome do Arquivo: ');
ReadLn(Nome_do_arquivo);
53
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. Gráficos
15.1 Placas Gráficas
15.1.1 CGA
Resolução: 640x200 alta resolução (2 cores)
320x200 baixa resolução (4 cores)
Observação: Palette é um conjunto de cores disponíveis, sendo que na placa CGA possui 16 cores.
15.1.2 EGA
Resolução: 640x350 alta resolução (16cores, 2 págs. gráficas)
640x200 baixa resolução (16 cores, 4 págs. gráficas)
15.1.3 VGA
Resolução: 640x480 alta resolução (16 cores, 1 página)
640x350 média resolução (16 cores, 2 páginas. gráficas)
640x200 baixa resolução (16 cores, 4 páginas. gráficas)
54
15.2 Coordenadas de Tela
15.2.1 CGA
x 0 à 639 ou 319
y 0 à 199
15.2.2 EGA
x 0 à 639 ou 319
y 0 à 199 ou 349
15.2.3 VGA
x 0 à 639 ou 319
y 0 à 199, 349 ou 479
15.3 Detecção e Inicialização da Tela Gráfica
Para sair do modo texto e inicializar o modo Gráfico, o programador deve definir duas 
variáveis: Placa e Modo (podem ter qualquer nome).
Placa: É a variável responsável pelo tipo de placa a ser usada. Pode assumir os seguintes tipos:
Número Nome
0 DETECT
1 CGA
2 MCGA
3 EGA
4 EGA64
5 EGAMONO
6 IBM8514
7 HERCMONO
8 ATT400
9 VGA
10 PC3270
Modo: É responsável pelo modo da placa (alta, média ou baixa resolução):
CGAC0 (320 x 200) 4 cores, 1 página gráfica
CGAC1 (320 x 200) 4 cores, 1 página gráfica
CGAC2 (320 x 200) 4 cores, 1 página gráfica
CGAC3 (320 x 200) 4 cores, 1 página gráfica
CGAHi (640 x 200) sem cor, 1 página gráfica
EGALo (640 x 200) 16 cores, 4 páginas gráficas
55
EGAHi (640 x 350) 16 cores, 2 páginas gráficas
VGALo (640 x 200) 16 cores, 4 páginas gráficas
VGAMed (640 x 350) 16 cores, 2 páginas gráficas
VGAHi (640 x 480) 16 cores, 1 páginas gráficas
Program Detecta_Placa;
Uses Crt,Graph;
Var Placa,Modo: Integer;
Begin
Placa := DETECT;
InitGraph(Placa,Modo,''); (* Procura Arquivos BGI no Diretório Corrente *)
If GraphResult <> GrOk then
WriteLn('ERRO: Inicialização Gráfica');
ou
Program Seta_Placa_VGA;
Uses Crt,Graph;
Var Placa,Modo: Integer;
Begin
Placa := VGA; (* Placa VGA *)
Modo := VGAHI; (* Modo640 x 480, 16 cores *)
InitGraph(Placa,Modo,'D:\\TP\\BGI'); (* Path dos Arquivos *.BGI *)
If GraphResult <> GrOk then
WriteLn('ERRO FATAL: Inicialização Gráfica');
15.4 PutPixel (Pontos)
PutPixel: Procedimento que permite plotar um pixel (ponto ) na tela gráfica.
Modo de Usar: PutPixel(x,y: Integer; Cor_Pixel: Word);
Program Pontos;
Uses Crt,Graph;
Var Placa,Modo: Integer;
X,Y: Integer;
Cor: Byte;
Begin
Placa := VGA;
Modo := VGAHI;
InitGraph(Placa,Modo,''); (* Procura arquivos *.BGI no diretório corente *)
Randomize;
Repeat
X := Random(640);
Y := Random(480);
Cor := Random(16);
PutPixel(X,Y,Cor);
Until KeyPressed;
56
CloseGraph;
End.
15.5 Line (Linhas)
Line: Procedimento que permite plotar uma linha através 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.
15.6 Rectangle (Retângulos)
Rectangle: Procedimento que permite plotar um retângulo na tela gráfica através de dois pontos, Pi 
(Xi,Yi) e Pf (Xf,Yf), estes dois pontos representam a diagonal do retângulo.
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
57
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 (Círculos)
Circle: Procedimento que permite plotar um círculo na tela gráfica, através 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
Xc := Random(640);
Yc := Random(480);
Cor := Random(16);
Raio := Random(100);
SetColor(Cor);
Circle(Xc,Yc,Raio);
Until KeyPressed;
CloseGraph;
End.
58
15.8 Arc (Arcos)
Arc: Procedimento que permite plotar um arco na tela gráfica, através 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 (Polígonos)
DrawPoly: Procedimento que permite plotar um polígono na tela gráfica, através de n pontos 
(P1,P2,...Pn).
Procedimento: DrawPoly(Número_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;
InitGraph(Placa,Modo,'');
(* ------------------------------------ rosto *)
DrawPoly(9,Rosto);
59
(* ------------------------------------ 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 mudança da cor de frente (ForeGround).
Modo de Usar: SetColor(número ou nome_cor: Word); 
SetBkColor: Procedimento que permite mudança da cor de fundo (BackGround).
Modo de Usar: SetBKColor(número ou nome_cor: Word); 
GetColor: Função que retorna a cor de frente corrente.
Modo de Usar: GetColor: Word; 
GetBkColor: Função 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), direção e o tamanho do texto.
Modo de Usar: SetTextStyle(fonte, direção, tamanho: Word);
Número Fontes Direções Tamanhos
0 DefaultFont HorizDir 0
1 TriplexFont VertDir 1
2 SmallFont 2
60
3 SansSerifFont :
4 GothicFont 10
OutTextXY: Permite que um texto seja escrito na tela gráfica na posição 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 Retângulos
Bar: Usado para pintar um retângulo. 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);
Número Estilos
0 EmptyFill (Preenche com a cor de fundo)
1 SolidFill
2 LineFill
3 LTSlashFill
4 SlashFill
5 BKSlashFill
6 LTBKSlashFill
7 HatchFill
8 XhatchFill
9 InterLeaveFill
10 WideDotFill
61
11 CloseDotFill
12 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 Polígonos
a) FillPoly: É usado para pintar um polígono, usando o estilo definido pelo procedimento 
SetFillStyle. Este procedimento preenche qualquer polígono fechado, se o polígono estiver aberto 
este procedimento preenche até encontrar um objeto fechado. 
Modo de Usar: FillPoly(Estilo: Byte; Cor: Byte); 
Program Preenche_Polígono;
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;
Modo := VGAHI;
InitGraph(Placa,Modo,'');
DrawPoly(5,objeto); (* Plota Polígono Vazado*)
Repeat Until KeyPressed;
For Estilo := 0 to 12 do
Begin
SetFillStyle(Estilo,YELLOW); (* Define Estilo e Cor *)
FillPoly(5,Objeto); (* Pinta Polígono *)
ReadLn;
End;
CloseGraph;
62
End.
b) FloodFill: É usado para preencher um polígono, 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 (função 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); (* Cor da borda *)
DrawPoly(Pontos,Rosa); (* Imprime Rosa dos Ventos *)
Circle(159,99,20); (* Imprime Círculo *)
SetFillStyle(SOLID_FILL,BLUE); (* Define Estilo e Cor de Preenchimento *)
FloodFill(10,99,YELLOW); (* Preenche a partir do ponto 10,99 *)
ReadLn;
CloseGraph;
End.
15.13 Ativação de Janelas Gráficas
15.13.1 Janela Ativa
SetViewPort: Procedimento define uma janela ativa
(xi,yi)
(xf,yf)
(0,0)
(Xmax,Ymax)
63
Modode Usar: SetViewPort(Xi,Yi,Xf,Yf: Integer; Recorta: Boolean);
Pi (Xi,Yi): Ponto Inicial
Pf (Xf,Yf): Ponto Final
Recorta: TRUE ou FALSE (Variável que indica se haverá recorte na janela ou não).
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);
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
64
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 Gráficas
GetImage e PutImage: Quando é necessário 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 são 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); 
Número Modos Função
0 CopyPut { Mov }
1 XorPut { XOr }
2 OrPut { Or } ou NormalPut
3 AndPut { And }
4 NotPut { Not }
Para definir o ponteiro, que irá conter os pixels da tela, é necessário saber a quantidade de 
bytes (porção de memória) para salvar a janela gráfica, isto é feito da seguinte maneira:
ImageSize: Retorna o número de bytes necessários 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 alocação dinânica de memória para o ponteiro p, o qual ocupará n 
bytes na memória.
Modo de Usar: GetMem(Var P: Pointer; Número_Bytes: Word);
FreeMem: Procedimento que libera a área de memória ocupada pelo ponteiro p.
Modo de Usar: FreeMem(P: Pointer; Número_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);
65
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);
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.
66
16. Criação de Unidades (Units)
Uma unidade é um conjunto de procedimentos e funções, que podem ser usados por qualquer 
programa.
16.1 Como Criar uma Unidade
O programador pode definir suas próprias unidades Units. Por exemplo: Uses Crt,Graph; que 
são unidades do "Turbo Pascal 5.5". A definição de uma unidade é feita da seguinte maneira:
Unit nome_da_unidade;
Interface
Uses
Const
Type
Var
Procedure
Procedure ... (* Cabeçalho de todos os Módulos *)
Function
Function
Implementation
Procedure
Const
Type
Var
Begin
comandos;
End;
Function
Const
Type
Var
Begin
comandos;
End;
End.
Observação: Uma unidade é um programa Fonte Pascal sem programa principal. Possui extensão 
"nome.PAS" e após compilada, "nome.TPU". A vantagem de uma unidade definida pelo 
programador é que permite que as "procedure" e "function" sejam usadas em qualquer programa.
67
16.2 Exemplo de Criação 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);
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 *)
68
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);
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 *)
69
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);
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.
70
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;
ReadLn;
End.
Observação: Para executar o programa e, obrigar que a unidade seja compilada novamente, deve-se 
compilar com a opção Build do menu Compile. 
17. Memória de Vídeo
Em Pascal, pode-se escrever direto na memória de vídeo sem ser através do comando Write 
ou WhiteLn, isto é feito endereçando um vetor de 4000 bytes a partir do endereço $B800:0000 que 
é o início da tela de texto (endereço na placa de vídeo), isto é feito da seguinte maneira: a primeira 
posição da tela é p[0], a segunda é p[2], pois p[1] e o atributo de cor do primeiro caracter. Para 
calcular a posição no vetor unidimensional atravésda coluna e linha é o seguinte:
80 colunas
25 linhas
0 2 41
2
1 2 80
25
Localização na Memória de Vídeo
71
posição := 160 * (linha - 1) + 2 * (coluna - 1);
Atributo de COR: (1 Byte)
7 6 5 4 3 2 1 0
Fundo FrenteP I
P: Caracter Piscante (Bit 7)
Fundo: Cor do Fundo (Bits: 6,5,4)
I: Intensidade da Cor (Bit 3)
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'); (* Imprime na Memória *) 
Until KeyPressed;
72
End. 
18. Passagem de Parâmetros pela Linha de Comandos do 
Sistema Operacional
Objetivo: Desenvolver programas que interagem com o Sistema Operacional, através de parâmetros.
Variáveis Pré-Definidas
ParamCount: Armazena o número de parâmetros da linha de comandos
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'
73
Objetivo do Programa: Recebe o nome de um arquivo texto, abre o arquivo e lista o conteúdo 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;
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 Não 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;
74
End;
End;
End.
C:\>procura UNIVERSIDADE E
UNIVERSIDADE possui 2 letras E
C:\>_
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 (Variável que Aponta)
19.1 Tipos de Alocação de Memória
19.1.1 - Alocação Estática de Memória
Tipo de alocação de memória onde cada variável global possui um número definido de 
bytes alocados (reservados) na memória, não podendo ser aumentado ou diminuído durante todo o 
programa.
75
Exemplo: 
Var x: Byte; (* 1 byte alocado na memória *)
y: Integer; (* 2 bytes alocados na memória *)
19.1.2 - Alocação Dinâmica de Memória
Tipo de alocação onde cada variável possui um número indefinido de bytes alocados na 
memória, podendo ser alocado ou desalocado a qualquer momento com qualquer tamanho. Para isto, 
é necessário usar uma variável do tipo Ponteiro. As variáveis locais são alocadas dinamicamente.
Observação: Um ponteiro é uma variável que ocupa 4 bytes
Definição: Var nome_do_ponteiro: ^tipo_base;
Exemplo: Var p: ^Integer; (* p aponta para um inteiro [2 Bytes] *)
Alocação: Espaço reservado na memória RAM
Alocar um Ponteiro
New(p);
Procedimento que aloca memória do tamanho do tipo_base;
Exemplo: New(p);
If p = Nil Then
WriteLn('ERRO: Falta de Memória')
Else 
WriteLn('Ok, Ponteiro Alocado');
Nil: Palavra reservada que representa ponteiro nulo, ou seja, ponteiro não aponta para nada.
Desalocação: Liberação de espaço alocado na memória
Desalocar o Ponteiro
Dispose(p);
Procedimento que desaloca a memória alocada pelo procedimento New(p);
Alocar uma Área
GetMem(p,número_de_bytes);
76
Procedimento que aloca uma área com "n" bytes
Exemplo:
Uses Crt;
Var P: ^Integer;
N: Byte;
Num_Bytes: Word;
Begin
ClrScr;
Write("Número de Elementos: ');
ReadLn(N);
Num_Bytes := N * SizeOf(Integer); (* Calcula o Número de Bytes *)
GetMem(P,Num_Bytes);
If P = Nil Then
WriteLn('ERRO: Falta de Memória')
Else
WriteLn('Ok, Ponteiro Alocado');
Desalocar uma Área
FreeMem(p,número_de_bytes);
Procedimento que desaloca uma área com n bytes
Definições
p Contém o endereço de memória apontada pelo ponteiro
p^ Contém o conteúdo do ponteiro
@n Contém o endereço da variável n
Uses Crt;
Var N: Integer;
P: ^Integer; 
Begin
ClrScr;
N := 65;
P := @N; (* Ponteiro aponta para a variável n *)
WriteLn('Conteúdo: ',P^);
End.
77
1000
1001
1002
1003
1004
1005
@n
@p
1 Byte
n
p
(2 bytes)
(4 bytes)
65
1000
endereço conteúdo
Memória RAM
Endereço: [Segmento:OffSet]
Funções
a) MemAvail: Retorna o número de bytes disponível na memória
b) MaxAvail: Retorna o número de bytes do maior bloco disponível na memória
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 Memória
Variável Pré -Definida
Mem[Segmento:OffSet]
78
Para acessar diretamente a memória usa-se a variável pré-definida Mem. Com esta variável, 
pode-se listar ou modificar uma posição de memória.
Endereço do Vídeo: $B800:0000 Segmento $B800
OffSet $0000
Objetivo do Programa: Possui dois procedimentos, um para preencher a tela com caracteres 
aleatórios e outro para limpar a tela (preencher com espaços) sem Write. 
Uses Crt;
Procedure Limpa_Tela;
Var Segmento,OffSet: LongInt;
Begin
Segmento := $B800;
OffSet := $0000;
Repeat
Mem[Segmento:OffSet] := 32; (* 32 - Espaço *)
Inc(OffSet,2);
Until OffSet = 4000;
End;
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 Memória de Vídeo:
Uses Crt;
Var Video: Array[0..3999] Of Char Absolute $B800:0000;
C,L: Byte;
79
Letra: Byte;
Procedure Imprime(c,l,Letra: Byte);
Var posicao: Integer;
Begin
posição := 160 * (l - 1) + (c - 1) * 2;
Video[posição] := 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 alocação indeterminada de elementos. Tem por característica um elo de ligação 
entre um elemento e outro.
Possui um Header (cabeça) que indica o primeiro elemento da lista. 
c
c b a
1 NIL2 a3 b
Header
As listas são percorridas seqüencialmente, apenas numa direção, ou seja, do primeiro ao 
último elemento. A informação do número 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: 
Primeiro n Último
DESCRITOR
80
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

Outros materiais