Programma fattoriale.
Salve a tutti,
in un esercizio su dev c++ mi viene richiesto di scrivere un programma che calcoli il fattoriale di un numero intero non negativo inserito da tastiera. Fin qui tutto ok sono riuscito ad impostarlo e funziona. Non so come fare pero ad aggiungere un controllo sul valore inserito da tastiera in modo che il programma quando non viene inserito un intero positivo mi richieda sempre di inserire il numero... Questo è quanto ho fatto io:
#include
using namespace std;
int main (){
int numero, fattoriale;
do{
cout<<"Inserisci un numero:";
cin>>numero;
}while (numero<0);
fattoriale=numero;
if (numero==0){
fattoriale=1;
}
while (numero>1){
numero=numero-1;
fattoriale=fattoriale*numero;
}cout<<"!="<
if (numero<=1){
return 0;
}
system ("pause");
}
questo mi calcola il fattoriale e mi restituisce "Inserisci un numero:" quando inserisco un numero negativo. Non so quindi solo come implementare un controllo quando viene inserito un numero reale...
Grazie a tutti per l'aiuto!
in un esercizio su dev c++ mi viene richiesto di scrivere un programma che calcoli il fattoriale di un numero intero non negativo inserito da tastiera. Fin qui tutto ok sono riuscito ad impostarlo e funziona. Non so come fare pero ad aggiungere un controllo sul valore inserito da tastiera in modo che il programma quando non viene inserito un intero positivo mi richieda sempre di inserire il numero... Questo è quanto ho fatto io:
#include
using namespace std;
int main (){
int numero, fattoriale;
do{
cout<<"Inserisci un numero:";
cin>>numero;
}while (numero<0);
fattoriale=numero;
if (numero==0){
fattoriale=1;
}
while (numero>1){
numero=numero-1;
fattoriale=fattoriale*numero;
}cout<<"!="<
if (numero<=1){
return 0;
}
system ("pause");
}
questo mi calcola il fattoriale e mi restituisce "Inserisci un numero:" quando inserisco un numero negativo. Non so quindi solo come implementare un controllo quando viene inserito un numero reale...
Grazie a tutti per l'aiuto!
Risposte
Un paio di osservazioni:
- l'utilizzo di system("pause") sarebbe da evitare, di solito se lanci il programma tramite IDE la schermata non viene chiusa in automatico al termine del programma;
- quale dovrebbe essere lo scopo dell'ultimo if?
Per quanto riguarda la tua domanda, ti interessa solo un controllo per i numeri decimali o anche per input di questo tipo?
b
gf5j
43hp
88888888888888888888888
Inoltre dovresti anche fissare un massimo per la variabile numero per evitare l'overflow.
- l'utilizzo di system("pause") sarebbe da evitare, di solito se lanci il programma tramite IDE la schermata non viene chiusa in automatico al termine del programma;
- quale dovrebbe essere lo scopo dell'ultimo if?
Per quanto riguarda la tua domanda, ti interessa solo un controllo per i numeri decimali o anche per input di questo tipo?
b
gf5j
43hp
88888888888888888888888
Inoltre dovresti anche fissare un massimo per la variabile numero per evitare l'overflow.
"Super Squirrel":
Un paio di osservazioni:
- l'utilizzo di system("pause") sarebbe da evitare, di solito se lanci il programma tramite IDE la schermata non viene chiusa in automatico al termine del programma;
- quale dovrebbe essere lo scopo dell'ultimo if?
Per quanto riguarda la tua domanda, ti interessa solo un controllo per i numeri decimali o anche per input di questo tipo?
b
gf5j
43hp
88888888888888888888888
Inoltre dovresti anche fissare un massimo per la variabile numero per evitare l'overflow.
Ecco, correggo l'ultima parte
while (numero>1){
numero=numero-1;
fattoriale=fattoriale*numero;
}cout<<"!="<
}
L'avevo messo in fase della prima scrittura l'ultimo if mentre provavo a fermare il while poi ho dimenticato di correggere.

Per quanto riguarda il massimo dovrei inserire ad inizio programma un INT_MAX<2147483647, giusto?
Scusami ma sono alle prime armi con il c++ ed ho ancora molti dubbi.

