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

質問編集履歴

5

過去の履歴の後のwhile文に追加をしてコピーされているか確かめましたが。追加の文が間違っているようでどこが悪いのか指摘してください

2016/01/20 09:13

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,30 +1,20 @@
1
- もともとのデータが char dtfile[]="LACKNUM.DAT"に入っています。時間、年,月、日、時、分、秒、best秒で入っています。れをbest秒の小さい順に並べ変えたいのですが、なかなかうまくできないので、構造体best_ten lst[]に直接自分で別の表示法で調べて、打ち込んでやってみたらとりあえず、並べ替えはできました。の構造体best_ten lst[]char dtfile[]="LACKNUM.DAT"からうまく移し変えれば、目的達成できるのですが、教えてください。
1
+ ```ここに言語入力
2
+ コード
3
+ ```もともとのデータが char dtfile[]="LACKNUM.DAT"に入っています。時間、年,月、日、時、分、秒、best秒で入っています。これをbest秒の小さい順に並べ変えたいのですが、なかなかうまくできないので、構造体best_ten lst[]に直接自分で別の表示法で調べて、打ち込んでやってみたらとりあえず、並べ替えはできました。この構造体best_ten lst[]にchar dtfile[]="LACKNUM.DAT"からうまく移し変えれば、目的を達成できるのですが、教えてください。
2
4
  main関数の差し替えをして、lstにはすでに"LACKNUM.DAT"が入った状態です。これを実行するとエラー(plst[i] = &lst[i];で)が出るのですが解決法をおねがいします。
3
- quick8d.c:85: error: subscripted value is neither array no
5
+
4
- r pointer
5
6
  いろいろやりましたが解決できないのでよろしくお願いします。
6
7
 
7
8
 
8
9
 
