C++面向对象的练习:case02:Calendar(日历)

项目需求:制作一个日历,输入年月,得到该年月的日历信息,相关结果如下:


                                                       

需求分析:自顶部到底部进行设计:

第一步:设计输入;第二步:设计表头;第三步;设计日历的主体,第四步,设计表尾;

参考网址:如何确定某年某月某日为星期几https://blog.csdn.net/bible521125/article/details/50418436

程序代码如下:

/************************************************************************/
/* Boject-Oriented Programming C++
@title Calendar
@author haoaowei
@Email:[email protected]
@Date 2018-07-30
@copyright Department of Geophysical and Technology,China University of Geophysics ,Beijing ,P.R China
*/
/*
[问题描述]
  打印日历
[学习要点]
  *自顶向下的设计
  
*/
/************************************************************************/
#include "iostream"
#include"iomanip"
#include "cstdlib"
using namespace std;

int CaculateWeekDay(int y, int m, int d);//函数声明,计算某年某月星期几的函数声明
int CaculateDaysInMonth(int y,int m);   //计算某年某月有多少天的函数

int main(int argc,char *argv[])
{
	 unsigned int year,month;
	 int RecordDate ;
	 int DaysInMonth;

	//01、完成输入:
        cout<<"请输入年月:";
        cin >> year>>month;
		while(month<1 || month>12)  //做一个循环判断
		{
			cout << "输入的时间有错误,请重新输出\n";
			cout<<"请输入年月:";
			cin >> year>>month;
		}
	//02、打印表头
		cout<<"===============================\n"
			<<"  SUN MON TUE WED THU FRI SAT\n"
			<<"-------------------------------\n";
	//03:定位主体
		//3.1定位某年月的开始第一天为星期几
		RecordDate = CaculateWeekDay(year,month,1);  //返回的值0周末,0到6为星期一到六
		//cout <<"该月第一天星期几(0为周末):"<<RecordDate << endl;
		//3.2 定位某年某个月有多少天
		  DaysInMonth = CaculateDaysInMonth(year,month);
		 // cout <<"该月有多少天:"<<DaysInMonth  << endl;
		//3.3 输出打印格式:相邻星期之间的间隔为4个字符
		  cout<< setw(4*(RecordDate+1)); //这是开始前的空格定位
		  for (int i =1;i<=DaysInMonth;i++)
		  {
			 //定位第一个位置:
			  
			  cout<< i <<setw(4);
			  if((RecordDate+i)%7 == 0)
				  cout <<'\n'<<setw(4);
		  }


	//04、打印表尾
		cout<<"\n===============================\n";

     system("pause");  //暂停一下

	return 0;
}



//3.1计算年月日为星期几的函数:基姆拉尔森计算公式:
int CaculateWeekDay(int y, int m, int d)
{
	int record;
	if (m == 1 || m == 2) {
		m += 12;
		y--;
	}
	int iWeek = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
	switch (iWeek)  //重新设置,星期日得到0,星期1到6分别为1到6
	{
	case 0:  record =iWeek+1; break;//cout << "星期一" << endl
	case 1:  record =iWeek+1;break;//cout << "星期二" << endl;
	case 2:  record =iWeek+1;break;//cout << "星期三" << endl;
	case 3:  record =iWeek+1;break; //cout << "星期四" << endl;
	case 4:  record =iWeek+1;break;//cout << "星期五" << endl; break;
	case 5:  record =iWeek+1;break;//cout << "星期六" << endl; break;
	case 6:  record =iWeek-6;break;//cout << "星期日" << endl; break;
	}
	return record;
}

//3.2 计算某年某月多少天
int CaculateDaysInMonth(int y,int m)
{
	const int md[]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; //定义一个函数

	if( (y%4==0 && y%100 !=0 ||y%400==0)&& m==2 )  //如果是闰年的二月份,则返回29天
		return 29;
	else
		return md[m];
}

程序测试:(普通测试和闰年测试):程序测试没有问题

猜你喜欢

转载自blog.csdn.net/haoaoweitt/article/details/81280172