#include<iostream>
#include<stdlib.h>
#include<windows.h>//库
(资料图片)
using namespace std;//固定格式
int main(){
int a,b,c,miss,couttimes;
long long key,linshi;//数据的类型声明
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);//本地时间的调用
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<<"(如需查看程序声明,请在输入人数时输入'-1')"<<endl;
cout<<"(如需查看更新日志,请在输入人数时输入'0')"<<endl;
cout<<"输入人数及姓名(≥3):";
cin>>a;
if(a==-1){
cout<<endl<<"程序使用声明:"<<endl;
cout<<"程序‘英语抽背点名器’是由作者C811JNY2原创编写的一个简易工具.本软件源程序为个人原创,源程序仅供学习参考,不得用于任何商业用途.用户可以自由选择是否运行本程序.运行本程序即表明用户信任该程序作者.由个人恶意不按照正确使用方式输入导致的运行错误或无法正常使用,作者概不负责."<<endl;
cout<<"源程序已发布至https://www.bilibili.com/read/cv24004700(Version1.4.5.3)"<<endl;
cout<<"(120秒后自动关闭)";
Sleep(120000);
return 0;}//程序声明
if(a==0){
system("cls");
cout<<"编译器:Dev-C++ 5.11/TDM-GCC 4.9.2 64-bit Release"<<endl;
cout<<"现行版本:1.4.2.4.special ver."<<endl<<endl;
cout<<"更新日志:"<<endl;
cout<<"(2022-12-14)update-1.0.0:"<<endl;
cout<<"系统初步建立"<<endl<<endl;
cout<<"(2022-12-17)update-1.0.1:"<<endl;
cout<<"加入'中止抽背并统计'的功能" <<endl;
cout<<"将结尾等待时间从100秒改至99999秒"<<endl<<endl;
cout<<"(2023-1-15)update-1.1.0:"<<endl;
cout<<"引入'密钥',通过一定算法(动态数+常数)在不更换名单顺序的情况下实现不同次序,纠正伪随机算法"<<endl;
cout<<"加入'更新日志',便于程序优化更新"<<endl;
cout<<"将抽背完成后等待时间从99999秒改至999秒,减少非必要的内存消耗,加入时间提示"<<endl;
cout<<"解决'特殊位置无法抽到'的问题"<<endl;
cout<<"微量优化UI,在姓名间加入换行,使姓名更易读取"<<endl<<endl;
cout<<"(2022-1-19)update-1.1.1:"<<endl;
cout<<"简化了简单计算的写法,减少运行内存"<<endl;
cout<<"将站立标记的定义类型从int改为bool"<<endl<<endl;
cout<<"(此正式版未发布)update-1.2.0:"<<endl;
cout<<"完全改变数据的结构,用结构体data整合原变量,使程序结构更清晰,做好排序功能准备"<<endl;
cout<<"抽背人数上限定为100人,减少存储空间"<<endl<<endl;
cout<<"(2023-1-21)update-1.3.0:"<<endl;
cout<<"加入数据的排序功能(以分数为依据冒泡排序),在输出时按序输出"<<endl;
cout<<"将程序.cpp的源文件中分段并加入注释,便于理解和改写"<<endl<<endl;
cout<<"(2023-1-23)update-1.3.1:"<<endl;
cout<<"头文件从bits/stdc++.h中拆解出两条有效头文件--iostream(基础结构头文件)和stdlib.h(rand函数头文件)"<<endl;
cout<<"加入windows.h头文件,原'_sleep'非法等待函数调用出现的警告被修复,改为合法的'Sleep'函数,可在手机Dev编译器上运行等待函数"<<endl;
cout<<"补充了源文件注释"<<endl<<endl;
cout<<"(2023-1-28)update-1.3.2:"<<endl;
cout<<"修改源文件注释及少量使用说明"<<endl;
cout<<"将数组定义板块后置,使数组总量与需抽背人数相配,按需提高上限/减少运行空间"<<endl;
cout<<"显示每次开始运行时的系统时间,防止同时挂有多次运行时的统计错误"<<endl<<endl;
cout<<"(2023-2-15)update-1.4.0:"<<endl;
cout<<"密钥随系统时间动态变化,无需手动输入,解决'手动输入密钥相同'的问题"<<endl;
cout<<"加入windows.h库以支持系统时间调取"<<endl;
cout<<"将变量'linshi'的定义从int改为long long防止因密钥过长造成的错误"<<endl<<endl;
cout<<"(2023-2-28)update-1.4.1:"<<endl;
cout<<"少量修改1.4.1版本以前的更新日志"<<endl;
cout<<"用while的循环判定linshi是否等于上一次的抽背序号(miss),解决'特殊情况下多次抽背时序列相同'的问题"<<endl;
cout<<"结构体data从零开始记录,删去了取随机数时'防止取到空结构体组'的冗余代码(if(linshi==0){linshi=a;})"<<endl;
cout<<"在不影响抽背次序的情况下加入清屏功能(通过system( cls )实现)"<<endl;
cout<<"弹出更新日志后的等待查看时间从120s变为240s"<<endl;
cout<<"完善了使用说明"<<endl<<endl;
cout<<"(2023-3-5)update-1.4.2.1:"<<endl;
cout<<"简化第一行printf输出双引号内的格式"<<endl;
cout<<"结构体总量从a+1改为a"<<endl;
cout<<"优化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<<"修复 查看软件声明后无法正常退出的问题"<<endl;
cout<<"补充了源文件注释"<<endl<<endl;
cout<<"(2023-6-22)update-1.4.2.4.special ver.:"<<endl;
cout<<"(此版本为最终版,此后版本将停止加入新功能和进行代码优化,只对问题进行修复)"<<endl;
cout<<"修复 清空屏幕后针对单组记录分数决定无效的问题"<<endl;
cout<<"加入分数决定的判断,未按照格式输入时报错并重新输入"<<endl;
cout<<"补充了源文件注释"<<endl<<endl;
cout<<"如有发现功能异常,请及时联系作者(C811JNY2)"<<endl;
cout<<"(240秒后自动关闭)";
Sleep(240000);
return 0;//结束
}//更新日志
struct test{
int total;
int bj;
string name;
}data[a];//结构体
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;}//批量定义结构体数据
cout<<endl<<"输入抽背人数:";
cin>>b;
cout<<"在决定分数时按'0'以停止,按'2'以清空屏幕"<<endl;//辅助功能说明
Sleep(2000);//人数,名字的输入
for(int i=1;i<=b;i++){
linshi=(key/202+rand()%a+14+b*7)%a;//取随机数
while(linshi==miss){linshi+=1;}
linshi=linshi%a;
cout<<endl;
cout<<i<<"."<<data[linshi].name<<endl;//抽背功能实现核心部分
couttimes=1;
cout<<"分数决定(1或-1):";
cin>>c;
if(c==0){break;}//按'0'时break跳出循环
for(int j=0;j<couttimes;j++){
if(c==-1){data[linshi].bj=-1;b+=1;data[linshi].total+=c;break;}//抽到并分数为-1时,个体int标记为-1并增加抽背次数
if(c==1){data[linshi].bj=0;data[linshi].total+=c;break;}//抽到并分数为1时,个体int标记为0
if(c==2){system("cls");cout<<endl;couttimes++;}//按'2'时清屏后重新输出并决定分数
else{cout<<"不合法的输入数据!"<<endl<<endl;couttimes++;}//输入为其他数据时,警告并重新输入
cout<<i<<"."<<data[linshi].name<<endl;
cout<<"分数决定(1或-1):";
cin>>c;}}
miss=linshi;//miss令,去除连续抽背
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);//交换标记状态
swap(data[j-1].total,data[j].total);}}}//交换排序功能
cout<<endl<<endl<<"分数统计:"<<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秒后自动关闭";
Sleep(999000);//按序输出,结束
return 0;}