一、问题描述
NextDate (int month, int day, int year)函数规定:输入三个整数:month、day和year,函数的输出为输入日期后一天的日期。例如,输入为2006年3月7日,则函数的输出为2006年3月8日,year满足1920≤year≤2050。
二、实现步骤
第一步,写一个判断输入数据是否合规的函数:bool is_YMD(int y,intm,int d);代码如下:
//判断输入数据是否合格
bool is_YMD(int y, int m, int d) {
//判定年份不合规 ,并返回false
if (!(y >= 1920 && y <= 2050)){
//cout<<"年份出错!"<<endl;
return false;
}
//判定月份不合规 ,并返回false
else if (!(m >= 0 && m <= 12)) {
//cout<<"月份出错!"<<endl;
return false;
}
//判定小月天数合规 ,并合规返回true
else if (((m == 4 || m == 6 || m == 9 || m == 11) && (d >= 0 && d <= 30))) {
return true;
}
//判定大月天数合规 ,并返回true
else if (((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) && (d >= 0 && d <= 31))) {
return true;
}
//判定瑞二月天数合规 ,并返回true
else if (((m == 2) && (d >= 0 && d <= 29) && (is_Run(y) == 1))) {
return true;
}
//判定平年二月天数合规,并返回true
else if (((m == 2) && (d >= 0 && d <= 28) && (is_Run(y) == 0))) {
return true;
}
//天数不合规,返回false
else {
//cout<<"天数错误"<<endl;
return false;
}
}
其中判断闰年的函数为 int is_Run(int y)代码如下:
//判断是否为闰年
int is_Run(int y) {
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
return 1;
}
else {
return 0;
}
}
第二步,将日期退迟后一天,函数为:void NextDate(int y,int m,int d);代码为:
//日期退迟
void NextDate(int y, int m, int d) {
d = d + 1;//日期延后一天
if (!is_YMD(y, m, d)) //判断天数是否合规,若不合格则天数溢出,需处理
{
m = m + 1; // 月份+1
d = 1; // 天数初始化,置1
if (!is_YMD(y, m, d)) { //判断月份是否合规,若不合格则月份溢出,需处理
y = y + 1; // 年份+1
m = 1; // 月份初始化,置1
if (!is_YMD(y, m, d)) { //判断年份是否合规,若不合格则年份溢出,无需处理,返回错误信息
cout << "年份溢出!" << endl;
return;
}
}
}
cout << "后一天的日期为:" << y << "年" << m << "月" << d << "日" << endl; //输出后一天日期
}
第三步,写一个运行函数包括不断循环输入数据,直到输入的数据合规为止:work();代码如下:
//输入数据,并调用NextDate()
void work() {
int year = 1;
int month = 1;
int date = 1;
int cin_count = 0; //输入错误数据的次数
cout << "请输入年份、月份、天数" << endl; //提示信息
cout << "年份:";
cin >> year;
while (!is_YMD(year, month, date)) { //输入有效年份,无效输入将强制重输
cout << "输入年份无效请重新输入:";
cin >> year;
cin_count++;
}
cout << "月份:";
cin >> month;
while (!is_YMD(year, month, date)) { //输入有效月份,无效输入将强制重输
cout << "输入月份无效请重新输入:";
cin >> month;
cin_count++;
}
cout << "天数:";
cin >> date;
while (!is_YMD(year, month, date)) { //输入有效天数,无效输入将强制重输
cout << "输入天数无效请重新输入:";
cin >> date;
cin_count++;
}
if (cin_count != 0) {
cout << "恭喜你!经过你坚持不懈地输错" << cin_count << "次后" << endl //显示最终输入数据,提示信息
<< "终于输对了数据:" << year << "年" << month << "月" << date << "日"<<endl;
}
NextDate(year, month, date);
}
总代码:
#include <iostream>
using namespace std;
//判断是否为闰年
int is_Run(int y) {
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
return 1;
}
else {
return 0;
}
}
//判断输入年份、月份、天数是否合规
bool is_YMD(int y, int m, int d) {
//判定年份不合规 ,并返回false
if (!(y >= 1920 && y <= 2050)){
//cout<<"年份出错!"<<endl;
return false;
}
//判定月份不合规 ,并返回false
else if (!(m >= 0 && m <= 12)) {
//cout<<"月份出错!"<<endl;
return false;
}
//判定小月天数合规 ,并合规返回true
else if (((m == 4 || m == 6 || m == 9 || m == 11) && (d >= 0 && d <= 30))) {
return true;
}
//判定大月天数合规 ,并返回true
else if (((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) && (d >= 0 && d <= 31))) {
return true;
}
//判定瑞二月天数合规 ,并返回true
else if (((m == 2) && (d >= 0 && d <= 29) && (is_Run(y) == 1))) {
return true;
}
//判定平年二月天数合规,并返回true
else if (((m == 2) && (d >= 0 && d <= 28) && (is_Run(y) == 0))) {
return true;
}
//天数不合规,返回false
else {
//cout<<"天数错误"<<endl;
return false;
}
}
//日期推算
void NextDate(int y, int m, int d) {
d = d + 1;//日期延后一天
if (!is_YMD(y, m, d)) //判断天数是否合规,若不合格则天数溢出,需处理
{
m = m + 1; // 月份+1
d = 1; // 天数初始化,置1
if (!is_YMD(y, m, d)) { //判断月份是否合规,若不合格则月份溢出,需处理
y = y + 1; // 年份+1
m = 1; // 月份初始化,置1
if (!is_YMD(y, m, d)) { //判断年份是否合规,若不合格则年份溢出,无需处理,返回错误信息
cout << "年份溢出!" << endl;
return;
}
}
}
cout << "后一天的日期为:" << y << "年" << m << "月" << d << "日" << endl; //输出后一天日期
}
//输入数据,并调用NextDate()
void work() {
int year = 1;
int month = 1;
int date = 1;
int cin_count = 0; //输入错误数据的次数
cout << "请输入年份、月份、天数" << endl; //提示信息
cout << "年份:";
cin >> year;
while (!is_YMD(year, month, date)) { //输入有效年份,无效输入将强制重输
cout << "输入年份无效请重新输入:";
cin >> year;
cin_count++;
}
cout << "月份:";
cin >> month;
while (!is_YMD(year, month, date)) { //输入有效月份,无效输入将强制重输
cout << "输入月份无效请重新输入:";
cin >> month;
cin_count++;
}
cout << "天数:";
cin >> date;
while (!is_YMD(year, month, date)) { //输入有效天数,无效输入将强制重输
cout << "输入天数无效请重新输入:";
cin >> date;
cin_count++;
}
if (cin_count != 0) {
cout << "恭喜你!经过你坚持不懈地输错" << cin_count << "次后" << endl //显示最终输入数据,提示信息
<< "终于输对了数据:" << year << "年" << month << "月" << date << "日"<<endl;
}
NextDate(year, month, date);
}
int main() {
work();
system("pause");
return 0;
}
三、运行结果和总结
总的实现都是自己编写的函数,加上注释也只有120行不到。抛去空格,注释,还有自己加的描述到底输错了几次数据的提示信息,总的代码不会超过80行。旨在新手小白的练习,大神不喜勿喷!!!
运行结果如下:
最后还麻烦老铁们,点个赞吧。