FOR文で不連続な範囲でLoopしたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kaoruh

FOR文で不連続な範囲でLoopしたい

#1

投稿記事 by kaoruh » 2年前

例えば
For(i=220;i<250,i++) {処理式}
を実行してから同じ処理式で、更に
For(i=0;i<50,i++){処理式}
と続けたいばあいにはどうすれば良いでしょうか?
処理の順番も大事です。

一つのFor文の中で、「i=220;i<250,i++)」と「i=0;i<50,i++)」の両方を記載できれば良いのですが、方法が分かりません。
教えてください。

白い変人

Re: FOR文で不連続な範囲でLoopしたい

#2

投稿記事 by 白い変人 » 2年前

完全に質問者様の求めている回答とは違うのかもしれませんが、

コード:

for(i=220;i>=220 || i<50;i++,i%=250) {処理式}
でイケそうな気が私はしました。

Noir

Re: FOR文で不連続な範囲でLoopしたい

#3

投稿記事 by Noir » 2年前

おそらくこういう事を言っているのではないか? と予想しました。

コード:

int id[ 80 ] = { 220, 221, ... 250, 0,1,... 50 };
For(i=0;i<80,i++) { iでなくid[i]を使う }

かずま

Re: FOR文で不連続な範囲でLoopしたい

#4

投稿記事 by かずま » 2年前

今、飲み屋でこんなのを思いつきました。

コード:

for (int k = 0; k < 80; k++) {
    Int i = k < 30 ? k + 220 : k - 30;
    処理 
}
PC が無いのでチェックできません。

たいちう
記事: 418
登録日時: 8年前

Re: FOR文で不連続な範囲でLoopしたい

#5

投稿記事 by たいちう » 2年前

ご希望と違うかもしれませんが、正攻法はこうでしょう。

コード:

void sub(int i) { 処理式 }

int main() {
	for (int i = 220; i < 250; i++)
		sub(i);

	for (int i = 0; i < 50; i++)
		sub(i);

	return 0;
}
正攻法でないなら、

コード:

for (int k = 0; k < 2; k++) {
	int a = k == 0 ? 220 : 0;
	int b = k == 0 ? 250 : 50;
	for (int i = a; i < b; i++) {
		処理式
	}
}

アバター
みけCAT
記事: 6134
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: FOR文で不連続な範囲でLoopしたい

#6

投稿記事 by みけCAT » 2年前

たいちう さんが書きました:

コード:

for (int k = 0; k < 2; k++) {
	int a = k == 0 ? 220 : 0;
	int b = k == 0 ? 250 : 50;
	for (int i = a; i < b; i++) {
		処理式
	}
}

コード:

int begin[] = {220, 0};
int end[] = {250, 50};
for (int k = 0; k < 2; k++) {
	for (int i = begin[k]; i < end[k]; i++) {
		処理式
	}
}
の方がいいかもしれません。

【追記】i < 2 → k < 2 に訂正しました
最後に編集したユーザー みけCAT on 2017年5月27日(土) 16:33 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 1730
登録日時: 8年前

Re: FOR文で不連続な範囲でLoopしたい

#7

投稿記事 by box » 2年前

kaoruh さんが書きました: For(i=220;i<250,i++) {処理式}
を実行してから同じ処理式で、更に
For(i=0;i<50,i++){処理式}
と続けたいばあいにはどうすれば良いでしょうか?
回答のどの場合でも、処理時間はそう変わらんと思うので、素直に

コード:

    for (i = 220; i < 250; i++) {
        // 何かの処理
    }
    for (i = 0; i < 50; i++) {
        // 何かの処理
    }
と書くのがよいと思います。後でそのコードを見たときに「何をしているか」が一目瞭然なはず。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: FOR文で不連続な範囲でLoopしたい

#8

投稿記事 by かずま » 2年前

box さんが書きました: 回答のどの場合でも、処理時間はそう変わらんと思うので、素直に

コード:

    for (i = 220; i < 250; i++) {
        // 何かの処理
    }
    for (i = 0; i < 50; i++) {
        // 何かの処理
    }
と書くのがよいと思います。後でそのコードを見たときに「何をしているか」が一目瞭然なはず。
「何かの処理」が 30行ぐらいあったとしたらどうでしょうか?

後でそのコードを見たとき、同じことが書かれているのか、
どこかに違いがあるのかが一目瞭然ではないはず。

同じ記述が複数あると、後でそのコードに修正があった時、
一方だけ修正して、もう一方の修正を忘れることがあります。

アバター
みけCAT
記事: 6134
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: FOR文で不連続な範囲でLoopしたい

#9

投稿記事 by みけCAT » 2年前

