数列の照査と抽出 – プログラミング – Home

通知
すべてクリア

数列の照査と抽出


テツ
 テツ
(@テツ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

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 の
表示は特に必要ありません)

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


引用解決済
トピックタグ
テツ
 テツ
(@テツ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

下記のプログラムは完全ではないのですが教えて頂いたものです。
このプラグラムがなにかヒントになればよいのですが。。このプログラムの修正・訂正
・説明もしくはなにか他にいい方法があればお知恵を拝借したいです。
私はまだ初心者でして不明な点も多いのですがよろしくお願い致します。
/*
 * ./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
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

マルチ
http://m--takahashi.com/bbs/default.aspx?c=14017


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました