Curso de Pascal
Comandos Básicos


  Principais comandos do Pascal:

COMANDO DESCRIÇÃO
write  Escreve algo na tela. Ex: write('MSX');
writeln  Escreve algo na tela e vai para a linha seguinte.
read  Lê dados do teclado. Equivale ao INPUT do Basic.
readln  Lê dados e pula uma linha.
clreol  Limpa o restante da linha sem mover o cursor.
clrscr  Limpa a tela.
delay(t)  Dá uma pausa de t milisegundos.
begin  Começa uma estrutura.
end  Termina uma estrutura.
exit  Abandona uma subrotina (procedure ou function).
halt  Abandona o programa e retorna ao DOS.
gotoxy  Posiciona cursor. Igual ao LOCATE do Basic.
goto  Desvia execução do programa para uma label.
inline  Executa instruções em Assembly :)
keypressed  Verifica se uma tecla qualquer foi pressionada.
read(kbd,<char>)  Keypressed do MSX. Ex: char c; read(kbd,c);
length  Retorna o tamanho de um string.
random  Gera números aleatórios.
randomize  Prepara para gerar números aleatórios.
wherex  Retorna a coluna do cursor.
wherey  Retorna a linha do cursor.
for  Estrutura de repetição.
while  Estrutura de repetição.
repeat .. until  Estrutura de repetição.
 if  Teste lógico.
 hi  Retorna a parte mais alta de um inteiro.
 lo  Retorna a parte mais baixa de um inteiro.
 paramcount  Conta o número de parâmetros passados pela linha de comando.
 paramstr(n)  Retona o enésimo passado pela linha de comando.
 sizeof(var)  Retorna o tamanho em bytes de uma variável var.
 maxavail  Retorna o maior espaço consecutivo de memória. Usar com ponteiros.
 memavail  Retorna a quantidade de memória disponível.
 getmem(p,size)  Aloca espaço de memória.
 freemem(p,size)  Libera espaço na memória.
 move  Move dados na memória. Parâmetros: var1, var2, num.
 fillchar  Preenche a memória com um valor. Parâmetros: var1, num, value.


  Obs: há funções que retornam valores negativos para o tipo integer. Para resolver esse problema, armazene o resultado em uma variável do tipo real e faça a conta 65536.0 + valor, se negativo.
var valor : real;
...
if (valor < 0) then
  valor := 65536.0 + valor;



  Exemplos:

  1- gotoxy:
begin
  gotoxy(1,1);
  write('MSX');
end.


  2- goto:
label volta;

begin
  volta: writeln('Isto vai ser escrito para sempre!'); 
  goto volta;
end.


  3- inline:

  A instrução inline recebe os bytes do programa em Assembly separados pela barra "/".
begin
  { Programa em Assembly para limpar a tela }
  inline (
            $F3/              { DI }
            $FD/$2A/$C0/$FC/  { LD IY,(EXPTBL - 1) }
            $DD/$21/$C3/00/   { LD IX,CLS }
            $CD/$1C/$00/      { CALL CALSLT }
            $FB               { EI }
         );
end.
  Obs: como o executável do Pascal roda sob o MSX-DOS, as 4 páginas de memória estão setadas para RAM. Assim, devemos realizar uma chama inter-slot para a BIOS. O registrador IY recebe o endereço de EXPTBL menos 1, enquanto que o registrador IX recebe o endereço de memória da instrução da BIOS a ser executada. É importante antes desse procedimento desabilitar a interrupção do Z80.

  Podemos incluir constantes ou variáveis do Pascal dentro do código em Assembly. O tamanho em bytes ocupado pela variável corresponde ao tamanho do tipo de dado declarado para ela.
const EXPTBL = $fcc0; { Ocupa 2 bytes }
      CALSLT = $001C; { Ocupa 2 bytes }
      CLS    = $00C3; { Ocupa 2 bytes }

begin
  { Programa em Assembly para limpar a tela }
  inline (
            $F3/              { DI }
            $FD/$2A/EXPTBL/   { LD IY,(EXPTBL - 1) }
            $DD/$21/CLS/      { LD IX,CLS }
            $CD/CALSLT/       { CALL CALSLT }
            $FB               { EI }
         );
end.


  4- read(kbd,<char>):
var tecla : char;

begin
  writeln('Tecle ESC para parar');
  while ord(tecla)<>27 do
  begin
   gotoxy(1,2);
    writeln('Estou em LOOP ...');
    read(kbd,tecla);
  end;
  writeln('ESC pressionado!');
end. 


  5- readln(<variavel>):
var nome : string[20];

begin
  write('Digite seu nome');
  readln(nome);

  writeln('Olá, ',nome);
end. 


6- random e randomize:
begin
  randomize;
  writeln('Um número aleatório: ', random(10));
end. 

  Vários números aleatórios:
var i : integer;

begin
  randomize;

  for i:=1 to 5 do
    writeln(random(10));
end. 

Obs:

  O ponto e vírgula (;) é usado em Pascal para indicar que um comando ou estrutura acaba naquele ponto.
  O ponto final é usado apenas no END do corpo principal do programa, indicando que o programa acaba ali.
  O Símbolo $ indica que o número é hexadecimal.


  7- lo e hi:
var i:integer;

begin
  i := $0204; { Hexadecimal }

  writeln('Valor mais alto de i: ', hi(i));
  writeln('Valor mais baixo de i: ', lo(i));
end.
  Saída:
  Valor mais alto de i: 2
  Valor mais baixo de i: 4


  8- paramcount e paramstr:
