質問編集履歴

4

/\* getch/putch用ヘッダ "getputch\.h" \*/のコードの追加

2017/07/08 04:47

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,459 +1,661 @@
1
+ ```
2
+
3
+ void pos_training(void)の
4
+
5
+ /* ブロックを選択させる */
6
+
7
+
8
+
9
+ do {
10
+
11
+ printf("番号(練習中止は99):");
12
+
13
+ scanf("%d\n", &temp);
14
+
15
+ if (temp == 99) return; /* 練習中止 */
16
+
17
+ } while (temp < 1 || temp > 8);
18
+
19
+ とMenu SelectMenu(void)のdo {
20
+
21
+ printf("\n練習を選択してください。\n");
22
+
23
+ printf("(1) 単純ポジション (2) 複合ポジション\n");
24
+
25
+ printf("(3) C言語の単語 (4) 英会話 (0) 終了 :");
26
+
27
+ scanf("%d\n", &ch);
28
+
29
+ } while (ch < Term || ch >= InValid);
30
+
31
+ でprintf("番号(練習中止は99):")と(0) 終了 :のあとに番号が
32
+
33
+ すぐに出てこないでenter2回押しで表示されますが、すっきりしないのですが。
34
+
35
+ 番号を入力と同時に表示する方法をお願い致します。
36
+
37
+
38
+
39
+ /* 総合タイピング練習 1部省略しています*/
40
+
41
+
42
+
43
+ #include <time.h>
44
+
45
+ #include <stdio.h>
46
+
47
+ #include <stdlib.h>
48
+
49
+ #include <string.h>
50
+
51
+ #include "getputch.h"
52
+
53
+
54
+
55
+ #define NO 3 /* トレーニング回数 */
56
+
57
+ #define KTYPE 16 /* ブロック数 */
58
+
59
+ #define POS_LEN 10 /* ポジショントレーニングの文字数,
60
+
61
+ 10個の文字がランダムに出題される */
62
+
63
+
64
+
65
+ /*--- 練習メニュー ---*/
66
+
67
+ typedef enum { Term, KeyPos, KeyPosComp, Clang, Conversation, InValid } Menu;
68
+
69
+
70
+
71
+ /*--- 各ブロックのキー ---*/
72
+
73
+ const char *kstr[] = {
74
+
75
+ "12345", "67890-^\\", /* 第1段 */
76
+
77
+ "!\"#$%", "&'()=~|", /* 第1段 [Shift] */
78
+
79
+ "qwert", "yuiop@[", /* 第2段 */
80
+
81
+ "QWERT", "YUIOP`{", /* 第2段 [Shift] */
82
+
83
+ "asdfg", "hjkl;:]", /* 第3段 */
84
+
85
+ "ASDFG", "HJKL+*}", /* 第3段 [Shift] */
86
+
87
+ "zxcvb", "nm,./\\", /* 第4段 */
88
+
89
+ "ZXCVB", "NM<>?_", /* 第4段 [Shift] */
90
+
91
+ };
92
+
93
+
94
+
95
+ /*--- 文字列strを表示してタイプ練習(ミス回数を返す) ---*/
96
+
97
+ int go(const char *str)
98
+
99
+ {
100
+
101
+ int i;
102
+
103
+ int len = strlen(str); /* 文字数 */
104
+
105
+ int mistake = 0; /* ミス回数 */
106
+
107
+
108
+
109
+ for (i = 0; i < len; i++) {
110
+
111
+
112
+
113
+ /* str[i]以降を表示してカーソルを先頭へ戻す,正解すると文字が1ずつ消えて行く */
114
+
115
+ printf("%s \r", &str[i]);
116
+
117
+
118
+
119
+ while (getch() != str[i]) { /* getch()はタイプされた文字を返す */
120
+
121
+ mistake++;
122
+
123
+ }
124
+
125
+ }
126
+
127
+ return (mistake);
128
+
129
+ }
130
+
131
+
132
+
133
+
134
+
135
+ /*--- 単純ポジショントレーニング ---*/
136
+
137
+ void pos_training(void)
138
+
139
+ {
140
+
141
+ int i;
142
+
143
+ int stage;
144
+
145
+ int temp, line;
146
+
147
+ int len; /* 選ばれたブロックの文字列kstr[line]の長さlen
148
+
149
+ 練習するブロックの文字数 */
150
+
151
+ int qno, pno; /* 問題番号・前回の問題番号 */
152
+
153
+ int tno, mno; /* 文字数・ミス回数 */
154
+
155
+ clock_t start, end; /* 開始時刻・終了時刻 */
156
+
157
+
158
+
159
+ printf("\n単純ポジショントレーニングを行います。\n");
160
+
161
+ printf("練習するブロックを選択してください。\n");
162
+
163
+ printf("第1段 (1) 左 %-8s (2) 右 %-8s\n", kstr[ 0], kstr[ 1]);
164
+
165
+ printf("第2段 (3) 左 %-8s (4) 右 %-8s\n", kstr[ 4], kstr[ 5]);
166
+
167
+ printf("第3段 (5) 左 %-8s (6) 右 %-8s\n", kstr[ 8], kstr[ 9]);
168
+
169
+ printf("第4段 (7) 左 %-8s (8) 右 %-8s\n", kstr[12], kstr[13]);
170
+
171
+
172
+
173
+ /* ブロックを選択させる */
174
+
175
+ do {
176
+
177
+ printf("番号(練習中止は99):");
178
+
179
+ scanf("%d", &temp);
180
+
181
+ if (temp == 99) return; /* 練習中止 */
182
+
183
+ } while (temp < 1 || temp > 8);
184
+
185
+ line = 4 * ((temp - 1) / 2) + (temp - 1) % 2;
186
+
187
+ /* 練習者が打ち込んだキーボードのブロック番号1,2,3,4,5,6,7,8 を
188
+
189
+ *kstrの添字に変換する。出題するブロックの添字がlineに代入される
190
+
191
+ temp=1のときline=0、temp=2のときline=1、temp=3のときline=4、temp=4のときline=5
192
+
193
+ temp=5のときline=8、temp=6のときline=9、temp=7のときline=12、temp=8のときline=13
194
+
195
+ */
196
+
197
+ printf("%d\n",temp);
198
+
199
+
200
+
201
+ printf("%sの問題を%d回練習します。\n", kstr[line], NO);
202
+
203
+
204
+
205
+ printf("スペースキーで開始します。\n");
206
+
207
+ while (getch() != ' ')
208
+
209
+ ;
210
+
211
+
212
+
213
+ tno = mno = 0; /* 文字数・ミス回数をクリア */
214
+
215
+ len = strlen(kstr[line]); /* 練習するブロックのキー数 */
216
+
217
+
218
+
219
+ start = clock(); /* 開始時刻 */
220
+
221
+
222
+
223
+ for (stage = 0; stage < NO; stage++) {
224
+
225
+ char str[POS_LEN + 1]; /* strの長さPOS_LEN + 1はstrの最後に\0を入れるため+1している。 */
226
+
227
+
228
+
229
+ for (i = 0; i < POS_LEN; i++) /* 問題文字列を作成 */
230
+
231
+ str[i] = kstr[line][rand() % len];
232
+
233
+ str[i] = '\0'; /* strの最後に\0を入れる。 */
234
+
235
+
236
+
237
+ mno += go(str); /* 関数goから戻るとミス回数であるgoの返却値をmnoに加える */
238
+
239
+ tno += strlen(str); /* 出題した文字列の文字数をtnoに加える */
240
+
241
+
242
+
243
+ }
244
+
245
+
246
+
247
+ end = clock(); /* 終了時刻 */
248
+
249
+
250
+
251
+ printf("問題:%d文字/ミス:%d回\n", tno, mno);
252
+
253
+ printf("%.1f秒でした。\n", (double)(end - start) / CLOCKS_PER_SEC);
254
+
255
+ }
256
+
257
+
258
+
259
+ /*--- メニュー選択 ---*/
260
+
261
+ Menu SelectMenu(void)
262
+
263
+ {
264
+
265
+ int ch;
266
+
267
+
268
+
269
+ do {
270
+
271
+ printf("\n練習を選択してください。\n");
272
+
273
+ printf("(1) 単純ポジション (2) 複合ポジション\n");
274
+
275
+ printf("(3) C言語の単語 (4) 英会話 (0) 終了 :");
276
+
277
+ scanf("%d", &ch);
278
+
279
+ } while (ch < Term || ch >= InValid);
280
+
281
+
282
+
283
+ printf("%d\n",(Menu)ch);
284
+
285
+ return ((Menu)ch);
286
+
287
+
288
+
289
+ }
290
+
291
+
292
+
293
+ int main(void)
294
+
295
+ {
296
+
297
+ Menu menu; /* メニュー */
298
+
299
+
300
+
301
+
302
+
303
+ init_getputch();
304
+
305
+ /* --- ライブラリ初期処理 ---
306
+
307
+ static void init_getputch(void)
308
+
309
+ {
310
+
311
+ initscr(); //スクリーンを作成してライブラリ初期化する。cursesライブラリの利用時に最初に呼び出す
312
+
313
+ cbreak(); //行バッファリングを行わないようにする
314
+
315
+ noecho(); //タイプされたキーが画面に表示されないようにする
316
+
317
+ refresh(); //画面を消去する
318
+
319
+ }
320
+
321
+ */
322
+
323
+
324
+
325
+ srand(time(NULL)); /* 乱数の種を初期化 */
326
+
327
+ do {
328
+
329
+ switch (menu = SelectMenu()) {
330
+
331
+
332
+
333
+ case KeyPos : /* 単純ポジショントレーニング */
334
+
335
+ pos_training();
336
+
337
+ break;
338
+
339
+
340
+
341
+ case KeyPosComp :
342
+
343
+ pos_training2();
344
+
345
+ break;
346
+
347
+
348
+
349
+ case Term: break;
350
+
351
+
352
+
353
+ case InValid: break;
354
+
355
+
356
+
357
+ case Term: break; case InValid: break;
358
+
359
+ //教科書のコードにはないが、コンパイルでwarningが出るので追加した。
360
+
361
+ }
362
+
363
+ } while (menu != Term);
364
+
365
+
366
+
367
+ term_getputch(); /* p235に説明ある */
368
+
369
+ /*--- ライブラリ終了処理 ---
370
+
371
+ static void term_getputch(void)
372
+
373
+ {
374
+
375
+ endwin(); //ライブラリ終了処理用の関数で、Cursesライブラリの利用時に
376
+
377
+ 最後に呼び出さなければならない(画面上の文字がすべて消えてしまう)
378
+
379
+ }
380
+
381
+ */
382
+
383
+
384
+
385
+
386
+
387
+ return (0);
388
+
389
+ }
390
+
391
+
392
+
393
+ /*実行結果
394
+
395
+ C:\MinGW\users\chap08>gcc -I. -o typing4-1 typing4-1.c pdcurses.a
396
+
397
+
398
+
399
+ C:\MinGW\users\chap08>typing4-1
400
+
401
+
402
+
403
+
404
+
405
+ 練習を選択してください。
406
+
407
+ (1) 単純ポジション (2) 複合ポジション
408
+
409
+ (3) C言語の単語 (4) 英会話 (0) 終了 :1(enter2回押しで表示される。)
410
+
411
+
412
+
413
+ 単純ポジショントレーニングを行います。
414
+
415
+ 練習するブロックを選択してください。
416
+
417
+ 第1段 (1) 左 12345 (2) 右 67890-^\
418
+
419
+ 第2段 (3) 左 qwert (4) 右 yuiop@[
420
+
421
+ 第3段 (5) 左 asdfg (6) 右 hjkl;:]
422
+
423
+ 第4段 (7) 左 zxcvb (8) 右 nm,./\
424
+
425
+
426
+
427
+ 番号(練習中止は99):3(enter2回押しで表示される。)
428
+
429
+ qwertの問題を3回練習します。
430
+
431
+ スペースキーで開始します。
432
+
433
+ qwretertwe (qが点滅で表示される。押すごとに消えていく)
434
+
435
+
436
+
437
+
438
+
439
+ 問題:30文字/ミス:2回
440
+
441
+ 33.4秒でした。
442
+
443
+
444
+
445
+ 練習を選択してください。
446
+
447
+ (1) 単純ポジション (2) 複合ポジション
448
+
449
+ (3) C言語の単語 (4) 英会話 (0) 終了 :0
450
+
451
+ ```
452
+
453
+
454
+
455
+ C:\MinGW\users\chap08>
456
+
457
+
458
+
1
459
  ```ここに言語を入力
2
460
 
3
- /* ブロクを選択させる */
4
-
5
- do {
6
-
7
- printf("番号(練習中止は99):");
8
-
9
- scanf("%d\n", &temp);
10
-
11
- if (temp == 99) return; /* 練習中止 */
12
-
13
- } while (temp < 1 || temp > 8);
14
-
15
- とMenu SelectMenu(void)のdo {
16
-
17
- printf("\n練習を選択してください。\n");
18
-
19
- printf("(1) 単純ポジション (2) 複合ポジション\n");
20
-
21
- printf("(3) C言語の単語 (4) 英会話 (0) 終了 :");
22
-
23
- scanf("%d\n", &ch);
24
-
25
- } while (ch < Term || ch >= InValid);
26
-
27
- でprintf("番号(練習中止は99):")と(0) 終了 :のあとに番号が
28
-
29
- すぐに出てこないでenter2回押しで表示されますが、すっきりしないのですが。
30
-
31
- 番号を入力と同時に表示する方法をお願い致します。
32
-
33
- ```ここに言語を入力
461
+ - /* getch/putch用ヘダ "getputch.h" */
462
+
463
+ -
464
+
465
+ - #if !defined(__GETPUTCH)
466
+
467
+ -
468
+
469
+ - #define __GETPUTCH
470
+
471
+ -
472
+
473
+ - #if defined(_MSC_VER) || (__TURBOC__) || (LSI_C)
474
+
475
+ -
476
+
477
+ - /* MS-Windows/MS-DOS(Visual C++, Borland C++, LSI-C 86 etc ...) */
478
+
479
+ -
480
+
481
+ - #include <conio.h>
482
+
483
+ -
484
+
485
+ - static void init_getputch(void) { /* 空 */ }
486
+
487
+ -
488
+
489
+ - static void term_getputch(void) { /* 空 */ }
490
+
491
+ -
492
+
493
+ -
494
+
495
+ - #else
496
+
497
+ -
498
+
499
+ - /* Cursesライブラリが提供されるUNIX/Linux/OS X */
500
+
501
+ -
502
+
503
+ - #include <curses.h>
504
+
505
+ -
506
+
507
+ - #undef putchar
508
+
509
+ - #undef puts
510
+
511
+ - #undef printf
512
+
513
+ - static char __buf[4096];
514
+
515
+ -
516
+
517
+ - /*--- __putchar:putchar関数と同等(改行を[改行+復帰]で出力)---*/
518
+
519
+ - static int __putchar(int ch)
520
+
521
+ - {
522
+
523
+ - if (ch == '\n')
524
+
525
+ - putchar('\r');
526
+
527
+ - return (putchar(ch));
528
+
529
+ - }
530
+
531
+ -
532
+
533
+ - /*--- putch:1文字表示してバッファを掃き出す ---*/
534
+
535
+ - static int putch(int ch)
536
+
537
+ - {
538
+
539
+ - int result = putchar(ch);
540
+
541
+ -
542
+
543
+ - fflush(stdout);
544
+
545
+ - return (result);
546
+
547
+ - }
548
+
549
+ -
550
+
551
+ - /*--- __printf:printf関数と同等(改行を[改行+復帰]で出力)---*/
552
+
553
+ - static int __printf(const char *format, ...)
554
+
555
+ - {
556
+
557
+ - va_list ap;
558
+
559
+ - int count;
560
+
561
+ -
562
+
563
+ - va_start(ap, format);
564
+
565
+ - vsprintf(__buf, format, ap);
566
+
567
+ - va_end(ap);
568
+
569
+ -
570
+
571
+ - for (count = 0; __buf[count]; count++) {
572
+
573
+ - putchar(__buf[count]);
574
+
575
+ - if (__buf[count] == '\n')
576
+
577
+ - putchar('\r');
578
+
579
+ - }
580
+
581
+ - return (count);
582
+
583
+ - }
584
+
585
+ -
586
+
587
+ - /*--- __puts:puts関数と同等(改行を[改行+復帰]で出力)---*/
588
+
589
+ - int __puts(const char *s)
590
+
591
+ - {
592
+
593
+ - int i, j;
594
+
595
+ -
596
+
597
+ - for (i = 0, j = 0; s[i]; i++) {
598
+
599
+ - __buf[j++] = s[i];
600
+
601
+ - if (s[i] == '\n')
602
+
603
+ - __buf[j++] = '\r';
604
+
605
+ - }
606
+
607
+ - return (puts(__buf));
608
+
609
+ - }
610
+
611
+ -
612
+
613
+ - /*--- ライブラリ初期処理 ---*/
614
+
615
+ - static void init_getputch(void)
616
+
617
+ - {
618
+
619
+ - initscr();
620
+
621
+ - cbreak();
622
+
623
+ - noecho();
624
+
625
+ - refresh();
626
+
627
+ - }
628
+
629
+ -
630
+
631
+ - /*--- ライブラリ終了処理 ---*/
632
+
633
+ - static void term_getputch(void)
634
+
635
+ - {
636
+
637
+ - endwin();
638
+
639
+ - }
640
+
641
+ -
642
+
643
+ - #define putchar __putchar
644
+
645
+ - #define printf __printf
646
+
647
+ - #define puts __puts
648
+
649
+ -
650
+
651
+ - #endif
652
+
653
+ -
654
+
655
+ - #endif
34
656
 
35
657
  ```
