Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Errore in un esercizio

  1. #1

    Errore in un esercizio

    [/COLOR] Ciao a tutti, mi trovo un pò in difficoltà nel capire l'output di questo esercizio.

    import java.util.Scanner;

    public class ProvaFattura
    {
    public static void main( String args[] )
    {
    // creo uno scanner per ricevere dati da tastiera
    Scanner input = new Scanner(System.in);

    // creo gli oggetti per la classe Fattura
    Fattura fattura1 = new Fattura( 0001, "Scheda Madre Asrock", 4, 120.50 );
    Fattura fattura2 = new Fattura( 0002, "Processore intel", 4, 98.50 );

    // stampa il totale delle fatture
    System.out.printf( "L'articolo in fattura1 è:\n\nCodice: %d\nDescrizione: %s\nQuantità: %d\nPrezzo: € %.2f",
    fattura1.getCodice(), fattura1.getDescrizione(), fattura1.getQuantita(), fattura1.getPrezzo() );
    System.out.println();
    fattura1.totaleFattura();
    System.out.printf( "L'articolo in fattura2 è:\n\nCodice: %d\nDescrizione: %s\nQuantità: %d\nPrezzo: € %.2f",
    fattura2.getCodice(), fattura2.getDescrizione(), fattura2.getQuantita(), fattura2.getPrezzo() );
    System.out.println();
    fattura2.totaleFattura();

    // inserisco gli articoli in fattura1

    System.out.println();
    System.out.print( "Inserisci l'articolo:\n" );
    System.out.print( "Codice: " );
    int argCod = input.nextInt();
    System.out.print( "Descrizione: " );
    String argDesc = input.nextLine();
    System.out.print( "Quantità: " );
    int argQta = input.nextInt();
    System.out.print( "Prezzo: " );
    double argPrez = input.nextDouble();
    fattura1.setCodice(argCod);
    fattura1.setDescrizione(argDesc);
    fattura1.setQuantita(argQta);
    fattura1.setPrezzo(argPrez);
    System.out.println();

    // stampo il totale di fattura1
    System.out.printf( "L'articolo in fattura1 è:\n\nCodice: %d\nDescrizione: %s\nQuantità: %d\nPrezzo: € %.2f",
    fattura1.getCodice(), fattura1.getDescrizione(), fattura1.getQuantita(), fattura1.getPrezzo() );
    System.out.println();
    fattura1.totaleFattura();
    System.out.println();

    // inserisco gli articoli in fattura2
    System.out.println();
    System.out.print( "Inserisci l'articolo:\n" );
    System.out.print( "Codice: " );
    argCod = input.nextInt();
    System.out.print( "Descrizione: " );
    argDesc = input.next();
    System.out.print( "Quantità: " );
    argQta = input.nextInt();
    System.out.print( "Prezzo: " );
    argPrez = input.nextDouble();
    fattura2.setCodice(argCod);
    fattura2.setDescrizione(argDesc);
    fattura2.setQuantita(argQta);
    fattura2.setPrezzo(argPrez);

    // stampa il totale di fattura2
    System.out.printf( "L'articolo in fattura2 è:\n\nCodice: %d\nDescrizione: %s\nQuantità: %d\nPrezzo: € %.2f",
    fattura2.getCodice(), fattura2.getDescrizione(), fattura2.getQuantita(), fattura2.getPrezzo() );
    System.out.println();
    fattura2.totaleFattura();


    } // fine del metodo main
    } // fine della classe ProvaFattura


    e questo è l'output:


    L'articolo in fattura1 è:

    Codice: 1
    Descrizione: Scheda Madre Asrock
    Quantità: 4
    Prezzo: € 120,50
    Il totale della fattura è 482,00

    L'articolo in fattura2 è:

    Codice: 2
    Descrizione: Processore intel
    Quantità: 4
    Prezzo: € 98,50
    Il totale della fattura è 394,00


    Inserisci l'articolo:
    Codice: 0003
    Descrizione: Quantità: Descrizione: Quantità:


    Come vedete, l'ultima riga di output non è corretta, ma non ho capito il perchè, penso sia un problema inerente la riga String = input.nextLine(); ma sinceramente non so dove sbaglio.
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Errore in un esercizio

    Originariamente inviato da yuri.coluzzi
    Come vedete, l'ultima riga di output non è corretta, ma non ho capito il perchè
    La questione è nel modo di usare lo Scanner. Che va "capito". Scanner estrae tipicamente dei "token" e per separarli usa un "delimitatore" (che per default è una sequenza di whitespace).
    Ma può anche leggere una riga intera.

    Il fatto è che l'input da console è "bufferizzato" e arriva allo scanner solo quando premi invio.

    Se con la sequenza nexInt() poi dopo nextLine() pensavi di digitare:

    12 INVIO blabla INVIO

    Ecco il problema concettuale. INVIO è un whitespace e delimita il primo token 12 che nextInt restituisce. Ma il delimitatore (INVIO) resta lì (non viene subito "saltato") e il nextLine() "vede" solo una linea vuota.

    Se invece facevi:

    12 SPAZIO blabla INVIO

    Allora nextInt torna 12 e nextLine torna " blabla" (con spazio iniziale).

    Quindi occhio al concetto di "token" e "linea" e a non mescolare le cose.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Scusa, ho sbagliato io, il codice giusto è il seguente:


    import java.util.Scanner;

    public class ProvaFattura
    {
    public static void main( String args[] )
    {
    // creo uno scanner per ricevere dati da tastiera
    Scanner input = new Scanner(System.in);

    // creo gli oggetti per la classe Fattura
    Fattura fattura1 = new Fattura( 0001, "Scheda Madre Asrock", 4, 120.50 );
    Fattura fattura2 = new Fattura( 0002, "Processore intel", 4, 98.50 );

    // stampa il totale delle fatture
    System.out.printf( "L'articolo in fattura1 è:\n\nCodice: %d\nDescrizione: %s\nQuantità_: %d\nPrezzo: € %.2f",
    fattura1.getCodice(), fattura1.getDescrizione(), fattura1.getQuantita(), fattura1.getPrezzo() );
    System.out.println();
    fattura1.totaleFattura();
    System.out.printf( "L'articolo in fattura2 è:\n\nCodice: %d\nDescrizione: %s\nQuantità_: %d\nPrezzo: € %.2f",
    fattura2.getCodice(), fattura2.getDescrizione(), fattura2.getQuantita(), fattura2.getPrezzo() );
    System.out.println();
    fattura2.totaleFattura();

    // inserisco gli articoli in fattura1

    System.out.println();
    System.out.print( "Inserisci l'articolo:\n" );
    System.out.print( "Codice:\n " );
    int argCod = input.nextInt();
    System.out.print( "Descrizione:\n " );
    String argDesc = input.nextLine();
    System.out.print( "Quantità:\n " );
    int argQta = input.nextInt();
    System.out.print( "Prezzo:\n " );
    double argPrez = input.nextDouble();
    fattura1.setCodice(argCod);
    fattura1.setDescrizione(argDesc);
    fattura1.setQuantita(argQta);
    fattura1.setPrezzo(argPrez);
    System.out.println();

    // stampo il totale di fattura1
    System.out.printf( "L'articolo in fattura1 è:\n\nCodice: %d\nDescrizione: %s\nQuantitÃ_: %d\nPrezzo: € %.2f",
    fattura1.getCodice(), fattura1.getDescrizione(), fattura1.getQuantita(), fattura1.getPrezzo() );
    System.out.println();
    fattura1.totaleFattura();
    System.out.println();

    // inserisco gli articoli in fattura2
    System.out.println();
    System.out.print( "Inserisci l'articolo:\n" );
    System.out.print( "Codice: " );
    argCod = input.nextInt();
    System.out.print( "Descrizione: " );
    argDesc = input.nextLine();
    System.out.print( "QuantitÃ_: " );
    argQta = input.nextInt();
    System.out.print( "Prezzo: " );
    argPrez = input.nextDouble();
    fattura2.setCodice(argCod);
    fattura2.setDescrizione(argDesc);
    fattura2.setQuantita(argQta);
    fattura2.setPrezzo(argPrez);

    // stampa il totale di fattura2
    System.out.printf( "L'articolo in fattura2 è:\n\nCodice: %d\nDescrizione: %s\nQuantitÃ_: %d\nPrezzo: € %.2f",
    fattura2.getCodice(), fattura2.getDescrizione(), fattura2.getQuantita(), fattura2.getPrezzo() );
    System.out.println();
    fattura2.totaleFattura();


    } // fine del metodo main
    } // fine della classe ProvaFattura

    e l'output è questo

    L'articolo in fattura1 è:

    Codice: 1
    Descrizione: Scheda Madre Asrock
    Quantità: 4
    Prezzo: € 120,50
    Il totale della fattura è 482,00

    L'articolo in fattura2 è:

    Codice: 2
    Descrizione: Processore intel
    Quantità: 4
    Prezzo: € 98,50
    Il totale della fattura è 394,00


    Inserisci l'articolo:
    Codice: 3
    Descrizione: Quantità: Descrizione: Quantità:

    Come vedi dall'output le prime righe sono inizializzate dalle variabili di istanza e quindi l'articolo in fattura 1 e l'articolo in fattura 2, li memorizzo con i costruttori, poi uso i metodi per settare un nuovo articolo e li succede il casino, appena inserisco il codice e premo invio, (quindi 3 e poi invio) la riga dopo esce sbagliata.
    Ti faccio un esempio, voglio inserire questi dati:
    Codice: 3 INVIO
    Descrizione: Processore AMD INVIO
    Quantità: 4 INVIO
    Prezzo: 90 INVIO
    il comando input.nextLine() non dovrebbe memorizzare tutta la riga fino al carattere di nuova linea? Se non è così, ho capito male
    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da yuri.coluzzi
    Codice: 3 INVIO
    Descrizione: Processore AMD INVIO
    Quantità: 4 INVIO
    Prezzo: 90 INVIO
    il comando input.nextLine() non dovrebbe memorizzare tutta la riga fino al carattere di nuova linea?
    Ma hai letto cosa ho risposto io??? Il nextInt() ti restituisce 3 ma l'INVIO resta nel suo buffer interno. E il nextLine() legge INVIO .... = una riga "vuota".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Il concetto l'ho capito, ma non riesco a risolverlo.
    Scusami se rompo, ma sono agli inizi e degli errori che per te sono bazzecole, per me sono montagne e se non risolvo l'errore, credo che sia controproducente fare finta di niente e proseguire col prossimo capitolo.
    Quindi, rimettiamo insieme i pezzi:

    Codice: 3 (nextInt() legge 3, ma quando premo invio non svuota il buffer e invio viene letto da nextLine() che quindi è una linea vuota)

    Penso di aver capito, ma sul libro che stò studiando questi concetti non li ho letti.
    Allora.... come devo ovviare a questo problema?
    Grazie

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da yuri.coluzzi
    Allora.... come devo ovviare a questo problema?
    Potresti sempre leggere "a righe" e convertire tu in int le informazioni che servono. Magari con un tuo metodo apposito che eventualmente ripete anche la richiesta se l'input non è appropriato. E ancora, meglio, incapsulando tutto questo in una piccola classe apposita per l'I/O su console.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    per completezza rispondo anche in questo forum, ecco il codice che fa quello che chiedi (naturalmente potato solo alla parte che ti interessa).

    codice:
    import java.util.Scanner; 
    
    public class ProvaFattura 
        { 
            public static void main( String args[] ) 
            { 
                // creo uno scanner per ricevere dati da tastiera 
                Scanner input = new Scanner(System.in); 
                input.useDelimiter("\n"); 
                 
                // inserisco gli articoli in fattura1 
                 
                System.out.println(); 
                System.out.print( "Inserisci l'articolo:\n" ); 
                System.out.print( "Codice: " ); 
                int argCod = input.nextInt(); 
                System.out.println( argCod); 
                System.out.print( "Descrizione: " ); 
                String argDesc = input.next(); 
                System.out.println( argDesc); 
                System.out.print( "Quantità: " ); 
                int argQta = input.nextInt(); 
                System.out.println( argQta); 
                System.out.print( "Prezzo: " ); 
                double argPrez = input.nextDouble(); 
                System.out.println( argPrez); 
                 
                System.out.println(); 
                 
                System.out.println(); 
                System.out.println(); 
                System.out.println(); 
    
                 
            } // fine del metodo main 
        } // fine della classe ProvaFattura
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da netarrow
    ecco il codice che fa quello che chiedi
    codice:
    Scanner input = new Scanner(System.in); 
    input.useDelimiter("\n");
    Non voglio criticare/sminuire il tuo intervento, ci mancherebbe. La soluzione di impostare come delimitatore il fine riga può anche essere valida ma .... a patto di stabilire bene piattaforma o cosa ci si aspetta come newline!

    La sequenza di newline dipende dalla piattaforma. Su Windows usare come delimitatore solo "\n" è sostanzialmente sbagliato. Se si digita 123 INVIO il token fornito è "123\r" (con carriage return finale). Se lo si prende con next() si può eventualmente togliere il \r usando ad esempio trim(), quindi nulla di così grave. Ma se si usa nextInt() (o altro next per un tipo primitivo) si ottiene sempre un bel InputMismatchException!

    Quindi o si dice che il codice sopra vale solo per i sistemi Unix-like oppure si cambia/amplia il pattern.

    Dovessi farlo io personalmente, almeno per scrupolo, userei come pattern la sequenza di newline della piattaforma, che si ottiene dalla system property "line.separator".

    input.useDelimiter(System.getProperty("line.separa tor"));

    Almeno potrei essere ragionevolmente sicuro che è configurato per la piattaforma su cui sta girando.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.