c++ - 执行方法后一行出现两次
问题描述
执行一个方法后,一行出现两次。我知道的最重要的事情是问题来自tasks[i].getdue()
线路。如果我删除这条线完全没有问题,但这个功能会产生这个错误。我猜这行实际上恢复了代码流并且不会中断它。
有没有什么办法解决这一问题?
这是我的代码:
#include<iostream>
#include<string.h>
using namespace std;
class Time
{
private:
int days,hour,minute,seconds;
public:
Time(int hour=0,int minute=0,int seconds=0)
{
minute+=seconds/60;
seconds=seconds%60;
hour+=minute/60;
minute=minute%60;
days=hour/24;
hour=hour%24;
this->hour=hour;
this->minute=minute;
this->seconds=seconds;
}
void set(int hour=0,int minute=0,int seconds=0)
{
minute+=seconds/60;
seconds=seconds%60;
hour+=minute/60;
minute=minute%60;
days=hour/24;
hour=hour%24;
this->hour=hour;
this->minute=minute;
this->seconds=seconds;
}
int get_days()
{
return(days);
}
int ToSec()
{
return(days*86400+hour*60*60+minute*60+seconds);
}
void add(int seconds)
{
set(0,0,ToSec()+seconds);
}
void del_days()
{
days=0;
}
void show(int choice=1)
{
switch (choice)
{
case 0:
cout<<hour<<':'<<minute<<':'<<seconds;
break;
case 1:
if(hour<10)
{
cout<<0<<hour;
}
else
{
cout<<hour;
}
cout<<':';
if(minute<10)
{
cout<<0<<minute;
}
else
{
cout<<minute;
}
cout<<':';
if(seconds<10)
{
cout<<0<<seconds;
}
else
{
cout<<seconds;
}
}
}
};
class DeltaTime
{
private:
int Delta_days,Delta_hours,Delta_minutes,Delta_seconds;
public:
int give_DD()
{
return Delta_days;
}
int give_DH()
{
return Delta_hours;
}
int give_minutes()
{
return Delta_minutes;
}
int give_seconds()
{
return Delta_seconds;
}
int give_seconds_total()
{
return(Delta_days*60*60*24+Delta_hours*60*60+Delta_minutes*60+Delta_seconds);
}
DeltaTime(int dd=0,int dh=0,int dm=0,int ds=0)
{
dm+=ds/60;
ds=ds%60;
dh+=dm/60;
dm=dm%60;
dd+=dh/24;
dh=dh%24;
Delta_days=dd;
Delta_hours=dh;
Delta_minutes=dm;
Delta_seconds=ds;
}
};
class Date
{
private:
char mname[12][4]={"jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};
char weekname[7][4]={"sun","mon","tue","wed","thu","fri","sat"};
short int mlengh[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int year,month,day;
bool isleapyear2(int years)
{
bool flag;
if(years%100==0 && years%400==0)
{
flag=1;
}
else if(years%100==0)
{
flag=0;
}
else if(years%4==0)
{
flag=1;
}
else
{
flag=0;
}
return(flag);
}
public:
Date(int year=0,int month=1,int day=1)
{
short int mlen[12]={31,28,31,30,31,30,31,31,30,31,30,31};
bool kabise;
kabise=isleapyear();
if(kabise)mlen[1]=29;
if(year>=0 and(month>=1 && month<=12) && (day>0 && day<=mlen[month-1]))
{
this->year=year;
this->month=month;
this->day=day;
}
else
{
cout<<"this input is not correct.setting default of 0/1/1"<<endl;
this->year=1;
this->month=1;
this->day=1;
}
}
void get()
{
int year;
do
{
cout<<"enter year : ";
cin>>year;
if(year<1)cout<<"err:bad year number";
}while(year<1);
this->year=year;
cout<<endl;
int month;
do
{
cout<<"enter month : ";
cin>>month;
if(month<=0 || month>12)cout<<"err:bad month number";
}while(month<=0 || month>12);
this->month=month;
cout<<endl;
int day;
do
{
cout<<"enter day : ";
cin>>day;
if(day<1 || day>(mlengh[month]+(isleapyear2(year) && month==2)))cout<<"err: bad day number";
}while(day<1 || day>(mlengh[month]+(isleapyear2(year) && month==2)));
this->day=day;
}
void set(int year=1,int month=1,int day=1)
{
bool kabise;
kabise=isleapyear();
if(kabise)mlengh[1]=29;
if(!((month>0 && month<=12) && (day>0 && day<=mlengh[month])))
{
cout<<"ERR : incorrect input"<<endl;
}
else
{
this->year=year;
this->month=month;
this->day=day;
}
}
bool isleapyear()
{
bool flag;
if(year%100==0 && year%400==0)
{
flag=1;
}
else if(year%100==0)
{
flag=0;
}
else if(year%4==0)
{
flag=1;
}
else
{
flag=0;
}
return(flag);
}
unsigned long int todays()
{
unsigned long int days=0;
for(int i=0;i<year;i++)
{
days+=(365+isleapyear2(i));
}
switch(month)
{
case 12:days+=(334+isleapyear2(year));break;
case 11:days+=(304+isleapyear2(year));break;
case 10:days+=(273+isleapyear2(year));break;
case 9:days+=(243+isleapyear2(year));break;
case 8:days+=(212+isleapyear2(year));break;
case 7:days+=(181+isleapyear2(year));break;
case 6:days+=(151+isleapyear2(year));break;
case 5:days+=(120+isleapyear2(year));break;
case 4:days+=( 90+isleapyear2(year));break;
case 3:days+=( 59+isleapyear2(year));break;
case 2:days+= 31;break;
case 1:days+= 0;break;
default:days+=0;
}
days+=day;
return days;
}
void todate(int days=0)
{
int years=0;
while(days>(365+isleapyear2(years)))
{
days-=(365+isleapyear2(years));
years++;
}
if(days>(334+isleapyear2(years)))
{
days-=(334+isleapyear2(years));
month=12;
}
else if(days>(304+isleapyear2(years)))
{
days-=(304+isleapyear2(years));
month=11;
}
else if(days>(273+isleapyear2(years)))
{
days-=(273+isleapyear2(years));
month=10;
}
else if(days>(243+isleapyear2(years)))
{
days-=(243+isleapyear2(years));
month=9;
}
else if(days>(212+isleapyear2(years)))
{
days-=(212+isleapyear2(years));
month=8;
}
else if(days>(181+isleapyear2(years)))
{
days-=(181+isleapyear2(years));
month=7;
}
else if(days>(151+isleapyear2(years)))
{
days-=(151+isleapyear2(years));
month=6;
}
else if(days>(120+isleapyear2(years)))
{
days-=(120+isleapyear2(years));
month=5;
}
else if(days>(90+isleapyear2(years)))
{
days-=(90+isleapyear2(years));
month=4;
}
else if(days>(59+isleapyear2(years)))
{
days-=(59+isleapyear2(years));
month=3;
}
else if(days>31)
{
days-=31;
month=2;
}
else
{
month=1;
}
year=years;
day=days;
}
void show()
{
cout<<weekname[(todays()-1)%7]<<'\t'<<year<<'/'<<mname[month-1]<<'/'<<day;
}
Date operator +(int days)
{
Date x;
x.todate(todays()+days);
return x;
}
Date operator +(Time t1)
{
Date x;
x.todate(todays()+t1.get_days());
t1.del_days();
return x;
}
Date operator =(Date d2)
{
unsigned long int ddays;
ddays=d2.todays();
Date d1(0,0,ddays);
return d1;
}
};
class DateTime
{
public:
Date d8;
Time tym;
void set(Date idate,Time itime)
{
d8=idate;
tym=itime;
}
void set(DateTime d2)
{
d8=d2.d8;
tym=d2.tym;
}
Time get_time()
{
return tym;
}
Date get_date()
{
return d8;
}
void operator = (DateTime d2)
{
d8=d2.d8;
tym=d2.tym;
}
void add(DeltaTime x)
{
tym.add(x.give_seconds_total());
d8=d8+tym;
}
void show()
{
d8.show();
cout<<'\t';
tym.show(1);
}
};
class task
{
private:
char title[100];
DateTime begin,end;
DeltaTime repeat;
public:
string name;
void set(DateTime begin,DateTime end,DeltaTime repeat,string name)
{
this->begin.set(begin);
this->end.set(end);
this->name=name;
}
void done()
{
if(repeat.give_seconds_total()!=0)
{
//begin=now;
end.add(repeat);
}
else
{
cout<<"good job :)";
delete this;
}
}
void showdue()
{
cout<<"due at : ";
end.show();
}
void getdue()
{
end.d8.get();
}
};
bool check_for(char str[100],char substr[100],int start=0)
{
int lengh=strlen(substr);
bool flag=true;
for (int i = start ; i <(start+lengh) ; i++)
{
if(str[i]!=substr[i-start])
{
flag=false;
}
}
return flag;
}
string cut_str(char str[100],int adr)
{
string opt="",h;
for(int i=adr;i<int(strlen(str));i++)
{
h=str[i];
opt+=h;
}
return opt;
}
string split_first(string str)
{
bool d=false;
string opt="";
for(int i=0;i<int(str.length());i++)
{
if(str[i]==' ' && d==true)
{
break;
}
else
{
if(str[i]!=' ')
{
d=true;
opt+=str[i];
}
}
}
return opt;
}
int check_inp(string inp)
{
if(inp=="exit")return 0;
else if(inp=="addtask")return 1;
else if(inp=="setdue")return 2;
else if(inp.size()==0)return -1;
else return -2;
}
int main()
{
task tasks[100];
int t_counter=0;
string str2,name;
string inp_status;
char cmd[100];
bool done=false;
while(!done)
{
cout<<"enter commmand : ";
cin.getline(cmd,100);
inp_status=split_first(cmd);
switch(check_inp(inp_status))
{
case 0:
{
done=1;
break;
}
case 1:
{
str2=cut_str(cmd,8);
tasks[t_counter].name=str2;
break;
}
case 2:
{
tasks[0].getdue();
break;
}
case -2:
{
cout<<split_first(cmd)<<":unknown command"<<endl;
break;
}
default:
{
cout<<'\a';
}
}
}
}
每次我做完setdue x
之后,它总是enter commands :
在一行中显示两个。
像这个:
enter commmand : addtask 1
enter commmand : setdue 1
enter year : 1
enter month : 1
enter day : 1
enter commmand : enter commmand :
enter commmand : exit
------------------
(program exited with code: 0)
Press return to continue
解决方案
问题解决了感谢@molbdnilo 提供的链接,我所要做的就是在此处放置一个 cin.ignore() 行:
case 2:
{
tasks[0].getdue();
//here
break;
}
非常感谢您的支持:D
推荐阅读
- c# - 创建一个线程并使用它在同一个线程中执行函数
- flask - Flask-admin 可编辑的选择列基于行的过滤器
- sql - SQL 在将 INT 除以 DATEDIFF 时返回小数
- blazor - Blazor - 防止双重 HTTP 调用并等待第一个
- python - 使用python在第二个文件的末尾附加文件数据
- python - 使用 pandas 获取每行和列标题的最大值
- pandas - Pandas 中涉及多列的复杂旋转
- visual-studio-code - 在 Google Compute Engine 上反复失去 SSH 连接
- spring - 如何使用 Spring Boot 和 Flyway 为 Quartz 调度程序设置数据库模式?
- python - Python:file.readline() 跳转文件的上一行