0

私はJavaを初めて使用するので、それが非常に小さな間違いである場合はご容赦ください
。私のコードは次のとおりです。

import java.io.*;
public class election
{
    public static void main(String args[])
    {
        boolean x=false;
        Ballot ballot=new Ballot();
        int n;
        while(x!=true)
        {
            System.out.println("Cast your vote to(1-5): ");
            try
            {
            n=System.in.read();
            System.out.flush();
            ballot.add(n);
            System.out.println("Enter 0 to exit, enter 1 to vote again: ");
            n = System.in.read();
            if(n==0)
            {
                x=true;
            }
            else
            {
                x=false;
            }
            }
            catch(IOException e)
            {
                System.out.println("I/O Error");
                System.exit(1);
            }
        }
    }
}
class Ballot
{
    int votes,spoilt;
    int cand[] = new int[5];

    //methods
    void add(int n)
    {
        votes=votes+1;
        if(n <= 5 && n>=1)
        {
            cand[n-1]=cand[n-1]+1;
        }
        else
        {
            spoilt = spoilt + 1;
        }
    }
    void display()
    {
        System.out.println("Total votes cast: " + votes);
        for(int i=0;i<5;i++)
        {
            System.out.println("Candidate " + (i+1) + ": " + cand[i]);
        }
        System.out.println("Spoilt: " + spoilt);
        System.out.println("Valid votes: " + (votes-spoilt));
    }
    Ballot()
    {
        votes=0;
        spoilt=0;
        for(int i=0;i<5;i++)
        {
            cand[i]=0;
        }
    }
}

コンパイル後に実行すると、18行目(n = System.in.read())がスキップされます。
私が得る出力はこれです:

(1-5)に投票します:
1終了するには0を入力し、再度投票するには1を入力し
ます:(1-5)に投票します:
2終了するには0を入力し、再度投票するには1を入力します:
(1に投票します-5):
^ C

の値は、プログラムを無限ループにするnnotです。read()

ご協力ありがとうございました。

4

2 に答える 2

6

Scannerクラスを利用した方が簡単だと思います。このようにスキャナーオブジェクトをインスタンス化できますScanner scan = new Scanner(System.in);。次に、18行目は次のようになりn = scan.nextInt();ます。これは、ユーザー入力を正しく読み取る必要があります。Scannerクラスの詳細については、Javaドキュメント(http://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html )を参照してください。これがお役に立てば幸いです。

于 2013-03-09T05:05:52.023 に答える
3

System.in.read()1バイトのみを読み取りますが、標準の入力ストリームは、「Enter」を押したときにのみフラッシュされます。したがって、最初の呼び出しが戻るまでに、読み取られるバイトが2バイトあります('1''\n')。は'1'正常に返され、次の呼び出しで'\n'が返されます。

intまた、読み取った値は、期待どおりにに変換されないことも指摘しておく必要があります。'1'たとえば、4910進数または3216進数になります。減算して変換してみることができます'0'が、他の人が指摘しているように、整数を入力するには、より高レベルの関数を使用する方がよいでしょう。

于 2013-03-09T05:05:59.667 に答える