一个判断日期的程序设计问题:

来源:互联网 发布:软件研发中心介绍 编辑:程序博客网 时间:2024/06/05 07:30

题目:

已知公元111日是星期一。请编写一个程序,只要输入年月日,就能自动回答当天是星期几。

 

要求:

为测试该程序的方便,请将计算星期的算法尽量放入一个函数中,输入和输出检查可用其它函数来处理。

为简单起见,不考虑公元前的日期。

提示:

a       解答思路:计算输入日期与公元111日所相差的天数,具体如下:

总天数=公元1年到输入日期上一年年底天数+输入年份的1月到上月月底天数+输入日期的天数

b       闰年满足条件:(year%4==0)&&(year%100!=0)||(year%400==0)

1)分析各种输入情况,结合程序输出结果,进行等价类划分,并给出详细测试用例

2)根据(1)所划分的等价类,进行边界值分析,并给出具体的测试用例

3)决策表测试法

①列出输入变量month day year的有效等价类;(条件桩)

②分析程序的规格说明,给出问题规定的可能采取操作;(动作桩)

③画出决策表(简化)

④根据决策表,给出详细测试用例

我给出的软件设计程序如下所示:

# include <iostream>

 

using namespace std;

const int start_year=1;

 

int main()

{

    while(true)

    {

       cout<<"/t ****Welcome to the Date Management system****"<<std::endl;

       cout<<"/t The start day is 0001-01-01 Monday!"<<std::endl;

       cout<<"/t Please type the date like this : /n"

           <<"/t (year month day)"

           <<"/t"

           <<std::endl;                        //开头

       int input_year(0);

       int input_month(0);

       int input_day(0);

       for(;;)                             //内部循环

       {

           cout<<"/t";

           cin>>input_year>>input_month>>input_day;

           if(input_month<=0 || input_month>12)     //判断月份输入是否正确

           {

              std::cout<<"/t **ERROR**/n"<<"/t Please type again!"<<std::endl;

           }

           else

           {

              if(input_day<0 || input_day>31)         //判断日期输入是否正确(未对具体月份具体天数做限定)

              {

                  std::cout<<"/t **ERROR**/n"<<"/t Please type again!"<<std::endl;

              }

              else

              {

                  cout<<"/t What you type is "                   //输出输入的日期

                     <<input_year<<"-"

                     <<input_month<<"-"

                     <<input_day<<endl;

                  break;

              }

           }

       }

       int new_year;

       new_year=input_year-start_year;

       int first_days;

       first_days=new_year*365;

       int num(0);

       for(int i=start_year;i!=new_year;i++)

       {

           if(i%4==0)

           {

              if(i%100==0)

              {

                  if(i%400==0) num=num+1;

                  else continue;

              }

              else num=num+1;

           }

           else continue;

       }

       int second_days(0);

       second_days=first_days+num;

       int total_days(0);

       bool leap;

       if(input_year%4==0)

       {

           if(input_year%100==0)

           {

              if(input_year%400==0) leap=true;

              else leap=false;

           }

           else leap=true;

       }

       else leap=false;

       if(leap)                //算整个天数

       {

           switch(input_month)

           {

           case 1:  total_days=second_days+input_day;

              break;

           case 2:  total_days=second_days+input_day+31;

              break;

           case 3:  total_days=second_days+input_day+60;

              break;

           case 4:  total_days=second_days+input_day+91;

              break;

           case 5:  total_days=second_days+input_day+121;

              break;

           case 6:  total_days=second_days+input_day+152;

              break;

           case 7:  total_days=second_days+input_day+182;

              break;

           case 8:  total_days=second_days+input_day+213;

              break;

           case 9:  total_days=second_days+input_day+244;

              break;

           case 10: total_days=second_days+input_day+274;

              break;

           case 11: total_days=second_days+input_day+305;

              break;

           case 12: total_days=second_days+input_day+335;

              break;

           }

       }

       else

       {

           switch(input_month)

           {

           case 1:  total_days=second_days+input_day;

              break;

           case 2:  total_days=second_days+input_day+31;

              break;

           case 3:  total_days=second_days+input_day+59;

              break;

           case 4:  total_days=second_days+input_day+90;

              break;

           case 5:  total_days=second_days+input_day+120;

              break;

           case 6:  total_days=second_days+input_day+151;

              break;

           case 7:  total_days=second_days+input_day+181;

              break;

           case 8:  total_days=second_days+input_day+212;

              break;

           case 9:  total_days=second_days+input_day+243;

              break;

           case 10: total_days=second_days+input_day+273;

              break;

           case 11: total_days=second_days+input_day+304;

              break;

           case 12: total_days=second_days+input_day+334;

              break;

           }

       }

       int number(0);

       number = total_days%7;

       switch(number)                          //具体星期几

       {

       case 0: cout<<"/t Sunday"<<endl;

           break;

       case 1: cout<<"/t Monday"<<endl;

           break;

       case 2: cout<<"/t Tuesday"<<endl;

           break;

       case 3: cout<<"/t Wednesday"<<endl;

           break;

       case 4: cout<<"/t Thursday"<<endl;

           break;

       case 5: cout<<"/t Friday"<<endl;

           break;

       case 6: cout<<"/t Saturday"<<endl;

           break;

       }

       cout<<endl;

    }

    return 0;

}

 

程序的设计思想是:

第一步——算出公元后第一年到输入的年份的去年的天数(以365天算);

第二步——算出公元后第一年到输入年份的去年的闰年个数,并且加上第一步算出来的天数。这样就能精确的计算出从公元第一年到输入年份的去年最后一天的总天数;

第三步——算输入年份的第一天到所输入的时间的天数,加上前面的精确天数,算总天数;

第四步——求模,算星期几。

 

但是软件测试后,发现了一个问题——有些天数的星期显示是错误的。应该说逻辑上这个程序设计没有任何的问题。但是软件测试的时候,确实出现了问题。

 

以下贴出该程序的软件测试案例,求高手指正!

 

 

原创粉丝点击