关于日期算法问题!求解!
用C++算法的基本控制结构(顺序,选择,循环)实现以下需求:
输入“年,月,日” 后得出当天所对应的“星期数”!
我想了几种算法,但都不简洁!
待高招!以对比!
问题点数:20、回复次数:10Top
1 楼skyMountain(天山)回复于 2004-07-03 09:41:50 得分 2
最好不要自己写,太复杂,用CTime或者time_t吧。Top
2 楼wangjs720(听雨舟)回复于 2004-07-03 13:07:33 得分 0
知道年月日,算星期几好像有个工式,不记得了Top
3 楼grasshopperliu(老前辈——曾经沧海)回复于 2004-07-03 15:17:20 得分 2
我找了半天,没找到,以前我好像见过一个。你搜索一下以前的帖子,应该还在。Top
4 楼lanphaday(恋花蝶)回复于 2004-07-03 16:01:48 得分 5
我初学C语言的时候自己写了一个,只用了十几行代码,可惜现在已经没有踪影了.
应该是先写个数组,保存一年十二个月的天数,然后定义一个标准日,你得知道这个标准日是星期几,然后算出要处理的日期与标准日相差的天数,除以七,得到余数,如果标准日是星期天,余数就是星期几啦,不过没有星期零的,要转化哦....Top
5 楼888atao(阿涛)回复于 2004-07-03 16:15:09 得分 5
以前写的日历程序
你看一下
#include <iostream>
#include <stdio.h>
#include <iomanip>
using namespace std;
class MyDate
{
public:
MyDate(int y = 1900, int m = 1, int d = 1);
int getYear();
int getMonth();
int getDay();
int getWeek();
void setYear(int y);
void setMonth(int m);
void setDay(int d);
void display();
bool isLeapYear();
int daysInMonth();
int numOfDays();
int getMonthFirstWeek();
private:
int year, month, day;
};
MyDate::MyDate(int y, int m, int d):year(y),month(m),day(d)
{}
int MyDate::getYear()
{
return year;
}
int MyDate::getMonth()
{
return month;
}
int MyDate::getDay()
{
return day;
}
void MyDate::setYear(int y)
{
year = y;
}
void MyDate::setMonth(int m)
{
month = m;
}
void MyDate::setDay(int d)
{
day = d;
}
//输出当前月份的日历
void MyDate::display()
{
cout << " 日 一 二 三 四 五 六" << endl;
int monthLength = daysInMonth();
int dayValue = 1;
int day = 0, first = getMonthFirstWeek();
while(day < first)
{
cout << setw(5) << " ";
day++;
}
while(dayValue <= monthLength)
{
cout << setw(5) << dayValue;
dayValue++;
if (day == 6)
cout << endl;
day = (day+1)%7;
}
if (day != 0)
cout << endl;
}
//year是否是闰年
bool MyDate::isLeapYear()
{
if ((year%400 == 0) || ((year%100 != 0) && (year%4 == 0)))
return true;
else
return false;
}
//year年month月有多少天
int MyDate::daysInMonth()
{
int md[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (isLeapYear())
md[1] = 29;
return md[month-1];
}
//从year年1月1日到year年monty月1日有多少天
int MyDate::numOfDays()
{
int num = 0;
for(int i=1; i<month; i++)
num = num + MyDate(year, i).daysInMonth();
return num;
}
//year年month月的第一天是星期几
int MyDate::getMonthFirstWeek()
{
int ret = -1;
long days = 0;
int week = 2;
//得到某年的1月1日是星期几
if (year >= 1980)
{
for (int i=1980 ; i<=year; i++)
{
ret = week;
if (MyDate(i).isLeapYear())
week += 2;
else
week += 1;
week %= 7;
}
}
else
{
for (int i=1979; i>=year; i--)
{
ret = week;
if (MyDate(i).isLeapYear())
week -= 2;
else
week -= 1;
week %= 7;
if (week < 0)
{
week = week>0?week:week*(-1);
week = 7-week;
}
}
}
//得到某月的第一天是星期几
ret = (numOfDays()+ret)%7;
return ret;
}
//得到当前日期是星期几
int MyDate::getWeek()
{
return (day-1+getMonthFirstWeek())%7;
}
int main()
{
int year;
cout << "输入年 :";
cin >> year;
for (int i=1; i<=12; i++)
{
cout << endl;
cout << year << "年" << i << "月" << endl;
MyDate(year, i).display();
}
return 1;
}Top
6 楼888atao(阿涛)回复于 2004-07-03 16:17:28 得分 2
求2002年1月12日是星期几?
cout << MyDate(2002, 1, 12).getWeek();
Top
7 楼wangmiao926(wangmiao926(我不牛))回复于 2004-07-04 03:28:56 得分 0
我的代码如下,不过运行有:warning C4700: local variable 'n' used without having been initialized 还没找到原因!!!!
代码:
#include<iostream.h>
void main(void)
{int year,month,day,n,m;
cout<<"year:"<<"month:"<<"day:"<<endl;
cin>>year>>month>>day;
if((year%4==0&&year%100!=0)||(year%400==0))//////////////判断是否为闰年
switch(month)
{case 1: n=0;break;
case 2: n=31;break;
case 3: n=60;break;//////////////////是闰年则从2月开始每月都多一天
case 4: n=91;break;
case 5: n=121;break;
case 6: n=150;break;
case 7: n=180;break;
case 8: n=211;break;
case 9: n=242;break;
case 10: n=272;break;
case 11: n=303;break;
case 12: n=333;break;
default: cout<<"there is something wrong!!"<<endl;break;}
else {if(n>31) n=n-1; else n;};//////////////////////不是闰年则从2月开始每月都少一天
if(year>=2001) m=(365*(year-2001)+(n+day))%7;
else m=(365*(2001-year)-(n+day))%7;
switch(m)
{case 0 : cout<<"sunday"<<endl;break;///////////////////能被7整除则我星期日
case 1 : cout<<"monday"<<endl;break;
case 2 : cout<<"tuesday"<<endl;break;
case 3 : cout<<"wednesday"<<endl;break;
case 4 : cout<<"thursday"<<endl;break;
case 5 : cout<<"friday"<<endl;break;
case 6 : cout<<"saturday"<<endl;break;
default: cout<<"day out of range"<<endl;break;}
}
注:标准日期设定为2001年1月1日 恰好为星期1
感谢参与讨论!Top
8 楼lanphaday(恋花蝶)回复于 2004-07-04 10:22:45 得分 4
n未被初始化,{if(n>31) n=n-1; else n;};//////////////////////不是闰年则从2月开始每月都少一天
执行这一句前n还没有什么值呢。
所以报错。
你的编程风格要注意啊,上面那句else n;应该是有些问题的。Top
9 楼wangmiao926(wangmiao926(我不牛))回复于 2004-07-04 14:27:28 得分 0
我觉得就用基本控制语句完全能实现“日历”问题,所以没有考虑数组,函数!Top
10 楼wangmiao926(wangmiao926(我不牛))回复于 2004-07-04 14:52:11 得分 0
"else n"是有点问题,我的本意是引用上面switch(n)中的n值!Top




