数字小键盘指法练习
數(shù)字小鍵盤指法練習(xí)是用來(lái)練習(xí)指法的一個(gè)小軟件,當(dāng)初我之所以編寫這個(gè)軟件是因?yàn)槲乙獏⒓咏衲晗奶焖拇ㄊ〉母呖纪ǚ止ぷ?#xff0c;我的指法太爛,速度太慢了,而且還因?yàn)椴粷M學(xué)校給我們提供的用來(lái)練習(xí)指法的軟件,是這樣的,在高考的通分中,大部分分?jǐn)?shù)就不帶小數(shù)點(diǎn),帶小數(shù)點(diǎn)也是只有.5小數(shù)點(diǎn),而學(xué)校給我們的那個(gè)軟件在產(chǎn)生數(shù)據(jù)的時(shí)候全部帶有小數(shù)點(diǎn)如:52.1、68.3、69.4等,這個(gè)還可以忍受,更讓人感覺不好的居然那個(gè)軟件有時(shí)間限制,我們?cè)诖蜷_它的時(shí)候它就自動(dòng)關(guān)閉了,而老師給我們的提示是叫我們改變系統(tǒng)時(shí)間來(lái)進(jìn)行指法練習(xí),我當(dāng)然不滿這種做法了,于是自己寫了這個(gè)軟件,好了下面我就來(lái)介紹一下我是如何實(shí)現(xiàn)的,先還是來(lái)介紹一下它的功能吧,然后在介紹是如何進(jìn)行編碼的:
?
該軟件具有如下功能:
1、具有數(shù)字鍵指法練習(xí)的一般功能即能夠進(jìn)行指法練習(xí)
2、具有“選項(xiàng)”參數(shù)設(shè)置功能,選項(xiàng)參數(shù)如下:
A: 輸入數(shù)據(jù):數(shù)據(jù)是否帶有小數(shù)點(diǎn),是否部分?jǐn)?shù)據(jù)帶有.5小數(shù)點(diǎn)等
B: 測(cè)試速度:擊鍵速度和單詞速度
C: 其它屬性:測(cè)試時(shí)間、顯示輸入錯(cuò)誤的信息的延遲時(shí)間、是否屏蔽非數(shù)字鍵
3、具有“選項(xiàng)”參數(shù)記憶功能,它能夠記住用戶上一次的選項(xiàng)設(shè)置,它會(huì)按照用戶上一次的設(shè)置來(lái)初始化程序
?
數(shù)據(jù)的產(chǎn)生:
?????? 既然是數(shù)字鍵指法練習(xí),那練習(xí)時(shí)的數(shù)據(jù)來(lái)源肯定是重中之重了,我是通過(guò)一個(gè)函數(shù)來(lái)實(shí)現(xiàn)的,它根據(jù)接受的整型參數(shù)來(lái)產(chǎn)生滿足要求的數(shù)據(jù),其中用到了random()這個(gè)函數(shù)來(lái)產(chǎn)生隨機(jī)數(shù),通過(guò)該函數(shù)代碼如下:
?
AnsiString __fastcall TfrmMain::RandNum(int Flag)
{
??? //TODO: Add your source code here
??? double RandNum;
??? switch (Flag)
? ??{
????? case 1:?? //全部數(shù)字不帶有小數(shù)點(diǎn)
??????????? RandNum=random (100);
??????????? break;
????? case 2:?? //部分?jǐn)?shù)字帶有小數(shù)點(diǎn)
??????????? RandNum=random (100);
??????????? if (rand()%2)
??????????? {
??????????????? RandNum=RandNum+(rand()%10)/double(10);
??????????? }
??????????? break;
????? case 3:
??????????? RandNum=random (100);
??????????? RandNum=RandNum+(rand()%10)/double(10);
??????????? break;
????? case 4:
??????????? RandNum=random (100);
??????????? RandNum=RandNum+0.5;
??????????? break;
????? case 5:
? ??????????RandNum=random (100);
??????????? if(rand()%2)
??????????? {
??????????????? RandNum=RandNum+0.5;
??????????? }
??????????? break;
????? default:? //全部數(shù)字不帶有小數(shù)點(diǎn)
??????????? RandNum=random (100);
??? }
??? return AnsiString(RandNum);
}
?
測(cè)試速度:
?????? 該軟件的速度測(cè)試分兩種:擊鍵速度和單詞速度,擊鍵速度表示用戶每分鐘用戶的擊鍵書,而單詞速度則表示用戶每分鐘用戶所輸入的數(shù)字個(gè)數(shù),測(cè)試速度的取得我也是通過(guò)一個(gè)函數(shù)來(lái)實(shí)現(xiàn)的,該函數(shù)代碼如下:
void __fastcall TfrmMain::Stat(int flagSpeed)
{
??? //TODO: Add your source code here
??? dwTimeElapse=timeGetTime()-dwTimeStart;
???
??? stTime->Caption="剩余時(shí)間:"+AnsiString(tmTest-dwTimeElapse/1000)+" 秒";
??? switch (flagSpeed)
??? {
????? case 1: //擊鍵速度
??????? if (dwTimeElapse>0)
??????? {
??????? long int temp1=(60*1000*(NumCount)/dwTimeElapse);
??????? stSpeed->Caption="擊鍵速度:"+AnsiString(temp1)+"/分";
??????????? //紀(jì)錄速度
??????? recSpeed=temp1;
??????? }
??????? stWordNum->Caption="擊鍵數(shù):"+AnsiString(NumCount);
?????? break;
????? case 2: //單詞速度
??????? if (dwTimeElapse>0)
??????? {
??????? long int temp2=(60*1000*(NumCount)/dwTimeElapse);
??????? stSpeed->Caption="單詞速度:"+AnsiString(temp2)+"/分";
??????????? //紀(jì)錄速度
??????? recSpeed=temp2;
??????? }
??????? stWordNum->Caption="單詞數(shù):"+AnsiString(wordNum);
??????? //ShowMessage(flagSpeed);
??????? break;
??? }?
?
??? if (wordNum>0)
??? {
??????? long int temp=100*(wordNum-WrongNum)/wordNum;
??????? stCorrRate->Caption="正確率:"+AnsiString(temp)+"%";
??????????? //紀(jì)錄正確率
??????? recCorrRate=temp;
??? }
??? else
??? {
??????? stCorrRate->Caption="正確率:"+AnsiString(0)+"%";
??????????? //紀(jì)錄正確率
??????? recCorrRate=0;
??? }
}
上面的代碼種用到了一個(gè)Win32 API函數(shù)timeGetTime(),它的作用是取得系統(tǒng)自啟動(dòng)到現(xiàn)在所經(jīng)歷的時(shí)間,以毫秒為單位,它的聲明如下:
?
DWORD timeGetTime(VOID);
?
“選項(xiàng)”參數(shù)記憶功能:
?????? 該軟件具體參數(shù)屬性的記憶功能,能夠?qū)崿F(xiàn)的方式非常多,如可以通過(guò)ini文件,一般文件來(lái)達(dá)到記憶的功能,還可以通過(guò)注冊(cè)表來(lái)完成該功能,我在實(shí)現(xiàn)的時(shí)候選擇了通過(guò)通過(guò)注冊(cè)表來(lái)實(shí)現(xiàn),我主要用到了getKeyValue()和setKeyValue()兩個(gè)函數(shù)來(lái)完成該功能,getKeyValue()的功能是取得注冊(cè)表中某個(gè)鍵的值,而setKeyValue()的功能則是設(shè)置注冊(cè)表中某項(xiàng)的值代碼如下:
getKeyValue()函數(shù):
AnsiString getKeyValue(AnsiString RegPath,AnsiString Key)
{
??? //TODO: Add your source code here
?? ?TRegistry *Registry = new TRegistry;
??? AnsiString Result="";
??? try
??? {
??????? Registry->OpenKey(RegPath,false);
??????? Result=Registry->ReadString(Key);
??? }
??? __finally
??? {
??????? delete? Registry;
??? }
??? return Result;
}
setKeyValue()函數(shù):
bool setKeyValue(AnsiString RegPath,AnsiString Key,AnsiString Value)
{
??? //TODO: Add your source code here
??? TRegistry *Registry = new TRegistry;
??? try
??? {
??????? Registry->OpenKey(RegPath,true);
??????? Registry->WriteString(Key,Value);
??? }
???? __finally
??? {
??????? delete Registry;
??? }
??? return true;
}
?
以上介紹的只是該軟件中的一些比較重要功能的實(shí)現(xiàn),其實(shí)作為一個(gè)軟件,它還有許多方面可以沒有介紹或者是很難說(shuō)清楚,如果你對(duì)該軟件感興趣的話可以下載該軟件的所有源碼,網(wǎng)址:http://www.zccfamily.com/zqget/, 它是用Borland C++ Builder開發(fā)的,如果你對(duì)該軟件有任何意見或建議,或者想與我共同探討,交流想法的話,我的聯(lián)系方式: email:zqget@msn.com總結(jié)
- 上一篇: veryCD关闭之后,我们该何去何从。别
- 下一篇: pdf2word(pdf转word)