#include <iostream>
using namespace std;

// Prototipi delle funzioni
char menu();
float Potenza(float, int);
unsigned int Fattoriale(int);
void NumeriPrimi(int);
bool ControlloNumeroPrimo(int );

//---------------
int main()
{char Scelta;
 int N;
 unsigned int X;
 float A, Pot;
 // Presentazione menu ciclicamente fino a quando non si digita  x
 do
   {Scelta= menu();
    switch  (Scelta)
      {case 'a':
            // Fattoriale
            do {cout << "Calcolo del fattoriale di (<=12): ";
                cin >> N;
               } while (N < 0 || N > 12);
            X = Fattoriale(N);    // restituisce il fattoriale  di N
            cout << "\nIl fattoriale di " << N << " e' " << X << "\n";
            system("pause");
            break;
       case 'b':
            // Numeri primi
            do { cout << "Calcolo dei numeri primi fino a: ";
               cin >> N;
               } while (N <= 0);
            NumeriPrimi(N);       // visualizza tutti i numeri primi e non restituisce niente     
            system("PAUSE");
            break;
       case 'c':
            // Potenza
            do{cout << "Calcolo la potenza di : ";
               cin >> A;
               if (A==0) cout <<"  ----> valore 0 non consentito \n";
               }while (A==0);
            do {cout << "esponente (>=0): ";
               cin >> N;
               }while (N<0);
            Pot = Potenza (A, N);  // restituisce la potenza A elevato alla N
            cout << "\nLa potenza " << A << "^"<<N<<" e' " << Pot << "\n";
            system("PAUSE");
            break;
       case 'x': break;
      }
   } while (Scelta!='x');
}
 

// --- Definizione delle funzioni
// Menu
char menu()
{char s;
 do
  {system ("cls");
   cout<<"\n                           MENU\n"<<endl;
   cout<<"  a)  Fattoriale di un numero (<=12)"<<endl;
   cout<<"  b)  Numeri primi fino a N"<<endl;
   cout<<"  c)  Potenza N-esima (N>=0 intero) di un numero reale A (!=0)"<<endl;
   cout<<"  x)  Fine"<<endl;
   cout<<"\nScegli: ";
   cin>>s;
   }while (s!='a' && s!='b' && s!='c' && s!='x');
  return s;
}

// Fattoriale
unsigned int Fattoriale(int N)
{ unsigned int F = 1;  
  for (int i = 2; i <= N; i++)
    	F = F * i;
  return F;  
}

// Numeri primi fino a N
void NumeriPrimi(int N)
{
 for (int i = 2; i <= N; i++)
      if (ControlloNumeroPrimo(i)==true)  // richiama la funzione  ControlloNumeroPrimo
             cout << i << ";  ";
      cout << endl;
 return;
}
            
bool ControlloNumeroPrimo(int N) 
{// Controllo se il numero e' minore o uguale a 1:
 // numero non primo, uscita immediata  e   restituisce false.
 if (N <= 1) return false; 
 // Sfrutta direttamente la definizione di numero primo:
 // provo a dividere N  per tutti i numeri da 2 a N/2;
 // se almeno una divisione ha resto nullo (divisibilità)
 //      allora il numero NON E' PRIMO, uscita immediata e restituisce FALSE.
 // se nessuna divisione ha resto nullo allora il numero  E' PRIMO  e restituisce TRUE.
 for (int i = 2; i <= N/2; i++)
       if (N % i == 0) return false;
 return true;
}

// Potenza
float Potenza(float base, int esponente)
{  // Funzione che calcola base elevata a esponente
   float Pot = 1; // Inizializza la variabile accumulatore
   for(int i = 1; i <=esponente; i++)
       Pot = Pot * base;
   return Pot;
}