質問するログイン新規登録

回答編集履歴

2

追加回答

2016/01/20 02:52

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -13,3 +13,72 @@
13
13
  fread(lst, sizeof(best_ten), NDATA, fp);
14
14
  で纏めて読めば良いと思いますよ。
15
15
 
16
+ ---
17
+ 【1/20 10時の質問修正への回答です】
18
+ 色々触りすぎているようです。
19
+ とりあえず回答です。1/18最後のバージョンから下記2点のみ修正してます。(main関数内の先頭4行です。)
20
+ 0.lst配列の初期化を止め、10個データがあることが分かっているので10個固定で領域を確保しました。
21
+ 0.lst配列へのデータ読み込みを追加しました。
22
+ LACKNUM.DATのフォーマットに変更がないなら、読めるはずです。
23
+ ```C++
24
+ // best_ten型
25
+
26
+ // この各要素を指すポインタの配列を用意して、「best順」に qsort します。
27
+ // cmpptr 関数の内容
28
+
29
+ // return (*(best_ten**)p)->id - (*(best_ten**)q)->id;
30
+
31
+ //仮引数の p と q に渡されるのは、ポインタ配列 plst の配列要素を指すポインタです。
32
+ //plst の配列要素の型は ronbun_t* ですから、p と q の型は ronbun_t** であり、
33
+
34
+ //比較するメンバは (**(ronbun_t**)p).id です。
35
+ // これを (*(ronbun_t**)p)->id と書いています。
36
+
37
+ #include <stdio.h>
38
+ #include <stdlib.h>
39
+ #define NDATA ((sizeof lst)/(sizeof(best_ten)))
40
+ typedef struct {
41
+ int tm_year;
42
+ int tm_mon;
43
+ int tm_mday;
44
+ int tm_hour;
45
+ int tm_min;
46
+ int tm_sec;
47
+ double best;
48
+ } best_ten;
49
+
50
+ // --------------- 比較用の関数 cmp -------------------
51
+ int cmpptr( const void *p, const void *q ) {
52
+ return (*(best_ten**)p)->best - (*(best_ten**)q)->best;
53
+ }
54
+ // ----------------------------------------------------
55
+ int main()
56
+ {
57
+ best_ten lst[10];
58
+ FILE *fp = fopen("LACKNUM.DAT", "rb");
59
+ fread(lst, sizeof(best_ten), NDATA, fp);
60
+ fclose(fp);
61
+
62
+ int i;
63
+ best_ten *plst[NDATA];
64
+
65
+ // ポインタの配列 plst に構造体配列のアドレスを代入
66
+ // lst[0]のアドレスをplst[0]に代入する。順次NDATA個代入する。
67
+ // lst[0]の{2015,10,27,19, 9,59,11.0}の先頭アドレスがplst[0]に代入される。
68
+ for( i = 0; i < NDATA; i++ ) plst[i] = &lst[i];
69
+
70
+ // best順にソート
71
+ // ポインタ配列plst[]の先頭アドレスがplst
72
+ qsort( plst, NDATA, sizeof(best_ten*), cmpptr );
73
+
74
+ // 並べ替え後の内容を表示
75
+ for( i = 0; i < NDATA; i++ )
76
+ printf( "%4d年 %2d月 %2d日 %2d時 %2d分 %2d秒 %.lf秒\n"
77
+ , plst[i]->tm_year, plst[i]->tm_mon, plst[i]->tm_mday,
78
+ plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec ,plst[i]->best);
79
+ }
80
+ ```
81
+ エラー処理は手を抜いていますので、入れてみてください。
82
+ またデータ数は10個固定にしてしまってます。可変長にするのは結構難しいですので、もし可変長に対応されるのでしたら、次の課題とすることをお薦めします。
83
+
84
+ なお、本日のソースについてはnob.さんの回答を参考にされて下さい。

1

追記

2016/01/20 02:52

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -6,4 +6,10 @@
6
6
 
7
7
  > 3.編集欄の上の方に並んでいるB I A ◯ □ '' </>の</>を押してみてください。「ここに言語を入力」のところにC++、「コード」のところにプログラムをコピーアンドペーストすればOKです。
8
8
 
9
- 惜しいです。</>を押して表示される`'''ここに言語を入力`と`'''`の間に文章ではなくプログラムを入れて下さい。
9
+ 惜しいです。</>を押して表示される`'''ここに言語を入力`と`'''`の間に文章ではなくプログラムを入れて下さい。
10
+
11
+ ---
12
+ 【追記】
13
+ fread(lst, sizeof(best_ten), NDATA, fp);
14
+ で纏めて読めば良いと思いますよ。
15
+