C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼
本小項(xiàng)目最終的實(shí)現(xiàn)如下:
輸入相應(yīng)的字符,然后在最下面能夠統(tǒng)計(jì)錯(cuò)誤的個(gè)數(shù),輸入字符總個(gè)數(shù),輸入個(gè)數(shù)以及錯(cuò)誤率。


那如何來(lái)實(shí)現(xiàn)這個(gè)小項(xiàng)目呢?規(guī)劃如下,我們需要大致實(shí)現(xiàn)以下三個(gè)模塊:
- (1)輸入模塊
- (2)顯示模塊
- (3)統(tǒng)計(jì)模塊
實(shí)現(xiàn)過(guò)程:
使用getch()函數(shù)可以獲取鍵盤(pán)輸入的字符,顯示可以使用Window自帶的API來(lái)實(shí)現(xiàn),統(tǒng)計(jì)就很簡(jiǎn)單了,就是計(jì)算輸入字符的個(gè)數(shù)等等。。。接下來(lái)就是簡(jiǎn)單的軟件邏輯的實(shí)現(xiàn)。
源碼如下:
#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);
//定義設(shè)置光標(biāo)結(jié)構(gòu)體變量
CONSOLE_CURSOR_INFO cci;
//定義默認(rèn)的坐標(biāo)位置
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);
}
//關(guān)閉窗口句柄
CloseHandle(hOut);
return 0 ;
}
//窗口初始化
void HANDLE_init(HANDLE hOut)
{
SetConsoleTitleA(TITLE);
//獲取當(dāng)前的句柄---設(shè)置為標(biāo)準(zhǔn)輸出句柄
//獲取光標(biāo)信息
GetConsoleCursorInfo(hOut, &cci);
//設(shè)置光標(biāo)大小
pos.X = 0 ;
pos.Y = 2 ;
cci.dwSize = 1;
//設(shè)置光標(biāo)不可見(jiàn) FALSE
cci.bVisible = 0;
//設(shè)置(應(yīng)用)光標(biāo)信息
SetConsoleCursorInfo(hOut, &cci);
}
static int __Get_User_input(HANDLE hOut,char *ch)
{
char tmp ;
int type = Char ;
//關(guān)閉回顯
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 ;
//打開(kāi)回顯
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 ;
}
//顯示和統(tǒng)計(jì)
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("錯(cuò)誤的個(gè)數(shù):%d", errno_Num) ;
pos.X = 0;
pos.Y = 16 ;
SetConsoleCursorPosition(hOut,pos);
printf("總個(gè)數(shù):%d", (int)strlen(text)) ;
pos.X = 0;
pos.Y = 17 ;
SetConsoleCursorPosition(hOut,pos);
printf("輸入個(gè)數(shù):%d", max) ;
pos.X = 0;
pos.Y = 18 ;
SetConsoleCursorPosition(hOut,pos);
if(count == 0)
printf("錯(cuò)誤率:0%%") ;
else
printf("錯(cuò)誤率:%.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);
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- 劍指offer之C語(yǔ)言不修改數(shù)組找出重復(fù)的數(shù)字
- C語(yǔ)言測(cè)試n的階乘和x的n次方
- C語(yǔ)言數(shù)組a和&a的區(qū)別講解
- C語(yǔ)言實(shí)現(xiàn)詞法分析器
- 使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)
- C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)快速排序
- 如何寫(xiě)出優(yōu)美的C語(yǔ)言代碼
- C語(yǔ)言用fstat函數(shù)獲取文件的大小方法
- C語(yǔ)言字符串另類用法的實(shí)現(xiàn)
- 劍指offer之C++語(yǔ)言實(shí)現(xiàn)鏈表(兩種刪除節(jié)點(diǎn)方式)
相關(guān)文章
C++的cout.tellp()和cout.seekp()語(yǔ)法介紹
無(wú)論是使用 cout 輸出普通數(shù)據(jù),用 cout.put() 輸出指定字符,還是用 cout.write() 輸出指定字符串,數(shù)據(jù)都會(huì)先放到輸出流緩沖區(qū),待緩沖區(qū)刷新,數(shù)據(jù)才會(huì)輸出到指定位置,本文給大家介紹一下C++的cout.tellp()和cout.seekp()語(yǔ)法,需要的朋友可以參考下2023-09-09
VC++文件監(jiān)控之FindFirstChangeNotification
因?yàn)镽eadDirectoryChangesW 上次測(cè)試發(fā)現(xiàn)不能多級(jí)目錄監(jiān)控,所以嘗試用FindFirstChangeNotification來(lái)實(shí)施文件監(jiān)控,需要的朋友可以參考下2019-04-04
利用C++單例模式實(shí)現(xiàn)高性能配置管理器
這篇文章主要為大家詳細(xì)介紹了如何利用C++單例模式實(shí)現(xiàn)高性能配置管理器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04
OpenCV數(shù)字圖像處理基于C++之圖像形態(tài)學(xué)處理詳解
OpenCV是一款由Intel公司俄羅斯團(tuán)隊(duì)發(fā)起并參與和維護(hù)的一個(gè)計(jì)算機(jī)視覺(jué)處理開(kāi)源軟件庫(kù),支持與計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)相關(guān)的眾多算法,下面這篇文章主要給大家介紹了關(guān)于OpenCV數(shù)字圖像處理基于C++之圖像形態(tài)學(xué)處理的相關(guān)資料,需要的朋友可以參考下2022-12-12
C語(yǔ)言實(shí)現(xiàn)三子棋簡(jiǎn)單小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋簡(jiǎn)單小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
linux系統(tǒng)中c++寫(xiě)日志文件功能分享
這篇文章主要介紹了linux系統(tǒng)中c++寫(xiě)日志文件功能,簡(jiǎn)化了glog,只保留了寫(xiě)日志文件的功能,只是改寫(xiě)了linux版本,需要的朋友可以參考下2014-03-03
C語(yǔ)言中用棧+隊(duì)列實(shí)現(xiàn)隊(duì)列中的元素逆置
這篇文章主要介紹了C語(yǔ)言中用利用棧和隊(duì)列實(shí)現(xiàn)隊(duì)列中的元素逆置的相關(guān)資料,對(duì)正在學(xué)習(xí)的小伙伴有一定的參考價(jià)值,需要的可以參考一下,希望對(duì)你有所幫助2022-02-02

