
Capitulo 9 - comandos simples

  Para que possamos dar continuidade aos nossos estudos, iremos conhecer agora
alguns comandos simples. Comearemos por alguns programas simples e tenta-
remos evoluir  medida que formos conhecendo novos comandos.

COMANDOS SIMPLES DE ENTRADA E SADA
  Os comandos de entrada e sada nos permitem uma interao maior com o
usurio. A princpio usaremos somente o dispositivo padro de entrada/sada,
ou seja, a CONsole (Teclado+Vdeo).
WRITE   procedimento que permite escrever em um dispositivo de sada, nor-
   malmente o vdeo, sua sintaxe:
WRITE([varf:text,]v1[v2,...,v2]);
PROGRAM exemplos_write;
VAR
    st : STRING[20];

BEGIN
    st:="teste de comando write";
    write(st);     {exibe na posio do cursor}
                   {o contedo da varivel st}
    WRITE(' O contedo de st e ', st);
                   {exibe na posio do cursor}
                   {tanto o texto entre       }
                   {apostrofo, quanto o contedo}
                   {da varivel st}
  END


WRITELN - procedimento que permite escrever em um dispositivo de sada,
normalmente o vdeo, avanando o cursor para o incio da prxima linha,
sua sintaxe:

WRITELN([var f: text,] v1 [v2,...,v2]);

PROGRAM exemplos_writeln;

VAR
    st : STRING[20];

BEGIN
    st:= "teste do comando writeln";
    WRITELN(st);    {exibe na posio do cursor o contedo da varivel}
                    {st, e avana o cursor para o incio da prxima linha}

WRITELN(' O contedo de st e ', st);
        {exibe na posio do cursor tanto o texto entre o apostrofo quanto}
        {o contedo da varivel st, e avana o cursor para o incio da    }
        {prxima linha}

END


READ - este procedimento permite a entrada de dados.No o utilize para
receber variveis via teclado, esta  uma restrio do Turbo. Esse
comando s dever ser utilizado para receber informaes  de outros dis-
positivos, normalmente arquivos em disco. Sua sintaxe:
    READ([var<f>]:TEXT;}<v1>[,v2,...<vn>])
    No caso de varivel de arquivo "f" ser omitida, o dispositivo associado
a INPUT ser assumido (default CON). Retomaremos este tpico em outros captulos.

READLN
    Procedimento que permite a entrada de dados em variveis oriundas de diversos
dispositivos. O que veremos neste momento,  o dispositivo de entrada padro
CONsole(teclado). Sua sintaxe:

READLN([var<f>]:TEXT;]<v1>[,v2,...<vN>])
    Ao utilizarmos esta procedure, estaremos transferindo informaes do
dispositivo de entrada para uma ou mais variveis. Se este dispositivo for a
console, a entrada de dados estar limitada em 128 caracteres.
PROGRAM exemplo_readln;
VAR
    s   : STRING[40];
    r   : REAL;
    int : INTEGER;
BEGIN
READLN(S);         {permite que entremos com uma sequencia de caracteres na
string "s" at que seja digitada a tecla ENTER}
READLN(r, int)     {para transferir as informaes para as variveis "r" e
"int" podemos agir de duas formas diferentes: a primeira seria deixando um
espao entre ambas , a segunda digitando o contedo da primeira <ENTER> e o
contedo da segunda e outro <ENTER>}
END.

 A utilizao dos comandos de entrada e de sada nos proporcionam vrias
formas de interao com o usurio. a seguir, veremos alguns exemplos destes comandos:

PROGRAM entrada_sada;

VAR
    mensagem: STRING[50];

BEGIN
    WRITELN ('Entre com uma mensagem na linha abaixo');
    READLN( mensagem);
    WRITELN;      { este comando faz com que fique uma linha em branco}
    WRITELN('Esta foi a mensagem digitada:', mensagem);

    Note que o comando write ou writeln,  diferente de outras linguagens
que nos permite no apenas a exibio da mensagem, como tambm a leitura da
varivel em um nico comando, como no caso do INPUT do BASIC. Outro detalhe
que cabe salientar  o fato de aps o trmino da execuo do programa, o
cursor foi diretamente para a janela de edio. Para que possamos ver o
resultado do programa devemos digitar ALT-F5, e aps termos olhado para o
contedo da tela, basta que pressionemos qualquer tecla e o cursor retornar
ao programa.
Podemos ainda exibir o resultado de uma expresso sem a necessidade de
fazermos a operao antecipadamente, como no exemplo
PROGRAM exibe_result;
VAR
    opr1,
    oper2 : REAL;
