Ver1.1へ

addsub.c(Ver1.0)のソースコード】


// 加減計算を行うプログラム

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

// x, yの入力を行う関数
void inputXY(int *xp, int *yp);

// 加算の結果を画面出力する関数
void showResultAdd(int x, int y);

// 加算の結果をファイル出力する関数
// makeFileName()関数を使用する
void fshowResultAdd(int x, int y,
    char *pFileName, char *pOldFileName);

// 減算の結果を画面出力する関数
void showResultSub(int x, int y);

// 減算の結果をファイル出力する関数
// makeFileName()関数を使用する
void fshowResultSub(int x, int y,
    char *pFileName, char *pOldFileName);

// 現在日付時刻からファイル名を生成する関数
void makeFileName(char *pFileName);

int main(void)
{
    int num, x, y;
    char line[100], ch, zz;
    char aFileName[100] = {1,};     // a:array(配列)
    char aOldFileName[100] = {0};   //   aFileName[]とaOldFileName[]は
                                    //   異なる内容となるように初期化する
    char *pFileName, *pOldFileName; // p:pointer(ポインタ)
    pFileName = aFileName;          // ポインタの初期化
    pOldFileName = aOldFileName;    // ポインタの初期化
    
    while (1) {
        printf("【加減の計算を行います】\n\n");
        printf("次の1か2かを選択してください。\n\n");
        printf("1.加算をする。\n");
        printf("2.減算する。\n\n");
        printf("1, 2のどちらですか? ");
        while (1) {
            fgets(line, sizeof line, stdin);
            sscanf(line, "%d%c", &num, &zz);
            if ((num != 1) && (num != 2)) {
                printf("1または2を入力してください: ");
                continue;
            } else
                break;
        }
        
        x = y = 0; // 初期化
        switch (num) {
        case 1:
            printf("\n【加算をします】\n\n");
            inputXY(&x, &y);
            showResultAdd(x, y);
            printf("ファイルに出力しますか?(y/n) ");
            while (1) {
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if ((ch == 'y') || (ch == 'Y'))    {        // 入力がyまたはYなら
                    fshowResultAdd(x, y,                    // ファイル出力して
                        pFileName, pOldFileName);
                    break;                                  // while(1)ループを抜ける
                } else if ((ch == 'n') || (ch == 'N'))      // 入力がnまたはNなら
                    break;                                  // 何もしないでwhile(1)ループを抜ける
                else {                                      // 入力がそれ以外なら
                    printf("yまたはnを入力してください: ");
                    continue;                               // 入力をやり直す
                }
            }
            
            printf("\n続けますか?(y/n) ");
            while (1) {
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if ((ch == 'y') || (ch == 'Y')) {
                    printf("\n+++++\n\n");
                    break;
                } else if ((ch == 'n') || (ch == 'N'))
                    return EXIT_SUCCESS;
                else {
                    printf("yまたはnを入力してください: ");
                    continue;
                }
            }
            break;
        case 2:
            printf("\n【減算をします】\n\n");
            inputXY(&x, &y);
            showResultSub(x, y);
            printf("ファイルに出力しますか?(y/n) ");
            while (1) {
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if ((ch == 'y') || (ch == 'Y'))    {        // 入力がyまたはYなら
                    fshowResultSub(x, y,                    // ファイル出力して
                        pFileName, pOldFileName);
                    break;                                  // while(1)ループを抜ける
                } else if ((ch == 'n') || (ch == 'N'))      // 入力がnまたはNなら
                    break;                                  // 何もしないでwhile(1)ループを抜ける
                else {                                      // 入力がそれ以外なら
                    printf("yまたはnを入力してください: ");
                    continue;                               // 入力をやり直す
                }
            }
            printf("\n続けますか?(y/n) ");
            while (1) {
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if ((ch == 'y') || (ch == 'Y')) {
                    printf("\n+++++\n\n");
                    break;
                } else if ((ch == 'n') || (ch == 'N'))
                    return EXIT_SUCCESS;
                else {
                    printf("yまたはnを入力してください: ");
                    continue;
                }
            }
            break;
        default:
            break;
        }
    }
}

