{ File: figure3.pas }

{ Scopo: esempio di uso di procedure con variabili locali e con parametri }

program StampaFigure;
{ Permette all'utente di stampare su schermo figure geometriche.
  L'utente interagisce con il programma tramite una semplice interfaccia.
  E' possibile scegliere:
   - la forma della figura (quadrato o triangolo)
   - la dimensione della figura
}

var
  ch         : char;    { carattere che determina il tipo di figura o la fine }
  dimensione : integer; { dimensione della figura }
  fine       : boolean; { indica se terminare il ciclo }


  procedure StampaQuadrato (dim: integer);
                          { dim e' un PARAMETRO FORMALE }
  var
    i, j : integer;       { i e j sono VARIABILI LOCALI }
  begin
    for i := 1 to dim do               { tiene conto delle righe del quadrato:
                                         1 iterazione <-> 1 riga }
    begin
      for j := 1 to dim do             { stampa gli asterischi di ogni riga }
        write('*');
      writeln                          { va a capo: la riga e' finita }
    end { for esterno }
  end; { StampaQuadrato }
  
  
  procedure StampaTriangolo (dim: integer);
                           { dim e' un PARAMETRO FORMALE }
  var
    i, j : integer;        { i e j sono VARIABILI LOCALI }
  begin
    for i := 1 to dim do               { tiene conto delle righe del triangolo:
                                         1 iterazione <-> 1 riga }
    begin
      for j := 1 to dim - i do         { stampa gli spazi bianchi iniziali
                                         necessari in ogni riga }
        write(' ');
  
      for j := 1 to (i*2 - 1) do       { stampa la sequenza di asterischi }
        write('*');
  
      writeln                          { va a capo: la riga e' finita }
    end { for esterno }
  end; { StampaTriangolo }
  
  
  procedure StampaSaluto;
  begin
    writeln('CIAO :-)')
  end; { StampaSaluto }
  

begin { StampaFigure }
  fine := FALSE;
  repeat
    writeln;
    writeln('*** IMMETTI UN CARATTERE A SCELTA FRA I SEGUENTI ***');
    writeln('***** Q: stampa un quadrato');
    writeln('***** T: stampa un triangolo');
    writeln('***** F: per terminare il programma');
    writeln;
    readln(ch); { ATTENZIONE: read NON va bene }
    fine := (ch = 'f') or (ch = 'F');
    if not fine then
    begin
      write('Di che dimensione? ');
      readln(dimensione);
      case ch of
        'Q','q' : StampaQuadrato(dimensione);
        'T','t' : StampaTriangolo(dimensione);
      end { case }
    end { ramo then }
    else
      StampaSaluto
  until fine
end. { StampaFigure }