COMEÇANDO A PROGRAMAR


  O objetivo dessa seção é apresentar a estrutura completa de um programa em Pascal, bem como apresentar alguns programas exemplo para que o leitor possa rodar e observar os resultados.

  Não é o objetivo ainda a compreensão do funcionamento detalhado das estruturas aqui apresentadas, mas apenas a sua organização dentro do programa. As explicações de cada uma dessas estruturas serão apresentadas nos capítulos seguintes, onde o leitor terá a oportunidade de retornar a esta seção e verificar como cada estrutura se encaixa.



ESTRUTURAÇÃO DO PROGRAMA EM PASCAL

  Todas as estruturas de um programa em Pascal apresentadas aqui são opcionais, exceto o corpo principal do programa que é obrigatória a presença. Dessa forma, as estruturas opcionais são adicionadas conforme a necessidade do programador.

Estrutura do programa Descrição
program teste; Ilustra o nome do programa. Não é necessário.
type dia = 1..31;
        cor = (azul,amarelo,verde,vermelho);
        ficha = record
                       nome : string[40];
                       idade : integer;
                    end;
Definição de estruturas do tipo type.
var fichario : array[1..100] of ficha;
      altura : real;
      pais : string[20];
      narea : integer;
Declaração das variáveis globais
function area_triangulo(base, altura : real) : real;
begin
  area := (base * altura) / 2.0;
end;
Criação de funções. Podem ser criadas n funções aqui.
procedure crescimento(var a,b,c : real; x : real);
var f : integer;
begin
  while (a*b*c < x) do
  begin
    a = a + 0.1;
    b = b + 0.3;
    c = c + 0.5;
  end;
end;
Criação de procedures. Podem ser criadas n procedures aqui.
begin
  fichario[1].nome := "Marcelo";
  narea := area(5,2,4);
end.
Corpo principal do programa. Gerencia funções e procedures.

  As estruturas do pascal como funções, procedimentos, corpo principal, if, while, do while etc são delimitadas pelas palavras reservadas "begin" e "end" (inicio e fim). Dessa forma, todo código relativo a cada uma dessas estruturas DEVERÁ estar contido dentro dessa limitação. Observe que as funções e procedimentos permitem apenas a declaração de variáveis e tipos fora dessa limitação.

  Quando a delimitação de fim é seguida de ponto final ("end."), indica o fim da execução de um programa e é utilizado exclusivamento no corpo principal do programa. Já nas outras estruturas, o fim é sempre seguido de ponto e vírgula ("end;").

  Conforme dito anteriormente, a única estrutura obrigatória (e mínima estrutura) é o corpo principal. Assim, pode-se fazer um programa bem simples como o a seguir:

begin
  writeln('Olá mundo!');
end.



  EXEMPLOS DE PROGRAMAS EM PASCAL

  A seguir, serão apresentados alguns programas de exemplo para que o leitor possa ir se familiarizando com o Pascal. O objetivo aqui é apresentar alguns problemas comuns e suas respectivas soluções, sem se prender ainda aos detalhes de cada estrutura apresentada, estruturas essas que serão abordadas nos capítulos seguintes.

  Procure principalmente executar cada programa, entender a maneira de como eles são estruturados e seu funcionamento básico.



PROBLEMA 1

  Fazer um programa que receba as horas do teclado e dê uma saudação de bom dia, boa tarde ou boa noite.

  SOLUÇÃO:
var horas : integer;

begin
  write('Qual a hora? ');		{ Imprime na tela a mensagem 'Qual a hora? ' }
  readln(horas);                        { Lê dados do teclado }
  if (horas >= 6) and (horas < 12) then
    writeln('Bom dia.');
  if (horas >=12) and (horas < 19) then
    writeln('Boa tarde.');
  if (horas >=19) or  (horas < 6) then
    writeln('Boa noite.');
