Program p194_4; { Parag 16 }
{--------------------------------------------------------------
    Sa se descrie obiectul paralelogram ale carui campuri 
    vor fi lungimile laturilor si masura in grade a unghiului 
    dintre doua laturi alaturate.
    Obiectul va contine metode pentru determinarea:
    1) inaltimilor paralelogramului
    2) perimetrul paralelogramului
    3) ariei paralelogramului
    4) lungimilor diagonalelor paralelogramului
    5) tipului paralelogramului 
       (oarecare, romb, dreptunghi, patrat)
 --------------------------------------------------------------}
uses crt;
{--------------------------------------------------------------}
const 
  toRad  = pi / 180;
  toGrad = 180 / pi;
  tipParal: array[0..3] of string = ('Paralelogram', 'Romb', 'Dreptunghi', 'Patrat');
{--------------------------------------------------------------}
type
   TParal = object
       a, b: Word; {lungimile laturilor}
   private
       u: real;    {masura unghiului in radiani}
   public
       function setUr(r: Real): Real;    {seteaza unghiului in radiani}
       function getUr: Real;             {masura unghiului in radiani}
       function setUg(r: integer): word; {seteaza unghiului in grade}
       function getUg: word;             {masura unghiului in grade}
       
       function Ha: Word;      {inaltimea dusa pe a}
       function Hb: Word;      {inaltimea dusa pe b}
       function D1: word;      {diagonala 1 (mai scurta)}
       function D2: Word;      {diagonala 2 (din u)}  
       function P: LongInt;    {perimetrul} 
       function S: real;       {aria}
       function Tip: byte;     {nr. tipului, conform tipParal}  
       function TipStr: String;{tipul paralelogramului}
        
   end;
{--------------------------------------------------------------}
function TParal.setUr(r: Real): Real;
begin
  if r > pi then r := r - pi;
  if r < 0  then r := r + pi;
  if r > pi/2 then r := pi - r; {alegem unghiul ascutit}
  u := r;
  setUr := u;          
end;
function TParal.setUg(r: integer): word;
begin
  setUg := round(setUr(r*toRad)*toGrad); 
end;
function TParal.getUr: Real; begin getUr := u; end;
function TParal.getUg: word; begin getUg := round(getUr*toGrad); end;
{--------------------------------------------------------------}
function TParal.Ha: Word; begin Ha := round(sin(u)*b); end;
function TParal.Hb: Word; begin Hb := round(sin(u)*a); end;
{--------------------------------------------------------------}
function TParal.D1: Word; begin D1 := round(sqrt(a*a+b*b-2*a*b*cos(u))); end;
function TParal.D2: Word; begin D2 := round(sqrt(a*a+b*b+2*a*b*cos(u))); end;
{--------------------------------------------------------------}
function TParal.P: LongInt; begin P := 2*(a+b);    end;
function TParal.S: real;    begin S := a*b*sin(u); end;  
{--------------------------------------------------------------}
function TParal.Tip: byte; 
var t: byte; 
begin 
  t := 0;
  if a = b  then inc(t,1);  {romb}
  if u=pi/2 then inc(t,2);  {dreptunghi}
  Tip := t; 
end;  
function TParal.TipStr: String; begin TipStr := tipParal[Tip]; end; 
{--------------------------------------------------------------}
var 
   Par: TParal;
{--------------------------------------------------------------}
BEGIN
  with Par do begin
  
{ Generarea parametrilor }
    randomize;
    a := random(100);
    b := random(100);
    setUg(random(360));
    
{ Citirea parametrilor de la tastatura }    
    write('a = '); readln(a);
    write('b = '); readln(b);
    write('u = '); readln(u);
    setUr(u*toRad);{daca u este masura unghiul in grade} 

{ Afisarea rezultatului }
    clrscr;
    writeln('a = ',a);    writeln('b = ',b);
    writeln('u = ',getUg);
    writeln('---------------------');
    writeln(TipStr);
    writeln('Ha = ', Ha); writeln('Hb = ', Hb);
    writeln('P  = ', P ); writeln('S  = ', S:4:2);
    writeln('D1 = ', D1); writeln('D2 = ', D2);

  end;
  readkey;
END.
