用c怎么实现 输入一个日期自动输出第二天的日期
答案:2 悬赏:0 手机版
解决时间 2021-03-25 00:49
- 提问者网友:嘚啵嘚啵
- 2021-03-24 21:27
用c怎么实现 输入一个日期自动输出第二天的日期
最佳答案
- 五星知识达人网友:青尢
- 2021-03-24 22:19
LZ 的逻辑没问题,但很多地方不够简练
先集中说几个严重的错误
1. LZ 对 if else 语法不够熟悉,每个选择分支如果是 {} 那么它就代表一个完整的语句,不用加“;”了,这个不像定义类,此时的{}后面加“;”是另有它意的。乱加“;”也是造成 LZ 的 if 嵌套混乱的重要原因之一
2. LZ 讲的 if 嵌套混乱由两个原因引起
第一个,从 LZ 贴出来的代码看,LZ 没有养成的规范编写格式的习惯,规范代码格式细节很多,LZ 用 VS 一类的 IDE 编写的时候 IDE 能自动帮 LZ 做一定的缩进,以使代码规范。我下面帮 LZ 改了,这样代码结构清晰,易读。 if 嵌套关系就更容易理解。
第二个,关于避免 if 中 else 的匹配换乱,LZ 养成不管多么简单的 if 语句,不要用 if(condition)statement; 格式,即不用简单格式。坚持使用带 {} 的完整格式,这样 else 的遗漏很容易被发现。
3. 标准库中的名称如果没有 using 声明,都得加 std:: 以表示 cout cin endl 之类的名称在 标准库里定义,这样编译器才知道在哪里参考他们。
4. 使用合适类型存储年月日,这里 unsigned 比 int 更加适合
下面是修改后的代码,修改之处做了注释
以下代码在 VS2010 编译通过,运行成功!
#include // 标准的不带 .h
#include
#include
class date
{
private:
unsigned year,month,day;
public:
date(unsigned x,unsigned y,unsigned z) {year=x;month=y;day=z;}
bool fun1(unsigned a); // 建议直接使用内置的 bool 类型,避免转化错误
void fun2();
unsigned fun3()
{return year;}
unsigned fun4()
{return month;}
unsigned fun5()
{return day;}
};
bool date::fun1(unsigned a) // 建议直接使用内置的 bool 类型,避免转化错误
{
// 直接返回结果就行了,不用定义局部变量
return (a%4==0&&a%100!=0||a%100==0&&a%400==0)?true:false;
}
void date::fun2()
{
if(day<=27)
{
day++;
}
else
{
switch(day)
{
case 28:
if(month==2)
{
if(fun1(year)) // if 条件做相应修改,更加简洁
{
day++;
}
else
{
month++;
day = 1; // 非闰月2月28日的后一天是3月1日
}
}
else
{
day++;
}
break;
case 29:
if(fun1(year)) // 修改理由参见上方修改
{
if(month==2)
{
month++;
day=1;
}
else
{
day++;
}
}
else
{
if(month==2)
{
std::cout<<"您输入了错误日期!"<< std::endl; // 没有使用using 声明就得加 “std::”
break;
}
else
{
day++;
}
}
break;
case 30:
if(month==2)
{
std::cout<<"您输入了错误日期!"< break;
}
else
{
if(month==4||month==6||month==9||month==11)
{
month++;day=1;
}
else
{
day++; // 少了 “++”运算符
}
}
break;
case 31:
if(month==2||month==4||month==6||month==9||month==11)
{
std::cout<<"您输入了错误日期!"< break;
}
else
{
if(month==1||month==3||month==5||month==7||month==8||month==10)
{
month++;
day=1;
}
else if(month==12)
{
year++;
month++;
day=1;
};
}
break;
default:
std::cout<<"您输入了错误日期!"< }
}
}
void main()
{
std::cout<<"请依次输入正确的年/月/日(可以以任意非数字符号间隔,该程序将显示第二天的日期):"< std::string inputstr; // C++ 字符串用来保存用户的输入(如 1998-12-12,1999/12/23 …)
std::cin >> inputstr;
std::istringstream instr(inputstr); // instr 用于将年月日信息抽取出来
char dump; // dump 用于将“/ -”之类的分隔符过滤掉
unsigned a,b,c; // 年月日没有负数,所以 unsigned 更加适合
instr >> a >> dump >> b >> dump >> c;
date date1(a,b,c);
date1.fun2();
if(date1.fun5()!=c) // 调用成员函数别忘了“()”
std::cout< <<"/"< < }
==================
运行结果
请依次输入正确的年/月/日(可以以任意非数字符号间隔,该程序将显示第二天的日期):
1998-2-28
1998/3/1
Press any key to continue . . .
先集中说几个严重的错误
1. LZ 对 if else 语法不够熟悉,每个选择分支如果是 {} 那么它就代表一个完整的语句,不用加“;”了,这个不像定义类,此时的{}后面加“;”是另有它意的。乱加“;”也是造成 LZ 的 if 嵌套混乱的重要原因之一
2. LZ 讲的 if 嵌套混乱由两个原因引起
第一个,从 LZ 贴出来的代码看,LZ 没有养成的规范编写格式的习惯,规范代码格式细节很多,LZ 用 VS 一类的 IDE 编写的时候 IDE 能自动帮 LZ 做一定的缩进,以使代码规范。我下面帮 LZ 改了,这样代码结构清晰,易读。 if 嵌套关系就更容易理解。
第二个,关于避免 if 中 else 的匹配换乱,LZ 养成不管多么简单的 if 语句,不要用 if(condition)statement; 格式,即不用简单格式。坚持使用带 {} 的完整格式,这样 else 的遗漏很容易被发现。
3. 标准库中的名称如果没有 using 声明,都得加 std:: 以表示 cout cin endl 之类的名称在 标准库里定义,这样编译器才知道在哪里参考他们。
4. 使用合适类型存储年月日,这里 unsigned 比 int 更加适合
下面是修改后的代码,修改之处做了注释
以下代码在 VS2010 编译通过,运行成功!
#include
#include
#include
class date
{
private:
unsigned year,month,day;
public:
date(unsigned x,unsigned y,unsigned z) {year=x;month=y;day=z;}
bool fun1(unsigned a); // 建议直接使用内置的 bool 类型,避免转化错误
void fun2();
unsigned fun3()
{return year;}
unsigned fun4()
{return month;}
unsigned fun5()
{return day;}
};
bool date::fun1(unsigned a) // 建议直接使用内置的 bool 类型,避免转化错误
{
// 直接返回结果就行了,不用定义局部变量
return (a%4==0&&a%100!=0||a%100==0&&a%400==0)?true:false;
}
void date::fun2()
{
if(day<=27)
{
day++;
}
else
{
switch(day)
{
case 28:
if(month==2)
{
if(fun1(year)) // if 条件做相应修改,更加简洁
{
day++;
}
else
{
month++;
day = 1; // 非闰月2月28日的后一天是3月1日
}
}
else
{
day++;
}
break;
case 29:
if(fun1(year)) // 修改理由参见上方修改
{
if(month==2)
{
month++;
day=1;
}
else
{
day++;
}
}
else
{
if(month==2)
{
std::cout<<"您输入了错误日期!"<< std::endl; // 没有使用using 声明就得加 “std::”
break;
}
else
{
day++;
}
}
break;
case 30:
if(month==2)
{
std::cout<<"您输入了错误日期!"<
}
else
{
if(month==4||month==6||month==9||month==11)
{
month++;day=1;
}
else
{
day++; // 少了 “++”运算符
}
}
break;
case 31:
if(month==2||month==4||month==6||month==9||month==11)
{
std::cout<<"您输入了错误日期!"<
}
else
{
if(month==1||month==3||month==5||month==7||month==8||month==10)
{
month++;
day=1;
}
else if(month==12)
{
year++;
month++;
day=1;
};
}
break;
default:
std::cout<<"您输入了错误日期!"<
}
}
void main()
{
std::cout<<"请依次输入正确的年/月/日(可以以任意非数字符号间隔,该程序将显示第二天的日期):"<
std::cin >> inputstr;
std::istringstream instr(inputstr); // instr 用于将年月日信息抽取出来
char dump; // dump 用于将“/ -”之类的分隔符过滤掉
unsigned a,b,c; // 年月日没有负数,所以 unsigned 更加适合
instr >> a >> dump >> b >> dump >> c;
date date1(a,b,c);
date1.fun2();
if(date1.fun5()!=c) // 调用成员函数别忘了“()”
std::cout<
==================
运行结果
请依次输入正确的年/月/日(可以以任意非数字符号间隔,该程序将显示第二天的日期):
1998-2-28
1998/3/1
Press any key to continue . . .
全部回答
- 1楼网友:深街酒徒
- 2021-03-24 22:54
输入后的格式是怎样的,日加1、再判断月是否满月、满也进1、也判断年是否要进1
~
~
~
~
~
~
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