• ベストアンサー

C言語 for文を使った一例について

#include<stdio.h> main () { int i ; int j ; for(i = 0 ; i<5 ; i++){ /*行数の制御部*/ for(j = 0; j<(i+1) ; j++){ /* *の制御部*/ printf("*"); } printf("\n"); } return; } このプログラムを実行すると * ** *** **** ***** が表示されます。 for(j = 0; j<(i+1) ; j++){ ↑    printf("*");} ↑ 「*」の制御部となりますが、 何故「*」が1行目で1個表示されているのに 2行目では2個表示されているのですか? 行数と「*」は同じになると思われますが。 上記の質問の回答の程宜しくお願いします。

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

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

iのforをfor(i)、jのforをfor(j)を表記して、各変数がどのように変移するかを書けば i i+1 j j<i+1 処理 --------------------------- 0 1 0 true *を表示 0 1 1 false for(j)を抜ける(そして改行) for(i)でiを++する。 1 2 0 true *を表示 1 2 1 true *を表示 1 2 2 false for(j)を抜ける(そして改行) for(i)でiを++する。 2 3 0 true *を表示 2 3 1 true *を表示 2 3 2 true *を表示 2 3 3 false for(j)を抜ける(そして改行) for(i)でiを++する。   ・   ・   ・ となり、*の数がどんどん増えることになります。

KGM
質問者

補足

わかりやすい説明で、ほぼ理解することができました。 i i+1 j j<i+1 処理 --------------------------- 0 1 0 true *を表示 ←(1) 0 1 1 false for(j)を抜ける(そして改行) for(i)でiを++する。 1 2 0 true *を表示 ←(2) 1 2 1 true *を表示 1 2 2 false for(j)を抜ける(そして改行)   ・   ・   ・ わからない点があるのですが、←矢印で 示している部分になります。 (1)では、初期値がi=0 , j=0なので *は一つだけ表示されるのはわかります。 (2)で、「1 2 0 true *を表示」の部分において j=0となっていますが、「0 1 1 false for(j)を抜ける」になるとjはインクリメントされ、 初期値が j=1となり、j=0にはならなく、*が表示されないと 思われます。 何故「0」があるのかを教えて頂けませんか。

すると、全ての回答が全文表示されます。

その他の回答 (14)

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.4

#2です。 i=0→j<(0+1) i=1→j<(1+1) となることからも分かりませんか?つまりjのループの中で*を出力していて、そのループを抜けた後改行'\n'の出力があるんです。 i=0→i<1 i=1→i<2 とはどこから? iのループの条件はi<5と変わらないですよ。

KGM
質問者

補足

i=0,j=0→j(1)<(0+1) i=1,j=1→j(2)<(1+1) というのは分かりました。 jのループでは*を出力して、jのループを抜けたら iのループで\nで改行されるのはわかりました。 (1) for(j = 0 ; j < i+1 ; j++ ){ printf("*"); } しかし、(1)のプログラムでは*を2個、3個と 表示するのかが不明です。*を1個だけ表示して しまうのではないのでしょうか。 (2) int i ; for (i = 0; i<5 ; i++) { printf("*\n"); } } (2)のプログラムでは * * * * という風に表示されます。 (1)と(2)では似ている箇所が多い気がします。 (1)のプログラムには外側にもループがあるので それが影響を与えているのかと思われます。 自分が不明な点をまとめると 1.*の表示は行数を変えるごとに1こずつ増えるのか。 2.ループが二重にあることで、*の表示は変わるのか。 3.(1)のプログラムでi+1とするのかが急に不明になりました。 かなり混乱をしてしまい、理解するのが難しい状態と なっておりますが、ご協力の程よろしくお願いします。

すると、全ての回答が全文表示されます。
  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.3

どう説明したら、納得してもらえるのか判りませんが、 とりあえず、ループの継続条件判らなくなったら、実数代入して考えると良いですよ。 まず、iの一回目のループなら i=0;でfor(j = 0; j < (1) ; j++){ でのループですし って考えていけば簡単に検証取れませんか?

KGM
質問者

補足

代入はしたのですが i=0;でfor(j = 0; j < i+1(0+1=1) ; j++){      printf("*");} この部分において、1行変えることに*の表示が 1つずつ増えるのが不明な点です。 また、i+1と設定するのも急にわからなくなりました。 自分の不明な点をまとめたものを記載しましたので、 もしよければご返答の程、宜しくお願いします。

すると、全ての回答が全文表示されます。
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

jのループの条件はi+1より小さいですよね?このiも外側のループで増分しているのを考えれば、そうなって当然だと思うのですが…。

KGM
質問者

補足

i+1じゃないと、一行目の*が表示されないことに なりますので。 'このiも外側のループで増分しているのを考えれば' とありますが、この過程をもう少し詳しく教えて 頂けませんか? i = 0 のとき i<1 となりますが、これは*が1個表示されることになるの ですか? i = 2 のとき i<2 となり、*は2個表示されるのですか?? *の表示過程がどうしてもわからない状態です。

すると、全ての回答が全文表示されます。
  • hunity
  • ベストアンサー率40% (12/30)
回答No.1

え~と、貴方のありたいことは * * * * ですよね?ならforのところを for(i = 0 ; i<5 ; i++){ /*行数の制御部*/ for(j = 0; j<i ; j++){ /スペースの制御部*/ printf(" "); } printf("*"); printf("\n"); } でいいんじゃないですかね?

KGM
質問者

補足

ではないです。 * ** *** **** ***** このようになる過程で、 「*」の制御がさっぱりわからないのです。 何故、「*」が行を変えることに2つ、3つと 表示されるのかがわからないのです。

すると、全ての回答が全文表示されます。

関連するQ&A