项目需求:制作一个日历,输入年月,得到该年月的日历信息,相关结果如下:
需求分析:自顶部到底部进行设计:
第一步:设计输入;第二步:设计表头;第三步;设计日历的主体,第四步,设计表尾;
参考网址:如何确定某年某月某日为星期几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];
}
程序测试:(普通测试和闰年测试):程序测试没有问题