- ベストアンサー
初歩的な質問ですが;;
学校でC言語を習い始めたのですが、 よく、理解できない部分があるので教えていただけると、ありがたいです。 関数、for文でのことですが 2重のfor文がよく理解できません。 たとえば、略して書きますが for(i = 0;i < 10; i++){ printf("%d",i); for(j = 0; j < i; j++){ printf("*"); } printf("\n"); で、内側のfor文のことで疑問があります。 なぜ、行を繰り返して表示しなければいけないのでしょうか?? 本当、初歩的な質問ですがお願いしますm,,m
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
2重のfor文がどの様に実行されるかを、憶える為の演習問題だと思いますが。 for(j = 0; j < i; j++){ printf("*"); } の、部分を実行をi回実行して、全体では、それを10回繰り返すという入れ子の構造を理解する為の演習問題だと思いますが。
その他の回答 (6)
- rentahero
- ベストアンサー率53% (182/342)
ここまでのやり取りを見ていて、あなたの疑問は二重ループに関する疑問だけではないようだという結論に達しました。 for(j=0;j<5;j++) { printf("%d", j); } このとき、出力結果が01234となることが理解できないのだと思います。 1.printfは、改行を明示的につけてやらなければ改行しない。 2.printfをはじめとするstdoutへ出力する関数は、あくまでstdoutへ出力するだけである。 3.stdoutは、出力する機能のみを持っており、出力内容を整形する機能はない。 4.stdoutに出力する内容は、以前の出力内容に依存せずに後から後からどんどん追加される。 であるから、 上記のプログラムをforとjを使わずに表現した結果が printf("%d", 0); printf("%d", 1); printf("%d", 2); printf("%d", 3); printf("%d", 4); となることは理解できるとして、あなたは、この出力がどんどん上書きされるように考えてしまっているのだと思います。 しかし、実際には、上記のプログラムは printf("%d%d%d%d%d",0,1,2,3,4); と同等に動きます。 ちなみに… Win32 コンソール上においては、stdoutにバイナリ出力すると \r=cr \n=lf となるため、改行\nの代わりに\rを出力すると、あなたの意図した結果が得られます。 for(i = 0;i < 5; i++){ printf("%d\r",i); for(j = 0; j < i; j++){ printf("%d\r",j); } printf("\n"); =>結果 0 0 1 2 3 実際には(^M=\r、^J=\n) 0^M^J・・・・・・・・>0 1^M0^M^J ・・・・・・>0 2^M0^M1^M^J・・・・・>1 3^M0^M1^M2^M^J ・・・>2 4^M0^M1^M2^M3^M^J・・>3 さて このことを踏まえてあなたの質問に答えますと >で、内側のfor文のことで疑問があります。 >なぜ、行を繰り返して表示しなければいけないのでしょうか?? 『あなたが「繰り返して表示するよう」プログラミングしたから』です。 コンピュータは、プログラマがプログラムしたこと以外のことを実行するようには出来ていません。 たとえ自律制御が出来るようになっていても、そのコンピュータには「自律制御する」プログラムが入っているに過ぎません。 コンピュータに間違ったプログラムを与えたら間違った処理を実行します。 お分かりでしょうか。
お礼
返信ありがとうございます。 みなさんのレスのおかげでようやく、理解することができました。 本当にありがとうございました。
- ceita
- ベストアンサー率24% (304/1218)
No.3のものです。 No.4の方の言っているのはあなたの補足書かれたコードの 改行\nの出し方やカッコが片方ないことなどから あなたの書いた結果にはならないということをいっているのだと思いますよ。 まあ、ここに写す際にタイプミスしたのだと思いますが。 0 01 012 0123 は内側のfor文の出力です。 2段階に分けて考えましょう。 外側のforのiが0の際には jは0から0の範囲です。 ですのでjの出力は0がひとつですね。 外側が2回目の時には iは1です。 するとjは0から1の2回、回るので \dの時には01 *の時は** となります。
お礼
再度ありがとざいますm(__)m。 本当に、頑固な頭がいうことをきかずすみません。 >>外側が2回目の時には iは1です。 するとjは0から1の2回、回るので \dの時には01 ですが、jの範囲は確かに0~1ありますが 範囲内の数だけ出力されるのはなぜでしょうか?? 自分てきに、1だけだとおもってたのですが・・・
- g_dori
- ベストアンサー率47% (330/699)
ループを展開した時に、どういう処理が行われているかがわからないって事ですかね? iをコメントアウトすると、以下のような処理になります。 //for(i = 0;i < 10; i++){ printf("%d",0); for(j = 0; j < 0; j++){ printf("%d",j); } printf("\n"); printf("%d",1); for(j = 0; j < 1; j++){ printf("%d",j); } printf("\n"); printf("%d",2); for(j = 0; j < 2; j++){ printf("%d",j); } printf("\n"); printf("%d",3); for(j = 0; j < 3; j++){ printf("%d",j); } printf("\n"); //…中略 //} これでわかりませんかね?
お礼
わざわざ、詳しく丁寧にありがとうございますm(__)m
- Ysan
- ベストアンサー率32% (44/136)
0 01 012 0123 の様にはなりませんよ。 タイプミスしていないか確認してみてください。 また、外側のfor文の閉じカッコが無いのが気になりますが、 わざとですか。
補足
0 01 012 0123は 内側のfor文の内容だとおもわれます。 0 10 201 3012 40123の部分の 0 01 012 0123です。
- ceita
- ベストアンサー率24% (304/1218)
実行してみましたか? 行の番号と同じ数だけ「*」を並べるプログラムですよね? だからiまでjをまわすわけですよね? ほかの書き方もあるとは思いますが、 for文を使うならこういう風に書くのは素直だと思います。 質問の題名の;;が for(;;) みたいで面白いですね。
補足
すみません、補足させていただきます。 略させてもらいますが例えば for(i = 0;i < 5; i++){ printf("%d",i); for(j = 0; j < i; j++){ printf("%d",j); } printf("\n"); でコンパイルすると 0 10 201 3012 40123となりますが 0 01 012 0123のように前の行の繰り返しがされるのはなぜでしょうか??意味わからない質問だったらスルーしてください;
- Ysan
- ベストアンサー率32% (44/136)
内側のfor文とは for(j = 0; j < i; j++){ printf("*"); } この部分ですよね? 改行コード出力 printf("\n"); は外側のfor文です。 このコードでは、 1.数字を出力 2.その数字分の*を出力 3.改行 を10回繰り返すものだと思いますが。
お礼
回答ありがとうございますm,,m
お礼
迅速な、回答ありがとうございましたm,,n