ページ 11

値が不連続の処理をしたいのです。

Posted: 2013年4月21日(日) 12:50
by フィア
数列が100個あるとして

そのうち連続した値を10個だけ別の処理をする場合は

for( int i = 0; i < 100; i++ ){
 if( i < 10 ){
  //処理の仕方を書く
 }

 else{
  //処理の仕方を書く
 }
}

といった感じで書いておけば処理はできると思いますが

値が不連続の場合はどのように書けば処理できますか?
もちろん下のようにすれば何とかなると思いますが下の場合、コードが非常に長くなってしまうため実用的ではないと思います。

for( int i = 0; i < 100; i++ ){
 if( ( i == 5 ) || ( i == 17 )||(i == 23)||・・・ ){
  //処理の仕方を書く
 }

 else{
  //処理の仕方を書く
 }
}

Re: 値が不連続の処理をしたいのです。

Posted: 2013年4月21日(日) 13:02
by softya(ソフト屋)
処理する数値に素数などのルールがない場合、処理する数値だけを書いた配列を用意して、その配列とループ比較するという手があります。
まぁその数値のルール次第なので、場合によってはもっと良い方法があります。

Re: 値が不連続の処理をしたいのです。

Posted: 2013年4月21日(日) 13:23
by せんちゃ
偶数であるときとか、ある数列に従っているとかであればそのアルゴリズムを使って評価すればいいと思いますが、
規則性がない任意の番号にある処理をさせたいのであれば、
私なら各要素に属性を持たせて分岐させます

コード:

	const int Max = 100;
	int type[Max];
	type[5] = 1;
	type[17] = 1;
	type[23] = 1;
	for( int i = 0 ; i < sizeof(type)/sizeof(*type) ; i++ ){
		if( type[i] == 1 ){
			process_type_1();
			continue;
		}
		process_type_2();
	}

Re: 値が不連続の処理をしたいのです。

Posted: 2013年4月21日(日) 13:29
by softya(ソフト屋)
書き添えておくと、どの方法も一長一短ありますので、私の方式のほうが都合が良い場合もありますし、せんちゃさんの方式が都合が良い場合もあります。
状況に応じてチョイスされるべきです。

Re: 値が不連続の処理をしたいのです。

Posted: 2013年4月21日(日) 13:56
by フィア
例としての値は素数を使いましたが、実際に処理したいのは規則性は全くないとは全くいえませんね
ある画面の処理がこんな感じであったときに

■ ■ ■ ■ ■ ■
■ □ □ ■ ■ ■
■ □ □ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ □ □ □ ■
■ ■ □ □ □ ■

□の時 の処理は~
それ以外の■の時の処理は~

と分けたかったのですが規則性が全くないとはいえません。
全体的には不規則でも個別的に考えるなら規則性はありますね。

ああ、これが解決法ですか・・・っと言う事はせん茶さんの案の関数を作ればいいのですね。
教えていただきありがとうございました。

Re: 値が不連続の処理をしたいのです。

Posted: 2013年4月21日(日) 14:19
by フィア
for (int j = 0; j < 6; j++ ){
 for( int i = 0; i < 6; i++ ){
  if( ( j == 1 ) || ( j == 2) ){
   if( ( i == 1 )|| ( i == 2 ) ){
    syori_A();
   }
  }

  else if( ( j == 4 ) || ( j == 5) ){
   if( ( 1 < i ) && ( i < 5 ) ){
    syori_A();
   }
  }

  else{
   syori_B();
  }
 }
}

このような感じですね。

Re: 値が不連続の処理をしたいのです。

Posted: 2013年4月21日(日) 14:54
by softya(ソフト屋)
それだとマップパーツのアトリビュート(対象の性質や設定などを示す付加情報。「属性」と訳される。)の処理に近い気がします。
今までの話が断片的な情報なので、アルゴリズムが最適かは判断できないです。

調整など変更要素が多いなら、プログラムコードとして埋め込んでしまうのでは無くデータとして持つべきですよ。

「アトリビュートとは【attribute】(attr) - 意味/解説/説明/定義 : IT用語辞典」
http://e-words.jp/w/E382A2E38388E383AAE ... 38388.html

Re: 値が不連続の処理をしたいのです。

Posted: 2013年4月21日(日) 17:31
by ISLe
softyaさんのおっしゃるような視覚的に分かりやすい方法。

コード:

#include <stdio.h>
int main(int argc, char *argv[])
{
	int x, y;
	static const char *table[] = {
		"oooooo",
		"oxxooo",
		"oxxooo",
		"oooooo",
		"ooxxxo",
		"ooxxxo",
	};
	for (y=0; y<6; y++) {
		for (x=0; x<6; x++) {
			if (table[y][x] == 'x') {
				putchar('A');
			}
			else {
				putchar('B');
			}
		}
		puts("");
	}
	return 0;
}