C语言制作简易金山打字通功能的代码

 更新时间:2018年12月14日 16:02:41   作者:Engineer-Bruce_Yang  
今天小编就为大家分享一篇关于C语言制作简易金山打字通功能的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

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

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

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

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

实现过程:

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

源码如下:

#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <unistd.h>
#include <conio.h>
#define NR(x) sizeof(x)/sizeof(x[0])
//清屏
#define ClearScreen() \
   system("cls");
#define TITLE "金山打字通"  
enum
{
 LEFT = 1 ,
 RIGHT ,
 BACKSPACE ,
 ESC ,
 Char,
};
enum KEYBOARD
{
 ESC_KEY = 27,
 BACKSPACE_KEY = 8 ,
 LEFT_KEY = 75 ,
 RIGHT_KEY = 77
};
int iindex = 0 ;
int max = 0 ; 
static int count = 0 ;
char buffer[1024] = {0} ;
int Get_User_input(HANDLE hOut,char *ch) ;
void Show_string(HANDLE hOut,const char *text) ;
//窗口初始化
void HANDLE_init(HANDLE hOut);
//定义设置光标结构体变量
CONSOLE_CURSOR_INFO cci; 
//定义默认的坐标位置  
COORD pos = {0,0};
int main(void)
{
 char *text = "WelCome to School ... Good Good Work ,Day Day Up !" ;
 char ch ;
 int ret ;
 HANDLE hOut;
 hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 HANDLE_init(hOut);
 printf("\n%s\n",text);
 Show_string(hOut,text);
 while(1)
 {
 if(max >= strlen(text))
  break ;
 ret = Get_User_input(hOut,&ch) ;
 if(ret == ESC)
  break ;
 Show_string(hOut,text);
 }
 //关闭窗口句柄
 CloseHandle(hOut);
 return 0 ;
}
//窗口初始化
void HANDLE_init(HANDLE hOut)
{
 SetConsoleTitleA(TITLE);
 //获取当前的句柄---设置为标准输出句柄 
  //获取光标信息
  GetConsoleCursorInfo(hOut, &cci); 
 //设置光标大小  
 pos.X = 0 ; 
 pos.Y = 2 ;
  cci.dwSize = 1; 
 //设置光标不可见 FALSE  
  cci.bVisible = 0; 
  //设置(应用)光标信息
  SetConsoleCursorInfo(hOut, &cci);
}
static int __Get_User_input(HANDLE hOut,char *ch) 
{
 char tmp ;
 int type = Char ;
 //关闭回显 
 pos.X = 0 ; 
 pos.Y = 2 ;
 GetConsoleCursorInfo(hOut, &cci); 
 cci.dwSize = 100; 
  cci.bVisible = 0;
 SetConsoleCursorInfo(hOut, &cci); 
 tmp = getch() ;
 switch(tmp)
 {
 case ESC_KEY : type = ESC ; break ; 
 case BACKSPACE_KEY : type = BACKSPACE ; break ;
 case LEFT_KEY : type = LEFT ; break ; 
 case RIGHT_KEY : type = RIGHT; break ;
 }
 *ch = tmp ;
 //打开回显 
 pos.X = 0 ; 
 pos.Y = 2 ;
 GetConsoleCursorInfo(hOut, &cci); 
 cci.dwSize = 100; 
  cci.bVisible = 1;
 SetConsoleCursorInfo(hOut, &cci); 
 return type ;
}
//获取用于输入 
int Get_User_input(HANDLE hOut,char *ch)
{
 int type ; 
 type = __Get_User_input(hOut,ch);
 switch(type)
 {
 case Char : 
   if(buffer[iindex] == '\0' ) 
   buffer[iindex] = *ch ;
   else
   {
   memmove(buffer+iindex+1 , buffer+iindex , max-iindex) ;
   buffer[iindex] = *ch ;
   }
   iindex ++ ; max ++ ; break ;
 //case LEFT : if(iindex > 0) iindex -- ; break ;
 //case RIGHT : if(iindex < max) iindex ++ ; break ;
 case BACKSPACE : 
   if(iindex > 0){
   memmove(buffer+iindex-1 , buffer+iindex , max-iindex) ; 
   iindex -- ; 
   max -- ;
   }
   if(iindex == 0)
   {
   count = 0 ; 
   }
   break ;
 case ESC : return ESC ;
 }
 return 0 ;
}
//显示和统计 
void Show_string(HANDLE hOut,const char *text)
{
 system("cls") ;
 printf("\n%s\n",text) ;
 int i ; 
 int errno_Num = 0 ; 
 for(i = 0 ; i < max ; i++)
 {
 if(buffer[i] == text[i])
 {
  SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | 0x8);
  printf("%c",buffer[i]);
 }
 else 
 {
  SetConsoleTextAttribute(hOut, FOREGROUND_RED | 0x8);
  printf("%c",buffer[i]);
  errno_Num++ ;
 }
 }
 pos.X = 0 ; 
 pos.Y = 2 ;
 cci.dwSize = 100; 
 cci.bVisible = 1 ;
 SetConsoleCursorPosition(hOut,pos);
 SetConsoleCursorInfo(hOut, &cci); 
 SetConsoleTextAttribute(hOut,FOREGROUND_GREEN | 0x8);
 pos.X = 0;
 pos.Y = 15 ;
 SetConsoleCursorPosition(hOut,pos);
 printf("错误的个数:%d", errno_Num) ;
 pos.X = 0;
 pos.Y = 16 ;
 SetConsoleCursorPosition(hOut,pos);
 printf("总个数:%d", (int)strlen(text)) ;
 pos.X = 0;
 pos.Y = 17 ;
 SetConsoleCursorPosition(hOut,pos);
 printf("输入个数:%d", max) ;
 pos.X = 0;
 pos.Y = 18 ;
 SetConsoleCursorPosition(hOut,pos);
 if(count == 0)
 printf("错误率:0%%") ;
 else
 printf("错误率:%.2f%%",((float)errno_Num)/((float)max)*100) ;
 pos.X = iindex + 1 ; 
 pos.Y = 2 ;
 cci.dwSize = 100; 
 cci.bVisible = 1 ;
 count = 1 ;
 SetConsoleCursorPosition(hOut,pos);
 SetConsoleCursorInfo(hOut, &cci); 
 fflush(stdout);
}