36
658
 
37
- コード
659
+ ```
38
-
39
- /* 総合タイピング練習 1部省略しています*/
40
-
41
-
42
-
43
-
44
-
45
- #include <time.h>
46
-
47
- #include <stdio.h>
48
-
49
- #include <stdlib.h>
50
-
51
- #include <string.h>
52
-
53
- #include "getputch.h"
54
-
55
-
56
-
57
- #define NO 3 /* トレーニング回数 */
58
-
59
- #define KTYPE 16 /* ブロック数 */
60
-
61
- #define POS_LEN 10 /* ポジショントレーニングの文字数,
62
-
63
- 10個の文字がランダムに出題される */
64
-
65
-
66
-
67
- /*--- 練習メニュー ---*/
68
-
69
- typedef enum { Term, KeyPos, KeyPosComp, Clang, Conversation, InValid } Menu;
70
-
71
- /*--- Menuという型を定義できる Term=0,KeyPos=1 ...
72
-
73
- ---*/
74
-
75
-
76
-
77
-
78
-
79
- /*--- 各ブロックのキー ---*/
80
-
81
- const char *kstr[] = {
82
-
83
- "12345", "67890-^\\", /* 第1段 */
84
-
85
- "!\"#$%", "&'()=~|", /* 第1段 [Shift] */
86
-
87
- "qwert", "yuiop@[", /* 第2段 */
88
-
89
- "QWERT", "YUIOP`{", /* 第2段 [Shift] */
90
-
91
- "asdfg", "hjkl;:]", /* 第3段 */
92
-
93
- "ASDFG", "HJKL+*}", /* 第3段 [Shift] */
94
-
95
- "zxcvb", "nm,./\\", /* 第4段 */
96
-
97
- "ZXCVB", "NM<>?_", /* 第4段 [Shift] */
98
-
99
- };
100
-
101
-
102
-
103
- /*--- 文字列strを表示してタイプ練習(ミス回数を返す) ---*/
104
-
105
- int go(const char *str)
106
-
107
- {
108
-
109
- int i;
110
-
111
- int len = strlen(str); /* 文字数 */
112
-
113
- int mistake = 0; /* ミス回数 */
114
-
115
-
116
-
117
- for (i = 0; i < len; i++) {
118
-
119
-
120
-
121
- /* str[i]以降を表示してカーソルを先頭へ戻す,正解すると文字が1ずつ消えて行く */
122
-
123
- printf("%s \r", &str[i]);
124
-
125
-
126
-
127
- while (getch() != str[i]) { /* getch()はタイプされた文字を返す */
128
-
129
- mistake++;
130
-
131
- }
132
-
133
- }
134
-
135
- return (mistake);
136
-
137
- }
138
-
139
-
140
-
141
-
142
-
143
- /*--- 単純ポジショントレーニング ---*/
144
-
145
- void pos_training(void)
146
-
147
- {
148
-
149
- int i;
150
-
151
- int stage;
152
-
153
- int temp, line;
154
-
155
- int len; /* 選ばれたブロックの文字列kstr[line]の長さlen
156
-
157
- 練習するブロックの文字数 */
158
-
159
- int qno, pno; /* 問題番号・前回の問題番号 */
160
-
161
- int tno, mno; /* 文字数・ミス回数 */
162
-
163
- clock_t start, end; /* 開始時刻・終了時刻 */
164
-
165
-
166
-
167
- printf("\n単純ポジショントレーニングを行います。\n");
168
-
169
- printf("練習するブロックを選択してください。\n");
170
-
171
- printf("第1段 (1) 左 %-8s (2) 右 %-8s\n", kstr[ 0], kstr[ 1]);
172
-
173
- printf("第2段 (3) 左 %-8s (4) 右 %-8s\n", kstr[ 4], kstr[ 5]);
174
-
175
- printf("第3段 (5) 左 %-8s (6) 右 %-8s\n", kstr[ 8], kstr[ 9]);
176
-
177
- printf("第4段 (7) 左 %-8s (8) 右 %-8s\n", kstr[12], kstr[13]);
178
-
179
-
180
-
181
- /* ブロックを選択させる */
182
-
183
- do {
184
-
185
- printf("番号(練習中止は99):");
186
-
187
- scanf("%d", &temp);
188
-
189
- if (temp == 99) return; /* 練習中止 */
190
-
191
- } while (temp < 1 || temp > 8);
192
-
193
- line = 4 * ((temp - 1) / 2) + (temp - 1) % 2;
194
-
195
- /* 練習者が打ち込んだキーボードのブロック番号1,2,3,4,5,6,7,8 を
196
-
197
- *kstrの添字に変換する。出題するブロックの添字がlineに代入される
198
-
199
- temp=1のときline=0、temp=2のときline=1、temp=3のときline=4、temp=4のときline=5
200
-
201
- temp=5のときline=8、temp=6のときline=9、temp=7のときline=12、temp=8のときline=13
202
-
203
- */
204
-
205
- printf("%d\n",temp);
206
-
207
-
208
-
209
- printf("%sの問題を%d回練習します。\n", kstr[line], NO);
210
-
211
-
212
-
213
- printf("スペースキーで開始します。\n");
214
-
215
- while (getch() != ' ')
216
-
217
- ;
218
-
219
-
220
-
221
- tno = mno = 0; /* 文字数・ミス回数をクリア */
222
-
223
- len = strlen(kstr[line]); /* 練習するブロックのキー数 */
224
-
225
-
226
-
227
- start = clock(); /* 開始時刻 */
228
-
229
-
230
-
231
- for (stage = 0; stage < NO; stage++) {
232
-
233
- char str[POS_LEN + 1]; /* strの長さPOS_LEN + 1はstrの最後に\0を入れるため+1している。 */
234
-
235
-
236
-
237
- for (i = 0; i < POS_LEN; i++) /* 問題文字列を作成 */
238
-
239
- str[i] = kstr[line][rand() % len];
240
-
241
- str[i] = '\0'; /* strの最後に\0を入れる。 */
242
-
243
-
244
-
245
- mno += go(str); /* 関数goから戻るとミス回数であるgoの返却値をmnoに加える */
246
-
247
- tno += strlen(str); /* 出題した文字列の文字数をtnoに加える */
248
-
249
-
250
-
251
- }
252
-
253
-
254
-
255
- end = clock(); /* 終了時刻 */
256
-
257
-
258
-
259
- printf("問題:%d文字/ミス:%d回\n", tno, mno);
260
-
261
- printf("%.1f秒でした。\n", (double)(end - start) / CLOCKS_PER_SEC);
262
-
263
- }
264
-
265
-
266
-
267
- /*--- メニュー選択 ---*/
268
-
269
- Menu SelectMenu(void)
270
-
271
- {
272
-
273
- int ch;
274
-
275
-
276
-
277
- do {
278
-
279
- printf("\n練習を選択してください。\n");
280
-
281
- printf("(1) 単純ポジション (2) 複合ポジション\n");
282
-
283
- printf("(3) C言語の単語 (4) 英会話 (0) 終了 :");
284
-
285
- scanf("%d", &ch);
286
-
287
- } while (ch < Term || ch >= InValid);
288
-
289
-
290
-
291
- printf("%d\n",(Menu)ch);
292
-
293
- return ((Menu)ch);
294
-
295
-
296
-
297
- }
298
-
299
-
300
-
301
- int main(void)
302
-
303
- {
304
-
305
- Menu menu; /* メニュー */
306
-
307
-
308
-
309
-
310
-
311
- init_getputch(); /* p235に説明ある */
312
-
313
- /* --- ライブラリ初期処理 ---
314
-
315
- static void init_getputch(void)
316
-
317
- {
318
-
319
- initscr(); //スクリーンを作成してライブラリ初期化する。cursesライブラリの利用時に最初に呼び出す
320
-
321
- cbreak(); //行バッファリングを行わないようにする
322
-
323
- noecho(); //タイプされたキーが画面に表示されないようにする
324
-
325
- refresh(); //画面を消去する
326
-
327
- }
328
-
329
- */
330
-
331
-
332
-
333
- srand(time(NULL)); /* 乱数の種を初期化 */
334
-
335
- do {
336
-
337
- switch (menu = SelectMenu()) {
338
-
339
-
340
-
341
- case KeyPos : /* 単純ポジショントレーニング */
342
-
343
- pos_training();
344
-
345
- break;
346
-
347
-
348
-
349
-
350
-
351
- case Term: break;
352
-
353
-
354
-
355
- case InValid: break;
356
-
357
-
358
-
359
- }
360
-
361
- } while (menu != Term);
362
-
363
-
364
-
365
- term_getputch(); /* p235に説明ある */
366
-
367
- /*--- ライブラリ終了処理 ---
368
-
369
- static void term_getputch(void)
370
-
371
- {
372
-
373
- endwin(); //ライブラリ終了処理用の関数で、Cursesライブラリの利用時に
374
-
375
- 最後に呼び出さなければならない(画面上の文字がすべて消えてしまう)
376
-
377
- }
378
-
379
- */
380
-
381
-
382
-
383
-
384
-
385
- return (0);
386
-
387
- }
388
-
389
-
390
-
391
- /*実行結果
392
-
393
- C:\MinGW\users\chap08>gcc -I. -o kadai8-2-1 kadai8-2-1.c pdcurses.a
394
-
395
-
396
-
397
- C:\MinGW\users\chap08>kadai8-2-1
398
-
399
-
400
-
401
-
402
-
403
- 練習を選択してください。
404
-
405
- (1) 単純ポジション (2) 複合ポジション
406
-
407
- (3) C言語の単語 (4) 英会話 (0) 終了 :1(enter2回押しで表示される。)
408
-
409
-
410
-
411
- 単純ポジショントレーニングを行います。
412
-
413
- 練習するブロックを選択してください。
414
-
415
- 第1段 (1) 左 12345 (2) 右 67890-^\
416
-
417
- 第2段 (3) 左 qwert (4) 右 yuiop@[
418
-
419
- 第3段 (5) 左 asdfg (6) 右 hjkl;:]
420
-
421
- 第4段 (7) 左 zxcvb (8) 右 nm,./\
422
-
423
-
424
-
425
- 番号(練習中止は99):3(enter2回押しで表示される。)
426
-
427
- qwertの問題を3回練習します。
428
-
429
- スペースキーで開始します。
430
-
431
- qwretertwe (qが点滅で表示される。押すごとに消えていく)
432
-
433
-
434
-
435
-
436
-
437
- 問題:30文字/ミス:2回
438
-
439
- 33.4秒でした。
440
-
441
-
442
-
443
- 練習を選択してください。
444
-
445
- (1) 単純ポジション (2) 複合ポジション
446
-
447
- (3) C言語の単語 (4) 英会話 (0) 終了 :0
448
-
449
-
450
-
451
- C:\MinGW\users\chap08>
452
-
453
-
454
660
 
455
661
  */
