ページ 11

反復行動について

Posted: 2008年6月28日(土) 16:02
by sousi
ゲームでは、反復行動にはwhile文が使われている事が多いと思うのですが勉強している間にひとつ疑問が;
(以降、反復行動=ループ)

・ループの中にループは作れるのかどうか?

ループの中にループが入れれるのであればどのようにすればいいのでしょうか?
いま、考えているのは


・仮に一番外側のループをAと言ったとき
 そのループの中に1と言うループを入れる(添付参照)



このとき、一番外のループAの処理は

ループ1(条件を満たしたら)→処理1→ループ2(条件を満たしたら)→ループ1

となるのでしょうか?

Re:反復行動について

Posted: 2008年6月28日(土) 16:10
by へろりくしょん
言いたいことが今ひとつ分からないのですが。
とりあえず書いてみればいいんじゃないでしょうか?
int i = 0;

while(i++ < 10){
	int j = 0, k = 0;
	while(j++ < 10){
		printf("j = %d\r\n", j);
	}
	printf("処理\r\n");
	while(k++ <= 10){
		printf("k = %d\r\n", k);
	}
}

Re:反復行動について

Posted: 2008年6月28日(土) 17:03
by box
ループの中にループの中にループの中にループ…、
いくらでも作れます。

Re:反復行動について

Posted: 2008年6月28日(土) 17:49
by たかぎ
ブロック(繰返し文も含む)の入れ子は、少なくとも127段階まで保証されます。
ただし、C99に対応していない処理系の場合は15段階までです。

Re:反復行動について

Posted: 2008年6月28日(土) 18:20
by box
> ブロック(繰返し文も含む)の入れ子は、少なくとも127段階まで保証されます。
> ただし、C99に対応していない処理系の場合は15段階までです。

無限段階ではなかったのですね。
勉強になりました。

Re:反復行動について

Posted: 2008年6月28日(土) 18:32
by kazuoni
> ブロック(繰返し文も含む)の入れ子は、少なくとも127段階まで保証されます。
> ただし、C99に対応していない処理系の場合は15段階までです。

自分もしりませんでしたぁ~!昔友達に「いくらでも書ける」なんて堂々と言ってしまった記憶があるんですが・・・^^;

Re:反復行動について

Posted: 2008年6月28日(土) 19:01
by たかぎ
> 無限段階ではなかったのですね。

翻訳限界なので、あくまでも規格上保証される最低限のものです。
普通はもっと多いはずです。
メモリは有限なので、無限というのは原理的に無理ですね。

Re:反復行動について

Posted: 2008年6月28日(土) 19:42
by sousi
ちょっと休憩してる間にこんなに・・・・・ありがとうございます。(涙
ループの中にループは作れるんですね、勉強になりました^^

ところで、もうひとつの質問、

一番外のループ内の処理
ループ1(条件を満たしたら)→処理1→ループ2(条件を満たしたら)→ループ1

というような考えで合っているのでしょうか?

Re:反復行動について

Posted: 2008年7月01日(火) 17:43
by やそ
>一番外のループ内の処理
>ループ1(条件を満たしたら)→処理1→ループ2(条件を満たしたら)→ループ1

>というような考えで合っているのでしょうか?

添付の図をそのまま見た場合・・・残念ながら違います。

ループA

 ループ1
 ループ1終わり

 処理1

 ループ2
 ループ2終わり

ループA終わり

という構造になっているようです。

処理1をループ1に入れたい場合ループ1の枠線の中に処理1が入るような図になるはずです。

Re:反復行動について

Posted: 2008年7月02日(水) 02:27
by へろりくしょん
>一番外のループ内の処理
>ループ1(条件を満たしたら)→処理1→ループ2(条件を満たしたら)→ループ1

>というような考えで合っているのでしょうか?

添付の図をそのまま見た場合・・・残念ながら違います。


これはどうでしょうね。

sousiさんの言う(条件を満たしたら)というのは、ループの終了条件を満たしたら。
という意味で言っているのだと。
つまり、(条件を満たしたら)という部分でループが終了すると解釈できませんか。

これだと、sousiさんの認識で間違いではないはずです。


#ループは条件を満たしている限り回り続けるので、ここでちょっと噛み合ってないような気がします。

Re:反復行動について

Posted: 2008年7月02日(水) 08:59
by やそ
Whileについてだから「条件を満たしたら」というのは「ループの継続条件」のことだと思ってました。

その辺の意識のズレがあれば、意味が違ってきますね^^;

Re:反復行動について

Posted: 2008年7月04日(金) 18:38
by sousi
返信遅れてごめんなさい。モデムが故障してしまいまして^^;
言いたかったことは へろり さんの説明通りです。

ですが、これをゲームで使うとなるとものすごく処理が重くなってしまうようですね。
処理が軽く反復行動をやりたい場合にはやはりif文を使うほうがいいみたいです。

たくさんの解答ありがとうございました。困ったら、また助けてください^^

Re:反復行動について

Posted: 2008年7月04日(金) 19:19
by たいちう
> ですが、これをゲームで使うとなるとものすごく処理が重くなってしまうようですね。
> 処理が軽く反復行動をやりたい場合にはやはりif文を使うほうがいいみたいです。

質問の背景が分かりませんが、勘違いしていませんか?

仮に100回同じ処理を行うとして、繰り返しの処理をループでしてもifでしても、
実行時間は変わらないでしょう。100回という回数を減らすことができたり、
多くなってしまうならば、実行時間は変わりますが、これは無駄な処理が
あるかどうかなので、ifの使用や多重ループとは別の話です。