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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
フィア
記事: 82
登録日時: 12年前

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

#1

投稿記事 by フィア » 12年前

数列が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{
  //処理の仕方を書く
 }
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 12年前

処理する数値に素数などのルールがない場合、処理する数値だけを書いた配列を用意して、その配列とループ比較するという手があります。
まぁその数値のルール次第なので、場合によってはもっと良い方法があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
せんちゃ
記事: 50
登録日時: 14年前
住所: 江別市東野幌町
連絡を取る:

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

#3

投稿記事 by せんちゃ » 12年前

偶数であるときとか、ある数列に従っているとかであればそのアルゴリズムを使って評価すればいいと思いますが、
規則性がない任意の番号にある処理をさせたいのであれば、
私なら各要素に属性を持たせて分岐させます

コード:

	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();
	}
ヽ(*゚д゚)ノ カイバー

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 12年前

書き添えておくと、どの方法も一長一短ありますので、私の方式のほうが都合が良い場合もありますし、せんちゃさんの方式が都合が良い場合もあります。
状況に応じてチョイスされるべきです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

フィア
記事: 82
登録日時: 12年前

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

#5

投稿記事 by フィア » 12年前

例としての値は素数を使いましたが、実際に処理したいのは規則性は全くないとは全くいえませんね
ある画面の処理がこんな感じであったときに

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

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

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

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

フィア
記事: 82
登録日時: 12年前

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

#6

投稿記事 by フィア » 12年前

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();
  }
 }
}

このような感じですね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 12年前

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

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

「アトリビュートとは【attribute】(attr) - 意味/解説/説明/定義 : IT用語辞典」
http://e-words.jp/w/E382A2E38388E383AAE ... 38388.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#8

投稿記事 by ISLe » 12年前

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;
}

閉鎖

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