# 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:
 5
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