9
10
  ```//【 構造体のポインタ配列を qsort するプログラム例 】
10
- // best_ten型
11
11
 
12
- // この各要素を指すポインタの配列を用意して、「best順」に qsort します。
13
- // cmpptr 関数の内容
14
12
 
15
- // return (*(best_ten**)p)->id - (*(best_ten**)q)->id;
16
-
17
- //仮引数の p と q に渡されるのは、ポインタ配列 plst の配列要素を指すポインタです。
18
- //plst の配列要素の型は ronbun_t* ですから、p と q の型は ronbun_t** であり、
19
-
20
- //比較するメンバは (**(ronbun_t**)p).id です。
21
- // これを (*(ronbun_t**)p)->id と書いています。
22
-
23
- */
24
13
  #include <float.h> //追加
25
- #include <time.h> //追加
14
+ #include <time.h>
26
15
  #include <stdio.h>
27
16
  #include <stdlib.h>
17
+
28
18
  #define NDATA ((sizeof lst)/(sizeof(best_ten)))
29
19
  typedef struct {
30
20
  int tm_year;
@@ -34,9 +24,11 @@
34
24
  int tm_min;
35
25
  int tm_sec;
36
26
  double best;
37
- } best_ten;
27
+ }best_ten;
28
+
29
+
38
30
  char dtfile[] = "LACKNUM.DAT";
39
- char lst[] = "LACKNUM3.DAT";
31
+
40
32
  // --------------- 比較用の関数 cmp -------------------
41
33
  int cmpptr( const void *p, const void *q ) {
42
34
  return (*(best_ten**)p)->best - (*(best_ten**)q)->best;
@@ -44,19 +36,19 @@
44
36
  // ----------------------------------------------------
45
37
  int main()
46
38
  {
47
- FILE *fp,*lstfp;
39
+ FILE *fp,*lstfp;
48
- double best,lstbest;
40
+ double best;
49
41
  int count=0;
50
- int i;
42
+ int i,j;
43
+ best_ten lst[count];
51
- best_ten *plst[NDATA];
44
+ best_ten *plst[count];
45
+
52
46
  if ((fp = fopen(dtfile, "rb")) == NULL) {
53
- printf("ファイルを作成します。\n\n");
47
+ printf("ファイルを作成します。\n\n");
54
- best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
48
+ best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
55
- } else {
49
+ } else {
56
-
57
- struct tm local;
50
+ struct tm local;
58
51
  double line[256];
59
-
60
52
 
61
53
  printf("\n過去の履歴\n-------------------------- \n");
62
54
 
@@ -64,55 +56,53 @@
64
56
  printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
65
57
  local.tm_year + 1900, local.tm_mon + 1,
66
58
  local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
59
+
67
60
  fread(&best, sizeof(double),1, fp);
68
61
  printf("得点(所要時間)は%.1f秒\n\n",best);
69
- count++;
70
62
 
63
+
64
+ if ((lstfp = fopen(lst, "wb")) == NULL) { //ここから
65
+ printf("ファイルを作成します。\n\n");
66
+ best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
67
+ } else {
68
+ fwrite(&local,sizeof(struct tm), 1, lstfp);
69
+ fwrite(&best,sizeof(double), 1, lstfp);
70
+ } //ここまで追加
71
+ count++;
71
- }
72
+ }
73
+ }
72
74
  printf("countは%d \n\n",count);
73
- }
75
+
74
- if((lstfp =fopen(lst, "rb")) == NULL){
75
- printf("ファイルを作成します。 \n\n");
76
- lstbest = DBL_MAX;
77
- }else{
78
-
79
- struct tm lst;
80
-
81
76
  printf("\n過去の履歴のコピー\n-------------------------- \n");
82
- while((i = fread(&lst, sizeof(struct tm), 1, lstfp)) > 0 ){
77
+ while((i = fread(&lst, sizeof( best_ten), 1, lstfp)) > 0 ){
78
+
83
79
  printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
84
- lst.tm_year + 1900, lst.tm_mon + 1,
80
+ lst[i].tm_year + 1900, lst[i].tm_mon + 1,
85
- lst.tm_mday, lst.tm_hour, lst.tm_min, lst.tm_sec);
81
+ lst[i].tm_mday, lst[i].tm_hour, lst[i].tm_min, lst[i].tm_sec);
86
- fread(&lstbest, sizeof(double), 1, lstfp);
82
+ fread(&best, sizeof(double), 1, lstfp);
87
- printf("得点(所要時間)は %.1f秒です。\n\n", lstbest);
83
+ printf("得点(所要時間)は %.1f秒です。\n\n", best);
88
- // 画面が一瞬で消えてしまうのを防止
84
+
89
- // 一瞬で画面が消えてしまう場合には、以下の文を入力します。
90
- plst[i] = &lst[i];
85
+ //plst[i] = &lst[i];
91
- //これの設定がおかしいみたいですが、どう直せばいいのかわかりません。
92
- }
86
+ }
93
-
94
- }
87
+
95
-
96
-
97
88
  // ポインタの配列 plst に構造体配列のアドレスを代入
98
89
  // lst[0]のアドレスをplst[0]に代入する。順次NDATA個代入する。
99
90
  // lst[0]の{2015,10,27,19, 9,59,11.0}の先頭アドレスがplst[0]に代入される。
100
-
101
-
102
91
  // best順にソート
103
92
  // ポインタ配列plst[]の先頭アドレスがplst
104
- qsort( plst, count, sizeof(best_ten*), cmpptr );
93
+ //qsort( plst, NDATA, sizeof(best_ten*), cmpptr );
105
94
 
106
95
  // 並べ替え後の内容を表示
107
- printf("\n並べ替え後の過去の履歴のベストテン\n-------------------------- \n");
96
+ printf("\n並べ替え後の過去の履歴のベストテン\n-------------------------- \n");
97
+ // 並べ替え後の内容を表示
108
- while((i = fread(&lst, sizeof(struct tm), 1, lstfp)) > 0 ){
98
+ printf( "年, , ,時,分,秒,\n" );
109
- struct tm lst;
99
+ /*for( i = 0; i < NDATA; i++ ){
110
- printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
100
+ printf( "%4d年 %2d月 %2d日 %2d時 %2d分 %2d%.lf秒\n"
111
- lst.tm_year + 1900, lst.tm_mon + 1,
112
- lst.tm_mday, lst.tm_hour, lst.tm_min, lst.tm_sec);
101
+ , plst[i]->tm_year, plst[i]->tm_mon, plst[i]->tm_mday,
113
- fread(&lstbest, sizeof(double), 1, lstfp);
114
- printf("得点(所要時間)は %.1f秒です。\n\n", lstbest);
102
+ plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec ,plst[i]->best);
115
103
  }
104
+ // 画面が一瞬で消えてしまうのを防止
105
+ // 一瞬で画面が消えてしまう場合には、以下の文を入力します。*/
116
106
  fflush(stdin);
117
107
  getchar();
118
108
  fclose(fp);
@@ -120,16 +110,76 @@
120
110
  return 0;
121
111
  }
122
112
 
123
-
124
-
125
113
  /*実行結果
126
114
 
127
115
  ...@naka ~/quick
128
116
  $ gcc -o quick8d quick8d.c -lpdcursesw
117
+ quick8b.c: In function `main':
118
+ quick8b.c:66: warning: passing arg 1 of `fopen' from incom
119
+ patible pointer type
129
120
 
130
121
  ...@naka ~/quick
131
122
  $ quick8d
132
123
 
124
+ 過去の履歴
125
+ --------------------------
126
+ 2015年 10月 27日 19時 9分 59秒
127
+ 得点(所要時間)は11.0秒
128
+
129
+ ファイルを作成します。
130
+
131
+ 2016年 1月 4日 19時 15分 11秒
132
+ 得点(所要時間)は8.0秒
133
+
134
+ ファイルを作成します。
135
+
136
+ 2016年 1月 4日 19時 16分 8秒
137
+ 得点(所要時間)は9.0秒
138
+
139
+ ファイルを作成します。
140
+
141
+ 2016年 1月 4日 19時 16分 39秒
142
+ 得点(所要時間)は10.0秒
143
+
144
+ ファイルを作成します。
145
+
146
+ 2016年 1月 4日 19時 19分 7秒
147
+ 得点(所要時間)は10.0秒
148
+
149
+ ファイルを作成します。
150
+
151
+ 2016年 1月 4日 19時 21分 11秒
152
+ 得点(所要時間)は10.0秒
153
+
154
+ ファイルを作成します。
155
+
156
+ 2016年 1月 4日 19時 21分 44秒
157
+ 得点(所要時間)は8.0秒
158
+
159
+ ファイルを作成します。
160
+
161
+ 2016年 1月 4日 19時 22分 55秒
162
+ 得点(所要時間)は13.0秒
163
+
164
+ ファイルを作成します。
165
+
166
+ 2016年 1月 5日 21時 31分 52秒
167
+ 得点(所要時間)は12.0秒
168
+
169
+ ファイルを作成します。
170
+
171
+ 2016年 1月 5日 21時 33分 29秒
172
+ 得点(所要時間)は10.0秒
173
+
174
+ ファイルを作成します。
175
+
176
+ countは10
177
+
178
+
179
+ 過去の履歴のコピー
180
+ --------------------------
181
+
182
+
133
183
  ...@naka ~/quick
134
184
  $
135
185
  */

4

文字のまちがいと、エラーの説明の追加

2016/01/20 09:13

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,7 @@
2
2
  main関数の差し替えをして、lstにはすでに"LACKNUM.DAT"が入った状態です。これを実行するとエラー(plst[i] = &lst[i];で)が出るのですが解決法をおねがいします。
3
3
  quick8d.c:85: error: subscripted value is neither array no
4
4
  r pointer
5
- いろいろやります多が解決できないのでよろしくお願いします。
5
+ いろいろやりましたが解決できないのでよろしくお願いします。
6
6
 
7
7
 
8
8
 
@@ -88,7 +88,7 @@
88
88
  // 画面が一瞬で消えてしまうのを防止
89
89
  // 一瞬で画面が消えてしまう場合には、以下の文を入力します。
90
90
  plst[i] = &lst[i];
91
-
91
+ //これの設定がおかしいみたいですが、どう直せばいいのかわかりません。
92
92
  }
93
93
 
94
94
  }

3

include<float\.h>,include<time\.h> //追加とmain関数の入れ替え

2016/01/20 01:24

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,11 @@
1
1
  もともとのデータが char dtfile[]="LACKNUM.DAT"に入っています。時間、年,月、日、時、分、秒、best秒で入っています。これをbest秒の小さい順に並べ変えたいのですが、なかなかうまくできないので、構造体best_ten lst[]に直接自分で別の表示法で調べて、打ち込んでやってみたらとりあえず、並べ替えはできました。この構造体best_ten lst[]にchar dtfile[]="LACKNUM.DAT"からうまく移し変えれば、目的を達成できるのですが、教えてください。
2
+ main関数の差し替えをして、lstにはすでに"LACKNUM.DAT"が入った状態です。これを実行するとエラー(plst[i] = &lst[i];で)が出るのですが解決法をおねがいします。
3
+ quick8d.c:85: error: subscripted value is neither array no
4
+ r pointer
5
+ いろいろやります多が解決できないのでよろしくお願いします。
2
6
 
3
7
 
8
+
4
9
  ```//【 構造体のポインタ配列を qsort するプログラム例 】
