二 设计思想
由于万年历具有以下特点:
1 平年365天(52周+1天),闰年366天(52周+2天),平年2月28天,闰年2月29天。由于公元1月1日设为星期六,故3月1日为星期三。为使算法达到最简,故本算法以“星期”为计算单位,且选3月1日为基月。
2 每400年整一闰,或每4年且不为百年的一闰,即凡能被400整除,或不能被100整除但能被4整除的年份为闰年。
3 每 4年(3个平年+1个闰年)共208周+5天
每百年共100*(208周+5天)-1天=5217周+5天
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天,即每400年一个轮回。
三 万年历实现的方法
1 程序预处理
程序预处理包括头文件加载、宏定义和全局变量的定义。
#include"stdio.h"
#include"dos.h"
#include"conio.h"
#include"stdlib.h"
#define LeapYear (x) (x%4==0&&x%100!=0||x%400==0
)?1:0
struct date sysTime;
2 功能控制模块
功能控制模块包括每月天数判定功能、每年天数判定功能、星期计算功能。分别由函数Monthnum()、Yearnum()、IsWeek()和*getWeek()
(1) int Monthnum(int y,int m),判定每月天数。
(2) int Yearnum(int y),判定第年天数。
(3) int isWeek(int y,int m),根据给定年月计算该月第一天对应的星期。
(4) char *getWeek(int y,int m,int d),根据给定年月日计算其对应的星期。
int Monthnum(int y,int m)
{
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
}
int Yearnum(int y)
{ if(LeapYear(y)) month[2]=29;/*闰年二月29天,平年28天*/ return month[m];
} t+=LeapYear(y);/*闰年366天*/ return t;
int isWeek(int y,int m)
{
}
char *getWeek(int y,int m,int d)
{
} char *Eweek; int week; switch(week) { case 0:Eweek="Sunday";break; case 1:Eweek="Monday";break; case 2:Eweek="Tuesday";break; case 3:Eweek="Wendesday";break; case 4:Eweek="Thursday";break; case 5:Eweek="Friday";break; case 6:Eweek="Sadurday";break; }week=(d+isWeek(y,m)-1)%7; /*计算星期*/ int year=1900,week=1,i; /*定义万年历是从1900年开始*/ long sum=0; for(i=year;i
3 日历显示模块
日历显示是本程序的核心模块,该模块实现了日历的生成和显示功能。该模块由empty()函数和Disp()函数实现。
(1) void empty(int n),控制每个月开始输出的空格。
(2) void Disp(int y,int m,int d),控制日历的生成与显示。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-26593-23.html
小米公司知道国家质检总局抢不到小米手机后马上赶过来送上几部意思意思
这种做错事不道歉的官僚作风不除