c言語プログラミング ラックナンバーサーチ
実行時間の短い順に表示するプログラムを作成したいのですが、いろいろネットで検索して試みているのですが、なかなかできません。3ヶ月ほどかかっています。以下のコードを参考にしてどうすればいいか、ご教授してください。頭がこんがらがってなにがなんだかわかりません。
これは新明解C言語9章自由課題9-1の中の問題で、最近の10回を表示するプログラムの作成には
成功しましたが、ベストテンを表示する問題がなかなかうまくいきません。
本来最近の10回を表示するプログラムを添付すると、内容がはっきりするのですが、文字数の関係で載せられません。
/* ラックナンバーサーチ・トレーニング(最近の10回の日時・最高得点を表示)*/
#include <std最近の10回を表示するプログラムio.h>
#include <time.h>
#include <float.h>
#include <ctype.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include "getputch.h"
#define MAX_STAGE 3
#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
#define MAX_NUM 10
char dtfile[] = "LACKNUM.DAT"; /* ファイル名 */
char dtfile2[] = "LACKNUM2.DAT";/* 最高記録用のファイル */
double score2;
// 実行時間の短い順に並べて表示する。
int bestten(double best,double p_score)
{
FILE *fp; // これまでの履歴を指すポインタ
double past_score;
int i,N;
struct tm local;
if ((fp = fopen(dtfile, "rb")) == NULL) {
printf("ファイルを作成します。\n\n");
best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
} else {
while((i = fread(&local, sizeof(struct tm), 1, fp)) > 0 ){
fread(&best, sizeof(double), 1, fp);
past_score=best;
printf("過去の実行時間 %d\n\n",past_score);
// 比較関数を使って短い順に挿入する。あるいはdtfile[]を並べ替える
/* float型のソート */
qsort(best,N,sizeof(float),float_cmp);
for(i = 0; i < N; i++)
printf("%0.1f ",best[i]);
/* float型の比較 */
int float_cmp(const void *arg0, const void *arg1){
float past_score = *(float*)arg0;
float best = *(float*)arg1;
if(past_score == best) return 0;
else if(past_score > best) return 1;
else return -1;
}
}
}
if((fp = fopen(dtfile, "rb")) == NULL){
printf("\aファイルをオープンできません。\n");
}else{
while((i = fread(dtfile, sizeof(struct tm), 1, fp)) > 0 ){
printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
local.tm_year + 1900, local.tm_mon + 1,
local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
fread(&best, sizeof(double), 1, fp);
printf("得点(所要時間)は%.1f秒\n\n", best);
}
}
fclose(fp);
}
int main(void)
{
int retry; /* もう一度? */
double score; /* 今回の所要時間 */
double best; /* 最短所要時間 */
best = get_data(); // get_data()で前回までの最短所要時間を
// ファイルから読み込んでbestに代入する。
init_getputch();
srand(time(NULL)); /* 乱数の種を初期化 */
do {
score = go(); // トレーニング(go)で実行、返却された所要時間(jika)をscoreに代入する。
if (score < best) {
printf("最短所要時間を更新しました!!\n");
best = score; /* 最高得点更新 */
}
printf("もう一度しますか … (0)いいえ (1)はい:");
scanf("%d", &retry);
} while (retry == 1);
put_data(score,best); /* 今回の日付・時刻・得点を書き込む */
term_getputch();
return 0;
}