5
10
  // best_ten型
6
11
 
@@ -16,6 +21,8 @@
16
21
  // これを (*(ronbun_t**)p)->id と書いています。
17
22
 
18
23
  */
24
+ #include <float.h> //追加
25
+ #include <time.h> //追加
19
26
  #include <stdio.h>
20
27
  #include <stdlib.h>
21
28
  #define NDATA ((sizeof lst)/(sizeof(best_ten)))
@@ -28,9 +35,8 @@
28
35
  int tm_sec;
29
36
  double best;
30
37
  } best_ten;
31
- //char dtfile[] = "LACKNUM.DAT";
38
+ char dtfile[] = "LACKNUM.DAT";
32
- //struct tm local;は実行した日付け
39
+ char lst[] = "LACKNUM3.DAT";
33
- //と実行時間が上の構造体と同じように入っていると思うので//すが
34
40
  // --------------- 比較用の関数 cmp -------------------
35
41
  int cmpptr( const void *p, const void *q ) {
36
42
  return (*(best_ten**)p)->best - (*(best_ten**)q)->best;
@@ -38,51 +44,91 @@
38
44
  // ----------------------------------------------------
39
45
  int main()
40
46
  {
47
+ FILE *fp,*lstfp;
48
+ double best,lstbest;
49
+ int count=0;
50
+ int i;
41
- best_ten lst[] =
51
+ best_ten *plst[NDATA];
42
- { {2015,10,27,19, 9,59,11.0} , {2016, 1, 4,19,15,11, 8.0}
43
- , {2016, 1, 4,19,16, 8, 9.0}, {2016, 1, 4,19,16,39,10.0}
52
+ if ((fp = fopen(dtfile, "rb")) == NULL) {
53
+ printf("ファイルを作成します。\n\n");
44
- , {2016, 1, 4,19,19, 7,10.0}, {2016, 1, 4,19,21,11,10.0}
54
+ best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
45
- , {2016, 1, 4,19,21,44, 8.0}, {2016, 1, 4,19,22,55,13.0}
46
- , {2016, 1, 5,21,31,52,12.0}, {2016, 1, 5,21,33,29,10.0},
47
- };
55
+ } else {
56
+
57
+ struct tm local;
58
+ double line[256];
59
+
48
60
 
49
- int i;
50
- best_ten *plst[NDATA];
61
+ printf("\n過去の履歴\n-------------------------- \n");
51
62
 
63
+ while((i = fread(&local, sizeof(struct tm), 1, fp)) > 0 ){
64
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
65
+ local.tm_year + 1900, local.tm_mon + 1,
66
+ local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
67
+ fread(&best, sizeof(double),1, fp);
68
+ printf("得点(所要時間)は%.1f秒\n\n",best);
69
+ count++;
70
+
71
+ }
72
+ printf("countは%d \n\n",count);
73
+ }
74
+ if((lstfp =fopen(lst, "rb")) == NULL){
75
+ printf("ファイルを作成します。 \n\n");
76
+ lstbest = DBL_MAX;
77
+ }else{
78
+
79
+ struct tm lst;
80
+
81
+ printf("\n過去の履歴のコピー\n-------------------------- \n");
82
+ while((i = fread(&lst, sizeof(struct tm), 1, lstfp)) > 0 ){
83
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
84
+ lst.tm_year + 1900, lst.tm_mon + 1,
85
+ lst.tm_mday, lst.tm_hour, lst.tm_min, lst.tm_sec);
86
+ fread(&lstbest, sizeof(double), 1, lstfp);
87
+ printf("得点(所要時間)は %.1f秒です。\n\n", lstbest);
88
+ // 画面が一瞬で消えてしまうのを防止
89
+ // 一瞬で画面が消えてしまう場合には、以下の文を入力します。
90
+ plst[i] = &lst[i];
91
+
92
+ }
93
+
94
+ }
95
+
96
+
52
97
  // ポインタの配列 plst に構造体配列のアドレスを代入
53
98
  // lst[0]のアドレスをplst[0]に代入する。順次NDATA個代入する。
54
99
  // lst[0]の{2015,10,27,19, 9,59,11.0}の先頭アドレスがplst[0]に代入される。
55
- for( i = 0; i < NDATA; i++ ) plst[i] = &lst[i];
56
100
 
101
+
57
102
  // best順にソート
58
103
  // ポインタ配列plst[]の先頭アドレスがplst
59
- qsort( plst, NDATA, sizeof(best_ten*), cmpptr );
104
+ qsort( plst, count, sizeof(best_ten*), cmpptr );
60
105
 
61
106
  // 並べ替え後の内容を表示
107
+ printf("\n並べ替え後の過去の履歴のベストテンー\n-------------------------- \n");
62
- for( i = 0; i < NDATA; i++ )
108
+ while((i = fread(&lst, sizeof(struct tm), 1, lstfp)) > 0 ){
109
+ struct tm lst;
63
- printf( "%4d年 %2d月 %2d日 %2d時 %2d分 %2d %.lf秒\n"
110
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
111
+ lst.tm_year + 1900, lst.tm_mon + 1,
64
- , plst[i]->tm_year, plst[i]->tm_mon, plst[i]->tm_mday,
112
+ lst.tm_mday, lst.tm_hour, lst.tm_min, lst.tm_sec);
113
+ fread(&lstbest, sizeof(double), 1, lstfp);
65
- plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec ,plst[i]->best);
114
+ printf("得点(所要時間)は %.1f秒です。\n\n", lstbest);
115
+ }
116
+ fflush(stdin);
117
+ getchar();
118
+ fclose(fp);
119
+ fclose(lstfp);
120
+ return 0;
66
121
  }
