Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    32

    Domande da "niubbo"

    Ciao a tutti Sto iniziando ad imparare a programmare in Java.
    Dopo aver letto buona parte del libro, ho iniziato a cercare qualche esercizietto, e sto iniziando con questo:
    Scrivere un metodo che, dato un booleano stampa e un numero n, restituisce il numero di divisori interi di n. Se stampa è true, essi vengono stampati a video come effetto collaterale durante l'esecuzione del metodo.
    Io l'ho implementato così:
    codice:
    /*
      Calcolo dei divisori di n.
    */
    
    class Divisori {
      boolean stampa;
      int n;
      int numeriDivisori[] = new int[n];
    
      void divisori() {
        int quanti = 0;
        for (int i=1; i <= n; i = i+1) {
            if (n%i == 0) {
               quanti = quanti + 1;
               if (stampa) {
                  numeriDivisori[quanti - 1] = i;
               } 
            }
        } // fine ricerca divisori
    
      if (quanti == 1)
        System.out.println("Il numero " + n + " ha un solo divisore");
      else
        System.out.println("Il numero " + n + " ha " + quanti + " divisori");
      
      if (stampa) { //Stampo i divisori se richiesto
         System.out.println("I divisori di " + n + " sono:");
         for (int j=0; j < quanti; j = j + 1) {
             System.out.println(numeriDivisori[j]);
         }  
      }// fine stampa dei divisori
    
      }// fine divisori()
    }
    
    class Prova {
      public static void main(String[] args) {
         Divisori d = new Divisori();
         d.n = 13;
         d.stampa = true;
         d.divisori();
      }//main()
    }
    Il compilatore compila tranquillamente, ma lanciando il programma ho il seguente errore
    codice:
    Exception in thread "main" java.lang.NoClassDefFoundError: Prova/class
    Caused by: java.lang.ClassNotFoundException: Prova.class
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    dove posso aver sbagliato?

  2. #2
    Devi lanciare:

    codice:
    java Prova
    e non:

    codice:
    java Prova.class
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Ciao

    Scrivere un metodo che, dato un booleano stampa e un numero n, restituisce il numero di divisori interi di n. Se stampa è true, essi vengono stampati a video come effetto collaterale durante l'esecuzione del metodo.
    L'esercizio ti chiede di scrivere un metodo....non penso ci sia bisogno di fare una classe.

    Attenzione, se leggi attentamente , il quesito dice : restituisce il numero di divisori interi di n ; quindi restituisce appunto un numero che rappresenta la quantità di divisori.

    Per esempio se i divisori interi saranno 5 , il metodo ti restituirà appunto 5.
    Quindi non ti serve un vettore (nel tuo codice ti sei creato un vettore numeriDivisori)


    Soluzione:

    codice:
    public int divisori(boolean b, int n){
     
       if(b==false) System.out.println("Stampa = false");
    
       int NumeroDaVerificare = n;
       int NumeroDiDivisoriInteri = 1;  //C'è sempre un divisore intero per ogni numero che è appunto il mumero stesso.
       int Divisore = 1;
       While(Divisore!=NumeroDaVerificare){  
    
         if(NumeroDaVerificare%Divisore==0){
    
         ++NumeroDiDivisoriInteri;
         ++Divisore;
         }
       }
    
     return NumeroDiDivisoriInteri;
    
    }
    Spero che tu capisca come funziona il metodo.
    Ciao

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,459

    Moderazione

    Originariamente inviato da enpires
    Domande da "niubbo"
    Come indicato nel Regolamento, suggerisco di usare titoli più significativi in futuro, che diano una indicazione del contenuto della discussione.

    Qui l'ho corretto io per fornire un esempio.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    32
    Originariamente inviato da satifal
    Devi lanciare:

    codice:
    java Prova
    e non:

    codice:
    java Prova.class
    Ok, appena ho il pc sotto mano provo, ma mi sembrava di aver lanciato così Grazie in ogni caso

    EDIT:
    confermo, ottengo errori anche se scrivo come hai detto tu, eccoli:
    codice:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    	at Divisori.divisori(divisori.java:16)
    	at Prova.main(divisori.java:41)
    Originariamente inviato da Markus85
    Ciao



    L'esercizio ti chiede di scrivere un metodo....non penso ci sia bisogno di fare una classe.
    Si, ma un metodo non deve sempre appartenere ad una classe? Altrimenti come lo uso?

    Attenzione, se leggi attentamente , il quesito dice : restituisce il numero di divisori interi di n ; quindi restituisce appunto un numero che rappresenta la quantità di divisori.

    Per esempio se i divisori interi saranno 5 , il metodo ti restituirà appunto 5.
    Quindi non ti serve un vettore (nel tuo codice ti sei creato un vettore numeriDivisori)
    Si, infatti quel valore l'ho memorizzato nella variabile "quanti", il vettore mi serviva per la richiesta "Se stampa è true, essi vengono stampati a video come effetto collaterale durante l'esecuzione del metodo."


    Soluzione:

    codice:
    public int divisori(boolean b, int n){
     
       if(b==false) System.out.println("Stampa = false");
    
       int NumeroDaVerificare = n;
       int NumeroDiDivisoriInteri = 1;  //C'è sempre un divisore intero per ogni numero che è appunto il mumero stesso.
       int Divisore = 1;
       While(Divisore!=NumeroDaVerificare){  
    
         if(NumeroDaVerificare%Divisore==0){
    
         ++NumeroDiDivisoriInteri;
         ++Divisore;
         }
       }
    
     return NumeroDiDivisoriInteri;
    
    }
    Spero che tu capisca come funziona il metodo.
    Ciao
    Ho capito come funziona, e credo che a questo punto ho sbagliato a far restituire il valore "a video" anzichè come valore di return del metodo Tuttavia non capisco nel tuo metodo come gestisci il fatto che quando stampa è a true deve stampare i singoli divisori del numero dato.
    Inoltre perchè ti sei "copiato" il valore di n nella variabile NumeroDaVerificare?? Semplice comodità, o c'è qualche sottigliezza tecnica che mi sfugge?
    Infine, il comando "++Divisore" non dovrebbe stare fuori dall'if?

    Originariamente inviato da alka
    Come indicato nel Regolamento, suggerisco di usare titoli più significativi in futuro, che diano una indicazione del contenuto della discussione.

    Qui l'ho corretto io per fornire un esempio.
    Ciao! Chiedo scusa se sono andato contro regolamento, ma la mia intenzione era di tenere questo thread per tutte le domande che mi venivano in mente durante lo studio di Java, in modo da non "sporcare" il forum ogni volta che ho un dubbio. Da cui il titolo precedente
    In ogni caso la prossima volta farò più attenzione

  6. #6
    Originariamente inviato da enpires
    Ok, appena ho il pc sotto mano provo, ma mi sembrava di aver lanciato così Grazie in ogni caso

    EDIT:
    confermo, ottengo errori anche se scrivo come hai detto tu, eccoli:
    codice:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    	at Divisori.divisori(divisori.java:16)
    	at Prova.main(divisori.java:41)
    ...
    Ma se noti bene l'eccezione sollevata è differente. Prima il programma non veniva proprio eseguito ora invece hai un eccezione applicativa alla riga 16 (metodo divisori della classe Divisori) in quanto tenti di accedere ad un valore esterno al range dell'array.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    32
    Mmm ok credo di aver capito. Bene, domani mi ci metto e vediamo che problema ha st'array

    Grazie intanto!

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Tuttavia non capisco nel tuo metodo come gestisci il fatto che quando stampa è a true deve stampare i singoli divisori del numero dato.
    il metodo non stampa ogni singolo divisore, bensi stampa (restituisce su video) un numero che rappresenta la quantità di divisori interi.

    Si, ma un metodo non deve sempre appartenere ad una classe? Altrimenti come lo uso?
    Si ti devi scrivere una classe per utilizzarlo ;
    Io ti ho scritto solo il metodo perchè era quello che il quesito chiedeva.

    Se volevi usare questo metodo , lo potevi fare per esempio nel metodo main passandogli il numero di cui volevi sapere appunto il numero di divisori interi.
    Supponiamo che questo mumero lo avevi chiamato NV

    codice:
    class Applicazione{
    
    public static void main(String [] args){
    
    int Risultato;
    Risultato.divisori(stampa,NV);
    System.out.println("il numero di divisori interi del numero è : " +Risultato);
    }
    }
    Infine, il comando "++Divisore" non dovrebbe stare fuori dall'if?
    Si hai ragione ; ++Divisore deve stare fuori dall'if altrimenti non si incrementerebbe quando non si verifica la condizione.
    Colpa mia qui scusa

    Spero di esserti stato di aiuto
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.