代码与运行结果
进入 ~/project 目录并创建一个名为 typing3.c 的项目文件:
cd ~/project
touch typing3.c
根据上述指导方针编写的程序如下所示:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "getputch.h"
#define NO 30 /* 练习次数 */
#define KTYPE 16 /* 块的数量 */
int main(void)
{
char *kstr[] = {"12345", "67890-^\\", /* 第 1 层 */
"!\"#$%", "&'() =~|", /* 第 1 层 [Shift] */
"qwert", "yuiop@[", /* 第 2 层 */
"QWERT", "YUIOP`{", /* 第 2 层 [Shift] */
"asdfg", "hjkl;:]", /* 第 3 层 */
"ASDFG", "HJKL+*}", /* 第 3 层 [Shift] */
"zxcvb", "nm,./\\", /* 第 4 层 */
"ZXCVB", "NM<> _", /* 第 4 层 [Shift] */
};
int i, stage;
clock_t start, end; /* 开始和结束时间 */
init_getputch();
srand(time(NULL)); /* 设置随机数生成种子 */
printf("开始打字联想练习。\n");
printf("请输入由 '?' 指示的隐藏字符。\n");
printf("按空格键开始。\n");
fflush(stdout);
while (getch()!= ' ')
;
start = clock(); /* 开始时间 */
for (stage = 0; stage < NO; stage++) {
int k, p, key;
char temp[10];
do {
k = rand() % KTYPE;
p = rand() % strlen(kstr[k]);
key = kstr[k][p];
} while (key == ' ');
strcpy(temp, kstr[k]);
temp[p] = '?';
printf("%s", temp);
fflush(stdout);
while (getch()!= key)
;
putchar('\n');
}
end = clock(); /* 结束时间 */
printf("所用时间:%.1f 秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
term_getputch();
return 0;
}
宏 KTYPE 表示块的数量,为 16,数组 kstr 用于存储由每个块从左到右排列的字符组成的字符串。
出于训练目的,问题中不会包含字符 ?,因此为块声明的最后一个字符串是 NM<> _ 而不是 NM<>?_(由于程序不使用空格键生成问题,所以不会产生错误)。
如果你的键盘布局与本示例中所示的不同,请相应地修改 kstr 数组的声明。
第一个 do while 循环负责生成问题。
- 变量
k 表示从哪个块生成问题。由于这个值对应于 kstr 数组的索引,所以被设置为一个大于或等于 0 且小于 KTYPE 的随机数。
由于块的数量 KTYPE 是 16,生成的随机数将在 0 到 15 之间。
- 变量
p 表示在块内应该隐藏哪个字符以生成问题。由于这个值对应于块内用于生成问题的字符串的索引,所以被设置为一个大于或等于 0 且小于块内字符数量的随机数。
假设 k 为 0,该块由 5 个字符 '12345' 组成,所以 p 被设置为一个从 0 到 4 的随机数。此外,如果 k 为 3,该块由 8 个字符 '&'()=~|' 组成,所以 p 被设置为一个从 0 到 7 的随机数。
- 变量
key 表示隐藏的字符。
例如,如果 k 为 0 且 p 为 2,块 '12345' 中的字符 '3' 就是 key。由于程序已经将空格字符 ' ' 分配给了不应用于生成问题的字符,所以如果隐藏字符 key 是空格字符,do - while 循环会用于重新生成问题。
接下来,strcpy 函数将 kstr[k] 复制到 temp,并将 '?' 赋给 temp[p]。这就生成了要显示在屏幕上的字符串 12?45。
如果程序能够显示字符串 temp 并读取从键盘输入的字符 key,则是正确的。与之前的打字练习程序一样,这个程序不接受输入错误的字符。经过 30 轮训练后,程序将结束执行。
使用以下命令进行编译和运行:
cd ~/project
gcc -o typing3 typing3.c -lcurses
./typing3
开始打字联想练习。
请输入由 '?' 指示的隐藏字符。
按空格键开始。
AS?FG
?m,./\
67890-?\
?XCVB
zx?vb
!"?$%
ZXC?B
hjk?;:]
…(省略)…