実行結果が時間の短い順になっていない。大体は時間順になっています。
どこを直せばいいでしょうか。c言語でかいています。
構造体の定義や、名前のわかりにくさがありますが、とりあえずこれで正常に
うごくようにしてから、コードの修正をかんがえています。
もう何回も挑戦してここまでプログラムをつくりました。
前回作って正常に動くと思っていたのですが、ちゃんと動いていないことがわかり
苦戦しています(1か月くらい)。よろしくお願いします。
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";/* 最高記録用のファイル */ typedef struct { int tm_year; int tm_mon; int tm_mday; int tm_hour; int tm_min; int tm_sec; double score; } BEST_TEN; // --------------- 比較用の関数 cmp ------------------- int cmpptr( const void *p, const void *q ) { return (*(BEST_TEN**)p)->score - (*(BEST_TEN**)q)->score; } // ---------------------------------------------------- /*--- 過去のトレーニング情報を取得・表示して最高得点を返す ---*/ double get_data(int *count) { FILE *fp; // これまでの履歴を指すポインタ FILE *fp2; // これまでの最短所要時間を指すポインタ double score; //これまでの履歴の所要時間 double bestscore; //これまでの最短所要時間 int i,j=0; BEST_TEN best_ten[100]={0}; if ((fp = fopen(dtfile, "rb")) == NULL) { printf("ファイルを作成します。\n\n"); bestscore = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ } else { 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(&score, sizeof(double), 1, fp); printf("得点(所要時間)は%.1f秒\n\n", score); best_ten[j].tm_year=local.tm_year; best_ten[j].tm_mon=local.tm_mon; best_ten[j].tm_mday=local.tm_mday; best_ten[j].tm_hour=local.tm_hour; best_ten[j].tm_min=local.tm_min; best_ten[j].tm_sec=local.tm_sec; best_ten[j].score=score; j++; (*count)++; } printf("count1は%d\n\n", *count); } BEST_TEN *plst[*count]; for( i = 0; i < *count; i++ ) plst[i] = &best_ten[i]; //qsort(配列名, 配列の数, 配列一つのバイト数, 比較関数) qsort( plst, *count, sizeof(BEST_TEN*), cmpptr ); printf("\n過去のbestten\n-------------------------- \n"); // 並べ替え後の内容を表示 for(i=0;i<10;i++){ printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n" ,plst[i]->tm_year+1900, plst[i]->tm_mon+1, plst[i]->tm_mday, plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec ); printf("得点(所要時間)は %.1f秒です。\n\n", plst[i]->score); } bestscore=plst[0]->score; fflush(stdout); fclose(fp); printf("count2は%d\n\n", *count); return bestscore; } int main(void) { int count=0; // double score; // 今回の所要時間 double bestscore; // 最短所要時間 double jikan; // 時間 FILE *fp; struct tm local ; int k; int i, j, x, stage; bestscore= get_data(&count); // get_data()で前回までの最短所要時間を // ファイルから読み込んでbestscoreに代入する。 printf("bestscoreは%.1f\n\n", bestscore); printf("count3は%d\n\n", count); return 0; }
/*
C:\MinGW\users\chap09\kadai>gcc -I. -o kadai9-1-6 kadai9-1-6.c pdcurs
es.a
C:\MinGW\users\chap09\kadai>kadai9-1-5
過去の履歴
2015年 10月 27日 19時 9分 59秒
得点(所要時間)は11.0秒
2016年 1月 4日 19時 15分 11秒
得点(所要時間)は8.0秒
2016年 1月 4日 19時 16分 8秒
得点(所要時間)は9.0秒
省略
count1は66
過去のbestten
2017年 8月 14日 20時 57分 40秒
得点(所要時間)は 6.0秒です。
2017年 9月 9日 12時 14分 36秒
得点(所要時間)は 6.2秒です。
2016年 5月 2日 17時 0分 48秒
得点(所要時間)は 7.0秒です。
2017年 9月 9日 12時 3分 5秒
得点(所要時間)は 6.1秒です。//ここがおかしい
2016年 1月 4日 19時 15分 11秒
得点(所要時間)は 8.0秒です。
2016年 1月 4日 19時 21分 44秒
得点(所要時間)は 8.0秒です。
2017年 9月 9日 12時 4分 2秒
得点(所要時間)は 7.5秒です。//ここがおかしい
2017年 9月 9日 12時 38分 12秒
得点(所要時間)は 8.0秒です。
2016年 1月 31日 21時 12分 13秒
得点(所要時間)は 8.0秒です。
2017年 9月 9日 11時 28分 59秒
得点(所要時間)は 8.0秒です。
count2は66
bestscoreは6.0
count3は66
C:\MinGW\users\chap09\kadai>
*/