end.

  Obs:
  1. As chaves indicam um comentário em seu conteúdo e não são levados em consideração (interpretados) pelo compilador Pascal.
  2. Em estruturas como if, for etc onde o código interno tenha somente UMA linha, o begin e end podem ser suprimidos (são opcionais).

  DICA - ENTENDENDO VARIÁVEIS GLOBAIS, LOCAIS E ESTRUTURA IF:

  As variáveis globais são variáveis que podem ser lidas e escritas em qualquer trecho do programa. Elas são declaradas fora de qualquer estrutura. As variáveis globais ocupam espaço na memória, do princípio ao término do programa.

  As variáveis locais são variáveis que são criadas dentro de estruturas, como funções e procedures. Elas são criadas pela função ou procedure que a contém, e são destruídas assim que se encerra o processamento da sub-rotina. Dessa forma, o espaço de memória que a variável ocupava é libreado. As variáveis locais só podem ser acessadas pela função ou procedure que as criou.

  A estrutura IF testa se uma dada condição é verdadeira. Caso haja sucesso, irá executar o trecho de código atrelado a ele. Os testes são sempre feitos no sentido da esquerda para a direita.

  Uma observação que deve ser feita é que devemos utilizar parêntesis para eliminar ambiguidades em comparações lógicas. As operações entre parêntesis são realizadas primeiro, sempre partindo do parêntesis mais interno (Obs: Chama-se de S o resultado do teste lógico 'a=1', R o resutado do teste lógico 'b=2' e T o resutado do teste lógico 'c=3'):
if (a=1) and (b=2) then ...            { Primeiro testa se a=1 (S). Depois se b=2 (R). Ao final, faz o teste lógico S and R }
if ((a=1) and (b=2)) or (c=3) then ... { Primeiro testa e gera S, R e T. Depois faz o teste S and T (Resulta Q). Por fim, faz Q or T}
if (a=1) and ((b=2) or (c=3)) then ... { Primeiro testa e gera S, R e T. Depois faz o teste R or T (Resulta M). Por fim, faz S and M}



PROBLEMA 2

  Fazer um programa onde uma função calcula a média de 3 notas fornecidas.

  SOLUÇÃO:
var a, b, c : real;

function media(na, nb, nc : real):real;
begin
  media := (na+nb+nc)/3;
end;

begin
  write('Entre com a nota 1: ');
  readln(a);
  write('Entre com a nota 2: ');
  readln(b);
  write('Entre com a nota 3: ');
  readln(c);
  writeln('A média final é: ',media(a,b,c));
end. 

  ENTENDENDO O PROGRAMA

  Nesse exemplo, encaixamos uma estrutura do tipo função para nos auxiliar a resolver o problema proposto. Uma função é uma espécie de "caixa preta", onde tem como por objetivo receber dados de entrada, realizar um processamento e fornercer uma resposta.

  Qual a utilidade de uma função ou procedimento? Serve para isolar trechos de código que são responsáveis por uma determinada tarefa específica. Além disso, permite que esse trecho seja chamado e executado diversas vezes ao longo do programa, evitando que o mesmo código tenha que ser repetido ao longo do programa (economia de memória).

  Devido à sua propriedade de isolamento, torna-se possível portar funções também a outros programas, sem a necessidade de reescrever o código. Um bom exemplo disso, são as rotinas do Lamassari que podem ser incorporadas ao programa através da cláusula include (ver capítulo de includes).

  A ordem dos parâmetros declarados na função irá relacionar as variáveis passadas no seu chamamento. Assim, o comando media(a,b,c) irá fazer com que a variável local na receba o valor de a, nb o valor de b e nc o valor de c.

  A função sempre retorna um valor. Para utilizar a função, devemos armazenar o resultado em uma variável ou utilizá-la como passagem de parâmetro para o chamamento de outra função, como é o caso do programa 2 (parâmetro para a função writeln).

  Estrutura da função:

function nome(parametros):retorno;

nome - O nome da função. Deve começar por uma letra e não pode haver espaços. Ex: soma, calcula_isto, p2, etc.
parametros - Os parâmetros de entrada que serão passados quando a função for chamada.
retorno - Tipo de dados que será retornado pela função. Para retornar algum valor, coloque dentro da função o nome dela associado a algum valor. Ex: media := 4;



PROBLEMA 3

  Criar uma função ou procedimento que não altere as variáveis passadas como parâmetro e outra que as altere.

  SOLUÇÃO:
{ Não altera - Passagem por VALOR }

var a,b : integer;

function soma(a,b : integer):integer;
begin
  a:=a*a;
  b:=b*b*b;
  soma:=a+b;
end;

begin
  a:=4;
  b:=3;
  writeln('A soma é:', soma(a,b));
  writeln('Valor de a:', a);
  writeln('Valor de b', b);
