#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;
}