Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagem Pascal
por Paulo Roberto Gomes Luzzardi
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.
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 5.2 Operadores Relacionais 5.3 Operadores Lgicos
2
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 7.7 Comando Repeat ... Until 7.8 Comando Halt 7.9 Comando Exit 8. Entrada e Sada
3
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 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
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 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 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)
5
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
1.2 Objetivos
a) Ensino da Programao, pois uma linguagem didtica; b) Programao Estruturada.
janeldsitc(bug)
janeldmsgobit
Mesag/Wtch
janeldio
Edit
FileEdtRunCompPrjcOsDbgBak/wh
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).
Directory (Diretrio)
Exibe o diretrio do disco corrente, de acordo com uma mscara especificada, permite ainda, que um arquivo seja carregado.
Sada temporria do Turbo Pascal para o Sistema Operacional. Para retornar ao Ambiente digita-se Exit.
Build (Construir)
Recompila todos os arquivos relacionados ao arquivo primrio ("Primary File").
10
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 podese 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. 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.
11
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.
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).
12
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.
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.
14
15
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 }
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;
(* ----------------------------------------------- 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.
17
Begin ClrScr; Data.ano := 1995; Data.mes := 12; Data.dia := 19; Nome := _UCPel';
Var Pi,Inflacao,Juros,Nota,Salario: Real; Begin Pi := 3.1415; Inflacao := 13.6; Juros := 25.7; Nota := 5.99; Salario := 87657.99;
Faixa: [0 255]
Var Dia,Mes,Idade,Numero_de_Dentes: Byte; Begin Dia := 31; Mes := 12; Idade := 33; Numero_de_Dentes := 12;
Var Sexo,Opcao,Letra,Operacao: Char; Begin Sexo := 'F'; Opcao := '1'; Letra := 'a'; Operacao := '+'; Caracter := #65; { Letra A } Letra := CHR(66); { Letra B }
18
Begin
(0 65535)
19
Begin
7 1
2 3
1. Parnteses: () 2. Operador unrio: -(valor) 3. Funes 4. Operador Not 5. * / Div Mod And 6. + - Or Xor 7. = <> > < >= <= (Operadores Relacionais)
5.3.3 - Or (ou):
21
Condio A OR V Condio B F V V V F V F
F V F
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]; (* verdadeiro quando X igual a: 1,2,3,4,5 *) igual a:
22
(* ou X In [1..5]; *)
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.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). 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
23
7.1.4 Atribuio
24
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.4 - Comando Case ... Of ... Else ... End (Comando de Seleo)
25
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 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'); :
26
End;
29
WriteLn(lst,#12); WriteLn(lst,#15);
25 Tel
Linh
as
Var L: Byte; Begin TextBackGround(WHITE); ClrScr; TextColor(BLACK); For L := 1 to 24 do Begin GotoXY(40,L); ClrEol; End; End.
Nmero 0 1 2 3 4 5 6 7
Cor preto azul verde azul claro vermelho rosa marrom cinza
32
(Xi,Yi)
(Xf,Yf)
Modo de Usar: Window(Xi,Yi,Xf,Yf); Observao: Aps setar uma janela ativa a posio (1,1) passa ser o canto superior esquerdo.
(* ativa o auto-falante com a nota 220 *) (* perodo de durao do som *) (* desativa o auto-falante *)
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'];
34
Until (Ch IN ['N','n']) Or (I > QUANT); N := I - 1; (* nmero 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 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;
35
End; End.
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; (* 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.
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 ClrScr; S1 := 'Turbo '; S2 := 'Pascal '; S3 := '5.5'; Sr := Concat(S1,S2,S3); WriteLn(S1);
38
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.
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;
39
Var Begin
S1: String[2]; S2: String[17]; 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]; 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;
40
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; 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 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. 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;
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 passagem por referncia *) 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; (* 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 *)
43
Resultado := ELEVA(Base,Expoente); 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.
(* Chamada da Funo *)
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
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;
Enx eyFuResltadorn Sa
trad da
no
45
Entrada e Sada
x y z
Procedimento
Tipo A: O procedimento acima possui parmetros de entrada e sada. x e y passagem por valor z passagem por referncia x y z
Entrada
Procedimento
Tipo B: O procedimento acima somente possui parmetros de entrada x, y e z passagem por valor
a Sada b Procedimento
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
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; (* 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; 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; Uses Crt; Var A,B,C: Real; Delta,R,I: Real; X1,X2: Real; (* Procedimento Tipo A *)
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
a Ponteiro 0 1 2 3 :
a b,c,d e,f,g,h
d e f g h
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; 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.
Binrio
Tipo de Arquivo usado para armazenar tipos de dados diferentes. Type Registro = Record Nome: String[30]; Idade: Byte; Salrio: Real;
49
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 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
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
Procedimento que permite posicionar o ponteiro do arquivo no registro especificado (Acesso Randmico). Modo de Usar: Seek(Arq: File Of ..., nmero_do_registro);
52
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;
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.
Observao: Palette um conjunto de cores disponveis, sendo que na placa CGA possui 16 cores.
15.1.2 EGA
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)
54
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
Modo: responsvel pelo modo da placa (alta, mdia ou baixa resoluo): CGAC0 CGAC1 CGAC2 CGAC3 CGAHi EGALo (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
55
(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');
CloseGraph; End.
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.
58
(* ------------------------------------ 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.
Tamanhos 0 1 2
3 4
SansSerifFont GothicFont
: 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.
61
11 12
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; 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;
62
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 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; End. Placa,Modo: Integer; Estilo: Byte;
(* Cor da borda *) (* Imprime Rosa dos Ventos *) (* Imprime Crculo *) (* Define Estilo e Cor de Preenchimento *) (* Preenche a partir do ponto 10,99 *)
(xf,yf) (Xmax,Ymax)
63
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); 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.
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;
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. 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);
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
67
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
25
Fundo
Frente
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'); Until KeyPressed;
72
(* Imprime na Memria *)
End.
Variveis Pr-Definidas
ParamCount: Armazena o nmero de parmetros 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'
73
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; N_Car: LongInt; 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);
74
Begin
End; 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 (Varivel que Aponta) 19.1 Tipos de Alocao de Memria 19.1.1 - Alocao Esttica de Memria
75
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; y: Integer; (* 1 byte alocado na memria *) (* 2 bytes alocados na memria *)
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);
76
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.
77
ri By n0 1 p2 3 4 5 nderot 0 ytes)
aRA te
65n(
2by
tes)
eod
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.
78
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; 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.
(* 32 - Espao *)
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.
Header c c 3 b b 2 a a 1 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:
80
E E/S 3 Pilha 2 1 3 2 1 S
Pilha: Entrada: 1,2,3 Sada: 3,2,1 Fila: Entrada: 1,2,3 Sada: 1,2,3
Fila
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.
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.
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 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;
84
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; 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;
85
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 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);
86
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; 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;
87
(* Nmero da Pgina *)
ClrScr; For L := 1 To 24 Do For C := 1 To 80 Do Begin Cursor(C,L); Write(' =O-'); Delay(TEMPO); End; End.
(* Controla a Velocidade *)
88