ページ 1 / 1
FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月26日(金) 18:28
by kaoruh
例えば
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したい
Posted: 2017年5月26日(金) 19:20
by 白い変人
完全に質問者様の求めている回答とは違うのかもしれませんが、
コード:
for(i=220;i>=220 || i<50;i++,i%=250) {処理式}
でイケそうな気が私はしました。
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月26日(金) 20:23
by Noir
おそらくこういう事を言っているのではないか? と予想しました。
コード:
int id[ 80 ] = { 220, 221, ... 250, 0,1,... 50 };
For(i=0;i<80,i++) { iでなくid[i]を使う }
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月26日(金) 20:31
by かずま
今、飲み屋でこんなのを思いつきました。
コード:
for (int k = 0; k < 80; k++) {
Int i = k < 30 ? k + 220 : k - 30;
処理
}
PC が無いのでチェックできません。
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月26日(金) 20:58
by たいちう
ご希望と違うかもしれませんが、正攻法はこうでしょう。
コード:
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++) {
処理式
}
}
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月26日(金) 22:24
by みけCAT
たいちう さんが書きました:コード:
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 に訂正しました
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月27日(土) 01:47
by box
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したい
Posted: 2017年5月27日(土) 08:39
by かずま
box さんが書きました:
回答のどの場合でも、処理時間はそう変わらんと思うので、素直に
コード:
for (i = 220; i < 250; i++) {
// 何かの処理
}
for (i = 0; i < 50; i++) {
// 何かの処理
}
と書くのがよいと思います。後でそのコードを見たときに「何をしているか」が一目瞭然なはず。
「何かの処理」が 30行ぐらいあったとしたらどうでしょうか?
後でそのコードを見たとき、同じことが書かれているのか、
どこかに違いがあるのかが一目瞭然ではないはず。
同じ記述が複数あると、後でそのコードに修正があった時、
一方だけ修正して、もう一方の修正を忘れることがあります。
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月27日(土) 16:33
by みけCAT
みけ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++) {
処理式
}
}
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月28日(日) 12:35
by かずま
たいちう さんが書きました:ご希望と違うかもしれませんが、正攻法はこうでしょう。
コード:
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;
}
これだけたくさんの回答が寄せられているのですから、
質問者さんには、コメントや解決などの返信をお願いします。
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月29日(月) 15:29
by kaoruh
白い変人さま、Noirさま、かずまさま、たいちうさま、boxさま、みけCATさま、お返事ありがとうございます。
週末、プログラムは測定を行っていて、今テストができないので(やり方はあるのでしょうが^^;)試してからまたお返事させてください。
「処理文」はかずまさまのおっしゃる通り非常に長いので、同じ事を繰り返し記載はしたくありませんでした。
今現在は、Noirさまの案で急場を凌ぎました。
ただ、「int id[ 80 ] = { 220, 221, ... 」のこの「...」が長いと、やはり小変更したい場合などに困るので、もっと良い方法を探していました。
他の方法を試してみてからお返事します。
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月29日(月) 20:20
by kaoruhk
白い変人さんのこの書き方がもっとも短くて、ミスが少ないように思いました。
実際にやってみて所望になりました。
この方式を今後使ってみます。
今回の問題では、0~250の中で数字がぐるぐる回る想定だったので、私の背景にぴったりでした。
⇒
for(i=220;i>=220 || i<50;i++,i%=250) {処理式}
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月29日(月) 20:40
by kaoruh
アイディアをありがとうございました。
別の案で進めようと思いますが、こちらの案も試したら所望通りです。
でも以下の記述を読み解く事ができませんでした。
どういう意味だったのでしょうか?
(C言語を基礎から勉強する間も無く、目前の課題をこなしている感じなので・・・)
教えて頂けると嬉しいです。
⇒
Noir さんが書きました:
コード:
int id[ 80 ] = { 220, 221, ... 250, 0,1,... 50 };
For(i=0;i<80,i++) { iでなくid[i]を使う }
Re: FOR文で不連続な範囲でLoopしたい
Posted: 2017年5月29日(月) 20:45
by kaoruh
すいません!下記、送信エラーを繰り返しているうちに、別の投稿に対してメッセージを送ってしまいました。ごめんなさい!
Noirさんのアイディアは理解できます。
ありがとうございました。
kaoruh さんが書きました:アイディアをありがとうございました。
別の案で進めようと思いますが、こちらの案も試したら所望通りです。
でも以下の記述を読み解く事ができませんでした。
どういう意味だったのでしょうか?
(C言語を基礎から勉強する間も無く、目前の課題をこなしている感じなので・・・)
教えて頂けると嬉しいです。
⇒
Noir さんが書きました:
コード:
int id[ 80 ] = { 220, 221, ... 250, 0,1,... 50 };
For(i=0;i<80,i++) { iでなくid[i]を使う }