【课设】C++实现万年历

原创 2016年06月25日 20:23:02

一、万年历要求的功能

①输入年份,打印出该年份12个月的月历

②输入年份、月份,输出对应年份月份的月历

③输入具体的一个日期,输出这一天是星期几,并计算出与当天相隔的日期数,以及输出公历节日(若有)。

二、代码块

#include <iostream>
#include <iomanip>
using namespace std;
class date//定义一个日期类 
{ 
	public: 
		date(int y=1,int m=1,int d=1):year(y),month(m),day(d){}//构造函数 

		void setyear (int y){year=y;} //改变年份的接口 
		void setmonth(int m){month=m;} //改变月份的接口 
		void setday (int d){day=d;}//改变日期的接口 

		int getyear() const{return year;} //得到年份 
		int getmonth() const{return month;} //得到月份 
		int getday() const{return day;} //得到日期 

		//date operator+(int days); //运算符“+”的重载 
		//date operator-(int days); //运算符"-"的重载 

		static bool isleapyear(int y)//定义布尔型,判断闰年的函数 
		{ 
			return ( y%4==0 && y%100 !=0 || y%400==0 );
		} 
		static int getyeardays(int y)//得到一年的日子 
		{
			 return isleapyear(y)? 366:365; 
		} 
		static int getmonthdays (const date &d); //得到月份的日子 
		static int week(const date& d)
		{	
			int w = 0;
			int y = d.year; 
			int m = d.month;
			if(d.month==1||d.month==2)
			{
				m = d.month+12;
				y = d.year-1;
			}
			w = d.day+2*m+3*(m+1)/5+y+y/4-y/100+y/400;
			w=w%7+1;
			return w;
		} 
		int date_count(const date&d)   //计算输入日期到0年1月1日的天数
		{
 			int t=0;
 			int j;
 			j=d.getyear()-1;
 			int a=j/4-j/100+j/400+d.getyear()*365;//判断年份有多少天(其中还判断了有多少闰年)
 			int n=31;
 			int i=d.getmonth()-1;
 			if(i>=1)//判断输入月份与1月之间有多少天 *难点所在呀!!!
 			{
  				switch(i)
  				{
   					case 2:
    					n+=29;break;
   					case 3:
    					n+=29+31;break;
   					case 4:
    					n+=29+31+30;break;
   					case 5:
    					n+=29+31+30+31;break;
   					case 6:
    					n+=29+31+30+31+30;break;
   					case 7:
    					n+=29+31+30+31+30+31;break;
   					case 8:
    					n+=29+31+30+31+30+31+31;break;
   					case 9:
    					n+=29+31+30+31+30+31+31+30;break;
   					case 10:
    					n+=29+31+30+31+30+31+31+30+31;break;
   					case 11:
    					n+=29+31+30+31+30+31+31+30+31+30;break;
   					default: n=31;break;
  				}
			}
 			else n=0;
 			if(!(d.getyear()%400==0||d.getyear()%4==0&&d.getyear()%100!=0) && d.getmonth()>2)
  				n--;
    		t=a+n-1+d.getday();
 			return t;
		}
	private: 
		int year; //定义三个私有成员 
		int month; 
		int day; 
};

ostream& operator<<(ostream &out,const date &d); //重载“<<”操作符 
istream& operator>>(istream &in,date &d); //重载“>>”操作符 

int date::getmonthdays(const date&d) //得到具体一月的天数 
{ 
	switch( d.getmonth() ) 
	{ 
		case 1: case 3: case 5: case 7: case 8: case 10: case 12: 
			return 31;
		case 4: case 6: case 9: case 11: 
			return 30; 
		case 2: 
			return isleapyear(d.getyear())? 29:28;
	} 
} 

ostream &operator<<(ostream &out,const date &d) 
{ 
	out<<d.getyear()<<"年"<<d.getmonth()<<"月"<<d.getday()<<"日"; 
	return out; 
} 