456
-
457
-
458
-
459
- ```

3

指導していただいたscanf\("%d ",&ch\)をscanf\("%d\\n ",&ch\)に変更しました。

2017/07/08 04:47

投稿

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

2

指導していただいたscanf\("%d ",&ch\)をscanf\("%d\\n ",&ch\)に変更しました。

2017/07/08 04:01

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  printf("番号(練習中止は99):");
8
8
 
9
- scanf("%d", &temp);
9
+ scanf("%d\n", &temp);
10
10
 
11
11
  if (temp == 99) return; /* 練習中止 */
12
12
 
@@ -20,7 +20,7 @@
20
20
 
21
21
  printf("(3) C言語の単語 (4) 英会話 (0) 終了 :");
22
22
 
23
- scanf("%d", &ch);
23
+ scanf("%d\n", &ch);
24
24
 
25
25
  } while (ch < Term || ch >= InValid);
26
26
 

1

コードが10000字を超えるので番号表示のコードに絞りなおしました

2017/07/08 01:38

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,737 +1,459 @@
1
+ ```ここに言語を入力
2
+
3
+ /* ブロックを選択させる */
4
+
5
+ do {
6
+
7
+ printf("番号(練習中止は99):");
8
+
9
+ scanf("%d", &temp);
10
+
11
+ if (temp == 99) return; /* 練習中止 */
12
+
13
+ } while (temp < 1 || temp > 8);
14
+
15
+ とMenu SelectMenu(void)のdo {
16
+
17
+ printf("\n練習を選択してください。\n");
18
+
19
+ printf("(1) 単純ポジション (2) 複合ポジション\n");
20
+
21
+ printf("(3) C言語の単語 (4) 英会話 (0) 終了 :");
22
+
23
+ scanf("%d", &ch);
24
+
25
+ } while (ch < Term || ch >= InValid);
26
+
27
+ でprintf("番号(練習中止は99):")と(0) 終了 :のあとに番号が
28
+
29
+ すぐに出てこないでenter2回押しで表示されますが、すっきりしないのですが。
30
+
31
+ 番号を入力と同時に表示する方法をお願い致します。
32
+
33
+ ```ここに言語を入力
34
+
35
+ ```
36
+
1
37
  コード
