質問編集履歴

3

コードの全面書き換え

2017/09/15 02:40

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,8 @@
1
1
  正常に動くプルグラムを見やすく改良したい。
2
2
 
3
- 具体的に教えていただければありがたいのですが。
3
+ 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よくわかりません
4
+
5
+ "getputch.h"をお知らせしたいのですが文字数がオーバーします。どうすれば送れますか?
4
6
 
5
7
  ```c言語
6
8
 
@@ -24,7 +26,7 @@
24
26
 
25
27
  #include <stdlib.h>
26
28
 
27
- #include <sys/types.h>
29
+ #include <sys/types.h>
28
30
 
29
31
  #include <unistd.h>
30
32
 
@@ -32,9 +34,9 @@
32
34
 
33
35
 
34
36
 
35
- #define MAX_STAGE 3
37
+ #define MAX_STAGE 3
36
-
38
+
37
- #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
39
+ #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
38
40
 
39
41
  #define MAX_NUM 10
40
42
 
@@ -42,664 +44,766 @@
42
44
 
43
45
  char dtfile[] = "LACKNUM.DAT";
44
46
 
47
+
48
+
49
+ // 最高記録用のファイル
50
+
45
- char dtfile2[] = "LACKNUM2.DAT";/* 最高記録用のファイル */
51
+ char dtfile2[] = "LACKNUM2.DAT";
46
52
 
47
53
 
48
54
 
49
55
  typedef struct {
50
56
 
51
- int tm_year;
57
+ int tm_year;
52
-
58
+
53
- int tm_mon;
59
+ int tm_mon;
54
-
60
+
55
- int tm_mday;
61
+ int tm_mday;
56
-
62
+
57
- int tm_hour;
63
+ int tm_hour;
58
-
64
+
59
- int tm_min;
65
+ int tm_min;
60
-
66
+
61
- int tm_sec;
67
+ int tm_sec;
62
-
68
+
63
- double best;
69
+ double score;
64
70
 
65
71
  } BEST_TEN;
66
72
 
67
73
 
68
74
 
69
- // --------------- 比較用の関数 cmp -------------------
75
+ // --- 比較用の関数 cmp ---
76
+
70
-
77
+ static int
78
+
71
- int cmpptr( const void *p, const void *q ) {
79
+ cmpptr( const void *p, const void *q ) {
72
-
80
+
73
- return (*(BEST_TEN**)p)->best - (*(BEST_TEN**)q)->best;
81
+ return (*(BEST_TEN**)p)->score - (*(BEST_TEN**)q)->score;
74
82
 
75
83
  }
76
84
 
77
- // ----------------------------------------------------
78
-
79
85
 
80
86
 
81
87
  //1回実行したとき進むポイントの大きさを求める
82
88
 
83
-
84
-
85
- int kaime_p(fpos_t* kaime_p1)
89
+ static int get_point_offset(fpos_t* offset) {
86
-
87
- {
90
+
88
-
89
- FILE *fp;
91
+ FILE *fp;
90
-
92
+
91
- struct tm local;
93
+ struct tm local;
92
-
94
+
93
- double best;
95
+ double score;
96
+
97
+
98
+
99
+ fp=fopen(dtfile, "rb");
100
+
101
+ if(fp==NULL) {
102
+
103
+ perror("fopen");
104
+
105
+ return -1;
106
+
107
+ }
108
+
109
+
110
+
111
+ if(fread(&local, sizeof(struct tm), 1, fp)<0) {
112
+
113
+ perror("fread");
114
+
115
+ fclose(fp);
116
+
117
+ return -1;
118
+
119
+ }
120
+
121
+
122
+
123
+ if(fread(&score, sizeof(double), 1, fp)<0) {
124
+
125
+ perror("fread");
126
+
127
+ fclose(fp);
128
+
129
+ return -1;
130
+
131
+ }
132
+
133
+
134
+
135
+ //ファイルポインタのfp位置を取得
136
+
137
+ if(fgetpos(fp, offset)!=0) {
138
+
139
+ perror("fgetpos");
140
+
141
+ fclose(fp);
142
+
143
+ return -1;
144
+
145
+ }
94
146
 
95
147
 
96
148
 
149
+ fclose(fp);
150
+
151
+
152
+
153
+ //offsetの示す場所に格納します。
154
+
155
+ printf("ファイルポインタの位置offsetは「%d」です。\n", *offset);
156
+
157
+
158
+
159
+
160
+
161
+ return 0;
162
+
163
+ }
164
+
165
+
166
+
167
+ //local のデータを新しい順にならべる。
168
+
169
+ static void update_local_data(fpos_t ft,int k) {
170
+
171
+ FILE *fp; // これまでの履歴を指すポインタ
172
+
173
+ double score; //これまでの履歴の所要時間
174
+
175
+ int i;
176
+
177
+
178
+
179
+ struct tm local; //構造体変数 localの大きさ
180
+
181
+
182
+
97
- fp = fopen(dtfile, "rb");
183
+ if((fp = fopen(dtfile,"rb"))==NULL) {
98
-
184
+
99
- fread(&local, sizeof(struct tm), 1, fp);
185
+ printf("ファイルを作成します。\n\n");
186
+
100
-
187
+ bestscore=DBL_MAX; // float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX
188
+
101
-
189
+ return;
190
+
102
-
191
+ }
192
+
193
+
194
+
103
- fread(&best, sizeof(double), 1, fp);
195
+ printf("最近の10回の点数とそれらの実行日時は\n\n");
196
+
197
+ for(i = ft - k; i >= ft - 10 * k; i -= k) { //構造体変数 localの大きさoffsetで44
104
198
 
105
199
 
106
200
 
107
- //ファイルポインタの位置を取得
108
-
109
- fgetpos(fp,kaime_p1); //ファイルfpの現在のファル位置取得して
201
+ if(fseek(fp, i, SEEK_SET) != 0) { //ファイルンタ先頭からiまで移動
110
-
202
+
111
- // kaime_p1の示す場所に格納します。
203
+ perror("fseek");
204
+
112
-
205
+ break;
206
+
207
+ }
208
+
209
+
210
+
211
+ if(fread(&local, sizeof(struct tm), 1, fp) < 0) {
212
+
213
+ perror("fread");
214
+
215
+ break;
216
+
217
+ }
218
+
219
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
220
+
221
+ local.tm_year + 1900, local.tm_mon + 1,
222
+
223
+ local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
224
+
225
+ if(fread(&score, sizeof(double), 1, fp) < 0) {
226
+
227
+ perror("fread");
228
+
229
+ break;
230
+
231
+ }
232
+
113
- printf("ファイルポインタの位置kaime_p1%d」です。\n",*kaime_p1);
233
+ printf("得点(所要時間)は%.1f秒\n\n", score);
234
+
114
-
235
+ }
115
-
116
-
236
+
117
- fclose(fp);
237
+ fclose(fp);
238
+
239
+
240
+
118
-
241
+ printf("enterキーで開始します。\n");
119
-
120
-
242
+
121
- return *kaime_p1;
243
+ fflush(stdout);
244
+
245
+ getchar();
122
246
 
123
247
  }
124
248
 
125
249
 
126
250
 
127
- //local い順にならべる。
128
-
129
- void new_local_data(fpos_t ft,int k)
130
-
131
- {
132
-
133
- FILE *fp; // これまでの履歴を指すポインタ
134
-
135
- FILE *fp2; // これまでの最短所要時間を指すポインタ
136
-
137
- double best; //これまでの履歴の所要時間
138
-
139
- double best2; //これまでの最短所要時間のベストテンも保存しておく
140
-
141
- int i;
142
-
143
-
144
-
145
- struct tm local;//構造体変数 localの大きさ
251
+ //過去トレニング情報取得・表示て最高得点を返す
252
+
253
+ static double get_data(int *count) {
254
+
255
+ FILE *fp; //これまでの履歴を指すポインタ
256
+
257
+ double score; //これまでの履歴の所要時間
258
+
259
+ double bestscore; //これまでの最短所要時間
260
+
261
+ int i,j=0;
262
+
263
+
264
+
265
+ BEST_TEN best_ten[100]={0};
266
+
267
+ BEST_TEN *plst[*count];
268
+
269
+ struct tm local;
270
+
271
+
272
+
273
+
274
+
275
+ if((fp = fopen(dtfile, "rb"))==NULL) {
276
+
277
+ printf("ファイルを作成します。\n\n");
278
+
279
+ bestscore = DBL_MAX; // float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX
280
+
281
+ return 0.0;
282
+
283
+ }
284
+
285
+
286
+
287
+ printf("\n過去の履歴\n-------------------------- \n");
288
+
289
+
290
+
291
+ while((i=fread(&local, sizeof(struct tm), 1, fp))>0 ){
292
+
293
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
294
+
295
+ local.tm_year + 1900, local.tm_mon + 1,
296
+
297
+ local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
298
+
299
+ fread(&score, sizeof(double), 1, fp);
300
+
301
+ printf("得点(所要時間)は%.1f秒\n\n", score);
302
+
303
+
304
+
305
+ best_ten[j].tm_year = local.tm_year;
306
+
307
+ best_ten[j].tm_mon = local.tm_mon;
308
+
309
+ best_ten[j].tm_mday = local.tm_mday;
310
+
311
+ best_ten[j].tm_hour = local.tm_hour;
312
+
313
+ best_ten[j].tm_min = local.tm_min;
314
+
315
+ best_ten[j].tm_sec = local.tm_sec;
316
+
317
+ best_ten[j].score = score;
318
+
319
+ j++;
320
+
321
+ (*count)++;
322
+
323
+ }
324
+
325
+ printf("count1は%d\n\n", *count);
326
+
327
+
328
+
329
+ for(i=0; i < *count; i++)
330
+
331
+ plst[i]=&best_ten[i];
332
+
333
+
334
+
335
+ //qsort(配列名, 配列の数, 配列一つのバイト数, 比較関数)
336
+
337
+ qsort(plst, *count, sizeof(BEST_TEN*), cmpptr);
338
+
339
+
340
+
341
+ printf("\n過去のscoreのbestscore10個\n-------------------------- \n");
342
+
343
+
344
+
345
+ // 並べ替え後の内容を表示
346
+
347
+ for (i=0;i<10; i++) {
348
+
349
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒 \n"
350
+
351
+ ,plst[i]->tm_year+1900, plst[i]->tm_mon+1, plst[i]->tm_mday,
352
+
353
+ plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec);
354
+
355
+ printf("得点(所要時間)は %.1f秒です。\n\n", plst[i]->score);
356
+
357
+ }
358
+
359
+
360
+
361
+ bestscore=plst[0]->score;
362
+
363
+
364
+
365
+ fflush(stdout);
366
+
367
+ fclose(fp);
368
+
369
+
370
+
371
+ printf("count2は%d\n\n", *count);
372
+
373
+ return bestscore;
374
+
375
+ }
376
+
377
+
378
+
379
+ //今回のトレーニング情報を書き込む
380
+
381
+ static int put_data(double score, double bestscore) {
382
+
383
+ FILE *fp; //fpはfopenされたdtfileを指すポインタ
384
+
385
+ FILE *fp2; //fp2はfopenされたdtfile2を指すポインタ、最短時間が格納されている
386
+
387
+ time_t t = time(NULL);
388
+
389
+ struct tm *local = localtime(&t);
390
+
391
+
392
+
393
+ time(&t);
394
+
395
+ local = localtime(&t);
396
+
397
+ if((fp = fopen(dtfile, "ab"))==NULL) {
398
+
399
+ printf("ファイルがありません");
400
+
401
+ fflush(stdout);
402
+
403
+ return -1;
404
+
405
+ }
406
+
407
+
408
+
409
+ if(fwrite(local, sizeof(struct tm), 1, fp)!=0) {
410
+
411
+ perror("fwrite");
412
+
413
+ fclose(fp);
414
+
415
+ return -1;
416
+
417
+ }
418
+
419
+
420
+
421
+ if(fwrite(&score, sizeof(double), 1, fp)!=0) {
422
+
423
+ perror("fwrite");
424
+
425
+ fclose(fp);
426
+
427
+ return -1;
428
+
429
+ }
430
+
431
+
432
+
433
+ fclose(fp);
434
+
435
+
436
+
437
+ if(score > bestscore) {
438
+
439
+ return 0;
440
+
441
+ }
442
+
443
+
444
+
445
+ if((fp2 = fopen(dtfile2, "wb"))==NULL) {
446
+
447
+ printf("ファイルがありません");
448
+
449
+ fflush(stdout);
450
+
451
+ return -1;
452
+
453
+ }
454
+
455
+
456
+
457
+ if(fwrite(local, sizeof(struct tm), 1, fp2)!=0) {
458
+
459
+ perror("fwrite");
460
+
461
+ fclose(fp);
462
+
463
+ return -1;
464
+
465
+ }
466
+
467
+
468
+
469
+ if (fwrite(&bestscore, sizeof(double), 1, fp2)!=0) { //fpに書き込む
470
+
471
+ perror("fwrite");
472
+
473
+ fclose(fp);
474
+
475
+ return -1;
476
+
477
+ }
478
+
479
+
480
+
481
+ fclose(fp2);
482
+
483
+ return 0;
484
+
485
+ }
486
+
487
+
488
+
489
+ //トレーニングを実行して得点(所要時間)を返す
490
+
491
+ static double do_training(void) {
492
+
493
+ int i, j, stage;
494
+
495
+ int dgt[9]={1, 2, 3, 4, 5, 6, 7, 8, 9};
496
+
497
+ int a[8];
498
+
499
+ double jikan; // 時間
500
+
501
+ clock_t start, end; // 開始時刻・終了時刻
502
+
503
+
504
+
505
+ printf("\n\n欠けている数字を入力してください。\n");
506
+
507
+ printf("スペースキーで開始します。\n");
508
+
509
+ while(getch()!=' ')
510
+
511
+ ;
512
+
513
+ start=time(NULL);
514
+
515
+
516
+
517
+ for(stage=0; stage < MAX_STAGE; stage++) {
518
+
519
+ int x=rand() % 9; // 0~8の乱数を発生 ,1から9までのうち8文字を表示するための数字
520
+
521
+ int no; // 読み込んだ値 ,キーボードから打ち込んだ数字
522
+
523
+
524
+
525
+ i=j=0;
146
526
 
147
527
 
148
528
 
149
- if ((fp = fopen(dtfile, "rb")) == NULL) {
150
-
151
- printf("ファイルを作成します。\n\n");
152
-
153
- best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
154
-
155
- } else {
156
-
157
- printf("最近の10回の点数とそれらの実行日時は\n\n");
158
-
159
- for(i=ft-k; i>=ft-10*k; i -= k){ //構造体変数 localの大きさkaime_p1で44
160
-
161
- //ファイルポインタを先頭からiまで移動
162
-
163
- fseek(fp,i,SEEK_SET);
164
-
165
-
166
-
167
- fread(&local, sizeof(struct tm), 1, fp);
168
-
169
- printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
170
-
171
- local.tm_year + 1900, local.tm_mon + 1,
172
-
173
- local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
174
-
175
- fread(&best, sizeof(double), 1, fp);
176
-
177
- printf("得点(所要時間)は%.1f秒\n\n", best);
178
-
179
- }
180
-
181
- printf("enterキーで開始します。\n");
182
-
183
- fflush(stdin);
184
-
185
- getchar();
186
-
187
- }
188
-
189
- fclose(fp);
190
-
191
-
529
+ // dgt[x]を飛ばしてコピー
530
+
531
+ while (i<9){
532
+
533
+ if (i!=x)
534
+
535
+ a[j++]=dgt[i]; // dgt[x]は1から9までの数字が入っている配列
536
+
537
+ i++;
538
+
539
+ }
540
+
541
+
542
+
543
+ for(i=7; i>0; i--) { // 配列aをシャッフル、配列の添字は0から7までの8個である
544
+
545
+ int j=rand()%(i + 1); //jは1から7まで変化する。
546
+
547
+
548
+
549
+ if(i!=j)
550
+
551
+ swap(int, a[i], a[j]); //iとjの添字でシャッフルする。
552
+
553
+ }
554
+
555
+
556
+
557
+ printf("%d回目:", stage+1);
558
+
559
+
560
+
561
+ // 全要素を表示
562
+
563
+ for(i=0; i<8; i++) {
564
+
565
+ printf("%d ", a[i]);
566
+
567
+ }
568
+
569
+ printf(":");
570
+
571
+ fflush(stdout);
572
+
573
+
574
+
575
+ do{
576
+
577
+ no=getch();
578
+
579
+ if(isprint(no)){ // 表示可能であれば
580
+
581
+ putch(no); // 押されたキーを表示
582
+
583
+ if(no!=dgt[x] + '0') // 正解でなければ
584
+
585
+ putch('\b'); // カーソルを一つ戻す
586
+
587
+ else
588
+
589
+ printf("\n"); // 改行
590
+
591
+ }
592
+
593
+ }while(no!=dgt[x] + '0');
594
+
595
+ }
596
+
597
+ end=time(NULL);
598
+
599
+
600
+
601
+ jikan=(double)difftime(end, start);
602
+
603
+
604
+
605
+ printf("%.1f秒かかりました。\n", jikan);
606
+
607
+
608
+
609
+ if(jikan>25.0)
610
+
611
+ printf("鈍すぎます。\n");
612
+
613
+ else if(jikan > 20.0)
614
+
615
+ printf("少し鈍いですね。\n");
616
+
617
+ else if(jikan > 17.0)
618
+
619
+ printf("まあまあですね。\n");
620
+
621
+ else
622
+
623
+ printf("素早いですね。\n");
624
+
625
+
626
+
627
+ return jikan;
192
628
 
193
629
  }
194
630
 
195
631
 
196
632
 
197
- /*--- 過去のトレーニング情報を取得・表示して最高得点を返す ---*/
198
-
199
- double get_data(int *count)
200
-
201
- {
202
-
203
- FILE *fp; /* これまでの履歴を指すポインタ */
204
-
205
- FILE *fp2; /* これまでの最短所要時間を指すポインタ */
206
-
207
- double best; //これまでの履歴の所要時間
208
-
209
- double best2; //これまでの最短所要時間
210
-
211
- int i,j=0;
212
-
213
- BEST_TEN best_ten[100]={0};
214
-
215
-
216
-
217
- if ((fp = fopen(dtfile, "rb")) == NULL) {
218
-
219
- printf("ファイルを作成します。\n\n");
220
-
221
- best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
222
-
223
- } else {
224
-
225
-
226
-
227
- struct tm local;
228
-
229
- double line[256];
230
-
231
-
232
-
233
- printf("\n過去の履歴\n-------------------------- \n");
234
-
235
-
236
-
237
- while((i = fread(&local, sizeof(struct tm), 1, fp)) > 0 ){
238
-
239
- printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
240
-
241
- local.tm_year + 1900, local.tm_mon + 1,
242
-
243
- local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
244
-
245
- fread(&best, sizeof(double), 1, fp);
246
-
247
- printf("得点(所要時間)は%.1f秒\n\n", best);
248
-
249
-
250
-
251
- best_ten[j].tm_year=local.tm_year;
252
-
253
- best_ten[j].tm_mon=local.tm_mon;
254
-
255
- best_ten[j].tm_mday=local.tm_mday;
256
-
257
- best_ten[j].tm_hour=local.tm_hour;
258
-
259
- best_ten[j].tm_min=local.tm_min;
260
-
261
- best_ten[j].tm_sec=local.tm_sec;
262
-
263
- best_ten[j].best=best;
264
-
265
- j++;
266
-
267
- (*count)++;
268
-
269
- }
270
-
271
- printf("count1は%d\n\n", *count);
272
-
273
- }
274
-
275
- BEST_TEN *plst[*count];
276
-
277
- for( i = 0; i < *count; i++ ) plst[i] = &best_ten[i];
633
+ int main(void) {
634
+
635
+ int retry, count=0; // もう一度?
636
+
637
+ double score; // 今回の所要時間
638
+
639
+ double bestscore; // 最短所要時間
640
+
641
+ //double jikan; // 時間
642
+
643
+ FILE *fp;
644
+
645
+ fpos_t ft;
646
+
647
+ fpos_t offset;
648
+
649
+ int k;
650
+
651
+
652
+
653
+ // get_data()で前回までの最短所要時間をbest2に格納する。
654
+
655
+ bestscore=get_data(&count);
656
+
657
+
658
+
659
+ // ファイルから読み込んでbestに代入する。
660
+
661
+ printf("bestscoreは%.1f\n\n", bestscore);
662
+
663
+ printf("count3は%d\n\n", count);
664
+
665
+
666
+
667
+ fp=fopen(dtfile, "rb");
668
+
669
+ if(fp==NULL) {
670
+
671
+ perror("fopen");
672
+
673
+ return -1;
674
+
675
+ }
676
+
677
+
678
+
679
+ if (get_point_offset(&offset)!=0) {
680
+
681
+ return -1;
682
+
683
+ }
684
+
685
+
686
+
687
+ k=offset;
688
+
689
+ //ファイルポインタの位置を取得
690
+
691
+ printf("mainのget_point_offset(&offset)後のkの値は「%d」です。\n\n", k);
692
+
693
+
694
+
695
+ //ファイルポインタを末尾まで移動
696
+
697
+ if (fseek(fp, 0, SEEK_END)!=0) {
698
+
699
+ perror("fseek");
700
+
701
+ return -1;
702
+
703
+ }
704
+
705
+
706
+
707
+ //ファイルポインタの位置を取得
708
+
709
+ //ファイルfpの現在のファイル位置を取得して
710
+
711
+ if (fgetpos(fp, &ft)!=0) {
712
+
713
+ perror("fgetpos");
714
+
715
+ fclose(fp);
716
+
717
+ return -1;
718
+
719
+ }
720
+
721
+
722
+
723
+ // &ftの示す場所に格納します。
724
+
725
+ update_local_data(ft, k);
726
+
727
+
728
+
729
+ if(fgetpos(fp, &ft)!=0) {
730
+
731
+ perror("fgetpos");
732
+
733
+ return -1;
734
+
735
+ }
736
+
737
+ fclose(fp);
738
+
739
+
740
+
741
+ //best = get_data(ft);
742
+
743
+ // get_data()で前回までの最短所要時間を
744
+
745
+ //ファイルから読み込んでbestに代入する。
746
+
747
+
748
+
749
+ //ライブラリの初期処理235p、initscr(),cbreak(),noecho(),refresh()
750
+
751
+ init_getputch();
752
+
753
+
754
+
755
+ // 乱数の種を初期化
756
+
757
+ srand(time(NULL));
758
+
759
+
760
+
761
+ do{
762
+
763
+ // トレーニング(do_training)で実行、返却された所要時間(jika)を
764
+
765
+ // scoreに代入する。
766
+
767
+ score=do_training();
278
768
 
279
769
 
280
770
 
281
- qsort( plst, *count, sizeof(BEST_TEN*), cmpptr );
771
+ if(score < bestscore){
282
-
283
-
284
-
285
-
286
-
772
+
287
- printf("\n過去のbestten\n-------------------------- \n");
773
+ printf("最短所要時間を更新しました!!\n");
288
-
774
+
289
- // 並べ替え後の内容を表示
775
+ // 最高得点更新
290
-
776
+
291
- for(i=0;i<10;i++){
777
+ bestscore=score;
292
-
293
- printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n"
294
-
295
- ,plst[i]->tm_year+1900, plst[i]->tm_mon+1, plst[i]->tm_mday,
296
-
297
- plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec );
298
-
299
- printf("得点(所要時間)は %.1f秒です。\n\n", plst[i]->best);
300
778
 
301
779
  }
302
780
 
303
- best=plst[0]->best;
304
-
305
- fflush(stdin);
306
-
307
- fclose(fp);
308
-
309
- printf("count2は%d\n\n", *count);
310
-
311
- return best;
312
-
313
- }
314
-
315
- /*--- 今回のトレーニング情報を書き込む ---*/
316
-
317
- void put_data(double best, double best2)
318
-
319
- {
320
-
321
- FILE *fp; //fpはfopenされたdtfileを指すポインタ
322
-
323
- FILE *fp2; //fp2はfopenされたdtfile2を指すポインタ、最短時間が格納されている
324
-
325
- time_t t = time(NULL);
326
-
327
- struct tm *local = localtime(&t);
328
-
329
-
330
-
331
- time(&t);
332
-
333
- local = localtime(&t);
334
-
335
- if ((fp = fopen(dtfile, "ab")) == NULL){
336
-
337
- printf("ファイルがあーりません");
338
-
339
- fflush(stdout);
340
-
341
- }else {
342
-
343
- fwrite(local, sizeof(struct tm), 1, fp); //fpに書き込む
344
-
345
- fwrite(&best, sizeof(double), 1, fp); //fpに書き込む
346
-
347
- fclose(fp);
348
-
349
- }
350
-
351
- if(best <= best2){
352
-
353
- if((fp2 = fopen(dtfile2, "wb")) ==NULL){
354
-
355
- printf("ファイルがあーりません");
356
-
357
- fflush(stdout);
358
-
359
- }else{
360
-
361
- //point配列にbestをいれ、best2をベスト2にいれる。dtfile[0]にbest1,dtfile[1]にbest2.....dtfile[9]にbest10
362
-
363
- fwrite(local, sizeof(struct tm), 1, fp2);
364
-
365
- fwrite(&best2, sizeof(double), 1, fp2);
366
-
367
- fclose(fp2);
368
-
369
- }
370
-
371
- }
372
-
373
- }
374
-
375
-
376
-
377
- /*--- トレーニングを実行して得点(所要時間)を返す ---*/
378
-
379
- double go(void)
380
-
381
- {
382
-
383
- int i, j, stage;
384
-
385
- int dgt[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
386
-
387
- int a[8];
388
-
389
- double jikan; // 時間
390
-
391
- clock_t start, end; // 開始時刻・終了時刻
392
-
393
-
394
-
395
- printf("\n\n欠けている数字を入力してください。\n");
396
-
397
- printf("スペースキーで開始します。\n");
398
-
399
- while (getch() != ' ')
400
-
401
- ;
402
-
403
- start = time(NULL);
404
-
405
-
406
-
407
- for (stage = 0; stage < MAX_STAGE; stage++) {
408
-
409
- int x = rand() % 9; /* 0~8の乱数を発生 ,1から9までのうち8文字を表示するための数字 */
410
-
411
- int no; /* 読み込んだ値 ,キーボードから打ち込んだ数字 */
412
-
413
-
414
-
415
- i = j = 0;
416
-
417
- while (i < 9) { /* dgt[x]を飛ばしてコピー */
418
-
419
- if (i != x)
420
-
421
- a[j++] = dgt[i];/* dgt[x]は1から9までの数字が入っている配列 */
422
-
423
- i++;
424
-
425
- }
426
-
427
-
428
-
429
-
430
-
431
- for (i = 7; i > 0; i--) { /* 配列aをシャッフル、配列の添字は0から7までの8個である */
432
-
433
- int j = rand() % (i + 1); /* 配列aの添字は0から7までの8個である。jは1から7まで変化する */
434
-
435
- if (i != j) /* jは1から7まで変化する。iとjの添字でシャッフルする。 */
436
-
437
- swap(int, a[i], a[j]);
438
-
439
- }
440
-
441
-
442
-
443
- printf("%d回目:", stage+1);
444
-
445
- for (i = 0; i < 8; i++){ /* 全要素を表示 */
446
-
447
- printf("%d ", a[i]);
448
-
449
- }
450
-
451
- printf(":");
452
-
453
- fflush(stdout);
454
-
455
-
456
-
457
- do {
458
-
459
- no = getch();
460
-
461
- if (isprint(no)) { /* 表示可能であれば */
462
-
463
- putch(no); /* 押されたキーを表示 */
464
-
465
- if (no != dgt[x] + '0') /* 正解でなければ */
466
-
467
- putch('\b'); /* カーソルを一つ戻す */
468
-
469
- else
470
-
471
- printf("\n"); /* 改行 */
472
-
473
- }
474
-
475
- } while (no != dgt[x] + '0');
476
-
477
- }
478
-
479
- end = time(NULL);
480
-
481
-
482
-
483
- jikan = (double)difftime(end, start);
484
-
485
-
486
-
487
- printf("%.1f秒かかりました。\n", jikan);
488
-
489
-
490
-
491
- if (jikan > 25.0)
492
-
493
- printf("鈍すぎます。\n");
494
-
495
- else if (jikan > 20.0)
496
-
497
- printf("少し鈍いですね。\n");
498
-
499
- else if (jikan > 17.0)
500
-
501
- printf("まあまあですね。\n");
502
-
503
- else
504
-
505
- printf("素早いですね。\n");
506
-
507
-
508
-
509
- return (jikan);
510
-
511
- }
512
-
513
-
514
-
515
- int main(void)
516
-
517
- {
518
-
519
- int retry,count=0; // もう一度?
520
-
521
- double score; // 今回の所要時間
522
-
523
- double best; // 最短所要時間
524
-
525
- double jikan; // 時間
526
-
527
- FILE *fp;
528
-
529
- fpos_t ft;
530
-
531
- fpos_t kaime_p1;
532
-
533
- struct tm local ;
534
-
535
- int k;
536
-
537
- int i, j, x, stage;
538
-
539
- best= get_data(&count); // get_data()で前回までの最短所要時間を
540
-
541
- // ファイルから読み込んでbestに代入する。
542
-
543
- printf("bestは%.1f\n\n", best);
544
-
545
- printf("count3は%d\n\n", count);
546
-
547
-
548
-
549
- fp = fopen(dtfile, "rb");
550
-
551
-
552
-
553
- kaime_p(&kaime_p1);
554
-
555
-
556
-
557
- k=kaime_p1;
558
-
559
- //ファイルポインタの位置を取得
560
-
561
- printf("mainのkaime_p(&kaime_p1)後のkの値は「%d」です。\n\n",k);
562
-
563
-
564
-
565
- //ファイルポインタを末尾まで移動
566
-
567
- fseek(fp,0,SEEK_END);
568
-
569
- //ファイルポインタの位置を取得
570
-
571
- fgetpos(fp,&ft); //ファイルfpの現在のファイル位置を取得して
572
-
573
- // &ftの示す場所に格納します。
574
-
575
-
576
-
577
- new_local_data(ft,k);
578
-
579
-
580
-
581
- fgetpos(fp,&ft);
582
-
583
-
584
-
585
- //best = get_data(ft);
586
-
587
- // get_data()で前回までの最短所要時間を
588
-
589
- //ファイルから読み込んでbestに代入する。
590
-
591
- init_getputch(); //ライブラリの初期処理235p、initscr(),cbreak(),noecho(),refresh()
592
-
593
- srand(time(NULL)); // 乱数の種を初期化
594
-
595
- do {
596
-
597
- score = go(); // トレーニング(go)で実行、返却された所要時間(jika)をscoreに代入する。
598
-
599
-
600
-
601
- if (score < best) {
602
-
603
- printf("最短所要時間を更新しました!!\n");
604
-
605
- best = score; /* 最高得点更新 */
606
-
607
- }
608
-
609
-
610
-
611
- printf("もう一度しますか … (0)いいえ (1)はい:");
612
-
613
- scanf("%d", &retry);
614
-
615
- } while (retry == 1);
616
-
617
-
618
-
619
- put_data(score,best); /* 今回の日付・時刻・得点を書き込む */
620
-
621
- fflush(stdout);
622
-
623
- fclose(fp);
624
-
625
-
626
-
627
- term_getputch(); //ライブラリの初期処理235p,endwin()
628
-
629
-
630
-
631
- return 0;
632
-
633
-
634
-
635
- }
636
-
637
- //参考意見、こうしたらどうですかという意見をいただいたのですが、うまく書き直せないのですが、教えてください。
638
-
639
- typedef struct tm TIME_DATA;
640
-
641
-
642
-
643
- typedef struct {
644
-
645
- TIME_DATA time;
646
-
647
- double score;
648
-
649
- } SCORE_DATA;
650
-
651
-
652
-
653
- size_t fread_score_data(SCORE_DATA *score_data, FILE *fp) {
654
-
655
- return fread(&score_data->time, sizeof(TIME_DATA), 1, fp)
656
-
657
- && fread(&score_data->score, sizeof(double), 1, fp);
658
-
659
- }
660
-
661
- void print_score_data(SCORE_DATA *score_data) {
662
-
663
- printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n",
664
-
665
- score_data->time.tm_year + 1900,
666
-
667
- score_data->time.tm_month + 1,
668
-
669
- score_data->time.tm_day,
670
-
671
- score_data->time.tm_hour,
672
-
673
- score_data->time.tm_min,
674
-
675
- score_data->time.tm_sec
676
-
677
- );
678
-
679
- printf("得点(所要時間)は %.1f秒です。\n\n",
680
-
681
- score_data->score
682
-
683
- );
684
-
685
- }
686
-
687
- double get_score(SCORE_DATA *score_data) {
688
-
689
- return score_data->score;
690
-
691
- }
781
+
782
+
783
+ printf("もう一度しますか … (0)いいえ (1)はい:");
784
+
785
+ retry=0;
786
+
787
+ scanf("%d", &retry);
788
+
789
+ } while (retry==1);
790
+
791
+
792
+
793
+ // 今回の日付・時刻・得点を書き込む
794
+
795
+ put_data(score,bestscore);
796
+
797
+ fflush(stdout);
798
+
799
+
800
+
801
+ //ライブラリの初期処理235p,endwin()
802
+
803
+ term_getputch();
804
+
805
+
806
+
807
+ return 0;
692
808
 
693
809
  ```