67
122
 
123
+
124
+
68
125
  /*実行結果
69
126
 
70
127
  ...@naka ~/quick
71
- $ gcc -o quick8b quick8b.c -lpdcursesw
128
+ $ gcc -o quick8d quick8d.c -lpdcursesw
72
129
 
73
130
  ...@naka ~/quick
74
- $ quick8b
131
+ $ quick8d
75
- 年, 月, 日,時,分,秒,
76
- 2016年 1月 4日 19時 15分 11秒8秒
77
- 2016年 1月 4日 19時 15分 11秒8秒
78
- 2016年 1月 4日 19時 15分 11秒8秒
79
- 2016年 1月 4日 19時 15分 11秒8秒
80
- 2016年 1月 4日 19時 15分 11秒8秒
81
- 2016年 1月 4日 19時 15分 11秒8秒
82
- 2016年 1月 4日 19時 15分 11秒8秒
83
- 2016年 1月 4日 19時 15分 11秒8秒
84
- 2016年 1月 4日 19時 15分 11秒8秒
85
- 2015年 10月 27日 19時 9分 59秒11秒
86
132
 
87
133
  ...@naka ~/quick
88
134
  $

2

LACKNUM\.DATはTM3と同じ構造体だと思います。intx6,douboulex1で44バイトで配列dtfile\[\]にLACKNUM\.\.DATを代入して表示できます。実行した日付でstruct

2016/01/20 01:19

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -28,7 +28,9 @@
28
28
  int tm_sec;
29
29
  double best;
30
30
  } best_ten;
31
-
31
+ //char dtfile[] = "LACKNUM.DAT";
32
+ //struct tm local;は実行した日付け
33
+ //と実行時間が上の構造体と同じように入っていると思うので//すが
32
34
  // --------------- 比較用の関数 cmp -------------------
33
35
  int cmpptr( const void *p, const void *q ) {
34
36
  return (*(best_ten**)p)->best - (*(best_ten**)q)->best;

1

全体的にコードの入れ替えを行い、行いたい事の明確化をしました。

2016/01/18 09:54

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,143 +1,88 @@
1
- ``````c
2
- 以下のように実行時間順に並んでいるプラグラムで、実行時間
3
- bestの短い順に並べ替えたい。並べ替える関数compfuncBestをつくり並べ替えたいのですが、うまくいかないので、ヒント、できればどこが悪いのか教えてください。
4
- ```
1
+ もともとのデータが char dtfile[]="LACKNUM.DAT"に入っています。時間、年,月、日、時、分、秒、best秒で入っています。これをbest秒の小さい順に並べ変えたいのですが、なかなかうまくできないので、構造体best_ten lst[]に直接自分で別の表示法で調べて、打ち込んでやってみたらとりあえず、並べ替えはできました。この構造体best_ten lst[]にchar dtfile[]="LACKNUM.DAT"からうまく移し変えれば、目的を達成できるのですが、教えてください。
5
2
 
6
- /*クイックソート*/
7
3
 
