#问题
本人初学C++,编译了一个计时小程序遇到诸多问题和bug。
计时程序用了两条线路,一个是void指针函数,另一个是主函数。void函数主要辅助计时程序。主函数主要是判断和运行。
当输入的数字不是对应数字时,主函数会判断并让用户重新输入数字,但字符串或字母无法做到。程序会出现bug。
#问题描述
正常运行可以但存在bug
bug1:
当输入整型变量int时,一旦输入字母或其他字符串。cin输入锁死。无法进行下一步操作。我目前的解决思路是,当用户一旦输入的不是数字,直接结束程序。
bug1修复思路:
只要是字符或字符串以及不是对应数字的数字(如胡乱输入的数字),均跳转为重新输入界面。本人代码能力有限,多次尝试修复无果。
bug2:
当计时开始后中断计时或者输入的不是对应数字时,两者都将重新跳转至主函数cout,此时必须随机输入一个数字才可运行,如果不输入数字,程序将停滞。不知道为何无法直接跳转至主函数。输入字母直接锁cin。
目前的解决思路是弹出文字提示:随机输入一个数字继续。但这种行为太过无用。因此想请教如何不用输入任意数字直接跳转到主函数cout文字。
bug3:
当计时开始后本人设定的程序是按空格直接中断计时。但是空格灵敏度不够高,多次按空格才能够中断。本人猜测为空格检测算法有问题,因此向各位请教如何按一下空格直接中断计时。本人检测空格用kbhit()函数。
优化1:本人用现实世界测试,发现该程序计时时间与真实时间相差1.25s(甚至更多)之差。于是请教各位如何优化算法,使计时准确度提高。最大相差应不超过0.1s。
#总结
本人请教各位C++程序设计方面的内容
内容包括:
一个计时器。按1开始计时,按2退出程序。
输入的不是1或2或者输入的是字符或字符串时,要求重新输入。
按1计时时,计时误差(与真实世界)应小于0.1s 并且在计时过程中随时按空格随时停止计时。并返回计时开始前界面。
请求各位指点迷津&&修复bug&&优化算法。
谢谢!
下面是源代码
#include
#include
using namespace std;
void DoWork()
{
int a=0,b=0,c=0,n;
for(int i=0;;i++)
{
//system("cls");
//cout<<"\033c";
a+=1;
//Sleep(1*1000);
Sleep(0.01*1000);
if(a==60)
{
a=0;
b+=1;
}
if(b==60)
{
b=0;
c+=1;
}
if(b==0&&c==0)
{
cout<<a<<endl;
cout<<"你已经在线长达"<<a<<"秒"<<endl;
}
if(b!=0&&c==0)
{
cout<<b<<":"<<a<<endl;
cout<<"你已经在线长达"<<b<<"分"<<a<<"秒"<<endl;
}
if(c!=0)
{
cout<<c<<":"<<b<<":"<<a<<endl;
cout<<"你已经在线长达"<<c<<"时"<<b<<"分"<<a<<"秒\b" ;
}
cout<<"\n按空格随时中断计时\n";
if(kbhit())
{
n=getch();
if(kbhit()&&getch()==' ')
{
system("cls");
cout<<"\n计时结束\n\n===============================\n\n";
Sleep(1*1000);
system("cls");
break;
}
else n==0;
}
Sleep(0.99*1000);
system("cls");
}
}
int main()
{
long long int m=0;
int s=0;
for(int k=0;;k++)
{
system("cls");
cout<<"\n 计时器\n按1开始计时 \n按2退出程序\n\n 1. 该程序仅供学习交流,切勿用于非法用途\n 2. 该程序经过测试,与真实时间慢1.25s左右。故计数时间仅供参考,切勿用于专业测试"<<endl;
cout<<"\n请输入对应数字"<<endl;
cin>>m;
if(m==1)
{
system("cls");
cout<<"开始计时!"<<endl;
Sleep(1.*1000);
system("cls");
DoWork();
cout<<"\n输入任意数字继续\n";
}
if(m==2)
{
system("cls");
cout<<"程序即将结束......"<<endl;
Sleep(1*1000);
break;
return 0;
}
if(m!=1&&m!=2)
{
system("cls");
cout<<"你输入的数字不对。"<<endl;
Sleep(0.3*1000);
cout<<"请重新输入"<<endl;
Sleep(0.5*1000);
cout<<"\n输入任意数字继续\n";
}
if(!(cin>>m))
{
system("cls");
cout<<"\n你输入的不是数字,程序被迫结束!\n";
Sleep(0.8*1000);
//return 0;
break;
}
}
cout<<"程序即将结束......"<<endl;
Sleep(1*1000);
return 0;
}
```
发现输入格式不对时,
cin.clear();
cin.sync();
重新输入