2013-06-13 20 views
7

Sono un principiante di Java, e come esercizio volevo WAP un semplice programma per stampare richiesto no. di '*' caratteri secondo l'utente. Ma in qualche modo, l'uscita di questo codice rimane sempre simile:valore intero letto da System.in non è il valore digitato

package stars; 

public class Stars { 

    public static void main(String[] args) { 

     int no_stars=0; 

     try { 

      System.out.print("Enter the number of stars:"); 
      no_stars = (int)System.in.read(); 

     } catch (Exception e) { 

      System.out.println("Error! Invalid argument!"); 
      System.out.println(); 

     } 

    printstars(no_stars); 

    } 
    public static void printstars(int n){ 
     int i; 
     for(i=0;i<=n;i++) 
     {  
      System.out.println('*'); 
     } 

    } 


} 

Se sostituisco '*' con i, posso vedere che loop fino a 50/52/54, anche se corro il no_stars ciclo volte.

Quale sembra essere il problema qui?

+2

Qual è il tuo output previsto e attualmente ciò che l'output sembra l ike? – Smit

+1

fa un System.out.println (n); prima del ciclo – darijan

risposta

5

Poiché si sta leggendo il codice ASCII del carattere da input qui:

no_stars = (int)System.in.read(); 

dovrebbe essere

no_stars = Integer.parseInt(Console.readLine()); 
+0

grazie per un altro suggerimento di input. – Akash

12

È necessario analizzare il numero ricevuto da System.in.read() o in alternativa leggerlo come numero intero, al momento è sufficiente lanciarlo, quindi se si inserisce 5, passa 0x35 volte (che è il valore del carattere '5')

si può fare, ad esempio:

Scanner scan = new Scanner(System.in); 
printstars(scan.nextInt()); 
+0

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html#read() – StriplingWarrior

+0

Questa è un'ottima risposta ... Sono nuovo a questo .. :) –

+0

Grazie, questo ha funzionato. Ma ancora non capisco perché ho ottenuto 50,52 o 54 stelle? Anche se system.in.read() legge solo il primo carattere, ho inserito valori come 7, 10, 86, 3, ecc. E ottenuto la stessa uscita tra {50,53,54}. Potresti spiegarlo? – Akash

1
no_stars = (int)System.in.read(); 

questo sta usando il valore ASCII di qualsiasi carattere immesso dall'utente. Prova a modificare:

no_stars = System.in.read() - '0'; 

Oppure, rimuovere la variabile no_stars tutti insieme,

printstars(System.in.read() - '0'); 

Inoltre, nella vostra for -loop, la condizione deve essere i < n, al fine di eseguire la corretta numero di iterazioni. E non c'è bisogno di dichiarare i al di fuori del ciclo, puoi semplicemente fare for (int i = 0; i < n; i++).

+0

grazie, ma comunque sarei bloccato con un byte di input. Penso che userò principalmente la classe scanner. – Akash

1

Ci sono due errori nel codice.


Prima

System.in.read() 

sta leggendo un byte, non un intero, così, è l'analisi il numero intero e ottenere il primo byte di esso.


Seconda

for (i = 0; i <= n; i++) { 

stamperà sempre una stella più richiesto. Quindi, dovrebbe essere modificata per

for (i = 0; i < n; i++) { 

Suggerimento: Si potrebbe utilizzare scanner per leggere il tuo intero, per esempio

Scanner scanner = new Scanner(System.in); 
no_stars = scanner.nextInt(); 
+0

grazie, corretto – Akash

0

Ecco il programma corretto per voi: (il problema principale era questa linea // no_stars = (int) System.in.read();)

public static void main(String[] args) { 

    int no_stars=0; 
    try{ 
     System.out.print("Enter the number of stars:"); 
     Scanner sc=new Scanner(System.in); 
     String name=sc.nextLine(); 
     no_stars = Integer.parseInt(name); 
     //no_stars = (int)System.in.read(); 
    } 
    catch (Exception e) { 
     System.out.println("Error! Invalid argument!"); 
     System.out.println(); 
    } 
    printstars(no_stars); 
} 
public static void printstars(int n) 
{System.out.println(n); 
int i; 
for(i=0;i<=n;i++) 
{  
    System.out.println('*'); 
} 
} 
Problemi correlati