Soluções da aula prática 8



1a.
PROGRAM HundredRandom;

Var i: integer;

FUNCTION Aleatorio: integer;
begin
  Aleatorio := Random(31)-10;
    (* Random(31) returns a number between 0 and 30 (incl.) *)
    (* Random(31)-10 returns between -10 and 20 (incl.) *)
end;

begin
  for i := 1 to 1000 do
    WriteLn(Aleatorio);
end.
1b.
PROGRAM HundredRandom;

Var i: integer;

FUNCTION Aleatorio(a, b: integer): integer;
begin
  Aleatorio := Random(b-a+1)+a;
   (* numero minimo: a, numero maximo: b-a + a = b *)
end;

begin
  for i := 1 to 1000 do
    WriteLn(Aleatorio(-10, 20));
end.
1c.
PROGRAM MinMaxRandom;
  (* determine o numero minimo e maximo de uma serie de numeros
     aleatorios *)

Var i, n, maxn, minn: integer;

FUNCTION Aleatorio(a, b: integer): integer;
begin
  Aleatorio := Random(b-a+1)+a;
end;

begin
   (* initiliazar com numeros grandes: *)
  minn := 32000;
  maxn := -32000;
  for i := 1 to 1000 do
    begin
      n := Aleatorio(-10, 20);
      if n>maxn then maxn := n;
      if n<minn then minn := n;
    end;
  WriteLn('Min: ', minn);
  WriteLn('Max: ', maxn);
end.



2a.cópia da aula teórica 16.
PROGRAM TestFactorial;

FUNCTION Factorial(n: integer): integer;
 (* returns n! *)
var result: integer;
    i: integer;
begin
  result := 1;        (* initialize the variable *)
  for i := 1 to n do
    result := i*result;
  Factorial := result;  (* return result *)
end;

begin
  WriteLn(Factorial(5));
end.
2b.
PROGRAM TestFactorial;

FUNCTION Factorial(n: integer): integer;
 (* returns n! *)
begin
  if n=1 then
    Factorial := 1
  else
    Factorial := n*Factorial(n-1);
end;

begin
  WriteLn(Factorial(5));
end.



3a.
 
PASSAGEM POR VALOR:
    pogram:
PROGRAM Program4a1;

Var m: integer;

PROCEDURE Operations(n: integer);
begin
  n := n+1;
  writeln(2*n);
end;

begin
  m := 1;
  Operations(m);
  WriteLn(m);
end.

PASSAGEM POR REFERÊNCIA
   pogram:
PROGRAM Program4a2;

Var m: integer;

PROCEDURE Operations(Var n: integer);
begin
  n := n+1;
  writeln(2*n);
end;

begin
  m := 1;
  Operations(m);
  WriteLn(m);
end.

    output:
4
1
    output:
4
2


5a.
resposta: 
5b.
PROGRAM TestFactorial;

Var globalcounter: integer;

FUNCTION Factorial(n: integer): integer;
Var m: integer; (* local variable *)
begin
   (* uma copia da variavel local m sera criada *)
   (* vamos contar isso: *)
  globalcounter := globalcounter + 1;
  WriteLn('m existe ', globalcounter, ' vezes');
  if n=1 then
    Factorial := 1
  else
    Factorial := n*Factorial(n-1);
   (* a copia da variavel local m sera anihilada *)
   (* vamos contar isso: *)
  globalcounter := globalcounter - 1;
  WriteLn('m existe ', globalcounter, ' vezes');
end;

begin
  globalcounter := 0;
  WriteLn(Factorial(5));
end.

output:

m existe 1 vezes
m existe 2 vezes
m existe 3 vezes
m existe 4 vezes
m existe 5 vezes
m existe 4 vezes
m existe 3 vezes
m existe 2 vezes
m existe 1 vezes
m existe 0 vezes
120
5b.
PROGRAM TestFibonacci;

Var globalcounter: integer;

FUNCTION Fibonacci(n: integer): integer;
Var m: integer; (* local variable *)
begin
   (* uma copia da variavel local m sera criada *)
   (* vamos contar isso: *)
  globalcounter := globalcounter + 1;
  WriteLn('m existe ', globalcounter, ' vezes');
  if (n=1) OR (n=2) then
    Fibonacci := 1
  else
    Fibonacci := Fibonacci(n-1) + Fibonacci(n-2);
   (* a copia da variavel local m sera anihilada *)
   (* vamos contar isso: *)
  globalcounter := globalcounter - 1;
  WriteLn('m existe ', globalcounter, ' vezes');
end;

begin
  globalcounter := 0;
  WriteLn(Fibonacci(5));
end.

output:

m existe 1 vezes
m existe 2 vezes
m existe 3 vezes
m existe 2 vezes
m existe 3 vezes
m existe 2 vezes
m existe 1 vezes
m existe 2 vezes
m existe 3 vezes
m existe 2 vezes
m existe 3 vezes
m existe 4 vezes
m existe 3 vezes
m existe 4 vezes
m existe 3 vezes
m existe 2 vezes
m existe 1 vezes
m existe 0 vezes
5