4

このプログラムは、ユーザーが入力した文字数をカウントすることになっています。other は、!、@、$ などの他の文字です。# をカウントすることは想定されていません。これを行うための私のコードは次のとおりです。

public class countchars {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);

        char sym;
        int up = 0;
        int low = 0;
        int digit = 0;
        int other = 0;

        System.out.print("Enter a character # to quit: ");
        sym = input.next().charAt(0);

        while (sym != '#') {
            System.out.print("Enter a character # to quit: ");

            if (sym >= 'a' && sym <= 'z') {
                low++;
            }
            if (sym >= 'A' && sym <= 'Z') {
                up++;
            }
            if (sym >= '0' && sym <= '9') {
                digit++;
            }
            if (sym >= '!' && sym <= '=') {
                other++;
            }

            sym = input.next().charAt(0);

        }

        System.out.printf("Number of lowercase letters: %d\n", low);
        System.out.printf("Number of uppercase letters: %d\n", up);
        System.out.printf("Number of digits: %d\n", digit);
        System.out.printf("Number of other characters: %d\n", other);
    }
}

問題は「その他」カウンターにあります。!、@、$ を入力すると、入力した 3 文字のうち 2 文字だけがカウントされます。何が悪いの?

4

7 に答える 7

3

アスキーテーブルを見ると、「
!」が表示されます。= 33
'=' = 61
'@' = 64

「@」文字は指定した範囲にないためカウントされません。最後の条件を次のように置き換えます。

if (sym >= '!' && sym <= '@') {...}
于 2013-03-07T16:00:03.720 に答える
1

これを試して:

        if (sym >= 'a' && sym <= 'z') {
            low++;
        } else if (sym >= 'A' && sym <= 'Z') {
            up++;
        } else if (sym >= '0' && sym <= '9') {
            digit++;
        } else {
            other++;
        }

または、他の代わりに、その文字が何であるかの短いセットを選択できます。

        } else if ("%!$&".contains(sym)){
            other++;
        }
于 2013-03-07T16:07:29.570 に答える
1

試してみてください

else {
    other++;
}

それ以外の

if (sym >= '!' && sym <= '=') {
    other++;
}

#other条件ですでにフィルタリングしているため、カウントされませんwhile

于 2013-03-07T15:58:52.643 に答える
0

「他のすべて」を確実にキャッチするために。else句を使用するだけです。そうすれば、今やっているように、物事を見逃すことはあり'@'ません (チェックしている範囲にないため)。あなたはこれを求めている:

else {
    other++;
}

あなたが現在これを持っている場所:

if (sym >= '!' && sym <= '=') {
    other++;
}
于 2013-03-07T16:01:02.300 に答える
0

ASCII 値に基づいて char を比較します。@ASCII は 64 です。ASCII は 33 = ASCII は 61

したがって、@ は "!" の間にありません。および「=」であり、カウンターをインクリメントしません。

于 2013-03-07T16:01:22.653 に答える
0

AND(&&) の代わりに OR(||) を条件に使用する必要があります。

if (sym == '!' || sym == '=' || sym == '@' || ...){
        other++;
}
于 2013-03-07T15:57:44.890 に答える
0

ここを見てください。うまくいけば、答えが自然に出てくるでしょう!

http://en.wikipedia.org/wiki/UTF-8

そして、シーケンス $,5,$ が正しい答えを与えると確信していますか? ;)

于 2013-03-07T16:03:03.120 に答える