694
-
695
- /*
696
-
697
- C:\MinGW\users\chap09\kadai>gcc -I. -o kadai9-1 kadai9-1.c pdcurses.a
698
-
699
-
700
-
701
-
702
-
703
- C:\MinGW\users\chap09\kadai>kadai9-1
704
-
705
- */

2

初心者マークの追加

2017/09/15 02:39

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
File without changes

1

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

2017/09/14 00:44

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- グラムを見やすく改良したい
1
+ グラムを見やすく改良したい
test CHANGED
@@ -634,6 +634,62 @@
634
634
 
635
635
  }
636
636
 
637
+ //参考意見、こうしたらどうですかという意見をいただいたのですが、うまく書き直せないのですが、教えてください。
638
+
639
+ typedef struct tm TIME_DATA;
640
+
641
+
642
+
643
+ typedef struct {
644
+
645
+ TIME_DATA time;
646
+
647
+ double score;
648
+
649
+ } SCORE_DATA;
650
+
651
+
652
+
653
+ size_t fread_score_data(SCORE_DATA *score_data, FILE *fp) {
654
+
655
+ return fread(&score_data->time, sizeof(TIME_DATA), 1, fp)
656
+
657
+ && fread(&score_data->score, sizeof(double), 1, fp);
658
+
659
+ }
660
+
661
+ void print_score_data(SCORE_DATA *score_data) {
662
+
663
+ printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n",
664
+
665
+ score_data->time.tm_year + 1900,
666
+
667
+ score_data->time.tm_month + 1,
668
+
669
+ score_data->time.tm_day,
670
+
671
+ score_data->time.tm_hour,
672
+
673
+ score_data->time.tm_min,
674
+
675
+ score_data->time.tm_sec
676
+
677
+ );
678
+
679
+ printf("得点(所要時間)は %.1f秒です。\n\n",
680
+
681
+ score_data->score
682
+
683
+ );
684
+
685
+ }
686
+
687
+ double get_score(SCORE_DATA *score_data) {
688
+
689
+ return score_data->score;
690
+
691
+ }
692
+
637
693
  ```
638
694
 
639
695
  /*