{ File: driveint.pas }

{ Scopo: esercizio su funzioni ricorsive }

{
  Si richiede di aggiungere al programma la definizione delle funzioni per il
  calcolo di somma, prodotto ed elevamento a potenza tra due interi
  nonnegativi, realizzate sfruttando la definizione induttiva di tali
  operazioni, e senza usare gli operatori + e - del PASCAL e il valore 1,
  ma solo:

    - il valore 0,
    - il confronto tra due variabili di tipo intero
    - l'istruzione di assegnazione,
    - le funzioni predefinite pred e succ

  - definizione induttiva di somma tra due interi nonnegativi

      somma(x,y) = x                    se y = 0
      somma(x,y) = 1 + (somma(x, y-1))  se y > 0

  - definizione induttiva di prodotto tra due interi nonnegativi

      prodotto(x,y) = 0                           se y = 0
      prodotto(x,y) = somma(x, prodotto(x, y-1))  se y > 0

  - definizione induttiva di elevamento a potenza tra due interi nonnegativi

      esponente(x,y) = 1                               se y = 0
      esponente(x,y) = prodotto(x, esponente(x, y-1))  se y > 0
}

program OperazioniSuInteriRicorsive;
{ Realizza un'interfaccia utente per l'attivazione di un insieme di funzioni
  per eseguire le operazioni di somma, prodotto ed esponenziazione tra due
  interi nonnegativi.
}

var
  i, j : integer;  { interi su cui opera il programma principale }
  ch   : char;     { carattere per la scelta }


{ Inserire in questo punto la definizione della funzione ricorsiva Somma }


{ Inserire in questo punto la definizione della funzione ricorsiva Prodotto }


{ Inserire in questo punto la definizione della funzione ricorsiva Esponente }


  procedure LeggiIntero (var int: integer);
  { Restituisce in i un intero letto da tastiera. }
  begin { LeggiIntero }
    write('Immetti un intero ! ');
    readln(int)
  end; { LeggiVettore }


begin  { OperazioniSuInteriRicorsive }
  repeat
    writeln;
    writeln('*** IMMETTI UN CARATTERE A SCELTA FRA I SEGUENTI ***');
    writeln('***** 1: leggi il primo intero');
    writeln('***** 2: leggi il secondo intero');
    writeln('***** 3: stampa il primo intero');
    writeln('***** 4: stampa il secondo intero');
    writeln;
    writeln('***** s: somma i due interi');
    writeln('***** p: moltiplica i due interi');
    writeln('***** e: eleva il primo intero al secondo');
    writeln;
    writeln('***** Q: per terminare il programma');
    writeln;
    readln(ch);  { ATTENZIONE: read NON va bene }

    case ch of
      '1'      : LeggiIntero(i);
      '2'      : LeggiIntero(j);
      '3'      : writeln('Primo intero  : ', i);
      '4'      : writeln('Secondo intero: ', j);
      's', 'S' : writeln('Somma di ', i, ' e ', j, ' = ', Somma(i,j));
      'p', 'P' : writeln('Prodotto di ', i, ' e ', j, ' = ', Prodotto(i,j));
      'e', 'E' : writeln(i, ' elevato a ', j, ' = ', Esponente(i,j));
      'q', 'Q' : writeln('CIAO :-)');
    end; { case }
  until (ch = 'Q') or (ch = 'q')
end. { OperazioniSuInteriRicorsive }