{ File: figure4.pas }

{ Scopo: esempio di uso di procedure con variabili locali e con parametri;
         esempio di attivazione di procedura da un'altra procedura }

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 StampaRiga (spazi: integer; lung: integer);
                      { PARAMETRI FORMALI }

  var                 { VARIABILI LOCALI }
    i : integer;      { indice del ciclo che scandisce le posizioni }
  begin
    for i := 1 to spazi do
      write(' ');
    for i := 1 to lung do
      write('*');
    writeln
  end; { StampaRiga }


  procedure StampaQuadrato (lato: integer);
                          { PARAMETRO FORMALE }

  var                     { VARIABILI LOCALI }
    i : integer;          { indice del ciclo che scandisce le righe }
  begin
    for i := 1 to lato do
      StampaRiga(0, lato)
  end; { StampaQuadrato }
  
  
  procedure StampaTriangolo (altezza: integer);
                           { PARAMETRO FORMALE }

  var                      { VARIABILI LOCALI }
    i : integer;           { indice del ciclo che scandisce le righe }
  begin
    for i := 1 to altezza do
      StampaRiga(altezza-i, 2*i-1)
  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 }