Ritorno a capo dà problemi col nextline

di il
6 risposte

Ritorno a capo dà problemi col nextline

Ciao, sto scrivendo un programma sugli array, in particolare il programma mi chiede di creare 2 array, uno di stringhe composto da 5 elementi(nomi di fiori) ed il secondo è di tipo double sempre di 5 elementi(i prezzi associati ai nomi dei fiori). devo fare(e ho fatto) un programma che legge il nome del fiore e la quantità desiderata, localizza il nome del fiore, lo associa al suo prezzo in base all'indice dell'array e infine calcola e visualizza il prezzo. il programma che ho fatto è questo, posto il codice poi vi dico il problema che, per quanto vi possa sembrare banale, non so come risolvere:

import java.util.Scanner;
public class ConteggioFiori {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String[] fiore = {"petunia", "viola", "rosa", "violetta", "garofano" };
		double[] prezzo = {0.50, 0.75, 1.50, 0.50, 0.80};
		double somma = 0.0;
		boolean ripeti = false;
		String fioreScelto;
		boolean conferma = false;
		do{
		do{
		System.out.print("inserisci il nome del fiore che desideri: ");
		fioreScelto = scanner.nextLine();
		if(fioreScelto.equalsIgnoreCase(fiore[0]) || fioreScelto.equalsIgnoreCase(fiore[1])
				|| fioreScelto.equalsIgnoreCase(fiore[2]) || fioreScelto.equalsIgnoreCase(fiore[3]) || fioreScelto.equalsIgnoreCase(fiore[4])) 
		conferma = true;
		else
		System.out.println("non abbiamo questo fiore");
		} while(conferma == false);
		System.out.println("inserisci il numero dei fiori che vuoi di quelli appena scelti: ");
		int numeroFiore = scanner.nextInt();
		for(int i = 0; i < 5; i++) {
		if(fioreScelto.equals(fiore[i])) somma += (prezzo[i] * numeroFiore);
		}
		System.out.println("vuoi altri fiori? si o no");
		String risposta = scanner.nextLine();
		if (risposta.equalsIgnoreCase("no")) ripeti = true;
		} while(ripeti == false);
		System.out.println("devi pagare " + somma + "€");
	}
}
A causa del problema non posso proseguire e fare i controlli per vedere la correttezza. ho aggiunto alcune cose che il programma non chiedeva espressamente: se in genere il libro chiede di fare A provo sempre in tutti i modi di fare A+.
il libro non chiedeva di fare la ripetizione(così da creare un bouquet completo piuttosto che un solo fiore), così ho aggiunto il do-while per creare un mazzo di fiori più complesso ed ho aggiunto l'intero do-while casomai l'input fosse sbagliato(sarebbe stato meglio un try-catch ma fa niente!).
il problema è che quando devo inserire il "si" o "no" non posso farlo perchè il compilatore passa all'input successivo: è come se il return(ritorno a capo) fosse immagazzinato nella variabile automaticamente e quindi il programma passa al punto successivo.
non capisco il perchè: nextLine serve proprio a questo no? serve per l'input di una stringa ma scarta il "\n".. allora perchè me lo ritrovo negli input successivi? ho provato a sostituire il nextLine con un next: come risultato ho avuto lo stesso problema, ma alla variabile successiva(sebbene sapevo che non avrebbe risolto niente, anzi anche peggiorato visto che il next utilizza il carattere spazio come delimitatore).
grazie infinite a chi risponderà e buona giornata

6 Risposte

  • Re: Ritorno a capo dà problemi col nextline

    fausto94 ha scritto:


    il problema è che quando devo inserire il "si" o "no" non posso farlo perchè il compilatore passa all'input successivo: è come se il return(ritorno a capo) fosse immagazzinato nella variabile automaticamente e quindi il programma passa al punto successivo.
    Devi sempre prestare attenzione quando mescoli nextLine() con gli altri nextXyz().
    Ad un nextInt(), se inserisci 123 <INVIO>, il metodo ti restituisce 123 ma NON elimina il invio, che invece rimane nel buffer interno a Scanner.
    Un successivo nextLine() "vede" subito una linea vuota e ritorna quindi immediamente "" senza chiedere nulla.

    È così, by design. Non è un "baco" di Scanner.
  • Re: Ritorno a capo dà problemi col nextline

    Devi sempre prestare attenzione quando mescoli nextLine() con gli altri nextXyz().
    Ad un nextInt(), se inserisci 123 <INVIO>, il metodo ti restituisce 123 ma NON elimina il invio, che invece rimane nel buffer interno a Scanner.
    Un successivo nextLine() "vede" subito una linea vuota e ritorna quindi immediamente "" senza chiedere nulla.

    È così, by design. Non è un "baco" di Scanner.
    infatti mi capitò qualcosa di simili in un altro programma, l'unico problema è che mi risulta impossibile non utilizzare un nextInt() ed un nextLine()(in questo caso int e line, ma in generale non riesco ad evitare il mix di cui parli).. come posso aggirare il problema?
  • Re: Ritorno a capo dà problemi col nextline

    fausto94 ha scritto:


    ma in generale non riesco ad evitare il mix di cui parli).. come posso aggirare il problema?
    Nessuno ti vieta di farti una piccola classe dedicata al input dallo standard-input usando Scanner , che magari usa sempre nextLine e converte la stringa in quello che serve (int, ..).
    Innanzitutto è buona programmazione separare logica di input da quella della tua applicazione. E poi puoi anche incapsulare nei metodi di quella classe anche la logica di ri-richiesta di input in caso di input errato.
  • Re: Ritorno a capo dà problemi col nextline

    Hai perfettamente ragione e credo che faró così, l'unico problema é che, secondo il libro, io non dovrei ancora conoscere l'incapsulamento né dovrei essere in grado di creare distinte classi(poiché nel libro i capitoli classi e oop vengono dopo). questo mi fa pensare che ci sia una soluzione più semplice, sebbene meno corretta, altrimenti ti do ragione in pieno.
  • Re: Ritorno a capo dà problemi col nextline

    fausto94 ha scritto:


    secondo il libro, io non dovrei ancora conoscere l'incapsulamento né dovrei essere in grado di creare distinte classi
    Il "minimo" comunque che puoi fare sicuramente è mettere metodi (anche statici) in quella tua classe ConteggioFiori per gestire l'input in String, in int ecc...

    Capisco ovviamente il livello/limite della esercitazione.
  • Re: Ritorno a capo dà problemi col nextline

    Su questo hai ragione in tutto e per tutto XD
Devi accedere o registrarti per scrivere nel forum
6 risposte