C言語の勉強をはじめて少したったので、
何も見ずに、10回入力された数字の最大値を出すプログラムを作ってみました。
しかし何故か正確な値が出たり、出なかったりとおかしいです。
どこに問題があるのでしょうか?
さらに僕が使っていたサイトに書いてあったコードも
僕のかいたものと同じように、使えたり使えなかったりします。
これは2010のバグでしょうか?コードの間違いでしょうか?
最大値を求めるのに・・・
Re: 最大値を求めるのに・・・
添字の範囲に問題があります。
配列in[10]と宣言すると、実際に使えるのはin[0]からin[9]になります。
しかし、2回目のwhile文でin[10]という存在しない変数にアクセスしてしまっているのでおかしなことになります。
変数nsの取りうる値の範囲をよく考えてみてください。
それと、示されている例であればwhile文よりもfor文の方が適任かと思います。
配列in[10]と宣言すると、実際に使えるのはin[0]からin[9]になります。
しかし、2回目のwhile文でin[10]という存在しない変数にアクセスしてしまっているのでおかしなことになります。
変数nsの取りうる値の範囲をよく考えてみてください。
それと、示されている例であればwhile文よりもfor文の方が適任かと思います。
Re: 最大値を求めるのに・・・
あ~、配列の数についてよく考えてませんでした。
でもそれをそろえても何故か同じ結果になってしまうのですが・・・
後、while文よりfor文のほうがよいのはなぜなのでしょうか?
でもそれをそろえても何故か同じ結果になってしまうのですが・・・
後、while文よりfor文のほうがよいのはなぜなのでしょうか?
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 最大値を求めるのに・・・
それはそうなんですけど、maru さんが書きました: それまでの最大値(a)と比べなければダメでしょう。
最大値の初期値が0で決めうちっていうのは、ちょっとまずいかもしれません。
私だったら、
a = in[0];
として、1~9のループを構成しますね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 最大値を求めるのに・・・
ですね!box さんが書きました:最大値の初期値が0で決めうちっていうのは、ちょっとまずいかもしれません。
私だったら、
a = in[0];
として、1~9のループを構成しますね。
つい、データは0以上という仮定を置いてしまいました。
ループ範囲を0~9にするなら初期値は INT_MIN にすべきでした。
ループを1~9からにしていないのは配列範囲の一部を特別処理にするのが嫌だったからですが、
この程度の処理なら問題はないでしょうね。
Re: 最大値を求めるのに・・・
in[10]と宣言したとき、in[10]を使ってはいけません。
in[10]と宣言したとき確保される領域はin[0]からin[9]までなのでin[10]には別のものが入っています。
in[10]がもし、osの大事なことを管理する場所だった場合、osが壊れる可能性があります。
このままだと危険なので修正しておきました。
このパターンはありがちだけど危険なのでこれからは絶対にこのようなことをしないでください。
危険のないように修正しておいたので、かなり安全になっています。ちゃんと動きます。
in[10]と宣言したとき確保される領域はin[0]からin[9]までなのでin[10]には別のものが入っています。
in[10]がもし、osの大事なことを管理する場所だった場合、osが壊れる可能性があります。
このままだと危険なので修正しておきました。
このパターンはありがちだけど危険なのでこれからは絶対にこのようなことをしないでください。
#include <stdio.h>
int main(void)
{
int in[10], n, a;
printf("10回数字を入力してください。最大値が出てきます。\n");
for(n=0;n < 10; n++) { //決まった回数ループする場合はforがいい
printf("%02d回目:",n+1);
scanf("%d",&in[n]);
}
a=in[0];
for(n=0; n < 10; n++) { //nの再利用(メモリ使用量削減のため) ここも決まった回数ループするのでfor
if(a <= in[n]) { //最大値と比較
a = in[n];
}
}
printf("最大値は%dです。\n",a);
return 0;
}
Re: 最大値を求めるのに・・・
たくさんの回答ありがとうございます。
皆様のおかげで問題は解決しましたが、
あまり話についていけませんでした・・・
これからしっかり勉強して、
こんな問題をすぐに解決できるようになりたいです!
皆様のおかげで問題は解決しましたが、
あまり話についていけませんでした・・・
これからしっかり勉強して、
こんな問題をすぐに解決できるようになりたいです!