Introdução a Computação

Soluções da aula prática 7



1a.
PROGRAM CalulatepH;

var conc, pH: real;
    opcao: integer;

PROCEDURE ConcH;
begin
  WriteLn('Entra a concentracao de H+ em agua (mol/l)');
  ReadLn(conc);
  pH := -Ln(conc)/Ln(10);
  WriteLn('pH da solucao: ', pH:0:2);
end;

PROCEDURE ConcOH;
begin
  WriteLn('Entra a concentracao de OH- em agua (mol/l)');
  ReadLn(conc);
  pH := 14.0-Ln(conc)/Ln(10);
  WriteLn('pH da solucao: ', pH:0:2);
end;

begin
  WriteLn('Escolha uma opcao:');
  WriteLn('1) [H+]');
  WriteLn('2) [OH-]');
   (* nota a forma de chamar o procedimento: *)
  ReadLn(opcao);
  Case opcao of
    1: ConcH;
    2: ConcOH;
  end;
end.

Escolhe uma opcao:
1) [H+]
2) [OH-]
 1
Entra a concentracao de H+ em agua:
 1e-4
pH da solucao: 4.00
1b.
PROGRAM CalulateConc;

var pH: real;

FUNCTION CalcH: real;
begin
   (* Nota a forma de retornar um valor, atraves o nome da funcao: *)
  CalcH := Exp(-pH*Ln(10));
end;

FUNCTION CalcOH: real;
begin
   (* Nota a forma de retornar um valor, atraves o nome da funcao: *)
  CalcOH := 1.0e-14/CalcH;
end;

begin
   (* O programa comeca aqui *)
  WriteLn('Diga o pH da solucao:');
  ReadLn(pH);
   (* nota a forma de usar a informacao que vem da funcao *)
  WriteLn('A concentracao [H+] = ', CalcH, ' mol por litro');
  WriteLn('A concentracao [OH-] = ', CalcOH, ' mol por litro');
end.

Diga o PH da solucao
 1.0
A concentracao [H+] = 1.0e-1 mol por litro
A concentracao [OH-] = 1.0e-13 mol por litro



2a.
PROGRAM CalulateHeight;

var d, h, alfa: real;

begin
  WriteLn('Diga a distancia ate o objecto (m):');
  ReadLn(d);
  WriteLn('Diga o angulo:');
  ReadLn(alfa);
  h := d * Sin(Pi*alfa/180.0)/Cos(Pi*alfa/180.0);
  WriteLn('A altura do edificio e ', h ' m');
end.

Diga a distancia ate o objecto (m):
 100.0
Diga o angulo:
 15.0
A altura do objecto e 26.8 m.

2b. Tem montes de soluções. Aqui vem uma:
x = d sin (a)
c1 = d cos (a)
g = 90o + a - b
c2 = x tan (g)
h = (c1 + c2) sin (a)
PROGRAM Mountains;

var alfa, beta, gama: real;
    d, x, c1, c2, h: real;
begin
  WriteLn('Diga a distancia entre os dois pontos de medicao (m)');
  ReadLn(d);
  WriteLn('Diga o angulo 1');
  ReadLn(alfa);
  WriteLn('Diga o angulo 2');
  ReadLn(beta);
  x := d * Sin(Pi*alfa/180.0);
  c1 := d * Cos(Pi*alfa/180.0);
  gama := 90 + alfa - beta;
  c2 := x * Sin(Pi*gama/180)/Cos(Pi*gama/180.0);
  h := (c1+c2) * Sin(Pi*alfa/180.0);
  WriteLn('A altura do objecto e ',h:0:0,' m.');
end.
 
Aqui vem mais uma:

solberg2 
tan(a) = h/(d+a)
tan(b) =  h/a

h = d*tana/(1-tana/tanb)
PROGRAM Mountains;
var alfa, beta: real;
    d, a, h: real;
  FUNCTION Tan(ang: real): real;
  begin
    Tan := Sin(ang)/Cos(ang);
  end;
begin
  WriteLn('Diga a distancia entre os dois pontos de medicao (m)');
  ReadLn(d);
  WriteLn('Diga o angulo 1');
  ReadLn(alfa);
  WriteLn('Diga o angulo 2');
  ReadLn(beta);
  alfa :=
Pi*alfa/180.0;
  beta := Pi*beta/180.0;
  h := d * Tan(alfa)/(1-Tan(alfa)/Tan(beta));
  WriteLn('A altura do objecto e ',h:0:0,' m.');
end.   

Diga a distancia entre os dois pontos de medicao (m):
 8000.0
Diga o angulo 1:
 25.67
Diga o ângulo 2:
 67.41
A altura do objecto e 4806 m.



3.
PROGRAM FibonacciSeries;

PROCEDURE Fibonacci(n: longint);
  (* o numero maximo sera 832040, entao so um longint chega: *)
Var f, fa, fb: longint;
begin
  fa := 1;
  fb := 1;
  WriteLn(fa);
  WriteLn(fb);
  for i := 3 to n do
    begin
      f := fa + fb;
      Write(f,' ');
      fa := fb;
      fb := f;
    end;
end;

begin
  Fibonacci(30);
end.

1 1 2 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040



4a.
PROGRAM Media;

FUNCTION Media100;
Var i: integer;
    sum: real;
begin
  sum := 0.0;
  for i := 1 to 100 do
    sum := sum+Random;
  Media100 := sum/100.0;
end;

begin
    (* com a seguinta instrucao o programa vai correr cada vez
       diferente: *)
  Randomize;
    (* chama a funcao e mostra o resultado: *)
  WriteLn('Media de 100 numeros aleatorios: ', Media100);
end.
4b.
PROGRAM Moeda;

Var i: integer;
    cara, coroa: integer;

begin
  Randomize;
    (* nunca esquece inicializar as variaveis: *)
  cara := 0;
  coroa := 0;
  for i := 1 to 1000 do
    if (Random(2) = 1) then
      cara := cara + 1
    else
      coroa := coroa + 1;
  WriteLn('Cara: ', cara, ' vezes');
  WriteLn('Coroa: ', cara, ' vezes');
  if (cara=coroa) then
    WriteLn('Empate!')
  else
    if cara>coroa then
      WriteLn('Cara ganhou!');
    else
      WriteLn('Coroa ganhou!');
end.

Cara: 459 vezes
Coroa: 541 vezes
Coroa ganhou!