编写日历

问题的提出:日历的编排是每400年一个大循环周期,即今年的月、日、星期几和400年前的完全一样。现行天文历法根据天体运行规律,取每年365.2425天。这样,每400年共有365.2425×400146097天。如果以365天作为一年,每400年就少了0.2425×40097天。这97天要靠设置闰年(每年366)天来凑齐,所以,每400年要设置97个闰年。

       编程思路:按照以上背景知识可得判断闰年的规律:某年年份如果能被4整除但不能被100整除,或者能被400整除则是闰年。由此规则可推得计算万年历的公式:

s=X-1+(X-1)/4-(X-1)/100+(x-1)/400+c  上式中:X为公元年数(如2003年);C 为从元旦起,到要算的那天总数(如2003323C=31282382)。S/7余数是星期几。

代码如下:

#include "stdafx.h"
#include <iomanip.h>

void printMonth(int month);
void printHead(int month);
int daysOfMonth(int month);
int firstDay(int year);
int year,weekday;

int main(int argc, char* argv[])
{
 int i = 1;
 cout << "请输入年份:";
 cin >> year;
 weekday = firstDay(year);
 cout << endl << "         " << "第" << year << "年的日历如下:" << endl << endl;
 while(i <= 12)
 {
  printMonth(i);
  cout << endl << endl;
  i++;
 }
 return 0;
}//end main()
void printMonth(int month)  //打印每月日历
{
 int i = 1, days;
 printHead(month);
 days = daysOfMonth(month);
 cout << "   ";
 while(i <= days)
 {
  cout << setw(5) << i;
  weekday = (weekday + 1)%7;
  if(!weekday)
  {
   cout << endl;
   cout << "   ";
  }
  i++;
 }
}//end printMonth()
void printHead(int month) //打印每月的日历头(判定起始位置)
{
 cout << month << "月" << setw(5) << "日" << setw(5) << "一" << setw(5) << setw(5) << "二"
  << setw(5) << "三" << setw(5) << "四" << setw(5) << "五" << setw(5) << "六" << endl;
 int i = 0;
 while(i < weekday)
 {
  cout << "     ";
  i++;
 }
}//end pintHead()
int daysOfMonth(int month)  //每月的天数
{
 switch(month)
 {
 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:
  if(year%4==0 && year%100 !=0 || year%400 == 0)
   return 29;
  else return 28;
 default:
  return 0;

 }
}//end daysOfMonth
int firstDay(int year)  //判断某年元旦是星期几
{
 int s;
 s = year - 1 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + 1;
 return s%7;
}//end firstDay()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值