Aula 7: Matemática


Read e ReadLn

Nas aulas anteriores (veja aula 5 e aula 6) we aprendemos como mostrar os resultados dos nossos cálculos no ecrã. Com write e writeln os nossos programas podem haver output. Cada programa deve haver output, mas em muitos casos um programa também precisa de input. O utilizador dá o seu nome, ou dá números para processar. Ou mais simples, o utilizador quer haver controlo sobre o programa. Por exemplo, o utilizador pode parar a execução do programa com o botão 'escape'.
 
 
PASCAL: Com Read e ReadLn podemos obter informação via o teclado. Estas funções conseguem ler valores e caracteres do teclado e directamente armazenar-los nas variáveis. A forma geral das instruções é

Read(variable_list);

ReadLn(variable_list);

Aqui variable_list é uma lista de variáveis a ler, seperado pelas vírgulas. Por exemplo

Read(a, b, i);

Nota que as variáveis não são obrigatoriamente do mesmo tipo. No exemplo acima podem ser do tipo real, boolean e integer respectivamente (ou outros tipos). Como exemplo

  PROGRAM ReadExample;

  VAR n1, n2: integer;

  begin
    WriteLn('Faz o favor de dar dois numeros seperados pelo espaco');
    Read(n1);
    Read(n2);
    WriteLn('n1 = ', n1 ,'    n2 = ', n2);
  end.

Quando, corremos o programa o ecrã mostrará a mensagem 
  Faz o favor de dar dois numeros seperados pelo espaco
O programa para e o utilizador deve dar dois números
  128 31<return>
(nota as convenções que nos vamos usar nestas aulas. O texto que o utilizador vai escrever aparece em verde cursivo, e <return> significa tocar o botão 'return', o botão de nova linha). Depois o programa continuará e mostrará
  n1 = 128  n2 = 31

A diferença entre Read e ReadLn é que ReadLn põe do lado toda a outra informação até o botão 'return'. Se o utilizador deu mais informação na mesma linha, o programa vai por isto do lado e não vai utilizar esta informação. Read não faz isso. No exemplo acima, se substituimos as instruções Read com ReadLn, o progrma vai atribuir 128 a n1, depois não vai utilizar o valor 31 e consequentemente vai parar e esperar para o utilizador dar um valor para n2


Matemática

Depois aprender como atribuir um valor a uma variável em aula 6, podemos ver como fazer cálculos. As operações mais basicas são adicionar, subtrair, dividir e multiplicar:
 
 operator 
 operation 
+
addition
-
subtraction
*
 multiplication 
/
division

Estes quatro operators (operadores), quando usado para cálculos, precisam dois operands. Em PASCAL fica um operador em ambas os lados. Exemplos:
 
 bom
 mal
 3 * a 
* a
 a + b 
 3 a + 

Estas instruções resultam em valores que podemos usar nas atribuições (aula 6). Exemplo:

c := 3 * a;

Outra veze nota a estrutura de atribuição: no lado esquerdo do símbolo := temos uma (só, unica, 1) variável e no outro lado pomos uma expressão que vai resultar num valor para a variável. Este valor deve ser do mesmo tipo do que a variável. Por exemplo, não faz sentido atribuir um valor inteiro a uma variável do tipo boolean:  i := TRUE;


Matemática dos inteiros


Os operadores da secção anterior são usados para cálculos do tipo floating point (vírgula flutuante). Para cálculos do tipo inteiro (byte, word, integer, longint, etc), o operação divisidir não existe. Em vez, existem dois novos operadores. Imagine queremos calcular 7/3. Na escola primária aprendemos que isto é igual a 2 com um resto de 1 a dividir por 3:
 
 

7
   
1
------
   = 
2  + 
------
3
   
3

Em PASCAL existem dois operadores Div e Mod que reproducem estes resultados. Exemplo:
 

 expression 
 result 
 7 Div 3
2
7 Mod 3
1

Este operadores substituem o operdor / para números inteiros. Os outros operadores ficam iguais (*, +, -).


Prioridade

Em caso de mais de um operador numa só expressão, as regras de prioridade de matemática normal applicam-se. Os operações multiplicar e dividir têm mais alta prioridade. Por isso, quando escrevemos
   a := 1 + 3 * 2;
O resultado será 7.
Se queremos mudar a ordem de execução, podemos sempre usar parênteses ( and ). Por exemplo
  a := (1 + 3) * 2;
dá 8. Pôr parênteses nunca faz mal!
  a := (1 + 3) - (4 + 5);

Exemplos

PROGRAM SimpleCalculations;

VAR x, y, sum, diff, divis: real;

begin
  WriteLn('Da o valor da variavel x:');
  ReadLn(x);
  Writeln('Da o valor de variavel y:');
  ReadLn(y);
  sum := x + y;
  Writeln('A soma de ', x:0:4, ' e ', y:0:4, ' e ', sum:0:4);
  diff := x - y;
  Writeln('A diferenca entre ', x:0:4, ' e ', y:0:4, ' e ', diff:0:4);
  divis := x / y;
  Writeln(x:0:4, ' dividir por ', y:0:4, ' da ', divis:0:4);
end.

will produce, when running:

Da o valor da variavel x:
3.4
Da o valor da variavel y:
1.8
A soma de 3.4000 e 1.8000 e 5.2000
A diferenca entre 3.4000 e 1.8000 e 1.6000
3.4000 dividir por 1.8000 da 1.8889

Nota o formato (:0:4), como explicado em aula 6.

PROGRAM IntegerCalculations;

VAR x, y, modd, divv: integer;

begin
  WriteLn('Da o valor da variavel x:');
  ReadLn(x);
  Writeln('Da o valor de variavel y:');
  ReadLn(y);
  sum := x + y;
  Writeln('A soma de ', x, ' e ', y, ' e ', sum);
  diff := x - y;
  Writeln('A differenca entre ', x, ' e ', y, ' e ', diff);
  divv := x Div y;
  modd := x Mod y;
  Writeln(x, ' dividir por ', y, ' da ', divis, ' mais ', modd, '/', y);
end.

will produce, when running:

Da o valor da variavel x:
13
Da o valor da variavel y:
5
A soma de 13 e 5 e 18
A differenca entre 13 e 5 e 8
13 dividir por 5 da 2 mais 3/5


Mini teste:

Para testar o seu conhecimento, sobre o que aprendeu nesta aula, clique aqui para um teste on-line.

Peter Stallinga. Universidade do Algarve, 16 Maio 2002