数列の照査と抽出

[戻る]
テツ 2007/07/22(日) 01:09:44
VC++6.0 を使用しています。
Win32 Consol Application

ABCDEFGHIJのそれぞれに1〜3のどれかの数字が入るとします。

例
ABCDEFGHIJ
1111111111
1111111121
1111111112
    ・
  ・
    ・
3333333321  
3333333332
3333333333
の数字のコードの羅列がExcelで表示されているとします。
この数字のコードから1つ選び他の全てのコードと照査して
下記の条件を満たす数字のコードをExcelに抽出して下さい。(CSVファイルでも大丈夫
です)
 
条件1)  A〜Eの数字の中で違いが2つのみでその数字が共に1だけ小さい数字
でコードを除外する。

条件2)  F〜Jの数字の中で違いが2つのみでその数字が共に1だけ小さい数字
でコードを除外する。 
    
例  ABCDEFGHIJ                
   3333333333    と入力したとすると

   3332233333 ・・・NG
   3332133333  ・・・OK
   3331333333  ・・・OK

例  ABCDEFGHIJ
   2222222222   と入力したとすると
   
      2223322222 ・・・OK
   2221122222  ・・・NG
   3222122222  ・・・OK
 
例  ABCDEFGHIJ    と入力すると
      3233232122      
   
      2133232122   ・・・NG
      3233221122  ・・・NG 
      2133221122   ・・・NG  

OK と NG のコードを別々のExcelのシートに抽出して下さい。(OK と NG の
表示は特に必要ありません)

できれば説明もいれて頂くとうれしいです

テツ 2007/07/22(日) 01:31:02
下記のプログラムは完全ではないのですが教えて頂いたものです。
このプラグラムがなにかヒントになればよいのですが。。このプログラムの修正・訂正
・説明もしくはなにか他にいい方法があればお知恵を拝借したいです。
私はまだ初心者でして不明な点も多いのですがよろしくお願い致します。
/* 
 * ./a.out keyString judged-filename 
 */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

enum { 
  BUF_SIZE = 16, 
  P_REQUIRE = 2, // 必要な引数の数 
  ARRAY_HALF = 5, // A-E 
  ARRAY_SIZE = 10 // 数字の長さ 
}; 

static void Judge(const char *, const char *); 

int main(int argc, char *argv[]) 
{ 
  char *keyString; 
  char *iFilename; 

  /* 引数が足りてるか判定 */ 
  if (argc < P_REQUIRE) { 
    fprintf(stderr, "Error: Parameter Shortage\n" 
        "Usage: %s keyString judged-filename", argv[0]); 
    exit(EXIT_FAILURE); 
  } else { 
    keyString = argv[1]; 
    iFilename = argv[2]; 
  } 

  Judge(keyString, iFilename); 

  return EXIT_SUCCESS; 
} 

static void Judge(const char *keyString, const char *filename) 
{ 
  int i, j; 
  int diff; 
  int sum; 
  char buf[BUF_SIZE]; 
  FILE *fin, *fok, *fng; 

  fin = fopen(filename, "r"); 
  fok = fopen("OK.csv", "w"); 
  fng = fopen("NG.csv", "w"); 

  while (1) { 
    /* ファイルから一行読み取り */ 
    memset(buf, '\0', sizeof(buf)); 
    if (fgets(buf, sizeof(buf), fin) == NULL) 
      break; 
     
    for (sum = 0, i = 0; i < ARRAY_SIZE; i++) { 

      /* 半分でクリア */ 
      if (i == ARRAY_HALF) 
        sum = 0; 

      /* 差によって分岐 */ 
      diff = keyString[i] - buf[i]; 
      if (diff != 0 && diff != 1) { 
        /* 差が0,1以外でA-Eの間 */ 
        if (i < ARRAY_HALF) { 
          i = ARRAY_HALF - 1; 
          continue; 
        } 
        /* F-Jの間 */ 
        i = ARRAY_SIZE; 
        break; 
      } 

      sum += diff; 

      /* 走査した結果NG */ 
      if ((i % ARRAY_HALF == 4) && sum == 2) { 
        fprintf(fng, "%s", buf); 
        break; 
      } 
    } 
    /* NGにならなかった */ 
    if (i == ARRAY_SIZE) 
      fprintf(fok, "%s", buf); 
  } 

  fclose(fng); 
  fclose(fok); 
  fclose(fin); 
}

RAPT [HomePage] 2007/07/22(日) 12:45:42
マルチ
http://m--takahashi.com/bbs/default.aspx?c=14017

古いスレッドには追加発言できません。