Код и результат выполнения
Перейдите в каталог ~/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 /* Number of exercises */
#define KTYPE 16 /* Number of blocks */
int main(void)
{
char *kstr[] = {"12345", "67890-^\\", /* Layer 1 */
"!\"#$%", "&'() =~|", /* Layer 1 [Shift] */
"qwert", "yuiop@[", /* Layer 2 */
"QWERT", "YUIOP`{", /* Layer 2 [Shift] */
"asdfg", "hjkl;:]", /* Layer 3 */
"ASDFG", "HJKL+*}", /* Layer 3 [Shift] */
"zxcvb", "nm,./\\", /* Layer 4 */
"ZXCVB", "NM<> _", /* Layer 4 [Shift] */
};
int i, stage;
clock_t start, end; /* Start and end times */
init_getputch();
srand(time(NULL)); /* Set the seed for random number generation */
printf("Start typing association exercises.\n");
printf("Please enter the hidden character indicated by '?'.\n");
printf("Press the space key to start.\n");
fflush(stdout);
while (getch()!= ' ')
;
start = clock(); /* Start time */
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(); /* End time */
printf("Time taken: %.1f seconds.\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, символ '3'
в блоке '12345'
является key
. Поскольку программа уже присвоила пробельный символ ''
символам, которые не должны использоваться для генерации вопросов, цикл do-while
используется для повторной генерации вопроса, если скрытый символ key
является пробельным символом.
Далее функция strcpy
копирует kstr[k]
в temp
и присваивает '?'
temp[p]
. Это генерирует строку 12?45
, которая будет отображена на экране.
Если программа может отобразить строку temp
и прочитать символ key
, введенный с клавиатуры, это правильно. Как и предыдущие программы для практики набора текста, эта программа не принимает неправильно введенные символы. После 30 тренировочных раундов программа завершит выполнение.
Скомпилируйте и запустите программу с помощью следующих команд:
cd ~/project
gcc -o typing3 typing3.c -lcurses
./typing3
Start typing association exercises.
Please enter the hidden character indicated by '?'.
Press the space key to start.
AS?FG
?m,./\
67890-?\
?XCVB
zx?vb
!"?$%
ZXC?B
hjk?;:]
…(omit)…