istream &operator>>(istream &in,date&d) 
{ 
	int year,month,day; 
	cin>>year>>month>>day; 
	d=date(year,month,day); 

	return in; 
}

inline void printyear(int y)//打印域宽 
{
	cout << setw(28) << y << " 年" << endl;//setw(int)设置输出数据项的域宽 
}

inline void printline()//打印行 
{
	cout << " ----------------------------------------------------" << endl;
}

void printmonth(int m)//打印月份 
{
	char month[][5]={ "0", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };
	cout << setw(27) << month[m] << "月" <<endl;//设置输出数据项的域宽 
}

inline void printweek()
{
	cout << " 星期日 星期一 星期二 星期三 星期四 星期五 星期六" <<endl;
}

void printday(int md, int week)
{
	int line=1;
	if(7 != week)
	{	
		for( int blank=week; blank; --blank,++line )//blank的作用就是空格 
			cout << setw(7) << " ";
	}
	for( int d=1; d<=md; ++d,++line )
	{
		cout << setw(7) << d;
		if( line%7==0 )//当一行有七个时,输出换行符 
		cout << endl;
	}
	cout << endl;
}

void check(int month,int day)
{
	switch(month)
	{
		case 1:
		{	
			if(day == 1)
				cout<<"元旦"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 2:
		{
			if(14 == day)
				cout<<"情人节"<<endl;
			else 
				cout<<"否"<<endl; 
		};break;
		case 3:
		{	
			if(8 == day)
			 	cout<<"妇女节"<<endl;
			else if(12 == day)
				cout<<"植树节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 4:
		{	
			if(1 == day)
				cout<<"愚人节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 5:
		{
			if(1 == day)
				cout<<"劳动节"<<endl;
			else if(5 == day)
				cout<<"植树节"<<endl;
			else if(14 == day)
				cout<<"母亲节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 6:
		{
			if(1 == day)
				cout<<"儿童节"<<endl;
			else if(19 == day)
				cout<<"父亲节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 7:
		{
			if(1 == day)
				cout<<"建党节"<<endl;
			else 
				cout<<"否"<<endl;	
		};break; 
		case 8:
		{	
			if(1 == day)
				cout<<"建党节"<<endl;
			else 
				cout<<"否"<<endl; 
		};break;
		case  9:
		{
			if(10 == day)
				cout<<"教师节"<<endl;
			else if(28 == day)
				cout<<"孔子诞辰"<<endl;
			else 
				cout<<"否"<<endl;			
		};break; 
		case 10:
		{
			if(1 == day)
				cout<<"国庆节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 11:
		{
			cout<<"否"<<endl;
		};break;
		case 12:
		{
			if(24 == day)
				cout<<"平安夜"<<endl;
			else if(25 == day)
				cout<<"圣诞节"<<endl;
			else if(26 == day)	
				cout<<"毛泽东诞辰"<<endl;
			else 
				cout<<"否"<<endl;
		};break; 
		default:
			break;	
	}	
}
void show1()
{
	int y;
	cin >> y;
	date lz(y);
	printyear(lz.getyear());
	for( int m=1; m<=12; ++m )
	{
		lz.setmonth(m);

		printline();
		printmonth(m);
		printweek();
		printday( lz.getmonthdays(lz), lz.week(lz) );
		printline();
	}

}
void show2()
{
    int y = 2000;
	int m = 1;
	int d = 1;
    cin>>y>>m;
    date lz(y,m);
    printyear(y);
    printline();
	printmonth(m);
	printweek();
	printday( lz.getmonthdays(lz), lz.week(lz) );
	printline();
}
void show3()
{	
	int y,m,d;
	int wk = 0;
	cin>>y>>m>>d;
	date lz(y,m,d);
	wk = lz.week(lz);
	cout<<"您查询的日期为"<<lz<<endl;
	cout<<"这一天星期:"<<wk<<endl;
	cout<<"是否为节日:";check(m,d); 

	time_t current;
    struct tm *t;
    time(¤t); //得到目前的时间
    t=localtime(¤t);
    t->tm_year+=1900;
    t->tm_mon+=1;
    cout<<endl<<"今天的日期为:"<<t->tm_year<<" 年 ";
    cout<<t->tm_mon<<" 月 "<<t->tm_mday<<" 日"<<endl;
    date today(t->tm_year,t->tm_mon,t->tm_mday);
    int count1 = today.date_count(today);
    int count2 = lz.date_count(lz);
    if(count1>count2)
		cout<<"相差"<<count1-count2<<"天"<<endl;
    else 
    	cout<<"相差"<<count2-count1<<"天"<<endl;
}
void menu()
{ 	
	start:
	int tem = 0;
   	while(tem!=1 && tem!=2 && tem!=3)
    {
		cout<<"===========================万年历============================"<<endl;
		cout<<"||                                                         ||"<<endl; 
     	cout<<"||		   1.输入年份,得到该年的日历              ||"<<endl;
     	cout<<"||		   2.输入年月,得到该月的日历              ||"<<endl;
     	cout<<"||		   3.输入年月日,判断是否为节日             ||"<<endl;
     	cout<<"||                                                         ||"<<endl; 
     	cout<<"============================================================="<<endl;
     	cin>>tem;
     	getchar();
    	switch(tem)
     	{
      		case 1:
      		{	
      			cout<< "请输入年份 > ";
      			show1();
      		};break;
      		case 2:
      		{	
      			cout<<"请输入年/月 >"<<endl;
				show2();
          		break;
      		}
      		case 3:
      		{
         		cout<<"请输入年/月/日 >"<<endl;
				show3();
          		break;
      		}
      		default: system("cls");
            cout<<"输入有误!!请重新输入 >"<<endl;
  		}
  	}
    		getchar();
    		char choose;
    		cout<<endl;
    		cout<<"输入字符'e'结束,其他继续 >"<<endl;
    		choose=getchar();
    		if(choose=='e')
      			return ;
    		else	
   			{
        		system("cls");
        		goto start;
       		}
}
int main()
{
	menu();
	return 0;
}

三、部分运行结果截图

第一个功能:

第二个功能

第三个功能:

 

 

---------------》》用C语言实现万年历


 

版权声明:本文由 皓皓松博客 创作,转载请附带链接,有问题欢迎交流。

相关文章推荐

C++课设万年历显示

  • 2015年11月03日 19:05
  • 176KB
  • 下载

【C++】实现万年历

/****************************************************************************************** Purpose:...

C++实现万年历

一个C/C++的农历库,包含了日期转换和计算,方法齐全,功能强大,调用方便,并提供例子源代码。...

【c++巩固练习】c++实现日期计算器、日期万年历(日期类)

日期计算器的功能: 1.可以计算两个日期之间相距多少天。例:2016.5.1-2016.4.1 =  30 2.可以计算一个日期经过n天后的那个日期是什么。例:2016.5.1+40 = 2016.6...
  • XHfight
  • XHfight
  • 2016年07月08日 17:00
  • 1016

c++实现的万年历,无农历

  • 2011年05月13日 17:39
  • 2KB
  • 下载

c++实现一个万年历

  • 2011年07月24日 18:21
  • 4KB
  • 下载

C++万年历

用C++写了个简易的万年历。 具体功能如下:1.打印指定年(用户输入)所有月份的年历                            2.打印指定年指定月(用户输入)的月份        ...

C++ 万年历 实现永久年历

  • 2010年04月26日 11:50
  • 4.62MB
  • 下载

c++实现的万年历查询

  • 2009年10月11日 09:03
  • 263KB
  • 下载

万年历程序--C++编写

题目直接贴截图: 代码很简单,加上注释应该都能看懂 #include #include #include using namespace std; int monthset[20]=...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【课设】C++实现万年历
举报原因:
原因补充:

(最多只允许输入30个字)