Pagina 1 di 6

Calcolo fattoriale in C\C++

MessaggioInviato: 26 gen 2014, 20:46
da silence1992
Ciao a tutti,
ho un problema con il seguente codice...
Quando compilo non segnala alcun errore ...
Però se inserisco n=0 mi da come risultato 2 e non il messaggio "Errore......"
Secondo voi cosa c'è che non va?
Codice: Seleziona tutto
//calcolo fattoriale di n con funzioni

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

double fattor(int);
int leggi_int();
void stampa(int,double);

main()
{
   int n;
   double fatt;
   
   n=leggi_int();
   fatt=fattor(n);
   
   stampa(n,fatt);
   
   return 0;
}

int leggi_int()
{
   int n;
   cout<<"Inserire un intero:"<<endl<<"n=";
   cin>>n;
   while(n<=0){
      cout<<"Errore!Il numero inserito e' negativo...Inserire di nuovo un intero:";
      cout<<"n=";
      cin>>n;
   }
   return n;
}

double fattor(int n)
{
   double f=1;
   int i=1;
   while(i<=n)
   {
      f=f*i;
      i++;
   }
   return f;
}

void stampa(int n,double f)
{
   cout<<endl;
   cout<<"Il fattoriale di "<<n<<"e':"<<f<<endl;
   return;
}


Re: Calcolo fattoriale in C\C++

MessaggioInviato: 26 gen 2014, 21:13
da Candy
Bisogna vedere come "cin" restituisce n. Io non le conosco, non le ho mai usate, ma forse, ci sono problemi tra i formati.

Re: Calcolo fattoriale in C\C++

MessaggioInviato: 26 gen 2014, 21:17
da Candy
Intendo dire che probabilmente "cin" restituisce un carattere, od una stringa e, dovendolo depositare in un intero, magari il compilatore fa la conversione ASCII. Tu scrivi 0, e ti ritrovi 48.
Prova a fare meglio le conversioni che desideri tra i formati.

Re: Calcolo fattoriale in C\C++

MessaggioInviato: 27 gen 2014, 9:42
da IsidoroKZ
silence1992 ha scritto:.
Però se inserisco n=0 mi da come risultato 2 e non il messaggio "Errore......"


Il fattoriale di zero esiste ed e` definito. 0!=1, vedi ad esempio qui

Re: Calcolo fattoriale in C\C++

MessaggioInviato: 27 gen 2014, 9:52
da carloc
... e poi questa è la classica cosa da fare ricorsiva ;-)
Codice: Seleziona tutto
int fatt(int n)
{
if (n==0) return 1;
else return n*fatt(n-1);
}

.. o comunque con i tipi che preferisci...

Re: Calcolo fattoriale in C\C++

MessaggioInviato: 27 gen 2014, 10:35
da DirtyDeeds
Candy ha scritto:Intendo dire che probabilmente "cin" restituisce un carattere, od una stringa e, dovendolo depositare in un intero, magari il compilatore fa la conversione ASCII. Tu scrivi 0, e ti ritrovi 48.


No, non funziona così. Non viene fatta nessuna conversione ASCII.

silence1992 ha scritto:Però se inserisco n=0 mi da come risultato 2 e non il messaggio "Errore......"


A me funziona correttamente. Però la funzione che calcola il fattoriale nun se po' guarda' ;-) E anche sul resto ci sarebbero alcune cose da mettere a posto.

carloc ha scritto:... e poi questa è la classica cosa da fare ricorsiva


Meglio evitare la ricorsività in questo caso ;-)

Re: Calcolo fattoriale in C\C++

MessaggioInviato: 27 gen 2014, 10:37
da carloc
DirtyDeeds ha scritto:...
Meglio evitare la ricorsività in questo caso ;-)


Paura di saturare lo stack? :D

Re: Calcolo fattoriale in C\C++

MessaggioInviato: 27 gen 2014, 10:41
da DirtyDeeds
Non solo: è anche molto più lenta. Con un ciclo for si fa molto prima.

Re: Calcolo fattoriale in C\C++

MessaggioInviato: 27 gen 2014, 11:12
da TardoFreak
Codice: Seleziona tutto
int fatt1(int n)
{
  int result = 1;
  int i;
  if (n) for(i=1; i<=n; result *= i++);
  return result;
}

int fatt2(int n)
{
  int result = 1;
  for(;n;) result *= n--;
  return result;
}


Edit: la seconda versione è meglio scriverla in questo modo, è più pulito (ma è solo un dettaglio).
Codice: Seleziona tutto
int fatt2(int n)
{
  int result = 1;
  for(;n;n--) result *= n;
  return result;
}

Re: Calcolo fattoriale in C\C++

MessaggioInviato: 27 gen 2014, 11:51
da DirtyDeeds
TardoFreak ha scritto:Edit: la seconda versione è meglio scriverla in questo modo, è più pulito (ma è solo un dettaglio).


O ancora più compatto:

Codice: Seleziona tutto
int fatt3(int n)
{
    int result = 1;
    for(; n; result *= n--)
        ;
    return result;
}