2つの同じような関数のコードを簡素化できますか?比較用の関数 cmp3 と比較用の関数 cmpは似ているんですが、 まとめられますか。 関数get_dataと関数get_data2はにているけどこれもできるでしょうか? ご教授をおねがいたします。 コード #include <stdio.h> #include <time.h> #include <float.h> #include <ctype.h> #include <stdlib.h> #define MAX_STAGE 3 #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0) #define MAX_NUM 10 #define MAXCNT 100 char dtfile[] = "LACKNUM.DAT"; char dtfile2[]= "LACKNUM2.DAT";// ラックナンバーサーチ最短時間用のファイル char dtfile3[]= "LACKNUM3.DAT"; char dtfile4[]= "LACKNUM4.DAT";// ダブルナンバーサーチ最短時間用のファイル typedef struct { int tm_year; int tm_mon; int tm_mday; int tm_hour; int tm_min; int tm_sec; double score; } TIME_DATA; // --------------- 比較用の関数 cmp ------------------- int cmp(const void *p, const void *q) { double p_score=((TIME_DATA*)p)->score; double q_score=((TIME_DATA*)q)->score; if (p_score > q_score) return 1; else if(p_score < q_score) return -1; else return 0; } // --------------- 比較用の関数 cmp3 ------------------- int cmp3(const void *p3, const void *q3) { double p3_score=((TIME_DATA*)p3)->score; double q3_score=((TIME_DATA*)q3)->score; if (p3_score > q3_score) return 1; else if(p3_score < q3_score) return -1; else return 0; } //ラックナンバーリサーチトレーニング情報を取得・表示して最高得点を返す double get_data(int *count) { FILE *fp; // これまでの履歴を指すポインタ FILE *fp2; // これまでの最短所要時間を指すポインタ double score; //これまでの最短所要時間 double bestscore; //これまでの最短所要時間 int i; int year, mon, mday, hour, min, sec; TIME_DATA stars[MAXCNT]; if ((fp = fopen(dtfile, "rb")) == NULL) { printf("ファイルを作成します。\n\n"); bestscore = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ } else { for(i=0; i<MAXCNT; i++){ if(fscanf(fp, "%d %d %d %d %d %d %lf\n" , // 構造体配列への読み込み &stars[i].tm_year,&stars[i].tm_mon,&stars[i].tm_mday, &stars[i].tm_hour,&stars[i].tm_min,&stars[i].tm_sec,&stars[i].score)!=7) break; (*count)++; } printf("\ncount01:%d\n\n",*count); printf("前回の終了は%d年 %d月 %d日 %d時 %d分 %d秒 で\n\n", // 構造体配列への読み出し stars[*count-1].tm_year,stars[*count-1].tm_mon,stars[*count-1].tm_mday,stars[*count-1].tm_hour, stars[*count-1].tm_min,stars[*count-1].tm_sec,stars[*count-1].score); fflush(stdout); fclose(fp); } if ((fp2=fopen(dtfile2,"rb"))==NULL) { printf("本プログラムを実行するのは初めてですね。\n\n"); bestscore=DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ exit(1); } else { fscanf(fp2, "%d%d%d%d%d%d", &year, &mon, &mday, &hour, &min, &sec); fscanf(fp2, "%lf", &bestscore); // stream(fp)が指すストリームから&bestに読み込む //fscanf 関数は format が指す書式文字列に従って //stream(fp) が指すストリームからデータを読込み, //format(&year, &month, &day, &h, &m, &s) に続く引数の指すオブジェクトに代入します. printf("前回までの最高得点(最短所要時間)は%d年%d月%d日%d時%d分%d秒で\n", year, mon, mday, hour, min, sec); fflush(stdout); printf("これまでの最高得点(最短所要時間)は%.1f秒です。\n\n", bestscore); // 画面が一瞬で消えてしまうのを防止 // 一瞬で画面が消えてしまう場合には、//getchar(); // 以下の文を入力します。 fflush(stdout); fclose(fp2); } } //ダブルリサーチトレーニング情報を取得・表示して最高得点を返す double get_data2(int *count3) { FILE *fp3; /* これまでの履歴を指すポインタ */ FILE *fp4; /* これまでの最短所要時間を指すポインタ */ double score3; //これまでの履歴の所要時間 double bestscore2; //これまでの最短所要時間 int i; int year, mon, mday, hour, min, sec; TIME_DATA stars3[MAXCNT]; // 構造体配列の宣言 if ((fp3 = fopen(dtfile3, "rb")) == NULL) { printf("本プログラムを実行するのは初めてですね。\n\n"); bestscore2=DBL_MAX; // float.hに定義されている。double型で //表現できる最大値を表すマクロDBL_MAX exit(1); } else { for(i=0; i<MAXCNT; i++){ if(fscanf(fp3, "%d %d %d %d %d %d %lf\n" , // 構造体配列への読み込み &stars3[i].tm_year,&stars3[i].tm_mon,&stars3[i].tm_mday, &stars3[i].tm_hour,&stars3[i].tm_min,&stars3[i].tm_sec,&stars3[i].score)!=7) break; (*count3)++; } printf("\ncount01:%d\n\n",*count3); printf("前回の終了は%d年 %d月 %d日 %d時 %d分 %d秒 で\n\n", // 構造体配列への読み出し stars3[*count3-1].tm_year,stars3[*count3-1].tm_mon,stars3[*count3-1].tm_mday,stars3[*count3-1].tm_hour, stars3[*count3-1].tm_min,stars3[*count3-1].tm_sec,stars3[*count3-1].score); fflush(stdout); fclose(fp3); } if ((fp4=fopen(dtfile4,"rb"))==NULL) { printf("本プログラムを実行するのは初めてですね。\n\n"); bestscore2=DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ exit(1); } else { fscanf(fp3, "%d%d%d%d%d%d", &year, &mon, &mday, &hour, &min, &sec); fscanf(fp3, "%lf", &bestscore2); // stream(fp)が指すストリームから&bestに読み込む //fscanf 関数は format が指す書式文字列に従って //stream(fp) が指すストリームからデータを読込み, //format(&year, &month, &day, &h, &m, &s) に続く引数の指すオブジェクトに代入します. printf("前回までの最高得点(最短所要時間)は%d年%d月%d日%d時%d分%d秒で\n", year, mon, mday, hour, min, sec); fflush(stdout); printf("これまでの最高得点(最短所要時間)は%.1f秒です。\n\n", bestscore2); // 画面が一瞬で消えてしまうのを防止 // 一瞬で画面が消えてしまう場合には、//getchar(); // 以下の文を入力します。 fflush(stdout); fclose(fp3); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/10/12 10:29
退会済みユーザー
2017/10/17 11:16