BEGIN
    WRITE('Digite o valor do primeiro operador: ');
    READLN(oper1);
    WRITE ('Digite o valor do segundo operador: ');
    READLN(oper2);
    WRITELN;
    WRITELN('A soma entre o primeiro ', oper1, ' e o segundo ', oper2, 'e',
'  ', opr1+oper2);
    WRITELN;
    WRITELN('A subtrao entre o primeiro ', oper1, ' e o segundo ', oper2,
'e ' '  ', oper1-oper2;
    WRITELN;
END.

ATENO:
    Quando o contedo de um comando no couber em uma nica ou ainda, se por
razes estticas queremos dividir o contedo, podemos faz-lo onde exista
uma vrgula como delimitador, como nos exemplos anteriores.

    Se no exemplo anterior, entrarmos com o valor 123 para oper1 , e 345
para o oper2, ao exibirmos o primeiro resultado veremos que os contedos dos
campos sero mostrados em formato cientfico, como segue:
1.2300000000E+02   3.4500000000E+2   e  4.6800000000E+02, para a subtrao:
1.2300000000E+02    3.4500000000E+02  e  -2.2200000000E+02

Uma forma para a soluo deste problema seria definir os operadores do tipo
INTEGER , porm se tivssemos a necessidade de trabalharmos com nmeros
reais, ou ainda de fazermos o uso de operaes que exijam tipos reais, como
no caso da diviso deveremos usar de outro recurso de write que  o de
tabular as inforamaes de sada. Isto  feito colocando-se:"n" (dois
pontos) aps a varivel, onde (n)  o deslocamento a partir da posio
corrente do cursor. No caso de valores reais, podemos inda determinar a
quantidade de casas decimais que sero exibidas, colocando-se mais uma
sequncia ":n". Utilizando o exemplo anterior, como ficaria:

PROGRAM exibe_result_tabulado;
VAR
    oper1, oper2 : REAL;
BEGIN
    WRITE ("Digite o valor do primeiro operador:");
    READLN(oper1);
    WRITE ("Digite o valor do segundo operador:");
    READLN(oper2);
    WRITELN("A soma entre o primeiro ", oper1:6:2, " e o segundo ", oper2:6,
" e "  ", oper1+oper2:6:2);
    WRITELN;
    WRITELN("A subtrao entre o primeiro ", oper1:6:2, " e o segundo ",
oper2:6:2, "  e" "  ", oper1-oper2:6:2;
    WRITELN;
END.
  Aps termos entrado com os mesmos valores, as sadas sero exibidas de 
uma forma mais agradvel.
  123.00   345.00   e   468.00

  E para a subitrao

  123.00   345.00   e   -222.00

Para digitrarmos valores decimais, basta inserirmos um ponto (.) na posio
decimal e com isto estaremos indicando o ponto flutuante dos operadores.

  Outro detalhe interessante de se notar  que para exibirmos o caractere
 (apstrofo), devemos colocar dentro da constante um duplo apstrofo ().
  
  Uma ressalva deve ser feita, a digitao dos contedos deve ser feitas
sempre com tipos de acordo com o declarado em VAR, caso contrrio, o usurio
ser informado do erro e o programa ter um trmino irregular. Existem di-
versos mtodos de se inibir estes tipos de erros, porm isto s ser feito
mais adiante. Por enquanto faam apenas uma consistncia simples, ou seja,
somente usando de bom senso.
  
  Apesar de termos melhorado bastante a sada de nosso programa, ele ainda 
no est de uma forma que nos agrade visualmente e poderia ser melhorado
se tivssemos limpado a tela antes de comearmos a exibir as mensagens, ou
se posicionarmos o cursor na tela em locais estrategicamente predefinidos e
outros recursos de vdeo, porm para fazermos uso destes recursos devemos
utilizar a unidade (UNIT0 que tem  o suporte para estas tarefas, no caso a
CRT. De uma forma geral, todos os procedimentos e funes de vdeo esto
contidos nesta unidade, e para fazermos uso da mesma devemos informar na
declarao USES, que a unidade CRT ser compilada junto ao programa, e assim
todas as suas rotinas estaro disponveis.

Exemplos:
PROGRAM teste_uses;
USES
    CRT;
BEGIN
END.
    Como j havamos visto anteriormente, dentro da unidade CRT existem
vrios comandos relacionados a vdeo. Neste momento, veremosapenas alguns
deles, porm  mais adiante dedicamos um captulo somente a esta unidade.

CLRSCR
Este procedimento nos permite limpar a tela e automaticamente colocar o
cursor no canto superior esquerdo da mesma.  a contrao das palavras
inglesas CLeaR e SCReen.
GOTOXY
Este procedimento nos permite posicionar o cursor em um ponto qualquer da
tela, referenciado pelos eixos X e Y, ou seja, coluna e linha. Tanto a
coluna como a linha devem ser vlidas, caso contrrio, o procedimento no
ser executado, no causando nenhum dano ao programa. Sua sintaxe:
GOTOXY(<COL>,<LIN>:BYTE);

Normalmente,  utilizado antes de um comando de entrada ou de sada. Se mais
uma vez modificamos o exemplo anterior, poderemos dar uma aparncia melhor a
ele, como segue:

PROGRAM exibe_result_CRT;

USES
CRT;

VAR
    oper1, oper2 :REAL
BEGIN
    CLRSCR;        {limpa a tela}
    GOTOXY(10,6);  {COLUNA 10 DA LINHA 6}
    WRITE("Digite o valor do primeiro operador : ");
    READLN(oper1);
    GOTOXY(10,8)   {coluna 10 da linha 8}
    WRITE(" Digite o valor do segundo operador : ");
    READLN(oper2);
    GOTOXY(10,10)  {coluna 10 da linha 10}
    WRITELN("A soma entre o primeiro ", oper1:6:2, " e o segundo ", oper2:6,
"e" "  ", oper1+oper2:6:2);
    GOTOXY(10,12)  {coluna 10 da linha 12}
    writeln("A subtrao entre o primeiro , oper1:6:2,  e o segundo ,
oper2:6:,  , oper1-oper2:6:2;
END.

Desta vez a apresentao do programa foi feita de uma forma mais agradvel,
contudo ainda temos um pequeno problema, o cursor continua voltando  janela
de edio ao trmino do programa. Para solucionarmos este problema temos
diversas opes, aprimeira delas seria o uso de um comando READLN, sem
parmetro, assim o programa ficaria  espera da digitao da tecla <ENTER>.
Uma outra opo seria um outro comando da CRT.

DELAY
 Este procedimento permite-nos fazer uma pausa programada por um
determinado tempo, antes de ser executado o prximo comando. Sua sintaxe :

DELAY <milissegundos>:BYTE);

O parmetro passado  sempre em milissegundos, ou seja, se quisermos uma
parada de 1000 milissegundos, devemos passar este valor como parmetro do DELAY,
    DELAY(1000);
