Curso de Pascal
Comandos Básicos
Você está em: MarMSX >> Cursos >> Pascal
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.