Programma fattoriale.

Messaggioda Amedim » 06/09/2018, 17:05

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 <iostream>

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<<"!="<<fattoriale<<endl;

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!
Amedim
Junior Member
Junior Member
 
Messaggio: 126 di 357
Iscritto il: 02/09/2016, 10:50

Re: Programma fattoriale.

Messaggioda Super Squirrel » 06/09/2018, 19:16

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.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 285 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Programma fattoriale.

Messaggioda Amedim » 06/09/2018, 19:32

Super Squirrel ha scritto: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<<"!="<<fattoriale<<endl;
return 0;
}

L'avevo messo in fase della prima scrittura l'ultimo if mentre provavo a fermare il while poi ho dimenticato di correggere. :smt023 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?

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. :?
Amedim
Junior Member
Junior Member
 
Messaggio: 127 di 357
Iscritto il: 02/09/2016, 10:50

Re: Programma fattoriale.

Messaggioda Super Squirrel » 06/09/2018, 21:18

Il return0 si può evitare, di solito l'IDE se non ci sono problemi ritorna 0 in automatico.

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:
Codice:
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.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 286 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Programma fattoriale.

Messaggioda Amedim » 06/09/2018, 21:53

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

Codice:
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? :roll: :roll:
Amedim
Junior Member
Junior Member
 
Messaggio: 128 di 357
Iscritto il: 02/09/2016, 10:50

Re: Programma fattoriale.

Messaggioda Super Squirrel » 06/09/2018, 22:25

pero lo fa anche quando inserisco un numero intero... come mai? :roll: :roll:

Per tutti gli interi o solo se inserisci interi "grandi"?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 287 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Programma fattoriale.

Messaggioda Amedim » 07/09/2018, 07:59

Super Squirrel ha scritto:
pero lo fa anche quando inserisco un numero intero... come mai? :roll: :roll:

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. :roll:

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);
Amedim
Junior Member
Junior Member
 
Messaggio: 129 di 357
Iscritto il: 02/09/2016, 10:50

Re: Programma fattoriale.

Messaggioda Super Squirrel » 07/09/2018, 10:48

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.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 288 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Programma fattoriale.

Messaggioda Amedim » 07/09/2018, 11:26

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... :oops: :oops:
Grazie 1000!!!
Amedim
Junior Member
Junior Member
 
Messaggio: 130 di 357
Iscritto il: 02/09/2016, 10:50


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite