
#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を++する。
・
・
・
となり、*の数がどんどん増えることになります。
この回答への補足
わかりやすい説明で、ほぼ理解することができました。
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」があるのかを教えて頂けませんか。
No.15
- 回答日時:
while文はわかりますか?
forを使った以下のような構文は、
for(A;B;C)
{
D;
}
whileを使って以下のように書き換えられます。
A;
while(B)
{
D;
C;
}
A,B,C,Dの処理の位置に注目してください。
これで元の
for(i = 0 ; i<5 ; i++){ /*行数の制御部*/
for(j = 0; j<(i+1) ; j++){ /* *の制御部*/
printf("*");
}
printf("\n");
}
をかきかえてみると
i=0;
while(i<5)
{
j = 0;
while( j<(i+1))
{
printf("*");
j++;
}
i++;
}
となります。
もうわかりましたね。
jの初期化j=0;は、
iのループの中でかつjのループの外にあるから、です。
iのループを回るたびにjは0になるわけです。
No.14
- 回答日時:
ちなみに質問者さんの考えている動作をするプログラムは
#include <stdio.h>
main () {
int i ;
int j ;
j = 0; /*一回だけ初期化*/
for(i = 0 ; i<5 ; i++){ /*行数の制御部*/
for(; j<(i+1) ; j++){ /* *の制御部 初期化部分がない*/
printf("*");
}
printf("\n");
}
return;
}
こうなります。
No.13
- 回答日時:
こんにちは、AEと申します。
文法的なことは皆さんが回答されていますので。
なるべく簡単に(^-^)。
> このようなフローがあると思われます。
> j=0の過程がどうしても導きだせません。
多重ループの場合、内側のループは最初から実行されることになります。ここの理解がキモでしょう。
「 for(j = 0; j<(i+1) ; j++) 」
の意味は
「jを0から、 (i + 1)まで、 1ずつ増加させる」
j=0; j < (i + 1); j ++;
ということですので、jは0に始まり(i+1)未満でループから抜けます。
この処理が最初から行われるということは、j=0からカウントアップが開始されるわけで、結果として、iが5になるまで、jのループ内で(i+1)個の*が横方向に表示されるということになります。
printf()で、iやjの値がどう変化していっているか表示してみるとよいでしょう。理解しやすくなりますよ。
ただ、少し厳しくかつ偉そうに言ってしまいますが、
○for()文の文法を理解する。
○多重ループにおけるfor()文のアルゴリズムを正しく理解する。
ということも頑張りましょう!
※今ちょうど一生懸命勉強してはるとこですよね!:)。
言語をやるのは初めてで、さっぱりわからない状態です。。。
ですが、これから着実に進めていきたいと思いますので、
今後とも宜しくお願いします。
No.12
- 回答日時:
for(i=0; i<n ; i++){
/* 処理 */ }
は次のように書き換えられます
i=0;
while(i<n){
/* 処理 */
i++; }
質問の場合は
for(i = 0 ; i<5 ; i++){ /*行数の制御部*/
for(j = 0; j<(i+1) ; j++){ /* *の制御部*/
printf("*");
}
printf("\n");
}
なので
i = 0;
while( i < 5 ) { /*行数の制御部*/
j = 0;
while( j < (i+1) ) { /* *の制御部*/
printf("*"); /* ここでは改行しない */
j++;
}
printf("\n"); /* ここで改行 */
i++;
}
です。
「初期化」や「インクリメント(++のこと)」、「printfの出力」がどのような順番で実行されているか、確認してください。
No.11
- 回答日時:
>2回目のループ開始(i=1)
>↓
>i(1)<5→jループに移る
>↓
>j=0 //一回目のループでj++されたからj=1になるのでは?
>↓
forの処理は、
(1) for文の2番目の式(制御式)がfalseになったとき(2) returnまたはgotoでfor処理の外へジャンプした
(3) breakでfor処理を抜けた
いずれの場合も終了(完了)します。
だから再度、同じfor文を実行してもそれは継続ではなく新規になります。

No.9
- 回答日時:
まず、for() の基本として、
for(<1> ; <2> ; <3>} {.... }
は、
・繰り返しに入る前に<1>を実行
・<2> の条件が満たされている限り.... を繰り返す
・繰り返しが終わる度に、<3> を実行
はOKですね。
この場合、
for(i = 0 ; i<5 ; i++){ /*行数の制御部*/
for(j = 0; j<(i+1) ; j++){ /* *の制御部*/
というループは、併置されているわけではなく、「外側のループ」「内側のループ」になります。
外側の for(i = 0; ... ) によって、ある処理が5回実行されます。外側のループ自体は、1度しか通過しません(その1度のループの中で、「ある処理」が5回実行されるわけです)
ですから、i = 0 という初期化は、1度しか起こりません。
5回実行される「ある処理」とは、実は、for(j = 0...)というループです。
これは、5回実行されます(それぞれの実行中で、* の印字は、i + 1 回実行されます)
つまり、j = 0 という初期化は5回実行されます。
このように、i は、1度しか初期化されず、j が5回初期化されるのは、i のループと j のループが、同じものではなく、j のループは、i の「中身」だからです。
ということになるのですが。
↓
> i(1)<5→jループに移る
> j=0 //一回目のループでj++されたからj=1になるのでは?
j の初期化は、「j のループが開始された」時に発生します。故に、「jループに移る」時には、必ず実行され、j は0になります。
これに対して、「i ループに『移る』」という箇所はありません(実際には、最初に一回ある)
だから、i は、初期化されないのです。
i は、「繰り返しのみ」
j は、「繰り返し(このときは初期化されない)」と「移る(このときは初期化される)と違いがあります。
No.8
- 回答日時:
>何故、jが最初に初期化されるのですか。
>それは、iでは起きないのですか
>for(j = 0; j<(i+1) ; j++){ /* *の制御部*/
>printf("*");
>}
for文は、本来3行以上必要な処理を1行にまとめて書かれています。
つまり、
loop_start:
j = 0;
loop_check:
if (j<(i+j)) goto loop_end
{ loop内の処理
printf("*");
}
loop_next:
j++;
goto loop_check
loop_end:
と、これだけの処理がfor文の中にあるのです。
jを初期化するloop_start:はfor文に入ったときに1度だけ実行され
forが継続している間は実行されません。
この回答への補足
丁寧な書き込みをしていただき、感謝感激です。
ただ、どうしてもjの値がインクリメントされても
「0」になる理由がのみこめません。
1回目のループ開始(i=0)
↓
i(0)<5→jループに移る
↓
j=0
↓
j(0)<(1):*を表示→j++
↓
j(1)<(1):条件終了。jループを抜ける
↓
i<5:\n(改行)を表示→i++→1回目のループを抜ける
↓
2回目のループ開始(i=1)
↓
i(1)<5→jループに移る
↓
j=0 //一回目のループでj++されたからj=1になるのでは?
↓
j(0)<(2):*を表示→j++
↓
j(1)<(2):*を表示→j++
↓
j(2)<(2):*条件終了。jループを抜ける
↓
i<5:\n(改行)を表示→i++→2回目のループを抜ける
↓
3回目のループ(i=2)
このようなフローがあると思われます。
j=0の過程がどうしても導きだせません。
No.7
- 回答日時:
「(2)で、「1 2 0 true *を表示」の部分においてj=0となっていますが、「0 1 1 false for(j)を抜ける」になるとjはインクリメントされ、 初期値がj=1となり、j=0にはならなく、*が表示されないと思われます。
何故「0」があるのかを教えて頂けませんか。」
forループの条件で最初に「j=0」を与えているからです。
for文を抜けた直後の「j」は「1」ですが、「i」のループによって再度forループに突入します。その際、最初に初期化されるので、質問のプログラムだとj=0から始まることになります。
この回答への補足
何故、jが最初に初期化されるのですか。
それは、iでは起きないのですか。
i=0 i=0の条件でループが始まる
↓
i=0 J=0の条件でループが終了
↓
i++ j++される(i=1 J=1)
↓
i=1 J=1の条件でループ開始
このような過程の中で、jがどう初期化されるのかを
教えて下さい。宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングのペーパーテスト 実行結果の表示を答えてください #include <stdio.h> 2 2022/07/09 16:14
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- C言語・C++・C# プログラミング実行後に表示される値を答えよ #include <stdio.h> void main 4 2022/05/28 10:20
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
do-while文が禁止される理由
-
C# 演算 Help me!
-
n重のfor文にするには?
-
C言語、whileループを抜け出す...
-
Excel VBAで年度をまたぐ期間の...
-
While文の終わりにセミコロンが...
-
基本情報技術平成21年春午後問8...
-
if文でスキップしたい場合は?
-
for文while文の無限ループの違...
-
ループを途中で抜けたいのですが。
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
2進数、16進数、10進数のことを...
-
複数桁10進数の*桁目だけを抽出...
-
エクセルで可視セルにのみ値貼...
-
20'(角度)の計算がわかりま...
-
C言語での引数の省略方法
-
DWORDの実際の型は何でしょうか
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
do-while文が禁止される理由
-
ループを途中で抜けたいのですが。
-
Excel VBAで年度をまたぐ期間の...
-
C言語forループが完結した場合...
-
break文でループを一気に抜ける...
-
プログラムで関数は使わない方...
-
For文の終了値を関数にしても問...
-
エクセルVBAで Do While (1)って?
-
入力した数値を倍々するプログラム
-
for文while文の無限ループの違...
-
n重のfor文にするには?
-
__asm int 3でのブレイクポイン...
-
UWSCにてある一定の動作を無限...
-
入力した文字列から母音だけを...
-
if文を使わずに奇数・偶数を判断
-
PIC のプログラムについて ど...
-
Delphiで・・・
-
VBScriptでSQLに接続し、CSV出...
-
While文の終わりにセミコロンが...
-
C++ DirectX カーソルの移動処...
おすすめ情報