已知日期,算改天是星期几?
我的思想是这样的:
以公元0年1月1日星期天为基准,算出要求的日期与该日期的天数差,然后再对7求模。
余数为0: 星期天
余数为1: 星期一
余数为2: 星期二
余数为3: 星期三
余数为4: 星期四
余数为5: 星期五
但是这个程序算出来的的星期数总会比当前星期数多1,麻烦各位帮我看看,谢谢。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
int leapyear(int year)
{
int flag = 0;
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{
flag = 1;
}
return flag;
}
int tianshu(int year, int month, int day)
{
int thisYearFlag = 0;
int totalDay = 0;
int beforeYearDay = 0;
int thisYearDay = 0;
int i = 0;
for (i = 0; i < year; i++)
{
int yearFlag = leapyear(i);
if(1 == yearFlag)
{
beforeYearDay += 366;
}
else
{
beforeYearDay += 365;
}
}
switch (month - 1)
{
case 1:
thisYearDay = 31;
break;
case 2:
thisYearDay = 31 + 28;
break;
case 3:
thisYearDay = 31 + 31 + 28;
break;
case 4:
thisYearDay = 30 + 31 + 31 + 28;
break;
case 5:
thisYearDay = 31 + 30 + 31 + 31 + 28;
break;
case 6:
thisYearDay = 30 + 31 + 30 + 31 + 31 + 28;
break;
case 7:
thisYearDay = 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 8:
thisYearDay = 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 9:
thisYearDay = 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 10:
thisYearDay = 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 11:
thisYearDay = 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 12:
thisYearDay = 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
default:
break;
}
thisYearDay += day;
thisYearFlag = leapyear(year);
if (1 == thisYearFlag)
{
if (month > 2)
{
thisYearDay += 1;
}
}
totalDay = beforeYearDay + thisYearDay;
return totalDay;
}
int main()
{
int year, month, day, week;
int totalDay = 0;
printf("请输入年份:");
scanf("%d", &year);
printf("请输入月份(1 - 12月):");
scanf("%d", &month);
while (month < 1 || month > 12)
{
printf("输入的月份错误,请重新输入:");
scanf("%d", &month);
}
printf("请输入日期:");
scanf("%d", &day);
while (day < 1 || day > 31)
{
printf("输入的日期错误,请重新输入:");
scanf("%d", &day);
}
totalDay = tianshu(year, month, day);
week = (totalDay - 1) % 7;
switch (week)
{
case 0:
printf("今天是星期日\n\n\n");
break;
case 1:
printf("今天是星期一\n\n\n");
break;
case 2:
printf("今天是星期二\n\n\n");
break;
case 3:
printf("今天是星期三\n\n\n");
break;
case 4:
printf("今天是星期四\n\n\n");
break;
case 5:
printf("今天是星期五\n\n\n");
break;
case 6:
printf("今天是星期六\n\n\n");
break;
}
system("pause");
return 0;
}
[解决办法]
COleDateTime::GetDayOfWeek
int GetDayOfWeek( ) const;
Return Value
The day of the week represented by the value of this COleDateTime object.
Remarks
Call this member function to get the day of the month represented by this date/time value.
Valid return values range between 1 and 7, where 1=Sunday, 2=Monday, and so on. If the status of this COleDateTime object is not valid, the return value is AFX_OLE_DATETIME_ERROR.
The COleDateTime class handles dates from 1 January 100 31 December 9999.
[解决办法]
switch (month - 1)
{
case 1:
你想在2月的时候是31天?
[解决办法]
# include <stdio.h>
int is_leap(int year)
{
return ((year % 4 == 0) && (year % 100 != 0))
[解决办法]
(year % 400 == 0);
}
int days(int year, int month, int day)
{
const int days_of_month[2][12] = {
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, },
};
int total = 0;
int i;
for (i = 0; i < year; i++)
total += is_leap(i) ? 366 : 365;
for (i = 0; i < month - 1; i++)
total += days_of_month[is_leap(year)][i];
total += day - 1;
return total;
}
int main()
{
int year, month, day;
printf("input year, month and day: ");
scanf("%d%d%d", &year, &month, &day);
switch (days(year, month, day) % 7)
{
case 0:
printf("It is Sun.\n");
break;
case 1:
printf("It is Mon.\n");
break;
case 2:
printf("It is Tue.\n");
break;
case 3:
printf("It is Wed.\n");
break;
case 4:
printf("It is Thu.\n");
break;
case 5:
printf("It is Fri.\n");
break;
case 6:
printf("It is Sat.\n");
break;
}
return 0;
}