C语言实现一个简易版的打字软件

简介: C语言实现一个简易版的打字软件

这是很久之前学习C语言练习的一个小项目。


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


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

640.png

640.png

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

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  "金山打字通----杨源鑫20180608"
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);
}

往期精彩

分享一个很好用的按键组件


分享一个非常有用且简单C语言测试框架


分享一个自己量产项目上的集成测试软件MTTEST

目录
相关文章
|
3月前
|
C语言
C语言打字游戏源码
C语言打字游戏源码
58 0
|
8月前
|
存储 安全 Java
使您的软件运行起来: 防止缓冲区溢出(C语言精华帖)
使您的软件运行起来: 防止缓冲区溢出(C语言精华帖)
38 1
|
9月前
|
存储 C语言
C语言实现简易版扫雷
C语言实现简易版扫雷
35 0
|
9月前
|
C语言
C语言实现简易版三子棋
C语言实现简易版三子棋
20 0
|
C语言
你是真的“C”——详解C语言实现简易版扫雷小游戏
详解C语言实现简易版扫雷小游戏项目
69 0
你是真的“C”——详解C语言实现简易版扫雷小游戏
|
程序员 C语言 UED
C语言实现简易版扫雷
C语言实现简易版扫雷
C语言实现简易版扫雷
|
IDE NoSQL 前端开发
C语言学习——IDE软件Code::Blocks教程
C语言学习——IDE软件Code::Blocks教程
453 0
C语言学习——IDE软件Code::Blocks教程
|
C语言
C语言50行实现简易版节日效果树(图解+注释)
C语言50行实现简易版节日效果树(图解+注释)
107 0
C语言50行实现简易版节日效果树(图解+注释)
|
C语言
c语言打字游戏代码
c语言打字游戏代码
198 0