質問: ### 前提・実現したいこと 0~100の整数を10個入力して、最大値と最小値を求めて表示するプログラムをかきたいです。ただし、-1が入力されると処理を中止する、最大値最小値を求める関数は一つにしてmain以外でつくる、という制約のもとです。 ### 発生している問題・エラーメッセージ ``` 実行すると11番目の数と表示されるのと、11回以上の入力を受け付けるという問題。エラーメッセージは出ていません。 ``` ### 該当のソースコード ``` #include void maxmin(int data[], int *max, int *min); int main(void){ int i=0; int data[10]; int max, min=0; for(i=0; i<10; i++){data[i]=0;} do{ printf("%d番目の数:", i+1); scanf("%d", &data[i]); i++; }while(data[i-1]!=-1 || i<10); maxmin(data, &max, &min); return 0; } void maxmin(int data[], int *max, int *min){ int i=0; *max=0; *min=100; while(data[i]!=-1){ if(data[i]>*max) *max=data[i]; if(data[i]<*min) *min=data[i]; i++; } } ``` ### 試したこと 何分エラーが出てないもんですから、手出しできませんでした。。。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: いくつか問題がありそうですが・・・。 11回以上受け付けるということに絞れば ``` }while(data[i-1]!=-1 || i<10); ``` ここに問題があります。 入力値が -1 でないか i が 10 より小さいという条件なので 11回目以降に -1 を入力しない限りループを抜けません。 その他の追記 1.初期化の問題 ``` for(i=0; i<10; i++){data[i]=0;} ``` は、既に指摘がありますが・・・。 配列全体を0で初期化するのであれば、宣言部で ``` int data[10]={}; ``` でよいかと思います。 1. 入力値の問題 課題では 入力値は 0~100 とありますので、-1 は途中で抜けるとしても 100 より大きい入力があれば 再入力を促すようにすべきかと思います。 2. 最大値と最小値を求めて表示する 「最大値と最小値を求めて表示する」とありますので、最後に min と max を表示しなければならないのでは?