Ver1.1へ

addsub_i.c(Ver1.2)のソースコード】


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

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

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

// 文字列が正しい形式の数値かどうかを判定する関数
int isValidNumber(char line[]);

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

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

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

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

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

int main(void)
{
    int x, y;
    char line[100], ch, zz;
    char filenamea[100] = {1};      // a:array(配列)
    char oldfilenamea[100] = {0};   //   filenamea[]とoldfilenamea[]は
                                    //   異なる内容となるように初期化する
    char *filenamep, *oldfilenamep; // p:pointer(ポインタ)
    filenamep = filenamea;          // ポインタの初期化
    oldfilenamep = oldfilenamea;    // ポインタの初期化
    
    while (1) {
        printf("【整数の加減の計算を行います】\n\n");
        printf("次のいずれかを選択してください。\n\n");
        printf("1.加算をする。\n");
        printf("2.減算をする。\n");
        printf("0.終了する。\n\n");
        printf("0、1、2のどれですか? ");
        while (1) {
            fgets(line, sizeof line, stdin);
            sscanf(line, "%c%c", &ch, &zz);
            if (((ch != '0') && (ch != '1') && (ch != '2')) || (zz != '\n')) {
                printf("無効な入力です。\n");
                printf("0、1、2のいずれかを入力してください: ");
                continue;
            } else
                break;
        }
        
        x = y = 0; // 初期化
        switch (ch) {
        case '1':
            printf("\n【加算をします】\n\n");
            inputXY(&x, &y);
            showResultAdd(x, y);
            while (1) {
                printf("ファイルに出力しますか?(y/n) ");
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if (((ch == 'y') || (ch == 'Y')) && (zz == '\n'))    {
                    fshowResultAdd(x, y, filenamep, oldfilenamep);
                    break;
                } else if (((ch == 'n') || (ch == 'N')) && (zz == '\n'))
                    break;
                else {
                    printf("無効な入力です。\n");
                    printf("yまたはnを入力してください。\n");
                    continue;
                }
            }
            printf("\n");
            while (1) {
                printf("続けますか?(y/n) ");
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if (((ch == 'y') || (ch == 'Y')) && (zz == '\n')) {
                    printf("\n+++++\n\n");
                    break;
                } else if (((ch == 'n') || (ch == 'N')) && (zz == '\n'))
                    return EXIT_SUCCESS;
                else {
                    printf("無効な入力です。\n");
                    printf("yまたはnを入力してください。\n");
                    continue;
                }
            }
            break;
        case '2':
            printf("\n【減算をします】\n\n");
            inputXY(&x, &y);
            showResultSub(x, y);
            while (1) {
                printf("ファイルに出力しますか?(y/n) ");
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if (((ch == 'y') || (ch == 'Y')) && (zz == '\n')) {
                    fshowResultSub(x, y, filenamep, oldfilenamep);
                    break;
                } else if (((ch == 'n') || (ch == 'N')) && (zz == '\n'))
                    break;
                else {
                    printf("無効な入力です。\n");
                    printf("yまたはnを入力してください。\n");
                    continue;
                }
            }
            printf("\n");
            while (1) {
                printf("続けますか?(y/n) ");
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if (((ch == 'y') || (ch == 'Y')) && (zz == '\n')) {
                    printf("\n+++++\n\n");
                    break;
                } else if (((ch == 'n') || (ch == 'N')) && (zz == '\n'))
                    return EXIT_SUCCESS;
                else {
                    printf("無効な入力です。\n");
                    printf("yまたはnを入力してください。\n");
                    continue;
                }
            }
            break;
        case '0':
            return EXIT_SUCCESS;
            break;
        default:
            break;
        }
    }
}

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

// 文字列が正しい形式の数値かどうかを判定する関数
int isValidNumber(char line[])
{
    int i = 0;
    
    // 最初は符号(省略可)
    if (line[i] == '+' || line[i] == '-')
        i++;
    // 次に数字(省略不可)
    if (!isdigit(line[i]))
        return 0;
    i++;
    // 次に数字列(省略可)
    while (isdigit(line[i]))
        i++;
    
    // 他に余計な文字がなければ真、あれば偽
    return line[i] == '\0';
}

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

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

