• ベストアンサー

初歩的な質問ですが;;

学校で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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

2重のfor文がどの様に実行されるかを、憶える為の演習問題だと思いますが。 for(j = 0; j < i; j++){ printf("*"); } の、部分を実行をi回実行して、全体では、それを10回繰り返すという入れ子の構造を理解する為の演習問題だと思いますが。

shinbqz
質問者

お礼

迅速な、回答ありがとうございましたm,,n

その他の回答 (6)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.7

ここまでのやり取りを見ていて、あなたの疑問は二重ループに関する疑問だけではないようだという結論に達しました。 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文のことで疑問があります。 >なぜ、行を繰り返して表示しなければいけないのでしょうか?? 『あなたが「繰り返して表示するよう」プログラミングしたから』です。 コンピュータは、プログラマがプログラムしたこと以外のことを実行するようには出来ていません。 たとえ自律制御が出来るようになっていても、そのコンピュータには「自律制御する」プログラムが入っているに過ぎません。 コンピュータに間違ったプログラムを与えたら間違った処理を実行します。 お分かりでしょうか。

shinbqz
質問者

お礼

返信ありがとうございます。 みなさんのレスのおかげでようやく、理解することができました。 本当にありがとうございました。

  • ceita
  • ベストアンサー率24% (304/1218)
回答No.6

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 *の時は** となります。

shinbqz
質問者

お礼

再度ありがとざいますm(__)m。 本当に、頑固な頭がいうことをきかずすみません。 >>外側が2回目の時には iは1です。 するとjは0から1の2回、回るので \dの時には01 ですが、jの範囲は確かに0~1ありますが 範囲内の数だけ出力されるのはなぜでしょうか?? 自分てきに、1だけだとおもってたのですが・・・

  • g_dori
  • ベストアンサー率47% (330/699)
回答No.5

ループを展開した時に、どういう処理が行われているかがわからないって事ですかね? 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"); //…中略 //} これでわかりませんかね?

shinbqz
質問者

お礼

わざわざ、詳しく丁寧にありがとうございますm(__)m

  • Ysan
  • ベストアンサー率32% (44/136)
回答No.4

0 01 012 0123 の様にはなりませんよ。 タイプミスしていないか確認してみてください。 また、外側のfor文の閉じカッコが無いのが気になりますが、 わざとですか。

shinbqz
質問者

補足

0 01 012 0123は 内側のfor文の内容だとおもわれます。 0 10 201 3012 40123の部分の 0 01 012 0123です。

  • ceita
  • ベストアンサー率24% (304/1218)
回答No.3

実行してみましたか? 行の番号と同じ数だけ「*」を並べるプログラムですよね? だからiまでjをまわすわけですよね? ほかの書き方もあるとは思いますが、 for文を使うならこういう風に書くのは素直だと思います。 質問の題名の;;が for(;;) みたいで面白いですね。

shinbqz
質問者

補足

すみません、補足させていただきます。 略させてもらいますが例えば 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)
回答No.2

内側のfor文とは for(j = 0; j < i; j++){ printf("*"); } この部分ですよね? 改行コード出力 printf("\n"); は外側のfor文です。 このコードでは、 1.数字を出力 2.その数字分の*を出力 3.改行 を10回繰り返すものだと思いますが。

shinbqz
質問者

お礼

回答ありがとうございますm,,m

関連するQ&A