// x, yの入力を行う関数
void inputXY(int *xp, int *yp)
{
    char line[100], zz;
    
    printf("2つの整数x, yの値を入力してください。\n");
    
    // xの入力
    printf("x = ? ");
    while (1) {
        fgets(line, sizeof line, stdin);
        sscanf(line, "%d%c", xp, &zz);
        if ((*xp != 0) && (atoi(line) == 0)) {
            printf("半角数字を入力してください。\n");
            continue;
        } else
            break;
    }
    
    // yの入力
    printf("y = ? ");
    while (1) {
        fgets(line, sizeof line, stdin);
        sscanf(line, "%d%c", yp, &zz);
        if ((*yp != 0) && (atoi(line) == 0)) {
            printf("半角数字を入力してください。\n");
            continue;
        } else
            break;
    }
}

// 加算の結果を画面出力する関数
void showResultAdd(int x, int y)
{
    printf("%d + %d = %d\n", x, y, x + y);
    
    return;
}

// 加算の結果をファイル出力する関数
// makeFileName()関数を使用する
void fshowResultAdd(int x, int y,
    char *pFileName, char *pOldFileName)
{
    FILE *fp;
    
    if (strcmp(pFileName, pOldFileName) == 0) {     // ファイル名が同じなら
        fp = fopen(pOldFileName, "a");              // pOldFileNameを開く
        if (fp == NULL) {
            printf("ファイルが作成できません。\n");
            return;
        }
        fprintf(fp, "%d + %d = %d\n", x, y, x + y);
    } else {                                        // ファイル名が違うなら
        makeFileName(pFileName);                    // 新規にファイル名を生成して
        fp = fopen(pFileName, "a");                 // そのファイル(pFileName)を開いて
        pOldFileName = pFileName;                   // pOldFileNameを更新する
        if (fp == NULL) {
            printf("ファイルが作成できません。\n");
            return;
        }
        fprintf(fp, "%d + %d = %d\n", x, y, x + y);
    }
    fclose(fp);
    return;
}

// 減算の結果を画面出力する関数
void showResultSub(int x, int y)
{
    printf("%d - %d = %d\n", x, y, x - y);
    
    return;
}

// 減算の結果をファイル出力する関数
// makeFileName()関数を使用する
void fshowResultSub(int x, int y,
    char *pFileName, char *pOldFileName)
{
    FILE *fp;
    
    if (strcmp(pFileName, pOldFileName) == 0) {     // ファイル名が同じなら
        fp = fopen(pOldFileName, "a");              // pOldFileNameを開く
        if (fp == NULL) {
            printf("ファイルが作成できません。\n");
            return;
        }
        fprintf(fp, "%d - %d = %d\n", x, y, x - y);
    } else {                                        // ファイル名が違うなら
        makeFileName(pFileName);                    // 新規にファイル名を生成して
        fp = fopen(pFileName, "a");                 // そのファイル(pFileName)を開いて
        pOldFileName = pFileName;                   // pOldFileNameを更新する
        if (fp == NULL) {
            printf("ファイルが作成できません。\n");
            return;
        }
        fprintf(fp, "%d - %d = %d\n", x, y, x - y);
    }
    fclose(fp);
    return;
}

// 現在日付時刻からファイル名を生成する関数
void makeFileName(char *pFileName)
{
    struct tm *t;
    time_t tt;
    char snumrand[10];
    
    srand((unsigned int)time(NULL));
    
    time(&tt);
    t = localtime(&tt);
    
    sprintf(pFileName, "addsub%04d%02d%02d_%02d%02d%02d_",
        1900+(t->tm_year), 1+(t->tm_mon), t->tm_mday,
        t->tm_hour, t->tm_min, t->tm_sec);
    sprintf(snumrand, "%04d", rand() % 10000);
    pFileName = strcat(pFileName, snumrand);
    pFileName = strcat(pFileName, ".txt");
    
    return;
}

Ver1.1へ