8
- #include <stdio.h>
4
+ ```//【 構造体のポインタ配列を qsort するプログラム例 】
9
- #include <time.h>
10
- #include <float.h>
5
+ // best_ten型
11
6
 
7
+ // この各要素を指すポインタの配列を用意して、「best順」に qsort します。
12
- #include <stdlib.h>
8
+ // cmpptr 関数の内容
13
- #include <string.h>
14
9
 
15
- #include "getputch.h"
10
+ // return (*(best_ten**)p)->id - (*(best_ten**)q)->id;
16
11
 
12
+ //仮引数の p と q に渡されるのは、ポインタ配列 plst の配列要素を指すポインタです。
13
+ //plst の配列要素の型は ronbun_t* ですから、p と q の型は ronbun_t** であり、
17
14
 
18
- #define MAX_STAGE 3
15
+ //比較するメンバは (**(ronbun_t**)p).id です。
19
- #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
16
+ // これを (*(ronbun_t**)p)->id と書いています。
20
- #define MAX_NUM 10
21
- #define BSIZE 44
22
17
 
18
+ */
23
- // time.h内での定義
19
+ #include <stdio.h>
20
+ #include <stdlib.h>
21
+ #define NDATA ((sizeof lst)/(sizeof(best_ten)))
24
- typedef struct tm3 {
22
+ typedef struct {
23
+ int tm_year;
24
+ int tm_mon;
25
+ int tm_mday;
26
+ int tm_hour;
27
+ int tm_min;
25
- int tm_sec;
28
+ int tm_sec;
26
- int tm_min;
27
- int tm_hour;
28
- int tm_mday;
29
- int tm_mon;
30
- int tm_year;
31
- double best;
29
+ double best;
32
- }TM3;
33
- char dtfile3[]="LACKNUM3.DAT";
34
- double get_data(void)
35
- {
36
- FILE *fp3; // これまでの履歴を指すポインタ
37
- int i;
38
- double best3; //これまでの履歴の所要時間
39
- TM3 local3;
40
- int count=0;
41
-
42
- if ((fp3 = fopen(dtfile3, "rb")) == NULL) {
43
- printf("ファイルを作成します。\n\n");
44
- best3 = DBL_MAX; // float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX
45
- } else {
30
+ } best_ten;
46
-
47
-
48
- printf("\n過去の履歴\n-------------------------- \n");
49
31
 
50
- while((i = fread(&local3, sizeof(struct tm), 1, fp3)) > 0 ){
32
+ // --------------- 比較用の関数 cmp -------------------
51
- printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
33
+ int cmpptr( const void *p, const void *q ) {
52
- local3.tm_year + 1900, local3.tm_mon + 1,
53
- local3.tm_mday, local3.tm_hour, local3.tm_min, local3.tm_sec);
34
+ return (*(best_ten**)p)->best - (*(best_ten**)q)->best;
54
- fread(&best3, sizeof(double), 1, fp3);
55
- printf("得点(所要時間)は%.1f秒\n\n", best3);
56
- count++;
57
- }
58
- }
59
-
60
- printf("要素数は%d\n\n", count);
61
-
62
-
63
-
64
- // 画面が一瞬で消えてしまうのを防止
65
- // 一瞬で画面が消えてしまう場合には、
66
- // 以下の文を入力します。
67
-
68
- fflush(stdin);
69
- getchar();
70
-
71
- fclose(fp3);
72
- return best3;
73
-
74
35
  }
75
-
76
- /*int compfuncBest(const void *a, const void *b)
36
+ // ----------------------------------------------------
37
+ int main()
77
38
  {
78
-
79
- double comp;
80
- comp = (dtfile3[*(int *)a].best3-dtfile3[*(int *)b].best3);
81
- if (comp<0.) return -1;
82
- else if (0.<comp) return 1;
83
- else return 0;
39
+ best_ten lst[] =
40
+ { {2015,10,27,19, 9,59,11.0} , {2016, 1, 4,19,15,11, 8.0}
41
+ , {2016, 1, 4,19,16, 8, 9.0}, {2016, 1, 4,19,16,39,10.0}
42
+ , {2016, 1, 4,19,19, 7,10.0}, {2016, 1, 4,19,21,11,10.0}
43
+ , {2016, 1, 4,19,21,44, 8.0}, {2016, 1, 4,19,22,55,13.0}
44
+ , {2016, 1, 5,21,31,52,12.0}, {2016, 1, 5,21,33,29,10.0},
84
- }*/
45
+ };
85
46
 
47
+ int i;
86
- int main(int argc,char *argv[])
48
+ best_ten *plst[NDATA];
87
- {
88
49
 
89
- int a,b;
90
- init_getputch();
91
-
92
- get_data(); //--- 過去ーニング情報取得・表示して最高得点を返す ---
50
+ // ポインタ配列 plst に構造体配列のアド代入
93
-
94
- //compfuncBest(&dtfile3[a], &dtfile3[b]);
51
+ // lst[0]のアドレスをplst[0]に代入する。順次NDATA個代入する。
95
-
52
+ // lst[0]の{2015,10,27,19, 9,59,11.0}の先頭アドレスがplst[0]に代入される。
53
+ for( i = 0; i < NDATA; i++ ) plst[i] = &lst[i];
54
+
96
- term_getputch();
55
+ // best順にソート
97
-
56
+ // ポインタ配列plst[]の先頭アドレスがplst
57
+ qsort( plst, NDATA, sizeof(best_ten*), cmpptr );
58
+
59
+ // 並べ替え後の内容を表示
98
- return 0;
60
+ for( i = 0; i < NDATA; i++ )
99
-
61
+ printf( "%4d年 %2d月 %2d日 %2d時 %2d分 %2d秒 %.lf秒\n"
62
+ , plst[i]->tm_year, plst[i]->tm_mon, plst[i]->tm_mday,
63
+ plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec ,plst[i]->best);
100
64
  }
101
65
 
102
- /*実行
66
+ /*実行結果
103
- 。。。。@naka ~/cd9-1
104
- $ gcc -o quick8 quick8.c -lpdcursesw
105
- $ quick8
106
- 過去の履歴
107
- --------------------------
108
- 2015年 10月 27日 19時 9分 59秒
109
- 得点(所要時間)は11.0秒
110
67
 
111
- 2016年 1月 4日 19時 15分 11秒
68
+ ...@naka ~/quick
112
- 得点(所要時間)は8.0秒
69
+ $ gcc -o quick8b quick8b.c -lpdcursesw
113
70
 
71
+ ...@naka ~/quick
72
+ $ quick8b
73
+ 年, 月, 日,時,分,秒,
114
- 2016年 1月 4日 19時 16分 8秒
74
+ 2016年 1月 4日 19時 1511秒8秒
75
+ 2016年 1月 4日 19時 15分 11秒8秒
76
+ 2016年 1月 4日 19時 15分 11秒8秒
77
+ 2016年 1月 4日 19時 15分 11秒8秒
78
+ 2016年 1月 4日 19時 15分 11秒8秒
79
+ 2016年 1月 4日 19時 15分 11秒8秒
80
+ 2016年 1月 4日 19時 15分 11秒8秒
81
+ 2016年 1月 4日 19時 15分 11秒8秒
82
+ 2016年 1月 4日 19時 15分 11秒8秒
115
- 得点(所要間)は9.0
83
+ 2015年 10月 27日 19 9分 5911秒
116
84
 
117
- 2016年 1月 4日 19時 16分 39秒
118
- 得点(所要時間)は10.0秒
119
-
120
- 2016年 1月 4日 19時 19分 7秒
85
+ ...@naka ~/quick
121
- 得点(所要時間)は10.0秒
122
-
123
- 2016年 1月 4日 19時 21分 11秒
124
- 得点(所要時間)は10.0秒
125
-
126
- 2016年 1月 4日 19時 21分 44秒
127
- 得点(所要時間)は8.0秒
128
-
129
- 2016年 1月 4日 19時 22分 55秒
130
- 得点(所要時間)は13.0秒
131
-
132
- 2016年 1月 5日 21時 31分 52秒
133
- 得点(所要時間)は12.0秒
134
-
135
- 2016年 1月 5日 21時 33分 29秒
136
- 得点(所要時間)は10.0秒
137
-
138
- 要素数は10
86
+ $
139
87
  */
140
-
141
-
142
-
143
88
  ```