【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へ