質問編集履歴
5
過去の履歴の後のwhile文に追加をしてコピーされているか確かめましたが。追加の文が間違っているようでどこが悪いのか指摘してください
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,30 +1,20 @@
|
|
1
|
-
|
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
|
-
|
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
|
-
}
|
27
|
+
}best_ten;
|
28
|
+
|
29
|
+
|
38
30
|
char dtfile[] = "LACKNUM.DAT";
|
39
|
-
|
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
|
-
|
39
|
+
FILE *fp,*lstfp;
|
48
|
-
double best
|
40
|
+
double best;
|
49
41
|
int count=0;
|
50
|
-
int i;
|
42
|
+
int i,j;
|
43
|
+
best_ten lst[count];
|
51
|
-
best_ten *plst[
|
44
|
+
best_ten *plst[count];
|
45
|
+
|
52
46
|
if ((fp = fopen(dtfile, "rb")) == NULL) {
|
53
|
-
|
47
|
+
printf("ファイルを作成します。\n\n");
|
54
|
-
|
48
|
+
best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
|
55
|
-
|
49
|
+
} else {
|
56
|
-
|
57
|
-
|
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(
|
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
|
-
|
82
|
+
fread(&best, sizeof(double), 1, lstfp);
|
87
|
-
|
83
|
+
printf("得点(所要時間)は %.1f秒です。\n\n", best);
|
88
|
-
|
84
|
+
|
89
|
-
// 一瞬で画面が消えてしまう場合には、以下の文を入力します。
|
90
|
-
|
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,
|
93
|
+
//qsort( plst, NDATA, sizeof(best_ten*), cmpptr );
|
105
94
|
|
106
95
|
// 並べ替え後の内容を表示
|
107
|
-
printf("\n並べ替え後の過去の履歴のベストテン
|
96
|
+
printf("\n並べ替え後の過去の履歴のベストテン\n-------------------------- \n");
|
97
|
+
// 並べ替え後の内容を表示
|
108
|
-
|
98
|
+
printf( "年, 月, 日,時,分,秒,\n" );
|
109
|
-
|
99
|
+
/*for( i = 0; i < NDATA; i++ ){
|
110
|
-
|
100
|
+
printf( "%4d年 %2d月 %2d日 %2d時 %2d分 %2d秒%.lf秒\n"
|
111
|
-
lst.tm_year + 1900, lst.tm_mon + 1,
|
112
|
-
|
101
|
+
, plst[i]->tm_year, plst[i]->tm_mon, plst[i]->tm_mday,
|
113
|
-
fread(&lstbest, sizeof(double), 1, lstfp);
|
114
|
-
|
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
文字のまちがいと、エラーの説明の追加
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関数の入れ替え
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
|
-
|
38
|
+
char dtfile[] = "LACKNUM.DAT";
|
32
|
-
|
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
|
-
|
51
|
+
best_ten *plst[NDATA];
|
42
|
-
{ {2015,10,27,19, 9,59,11.0} , {2016, 1, 4,19,15,11, 8.0}
|
43
|
-
|
52
|
+
if ((fp = fopen(dtfile, "rb")) == NULL) {
|
53
|
+
printf("ファイルを作成します。\n\n");
|
44
|
-
|
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
|
-
|
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,
|
104
|
+
qsort( plst, count, sizeof(best_ten*), cmpptr );
|
60
105
|
|
61
106
|
// 並べ替え後の内容を表示
|
107
|
+
printf("\n並べ替え後の過去の履歴のベストテンー\n-------------------------- \n");
|
62
|
-
|
108
|
+
while((i = fread(&lst, sizeof(struct tm), 1, lstfp)) > 0 ){
|
109
|
+
struct tm lst;
|
63
|
-
|
110
|
+
printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
|
111
|
+
lst.tm_year + 1900, lst.tm_mon + 1,
|
64
|
-
|
112
|
+
lst.tm_mday, lst.tm_hour, lst.tm_min, lst.tm_sec);
|
113
|
+
fread(&lstbest, sizeof(double), 1, lstfp);
|
65
|
-
|
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
|
128
|
+
$ gcc -o quick8d quick8d.c -lpdcursesw
|
72
129
|
|
73
130
|
...@naka ~/quick
|
74
|
-
$
|
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
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
全体的にコードの入れ替えを行い、行いたい事の明確化をしました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,143 +1,88 @@
|
|
1
|
-
|
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
|
-
|
4
|
+
```//【 構造体のポインタ配列を qsort するプログラム例 】
|
9
|
-
#include <time.h>
|
10
|
-
|
5
|
+
// best_ten型
|
11
6
|
|
7
|
+
// この各要素を指すポインタの配列を用意して、「best順」に qsort します。
|
12
|
-
|
8
|
+
// cmpptr 関数の内容
|
13
|
-
#include <string.h>
|
14
9
|
|
15
|
-
|
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
|
-
|
15
|
+
//比較するメンバは (**(ronbun_t**)p).id です。
|
19
|
-
|
16
|
+
// これを (*(ronbun_t**)p)->id と書いています。
|
20
|
-
#define MAX_NUM 10
|
21
|
-
#define BSIZE 44
|
22
17
|
|
18
|
+
*/
|
23
|
-
|
19
|
+
#include <stdio.h>
|
20
|
+
#include <stdlib.h>
|
21
|
+
#define NDATA ((sizeof lst)/(sizeof(best_ten)))
|
24
|
-
typedef struct
|
22
|
+
typedef struct {
|
23
|
+
int tm_year;
|
24
|
+
int tm_mon;
|
25
|
+
int tm_mday;
|
26
|
+
int tm_hour;
|
27
|
+
int tm_min;
|
25
|
-
|
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
|
-
|
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
|
-
|
30
|
+
} best_ten;
|
46
|
-
|
47
|
-
|
48
|
-
printf("\n過去の履歴\n-------------------------- \n");
|
49
31
|
|
50
|
-
|
32
|
+
// --------------- 比較用の関数 cmp -------------------
|
51
|
-
|
33
|
+
int cmpptr( const void *p, const void *q ) {
|
52
|
-
local3.tm_year + 1900, local3.tm_mon + 1,
|
53
|
-
|
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
|
-
/
|
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
|
-
|
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
|
-
|
48
|
+
best_ten *plst[NDATA];
|
87
|
-
{
|
88
49
|
|
89
|
-
int a,b;
|
90
|
-
init_getputch();
|
91
|
-
|
92
|
-
|
50
|
+
// ポインタの配列 plst に構造体配列のアドレスを代入
|
93
|
-
|
94
|
-
|
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
|
-
|
55
|
+
// best順にソート
|
97
|
-
|
56
|
+
// ポインタ配列plst[]の先頭アドレスがplst
|
57
|
+
qsort( plst, NDATA, sizeof(best_ten*), cmpptr );
|
58
|
+
|
59
|
+
// 並べ替え後の内容を表示
|
98
|
-
|
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
|
-
|
68
|
+
...@naka ~/quick
|
112
|
-
|
69
|
+
$ gcc -o quick8b quick8b.c -lpdcursesw
|
113
70
|
|
71
|
+
...@naka ~/quick
|
72
|
+
$ quick8b
|
73
|
+
年, 月, 日,時,分,秒,
|
114
|
-
2016年
|
74
|
+
2016年 1月 4日 19時 15分 11秒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
|
-
|
83
|
+
2015年 10月 27日 19時 9分 59秒11秒
|
116
84
|
|
117
|
-
2016年 1月 4日 19時 16分 39秒
|
118
|
-
得点(所要時間)は10.0秒
|
119
|
-
|
120
|
-
|
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
|
-
|
86
|
+
$
|
139
87
|
*/
|
140
|
-
|
141
|
-
|
142
|
-
|
143
88
|
```
|