- ベストアンサー
c言語で分からないところがあるので教えてください。
http://www9.plala.or.jp/sgwr-t/c/Q/ens06-61.html の問題がわかりません。 回答の #include <stdio.h> int main( void ) { int kekka[51]; int a, b, i; int amari; printf( "整数値を2つ入力してください " ); scanf( "%d%d", &a, &b ); if( b == 0 ){ printf( "処理終了\n" ); return 0; } printf( "%d / %d = ", a, b ); kekka[0] = a/b; for ( i = 1; i < 51;i++ ) { amari = a%b; if ( amari == 0 ) break; a = amari * 10; kekka[i] = a/b; } printf( "%d.", kekka[0] ); ここまでの部分はわかったのですが、 下の for ( a = 1; a < i; a++ ) { printf( "%d", kekka[a] ); } の部分がわかりません。 この部分は何を表わしているのか 教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
for(i=1;i<51;i++)は、配列変数kekkaに値を"格納"しています。 そして、for(a=1;a<i;a++)は、配列変数kekkaに格納した値を"表示"しているだけです。 条件式の i<51とa<iの違いは、わかっているでしょうか? a<iをa<51に変更することは、正しくないとわかるでしょうか? たぶん、わかっていると思いますが。 できる限り詳しい回答をもらわず、自身の頭を使って答えを導いてほしいです。
その他の回答 (3)
- cametan_42
- ベストアンサー率62% (163/262)
>for ( i = 1; i < 51;i++ )と >for ( a = 1; a < i; a++ ) >の違いがわかりません。 違い?構文的には別に違いなんてないでしょう。 多分混乱の原因は「aを使いまわしている」からでしょうね。 今、(amariである)a%b==0が得られた時点iで配列kekkaの要素数がいくつになるか確定しています。従ってiは1≦i<51のうちの「どれか」です。 for ( i = 1; i < 51;i++ )の処理が終わった時点でiはその「どれか」になるわけですね。そしてこの時点でもはやaは計算(a/bを求めるかa%bを求めるか)に使われるのが終わっているので「a自体には意味が無い」状態になっています。 そして、 for ( a = 1; a < i; a++ ) となっていますが、上限は先ほど保持した「i」です。 また、ここでaがまた使われているんで混乱してるんじゃないかな、と思うんですが、ここのaは「単なる使いまわし」です。もはや最初の設計で「a / b」とか「a % b」を求める必然性が終わってるんで、変数aを「再利用」しているだけ、です。 何ならこの部分以降のaを全てbにしてもいいですし、紛らわしいのなら、最初の変数宣言で int a, b, i, j; とでもやって for ( j = 1; j < i; j++ ) { printf( "%d", kekka[j] ); } としても良いですよ。 いずれにせよ、ここで使われているaは最初に出てきたaとは性質が別で、単に「配列要素を指し示す」インデックスとして使われているだけ、です。字面的に見て混同しないようにして下さい。
お礼
ありがとうございます。 無事にわかりました。 aが、前の部分で使われてたのに、 なぜ、ここで、もう一度使っているのだろうかと ずっと疑問に残っておりました。 forは初期化をまずはじめにする文なので、 当り前のことでした。 本当にありがとうございました。
- ttschool
- ベストアンサー率28% (18/64)
> ここまでの部分はわかったのですが、 おそらく、はっきりとは分かっていないのでしょう。 命令が「ここまでの部分」まで実行された場合の話しです。 kekka[0]には、必ず(100%)なんらかの値が入っているというのは分かりますよね? しかし、kekka[4]やkekka[10]に必ず値が入っているということを保障することはできません。 なぜだか、分かるでしょうか?
お礼
回答ありがとうございます。 if ( amari == 0 ) break; でfor文を抜けたときに、 値が入らないということではないでしょうか?
- cametan_42
- ベストアンサー率62% (163/262)
単に、配列a[i]の中身を順次表示していってるだけ、なのではないでしょうか。
お礼
回答ありがとうございます。 printfで表示しているのはわかるのですが、 for ( i = 1; i < 51;i++ )と for ( a = 1; a < i; a++ ) の違いがわかりません。 この文章は、 前者のだけで 表現できるのではないでしょうか? 教えてください。
お礼
ありがとうございます。 無事わかりました。 a < i にするのは、iは51まで求められる前に、breakでforを抜けるので、iは31とか、1とかで終わる場合があるので、a < iでするんですよね。 for文で、あまりを一個づつ出していくということがうまく頭で認識できなかったせいでこのような問題がわからなかったのかもしれません。 紙に筆算を解いてみたら、理解できるようになりました。 本当にありがとうございました。