计算星期

题目内容:

给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。

 

输入格式:

年 月 日

 

输出格式:

0~6。
    星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。

假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型?

 

输入样例:

2013 3 11

输出样例:

1

 

输入样例:

2013 13 15

输出样例:

month is error.

 

程序代码:*

      

#include "stdio.h"
void CaculateWeekDay(int y,int m, int d);
int JudgeDay(int y, int m, int d);
int leap (int y);
int main()
{
  int year = 0,month = 0,day = 0;
  scanf ("%d %d %d",&year,&month,&day) ;
  if (month > 12 || month < 1)
    {
    printf("month is error.");
    if(JudgeDay (year , month , day))
    printf("day is error.");
    }
  else if(JudgeDay (year , month , day))
    printf("day is error.");
  else
    CaculateWeekDay(year , month , day);
  return 0;

}
int leap (int y)//判断是否是闰年
{
  if((y%100!=0&&y%4==0)||y%400==0)
    return 1;
  else return 0;
}

void CaculateWeekDay(int y,int m, int d)//计算是星期几
{

  int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  int i;
  if(m>2&&leap(y))d++;
  for(i=1;i<m;i++)
    {
    d+=mon[i];
    }
  d=y-1+(y-1)/4-(y-1)/100+(y-1)/400+d;
  switch(d%7)
    {
    case 0: printf("0\n"); break;
    case 1: printf("1\n"); break;
    case 2: printf("2\n"); break;
    case 3: printf("3\n"); break;
    case 4: printf("4\n"); break;
    case 5: printf("5\n"); break;
    case 6: printf("6\n"); break;
    }
}
int JudgeDay(int y, int m, int d)//判断输入是否合法
{
  if (d <= 0 || d> 31)
  return 1;
  switch (m)
    {
    case 4:
    case 6:
    case 9:
    case 11: if (d== 31) return 1; break;
    case 2: if (!leap(y)&&(d> 28))
          {
          return 1; break;
          }
        else if(d>29)
          {
          return 1; break;
          }
    }
  return 0;
}

       

       

       

 

posted on 2016-04-11 01:54  无名小卒升级中  阅读(488)  评论(0编辑  收藏  举报

导航