Il return0 si può evitare, di solito l'IDE se non ci sono problemi ritorna 0 in automatico.
Una domanda... sai come si comporta il programma se inserisci un numero decimale? Si limita a considerare la sola parte intera, quindi potrebbe anche essere accettabile come cosa.
In ogni caso se proprio vuoi aggiungere il controllo, non so quanto sia affidabile, ma potresti provare con qualcosa del genere:
In alternativa potresti acquisire l'input tramite una stringa e poi "analizzarla".
Mi riferivo al massimo valore di numero affinchè fattoriale non causa un overflow. In ogni caso sarebbe abbastanza complicato da fare, lascia stare.
In realta' come intuisco dalla traccia e come mi interesserebbe principalmente è solo un controllo per i numeri decimali. Premesso che so che il controllo si fa sempre con un while (giusto?) non mi viene in mente che tipo di condizione potrei mettere nel while... o magari si usa proprio un altro costrutto in questo caso?
Una domanda... sai come si comporta il programma se inserisci un numero decimale? Si limita a considerare la sola parte intera, quindi potrebbe anche essere accettabile come cosa.
In ogni caso se proprio vuoi aggiungere il controllo, non so quanto sia affidabile, ma potresti provare con qualcosa del genere:
int numero; float f; do { cout << "Inserisci un numero: "; cin >> f; numero = f; } while(f < 0 || f != numero);
In alternativa potresti acquisire l'input tramite una stringa e poi "analizzarla".
Per quanto riguarda il massimo dovrei inserire ad inizio programma un INT_MAX<2147483647, giusto?
Mi riferivo al massimo valore di numero affinchè fattoriale non causa un overflow. In ogni caso sarebbe abbastanza complicato da fare, lascia stare.
In realta' come intuisco dalla traccia e come mi interesserebbe principalmente è solo un controllo per i numeri decimali. Premesso che so che il controllo si fa sempre con un while (giusto?) non mi viene in mente che tipo di condizione potrei mettere nel while... o magari si usa proprio un altro costrutto in questo caso?[/quote]
Una domanda... sai come si comporta il programma se inserisci un numero decimale? Si limita a considerare la sola parte intera, quindi potrebbe anche essere accettabile come cosa.
Si, se provo a calcolare il fattoriale del decimale considera solo la parte intera. Mi ero posto il problema perchè come detto mi viene poi esplicitamente richiesto dal testo
int numero; float f; do { cout << "Inserisci un numero: "; cin >> f; numero = f; } while(f < 0 || f != numero);
Ecco, io avevo provato ad impostare una cosa simile introducendo un'altra variabile con float pero' sia come facevo io che in questo modo da te indicato il programma continua si a chiedermi di inserire un numero quando inserisco un numero reale pero lo fa anche quando inserisco un numero intero... come mai?


pero lo fa anche quando inserisco un numero intero... come mai?![]()
Per tutti gli interi o solo se inserisci interi "grandi"?
"Super Squirrel":pero lo fa anche quando inserisco un numero intero... come mai?![]()
Per tutti gli interi o solo se inserisci interi "grandi"?
Con tutti gli interi... come se il ciclo del controllo per il decimale non terminasse.

Ho fatto così nella parte iniziale del programma:
int numero;
int fattoriale;
float n;
do{
cout<<"Inserisci un numero:";
cin>>n;
}while (n<0 || n!=numero );
do{
cout<<"Inserisci un numero:";
cin>>numero;
}while (numero<0);
Per postare il codice sul forum utilizza l'apposito tag CODE.
In ogni caso, perchè due cicli do/while? Inoltre entrambi sono diversi da quello che ho postato io.
In ogni caso, perchè due cicli do/while? Inoltre entrambi sono diversi da quello che ho postato io.
In ogni caso, perchè due cicli do/while? Inoltre entrambi sono diversi da quello che ho postato io.
Si in effetti era proprio lì il problema. Dovevo eliminare il secondo ciclo e mettere solo uno come quello da te postato essendo lì comprese entrambe le condizioni...


Grazie 1000!!!