코드 및 실행 결과
~/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 이면, 블록 '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
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?;:]
…(생략)…