0

配列に不慣れな初心者のJavaプログラマーで、次のプロンプトの割り当てに取り組んでいます。

テストのスコアの成績分布をプロットするプログラムを作成します。スコアは一度に1つずつ入力され、0(ゼロ)のスコアが入力されるとループが中断されます。出力は、文字の成績のスコアごとに*を出力し、グラフの下の横軸に文字の成績を配置します。

私の主な問題は、各グレード(A、B、C ...)のスコアの数を合計できる配列の作成です。この変換でifまたはswitchステートメントを使用することは禁止されています。この配列の作成をどこから始めればよいのでしょうか。ありがとう!

4

2 に答える 2

1

配列である必要がありますか?そうでない場合は、このタイプのシナリオにはマップが適しています。マップのキーはさまざまなグレード(A、B、Cなど)であり、各キーの値はそのキーのグレード数を保持するための整数(または長い)です。したがって、基本的なロジックは、グレード(つまりキー)のマップからカウンターを取得し、それをインクリメントしてマップに戻すことです。

外部ライブラリを使用してもかまわない場合は、Guavaのマルチセットがさらに適しています。

編集:OK、配列を使用する必要がありますが、1つの課題(私があなたの投稿を正しく読んだ場合)は、ifまたはswitchステートメント(おそらく配列にアクセスするため)を使用できないことです。これを回避する1つの可能な方法は、「A」をインデックス0に、「B」をインデックス1に割り当てることです。次に、配列のインデックスに次の表記を使用できます。

char gradeAsChar = ...;  //I'll leave this to you to get the grade as an (uppercase) char
gradesArray[gradeAsChar - 'A'] = gradesArray[gradeAsChar - 'A'] + 1;

'A'-'A'は0、'B'-'A'は1などです。もちろん、文字が予期しない場合、上記はインデックスの範囲外の問題に対応しているため、そこでエラー処理が必要になります。 。

于 2013-03-10T00:00:57.477 に答える
1

もちろん、メモリ効率を気にしない場合(コーディング中は常にそうする必要があります!)、次のような新しい配列を作成できます。

int[] grades = new int[101];

次に、ユーザーが入力を入力するたびに、次のような操作を実行できます。

int grade = input.nextInt();
grades[grade] = grades[grade] + 1;

次のようなものを実行することで、Aに等しいグレードの数を把握できます。

int A = 0;
for (int i = 91; i < 101; i++){
  A += grades[i];
}

それは、ifまたはswitchステートメントの使用が許可されていないとあなたが言ったときに私が考えたものです。それが役に立ったかどうか教えてください。繰り返しますが、ひどく非効率的ですが、少なくともあなたはあなたが持っているすべてのスコアを追跡します。それはプラスです。

これはO(n)の大まかな実行時間になるはずですが、もっと良いと思います。

幸運を!

編集:整数除算の概念を使用することにより、上記の方法のより効率的なバージョンを実行できます。あなたが尋ねるかもしれない整数除算は何ですか、それは2つの整数を除算するときです、例えば10/3そして答えは3.333かもしれませんが、javaは答えが3になるように小数部分を破棄します。したがって、10で割ると、結果は、どのスコアがAであるかなどを取得します。例:92/10 = 9、97 / 10 = 9、83 / 10 = 8など。注意点は、Aのスコアが91〜100であるため、この概念を適用する前に1を引く必要があることです。

これにより、配列は101要素から10要素に減少するはずです。これは、10桁の数字のみを追跡しているためです。これは、とにかくより重要です。これをさらに最適化できるかもしれませんが、これも私の宿題ではないので、あまり時間をかけたくありません。目が覚めたときにこれを考えました:)。

これがあなたに思考の糧を与えてくれることを願っています!

于 2013-03-10T08:59:05.820 に答える