/*
* type_combined.c
*/
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "getputch.h"
#define NO 3 /* 训练次数 */
#define KTYPE 16 /* 块数 */
#define POS_LEN 10 /* 用于位置训练的字符数量 */
/*--- 练习菜单 ---*/
typedef enum { Term, KeyPos, KeyPosComp, Clang, Conversation, InValid } Menu;
/*--- 各个块的键 ---*/
char *kstr[] = {"12345", "67890-=",
"!@#$%", "^&*()_+",
"qlert", "yuiop[]\\",
"QWERT", "YUIOP{}|",
"asdfg", "hjkl;'",
"ASDFG", "HJKL:\""
"zxcvb", "nm,./",
"ZXCVB", "NM<>?",
};
/*--- C语言的关键字和库函数 ---*/
char *cstr[] = {
"auto", "break", "case", "char", "const", "continue",
"default", "do", "double", "else", "enum", "extern",
"float", "for", "goto", "if", "int", "long",
"register", "return", "short", "signed", "sizeof", "static",
"struct", "switch", "typedef", "union", "unsigned", "void",
"volatile", "while",
"abort", "abs", "acos", "asctime", "asin", "assert",
"atan", "atan2", "atexit", "atof", "atoi", "atol",
"bsearch", "calloc", "ceil", "clearerr", "clock", "cos",
"cosh", "ctime", "difftime", "div", "exit", "exp",
"fabs", "fclose", "feof", "ferror", "fflush", "fgetc",
"fgetpos", "fgets", "floor", "fmod", "fopen", "fprintf",
"fputc", "fputs", "fread", "free", "freopen", "frexp",
"fscanf", "fseek", "fsetpos", "ftell", "fwrite", "getc",
"getchar", "getenv", "gets", "gmtime", "isalnum", "isalpha",
"iscntrl", "isdigit", "isgraph", "islower", "isprint", "ispunct",
"isspace", "isupper", "isxdigit", "labs", "ldexp", "ldiv",
"localeconv", "localtime","log", "log10", "longjmp",
"malloc", "memchr", "memcmp", "memcpy", "memmove", "memset",
"mktime", "modf", "perror", "pow", "printf", "putc",
"putchar", "puts", "qsort", "raise", "rand", "realloc",
"remove", "rename", "rewind", "scanf", "setbuf", "setjmp",
"setlocale","setvbuf", "signal", "sin", "sinh", "sprintf",
"sqrt", "srand", "sscanf", "strcat", "strchr", "strcmp",
"strcoll", "strcpy", "strcspn", "strerror", "strftime", "strlen",
"strncat", "strncmp", "strncpy", "strpbrk", "strrchr", "strspn",
"strstr", "strtod", "strtok", "strtol", "strtoul", "strxfrm",
"system", "tan", "tanh", "time", "tmpfile", "tmpnam",
"tolower", "toupper", "ungetc", "va_arg", "va_end", "va_start",
"vfprintf", "vprintf", "vsprintf"
};
/*--- 英语会话 ---*/
char *vstr[] = {
"Hello!", /* 你好。*/
"How are you?", /* 你好吗?*/
"Fine thanks.", /* 嗯,我很好。*/
"I can't complain, thanks.", /* 嗯,还行吧。*/
"How do you do?", /* 初次见面。*/
"Good bye!", /* 再见。*/
"Good morning!", /* 早上好。*/
"Good afternoon!", /* 下午好。*/
"Good evening!", /* 晚上好。*/
"See you later!", /* 再见(过会见)。*/
"Go ahead, please.", /* 您先请。*/
"Thank you.", /* 谢谢。*/
"No, thank you.", /* 不,谢谢。*/
"May I have your name?", /* 请问你叫什么名字?*/
"I'm glad to meet you.", /* 很高兴能见到你。*/
"What time is it now?", /* 请问现在是几点?*/
"It's about seven.", /* 大概7点。*/
"I must go now.", /* 我不得不走了。*/
"How much?", /* 多少钱?*/
"Where is the restroom?", /* 请问洗手间在哪里?*/
"Excuse me.", /* 抱歉(一人)。*/
"Excuse us.", /* 抱歉(两人以上)。*/
"I'm sorry.", /* 对不起。*/
"I don't know.", /* 我不知道。*/
"I have no change with me.", /* 我没带零钱。*/
"I will be back.", /* 我还会回来的。*/
"Are you going out?", /* 你要出门吗?*/
"I hope I'm not disturbing you.", /* 希望不会打搅到你。*/
"I'll offer no excuse.", /* 我没打算为自己辩解。*/
"Shall we dance?", /* 来跳舞吧。*/
"Will you do me a favor?", /* 你能帮我个忙吗?*/
"It's very unseasonable.", /* 这非常不合时节啊。*/
"You are always welcome.", /* 随时欢迎。*/
"Hold still!", /* 别动!*/
"Follow me.", /* 跟我来。*/
"Just follow my lead.", /* 跟着我做就好。*/
"To be honest with you,", /* 说真的……*/
};
Menu SelectMenu()
{
int ch;
do
{
printf("\nPlease select practice. \n");
printf("(1)Only Single\t\t(2)Combined Position\n");
printf("(3)C Language word\t(4)English Dialogue\n");
scanf("%d", &ch);
}while(ch < Term || ch >= InValid);
return (Menu)ch;
}
int go(const char *str)
{
int i, len = strlen(str), mistakes = 0;
for (i = 0; i < len; i++)
{
printf("%s \r", &str[i]);
fflush(stdout);
while(getch() != str[i])
{
mistakes++;
}
}
return mistakes;
}
void pos_training(void)
{
int i, stage, temp, line, len, qno, pno , tno, mno;
clock_t start, end;
printf("\nStarting single position to practice. \n");
printf("please select a block to practice. \n");
printf("The First floor (1) left %-8s (2) right %-8s\n", kstr[0], kstr[1]);
printf("The First floor (3) left %-8s (4) right %-8s\n", kstr[4], kstr[5]);
printf("The First floor (5) left %-8s (6) right %-8s\n", kstr[8], kstr[9]);
printf("The First floor (7) left %-8s (8) right %-8s\n", kstr[12], kstr[13]);
do
{
printf("number (99 is stop) : ");
scanf("%d", &temp);
if (temp == 99)
{
return;
}
}while(temp < 1 || temp > 8);
line = 4 * ((temp - 1) / 2) + (temp - 1) % 2;
printf("practice %s times %d topices. \n", kstr[line], NO);
printf("Starting after entering space. \n");
while(getch() != ' ')
;
tno = mno = 0;
len = strlen(kstr[line]);
start = clock();
for (stage = 0; stage < NO; stage++)
{
char str[POS_LEN + 1];
for (i = 0; i < POS_LEN; i++)
{
str[i] = kstr[line][rand() % len];
}
str[i] = '\0';
mno += go(str);
tno += strlen(str);
}
end = clock();
printf("Title: %d characters/Mistakes: %d times\n", tno, mno);
printf("Costing time : %.1f seconds. \n", (double)(end-start)/CLOCKS_PER_SEC);
}
void pos_training2()
{
int i, stage, temp, line, sno, select[KTYPE], len[KTYPE], tno, mno;
clock_t start, end;
char *format = "the %d floor (%2d) left %-8s (%2d) right %-8s"
"(%2d)[left] %-8s (%2d)[right] %-8s\n";
printf("\nGo to on combined training. \n");
printf("Please select the block you wanted to practice(More). \n");
for (i = 0; i < 4; i++)
{
int k = i * 4;
printf(format, i+1, k+1, kstr[k], k+2, kstr[k+1],
k+3, kstr[k+2], k+4, kstr[k+3]);
}
sno = 0;
while(1)
{
printf("number (end select--50/stop practice--99): ");
do
{
scanf("%d", &temp);
if (temp == 99) return ;
}while((temp < 1 || temp > KTYPE) && temp != 50);
if (temp == 50)
{
break;
}
for (i = 0; i < sno; i++)
{
if (temp == select[i])
{
printf("\aThat floor is already selected. \n");
break;
}
}
if ( i == sno)
{
select[sno++] = temp;
}
}
if (0 == sno)
{
return;
}
printf("Make the following block practicing %d times.\n", NO);
for (i = 0; i < sno; i++)
{
printf("%s ", kstr[select[i] - 1]);
}
printf("\nEntering the space to start. \n");
while(getch() != ' ')
;
tno = mno = 0;
for (i = 0; i < sno; i++)
{
len[i] = strlen(kstr[select[i] - 1]);
}
start = clock();
for (stage = 0; stage < NO; stage++)
{
char str[POS_LEN + 1];
for (i = 0; i < POS_LEN; i++)
{
int q = rand() % sno;
str[i] = kstr[select[q] - 1][rand() % len[q]];
}
str[i] = '\0';
mno += go(str);
tno += strlen(str);
}
end = clock();
printf("Title: %d characters/Mistakes: %d\n", tno, mno);
printf("Costint time %.1f seconds. \n",(double)(end-start)/CLOCKS_PER_SEC);
}
void word_training(char *mes, char *str[], int n)
{
int stage, qno, pno, tno, mno;
clock_t start, end;
printf("\npracetice %d numbers %s \n", NO, mes);
printf("Entering space to start. \n");
while(getch() != ' ')
;
tno = mno = 0;
pno = n;
start = clock();
for (stage = 0; stage < NO; stage++)
{
do
{
qno = rand() % n;
}while(qno == pno);
mno += go(str[qno]);
tno += strlen(str[qno]);
pno = qno;
}
end = clock();
printf("Title: %d characters/Mistakes: %d times \n", tno, mno);
printf("Costint time %.1f seconds. \n",(double)(end-start)/CLOCKS_PER_SEC);
}
int main()
{
Menu menu;
int cn = sizeof(cstr) / sizeof(cstr[0]);
int vn = sizeof(vstr) / sizeof(vstr[0]);
init_getputch();
srand(time(NULL));
do
{
switch(menu = SelectMenu())
{
case KeyPos:
pos_training();
break;
case KeyPosComp:
pos_training2();
break;
case Clang:
word_training("C Language word", cstr, cn);
break;
case Conversation :
word_training("English conversation file", vstr, vn);
break;
}
}while(menu != Term);
term_getputch();
return 0;
}