I miei errori

di il
14 risposte

I miei errori

Sono alle prime armi su Java(non ho mai programmato)quindi mi scuso per i prossimi errori madornali che vedrete.Sto cercando di creare un Menu:
il mio intento è di far scegliere all'utente appunto delle specifiche scelte .Se l'utente scrive un numero che va da 1 a 3,si vedrà il messaggio "Finale",in caso contrario ripartirà il loop.Se l'utente digiterà 'q',il codice si bloccherà.
Il problema è che quando riparte il loop,invece che farmi lasciare la possibilità di scrivere un numero (o lettera),visualizza tipo per 3/4 volte di fila il menu.Cosa sbaglio?
public class Menu {
public static void main (String args [] )
   throws java.io.IOException {
     char choice,quite='q'; 
   
pen :   while (true){ 
     System.out.println("Menu :");
     System.out.println("N.1 Object");
     System.out.println("N.2 Object");
     System.out.println("N.3 Object");
     System.out.println("Press 'q' to quit");
     System.out.println(" ");
   
     choice=(char) System.in.read();
   
     
     if (choice == 'q' ) break;
     if (choice < '1' || choice > '3'){
System.out.println("Choose between 1 and 3");
     continue pen;
}
     System.out.println("Finale");break;
           }
     }
  }
Ho intitolato il thread "i miei errori" perchè in futuro m'imbatterò sicuramente in altri "muri"
Attualmente sto leggendo il libro Java:A Beginner Guide Sixth Edition - by Herbert Schildt

