/* File: driveint.c */
/* Time-stamp: "2001-03-27 20:40:14 calvanes" */
/* 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 C e il valore 1,
   ma solo:

     - il valore 0,
     - il confronto tra due variabili di tipo intero
     - l'operatore di assegnazione,

   - 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
*/


/* 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.
*/

#include <stdio.h>

/* 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 */


int leggiIntero()
  /* Restituisce un intero letto da tastiera. */
{
  int i;

  printf("Immetti un intero ! ");
  scanf("%d%*[^\n]", &i);
  getchar();

  return i;
}  /* leggiIntero */


int main(void)
  /* OperazioniSuInteriRicorsive */
{
  int i, j;   /* interi su cui opera il programma */
  char ch;    /* carattere per la scelta */

  do {
    printf("\n*** IMMETTI UN CARATTERE A SCELTA FRA I SEGUENTI ***\n");
    printf("***** 1: leggi il primo intero\n");
    printf("***** 2: leggi il secondo intero\n");
    printf("***** 3: stampa il primo intero\n");
    printf("***** 4: stampa il secondo intero\n\n");
    printf("***** s: somma i due interi\n");
    printf("***** p: moltiplica i due interi\n");
    printf("***** e: eleva il primo intero al secondo\n\n");
    printf("***** Q: per terminare il programma\n\n");
    scanf("%c%*[^\n]", &ch);
    getchar();

    switch (ch) {
    case '1':
      i = leggiIntero();
      break;
    case '2':
      j = leggiIntero();
      break;
    case '3':
      printf("Primo intero  : %d\n", i);
      break;
    case '4':
      printf("Secondo intero: %d\n", j);
      break;
    case 's': case 'S':
      printf("Somma di %d e %d = %ld\n", i, j, somma(i, j));
      break;
    case 'p': case 'P':
      printf("Prodotto di %d e %d = %ld\n", i, j, prodotto(i, j));
      break;
    case 'e': case 'E':
      printf("%d elevato a %d = %ld\n", i, j, esponente(i, j));
      break;
    case 'q': case 'Q':
      printf("CIAO :-)\n");
      break;
    }
  } while (ch != 'Q' && ch != 'q');

  return 0;
}