2013-06-13 42 views
7

Tôi là người mới dùng Java, và là một bài tập muốn WAP một chương trình đơn giản để in không cần thiết. các ký tự '*' theo người dùng. Nhưng bằng cách nào đó, đầu ra của mã này vẫn luôn luôn giống nhau:giá trị số nguyên đọc từ System.in không phải là giá trị được nhập

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('*'); 
     } 

    } 


} 

Nếu tôi thay thế '*' với tôi, tôi có thể thấy rằng nó vòng tối đa 50/52/54, mặc dù tôi chạy no_stars vòng lặp lần.

Điều gì có vẻ là vấn đề ở đây?

+2

Đầu ra mong đợi của bạn là gì và hiện tại đầu ra trông như thế nào ike? – Smit

+1

thực hiện System.out.println (n); trước vòng lặp – darijan

Trả lời

5

Bởi vì bạn đang đọc mã ASCII của ký tự từ đầu vào ở đây:

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

Nó phải

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

thankyou cho một gợi ý đầu vào khác. – Akash

12

Bạn cần phân tích cú pháp số nhận được từ System.in.read() hoặc đọc nó làm số nguyên, hiện tại bạn chỉ truyền số nguyên, vì vậy nếu bạn nhập 5, số này vượt quá 0x35 lần (giá trị của ký tự '5')

bạn có thể làm, ví dụ:

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

Đó là câu trả lời tuyệt vời ... Tôi mới làm quen với điều này .. :) –

+0

Thankyou, điều này đã làm việc. Nhưng tôi vẫn không hiểu tại sao tôi nhận được 50.52 hay 54 sao? Ngay cả khi system.in.read() chỉ đọc ký tự đầu tiên, tôi đã nhập ints như 7, 10, 86, 3, v.v. và nhận được cùng một ouput trong số {50,53,54}. Bạn có thể giải thích điều này? – Akash

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

này được sử dụng giá trị ASCII của bất cứ nhân vật người dùng nhập vào. Hãy thử điều này thay vì:

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

Hoặc, loại bỏ các biến no_stars tất cả cùng nhau,

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

Ngoài ra, trong for bạn -loop, tình trạng này nên i < n, để thực hiện đúng Số lần lặp lại. Và không cần phải khai báo i bên ngoài vòng lặp, bạn chỉ có thể thực hiện for (int i = 0; i < n; i++).

+0

cảm ơn, nhưng tôi vẫn sẽ bị mắc kẹt với một byte đầu vào. Tôi nghĩ rằng tôi sẽ sử dụng lớp máy quét chủ yếu. – Akash

1

Có hai lỗi trong mã của bạn.


Đầu tiên

System.in.read() 

là đọc một byte, không phải là một số nguyên, vì vậy, nó được phân tích các số nguyên và nhận được byte đầu tiên của nó.


Second

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

sẽ in luôn một ngôi sao hơn yêu cầu. Vì vậy, nó nên được thay đổi để

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

Góp ý: Bạn có thể sử dụng máy quét để đọc số nguyên của bạn, ví dụ

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

cảm ơn, đã chỉnh sửa – Akash

0

Dưới đây là chương trình chỉnh sửa cho bạn: (vấn đề chính là dòng này // 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('*'); 
} 
} 
Các vấn đề liên quan