end; 
Saída na tela:
A soma é: 43
Valor de a: 4
Valor de b: 3

Assim, os valores das variáveis a e b NÃO SÃO ALTERADOS!!

{ Altera - Passagem por REFERÊNCIA }

var a,b : integer;

function soma(var a,b : integer):integer;
begin
  a:=a*a;
  b:=b*b*b;
  soma:=a+b;
end;

begin
  a:=4;
  b:=3;
  writeln('A soma é:', soma(a,b));
  writeln('Valor de a:', a);
  writeln('Valor de b', b);
end; 
Saída na tela:
A soma é: 43
Valor de a: 16
Valor de b: 27

Assim, os valores das variáveis a e b SÃO ALTERADOS!!

  A diferença entre os programas está no uso da palavra reservada "var" antes da declaração dos parâmetros da função, que irá indicar que os parâmetros a seguir são do tipo referência. Veja mais detalhes no capítulo que fala sobre procedures e functions.

  Na passagem por referência, você é obrigado a chamar a função, passando os dados via variável, conforme o exemplo acima. Já na passagem por valor, você pode tanto passar os dados pela variável, como com valores: Ex: soma(2,3);

  DICA - RECEBENDO PARÂMETROS DE DIFERENTES TIPOS NA FUNÇÃO

function rotate(zoom, x, y : integer; alfa, beta : real):integer;



PROBLEMA 4

  Fazer uma procedure que escreva 100 vezes na tela "EU AMO O MSX".

  SOLUÇÃO:
procedure repete_100;
var i : integer;
begin 
  for i:=1 to 100 do
    writeln('EU AMO MSX');
end;

begin
  repete_100;
end. 



PROBLEMA 5

  Fazer uma procedure que escreva N vezes na tela "EU AMO O MSX".

  SOLUÇÃO:
var n : integer;

procedure repete100(n : integer);
var i : integer;
begin 
  for i:=1 to n do
    writeln('EU AMO MSX');
end;

begin
  write('Repete quantas vezes?');
  readln(n);
  repete100(n);
end. 

  PROCEDURES

  A procedure se diferencia da function na questão de não retornar valor. Assim como a função, serve para realizar uma determinada tarefa, a qualquer momento, e quantas vezes for necessário.



PROBLEMA 6

  Criar um programa que receba o nome de 10 alunos e os armazene em um vetor (array).

  SOLUÇÃO:
var nome : array[1..10] of string[40];
      i : integer;

begin 
  for i:=1 to 10 do
  begin
    wirte('Nome do aluno ',i,': ');
    readln(nome[i]);
  end;
end. 

  LAÇOS DE REPETIÇÃO

  O Pascal tem 3 tipos de laços de repetição: FOR, WHILE e REPEAT. Para estas estruturas, além o IF, devemos colocar um begin e um end (com ponto e vírgula) toda vez que o código dentro da estrutura tiver mais que uma linha, conforme visto no exemplo acima.
FOR variável := valor_inicio to valor_fim DO
begin
  bla, bla, bla ....
end;
WHILE condição do
begin
  bla, bla, bla ...
end;
REPEAT
  bla, bla, bla ...
UNTIL condição 

  A condição é um teste lógico entre uma variável e uma constante ou entre uma variável e outra variável. Ex:

- a > 10
- b < c
- idade = 15
- etc.

  Obs: Repare que o teste (condição) tem o sinal de igual SEM OS DOIS PONTOS. Nesse caso, o sinal de igual é um teste lógico de igualdade, enquanto que, quando sucedido pelos dois pontos ele indica atribuição de valor.

  MANIPULANDO VETORES

  Para visualizar os nomes que você preencheu no programa 6, basta utilizar a função write ou writeln, indicando a posição do vetor. Ex: write(nome[posição]);. Assim, o comando "write(aluno[1]);" irá exibir o primeiro aluno da lista.

  Complementando o programa anterior, vamos adicionar um procedimento que lista todos os alunos cadastrados.
var nome : array[1..10] of string[40];
      i : integer;

procedure lista_alunos;
var i : integer;
begin
  for i:=1 to 10 do
  begin
    write('Aluno ', i);
    writeln(': ', nome[i]);
  end;
end;

begin 
  for i:=1 to 10 do
  begin
    wirte('Nome do aluno ',i,': ');
    readln(nome[i]);
  end;
end. 


/MARMSX/CURSOS/PASCAL