总结

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

相关文章

  • 解析一个有关sizeof用法的题目--sizeof(i++)

    解析一个有关sizeof用法的题目--sizeof(i++)

    本篇文章是对一个关于sizeof用法的题目进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C++中继承的概念和定义

    C++中继承的概念和定义

    这篇文章主要介绍了详解C++ 中的概念和定义,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下,希望能给你带来帮助
    2021-08-08
  • 使用boost读取XML文件详细介绍

    使用boost读取XML文件详细介绍

    这篇文章主要介绍了使用boost读取XML文件详细介绍的相关资料,需要的朋友可以参考下
    2016-11-11
  • C++实现趣味扫雷游戏

    C++实现趣味扫雷游戏

    这篇文章主要为大家详细介绍了C++实现趣味扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 看图深入理解单链表的反转

    看图深入理解单链表的反转

    今天遇到单向链表的反转的问题,于是静下心来好好想了一番。下面这篇文章主要给大家介绍了关于单链表反转的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • C++运算符重载 成员函数与友元函数详解

    C++运算符重载 成员函数与友元函数详解

    以下是对C++运算符重载 成员函数与友元函数进行了介绍,需要的朋友可以过来参考下
    2013-07-07
  • C语言编程动态内存分配常见错误全面分析

    C语言编程动态内存分配常见错误全面分析

    这篇文章主要介绍了C语言编程中动态内存分配的常见错误全面分析讲解,同样遇到过C语言动态内存分配各种问题的同学可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • C++利用LuaIntf调用Lua的方法示例

    C++利用LuaIntf调用Lua的方法示例

    这篇文章主要给大家介绍了关于C++利用LuaIntf调用Lua以及利用lua-intf来调用C++函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-11-11
  • C语言的堆串操作详解

    C语言的堆串操作详解

    大家好,本篇文章主要讲的是C语言的堆串操作详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • c++实现发送http请求通过get方式获取网页源代码

    c++实现发送http请求通过get方式获取网页源代码

    这篇文章主要介绍了c++实现发送http请求,通过get方式获取网页源代码的示例,需要的朋友可以参考下
    2014-02-02

最新评论