Programma Fattoriale

di il
2 risposte

Programma Fattoriale

Non trovo l'errore nel programma che sto cercando di realizzare. Qualcuno mi può cercare di aiutare???
/**
* Progettare con la tecnica dei flow-chart e realizzare in java un programma che chieda all'utente il numero n
* verificando in modo dettagliato che n sia numerico, non intero, non negativo ed esegua il calcolo del fattoriale
* di n comunicando il risultato in output. Dopo aver eseguito l'output chiedere all'utente: "Devo effettuare un
* calcolo ?". Se l'utente risponde "Si" si riesegue il calcolo, se l'utente risponde "No", il programma termina;
* qualunque altra risposta darà luogo ad un messaggio di errore.
*
* @author (Tombolato Nicolò)
* @version (23/12/2016)
*/

// Importazioni
import java.util.Scanner;
import javax.swing.JOptionPane;
// Intestazione
public class CalcolaFattoriale{
public static void main(String args[]){
// Dichiarazione variabili
double N;
int k, fatt;
boolean lettera, intpos;

// Creazione dell'oggetto tastiera utilizzando la classe Scanner
Scanner tastiera = new Scanner(System.in);
String risposta = "Si";
risposta = new String("Si");
String risposta2 = "No";
risposta = new String("No");
String input =JOptionPane.showInputDialog("Devo effettuare il calcolo di un fattoriale?");
// Cicli di controllo dell'input
do {
do{
do{
System.out.print("Inserisci il valore di N: ");
if(tastiera.hasNextDouble()){ // Verifica se il valore inserito è numerico
N = tastiera.nextDouble(); // Input valore di N (se N è numerico)
lettera = true; // Variabile che indica che il valore è un numero
} else {
tastiera.next(); // Se non è un valore numerico libera la memoria utilizzata dal valore errato
System.out.println("Il valore inserito non è un numero!");
lettera = false; // Variabile che indica che il valore non è un numero
N = 0; // Temporanea assegnazione del valore di N
}
} while (lettera == false); // Se il valore inserito non è un numero lo si richiede all'utente
if(N == (int)N && N >= 0){ // Verifica se il valore è intero e positivo
intpos = true; // Variabile che indica che il valore è positivo e intero
} else {
intpos = false; // Variabile che indica che il valore non è positivo e intero
if(N != (int)N){
System.out.println("Il valore inserito non è intero!");
}
if(N < 0){
System.out.println("Il valore inserito è negativo!");
}
}
} while (intpos == false); // Se il valore inserito non è intero e positivo lo si richiede all'utente

// Algoritmo di calcolo del fattoriale
fatt = 1;
if(N == 0 || N == 1){
System.out.println(N + "! = " + fatt);
} else {
for(k = (int)N; k >= 1; k --){
fatt = fatt * k;
}
System.out.println(N + "! = " + fatt);
}
if(risposta.equals("No")) {
System.out.print("Fine Elaborazione ");
}
String input2 =JOptionPane.showInputDialog("Devo effettuare il calcolo di un fattoriale?");
}while(risposta.equals("input"));
}
}

2 Risposte

  • Re: Programma Fattoriale

    Non posso compilare ed eseguire il programma ora. Che errore ottieni ?
    Comunque attento a come usi risposta, vale "No" e non viene modificata in seguito.
    Anche il confronto con la stringa "input" è dubbio, al massimo volevi confrontare con la variabile input.
    Inoltre nel testo si parla di valore non intero, tu usi un double ma poi richiedi un intero... cosa volevi fare ?
    Comunque ci sono varie imprecisioni qua è là...

    Ps : inserisci il codice nei tag Code, così non si capisce molto...
  • Re: Programma Fattoriale

    nico_tomb ha scritto:


    Non trovo l'errore nel programma che sto cercando di realizzare.
    Il codice è un po' confuso e contorto, con più cicli annidati che non rendono facile la comprensione.
    La logica di calcolo del fattoriale è giusta, cioè il risultato è tecnicamente quello corretto del fattoriale.
    Devi però tenere presente una cosa: il fattoriale si basa sul prodotto di una serie di numeri e quindi la grandezza del numero cresce MOLTO velocemente. Avendo usato un int (valore massimo 2147483647) il massimo fattoriale che puoi arrivare a calcolare senza casini è 12!
    Da 13 in poi ottieni solo robaccia ... colpa del "overflow"

    Comunque è un po' discutibile (ma non sbagliato di per sé) mescolare input con showInputDialog e con Scanner da System.in
    E visto che serve in ogni caso un numero intero, non si capisce perché chiedi un double e non direttamente un int.

    Inoltre (e questo è un problema/dubbio del tuo codice), il valore di ritorno di showInputDialog NON lo stai usando e il while(risposta.equals("input")) alla fine NON ha senso perché stai confrontando 'risposta' (che è fisso a "No" fin dall'inizio) con un'altra stringa costante ("input").
Devi accedere o registrarti per scrivere nel forum
2 risposte