14 Risposte

  • Re: I miei errori

    The Code ha scritto:


    Il problema è che quando riparte il loop,invece che farmi lasciare la possibilità di scrivere un numero (o lettera),visualizza tipo per 3/4 volte di fila il menu.Cosa sbaglio?
    Il punto/problema è il modo di lettura.

    System.in.read()

    Innanzitutto questo read legge byte (non caratteri). Se il charset di default della piattaforma è tale per cui 1 byte = 1 char, allora guarda caso è ok. Tipicamente è così ma non è detto in generale. Quindi questo approccio sarebbe da evitare.

    Inoltre stai leggendo lo standard-input "crudo", quindi ricevi anche la sequenza di newline. Se digiti x e poi invio, su Windows ottieni 'x', poi il carriage-return, poi il line-feed. Sono 3 caratteri. Questo è il motivo per cui si ripete 3 volte su Windows.
  • Re: I miei errori

    Grazie per la celere risposta!!Ho usato il System.in.read perchè sinora è l'unico comando "d'interazione" (non so come chiamarlo) che ho imparato leggendo il libro.Cosa ne pensi invece di questo codice?:
    class Help3 {
    public static void main(String args[])
    throws java.io.IOException {
    char choice, ignore;
    for(;;) {
    do {
    System.out.println("Help on:");
    System.out.println(" 1. if");
    System.out.println(" 2. switch");
    System.out.println(" 3. for");
    System.out.println(" 4. while");
    System.out.println(" 5. do-while");
    System.out.println(" 6. break");
    System.out.println(" 7. continue\n");
    System.out.print("Choose one (q to quit): ");
    choice = (char) System.in.read();
    do {
    ignore = (char) System.in.read();
    } while(ignore != '\n');
    } while( choice < '1' | choice > '7' & choice != 'q');
    if(choice == 'q') break;
    System.out.println("\n");
    switch(choice) {
    case '1':
    System.out.println("The if:\n");
    System.out.println("if(condition) statement;");
    System.out.println("else statement;");
    break;
    case '2':
    System.out.println("The switch:\n");
    System.out.println("switch(expression) {");
    System.out.println(" case constant:");
    System.out.println(" statement sequence");
    System.out.println(" break;");
    System.out.println(" // ...");
    System.out.println("}");
    break;
    case '3':
    System.out.println("The for:\n");
    System.out.print("for(init; condition; iteration)");
    System.out.println(" statement;");
    break;
    case '4':
    System.out.println("The while:\n");
    System.out.println("while(condition) statement;");
    break;
    case '5':
    System.out.println("The do-while:\n");
    System.out.println("do {");
    System.out.println(" statement;");
    System.out.println("} while (condition);");
    break;
    case '6':
    System.out.println("The break:\n");
    System.out.println("break; or break label;");
    break;
    case '7':
    System.out.println("The continue:\n");
    System.out.println("continue; or continue label;");
    break;
    }
    System.out.println();
    }
    }
    }
  • Re: I miei errori

    Ho capito bene il problema in cui ero bloccato ma mi sono imbattuto in un altro;
    class MinMax2 {
    public static void main(String args[]) {
    int nums[] = { 99, -10, 100123, 18, -978,
    5623, 463, -9, 287, 49 };
    int min, max;
    min = max = nums[0];
    for(int i=1; i < 10; i++) {
    if(nums[i] < min) min = nums[i];
    if(nums[i] > max) max = nums[i];
    }
    System.out.println("Min and max: " + min + " " + max);
    }
    }
    Mi si fonde il cervello da quando il codice inizia da "if" in poi....non ne capisco il senso
  • Re: I miei errori

    The Code ha scritto:


    if(nums[i] < min) min = nums[i];
    if(nums[i] > max) max = nums[i];
    Mi si fonde il cervello da quando il codice inizia da "if" in poi....non ne capisco il senso
    Ma il senso è giusto. Per ciascun valore dal secondo in poi, se esso è minore del min attuale, allora quello è il nuovo minimo e quindi giustamente lo assegni a min.
    Idem, nel senso di maggiore per il secondo if.

    P.S. abituati a non "cablare" lunghezze nel codice:

    for (int i=1; i < nums.length; i++)
  • Re: I miei errori

    andbin ha scritto:


    The Code ha scritto:


    if(nums[i] < min) min = nums[i];
    if(nums[i] > max) max = nums[i];
    Mi si fonde il cervello da quando il codice inizia da "if" in poi....non ne capisco il senso
    Ma il senso è giusto. Per ciascun valore dal secondo in poi, se esso è minore del min attuale, allora quello è il nuovo minimo e quindi giustamente lo assegni a min.
    Idem, nel senso di maggiore per il secondo if.

    P.S. abituati a non "cablare" lunghezze nel codice:

    for (int i=1; i < nums.length; i++)
    Non capisco perchè al secondo giro,il loop approva questo:
    if (nums > max) max = nums ;
    dove i =2 e max = 99
    Essendo 2 minore di 99,il loop mica deve saltare " max = nums ; " ?
    Se qualcuno mi chiedesse di prendere il numero maggiori e minore di quella lista,non mi verrebbe mai in mente di compilare un codice del genere,non saprei proprio che fare.
    Mancanza di esperienza o mancanza di logica mentale?
    Mi chiedo se la programmazione possa essere una passione per tutti,anche per coloro che hanno un basso q.i.
  • Re: I miei errori

    The Code ha scritto:


    Non capisco perchè al secondo giro,il loop approva questo:
    if (nums > max) max = nums ;
    dove i =2 e max = 99
    Essendo 2 minore di 99,il loop mica deve saltare " max = nums ; " ?

    No, 'i' è solo un indice nell'array ... non è il valore confrontato!
  • Re: I miei errori

    Grazie per l'ultima risposta,mi si sono schiarite le idee.
    Sono arrivato ad un quarto di libro e sto provando a creare una rubrica:
    import java.util.Scanner;
    public class pRINT {
    	
    	public static void main(String args[]) {
    		Scanner sc=new Scanner(System.in);
    		String i;
    		String rubrica[][]={
    				{"Bill" ,"12652"},
    				{"ash","663736"},
    				{"Mike","7472737"}
    		
    			};
    		System.out.println("Insert a Name: ");
    		i = sc.nextLine();
    		for(int x=0; x<rubrica.length; x++)
    			if (i.equals(rubrica[x][0])){
    				System.out.println(rubrica[x][0]);
    			break;
    			}
    			
    		}
    	}
    Il problema che riscontro è che mi appare solo il nome e non il nome + numero,cos'ho sbagliato questa volta?
  • Re: I miei errori

    The Code ha scritto:


    Il problema che riscontro è che mi appare solo il nome e non il nome + numero,cos'ho sbagliato questa volta?
    Ogni riga dell'array ha 2 colonne, tu ne stampi una sola, la prima rubrica[x][0] .
    Se vuoi stamparle entrambe, devi farlo tu espressamente, non c'è niente che lo fa da sé.
  • Re: I miei errori

    andbin ha scritto:


    The Code ha scritto:


    Il problema che riscontro è che mi appare solo il nome e non il nome + numero,cos'ho sbagliato questa volta?
    Ogni riga dell'array ha 2 colonne, tu ne stampi una sola, la prima rubrica[x][0] .
    Se vuoi stamparle entrambe, devi farlo tu espressamente, non c'è niente che lo fa da sé.
    Non capisco,scrivendo
    for(int x=0; x<rubrica.length; x++)
    			if (i.equals(rubrica[x][0])){
    				System.out.println(rubrica[x][0]);
    Non dovrebbe stampare la x (il nome) e poi il primo valore,cioè 0(il numero telefonico) dell'altra colonna?Cosa dovrei scrivere altrimenti?
    Ok,ci sono arrivato:
    import java.util.Scanner;
    public class pRINT {
    	
    	public static void main(String args[]) {
    		Scanner sc=new Scanner(System.in);
    		String i;
    		String rubrica[][]={
    				{"Bill" ,"12652"},
    				{"ash","663736"},
    				{"Mike","7472737"}
    		
    			};
    		System.out.println("Insert a Name: ");
    		i = sc.nextLine();
    		
    		for(int x=0; x<rubrica.length; x++)
    			if (i.equals(rubrica[x][0])){
    				System.out.print(rubrica[x][0]+" "+rubrica[x][1]);
    				break;
    				
    				}
    E' scritto in modo corretto?
  • Re: I miei errori

    The Code ha scritto:


    System.out.print(rubrica[x][0]+" "+rubrica[x][1]);
    Certo, così HA senso.
  • Re: I miei errori

    Sto affrontando le eccezioni nel libro e avrei un dubbio
    // Use finally.
    class UseFinally {
    public static void genException(int what) {
    int t;
    int nums[] = new int[2];
    System.out.println("Receiving " + what);
    try {
    switch(what) {
    case 0:
    t = 10 / what; // generate div-by-zero error
    break;
    case 1:
    nums[4] = 4; // generate array index error.
    break;
    case 2:
    return; // return from try block
    }
    }
    catch (ArithmeticException exc) {
    // catch the exception
    System.out.println("Can't divide by Zero!");
    return; // return from catch
    }
    catch (ArrayIndexOutOfBoundsException exc) {
    // catch the exception
    System.out.println("No matching element found.");
    }
    finally {
    System.out.println("Leaving try.");
    }
    }
    }
    class FinallyDemo {
    public static void main(String args[]) {
    for(int i=0; i < 3; i++) {
    UseFinally.genException(i);
    System.out.println();
    }
    }
    }
    Non capisco perchè il "return" sia presente solo in un blocco catch e negli altri no.
  • Re: I miei errori

    The Code ha scritto:


    Non capisco perchè il "return" sia presente solo in un blocco catch e negli altri no.
    Il return nel catch di ArithmeticException è assolutamente superfluo. Se lo togli non cambia nulla.
  • Re: I miei errori

    andbin ha scritto:


    The Code ha scritto:


    Non capisco perchè il "return" sia presente solo in un blocco catch e negli altri no.
    Il return nel catch di ArithmeticException è assolutamente superfluo. Se lo togli non cambia nulla.
    Infatti nell'eseguire il codice non vedevo differenze.Era quello che volevo sapere,grazie mille e Buon Natale!
  • Re: I miei errori

    The Code ha scritto:


    Infatti nell'eseguire il codice non vedevo differenze.Era quello che volevo sapere,grazie mille e Buon Natale!
    Quel return farebbe la differenza solo se dopo il try-catch-finally avessi "altro" nel metodo genException.

    Se ci fosse altro al fondo del metodo:
    - con quel return si esce subito dal metodo, ma eseguendo comunque prima il finally. Senza eseguire il resto.
    - senza quel return il finally viene comunque onorato ma poi proseguirebbe con il resto del metodo.

    Tutto qui. Buon Natale!
Devi accedere o registrarti per scrivere nel forum
14 risposte