Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Problema while

  1. #1

    Problema while

    Ciao, dovrei fare in modo che il programma mi chieda per quanti anni (quindi solo un intero) voglio che mi chieda di inserire una somma da depositare. All'inizio avevo scritto questo e andava, con il problema però che quando mettevo un negativo veniva cmq accettato dandomi però poi il problema
    codice:
    static int Ins_Anni()    {
            int a=0;
            System.out.print("Inserire anni durata deposito: ");
            while (!scrivi.hasNextInt())
            {
                System.out.print("ERRORE - Inserire anni durata deposito: ");
                scrivi.nextLine();
            }
            a=scrivi.nextInt();
            scrivi.nextLine();
            return a;     }

    A quel punto ho modificato il while in:
    codice:
    while (!scrivi.hasNextInt() || scrivi.nextInt()<=0)

    però ho il problema che ogni volta che inserisco un numero, anche giusto, resta in attesa di un altro, prendendo per buono il secondo valore che inserisco.
    P.S. Preciso che lo Scanner "scrivi" esiste, l'ho dichiarato come pubblico all'inizio della classe per poterlo usare ovunque, svuotando il buffer dopo ogni utlizzo.
    P.S. Ho provato il while senza fargli fare il controllo per vedere se è un intero ma solo per vedere se è positivo ed ho lo stesso problema, in pratica il problema me lo dà il:
    codice:
    while (scrivi.nextInt()<=0)

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il metodo nextInt() fa due cose:

    1) Se nel buffer di input esiste già un valore numerico, lo restituisce e lo toglie dal buffer
    2) Se nel buffer di input non è presente un valore numerico, si mette in attesa dell'inserimento.

    Quindi, ogni volta che chiami nextInt() stai chiedendo all'utente di inserire un nuovo valore.

    Generalmente l'I/O va fatto seguendo un filo logico.

    1) Chiedo un valore all'utente e memorizzo tale valore in una variabile
    2) Solo DOPO la memorizzazione nella variabile, vado a fare tutte le considerazioni del caso (usando la variabile!)
    3) Se le valutazioni hanno dato esito negativo, ripeto la richiesta di inserimento e memorizzazione dati.

    Uno schema abbozzato potrebbe essere il seguente:

    codice:
    int valore = -1;   // Un valore che so già non mi va bene, ma lo uso per inizializzazione
    while(valore < 0) {
       // Chiedo il valore all'utente
       System.out.println("Inserisci il valore:");
    
       // Leggo il valore da input
       valore = scrivi.nextInt();
    
       // Eventuali altre considerazioni sul valore (esempio, deve essere compreso fra un minimo ed un massimo, ecc)
       ...   
    }
    
    // Se sono arrivato qui, significa che l'utente ha inserito un valore maggiore di 0
    ...   // procedo con il resto del programma, usando "valore" e non più "nextInt()" (che farebbe un'altra lettura da input)

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    ok, capito, il problema è che non so come accoppiarlo al controllo "!scrivi.hasNextInt()". Non so se di debba usare il try catch, in quel caso ancora me lo devo guardare per bene. Stavo provando a mettere in una stringa i dati dello scanner e controllare se può essere convertita in intero ma purtroppo non si può scrivere "if (Integer.parseInt(Stringa))".

  4. #4
    Mi rimane solo 1 problema, ora riesce a gestire i numeri positivi e le stringhe non numeriche, ma quando metto un numero negativo continua ad attendere il secondo valore. Purtroppo non posso passare direttamente alla variabile quello che scrivo da tastiera perchè potrei scrivere qualcosa che non sia un intero.

    codice:
    static int Ins_Int()    {
            int a=0;
            
            while (a<=0)
            {
                System.out.print("Inserire anni durata deposito: ");
                while (!scrivi.hasNextInt())
                {
                    System.out.print("Inserire anni durata deposito: ");
                    scrivi.next();
                }
                a=scrivi.nextInt();
            }
            return a;
        }
    P.S. Non ho ben capito se il .nextInt() azzera il buffer automaticamente. Chiedo perchè mi hai scritto:
    1) Se nel buffer di input esiste già un valore numerico, lo restituisce e lo toglie dal buffer
    però ho notato che facendo partire il programma con il codice che ho scritto se scrivo in esso "12 f" mi prende il 12 e la f me la tiene per il comando successivo, quindi rimane nel buffer mentre se alla fine del metodo ci metto un "scrivi.NextLine()" questo non accade.

    @LeleFT
    Dal momento che hai scritto che "scrivi.next()" deve per forza assegnare direttamente un valore alla variabile ho provato così ma non va lo stesso, quando metto un numero adesso mi genera proprio un'eccezione "Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    codice:
    static int Ins_Int()	{
    		int a=0;
    		String temp="";
    		
    		System.out.print("Inserire anni durata deposito: ");
    		while (a<=0)
    		{
    			while (!scrivi.hasNextInt())
    			{
    				System.out.print("Inserire anni durata deposito: ");
    				temp=scrivi.next();
    			}
    			a=Integer.parseInt(temp);
    			scrivi.nextLine();
    		}
    		return a;
    	}
    Ultima modifica di gennysennin; 08-03-2016 a 16:00

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Se devi controllare che l'utente non scriva castronerie, allora l'approccio è diverso:

    1) Leggi sempre tutto come Stringa.
    2) Effettua i controlli di consistenza.
    3) Se c'è un errore nell'input, richiedilo nuovamente all'utente


    codice:
    int variabile = -1;   // come prima
    
    System.out.println("Inserire il valore numerico: ");
    while(variabile <= 0) {
       // Mai fidarsi dell'utente: tratto una stringa, così sono sicuro
       // di pulire il buffer anche dalle eventuali castronerie
       String lettura = scrivi.nextLine();
    
       // Verifico se ciò che mi è arrivato è un numero oppure no
       try {
          variabile = Integer.parseInt( lettura );
       } catch (NumberFormatException nfe) {
          // Ahi: l'utente ha scritto qualcosa che non è un numero
          // Per me è come se avesse scritto un numero negativo, cioè un dato non valido
          variabile = -1;   // non serve, ma è utile per capire
       }
    
       // Eventuali altri controlli sul dominio di "variabile"
       ...
    }
    
    // Se arrivo qui, variabile è un numero maggiore di 0... lo uso
    ...

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Grazie mille. In effetti stavo provando a usare la stringa, ma senza try catch di cui ancora non ho studiato bene il funzionamento.

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.