经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言制作简易金山打字通功能的代码
来源:jb51  时间:2018/12/17 9:23:07  对本文有异议

本小项目最终的实现如下:

输入相应的字符,然后在最下面能够统计错误的个数,输入字符总个数,输入个数以及错误率。

那如何来实现这个小项目呢?规划如下,我们需要大致实现以下三个模块:

  • (1)输入模块
  • (2)显示模块
  • (3)统计模块

实现过程:

使用getch()函数可以获取键盘输入的字符,显示可以使用Window自带的API来实现,统计就很简单了,就是计算输入字符的个数等等。。。接下来就是简单的软件逻辑的实现。

源码如下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <Windows.h>
  4. #include <unistd.h>
  5. #include <conio.h>
  6. #define NR(x) sizeof(x)/sizeof(x[0])
  7. //清屏
  8. #define ClearScreen() system("cls");
  9. #define TITLE "金山打字通"
  10. enum
  11. {
  12. LEFT = 1 ,
  13. RIGHT ,
  14. BACKSPACE ,
  15. ESC ,
  16. Char,
  17. };
  18. enum KEYBOARD
  19. {
  20. ESC_KEY = 27,
  21. BACKSPACE_KEY = 8 ,
  22. LEFT_KEY = 75 ,
  23. RIGHT_KEY = 77
  24. };
  25. int iindex = 0 ;
  26. int max = 0 ;
  27. static int count = 0 ;
  28. char buffer[1024] = {0} ;
  29. int Get_User_input(HANDLE hOut,char *ch) ;
  30. void Show_string(HANDLE hOut,const char *text) ;
  31. //窗口初始化
  32. void HANDLE_init(HANDLE hOut);
  33. //定义设置光标结构体变量
  34. CONSOLE_CURSOR_INFO cci;
  35. //定义默认的坐标位置
  36. COORD pos = {0,0};
  37. int main(void)
  38. {
  39. char *text = "WelCome to School ... Good Good Work ,Day Day Up !" ;
  40. char ch ;
  41. int ret ;
  42. HANDLE hOut;
  43. hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  44. HANDLE_init(hOut);
  45. printf("\n%s\n",text);
  46. Show_string(hOut,text);
  47. while(1)
  48. {
  49. if(max >= strlen(text))
  50. break ;
  51. ret = Get_User_input(hOut,&ch) ;
  52. if(ret == ESC)
  53. break ;
  54. Show_string(hOut,text);
  55. }
  56. //关闭窗口句柄
  57. CloseHandle(hOut);
  58. return 0 ;
  59. }
  60. //窗口初始化
  61. void HANDLE_init(HANDLE hOut)
  62. {
  63. SetConsoleTitleA(TITLE);
  64. //获取当前的句柄---设置为标准输出句柄
  65. //获取光标信息
  66. GetConsoleCursorInfo(hOut, &cci);
  67. //设置光标大小
  68. pos.X = 0 ;
  69. pos.Y = 2 ;
  70. cci.dwSize = 1;
  71. //设置光标不可见 FALSE
  72. cci.bVisible = 0;
  73. //设置(应用)光标信息
  74. SetConsoleCursorInfo(hOut, &cci);
  75. }
  76. static int __Get_User_input(HANDLE hOut,char *ch)
  77. {
  78. char tmp ;
  79. int type = Char ;
  80. //关闭回显
  81. pos.X = 0 ;
  82. pos.Y = 2 ;
  83. GetConsoleCursorInfo(hOut, &cci);
  84. cci.dwSize = 100;
  85. cci.bVisible = 0;
  86. SetConsoleCursorInfo(hOut, &cci);
  87. tmp = getch() ;
  88. switch(tmp)
  89. {
  90. case ESC_KEY : type = ESC ; break ;
  91. case BACKSPACE_KEY : type = BACKSPACE ; break ;
  92. case LEFT_KEY : type = LEFT ; break ;
  93. case RIGHT_KEY : type = RIGHT; break ;
  94. }
  95. *ch = tmp ;
  96. //打开回显
  97. pos.X = 0 ;
  98. pos.Y = 2 ;
  99. GetConsoleCursorInfo(hOut, &cci);
  100. cci.dwSize = 100;
  101. cci.bVisible = 1;
  102. SetConsoleCursorInfo(hOut, &cci);
  103. return type ;
  104. }
  105. //获取用于输入
  106. int Get_User_input(HANDLE hOut,char *ch)
  107. {
  108. int type ;
  109. type = __Get_User_input(hOut,ch);
  110. switch(type)
  111. {
  112. case Char :
  113. if(buffer[iindex] == '\0' )
  114. buffer[iindex] = *ch ;
  115. else
  116. {
  117. memmove(buffer+iindex+1 , buffer+iindex , max-iindex) ;
  118. buffer[iindex] = *ch ;
  119. }
  120. iindex ++ ; max ++ ; break ;
  121. //case LEFT : if(iindex > 0) iindex -- ; break ;
  122. //case RIGHT : if(iindex < max) iindex ++ ; break ;
  123. case BACKSPACE :
  124. if(iindex > 0){
  125. memmove(buffer+iindex-1 , buffer+iindex , max-iindex) ;
  126. iindex -- ;
  127. max -- ;
  128. }
  129. if(iindex == 0)
  130. {
  131. count = 0 ;
  132. }
  133. break ;
  134. case ESC : return ESC ;
  135. }
  136. return 0 ;
  137. }
  138. //显示和统计
  139. void Show_string(HANDLE hOut,const char *text)
  140. {
  141. system("cls") ;
  142. printf("\n%s\n",text) ;
  143. int i ;
  144. int errno_Num = 0 ;
  145. for(i = 0 ; i < max ; i++)
  146. {
  147. if(buffer[i] == text[i])
  148. {
  149. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | 0x8);
  150. printf("%c",buffer[i]);
  151. }
  152. else
  153. {
  154. SetConsoleTextAttribute(hOut, FOREGROUND_RED | 0x8);
  155. printf("%c",buffer[i]);
  156. errno_Num++ ;
  157. }
  158. }
  159. pos.X = 0 ;
  160. pos.Y = 2 ;
  161. cci.dwSize = 100;
  162. cci.bVisible = 1 ;
  163. SetConsoleCursorPosition(hOut,pos);
  164. SetConsoleCursorInfo(hOut, &cci);
  165. SetConsoleTextAttribute(hOut,FOREGROUND_GREEN | 0x8);
  166. pos.X = 0;
  167. pos.Y = 15 ;
  168. SetConsoleCursorPosition(hOut,pos);
  169. printf("错误的个数:%d", errno_Num) ;
  170. pos.X = 0;
  171. pos.Y = 16 ;
  172. SetConsoleCursorPosition(hOut,pos);
  173. printf("总个数:%d", (int)strlen(text)) ;
  174. pos.X = 0;
  175. pos.Y = 17 ;
  176. SetConsoleCursorPosition(hOut,pos);
  177. printf("输入个数:%d", max) ;
  178. pos.X = 0;
  179. pos.Y = 18 ;
  180. SetConsoleCursorPosition(hOut,pos);
  181. if(count == 0)
  182. printf("错误率:0%%") ;
  183. else
  184. printf("错误率:%.2f%%",((float)errno_Num)/((float)max)*100) ;
  185. pos.X = iindex + 1 ;
  186. pos.Y = 2 ;
  187. cci.dwSize = 100;
  188. cci.bVisible = 1 ;
  189. count = 1 ;
  190. SetConsoleCursorPosition(hOut,pos);
  191. SetConsoleCursorInfo(hOut, &cci);
  192. fflush(stdout);
  193. }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。如果你想了解更多相关内容请查看下面相关链接

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号