プロが教える店舗&オフィスのセキュリティ対策術

入力された入力値と最大値、最小値を表示させるプログラムで、最大値と最小値のプログラムを下記に作成してみたら最小値が0になりました。そして、もう一つ繰り返し文を作ってみたら、最大値・最小値がうまく表示されました。この違いはどうしてですか?教えてください。

import java.io.*;

class Hairetu1
{
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.print("データはいくつですか?");
String str = br.readLine();
int num = Integer.parseInt(str);

int a[]=new int[num];
int i;

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

for(i=0; i<a.length; i++){
System.out.print((i+1)+"番目は?");
str = br.readLine();
int tmp = Integer.parseInt(str);
a[i] = tmp;

if(max<tmp){
max=tmp;
}
if(min>tmp){
min=tmp;
}
}
System.out.println("入力した値は"+test.length);
System.out.println("最大は"+max);
System.out.println("最小は"+min);
}
}

A 回答 (1件)

> int max=0; int min=a[0];



この時点でa[0]は配列を用意しただけで中身は初期値のままです。
よって、minにはintの初期値である0が入ります。
その後の入力で負の値が入力されない限り、minは0のままです。

>もう一つ繰り返し文を作ってみたら

というのが意味がわかりませんが、aを初期化せずに

max=0; min=a[0];
for(i=0; i<a.length; i++){
...

としたのなら、この場合は、前回のa[0]の値がminになるので、入力した値にa[0]以下の数値が含まれているときは正しい値になります。入力した値がすべてa[0]より大きかったら、正しい値になりません。



このような場合方法は次のどれかを使うのが常套手段です。

・入力値の範囲がある程度決っている場合(例:成人男性の身長(cm) 0以下や1000以上は有り得ない)
maxには有り得ないほど小さな数値、minには有り得ない程大きな数値を初期値として入れておく
→身長の例なら max=-10 ; min = 9999 ;等

・同じく、入力値に制限がある場合
入力値の範囲外の特定の数値を「初期値」として、max/minが初期値だったら判定無しに入力値をmax,minとする
→同じく、 max = min = 9999 ;
...
if(max==9999){ max=tmp;min=tmp;} else {
if(max<tmp){max=tmp;}
if(min>tmp){min=tmp;}
}

・制限無く使える方法
最初の入力時に判定無しで入力値をmax,minとする。
最初かどうかは、booleanで判定フラグを用意したり、今回のような場合には添字==0かどうかで判定する。
添字での判定例
if(i==0){ max=tmp;min=tmp;} else {
if(max<tmp){max=tmp;}
if(min>tmp){min=tmp;}
}

フラグでの判定例
boolean isFirst = true ;
...
if( isFirst ){ max=tmp;min=tmp;isFirst=false;} else {
if(max<tmp){max=tmp;}
if(min>tmp){min=tmp;}
}

・入力値はすべて記録してあって、かつ、入力した順番を入れ替えてもよい場合
ソートして、先頭と最終の要素を使う
    • good
    • 0

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