(C++)英語抽背點名器源程序-V1.4.2.5
#include<iostream>
#include<stdlib.h>
#include<windows.h>//庫
using namespace std;//固定格式
int main(){
int a,b,c,miss,couttimes;
long long key,linshi;//數(shù)據(jù)的類型聲明
SYSTEMTIME sys;
GetLocalTime(&sys);
printf("%d/%d/%d %02d:%02d:%02d.%d 星期%d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);//本地時間的調(diào)用?
cout<<endl<<endl;
long long wDay=sys.wDay;
cout<<"密鑰為:";
key=sys.wMonth*100000000000+wDay*1000000000+sys.wHour*10000000+sys.wMinute*100000+sys.wSecond*1000+sys.wMilliseconds;
cout<<key<<endl;
cout<<"(如需查看程序聲明,請在輸入人數(shù)時輸入'-1')"<<endl;
cout<<"(如需查看更新日志,請在輸入人數(shù)時輸入'0')"<<endl;
cout<<"輸入人數(shù)及姓名(≥3):";
cin>>a;
if(a==-1){
cout<<endl<<"程序使用聲明:"<<endl;
cout<<"程序‘英語抽背點名器’是由作者C811JNY2原創(chuàng)編寫的一個簡易工具.本軟件源程序為個人原創(chuàng),源程序僅供學(xué)習(xí)參考,不得用于任何商業(yè)用途.用戶可以自由選擇是否運行本程序.運行本程序即表明用戶信任該程序作者.由個人惡意不按照正確使用方式輸入導(dǎo)致的運行錯誤或無法正常使用,作者概不負責."<<endl;
cout<<"源程序已發(fā)布至https://www.bilibili.com/read/cv24004700(Version1.4.5.3)"<<endl;
cout<<"(120秒后自動關(guān)閉)";
Sleep(120000);
return 0;}//程序聲明?
if(a==0){
system("cls");
cout<<"編譯器:Dev-C++ 5.11/TDM-GCC 4.9.2 64-bit Release"<<endl;
cout<<"現(xiàn)行版本:1.4.2.5"<<endl<<endl;
cout<<"更新日志:"<<endl;
cout<<"(2022-12-14)update-1.0.0:"<<endl;
cout<<"系統(tǒng)初步建立"<<endl<<endl;
cout<<"(2022-12-17)update-1.0.1:"<<endl;
cout<<"加入'中止抽背并統(tǒng)計'的功能" <<endl;
cout<<"將結(jié)尾等待時間從100秒改至99999秒"<<endl<<endl;
cout<<"(2023-1-15)update-1.1.0:"<<endl;
cout<<"引入'密鑰',通過一定算法(動態(tài)數(shù)+常數(shù))在不更換名單順序的情況下實現(xiàn)不同次序,糾正偽隨機算法"<<endl;
cout<<"加入'更新日志',便于程序優(yōu)化更新"<<endl;
cout<<"將抽背完成后等待時間從99999秒改至999秒,減少非必要的內(nèi)存消耗,加入時間提示"<<endl;
cout<<"解決'特殊位置無法抽到'的問題"<<endl;
cout<<"微量優(yōu)化UI,在姓名間加入換行,使姓名更易讀取"<<endl<<endl;
cout<<"(2022-1-19)update-1.1.1:"<<endl;
cout<<"簡化了簡單計算的寫法,減少運行內(nèi)存"<<endl;
cout<<"將站立標記的定義類型從int改為bool"<<endl<<endl;
cout<<"(此正式版未發(fā)布)update-1.2.0:"<<endl;
cout<<"完全改變數(shù)據(jù)的結(jié)構(gòu),用結(jié)構(gòu)體data整合原變量,使程序結(jié)構(gòu)更清晰,做好排序功能準備"<<endl;
cout<<"抽背人數(shù)上限定為100人,減少存儲空間"<<endl<<endl;
cout<<"(2023-1-21)update-1.3.0:"<<endl;
cout<<"加入數(shù)據(jù)的排序功能(以分數(shù)為依據(jù)冒泡排序),在輸出時按序輸出"<<endl;
cout<<"將程序.cpp的源文件中分段并加入注釋,便于理解和改寫"<<endl<<endl;
cout<<"(2023-1-23)update-1.3.1:"<<endl;
cout<<"頭文件從bits/stdc++.h中拆解出兩條有效頭文件--iostream(基礎(chǔ)結(jié)構(gòu)頭文件)和stdlib.h(rand函數(shù)頭文件)"<<endl;
cout<<"加入windows.h頭文件,原'_sleep'非法等待函數(shù)調(diào)用出現(xiàn)的警告被修復(fù),改為合法的'Sleep'函數(shù),可在手機Dev編譯器上運行等待函數(shù)"<<endl;
cout<<"補充了源文件注釋"<<endl<<endl;
cout<<"(2023-1-28)update-1.3.2:"<<endl;
cout<<"修改源文件注釋及少量使用說明"<<endl;
cout<<"將數(shù)組定義板塊后置,使數(shù)組總量與需抽背人數(shù)相配,按需提高上限/減少運行空間"<<endl;
cout<<"顯示每次開始運行時的系統(tǒng)時間,防止同時掛有多次運行時的統(tǒng)計錯誤"<<endl<<endl;
cout<<"(2023-2-15)update-1.4.0:"<<endl;
cout<<"密鑰隨系統(tǒng)時間動態(tài)變化,無需手動輸入,解決'手動輸入密鑰相同'的問題"<<endl;
cout<<"加入windows.h庫以支持系統(tǒng)時間調(diào)取"<<endl;
cout<<"將變量'linshi'的定義從int改為long long防止因密鑰過長造成的錯誤"<<endl<<endl;
cout<<"(2023-2-28)update-1.4.1:"<<endl;
cout<<"少量修改1.4.1版本以前的更新日志"<<endl;?
cout<<"用while的循環(huán)判定linshi是否等于上一次的抽背序號(miss),解決'特殊情況下多次抽背時序列相同'的問題"<<endl;
cout<<"結(jié)構(gòu)體data從零開始記錄,刪去了取隨機數(shù)時'防止取到空結(jié)構(gòu)體組'的冗余代碼(if(linshi==0){linshi=a;})"<<endl;
cout<<"在不影響抽背次序的情況下加入清屏功能(通過system( cls )實現(xiàn))"<<endl;
cout<<"彈出更新日志后的等待查看時間從120s變?yōu)?40s"<<endl;
cout<<"完善了使用說明"<<endl<<endl;
cout<<"(2023-3-5)update-1.4.2.1:"<<endl;
cout<<"簡化第一行printf輸出雙引號內(nèi)的格式"<<endl;
cout<<"結(jié)構(gòu)體總量從a+1改為a"<<endl;
cout<<"優(yōu)化UI"<<endl;
cout<<"加入'抽背過程中是否被點到的判斷'(將變量bj類型從bool改為int)"<<endl;
cout<<"補充了源文件注釋"<<endl<<endl;
cout<<"(錯誤版本已被刪除)update-1.4.2.2:"<<endl;
cout<<"加入軟件聲明"<<endl<<endl;
cout<<"(2023-5-29)update-1.4.2.3:"<<endl;
cout<<"修復(fù) 查看軟件聲明后無法正常退出的問題"<<endl;
cout<<"補充了源文件注釋"<<endl<<endl;
cout<<"(2023-6-22)update-1.4.2.4.special ver.:"<<endl;
cout<<"修復(fù) 清空屏幕后針對單組記錄分數(shù)決定無效的問題"<<endl;
cout<<"加入分數(shù)決定的判斷,未按照格式輸入時報錯并重新輸入"<<endl;?
cout<<"補充了源文件注釋"<<endl<<endl;
cout<<"(2023-8-6)update-1.4.2.5:"<<endl;
cout<<"(此版本為最終版,此后版本將停止加入新功能和進行代碼優(yōu)化,只對問題進行修復(fù))"<<endl;?
cout<<"修復(fù)上一版本中miss令失效的問題"<<endl<<endl;
cout<<"如有發(fā)現(xiàn)功能異常,請及時聯(lián)系作者(C811JNY2)"<<endl;
cout<<"(240秒后自動關(guān)閉)";
Sleep(240000);
return 0;//結(jié)束
}//更新日志
struct test{
int total;
int bj;
string name;
}data[a];//結(jié)構(gòu)體
for(int i=0;i<a;i++){cin>>data[i].name;}
for(int i=0;i<a;i++){
data[i].total=0;
data[i].bj=1;}//批量定義結(jié)構(gòu)體數(shù)據(jù)?
cout<<endl<<"輸入抽背人數(shù):";
cin>>b;
cout<<"在決定分數(shù)時按'0'以停止,按'2'以清空屏幕"<<endl;//輔助功能說明?
Sleep(2000);//人數(shù),名字的輸入
for(int i=1;i<=b;i++){
linshi=(key/202+rand()%a+14+b*7)%a;//取隨機數(shù)
while(linshi==miss){linshi+=1;}
linshi=linshi%a;
cout<<endl;
cout<<i<<"."<<data[linshi].name<<endl;//抽背功能實現(xiàn)核心部分
couttimes=1;
cout<<"分數(shù)決定(1或-1):";
cin>>c;
if(c==0){break;}//按'0'時break跳出循環(huán)
for(int j=0;j<couttimes;j++){
if(c==-1){data[linshi].bj=-1;b+=1;data[linshi].total+=c;break;}//抽到并分數(shù)為-1時,個體int標記為-1并增加抽背次數(shù)
if(c==1){data[linshi].bj=0;data[linshi].total+=c;break;}//抽到并分數(shù)為1時,個體int標記為0
if(c==2){system("cls");cout<<endl;couttimes++;}//按'2'時清屏后重新輸出并決定分數(shù)
else{cout<<"不合法的輸入數(shù)據(jù)!"<<endl<<endl;couttimes++;}//輸入為其他數(shù)據(jù)時,警告并重新輸入?
cout<<i<<"."<<data[linshi].name<<endl;
cout<<"分數(shù)決定(1或-1):";
cin>>c;}miss=linshi;}
//miss令,去除連續(xù)抽背
for(int i=1;i<a;i++){
for(int j=1;j<a;j++){//冒泡排序?
if(data[j-1].total<data[j].total){
swap(data[j-1].name,data[j].name);//交換姓名
swap(data[j-1].bj,data[j].bj);//交換標記狀態(tài)
swap(data[j-1].total,data[j].total);}}}//交換排序功能
cout<<endl<<endl<<"分數(shù)統(tǒng)計:"<<endl;
for(int i=0;i<a;i++){
if(data[i].bj==-1){cout<<"(站立中) ";}//如果標記為-1,則代表在最后一次抽背時錯誤
if(data[i].bj==1){cout<<"(未點到) ";}//如果標記為1,則代表在全過程中未被點到?
if(data[i].bj==0){cout<<"? ? ? ? ?";}//標記為0時補空
cout<<data[i].name<<" "<<data[i].total<<endl;}
cout<<endl<<"999秒后自動關(guān)閉";
Sleep(999000);//按序輸出,結(jié)束
return 0;}