RISOLUZIONE ESERCIZIO

di Anonimizzato21657 il
20 risposte
Ciao a tutti

Mi chiamo Luigi e sono nuovo del forum, avrei bisogno di un aiuto per risolvere questo esercizio:

PREDISPORRE UN PROGRAMMA CHE CALCOLI IL FATTORIALE DI TUTTI I NUMERI INTERI MINORI N

il codice che ho scritto è queso:

#include <stdio.h>

main(){

int i,n,fat;
n=1;
for(i=1;n!=0;i++){

printf("Inserisci intero");
scanf("%d",&n);

if(n<n){
fat=n;
fat=fat*(n-1);

printf("Fat di %d e : %d",n,fat);
}
}
}

Quando digito lo 0 il programma termina ed è giusto così, ma non calcola il fattoriale quando inserisco il N minore

come mai? qualcuno mi più aiutare?
grazie

20 Risposte

  • Ho provato a risolvero da solo aggiungendo una variabile , ora il programma è così

    #include <stdio.h>

    main(){

    int i,n,fat,n2;
    n=1;
    for(i=1;n!=0;i++){

    printf("Inserisci intero");
    scanf("%d",&n);

    if(n<n2){
    fat=n;
    fat=fat*(n-1);

    printf("Fat di %d e : %d",n,fat);
    }
    }
    }

    Ora il programma funziona , mi fa inserire i numeri fino a quando non digito 0 per terminare il programma, mi esegue il fattoriale quando inserisco un numero minore da quello inserito precedentemente, però secondo me il calcolo del fattoriale è sbagliato , esempio come fattoriale di 10 mi da 90

    coe mai? dove sbaglio?
  • Prima cosa: ci sono dei tag appositi per postare il codice.

    Seconda cosa: cosa è il fattoriale? (partiamo dalle basi)
  • Ciao LPs, scusa non sapevo che ci sono dei tag apposta dove li trovo?, comunque si per il fattoriale partiamo dalle basi , ad ogni modo sono riuscito a risolvere l'esercizio, ora il codice è così:

    main(){

    int i,n,fat,n2,m;
    n=1;
    for(i=0;n!=0;i++){

    n2=n;
    printf("Inserisci intero\n");
    scanf("%d",&n);


    if(n<n2){

    fat=n;
    for(m=n;m>2;m--)
    {

    fat=fat*(m-1);

    }

    printf("Fat di %d e : %d\n",n,fat);

    }
    }
    }

    Va bene così o si poteva fare di meglio?
  • Penso che non sia quello che la consegna di chiede.
    Penso che tu debba richiedere un numero e calcolare/stampare tutti i fattoriali di tutti i numeri interi minori di tale numero.

    Quello che fa il tuo programma è calcolare il fattoriale di un numero, solo se esso è minore di una altro numero inserito in precedenza.

    inoltre:
    1) identa il codice
    2) la corretta dichiarazione di main è: int main (void)
    3) usa i tag appositi per postare il codice code e /code fra parentesi quadre
  • Hai ragione , ho capito male l'esercizio, infatti deve calcolare tutti i numeri interi minore di tale nu mumero, quindi se ho capito bene devo modificare il codice in modo che mi faccia il fattoriale del numero inserito , mi basta eliminare if gisuto?
  • Gigio80 ha scritto:


    Hai ragione , ho capito male l'esercizio, infatti deve calcolare tutti i numeri interi minore di tale nu mumero, quindi se ho capito bene devo modificare il codice in modo che mi faccia il fattoriale del numero inserito , mi basta eliminare if gisuto?
    Per quello che ho capito io devi calcolare un fattoriale per ogni numero minore del numero inserito, quindi semplicemente eliminare l'if non basta.

    Devi inoltre tenere conto del range che le variabili che stai utilizzando.

    Il massimo numero che puoi rappresentare con un int è: 2,147,483,647

    Quindi il massimo numero di cui puoi calcolare il fattoriale è : 12! = 479001600
  • Intanto grazie per l'aiuto,
    il testo dell'esercizio e questo: * 1. Predisporre un programma che calcola il valore dei fattoriali di tutte i numeri interi minori uguali a n.
    NOn ho capito bene il discorso del massimo numero che posso calcolare, perchè è 12, ho eliminato if per provare ed ora fa il fattoriale di ogni numero che inserisco e mi fa anche quelli oltre al 12 es ha calcolato il 25!=2076180480 non è giusto?
  • Il fattoriale di 25 è: 1.551121004×10²5......quindi no, non è giusto. Una variabile, in base al suo tipo, può rappresentare un certo range di valori, non qualunque, come ti ho detto nel post precedente, ma questo discorso esula da quello che l'insegnante ti sta chiedendo, visto il tuo grado di conoscenza attuale. Prendilo come un dato di fatto: al massimo puoi calcolare il fattoriale di 12.

    Se proprio vuoi, utilizzando una variabile di tipo unsigned long long int puoi arrivare a 18.446.744.073.709.551.615 e quindi calcolare il fattoriale di 20 che è 2.432902008×10¹8


    Tornando alla tua consegna, io la interpreto così: se l'utente inserisce 10 l'utput del programma deve essere:
    
    9!=362880
    8!=40320
    7!=5040
    

    è così via fino a 1
  • Ora mi è più chiaro , quindi devo inserire anche delle variabili con un max e un min di valore da calcolare? o mi basta inserirli dei limiti nel for?
  • Gigio80 ha scritto:


    Ora mi è più chiaro , quindi devo inserire anche delle variabili con un max e un min di valore da calcolare? o mi basta inserirli dei limiti nel for?
    Puoi risolverlo come vuoi: o chiedi all'utente un valore entro certi limiti ( e li controlli) o , indipendentemente dal numero inserito, calcoli solo i fattoriali dei numeri che riesci a rappresentare.
  • Ho fatto come mi hai suggerito, ho scritto questo codice
    
    #include <stdio.h>
    
    int main(void){
    	
    	int i,a,fat;
    	
    	printf("Inserisci numero: \n");
    	scanf("%d",&a);
    	printf("il numero inserito per il calcolo del fattoriale e: %d\n\n",a);
    	
    	for(i=a;i>0&&i<=12;i--){
    		
    		fat=fat*(i-1);
    		printf("Il fattoriale del numero %d  e: %d\n",i,fat);
    		
    	}
    	
    	}
    	
    però il calcolo che fa del fattoriale è sbagliato , dove sbaglio?
  • Non va bene, ma non capisco se non hai le basi di programmazione o di matematica...

    Devi considerare il tuo codice al contrario, ovvero partire dal fattoriale di 1 fino ad arrivare fino al fattoriale di a-1.
    In questa maniera il for resta molto semplice e ogni ciclo calcoli il fattoriale e lo stampi.
    Il fatto di validare il numero inserito lo puoi fare tranquillamente prima del ciclo for: mi inserisci un numero->controllo se è nei limiti accettabili->se no lo limito e informo l'utente.
    Inoltre tutte le tue variabili locali devono essere inizializzate a qualche valore, per esempio fat devi inizializzarla a 1 prima di entrare nel ciclo for.

    Per tagliare la testa al toro, qui di seguito trovi il codice corretto, cerca di capire le modifiche e fammi sapere se è chiaro:
    
    #include <stdio.h>
    
    int main(void)
    {
    
    	int i, a, fat;
    
    	printf("Inserisci numero: \n");
    	scanf("%d", &a);
    	printf("il numero inserito per il calcolo del fattoriale e: %d\n\n", a);
    
    	// Controllo che il numero inserito resti nei limiti accettabili 
    	if (a>13)
    	{
    		printf("Il numero inserito non è calcolabile\n");
    		a=13;
    	}
    
    	// inizializzo la variabile con cui calcolerò il fattoriale
    	fat=1;
    
    	// Ciclo per tutti i numeri minori del numero inserito
    	for (i = 1; i < a; i++)
    	{
    		fat = fat*i;
    
    		printf("Il fattoriale del numero %2d  e: %d\n", i, fat);
    
    	}
    }
    
  • Grazie mille per l'aiuto , il mio grosso problema è la matematica , infatti il discorso del fattoriale non mi era chiaro , per definizione so il fattoriale di un numero e dato dal prodotto di tutti i numeri reali minori e uguale diversi da 0 es: 5!=5*4*3*2*1->N=N*(N-1) giusto? nel testo del libro avevo come esempio per il calcolo del fattoriale questo codice:
    
    int n,m,fat;
    
    printf("Inserisci N");
    scanf("%d",&n);
    
    fat=n; // fat assume il valore inserito
    
    for(m=n;m>2;m--) //il ciclo inizia dal numero inserito, cintrolla che sia maggiore di 2 e viene eseguito il primo cicli fat=fat*(m-1)
    {
    
    fat=fat*(m-1);
    
    printf("Il fattoriale di %d e: %d",n,fat);
    }
    
    

    E gisuto ?

    Ieggendo il tuo codice ho capito i miei errori :

    n°1 dovevo inserire un codice per il controllo del numero inserito
    n°2 prima del ciclo for dovevo inizializzare la variabile fat=1 perchè sempre per la definizione di sopra deve essere diversa da 0 giusto?
    n°3 il calcolo del fattoriale non è fat=fat*(i-1); ma questo fat = fat*i;

    Però dai tutto sommato ci stavo arrivando o no???

    Ora ho un altro esercizio da fare , predisporre un programma che calcoli il maggiore il minore e la somma dei N inseriti, vediamo cosa combino , posso disturbarti ancora se ho bisogno?
  • Spero vivamente che il codice del libro sia
    
    	int n, m, fat;
    
    	printf("Inserisci N");
    	scanf("%d", &n);
    
    	fat = n; // fat assume il valore inserito
    
    	for (m = n; m > 2; m--) //il ciclo inizia dal numero inserito, cintrolla che sia maggiore di 2 e viene eseguito il primo cicli fat=fat*(m-1)
    	{
    
    		fat = fat * (m - 1);
    	}
    
    	printf("Il fattoriale di %d e: %d\n", n, fat);
    
    altrimenti meglio se lo butti

    Se hai altri problemi apri un nuovo thread e qualcuno ti darà una mano di sicuro.

    Ciao
Devi accedere o registrarti per scrivere nel forum
20 risposte