みけCAT さんが書きました:

コード:

int begin[] = {220, 0};
int end[] = {250, 50};
for (int k = 0; k < 2; k++) {
	for (int i = begin[k]; i < end[k]; i++) {
		処理式
	}
}
の方がいいかもしれません。
もう少し改良してみました。
この方が範囲の始点と終点の対応がわかりやすいと思います。

コード:

struct range_t {
	int begin, end;
} range[] = {{220, 250}, {0, 50}};
for (int k = 0; k < 2; k++) {
	for (int i = range[k].begin; i < range[k].end; i++) {
		処理式
	}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: FOR文で不連続な範囲でLoopしたい

#10

投稿記事 by かずま » 2年前

たいちう さんが書きました:ご希望と違うかもしれませんが、正攻法はこうでしょう。

コード:

void sub(int i) { 処理式 }

int main() {
	for (int i = 220; i < 250; i++)
		sub(i);

	for (int i = 0; i < 50; i++)
		sub(i);

	return 0;
}
確かに正攻法ですが、for文の前に、複数の変数の設定があって、
処理式がそれらを参照する場合ならどうでしょうか?
すべての変数を関数 sub に引き渡すのが煩雑になるでしょう。

みけCATさんの方法が一番良いように思いますが、
構造体になじみのない方は、配列にする手もあります。
.begin/.end が [0]/[1] になります。

コード:

#include <stdio.h>

int main(void)
{
    int range[4][2] = { {220, 250}, {0, 50}, {90, 100}, {0,10} };
    for (int k = 0; k < 4; k++) {
        for (int i = range[k][0], j = range[k][1]; i < j; i++) {
            printf(" %d", i); // 処理式
        }
    }
    return 0;
}
これだけたくさんの回答が寄せられているのですから、
質問者さんには、コメントや解決などの返信をお願いします。

kaoruh

Re: FOR文で不連続な範囲でLoopしたい

#11

投稿記事 by kaoruh » 2年前

白い変人さま、Noirさま、かずまさま、たいちうさま、boxさま、みけCATさま、お返事ありがとうございます。
週末、プログラムは測定を行っていて、今テストができないので(やり方はあるのでしょうが^^;)試してからまたお返事させてください。
「処理文」はかずまさまのおっしゃる通り非常に長いので、同じ事を繰り返し記載はしたくありませんでした。
今現在は、Noirさまの案で急場を凌ぎました。
ただ、「int id[ 80 ] = { 220, 221, ... 」のこの「...」が長いと、やはり小変更したい場合などに困るので、もっと良い方法を探していました。
他の方法を試してみてからお返事します。

kaoruhk

Re: FOR文で不連続な範囲でLoopしたい

#12

投稿記事 by kaoruhk » 2年前

白い変人さんのこの書き方がもっとも短くて、ミスが少ないように思いました。
実際にやってみて所望になりました。
この方式を今後使ってみます。
今回の問題では、0~250の中で数字がぐるぐる回る想定だったので、私の背景にぴったりでした。


for(i=220;i>=220 || i<50;i++,i%=250) {処理式}

kaoruh

Re: FOR文で不連続な範囲でLoopしたい

#13

投稿記事 by kaoruh » 2年前

アイディアをありがとうございました。
別の案で進めようと思いますが、こちらの案も試したら所望通りです。
でも以下の記述を読み解く事ができませんでした。
どういう意味だったのでしょうか?
(C言語を基礎から勉強する間も無く、目前の課題をこなしている感じなので・・・)
教えて頂けると嬉しいです。
Noir さんが書きました:

コード:

int id[ 80 ] = { 220, 221, ... 250, 0,1,... 50 };
For(i=0;i<80,i++) { iでなくid[i]を使う }

kaoruh

Re: FOR文で不連続な範囲でLoopしたい

#14

投稿記事 by kaoruh » 2年前

すいません!下記、送信エラーを繰り返しているうちに、別の投稿に対してメッセージを送ってしまいました。ごめんなさい!
Noirさんのアイディアは理解できます。
ありがとうございました。
kaoruh さんが書きました:アイディアをありがとうございました。
別の案で進めようと思いますが、こちらの案も試したら所望通りです。
でも以下の記述を読み解く事ができませんでした。
どういう意味だったのでしょうか?
(C言語を基礎から勉強する間も無く、目前の課題をこなしている感じなので・・・)
教えて頂けると嬉しいです。
Noir さんが書きました:

コード:

int id[ 80 ] = { 220, 221, ... 250, 0,1,... 50 };
For(i=0;i<80,i++) { iでなくid[i]を使う }

返信

“C言語何でも質問掲示板” へ戻る