前回載せたソースコードの説明をしていきます。

説明文は赤色で書いていきます。

 

-------------------
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#defineはほかの利用方法によって格納する数字を変更する可能性があるときに使用します。ソースコードの最初においておき変更したいときにサクッと変更します。今回は今後変更することはないでしょうが行数、列数、中に入れる数字を設定できるようにしています。マスは9×9で入れる数字は1~9までの9つです。10番目はNULLを入れるためにあけるので10と設定しています。

#define ROW 10
#define COL 10
#define N 10

int main(int argc, char* argv[]) {
    int i, j, n, row, col, cnt = 0;

    int item[ROW][COL][N], conf_item[ROW][COL];

    char gomi[100];
    FILE  *Input_File, *Output_File;

 

配列数は決まっているのでfor文によって初期化しておきます。配列を準備しても何も入れておかなかったらエラーの元です。最初のうちに初期化しておきましょう。

    /*Step1 初期化*/
    for (row = 0; row < ROW; row++) {
        for (col = 0; col < COL; col++) {
            conf_item[row][col] = 0;/*初期は未定*/
            for (n = 0; n < N; n++) {
                item[row][col][n] = 1;/*初期はすべての数字に可能性がある*/
            }
        }
    }

 

    /*---File準備---*/
    /*in*/
    if (fopen_s(&Input_File, argv[1], "r")) {
        printf("FILE OPEN FAILURE!!\n");
    }
    /*out*/
    if (fopen_s(&Output_File, "out.txt", "w")) {
        printf("FILE OPEN FAILURE!!\n");
    }
    printf("-----%s-----\n", argv[1]);

    /*---File準備終わり---*/

    /*---Step2 File読み込み---*/
    for (row = 1; row < ROW; row++) {

fscanf_sでファイルに書かれている数字を一行ずつ読み込んでいきます。今回は9文字と決まっているので%dを9つ準備して読み込んでいきます。この読み方をしたらせっかくdefineで行列数を決めているのに9×9にしか対応しませんが書くのが簡単なので今回はこのようにしておきます。
        /*conf_itemに入力データを入れ込む*/
        fscanf_s(Input_File, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n", &conf_item[row][1], &conf_item[row][2], &conf_item[row][3], &conf_item[row][4], &conf_item[row][5], &conf_item[row][6], &conf_item[row][7], &conf_item[row][8], &conf_item[row][9]);
    }
    /*itemに入力データを入れ込む。確定しているマスには該当する数字のitemに1、それ以外のitemに0を入れる。*/

入力確認用のアウトプット。
    printf_s("Input_File\n");
    fprintf_s(Output_File, "Input_File\n");
    for (row = 1; row < ROW; row++) {
        for (col = 1; col < COL; col++) {

conf_itemに0以外の数字が入っていたら(row,col)に数字が入っているということにしているので他の数字は入らない。そのため入る可能性があるか判定用に準備しているitemには0を入れます。

            if (conf_item[row][col] != 0) {
                for (n = 0; n < N; n++) {
                    item[row][col][n] = 0;
                }
                item[row][col][conf_item[row][col]] = 1;
            }

入力確認用のアウトプット。

            printf_s("%d,", conf_item[row][col]);
            fprintf_s(Output_File, "%d,", conf_item[row][col]);/*出力ファイルに入力データを出力*/
        }
        printf_s("\n");
        fprintf_s(Output_File, "\n");
    }
    /*---item入力完了---*/
    fclose(Input_File);

    /*---File読み込み終わり---*/
    fclose(Input_File);
    fclose(Output_File);

    /*--コマンドライン停止用、意味はない--*/
    scanf_s("%s", gomi, 100);
}

fscanf、printf、fprintfなどはvisual studioではfscanf_s、printf_s、fprintf_sとしないとエラーとなります。使い方は少し異なりますが慣れればどういったことはありません。使い方は使いながら覚えてもらえればと思います。

 

今回はここまで。次から空いたマスに数字を入れる処理を書いていきます。