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)體、指針類(lèi)型的數(shù)據(jù)
- C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)快速排序
- 如何寫(xiě)出優(yōu)美的C語(yǔ)言代碼
- C語(yǔ)言用fstat函數(shù)獲取文件的大小方法
- C語(yǔ)言字符串另類(lèi)用法的實(shí)現(xiàn)
- 劍指offer之C++語(yǔ)言實(shí)現(xiàn)鏈表(兩種刪除節(jié)點(diǎn)方式)
相關(guān)文章
C++ OpenCV學(xué)習(xí)之圖像像素值統(tǒng)計(jì)
在圖像分析的時(shí)候,我們經(jīng)常需要對(duì)單通道圖像的像素進(jìn)行統(tǒng)計(jì)。本文將主要介紹利用C++ OpenCV實(shí)現(xiàn)的圖像像素值統(tǒng)計(jì)的幾種方法,需要的可以參考一下2022-01-01C++實(shí)現(xiàn)選擇性排序(SelectionSort)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)選擇性排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04Windows10配置VSCode C++環(huán)境(超詳細(xì),面向小白以及大佬們)
這篇文章主要介紹了Windows10配置VSCode C++環(huán)境(超詳細(xì),面向小白以及大佬們),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12C++實(shí)現(xiàn)俄羅斯方塊(linux版本)
這篇文章主要為大家詳細(xì)介紹了linux版本C++實(shí)現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07Qt5實(shí)現(xiàn)qDebug日志信息寫(xiě)入日志文件過(guò)程
這篇文章主要為大家介紹了Qt5實(shí)現(xiàn)qDebug日志信息寫(xiě)入日志文件的過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Visual Studio 2019創(chuàng)建C++ Hello World項(xiàng)目的方法
這篇文章主要介紹了Visual Studio 2019創(chuàng)建C++ Hello World項(xiàng)目的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03C語(yǔ)言實(shí)現(xiàn)經(jīng)典小游戲井字棋的示例代碼
這個(gè)三子棋游戲是在學(xué)習(xí)C語(yǔ)言的過(guò)程中自己編寫(xiě)的一個(gè)小游戲,現(xiàn)在將自己的思路(主要以流程圖形式和代碼中的注釋表達(dá))和具體代碼以及運(yùn)行結(jié)果分享出來(lái)以供大家學(xué)習(xí)參考,希望對(duì)大家有所幫助2022-11-11C++ 學(xué)習(xí)之旅三 我和超級(jí)瑪麗有個(gè)約會(huì)
學(xué)習(xí)了c++有一周有余了吧,感謝孫鑫老師的視頻教程,讓我 對(duì)C++有了基本的了解,并理解到C++與.net 的許許多多的區(qū)別,更要感謝網(wǎng)民為programaking的人,會(huì)為我提供了超級(jí)瑪麗制作揭秘 這套寶貴的教程,讓我 做做出了這個(gè)項(xiàng)目,對(duì)c++ 有了一個(gè)更深層次的認(rèn)識(shí)2012-11-11C語(yǔ)言將音視頻時(shí)鐘同步封裝成通用模塊的方法
視頻的時(shí)鐘基于視頻幀的時(shí)間戳,由于視頻是通過(guò)一定的幀率渲染的,采用直接讀取當(dāng)前時(shí)間戳的方式獲取時(shí)鐘會(huì)造成一定的誤差,精度不足,這篇文章主要介紹了c語(yǔ)言將音視頻時(shí)鐘同步封裝成通用模塊,需要的朋友可以參考下2022-09-09解析linux 文件和目錄操作的相關(guān)函數(shù)
以下是對(duì)linux中文件和目錄操作的相關(guān)函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08