2
38
 
39
+ /* 総合タイピング練習 1部省略しています*/
40
+
41
+
42
+
43
+
44
+
45
+ #include <time.h>
46
+
47
+ #include <stdio.h>
48
+
49
+ #include <stdlib.h>
50
+
51
+ #include <string.h>
52
+
53
+ #include "getputch.h"
54
+
55
+
56
+
57
+ #define NO 3 /* トレーニング回数 */
58
+
59
+ #define KTYPE 16 /* ブロック数 */
60
+
61
+ #define POS_LEN 10 /* ポジショントレーニングの文字数,
62
+
63
+ 10個の文字がランダムに出題される */
64
+
65
+
66
+
67
+ /*--- 練習メニュー ---*/
68
+
69
+ typedef enum { Term, KeyPos, KeyPosComp, Clang, Conversation, InValid } Menu;
70
+
71
+ /*--- Menuという型を定義できる Term=0,KeyPos=1 ...
72
+
73
+ ---*/
74
+
75
+
76
+
77
+
78
+
79
+ /*--- 各ブロックのキー ---*/
80
+
81
+ const char *kstr[] = {
82
+
83
+ "12345", "67890-^\\", /* 第1段 */
84
+
85
+ "!\"#$%", "&'()=~|", /* 第1段 [Shift] */
86
+
87
+ "qwert", "yuiop@[", /* 第2段 */
88
+
89
+ "QWERT", "YUIOP`{", /* 第2段 [Shift] */
90
+
91
+ "asdfg", "hjkl;:]", /* 第3段 */
92
+
93
+ "ASDFG", "HJKL+*}", /* 第3段 [Shift] */
94
+
95
+ "zxcvb", "nm,./\\", /* 第4段 */
96
+
97
+ "ZXCVB", "NM<>?_", /* 第4段 [Shift] */
98
+
99
+ };
100
+
101
+
102
+
103
+ /*--- 文字列strを表示してタイプ練習(ミス回数を返す) ---*/
104
+
105
+ int go(const char *str)
106
+
107
+ {
108
+
109
+ int i;
110
+
111
+ int len = strlen(str); /* 文字数 */
112
+
113
+ int mistake = 0; /* ミス回数 */
114
+
115
+
116
+
117
+ for (i = 0; i < len; i++) {
118
+
119
+
120
+
121
+ /* str[i]以降を表示してカーソルを先頭へ戻す,正解すると文字が1ずつ消えて行く */
122
+
123
+ printf("%s \r", &str[i]);
124
+
125
+
126
+
127
+ while (getch() != str[i]) { /* getch()はタイプされた文字を返す */
128
+
129
+ mistake++;
130
+
131
+ }
132
+
133
+ }
134
+
135
+ return (mistake);
136
+
137
+ }
138
+
139
+
140
+
141
+
142
+
143
+ /*--- 単純ポジショントレーニング ---*/
144
+
145
+ void pos_training(void)
146
+
147
+ {
148
+
149
+ int i;
150
+
151
+ int stage;
152
+
153
+ int temp, line;
154
+
155
+ int len; /* 選ばれたブロックの文字列kstr[line]の長さlen
156
+
157
+ 練習するブロックの文字数 */
158
+
159
+ int qno, pno; /* 問題番号・前回の問題番号 */
160
+
161
+ int tno, mno; /* 文字数・ミス回数 */
162
+
163
+ clock_t start, end; /* 開始時刻・終了時刻 */
164
+
165
+
166
+
167
+ printf("\n単純ポジショントレーニングを行います。\n");
168
+
169
+ printf("練習するブロックを選択してください。\n");
170
+
171
+ printf("第1段 (1) 左 %-8s (2) 右 %-8s\n", kstr[ 0], kstr[ 1]);
172
+
173
+ printf("第2段 (3) 左 %-8s (4) 右 %-8s\n", kstr[ 4], kstr[ 5]);
174
+
175
+ printf("第3段 (5) 左 %-8s (6) 右 %-8s\n", kstr[ 8], kstr[ 9]);
176
+
177
+ printf("第4段 (7) 左 %-8s (8) 右 %-8s\n", kstr[12], kstr[13]);
178
+
179
+
180
+
181
+ /* ブロックを選択させる */
182
+
183
+ do {
184
+
185
+ printf("番号(練習中止は99):");
186
+
187
+ scanf("%d", &temp);
188
+
189
+ if (temp == 99) return; /* 練習中止 */
190
+
191
+ } while (temp < 1 || temp > 8);
192
+
193
+ line = 4 * ((temp - 1) / 2) + (temp - 1) % 2;
194
+
195
+ /* 練習者が打ち込んだキーボードのブロック番号1,2,3,4,5,6,7,8 を
196
+
197
+ *kstrの添字に変換する。出題するブロックの添字がlineに代入される
198
+
199
+ temp=1のときline=0、temp=2のときline=1、temp=3のときline=4、temp=4のときline=5
200
+
201
+ temp=5のときline=8、temp=6のときline=9、temp=7のときline=12、temp=8のときline=13
202
+
203
+ */
204
+
205
+ printf("%d\n",temp);
206
+
207
+
208
+
209
+ printf("%sの問題を%d回練習します。\n", kstr[line], NO);
210
+
211
+
212
+
213
+ printf("スペースキーで開始します。\n");
214
+
215
+ while (getch() != ' ')
216
+
217
+ ;
218
+
219
+
220
+
221
+ tno = mno = 0; /* 文字数・ミス回数をクリア */
222
+
223
+ len = strlen(kstr[line]); /* 練習するブロックのキー数 */
224
+
225
+
226
+
227
+ start = clock(); /* 開始時刻 */
228
+
229
+
230
+
231
+ for (stage = 0; stage < NO; stage++) {
232
+
233
+ char str[POS_LEN + 1]; /* strの長さPOS_LEN + 1はstrの最後に\0を入れるため+1している。 */
234
+
235
+
236
+
237
+ for (i = 0; i < POS_LEN; i++) /* 問題文字列を作成 */
238
+
239
+ str[i] = kstr[line][rand() % len];
240
+
241
+ str[i] = '\0'; /* strの最後に\0を入れる。 */
242
+
243
+
244
+
245
+ mno += go(str); /* 関数goから戻るとミス回数であるgoの返却値をmnoに加える */
246
+
247
+ tno += strlen(str); /* 出題した文字列の文字数をtnoに加える */
248
+
249
+
250
+
251
+ }
252
+
253
+
254
+
255
+ end = clock(); /* 終了時刻 */
256
+
257
+
258
+
259
+ printf("問題:%d文字/ミス:%d回\n", tno, mno);
260
+
261
+ printf("%.1f秒でした。\n", (double)(end - start) / CLOCKS_PER_SEC);
262
+
263
+ }
264
+
265
+
266
+
267
+ /*--- メニュー選択 ---*/
268
+
269
+ Menu SelectMenu(void)
270
+
271
+ {
272
+
273
+ int ch;
274
+
275
+
276
+
277
+ do {
278
+
279
+ printf("\n練習を選択してください。\n");
280
+
281
+ printf("(1) 単純ポジション (2) 複合ポジション\n");
282
+
283
+ printf("(3) C言語の単語 (4) 英会話 (0) 終了 :");
284
+
285
+ scanf("%d", &ch);
286
+
287
+ } while (ch < Term || ch >= InValid);
288
+
289
+
290
+
291
+ printf("%d\n",(Menu)ch);
292
+
293
+ return ((Menu)ch);
294
+
295
+
296
+
297
+ }
298
+
299
+
300
+
301
+ int main(void)
302
+
303
+ {
304
+
305
+ Menu menu; /* メニュー */
306
+
307
+
308
+
309
+
310
+
311
+ init_getputch(); /* p235に説明ある */
312
+
313
+ /* --- ライブラリ初期処理 ---
314
+
315
+ static void init_getputch(void)
316
+
317
+ {
318
+
319
+ initscr(); //スクリーンを作成してライブラリ初期化する。cursesライブラリの利用時に最初に呼び出す
320
+
321
+ cbreak(); //行バッファリングを行わないようにする
322
+
323
+ noecho(); //タイプされたキーが画面に表示されないようにする
324
+
325
+ refresh(); //画面を消去する
326
+
327
+ }
328
+
329
+ */
330
+
331
+
332
+
333
+ srand(time(NULL)); /* 乱数の種を初期化 */
334
+
335
+ do {
336
+
337
+ switch (menu = SelectMenu()) {
338
+
339
+
340
+
341
+ case KeyPos : /* 単純ポジショントレーニング */
342
+
343
+ pos_training();
344
+
345
+ break;
346
+
347
+
348
+
349
+
350
+
351
+ case Term: break;
352
+
353
+
354
+
355
+ case InValid: break;
356
+
357
+
358
+
359
+ }
360
+
361
+ } while (menu != Term);
362
+
363
+
364
+
365
+ term_getputch(); /* p235に説明ある */
366
+
367
+ /*--- ライブラリ終了処理 ---
368
+
369
+ static void term_getputch(void)
370
+
371
+ {
372
+
373
+ endwin(); //ライブラリ終了処理用の関数で、Cursesライブラリの利用時に
374
+
375
+ 最後に呼び出さなければならない(画面上の文字がすべて消えてしまう)
376
+
377
+ }
378
+
379
+ */
380
+
381
+
382
+
383
+
384
+
385
+ return (0);
386
+
387
+ }
388
+
389
+
390
+
391
+ /*実行結果
392
+
393
+ C:\MinGW\users\chap08>gcc -I. -o kadai8-2-1 kadai8-2-1.c pdcurses.a
394
+
395
+
396
+
397
+ C:\MinGW\users\chap08>kadai8-2-1
398
+
399
+
400
+
401
+
402
+
403
+ 練習を選択してください。
404
+
405
+ (1) 単純ポジション (2) 複合ポジション
406
+
407
+ (3) C言語の単語 (4) 英会話 (0) 終了 :1(enter2回押しで表示される。)
408
+
409
+
410
+
411
+ 単純ポジショントレーニングを行います。
412
+
413
+ 練習するブロックを選択してください。
414
+
415
+ 第1段 (1) 左 12345 (2) 右 67890-^\
416
+
417
+ 第2段 (3) 左 qwert (4) 右 yuiop@[
418
+
419
+ 第3段 (5) 左 asdfg (6) 右 hjkl;:]
420
+
421
+ 第4段 (7) 左 zxcvb (8) 右 nm,./\
422
+
423
+
424
+
425
+ 番号(練習中止は99):3(enter2回押しで表示される。)
426
+
427
+ qwertの問題を3回練習します。
428
+
429
+ スペースキーで開始します。
430
+
431
+ qwretertwe (qが点滅で表示される。押すごとに消えていく)
432
+
433
+
434
+
435
+
436
+
437
+ 問題:30文字/ミス:2回
438
+
439
+ 33.4秒でした。
440
+
441
+
442
+
443
+ 練習を選択してください。
444
+
445
+ (1) 単純ポジション (2) 複合ポジション
446
+
447
+ (3) C言語の単語 (4) 英会話 (0) 終了 :0
448
+
449
+
450
+
451
+ C:\MinGW\users\chap08>
452
+
453
+
454
+
455
+ */
456
+
457
+
458
+
3
459
  ```
4
-
5
- 柴田望洋著 明解c言語で勉強しています。8章の課題2と3でコンパイル後、実行はできるのですが
6
-
7
- ”練習を選択してください。” の後の (0)終了 :ここに番号を打ち込んでも表示されません。
8
-
9
- enterを2回押すと実行できるのですが、表示されるように助言をお願いいたします。
10
-
11
- あと各練習の選択後の番号入力のときも同じ現象なので、そちらもお願いいたします。
12
-
13
- /* 総合タイピング練習 */
14
-
15
- /* 1回のトレーニングにおいて同一の文字列を出題しないように変更せよ。
16
-
17
- こんにちは。 Hello! と表示してHello!をタイプさせるモードを追加せよ。
18
-
19
- 日本語を表示するものと、表示しないものを、練習者に選択させるようにする。
20
-
21
- 日本語を表示しないもの
22
-
23
- */
24
-
25
- #include <time.h>
26
-
27
- #include <stdio.h>
28
-
29
- #include <stdlib.h>
30
-
31
- #include <string.h>
32
-
33
- #include "getputch.h"
34
-
35
-
36
-
37
- #define NO 3 /* トレーニング回数 */
38
-
39
- #define KTYPE 16 /* ブロック数 */
40
-
41
- #define POS_LEN 10 /* ポジショントレーニングの文字数,
42
-
43
- 10個の文字がランダムに出題される */
44
-
45
-
46
-
47
- /*--- 練習メニュー ---*/
48
-
49
- typedef enum { Term, KeyPos, KeyPosComp, Clang, Conversation, InValid } Menu;
50
-
51
- /*--- Menuという型を定義できる Term=0,KeyPos=1 ...
52
-
53
- ---*/
54
-
55
-
56
-
57
- /*--- 各ブロックのキー ---*/
58
-
59
- const char *kstr[] = {
60
-
61
- "12345", "67890-^\\", /* 第1段 */
62
-
63
- "!\"#$%", "&'()=~|", /* 第1段 [Shift] */
64
-
65
- "qwert", "yuiop@[", /* 第2段 */
66
-
67
- "QWERT", "YUIOP`{", /* 第2段 [Shift] */
68
-
69
- "asdfg", "hjkl;:]", /* 第3段 */
70
-
71
- "ASDFG", "HJKL+*}", /* 第3段 [Shift] */
72
-
73
- "zxcvb", "nm,./\\", /* 第4段 */
74
-
75
- "ZXCVB", "NM<>?_", /* 第4段 [Shift] */
76
-
77
- };
78
-
79
-
80
-
81
- /*--- C言語のキーワードとライブラリ関数 ---*/
82
-
83
- const char *cstr[] = {
84
-
85
- "auto", "break", "case", "char", "const", "continue",
86
-
87
- "default", "do", "double", "else", "enum", "extern",
88
-
89
- "float", "for", "goto", "if", "int", "long",
90
-
91
- ................................
92
-
93
- "register", "return", "short", "signed", "va_end", "va_start",
94
-
95
- "vfprintf", "vprintf", "vsprintf"
96
-
97
- };
98
-
99
-
100
-
101
- /*--- 英会話 ---*/
102
-
103
- const char *vstr[] = {
104
-
105
- "Hello!", /* こんにちは。*/
106
-
107
- "How are you?", /* お元気ですか。 */
108
-
109
- "Fine thanks.", /* はい元気です。 */
110
-
111
- "I can't complain, thanks.", /* まあ、何とか。 */
112
-
113
- "How do you do?", /* 初めまして。 */
114
-
115
- .......................
116
-
117
- };
118
-
119
-
120
-
121
- /*--- 文字列strを表示してタイプ練習(ミス回数を返す) ---*/
122
-
123
- int go(const char *str)
124
-
125
- {
126
-
127
- int i;
128
-
129
- int len = strlen(str); /* 文字数 */
130
-
131
- int mistake = 0; /* ミス回数 */
132
-
133
-
134
-
135
- for (i = 0; i < len; i++) {
136
-
137
-
138
-
139
- /* str[i]以降を表示してカーソルを先頭へ戻す,正解すると文字が1ずつ消えて行く */
140
-
141
- printf("%s \r", &str[i]);
142
-
143
-
144
-
145
- while (getch() != str[i]) { /* getch()はタイプされた文字を返す */
146
-
147
- mistake++;
148
-
149
- }
150
-
151
- }
152
-
153
- return (mistake);
154
-
155
- }
156
-
157
-
158
-
159
- /*--- 単純ポジショントレーニング ---*/
160
-
161
- void pos_training(void)
162
-
163
- {
164
-
165
- int i;
166
-
167
- int stage;
168
-
169
- int temp, line;
170
-
171
- int len; /* 選ばれたブロックの文字列kstr[line]の長さlen
172
-
173
- 練習するブロックの文字数 */
174
-
175
- int qno, pno; /* 問題番号・前回の問題番号 */
176
-
177
- int tno, mno; /* 文字数・ミス回数 */
178
-
179
- clock_t start, end; /* 開始時刻・終了時刻 */
180
-
181
-
182
-
183
- printf("\n単純ポジショントレーニングを行います。\n");
184
-
185
- printf("練習するブロックを選択してください。\n");
186
-
187
- printf("第1段 (1) 左 %-8s (2) 右 %-8s\n", kstr[ 0], kstr[ 1]);
188
-
189
- printf("第2段 (3) 左 %-8s (4) 右 %-8s\n", kstr[ 4], kstr[ 5]);
190
-
191
- printf("第3段 (5) 左 %-8s (6) 右 %-8s\n", kstr[ 8], kstr[ 9]);
192
-
193
- printf("第4段 (7) 左 %-8s (8) 右 %-8s\n", kstr[12], kstr[13]);
194
-
195
-
196
-
197
- /* ブロックを選択させる */
198
-
199
- do {
200
-
201
- printf("番号(練習中止は99):");
202
-
203
- scanf("%d", &temp);
204
-
205
- if (temp == 99) return; /* 練習中止 */
206
-
207
- } while (temp < 1 || temp > 8);
208
-
209
- line = 4 * ((temp - 1) / 2) + (temp - 1) % 2;
210
-
211
- /* 練習者が打ち込んだキーボードのブロック番号1,2,3,4,5,6,7,8 を
212
-
213
- *kstrの添字に変換する。出題するブロックの添字がlineに代入される
214
-
215
- temp=1のときline=0、temp=2のときline=1、temp=3のときline=4、temp=4のときline=5
216
-
217
- temp=5のときline=8、temp=6のときline=9、temp=7のときline=12、temp=8のときline=13
218
-
219
- */
220
-
221
- printf("line番号は%d\n",temp);
222
-
223
-
224
-
225
- printf("%sの問題を%d回練習します。\n", kstr[line], NO);
226
-
227
-
228
-
229
- printf("スペースキーで開始します。\n");
230
-
231
- while (getch() != ' ')
232
-
233
- ;
234
-
235
-
236
-
237
- tno = mno = 0; /* 文字数・ミス回数をクリア */
238
-
239
- len = strlen(kstr[line]); /* 練習するブロックのキー数 */
240
-
241
-
242
-
243
- start = clock(); /* 開始時刻 */
244
-
245
-
246
-
247
- for (stage = 0; stage < NO; stage++) {
248
-
249
- char str[POS_LEN + 1]; /* strの長さPOS_LEN + 1はstrの最後に\0を入れるため+1している。 */
250
-
251
-
252
-
253
- for (i = 0; i < POS_LEN; i++) /* 問題文字列を作成 */
254
-
255
- str[i] = kstr[line][rand() % len];
256
-
257
- str[i] = '\0'; /* strの最後に\0を入れる。 */
258
-
259
-
260
-
261
- mno += go(str); /* 関数goから戻るとミス回数であるgoの返却値をmnoに加える */
262
-
263
- tno += strlen(str); /* 出題した文字列の文字数をtnoに加える */
264
-
265
-
266
-
267
- }
268
-
269
-
270
-
271
- end = clock(); /* 終了時刻 */
272
-
273
-
274
-
275
- printf("問題:%d文字/ミス:%d回\n", tno, mno);
276
-
277
- printf("%.1f秒でした。\n", (double)(end - start) / CLOCKS_PER_SEC);
278
-
279
- }
280
-
281
-
282
-
283
- /*--- 複合ポジショントレーニング ---*/
284
-
285
- void pos_training2(void)
286
-
287
- {
288
-
289
- int i;
290
-
291
- int stage;
292
-
293
- int temp, line;
294
-
295
- int sno; /* 選ばれたブロック数 */
296
-
297
- int select[KTYPE]; /* 選ばれたブロック */
298
-
299
- int len[KTYPE]; /* 問題のブロックのキー数 */
300
-
301
- int tno, mno; /* 文字数・ミス回数 */
302
-
303
- clock_t start, end; /* 開始時刻・終了時刻 */
304
-
305
- char *format = "第%d段 (%2d) 左 %-8s (%2d) 右 %-8s "
306
-
307
- "(%2d)[左] %-8s (%2d)[右] %-8s\n";
308
-
309
-
310
-
311
- printf("\n複合ポジショントレーニングを行います。\n");
312
-
313
- printf("練習するブロックを選択してください(複数選べます)。\n");
314
-
315
-
316
-
317
- for (i = 0; i < 4; i++) {
318
-
319
- int k = i * 4;
320
-
321
- printf(format, i+1, k + 1, kstr[k], k + 2, kstr[k + 1],
322
-
323
- k + 3, kstr[k + 2], k + 4, kstr[k + 3]);
324
-
325
- }
326
-
327
-
328
-
329
- /* ブロックを重複させずに選択させる(最大16個) */
330
-
331
- sno = 0;
332
-
333
- while (1) {
334
-
335
- printf("番号(選択終了は50/練習中止は99):");
336
-
337
-
338
-
339
- do {
340
-
341
- scanf("%d", &temp);
342
-
343
- if (temp == 99) return; /* 練習中止 */
344
-
345
- } while ((temp < 1 || temp > KTYPE) && temp != 50);
346
-
347
-
348
-
349
- if (temp == 50)
350
-
351
- break;
352
-
353
- for (i = 0; i < sno; i++)
354
-
355
- if (temp == select[i]) {
356
-
357
- printf("\aその段は既に選ばれています。\n");
358
-
359
- break;
360
-
361
- }
362
-
363
- if (i == sno)
364
-
365
- select[sno++] = temp; /* 選ばれたブロックを登録 */
366
-
367
- }
368
-
369
-
370
-
371
- if (sno == 0) /* 一つも選ばれなかった */
372
-
373
- return;
374
-
375
-
376
-
377
- printf("以下のブロックの問題を%d回練習します。\n", NO);
378
-
379
-
380
-
381
- for (i = 0; i < sno; i++)
382
-
383
- printf("%s ", kstr[select[i] - 1]);
384
-
385
-
386
-
387
- printf("\nスペースキーで開始します。\n");
388
-
389
- while (getch() != ' ')
390
-
391
- ;
392
-
393
-
394
-
395
- tno = mno = 0; /* 文字数・ミス回数をクリア */
396
-
397
- for (i = 0; i < sno; i++)
398
-
399
- len[i] = strlen(kstr[select[i] - 1]); /* ブロックのキー数 */
400
-
401
-
402
-
403
- start = clock(); /* 開始時刻 */
404
-
405
-
406
-
407
- for (stage = 0; stage < NO; stage++) {
408
-
409
- char str[POS_LEN + 1];
410
-
411
-
412
-
413
- for (i = 0; i < POS_LEN; i++) { /* 問題文字列を作成 */
414
-
415
- int q = rand() % sno;
416
-
417
- str[i] = kstr[select[q] - 1][rand() % len[q]];
418
-
419
- }
420
-
421
- str[i] = '\0';
422
-
423
-
424
-
425
- mno += go(str); /* 練習実行 */
426
-
427
- tno += strlen(str);
428
-
429
- }
430
-
431
-
432
-
433
- end = clock(); /* 終了時刻 */
434
-
435
-
436
-
437
- printf("問題:%d文字/ミス:%d回\n", tno, mno);
438
-
439
- printf("%.1f秒でした。\n", (double)(end - start) / CLOCKS_PER_SEC);
440
-
441
- }
442
-
443
-
444
-
445
- /*--- C言語/英会話トレーニング ---*/
446
-
447
- void word_training(const char *mes, const char *str[], int n)
448
-
449
- /* const char *mesはトレーニング名
450
-
451
- const char *str[]は練習する文字列を受け取る配列
452
-
453
- int n は配列の要素数
454
-
455
- */
456
-
457
- {
458
-
459
- int stage;
460
-
461
- int i=0,j;
462
-
463
- int qno, pno; /* 問題番号・前回の問題番号 */
464
-
465
- int check[NO] = {0}; /* 過去の問題番号を入れておく配列、最初は初期化しておく */
466
-
467
- int tno, mno; /* 文字数・ミス回数 */
468
-
469
- clock_t start, end; /* 開始時刻・終了時刻 */
470
-
471
- int retry = 0;
472
-
473
-
474
-
475
- printf("\n%sを%d個練習します。\r\n", mes, NO);
476
-
477
-
478
-
479
- printf("スペースキーで開始します。\r\n");
480
-
481
- fflush(stdout);
482
-
483
- while (getch() != ' ')
484
-
485
- ;
486
-
487
-
488
-
489
- tno = mno = 0; /* 文字数・ミス回数をクリア */
490
-
491
- pno = n; /* 前回の問題番号(存在しない番号) */
492
-
493
-
494
-
495
- start = clock(); /* 開始時刻 */
496
-
497
-
498
-
499
- for (stage = 0; stage < NO; stage++) {
500
-
501
- do { /* 同じ問題を連続して出題しない */
502
-
503
- qno = rand() % n; /* qno今回の問題番号(n=存在しない番号) */
504
-
505
- if(qno % 2) /* qno % 2が真ということはqnoが奇数である */
506
-
507
- qno++;
508
-
509
- for(j = 0; j < stage; j++){
510
-
511
- if(check[j] == qno)
512
-
513
- retry = 1;
514
-
515
- }
516
-
517
- retry = 0;
518
-
519
- }while( retry == 1 );
520
-
521
-
522
-
523
- printf("%s \r", str[qno]);
524
-
525
- fflush(stdout);
526
-
527
-
528
-
529
- mno += go(str[qno]); /* 問題はstr[qno] */
530
-
531
- tno += strlen(str[qno]);
532
-
533
- pno = qno; /* pno過去の問題番号 */
534
-
535
- check[stage]=qno; /* stageが何回目かのトレーニング回数の所にqno(今回の問題番号)を代入する。 */
536
-
537
- }
538
-
539
-
540
-
541
- end = clock(); /* 終了時刻 */
542
-
543
-
544
-
545
- printf("問題:%d文字/ミス:%d回\r\n", tno, mno);
546
-
547
- printf("%.1f秒でした。\n", (double)(end - start) / CLOCKS_PER_SEC);
548
-
549
- fflush(stdout);
550
-
551
- }
552
-
553
-
554
-
555
- /*--- メニュー選択 ---*/
556
-
557
- Menu SelectMenu(void)
558
-
559
- {
560
-
561
- int ch;
562
-
563
-
564
-
565
- do {
566
-
567
- printf("\n練習を選択してください。\n");
568
-
569
- printf("(1) 単純ポジション (2) 複合ポジション\n");
570
-
571
- printf("(3) C言語の単語 (4) 英会話 (0) 終了 :");
572
-
573
- scanf("%d", &ch);
574
-
575
- } while (ch < Term || ch >= InValid);
576
-
577
-
578
-
579
-
580
-
581
- return ((Menu)ch);
582
-
583
- printf("line番号は%d\n",(Menu)ch);
584
-
585
- }
586
-
587
-
588
-
589
- int main(void)
590
-
591
- {
592
-
593
- Menu menu; /* メニュー */
594
-
595
- int cn = sizeof(cstr) / sizeof(cstr[0]); /* C言語の単語数 */
596
-
597
- int vn = sizeof(vstr) / sizeof(vstr[0]); /* 英会話の文書数 */
598
-
599
-
600
-
601
- init_getputch();
602
-
603
- srand(time(NULL)); /* 乱数の種を初期化 */
604
-
605
- do {
606
-
607
- switch (menu = SelectMenu()) {
608
-
609
-
610
-
611
- case KeyPos : /* 単純ポジショントレーニング */
612
-
613
- pos_training();
614
-
615
- break;
616
-
617
-
618
-
619
- case KeyPosComp : /* 複合ポジショントレーニング */
620
-
621
- pos_training2();
622
-
623
- break;
624
-
625
-
626
-
627
- case Clang : /* C言語の単語 */
628
-
629
- word_training("C言語の単語", cstr, cn);
630
-
631
- break;
632
-
633
-
634
-
635
- case Conversation : /* 英会話 */
636
-
637
- word_training("英会話の文書", vstr, vn);
638
-
639
- break;
640
-
641
-
642
-
643
- case Term: break;
644
-
645
-
646
-
647
- case InValid: break;
648
-
649
-
650
-
651
- }
652
-
653
- } while (menu != Term);
654
-
655
-
656
-
657
- term_getputch();
658
-
659
-
660
-
661
- return (0);
662
-
663
- }
664
-
665
-
666
-
667
-
668
-
669
- /* 実行結果
670
-
671
-
672
-
673
- C:\MinGW\users\chap08>gcc -I. -o kadai8-2and3 kadai8-2and3.c pdcurses.a
674
-
675
-
676
-
677
- C:\MinGW\users\chap08>kadai8-2and3
678
-
679
-
680
-
681
- 練習を選択してください。
682
-
683
- (1) 単純ポジション (2) 複合ポジション
684
-
685
- (3) C言語の単語 (4) 英会話 (0) 終了 :(ここに番号を打ち込んでも表示されないが、enter2度押しで下が表示される)
686
-
687
-
688
-
689
- 単純ポジショントレーニングを行います。
690
-
691
- 練習するブロックを選択してください。
692
-
693
- 第1段 (1) 左 12345 (2) 右 67890-^\
694
-
695
- 第2段 (3) 左 qwert (4) 右 yuiop@[
696
-
697
- 第3段 (5) 左 asdfg (6) 右 hjkl;:]
698
-
699
- 第4段 (7) 左 zxcvb (8) 右 nm,./\
700
-
701
- 番号(練習中止は99):4押してenter2度押しで下が表示される(ここに番号を打ち込んでも表示されないが、enter2度押しで下が表示される)
702
-
703
- 英会話の文書を3個練習します。
704
-
705
- スペースキーで開始します。(enter)
706
-
707
- 問題:36文字/ミス:3回
708
-
709
- 46.8秒でした。
710
-
711
-
712
-
713
- 練習を選択してください。
714
-
715
- (1) 単純ポジション (2) 複合ポジション
716
-
717
- (3) C言語の単語 (4) 英会話 (0) 終了 :(ここに番号を打ち込んでも表示されないが、enter2度押しで実行される,0で終了)
718
-
719
-
720
-
721
- C:\MinGW\users\chap08>
722
-
723
-
724
-
725
-
726
-
727
- */
728
-
729
-
730
-
731
-
732
-
733
-
734
-
735
-
736
-
737
- ```