UT源码 065
NextDate函数问题
NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性
NextDate函数包含三个变量month、day和year,函数的输出为输入日期后一天的日期。 要求输入变量month、day和year均为整数值,并且满足下列条件:
条件1 1≤ month ≤12 否则输出,月份超出范围
条件2 1≤ day ≤31 否则输出,日期超出范围
条件3 1912≤ year ≤2050 否则输出:年份超出范围
String nextdate(int m,int d,int y)
注意返回值是字符串。
程序要求:
1)先显示“请输入日期”
2)不满足条件1,返回:“月份超出范围”;不满足条件2,返回:“日期超出范围”;不满足条件3,返回:“年份超出范围”;如果出现多个不满足,以最先出现不满足的错误返回信息。
3)条件均满足,则输出第二天的日期:格式“****年**月**日”(如果输入2050年12月31日,则正常显示2051年1月1日
PS:
个人觉得这题题目有问题。按照月,日,年的顺序来判定。那么2月30日,或者平年出现2月29的日期。明显是错误的,但按题目要求使可以通过条件判定。本程序,按照题目要求进行编程,无法处理上述样例
源码:
#include <bits/stdc++.h> const double eps = 1e-8; using namespace std; string getstring ( const int n ){ std::stringstream newstr; newstr<<n; return newstr.str(); } int checkyear( int y ){ if( ( y % 4 == 0 && y % 100 != 0 ) || ( y % 400 == 0 ) ){ return 1; } return 0; } bool endMonth( int m, int d , int flg ){ if( ( m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12 ) && d == 31 ){ return 1; } if( m == 2 && d == (28 + flg) ){ return 1; } if( ( m == 4 || m == 6 || m == 9 || m == 11 ) && d == 30 ){ return 1; } return 0; } string NextDate( int y, int m, int d ){ int d_flg; d_flg = 0; if( endMonth( m,d , checkyear( y )) ){ d_flg = 1; } if( m == 12 && d_flg == 1 ){ y++; d = 1; m = 1; } else if( d_flg ){ m++; d = 1; } else{ d++; } string nxt = getstring(y) + "年" + getstring(m) + "月" + getstring(d) + "日"; return nxt; } int main(){ int y, m, d; printf("请输入日期:"); while( scanf("%d", &y), y + 1 ){ scanf("年%d月%d日", &m, &d ); if( m < 1 || m > 12 ){ puts("月份超出范围"); continue; } if( d < 1 || d > 31 ){ puts("日期超出范围"); continue; } if( y < 1912 || y > 2050 ){ puts("年份超出范围"); } cout << NextDate( y, m, d ) << '\n'; } return 0; }