{ File: figure5.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
   - il tipo di carattere con cui riempire la figura
   - di quanto spostare la figura a destra
}

var                          { VARIABILI GLOBALI }
  ch              : char;    { carattere che determina la figura o la fine }
  dimensione      : integer; { dimensione della figura }
  quale_carattere : char;    { carattere da usare per la stampa della figura }
  spostamento     : integer; { spostamento a destra della figura }
  fine            : boolean; { indica se terminare il ciclo }


  procedure StampaQuadrato (lato  : integer;     { lato del quadrato }
                            spost : integer;     { spostamento a destra }
                            car   : char);       { carattere si stampa }
                          { PARAMETRI FORMALI }
  var
    i, j : integer;       { VARIABILI LOCALI }
  begin
    for i := 1 to lato do              { tiene conto delle righe del quadrato:
                                         1 iterazione <-> 1 riga }
    begin
      for j := 1 to spost do           { stampa gli spazi bianchi iniziali
                                         necessari in ogni riga }
        write(' ');
  
      for j := 1 to lato do            { stampa gli asterischi di ogni riga }
        write(car);
  
      writeln                          { va a capo: la riga e' finita }
    end { for esterno }
  end; { StampaQuadrato }


  procedure StampaTriangolo (altezza : integer;   { altezza del triangolo }
                             spost   : integer;   { spostamento a destra }
                             car     : char);     { carattere si stampa }
                           { PARAMETRI FORMALI }
  var
    i, j : integer;        { VARIABILI LOCALI }
  begin
    writeln('UN TRIANGOLO');
    for i := 1 to altezza do           { tiene conto delle righe del triangolo:
                                         1 iterazione <-> 1 riga }
    begin
      for j := 1 to altezza-i+spost 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(car);
  
      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);
      write('Di quanti caratteri spostato a destra? ');
      readln(spostamento);
      write('Con quale carattere va riempita la figura? ');
      readln(quale_carattere);
      case ch of
        'Q', 'q' : StampaQuadrato(dimensione, spostamento, quale_carattere);
        'T', 't' : StampaTriangolo(dimensione, spostamento, quale_carattere);
      end { case }
    end { ramo then }
    else
      StampaSaluto
  until fine
end. { StampaFigure }