begin
  writeln('Número de parametros passados: ', paramcount);
  writeln('Seu nome é: ', paramstr(1));
end.
  Rodar no DOS (supondo o nome do programa igual a "prog.pas"):
A:>prog MSX
  Saída:
  Número de parametros passados: 1
  Seu nome é: MSX



  ESTRUTURAS DE DECISÃO E REPETIÇÃO (ITERAÇÃO) - STATEMENTS

  1. IF

  O IF testa se um dado teste lógico é verdadeiro. Em caso afirmativo, executa um trecho de código associado a ele (vem logo após o comando, delimitado por um begin e end).

  Sintaxe:
if (teste_lógico) then
begin
  { seu código aqui }
end;

  Vamos ver um exemplo, onde o programa testa se o nome é "José":
var nome : string[40];

begin
  nome := 'Jose';
  if (nome = 'Jose') then
    writeln('Seu nome é José');
end.
  Obs: Quando o código de tratamento possui apenas uma linha, não é necessário utilizar o delimitador begin e end.

  A palavra reservada ELSE é utilizada junto com o comando IF para executar um tratamento alternativo ao teste realizado. Ex:
var nome : string[40];

begin
  nome := 'Jose';
  if (nome = 'Jose') then
    writeln('Fala, Zé !')
  else
    writeln('Tudo bem, ', nome, '?');
end.
  No exemplo acima, caso o nome armazenado na variável "nome" seja José, imprimirá a mensagem "Fala, Zé!". Caso seja diferente de José, irá imprimir outra mensagem de saudação com o nome da pessoa.

  A linha imediatamente anterior ao ELSE deverá vir sem o ponto e vírgula no final, seja ela um comando ou a terminação "end". Veja os exemplos a seguir.
if a=5 then
begin
  c := c+1;
  d := 4;
end
else
  c := 0;
end;
if a=5 then
c := c+1
else
  c := 0;
end;
  Já a última linha do ELSE sempre tem o ponto e vírgula.

  Podemos fazer o teste em cascata. Ex:
var nome : string[40];

begin
  write('Escreva seu nome: ');
  readln(nome);

  if (nome = 'Jose') then
  begin
    writeln('Fala, Zé !');
  end
  else
  begin
    if (nome = 'Maria') then
      writeln('Oi Maria.')
    else
      writeln('Tudo bem, ', nome, '?');
  end;
end.
  O teste mais externo quer saber se o nome é José. Em caso negativo, um novo teste (teste interno) verifica se o nome é Maria. Se sim, imprime "Oi Maria". Senão, imprime uma mensagem com o nome dado.
  Aqui nesse caso, se eu colocasse o teste para saber se o nome é Maria dentro do IF e não do ELSE, jamais conseguríamos executar os comandos referentes a "Maria", uma vez que para entrar nessa sentença a condição do nome deverá ser igual a 'José' (não pode ser José e Maria ao mesmo tempo).

  Sintaxes para múltiplos testes:
Sintaxes válidas:
if a=1 then
if (a=1) then
if (a=1) and (b=2) then
if ((a=1) and (b=2)) then

Sintaxes inválidas:
if a=1 and b=2 then
if (a=1 and b=2) then


  2. FOR

  Cria um laço de repetição, através da definição de uma variável de controle e o domínio (espaço de variação). Assim, é definido para a variável de controle um valor incial e um valor final. A progressão pode ser ascendente ou descendente.

  Sintaxes:
for variavel_controle := valor_incial to valor_final do { Progressiva }
for variavel_controle := valor_incial downto valor_final do { Regressiva }

  Exemplo - escrever de 1 a 10:
var i : integer;

begin
  for i:=1 to 10 do   { i é a variável de controle }
    writeln(i);
end.
  O controle do laço é automático. Outra dica importante é de não alterar o valor da variável i dentro da sentença do for.


  3. WHILE

  O WHILE também é uma laço repetitivo. Diferente do FOR, ele repete os comando enquanto um teste lógico no inicio da sentença for verdadeiro.
  A repetição do WHILE não termina de forma automática. Desse modo, a condição de parada deverá ser ativada de dentro da sentença.

  Sintaxe:
while (teste_logico) do   { condição de entrada e permanência no loop }
begin
  { sentença }
end;

  Observe que um teste lógico é feito ANTES de entrarmos no código de tratamento do WHILE. Caso afirmativo, entra. Senão, sai e segue o programa.
  Vamos repetir o exemplo de escrever de 1 a 10, adaptado para o WHILE:
var i : integer;

begin
  i:=1;

  while (i <= 10) do
  begin
    writeln(i);
    i := i + 1;
  end;
end.
  Para se atingir a condição de parada, o programa incrementa o valor de i até chegar a 10.


4. REPEAT

  Igual ao WHILE, porém o teste logico é feito ao FINAL da sentença e não no inicio. Nesse caso, ele entra na estrutura em qualquer caso, pois não há um teste inicial de entrada.

  Sintaxe:
repeat
  { sentença }
until (teste_logico);   { condição de sáida do loop }

  Exemplo:
var i : integer;

begin
  i:=1;

  repeat
    writeln(i);
    i := i + 1;
  until (i > 10); { 11, porque se parar no 10 não imprime o valor 10 }
end.
  Obs: Não deve colocar begin e end, uma vez que a instrução repeat seguida de until delimitam o código.

  Observe no programa anterior que o teste lógico é uma condição necessária para abandonar o loop, e não um teste de permanência como no WHILE.


<< Anterior Pascal Próxima >>


/MARMSX/CURSOS/PASCAL