// 現在日付時刻からファイル名を生成する関数
void makeFileName(char *filenamep)
{
    struct tm *t;
    time_t tt;
    char snumrand[10];
    
    time(&tt);
    t = localtime(&tt);
    
    srand((unsigned int)time(NULL));
    rand(); rand(); rand(); rand(); rand();
    
    sprintf(filenamep, "addsub_i%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);
    filenamep = strcat(filenamep, snumrand);
    filenamep = strcat(filenamep, ".txt");
    
    return;
}


addsub_i(Ver1.2)の実行結果】赤字はキーボードからの入力を表す。

D:\test>addsub_i
【整数の加減の計算を行います】

次のいずれかを選択してください。

1.加算をする。
2.減算をする。
0.終了する。

0、1、2のどれですか? 10
無効な入力です。
0、1、2のいずれかを入力してください: 1

【加算をします】

2つの整数x、yの値を入力してください。
x = ? 1.5
無効な入力です。
半角整数を入力してください。
x = ? 1
y = ? -2
(1) + (-2) = -1
ファイルに出力しますか?(y/n) y

続けますか?(y/n) y

+++++

【整数の加減の計算を行います】

次のいずれかを選択してください。

1.加算をする。
2.減算をする。
0.終了する。

0、1、2のどれですか? 2

【減算をします】

2つの整数x、yの値を入力してください。
x = ? 1
y = ? -2
(1) - (-2) = 3
ファイルに出力しますか?(y/n) y

続けますか?(y/n) y

+++++

【整数の加減の計算を行います】

次のいずれかを選択してください。

1.加算をする。
2.減算をする。
0.終了する。

0、1、2のどれですか? 0


【出力されたファイルaddsub_i20220403_205326_2376.txtの内容】

(1) + (-2) = -1
(1) - (-2) = 3


addsub_f.c(Ver1.2)のソースコード】

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

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

// x, yの入力を行う関数
// isValidNumber()関数を使用する
void inputXY(double *xp, double *yp);

// 文字列が正しい形式の数値かどうかを判定する関数
int isValidNumber(char line[]);

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

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

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

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

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

int main(void)
{
    double x, y;
    char line[100], ch, zz;
    char filenamea[100] = {1};      // a:array(配列)
    char oldfilenamea[100] = {0};   //   filenamea[]とoldfilenamea[]は
                                    //   異なる内容となるように初期化する
    char *filenamep, *oldfilenamep; // p:pointer(ポインタ)
    filenamep = filenamea;          // ポインタの初期化
    oldfilenamep = oldfilenamea;    // ポインタの初期化
    
    while (1) {
        printf("【浮動小数点数の加減の計算を行います】\n\n");
        printf("次のいずれかを選択してください。\n\n");
        printf("1.加算をする。\n");
        printf("2.減算をする。\n");
        printf("0.終了する。\n\n");
        printf("0、1、2のどれですか? ");
        while (1) {
            fgets(line, sizeof line, stdin);
            sscanf(line, "%c%c", &ch, &zz);
            if (((ch != '0') && (ch != '1') && (ch != '2')) || (zz != '\n')) {
                printf("無効な入力です。\n");
                printf("0、1、2のいずれかを入力してください: ");
                continue;
            } else
                break;
        }
        
        x = y = 0; // 初期化
        switch (ch) {
        case '1':
            printf("\n【加算をします】\n\n");
            inputXY(&x, &y);
            showResultAdd(x, y);
            while (1) {
                printf("ファイルに出力しますか?(y/n) ");
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if (((ch == 'y') || (ch == 'Y')) && (zz == '\n'))    {
                    fshowResultAdd(x, y, filenamep, oldfilenamep);
                    break;
                } else if (((ch == 'n') || (ch == 'N')) && (zz == '\n'))
                    break;
                else {
                    printf("無効な入力です。\n");
                    printf("yまたはnを入力してください。\n");
                    continue;
                }
            }
            printf("\n");
            while (1) {
                printf("続けますか?(y/n) ");
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if (((ch == 'y') || (ch == 'Y')) && (zz == '\n')) {
                    printf("\n+++++\n\n");
                    break;
                } else if (((ch == 'n') || (ch == 'N')) && (zz == '\n'))
                    return EXIT_SUCCESS;
                else {
                    printf("無効な入力です。\n");
                    printf("yまたはnを入力してください。\n");
                    continue;
                }
            }
            break;
        case '2':
            printf("\n【減算をします】\n\n");
            inputXY(&x, &y);
            showResultSub(x, y);
            while (1) {
                printf("ファイルに出力しますか?(y/n) ");
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if (((ch == 'y') || (ch == 'Y')) && (zz == '\n')) {
                    fshowResultSub(x, y, filenamep, oldfilenamep);
                    break;
                } else if (((ch == 'n') || (ch == 'N')) && (zz == '\n'))
                    break;
                else {
                    printf("無効な入力です。\n");
                    printf("yまたはnを入力してください。\n");
                    continue;
                }
            }
            printf("\n");
            while (1) {
                printf("続けますか?(y/n) ");
                fgets(line, sizeof line, stdin);
                sscanf(line, "%c%c", &ch, &zz);
                if (((ch == 'y') || (ch == 'Y')) && (zz == '\n')) {
                    printf("\n+++++\n\n");
                    break;
                } else if (((ch == 'n') || (ch == 'N')) && (zz == '\n'))
                    return EXIT_SUCCESS;
                else {
                    printf("無効な入力です。\n");
                    printf("yまたはnを入力してください。\n");
                    continue;
                }
            }
            break;
        case '0':
            return EXIT_SUCCESS;
            break;
        default:
            break;
        }
    }
}

// x, yの入力を行う関数
void inputXY(double *xp, double *yp)
{
    char line[100], zz;
    
    printf("2つの浮動小数点数x、yの値を入力してください。\n");
    
    // xの入力
    while (1) {
        printf("x = ? ");
        fgets(line, sizeof line, stdin);
        sscanf(line, "%lf%c", xp, &zz);
        line[strlen(line) - 1] = '\0';
        if (!isValidNumber(line)) {
            printf("無効な入力です。\n");
            printf("半角浮動小数点数を入力してください。\n");
            continue;
        } else
            break;
    }
    
    // yの入力
    while (1) {
        printf("y = ? ");
        fgets(line, sizeof line, stdin);
        sscanf(line, "%lf%c", yp, &zz);
        line[strlen(line) - 1] = '\0';
        if (!isValidNumber(line)) {
            printf("無効な入力です。\n");
            printf("半角浮動小数点数を入力してください。\n");
            continue;
        } else
            break;
    }
}

// 文字列が正しい形式の数値かどうかを判定する関数
int isValidNumber(char line[])
{
    int i = 0;
    
    // 最初は符号(省略可)
    if (line[i] == '+' || line[i] == '-')
        i++;
    // 次に数字(省略不可)
    if (!isdigit(line[i]))
        return 0;
    i++;
    // 次に数字列(省略可)
    while (isdigit(line[i]))
        i++;
    // 次に小数点(省略可)
    if (line[i] == '.') {
        i++;
        // 次に数字(小数点がある場合は省略不可、なければ省略可)
        if (!isdigit(line[i]))
            return 0;
        i++;
        // 次に数字列(省略可)
        while (isdigit(line[i]))
            i++;
    }
    // 次にeまたはE(省略可)
    if (line[i] == 'e' || line[i] == 'E') {
        i++;
        // 次に符号(省略可)
        if (line[i] == '+' || line[i] == '-')
            i++;
        // 次に数字(eまたはEがある場合は省略不可、なければ省略可)
        if (!isdigit(line[i]))
            return 0;
        i++;
        // 次に数字列(省略可)
        while (isdigit(line[i]))
            i++;
    }
    
    // 他に余計な文字がなければ真、あれば偽
    return line[i] == '\0';
}

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

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

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

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

// 現在日付時刻からファイル名を生成する関数
void makeFileName(char *filenamep)
{
    struct tm *t;
    time_t tt;
    char snumrand[10];
    
    time(&tt);
    t = localtime(&tt);
    
    srand((unsigned int)time(NULL));
    rand(); rand(); rand(); rand(); rand();
    
    sprintf(filenamep, "addsub_f%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);
    filenamep = strcat(filenamep, snumrand);
    filenamep = strcat(filenamep, ".txt");
    
    return;
}


addsub_f(Ver1.2)の実行結果】赤字はキーボードからの入力を表す。

D:\test>addsub_f
【浮動小数点数の加減の計算を行います】

次のいずれかを選択してください。

1.加算をする。
2.減算をする。
0.終了する。

0、1、2のどれですか? 1

【加算をします】

2つの浮動小数点数x、yの値を入力してください。
x = ? 1e2
y = ? +2.2e+02
(100.000000) + (220.000000) = 320.000000
ファイルに出力しますか?(y/n) y

続けますか?(y/n) y

+++++

【浮動小数点数の加減の計算を行います】

次のいずれかを選択してください。

1.加算をする。
2.減算をする。
0.終了する。

0、1、2のどれですか? 2

【減算をします】

2つの浮動小数点数x、yの値を入力してください。
x = ? 3.3e3
y = ? -1.2e+03
(3300.000000) - (-1200.000000) = 4500.000000
ファイルに出力しますか?(y/n) y

続けますか?(y/n) y

+++++

【浮動小数点数の加減の計算を行います】

次のいずれかを選択してください。

1.加算をする。
2.減算をする。
0.終了する。

0、1、2のどれですか? 0


【出力されたファイルaddsub_f20220403_210927_7643.txtの内容】

(100.000000) + (220.000000) = 320.000000
(3300.000000) - (-1200.000000) = 4500.000000

Ver1.1へ