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 の
表示は特に必要ありません)
できれば説明もいれて頂くとうれしいです
下記のプログラムは完全ではないのですが教えて頂いたものです。
このプラグラムがなにかヒントになればよいのですが。。このプログラムの修正・訂正
・説明もしくはなにか他にいい方法があればお知恵を拝借したいです。
私はまだ初心者でして不明な点も多いのですがよろしくお願い致します。
/*
* ./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);
}