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

質問編集履歴

3

コードの全面書き換え

2017/09/15 02:40

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,6 @@
1
1
  正常に動くプルグラムを見やすく改良したい。
2
- 具体的に教えていただければありがたいのですが。
2
+ 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よくわかりません
3
+ "getputch.h"をお知らせしたいのですが文字数がオーバーします。どうすれば送れますか?
3
4
  ```c言語
4
5
  コード
5
6
  // ラックナンバーサーチ・トレーニング
@@ -11,343 +12,394 @@
11
12
  #include <float.h>
12
13
  #include <ctype.h>
13
14
  #include <stdlib.h>
14
- #include <sys/types.h>
15
+ #include <sys/types.h>
15
16
  #include <unistd.h>
16
17
  #include "getputch.h"
17
18
 
18
- #define MAX_STAGE 3
19
+ #define MAX_STAGE 3
19
- #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
20
+ #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
20
21
  #define MAX_NUM 10
21
22
 
22
23
  char dtfile[] = "LACKNUM.DAT";
23
- char dtfile2[] = "LACKNUM2.DAT";/* 最高記録用のファイル */
24
24
 
25
+ // 最高記録用のファイル
26
+ char dtfile2[] = "LACKNUM2.DAT";
27
+
25
28
  typedef struct {
26
- int tm_year;
29
+ int tm_year;
27
- int tm_mon;
30
+ int tm_mon;
28
- int tm_mday;
31
+ int tm_mday;
29
- int tm_hour;
32
+ int tm_hour;
30
- int tm_min;
33
+ int tm_min;
31
- int tm_sec;
34
+ int tm_sec;
32
- double best;
35
+ double score;
33
36
  } BEST_TEN;
34
37
 
35
- // --------------- 比較用の関数 cmp -------------------
38
+ // --- 比較用の関数 cmp ---
39
+ static int
36
- int cmpptr( const void *p, const void *q ) {
40
+ cmpptr( const void *p, const void *q ) {
37
- return (*(BEST_TEN**)p)->best - (*(BEST_TEN**)q)->best;
41
+ return (*(BEST_TEN**)p)->score - (*(BEST_TEN**)q)->score;
38
42
  }
39
- // ----------------------------------------------------
40
43
 
41
44
  //1回実行したとき進むポイントの大きさを求める
45
+ static int get_point_offset(fpos_t* offset) {
46
+ FILE *fp;
47
+ struct tm local;
48
+ double score;
42
49
 
43
- int kaime_p(fpos_t* kaime_p1)
50
+ fp=fopen(dtfile, "rb");
51
+ if(fp==NULL) {
52
+ perror("fopen");
53
+ return -1;
44
- {
54
+ }
55
+
56
+ if(fread(&local, sizeof(struct tm), 1, fp)<0) {
57
+ perror("fread");
45
- FILE *fp;
58
+ fclose(fp);
46
- struct tm local;
59
+ return -1;
60
+ }
61
+
62
+ if(fread(&score, sizeof(double), 1, fp)<0) {
63
+ perror("fread");
47
- double best;
64
+ fclose(fp);
65
+ return -1;
66
+ }
67
+
68
+ //ファイルポインタのfp位置を取得
69
+ if(fgetpos(fp, offset)!=0) {
70
+ perror("fgetpos");
71
+ fclose(fp);
72
+ return -1;
73
+ }
48
74
 
49
- fp = fopen(dtfile, "rb");
75
+ fclose(fp);
50
- fread(&local, sizeof(struct tm), 1, fp);
51
76
 
52
- fread(&best, sizeof(double), 1, fp);
53
-
54
- //ファイルポインタの位置を取得
55
- fgetpos(fp,kaime_p1); //ファイルfpの現在のファイル位置を取得して
56
- // kaime_p1の示す場所に格納します。
77
+ //offsetの示す場所に格納します。
57
- printf("ファイルポインタの位置kaime_p1は「%d」です。\n",*kaime_p1);
78
+ printf("ファイルポインタの位置offsetは「%d」です。\n", *offset);
58
-
59
- fclose(fp);
79
+
60
-
80
+
61
- return *kaime_p1;
81
+ return 0;
62
82
  }
63
83
 
64
84
  //local のデータを新しい順にならべる。
65
- void new_local_data(fpos_t ft,int k)
85
+ static void update_local_data(fpos_t ft,int k) {
66
- {
67
- FILE *fp; // これまでの履歴を指すポインタ
86
+ FILE *fp; // これまでの履歴を指すポインタ
68
- FILE *fp2; // これまでの最短所要時間を指すポインタ
69
- double best; //これまでの履歴の所要時間
87
+ double score; //これまでの履歴の所要時間
70
- double best2; //これまでの最短所要時間のベストテンも保存しておく
71
- int i;
88
+ int i;
72
-
73
- struct tm local;//構造体変数 localの大きさ
74
-
75
- if ((fp = fopen(dtfile, "rb")) == NULL) {
76
- printf("ファイルを作成します。\n\n");
77
- best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
78
- } else {
79
- printf("最近の10回の点数とそれらの実行日時は\n\n");
80
- for(i=ft-k; i>=ft-10*k; i -= k){ //構造体変数 localの大きさkaime_p1で44
81
- //ファイルポインタを先頭からiまで移動
82
- fseek(fp,i,SEEK_SET);
83
-
84
- fread(&local, sizeof(struct tm), 1, fp);
85
- printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
86
- local.tm_year + 1900, local.tm_mon + 1,
87
- local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
88
- fread(&best, sizeof(double), 1, fp);
89
- printf("得点(所要時間)は%.1f秒\n\n", best);
90
- }
91
- printf("enterキーで開始します。\n");
92
- fflush(stdin);
93
- getchar();
94
- }
95
- fclose(fp);
96
-
97
- }
98
89
 
99
- /*--- 過去のトレーニング情報を取得・表示して最高得点を返す ---*/
100
- double get_data(int *count)
101
- {
102
- FILE *fp; /* これまでの履歴を指すポインタ */
103
- FILE *fp2; /* これまでの最短所要時間を指すポインタ */
104
- double best; //これまで履歴の所要時間
90
+ struct tm local; //構造体変数 local大きさ
105
- double best2; //これまでの最短所要時間
106
- int i,j=0;
107
- BEST_TEN best_ten[100]={0};
108
-
109
- if ((fp = fopen(dtfile, "rb")) == NULL) {
110
- printf("ファイルを作成します。\n\n");
111
- best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
112
- } else {
113
-
114
- struct tm local;
115
- double line[256];
116
-
117
- printf("\n過去の履歴\n-------------------------- \n");
118
91
 
119
- while((i = fread(&local, sizeof(struct tm), 1, fp)) > 0 ){
92
+ if((fp = fopen(dtfile,"rb"))==NULL) {
120
- printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
121
- local.tm_year + 1900, local.tm_mon + 1,
122
- local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
123
- fread(&best, sizeof(double), 1, fp);
124
- printf("得点(所要時間)は%.1f秒\n\n", best);
93
+ printf("ファイルを作成します。\n\n");
125
-
126
- best_ten[j].tm_year=local.tm_year;
127
- best_ten[j].tm_mon=local.tm_mon;
128
- best_ten[j].tm_mday=local.tm_mday;
129
- best_ten[j].tm_hour=local.tm_hour;
94
+ bestscore=DBL_MAX; // float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX
130
- best_ten[j].tm_min=local.tm_min;
131
- best_ten[j].tm_sec=local.tm_sec;
132
- best_ten[j].best=best;
133
- j++;
134
- (*count)++;
95
+ return;
135
- }
96
+ }
97
+
136
- printf("count1%d\n\n", *count);
98
+ printf("最近の10回の点数とそれらの実行日時は\n\n");
137
- }
138
- BEST_TEN *plst[*count];
139
- for( i = 0; i < *count; i++ ) plst[i] = &best_ten[i];
99
+ for(i = ft - k; i >= ft - 10 * k; i -= k) { //構造体変数 localの大きさoffsetで44
140
100
 
141
- qsort( plst, *count, sizeof(BEST_TEN*), cmpptr );
142
-
143
-
144
- printf("\n過去のbestten\n-------------------------- \n");
101
+ if(fseek(fp, i, SEEK_SET) != 0) { //ファイルポインタを先頭からiまで移動
145
- // 並べ替え後の内容を表示
146
- for(i=0;i<10;i++){
102
+ perror("fseek");
147
- printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n"
103
+ break;
148
- ,plst[i]->tm_year+1900, plst[i]->tm_mon+1, plst[i]->tm_mday,
149
- plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec );
150
- printf("得点(所要時間)は %.1f秒です。\n\n", plst[i]->best);
151
104
  }
152
- best=plst[0]->best;
105
+
153
- fflush(stdin);
154
- fclose(fp);
155
- printf("count2は%d\n\n", *count);
156
- return best;
157
- }
158
- /*--- 今回のトレーニング情報を書き込む ---*/
159
- void put_data(double best, double best2)
160
- {
161
- FILE *fp; //fpはfopenされたdtfileを指すポインタ
162
- FILE *fp2; //fp2はfopenされたdtfile2を指すポインタ、最短時間が格納されている
163
- time_t t = time(NULL);
164
- struct tm *local = localtime(&t);
165
-
166
- time(&t);
167
- local = localtime(&t);
168
- if ((fp = fopen(dtfile, "ab")) == NULL){
169
- printf("ファイルがあーりません");
170
- fflush(stdout);
171
- }else {
172
- fwrite(local, sizeof(struct tm), 1, fp); //fpに書き込む
106
+ if(fread(&local, sizeof(struct tm), 1, fp) < 0) {
173
- fwrite(&best, sizeof(double), 1, fp); //fpに書き込む
107
+ perror("fread");
174
- fclose(fp);
108
+ break;
175
109
  }
176
- if(best <= best2){
177
- if((fp2 = fopen(dtfile2, "wb")) ==NULL){
178
- printf("ファイルがあーりません");
110
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
179
- fflush(stdout);
180
- }else{
181
- //point配列にbestをいれ、best2をベスト2にいれる。dtfile[0]にbest1,dtfile[1]にbest2.....dtfile[9]にbest10
111
+ local.tm_year + 1900, local.tm_mon + 1,
182
- fwrite(local, sizeof(struct tm), 1, fp2);
112
+ local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
183
- fwrite(&best2, sizeof(double), 1, fp2);
113
+ if(fread(&score, sizeof(double), 1, fp) < 0) {
114
+ perror("fread");
184
- fclose(fp2);
115
+ break;
185
- }
186
116
  }
117
+ printf("得点(所要時間)は%.1f秒\n\n", score);
118
+ }
119
+ fclose(fp);
120
+
121
+ printf("enterキーで開始します。\n");
122
+ fflush(stdout);
123
+ getchar();
187
124
  }
188
125
 
189
- /*--- トレーニングを実行して得点(所要時間)を返す ---*/
126
+ //過去のトレーニング情報取得・表示して最高得点を返す
190
- double go(void)
191
- {
192
- int i, j, stage;
193
- int dgt[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
127
+ static double get_data(int *count) {
194
- int a[8];
128
+ FILE *fp; //これまでの履歴を指すポインタ
195
- double jikan; // 時間
129
+ double score; //これまでの履歴の所要時間
196
- clock_t start, end; // 開始刻・終了時刻
130
+ double bestscore; //これまでの最短所要
197
-
198
- printf("\n\n欠けている数字を入力してください。\n");
199
- printf("スペースキーで開始します。\n");
131
+ int i,j=0;
132
+
200
- while (getch() != ' ')
133
+ BEST_TEN best_ten[100]={0};
201
- ;
134
+ BEST_TEN *plst[*count];
202
- start = time(NULL);
135
+ struct tm local;
136
+
203
137
 
204
- for (stage = 0; stage < MAX_STAGE; stage++) {
138
+ if((fp = fopen(dtfile, "rb"))==NULL) {
139
+ printf("ファイルを作成します。\n\n");
205
- int x = rand() % 9; /* 0~8の乱数を発生 ,1から9まのうち8文字を表るための数字 */
140
+ bestscore = DBL_MAX; // float.hに定義されている。double型表現できる最大値を表すマクロDBL_MAX
206
- int no; /* 読み込んだ値 ,キーボードから打ち込んだ数字 */
141
+ return 0.0;
142
+ }
207
143
 
208
- i = j = 0;
209
- while (i < 9) { /* dgt[x]を飛ばしてコピー */
144
+ printf("\n過去の履歴\n-------------------------- \n");
210
- if (i != x)
211
- a[j++] = dgt[i];/* dgt[x]は1から9までの数字が入っている配列 */
212
- i++;
213
- }
214
145
 
215
-
216
- for (i = 7; i > 0; i--) { /* 配列aをシャッフル、配列の添字は0から7までの8個である */
217
- int j = rand() % (i + 1); /* 配列aの添字は0から7までの8個である。jは1から7まで変化する */
218
- if (i != j) /* jは1から7まで変化する。iとjの添字でシャッフルする。 */
146
+ while((i=fread(&local, sizeof(struct tm), 1, fp))>0 ){
147
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
148
+ local.tm_year + 1900, local.tm_mon + 1,
149
+ local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
219
- swap(int, a[i], a[j]);
150
+ fread(&score, sizeof(double), 1, fp);
220
- }
221
-
222
- printf("%d回目:", stage+1);
151
+ printf("得点(所要時間)は%.1f秒\n\n", score);
223
- for (i = 0; i < 8; i++){ /* 全要素を表示 */
224
- printf("%d ", a[i]);
225
- }
226
- printf(":");
227
- fflush(stdout);
228
-
229
- do {
230
- no = getch();
231
- if (isprint(no)) { /* 表示可能であれば */
232
- putch(no); /* 押されたキーを表示 */
233
- if (no != dgt[x] + '0') /* 正解でなければ */
234
- putch('\b'); /* カーソルを一つ戻す */
235
- else
236
- printf("\n"); /* 改行 */
237
- }
238
- } while (no != dgt[x] + '0');
239
- }
240
- end = time(NULL);
241
152
 
153
+ best_ten[j].tm_year = local.tm_year;
154
+ best_ten[j].tm_mon = local.tm_mon;
155
+ best_ten[j].tm_mday = local.tm_mday;
156
+ best_ten[j].tm_hour = local.tm_hour;
157
+ best_ten[j].tm_min = local.tm_min;
158
+ best_ten[j].tm_sec = local.tm_sec;
159
+ best_ten[j].score = score;
160
+ j++;
161
+ (*count)++;
162
+ }
242
- jikan = (double)difftime(end, start);
163
+ printf("count1は%d\n\n", *count);
243
164
 
244
- printf("%.1f秒かかりました。\n", jikan);
165
+ for(i=0; i < *count; i++)
166
+ plst[i]=&best_ten[i];
245
167
 
246
- if (jikan > 25.0)
247
- printf("鈍すぎます。\n");
168
+ //qsort(配列名, 配列の数, 配列一つのバイト数, 比較関数)
248
- else if (jikan > 20.0)
249
- printf("少し鈍いですね。\n");
169
+ qsort(plst, *count, sizeof(BEST_TEN*), cmpptr);
250
- else if (jikan > 17.0)
251
- printf("まあまあですね。\n");
252
- else
253
- printf("素早いですね。\n");
254
170
 
171
+ printf("\n過去のscoreのbestscore10個\n-------------------------- \n");
172
+
173
+ // 並べ替え後の内容を表示
174
+ for (i=0;i<10; i++) {
175
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒 \n"
176
+ ,plst[i]->tm_year+1900, plst[i]->tm_mon+1, plst[i]->tm_mday,
177
+ plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec);
178
+ printf("得点(所要時間)は %.1f秒です。\n\n", plst[i]->score);
179
+ }
180
+
181
+ bestscore=plst[0]->score;
182
+
183
+ fflush(stdout);
184
+ fclose(fp);
185
+
186
+ printf("count2は%d\n\n", *count);
255
- return (jikan);
187
+ return bestscore;
256
188
  }
257
189
 
258
- int main(void)
259
- {
260
- int retry,count=0; // もう一度?
261
- double score; // 今回の所要時間
262
- double best; // 最短所要時間
263
- double jikan; // 時間
264
- FILE *fp;
265
- fpos_t ft;
266
- fpos_t kaime_p1;
267
- struct tm local ;
268
- int k;
269
- int i, j, x, stage;
270
- best= get_data(&count); // get_data()で前回までの最短所要時間を
271
- // ファイルから読み込んでbestに代入する。
272
- printf("bestは%.1f\n\n", best);
273
- printf("count3は%d\n\n", count);
274
-
275
- fp = fopen(dtfile, "rb");
276
-
277
- kaime_p(&kaime_p1);
278
-
279
- k=kaime_p1;
280
- //ファイルポインタの位置を取得
281
- printf("mainのkaime_p(&kaime_p1)後のkの値は「%d」です。\n\n",k);
282
-
283
- //ファイルポイ末尾まで移動
190
+ //今回のトレーニグ情報書き込む
284
- fseek(fp,0,SEEK_END);
285
- //ファイルポインタの位置を取得
191
+ static int put_data(double score, double bestscore) {
286
- fgetpos(fp,&ft); //ファイルfpの現在のファイル位置取得して
192
+ FILE *fp; //fpはfopenされたdtfile指すポインタ
287
- // &ftの示す場所に格納します。
288
-
289
- new_local_data(ft,k);
290
-
291
- fgetpos(fp,&ft);
292
-
293
- //best = get_data(ft);
294
- // get_data()で前回までの最短所要時間を
295
- //ファイルから読み込んでbestに代入する。
296
- init_getputch(); //ライブラリの初期処理235p、initscr(),cbreak(),noecho(),refresh()
297
- srand(time(NULL)); // 乱数の種を初期化
298
- do {
299
- score = go(); // トレーニング(go)で実行、返却された所要時間(jika)scoreに代入する
193
+ FILE *fp2; //fp2はfopenされたdtfile2ポインタ、最短時間が格納されてい
194
+ time_t t = time(NULL);
195
+ struct tm *local = localtime(&t);
300
196
 
197
+ time(&t);
301
- if (score < best) {
198
+ local = localtime(&t);
199
+ if((fp = fopen(dtfile, "ab"))==NULL) {
302
- printf("最短所要時間を更新しした!!\n");
200
+ printf("ファイルがありせん");
303
- best = score; /* 最高得点更新 */
201
+ fflush(stdout);
202
+ return -1;
304
- }
203
+ }
305
204
 
306
- printf("もう一度しますか (0)いいえ (1)はい:");
205
+ if(fwrite(local, sizeof(struct tm), 1, fp)!=0) {
307
- scanf("%d", &retry);
206
+ perror("fwrite");
207
+ fclose(fp);
308
- } while (retry == 1);
208
+ return -1;
209
+ }
309
210
 
310
- put_data(score,best); /* 今回の日付・時刻・得点を書き込む */
211
+ if(fwrite(&score, sizeof(double), 1, fp)!=0) {
212
+ perror("fwrite");
213
+ fclose(fp);
214
+ return -1;
215
+ }
216
+
217
+ fclose(fp);
218
+
219
+ if(score > bestscore) {
220
+ return 0;
221
+ }
222
+
223
+ if((fp2 = fopen(dtfile2, "wb"))==NULL) {
224
+ printf("ファイルがありません");
311
- fflush(stdout);
225
+ fflush(stdout);
226
+ return -1;
227
+ }
228
+
229
+ if(fwrite(local, sizeof(struct tm), 1, fp2)!=0) {
230
+ perror("fwrite");
312
- fclose(fp);
231
+ fclose(fp);
313
-
232
+ return -1;
233
+ }
234
+
314
- term_getputch(); //ライブラリの初期処理235p,endwin()
235
+ if (fwrite(&bestscore, sizeof(double), 1, fp2)!=0) { //fpに書き込む
315
-
236
+ perror("fwrite");
237
+ fclose(fp);
238
+ return -1;
239
+ }
240
+
241
+ fclose(fp2);
316
- return 0;
242
+ return 0;
317
-
318
243
  }
319
- //参考意見、こうしたらどうですかという意見をいただいたのですが、うまく書き直せないのですが、教えてください。
320
- typedef struct tm TIME_DATA;
321
244
 
245
+ //トレーニングを実行して得点(所要時間)を返す
322
- typedef struct {
246
+ static double do_training(void) {
323
- TIME_DATA time;
247
+ int i, j, stage;
248
+ int dgt[9]={1, 2, 3, 4, 5, 6, 7, 8, 9};
324
- double score;
249
+ int a[8];
325
- } SCORE_DATA;
250
+ double jikan; // 時間
251
+ clock_t start, end; // 開始時刻・終了時刻
326
252
 
253
+ printf("\n\n欠けている数字を入力してください。\n");
254
+ printf("スペースキーで開始します。\n");
255
+ while(getch()!=' ')
256
+ ;
257
+ start=time(NULL);
258
+
327
- size_t fread_score_data(SCORE_DATA *score_data, FILE *fp) {
259
+ for(stage=0; stage < MAX_STAGE; stage++) {
328
- return fread(&score_data->time, sizeof(TIME_DATA), 1, fp)
260
+ int x=rand() % 9; // 0~8の乱数を発生 ,1から9までのうち8文字を表示するための数字
261
+ int no; // 読み込んだ値 ,キーボードから打ち込んだ数字
262
+
263
+ i=j=0;
264
+
265
+ // dgt[x]を飛ばしてコピー
266
+ while (i<9){
267
+ if (i!=x)
268
+ a[j++]=dgt[i]; // dgt[x]は1から9までの数字が入っている配列
269
+ i++;
270
+ }
271
+
329
- && fread(&score_data->score, sizeof(double), 1, fp);
272
+ for(i=7; i>0; i--) { // 配列aをシャッフル、配列の添字は0から7までの8個である
273
+ int j=rand()%(i + 1); //jは1から7まで変化する。
274
+
275
+ if(i!=j)
276
+ swap(int, a[i], a[j]); //iとjの添字でシャッフルする。
277
+ }
278
+
279
+ printf("%d回目:", stage+1);
280
+
281
+ // 全要素を表示
282
+ for(i=0; i<8; i++) {
283
+ printf("%d ", a[i]);
284
+ }
285
+ printf(":");
286
+ fflush(stdout);
287
+
288
+ do{
289
+ no=getch();
290
+ if(isprint(no)){ // 表示可能であれば
291
+ putch(no); // 押されたキーを表示
292
+ if(no!=dgt[x] + '0') // 正解でなければ
293
+ putch('\b'); // カーソルを一つ戻す
294
+ else
295
+ printf("\n"); // 改行
296
+ }
297
+ }while(no!=dgt[x] + '0');
298
+ }
299
+ end=time(NULL);
300
+
301
+ jikan=(double)difftime(end, start);
302
+
303
+ printf("%.1f秒かかりました。\n", jikan);
304
+
305
+ if(jikan>25.0)
306
+ printf("鈍すぎます。\n");
307
+ else if(jikan > 20.0)
308
+ printf("少し鈍いですね。\n");
309
+ else if(jikan > 17.0)
310
+ printf("まあまあですね。\n");
311
+ else
312
+ printf("素早いですね。\n");
313
+
314
+ return jikan;
330
315
  }
331
- void print_score_data(SCORE_DATA *score_data) {
332
- printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n",
333
- score_data->time.tm_year + 1900,
334
- score_data->time.tm_month + 1,
335
- score_data->time.tm_day,
336
- score_data->time.tm_hour,
337
- score_data->time.tm_min,
338
- score_data->time.tm_sec
339
- );
340
- printf("得点(所要時間)は %.1f秒です。\n\n",
341
- score_data->score
342
- );
343
- }
344
- double get_score(SCORE_DATA *score_data) {
345
- return score_data->score;
346
- }
347
- ```
348
- /*
349
- C:\MinGW\users\chap09\kadai>gcc -I. -o kadai9-1 kadai9-1.c pdcurses.a
350
316
 
317
+ int main(void) {
318
+ int retry, count=0; // もう一度?
319
+ double score; // 今回の所要時間
320
+ double bestscore; // 最短所要時間
321
+ //double jikan; // 時間
322
+ FILE *fp;
323
+ fpos_t ft;
324
+ fpos_t offset;
325
+ int k;
351
326
 
327
+ // get_data()で前回までの最短所要時間をbest2に格納する。
328
+ bestscore=get_data(&count);
329
+
330
+ // ファイルから読み込んでbestに代入する。
331
+ printf("bestscoreは%.1f\n\n", bestscore);
352
- C:\MinGW\users\chap09\kadai>kadai9-1
332
+ printf("count3は%d\n\n", count);
333
+
334
+ fp=fopen(dtfile, "rb");
335
+ if(fp==NULL) {
336
+ perror("fopen");
337
+ return -1;
338
+ }
339
+
340
+ if (get_point_offset(&offset)!=0) {
341
+ return -1;
342
+ }
343
+
344
+ k=offset;
345
+ //ファイルポインタの位置を取得
346
+ printf("mainのget_point_offset(&offset)後のkの値は「%d」です。\n\n", k);
347
+
348
+ //ファイルポインタを末尾まで移動
349
+ if (fseek(fp, 0, SEEK_END)!=0) {
350
+ perror("fseek");
351
+ return -1;
352
+ }
353
+
354
+ //ファイルポインタの位置を取得
355
+ //ファイルfpの現在のファイル位置を取得して
356
+ if (fgetpos(fp, &ft)!=0) {
357
+ perror("fgetpos");
358
+ fclose(fp);
359
+ return -1;
360
+ }
361
+
362
+ // &ftの示す場所に格納します。
363
+ update_local_data(ft, k);
364
+
365
+ if(fgetpos(fp, &ft)!=0) {
366
+ perror("fgetpos");
367
+ return -1;
368
+ }
369
+ fclose(fp);
370
+
371
+ //best = get_data(ft);
372
+ // get_data()で前回までの最短所要時間を
373
+ //ファイルから読み込んでbestに代入する。
374
+
375
+ //ライブラリの初期処理235p、initscr(),cbreak(),noecho(),refresh()
376
+ init_getputch();
377
+
378
+ // 乱数の種を初期化
379
+ srand(time(NULL));
380
+
381
+ do{
382
+ // トレーニング(do_training)で実行、返却された所要時間(jika)を
383
+ // scoreに代入する。
384
+ score=do_training();
385
+
386
+ if(score < bestscore){
387
+ printf("最短所要時間を更新しました!!\n");
388
+ // 最高得点更新
389
+ bestscore=score;
390
+ }
391
+
392
+ printf("もう一度しますか … (0)いいえ (1)はい:");
353
- */
393
+ retry=0;
394
+ scanf("%d", &retry);
395
+ } while (retry==1);
396
+
397
+ // 今回の日付・時刻・得点を書き込む
398
+ put_data(score,bestscore);
399
+ fflush(stdout);
400
+
401
+ //ライブラリの初期処理235p,endwin()
402
+ term_getputch();
403
+
404
+ return 0;
405
+ ```

2

初心者マークの追加

2017/09/15 02:39

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
File without changes

1

タイトルのタイプミスの修正。構造体の変更方法について

2017/09/14 00:44

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- グラムを見やすく改良したい
1
+ グラムを見やすく改良したい
body CHANGED
@@ -316,6 +316,34 @@
316
316
  return 0;
317
317
 
318
318
  }
319
+ //参考意見、こうしたらどうですかという意見をいただいたのですが、うまく書き直せないのですが、教えてください。
320
+ typedef struct tm TIME_DATA;
321
+
322
+ typedef struct {
323
+ TIME_DATA time;
324
+ double score;
325
+ } SCORE_DATA;
326
+
327
+ size_t fread_score_data(SCORE_DATA *score_data, FILE *fp) {
328
+ return fread(&score_data->time, sizeof(TIME_DATA), 1, fp)
329
+ && fread(&score_data->score, sizeof(double), 1, fp);
330
+ }
331
+ void print_score_data(SCORE_DATA *score_data) {
332
+ printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n",
333
+ score_data->time.tm_year + 1900,
334
+ score_data->time.tm_month + 1,
335
+ score_data->time.tm_day,
336
+ score_data->time.tm_hour,
337
+ score_data->time.tm_min,
338
+ score_data->time.tm_sec
339
+ );
340
+ printf("得点(所要時間)は %.1f秒です。\n\n",
341
+ score_data->score
342
+ );
343
+ }
344
+ double get_score(SCORE_DATA *score_data) {
345
+ return score_data->score;
346
+ }
319
347
  ```
320
348
  /*
321
349
  C:\MinGW\users\chap09\kadai>gcc -I. -o kadai9-1 kadai9-1.c pdcurses.a