お蔵入り

このプログラムの説明願います。

**
****
********
のように*を倍々しながら20行まで書き出すプログラムの模範解答なんですが。
#include <stdio.h>
int main()
{int i, n, k;
for (n = 1; n <= 20; n += 1) {
k = n * 2;
for (i = 1; i <= k; i += 1) {
printf("*");}
printf("\n");
}return 0;}
これでどうしてkが*の個数となるんですか?
i<=kとしたからですか?
回答を見ても納得できません。

2007-10-25 14:16の質問
この質問は、30日間解決しなかったために自動的に質問が一旦閉じられました。
Ads By Google

回答(2)

1.

2007-10-25 16:22:22
1987さん こんxxは ひよこ画伯やすです。

2重ループですね。ループがどこにかかっているか、
見やすいように、以下のようにしておきます。

for (n = 1; n <= 20; n += 1)        ←  1) 
{
  k = n * 2;                      ←  2)
  for (i = 1; i <= k; i += 1)            ←  3) 
  {
    printf("*");                  ← 4)
  }
  printf("\n");                    ←5)
}


1)のループにより nは、1,2,3,4,5、、、20となります。
2)のkは 1)のループにそって変動しますので、2、4,6,8,10、、、、40となります。
3)が2重ループなのですが、2)のkの値によってループ回数がきまるので、2,4,6,8,10、、、、40と変化します。
4)は、3)のループにそって"*"を印刷させますので、2,4,6,8,10、、、、40個記述するということになります。
5)は1)のループ内ですので、3)のループが終わった時点で、改行します。

一度、PADか何かで、プログラムの構造を考慮する癖をつけたようがいいかもしれませんね。
では、失礼します。
回答レベル : アドバイス

2.

2007-10-27 01:01:40
nは1から20

kはnの二倍だから2から40

kの数だけ*を表示させるのだから、

**(最初は二個)



***・・・・****(最後は40個)

になりますよね。




n = 1の時、
k = 2だよね。
for (i = 1; i <= k; i += 1) {
printf("*");}
の部分で二個分*を表示させます。

同じように
n = 2の時、
k=4なので四個分表示。

で、
for (n = 1; n <= 20; n += 1)
なのでnは20まで。
つまりkは40まで。
つまり40個まで*を表示させます。
Ads By Google

コメント(3)

#1.  imq
2007-10-25 21:45:15

*を倍々しながら20行まで書き出す
そもそもこれが間違いではないでしょうか?
実際これに忠実に作ったら恐ろしいことになります。

2007-10-26 17:49:35

行の倍の数の*を書き出す
でしょうねw

ホントに倍々なら、k=1で初期化しておいて、k=k*2ですが、普通のターミナルで1行に収まるのは5行目くらいまででしょうw

2007-10-27 01:28:45

回答1、2、質問文中のプログラムは、
 行の倍の数の*を書き出す
仕様です。

imqさんの#1でのご指摘は、質問文の問題の部分で、倍々にすると20行目は2^20(2の20乗)になっちゃってエライことになるっていう話です。

要するに、問題か模範解答か、どちらかは間違っているという意味。

トラックバック

トラックバックURL: