c言語のプログラムで質問

// ラックナンバーサーチ・トレーニング

































#include <stdio.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;


//過去のトレーニング情報を取得・表示して最高得点を返す 
double get_data(void)
{
	FILE *fp;		// これまでの履歴を指すポインタ 
	FILE *fp2;		// これまでの最短所要時間を指すポインタ 
	double best;	//これまでの履歴の所要時間
    double best2;   //これまでの最短所要時間
	
	if ((fp = fopen(dtfile, "rb")) == NULL) {
		printf("ファイルを作成します。\n\n");
		best = DBL_MAX;  
	} else {
		int i;
        struct tm local;
        double line[256];

        printf("\n過去の履歴\n-------------------------- \n");

        while((i = fread(&local, 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); 
    }  
	if((fp2 =fopen(dtfile2, "rb")) == NULL){
         printf("ファイルを作成します。 \n\n");
         best = DBL_MAX;
    }else{
         struct tm local2;

         fread(&local2, sizeof(struct tm), 1, fp2);
         printf("これまでの最短所要時間の終了は%d年 %d月 %d日 %d時 %d分 %d秒\n",
                local2.tm_year + 1900, local2.tm_mon + 1,
                local2.tm_mday, local2.tm_hour, local2.tm_min, local2.tm_sec);
         fread(&best2, sizeof(double), 1, fp2);
         printf("これまでの最短所要時間は %.1f秒です。\n", best2);
         
    	fflush(stdin);
    	getchar();
    }
    fclose(fp2);
    return (best2);
}
//今回のトレーニング情報を書き込む 
void put_data(double best, double best2)
{
	FILE *fp;	//fpはfopenされたdtfileを指すポインタ
	FILE *fp2;  //fp2はfopenされたdtfile2を指すポインタ、最短時間が格納されている
	time_t	t = time(NULL);
	struct tm *local = localtime(&t);
	    
    time(&t);
    local = localtime(&t);
	if ((fp = fopen(dtfile, "ab")) == NULL){
		 printf("ファイルがあーりません");
		 fflush(stdout);
	}else {
		fwrite(local, sizeof(struct tm), 1, fp); //fpに書き込む
        fwrite(&best, sizeof(double), 1, fp);    //fpに書き込む
        fclose(fp);
    }
	if(best <= best2){
        if((fp2 = fopen(dtfile2, "wb")) ==NULL){
             printf("ファイルがあーりません");
             fflush(stdout);
        }else{
             fwrite(local, sizeof(struct tm), 1, fp2);
             fwrite(&best2, sizeof(double), 1, fp2);
             fclose(fp2);
        }
    }
}

//トレーニングを実行して得点（所要時間）を返す 
double go(void)
{
	int		i, j, stage;
	int		dgt[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
	int		a[8];
	double	jikan;				/* 時間 */
	clock_t	start, end;			/* 開始時刻・終了時刻 */

	printf("欠けている数字を入力してください。\n");
	printf("スペースキーで開始します。\n");
	while (getch() != ' ')
		;
	start = time(NULL);

	for (stage = 0; stage < MAX_STAGE; stage++) {
		int x = rand() % 9;		
		int	no;					

		i = j = 0;
		while (i < 9) {			
			if (i != x)
				a[j++] = dgt[i];
			i++;
		}

		for (i = 7; i > 0; i--) {		// 配列aをシャッフル、配列の添字は0から7までの8個である 
			int j = rand() % (i + 1);	// 配列aの添字は0から7までの8個である。jは1から7まで変化する */
			if (i != j)					// jは1から7まで変化する。iとjの添字でシャッフルする。 
				swap(int, a[i], a[j]);
		}
		
		printf("%d回目：", stage+1);
		for (i = 0; i < 8; i++){		// 全要素を表示 
			printf("%d ", a[i]);
		}
		printf("：");
		fflush(stdout);

		do {
			no = getch();
			if (isprint(no)) {				// 表示可能であれば 
				putch(no);					// 押されたキーを表示 
				if (no != dgt[x] + '0')		// 正解でなければ 
					putch('\b');			// カーソルを一つ戻す 
				else
					printf("\n");			
			}
		} while (no != dgt[x] + '0');
	}
	end = time(NULL);

	jikan = (double)difftime(end, start);

	printf("%.1f秒かかりました。\n", jikan);

	if (jikan > 25.0)
		printf("鈍すぎます。\n");
	else if (jikan > 20.0)
		printf("少し鈍いですね。\n");
	else if (jikan > 17.0)
		printf("まあまあですね。\n");
	else
		printf("素早いですね。\n");

	return (jikan);
}

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;
	
}
新明解C言語中級編の9章の自由課題１で最近の10回の点数と実行日時の
プログラムは悪戦苦闘の末なんとかできたのですが。所要時間の短い順に並べ替えるプログラムで行き詰まっています。でたらめなプログラムですが、bestten.cを以下に書きます。
ご容赦ください。
//　実行時間の短い順に並べて表示する。
int bestten(double best,double p_score)
{
   	FILE *fp;		        // これまでの履歴を指すポインタ 
	FILE *fp3;				// ベストテンの履歴を指すポインタ 
	double best;			// これまでの履歴の所要時間
	double best3;			// ベストテンの履歴の所要時間
    double past_score,best3_score;
    int i,;
    struct tm local;
    struct tm local3;
    
	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);
            // 過去のデータlocal の所要時間を短い順に挿入する。	   
    		if((fp3 = fopen(dtfile3, "ab")) == NULL){
        		printf("\aファイルをオープンできません。\n");
    		}else{
    		// dtfile3[]にbestの実行時間の短い順に挿入する。
    		// 比較関数を使って短い順に挿入する。
    		
    		int float_cmp(const void *, const void *);
    		
    		int   i;
      		float b[N];
      
    		/* float型のソート */
      			qsort(b,N,sizeof(float),float_cmp);
      			for(i = 0; i < N; i++)
        			printf("%0.1f ",b[i]);
        		
        		/* float型の比較 */
    			int float_cmp(const void *arg0, const void *arg1){
      			float a = *(float*)arg0;
      			float b = *(float*)arg1;
      			if(a == b)       return 0;
      			else if(a > b)   return 1;
      			else             return -1;
    		
    		
    		// bestとbest3の全てのデータを比べて適当な位置に挿入する。
    			while((i = fread(&local3, sizeof(struct tm), 1, fp3)) > 0 ){
					fread(&best3, sizeof(double), 1, fp3);
             		best3_score=best3;
             		printf("過去のbest3実行時間　%d\n\n",best3_score);
    			
    				if(p_score<=best3_score){
    				//best3_scoreから後を１つずつずらす。
    				//&best3にpast_scoreを代入
    		
    				}
    				}else{
    				//past_scoreとbest3_scoreの値を順番に比較しながら適当な位置に代入する
    		
    				}
    			}
    		}
    	}
    }
        	
    if((fp = fopen(dtfile3, "rb")) == NULL){
        printf("\aファイルをオープンできません。\n");
    }else{
        while((i = fread(dtfile3, sizeof(struct tm), 1, fp3)) > 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, fp3);
        printf("得点（所要時間）は%.1f秒\n\n", best3);
	    
    }
    fclose(fp3);
    fclose(fp);    	
}