Lettura e somma di interi

di il
8 risposte

Lettura e somma di interi

Salve a tutti,

innanzitutto piacere di conoscervi, sono uno studente di ingegneria per la prima volta alle prese con problemi di programmazione, il problema che vi pongo vi sembrerà banale, ma purtroppo mi stò accorgendo che in informatica sono proprio un pò negato, vi prego di portare un pò di pazienza con me!

Dunque, il problema è quello scritto nel titolo, vi posto lo pseudocodice fornito nelle slides del prof:
int numero; // elemento corrente della sequenza
int somma; // somma degli elementi della sequenza
/* leggi una sequenza di numeri interi e
* calcolane la somma */
/* inizialmente somma vale zero */
somma = 0;
/* finché ci sono altri elementi nella sequenza,
Iterazione
4
* leggili e sommali a somma */
while (scanner.hasNextInt()) { // finché ci sono altri elementi
/* leggi un elemento della sequenza */
numero = scanner.nextInt();
/* incrementa somma di numero */
somma = somma + numero;
}
/* visualizza somma */
System.out.println(somma);
Questo invece è il codice a cui ho pensato io:
import java.util.*;

class Somme {

   int numero, somma;

   somma=0;

   public static void main (String args[]) {

      System.out.println("inserisci i numeri da sommare");
      Scanner scanner=new Scanner(System.in);

      while (scanner.hasNextInt()) {
         numero=scanner.nextInt();
         somma=somma+numero;
      }

      System.out.println(somma);

   }

}
Solo che durante la compilazione, mi segna come errore l' uguale di "somma=0" e mi dice :
error: <identifier> expected.

Già qui non capisco cosa ho sbagliato, e mi piacerebbe che qualcuno mi illuminasse, comunque dopo qualche tentativo ho riscritto il codice in questo modo:
import java.util.*;

class Somme {

   public static void main (String args[]) {

      int numero, somma;

      somma = 0;

      System.out.println("inserisci i numeri da sommare");
      Scanner scanner=new Scanner(System.in);

      while (scanner.hasNextInt()) {
         numero=scanner.nextInt();
         somma=somma+numero;
      }

      System.out.println(somma);

   }

}
In questo caso in fase di compilazione non c' è alcun errore, ma quando devo eseguire il programma, il risultato è:
errore: imposibile trovare o caricare la classe principale Somme.class

Forse il secondo errore è dato dal fatto che una classe non può essere composta dal solo main? Eppure io so per certo che il primo programma di prova che ci hanno fatto fare funzionava solo con il main, quindi cosa devo dedurre?

8 Risposte

  • Re: Lettura e somma di interi

    Scusate, mi stò accorgendo ora che l' errore "impossibile trovare o caricare la classe ..." viene dato all' esecuzione di ogni programma, anche quelli precedentemente funzionanti!
    Cos' è successo?!
  • Re: Lettura e somma di interi

    Dall'errore direi che lanci il programma da linea di comando... per cui direi:
    javac Somme.java (per compilare)
    java Somme (per lanciarlo)
  • Re: Lettura e somma di interi

    Il primo errore che hai riscontrato e' dato dal fatto che un metodo statico puo richiamare solamente altri metodi e variabili statici della stessa classe, quindi se aggiungevi static durante la dichiarazione delle variabili dovrebbe compilartelo ugualmente.
    Il secondo probabilmente hai lancianto
    java Somme.class
    come spiegato da Jam3s82 il comando java non vuole l'estensione del file ma solamente il nome.
    La parte static e' un po complicato ma in pratica nella programmazione ad oggetti in genere si ha sempre bisogno di creare un oggetto prima di usare una funzione o variabile di una classe, mentre nel caso delle variabili e metodi static la cosa e' diversa perche' e che se vengono virtualmente creati degli oggitti sempre presenti anche senza la creazione di oggetti.
    
    // Esempio
    class Somma{
    public int somma( int a, int b ){ return a+b;}
    }
    class SommaStatic{
    public static int somma( int a, int b ){ return a+b; }
    }
    
    public class TestSomma{
    public static void main( String args[] )
    {
    Somma calcolo = new Somma();
    System.out.println( calcolo.somma( 3, 5 ) );
    // qui sopra ho dovuto creare un oggetto per usare il metodo somma
    System.out.println( SommaStatic.somma( 8, 2 ) );
    // in questo caso non c'e' bisogno della creazione di un oggetto
    }
    }
    
    Le regole di static sono piu complica e non me li ricordo molto bene e sono di piu' di quelle che ho accennato.
  • Re: Lettura e somma di interi

    Grazie mille, mi avete davvero aiutato
    Ora però mi sono accorto di un altro piccolo problemino: dopo che ho inserito i numeri da sommare, non sò come dire al programma di fare la somma, cioè per intenderci, ho inserito 3 numeri, premuto invio, e tutto quel che è successo è stato andare sotto di una riga :/
  • Re: Lettura e somma di interi

    Questo problema è dovuto al fatto che lo scanner è in lettura su System.in (ovvero lo standard input, la tastiera) e che quindi potenzialmente potresti continuare a scrivere numeri all'infinito (quindi la condizione "scanner.hasNextInt()" è sempre vera e non si esce mai dal while).
    Una soluzione semplice è scrivere un qualsiasi carattere che non sia un numero e premere invio, per fare in modo che la condizione "hasNextInt" restituisca false e ti permetta di eseguire le istruzioni successive al loop. Ricorda, inoltre, di chiudere lo scanner (attraverso "scanner.close()") dopo aver finito di leggere i numeri.
  • Re: Lettura e somma di interi

    Della ha scritto:


    Una soluzione semplice è scrivere un qualsiasi carattere che non sia un numero e premere invio, per fare in modo che la condizione "hasNextInt" restituisca false e ti permetta di eseguire le istruzioni successive al loop. Ricorda, inoltre, di chiudere lo scanner (attraverso "scanner.close()") dopo aver finito di leggere i numeri.
    Ciao ho sempre usato BufferedReader per l'acquisizione, anche questo ha bisogno di essere chiuso?, una volta ci avevo provato a chiudere( non ricordo se bufferedeReader o Scanner ) ma poi non sono riuscito a riaprire la comunicazione riusciresti a spiegarmi perche si deve chiudere e come si riapre poi? ( la mia ipotesi e quella di rilasciare la risorsa di input in questione per renderla disponibile ad altri programmi )
  • Re: Lettura e somma di interi

    Si, in genere tutti gli stream (sia di byte che di caratteri) vanno chiusi quando non li usi più..questo serve per rilasciare le risorse associate (ad esempio file)..Che io sappia non è possibile riaprire uno stream. Per riutilizzare lo stesso riferimento bisogna creare un oggetto nuovo.

    ad esempio
    
    BufferedReader br = new BufferedReader(new FileReader("prova.txt"));
    ....
    br.close();
    //se voglio riusare br devo creare un nuovo oggetto
    br = new BufferedReader(new FileReader("prova.txt"));
    
  • Re: Lettura e somma di interi

    Ecco perche non riuscivo piu a riaprire, Grazie.
Devi accedere o registrarti per scrivere nel forum
8 risposte