アプリ版:「スタンプのみでお礼する」機能のリリースについて

import java.io.*;
class sample61{
public static void main(String[] args) throws IOException{
System.out.println("テストの受験者数を入力してください。");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = br.readLine();
int num = Integer.parseInt(str);

int[] test;
test = new int[num];
int total = 0;
int max = test[0];
int min = test[0];
int ave = 0;

System.out.println("人数分の点数を入力してください。");
for(int i=0; i<num; i++){
str = br.readLine();
int tmp = Integer.parseInt(str);
test [i] = tmp;
}

for(int i=0; i<num; i++){
System.out.println((i+1) + "番目の人の点数は" + test[i] + "です。");
total = total + test[i];
}
System.out.println("合計点:" + total + "点");
for (int i=0; i<num; i++) {
if (max < num[i]) { //現在の最大値よりも大きい値が出たら
max = num[i]; //変数maxに値を入れ替える
}
if (min > num[i]) { //現在の最小値よりも小さい値が出たら
min = num[i]; //変数minに値を入れ替える
}
}
System.out.println("最高得点:" + max + "点");
System.out.println("最低得点:" + min + "点");
System.out.println("平均得点:" + total/num + "点");

}
}

テストの受験者数を入力してください。
5
人数分の点数を入力してください。
80
90
60
40
32
1番目の人の点数は80です。
2番目の人の点数は90です。
3番目の人の点数は60です。
4番目の人の点数は40です。
5番目の人の点数は32です。
合計点:302点
最高得点:90点
最低得点:0点
平均得点:60点

になるんですが、最高得点は出たのですが、最低得点が32点なはずなのに、0点になるんですが、問題は何でしょうか?

質問者からの補足コメント

  • どう思う?

    int max = test[0];
    int min = test[0];

    これを

    int max = 0;
    int min = 100;

    に変更したのですが、その場合は、

    for (int i=0; i<num; i++) {
    if (max < num[i]) { //現在の最大値よりも大きい値が出たら
    max = num[i]; //変数maxに値を入れ替える
    }
    if (min > num[i]) { //現在の最小値よりも小さい値が出たら
    min = num[i]; //変数minに値を入れ替える

    ここも変えたほうがいいんでしょうか?

    よろしくおねがいします。

      補足日時:2015/09/03 19:43
  • たとえばどのようにですか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/09/03 19:57

A 回答 (4件)

> たとえばどのようにですか?


……えーと、自分はちゃんと具体的に
>  System.out.println("人数分の点数を入力してください。");
> のあとの for ループの直後に max と min の宣言を移動すれば正常に動作するでしょう。
と書いてますよ?

-----------------------------------------------------------------------------------------------

import java.io.*;
class sample61{
public static void main(String[] args) throws IOException{
System.out.println("テストの受験者数を入力してください。");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = br.readLine();
int num = Integer.parseInt(str);

int[] test;
test = new int[num];
int total = 0;
// ここから……
// int max = test[0];
// int min = test[0];
int ave = 0;

System.out.println("人数分の点数を入力してください。");
for(int i=0; i<num; i++){
str = br.readLine();
int tmp = Integer.parseInt(str);
test [i] = tmp;
}

// ……ここに移動
int max = test[0];
int min = test[0];

for(int i=0; i<num; i++){
System.out.println((i+1) + "番目の人の点数は" + test[i] + "です。");
total = total + test[i];
}
System.out.println("合計点:" + total + "点");
for (int i=0; i<num; i++) {
if (max < num[i]) { //現在の最大値よりも大きい値が出たら
max = num[i]; //変数maxに値を入れ替える
}
if (min > num[i]) { //現在の最小値よりも小さい値が出たら
min = num[i]; //変数minに値を入れ替える
}
}
System.out.println("最高得点:" + max + "点");
System.out.println("最低得点:" + min + "点");
System.out.println("平均得点:" + total/num + "点");

}
}
    • good
    • 0

> ここも変えたほうがいいんでしょうか?


その必要はありません。No.1 様の回答も私の回答も変更するのは max と min の宣言だけです。
    • good
    • 0

原因は No.1 様の書いていらっしゃる通りなのですが、No.1 様の修正方法では対応できる点数の範囲を 0-100 に固定してしまいます。


データの一番目を最大値・最小値の初期値にするという考え自体は点数の範囲を限定しないという点で柔軟性があります。

問題はそのデータが入力される前にデータ格納領域の一番目を参照してしまったという点です。
ですので、データ入力が終わった後で上記の最大値・最小値の初期化を行えばいいのです。
 System.out.println("人数分の点数を入力してください。");
のあとの for ループの直後に max と min の宣言を移動すれば正常に動作するでしょう。
この回答への補足あり
    • good
    • 0

変数minを初期化する際に"0"で初期化しているからです。


>int min = test[0];
この時点でmin=0ですから、それ以降どの数字と比べても"0"の方が小さいままですね。

こういう最大、最小を取得するプログラムを書くときは
「最大値は想定される一番小さい値で初期化」
「最小値は想定される一番大きい値で初期化」
するのがセオリーです。

ですので、今回なら
int max = 0;
int min = 100;
としておけば良いと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!