質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1622閲覧

2つの同じようなコードを簡素化したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/10/12 06:28

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); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

比較用の関数 cmp3 と比較用の関数 cmpは似ているんですが、まとめられますか。

似ているもなんも、仮引数の名前が違うだけじゃないですか。
まとめられる/られない以前にこれは同じです。

関数get_dataと関数get_data2はにているけどこれもできるでしょうか?

ファイルのオープンに失敗したときの対応が違うだけですね。
そこ以降はまとめて大丈夫ですが... 対応を統一すればよいのでは?

どちらかというと、前々から言っているとおりに、構造体の入出力を関数にした方がいいです。
毎度毎度%d%d%d... と打つのは非効率的ですし、コードも汚れてバグの原因となります。

コメントを受けて

こんな感じでしょうか。
前も同じようなコードをお見せした覚えがありますが...

C

1typedef struct { 2 int tm_year; int tm_mon; int tm_mday; 3 int tm_hour; int tm_min; int tm_sec; 4 double score; 5} SCORE_DATUM; 6 7int print_score_datum(const SCORE_DATUM *src) { 8 return print_score_datum_w_format( 9 "%d年 %d月 %d日 %d時 %d分 %d秒: %f\n", src 10 ); 11} 12int print_score_datum_w_format(const char *format, const SCORE_DATUM *src) { 13 return printf(format, 14 src->tm_year, src->tm_mon, src->tm_mday, 15 src->tm_hour, src->tm_min, src->tm_sec, 16 src->score 17 ); 18} 19 20int fscanf_score_datum(FILE *fp, SCORE_DATUM *dst) { 21 return fscanf_score_datum_w_format( 22 fp, "%d%d%d%d%d%d%lf\n", dst 23 ); 24} 25int fscanf_score_datum_w_format(FILE *fp, const char *format, SCORE_DATUM *dst) { 26 return fscanf(fp, format, 27 &src->tm_year, &src->tm_mon, &src->tm_mday, 28 &src->tm_hour, &src->tm_min, &src->tm_sec, 29 &src->score 30 ); 31} 32 33int cmp_score_datum(const void *p, const void *q) { 34 double p_score=((SCORE_DATUM *)p)->score; 35 double q_score=((SCORE_DATUM *)q)->score; 36 37 if (p_score > q_score) return 1; 38 else if(p_score < q_score) return -1; 39 else return 0; 40}

投稿2017/10/12 06:36

編集2017/10/12 15:51
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/12 10:29

ありがとうございます。恥ずかしい話ですが、構造体の入出力を関数にする方法を具体例で 示してもらえませんか。やってみます。
退会済みユーザー

退会済みユーザー

2017/10/17 11:16

ここまでやってもらって、上手く書き換えることができなかたので、つぎにいきます。また同じようなコードが出てくると思いますが、その時また教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問