谁知道怎么用C语言编写万年历啊

系统实现万年历的功能,以交互的方式显示。适用于从公元1年1月1日至公元10000年之间所有日期的显示,在屏幕上任意输入某一年,系统可输出该年的年历;在屏幕上任意输入某年某月,都会以一个二维数组的形式显示该月所有天数以及每天所对应的星期值;在屏幕上任意输入一个年、月、日,都会显示出该天是星期几。

实现输入年月日输出星期用蔡勒公式,蔡勒(Zeller)公式:是一个计算星期的公式。
随便给一个日期,就能用这个公式推算出是星期几。

蔡勒公式如下:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1

公式中的符号含义如下:
w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪(前两位数)
y:年(后两位数)
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]代表取整,即只要整数部分。

下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期五。

再比如计算2006年4月4日,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1
=-12 (除以7余2,注意对负数的取模运算!) 其他的没怎么研究过
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-19
说实话 你说的不是很清楚明白,我们都不知道你要的是什么比如你用什么显示,你用的是什么比如单片机?液晶1602?还是用别的都不说 这个不好贴! 我现在贴一个我自己以前写过的 用单片机AT89C52的用液晶1602做过的一个 万年历吧!#include<reg51.h>
#include<math.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define DB7_DB0 P1
#define DB7 P1_7
#define DataPort P1
uchar Data=0;
uchar i,lcd;
uchar sec0=0;
uchar sec1=0;
uchar min0=0;
uchar min1=0;
uchar hour0=0;
uchar hour1=0;
uchar num,len1,len2;
sbit RS=P2^1;
sbit RW=P2^2;
sbit E=P2^3;
uchar code q[]={"0""1""2""3""4""5""6""7""8""9"};
uchar code p[]={"0""1""2""3""4""5""6"};
uchar code s[]={"0""1""2""3""4""5""6""7""8""9"};
uchar code w[]={"0""1""2""3""4""5""6"};
uchar code a[]={"0""1""2""3""4""5""6""7""8""9"};
uchar code b[]={"0""1""2"};
uchar tab[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,//"年"代码 0x00<br> 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//"月"代码 0x01<br> 0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00,//"日"代码 0x02<br> };
uchar code tab2[]="20091229";
void lcd_wcom(uchar iadt);
/*********延时1ms***********/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}
}
}
////////////////////////////////////////////////////
key()
{
//if(BY1==0) //判断是否按测P3.4肯定为低电平。
//{
//delay(10); //延时,软件去干扰 // if(BY1==0)
//{ //确认按键按下
sec0+=1;
if(sec0>9){sec1++;sec0=0;}
if(sec1>=6){min0++;sec1=0;}
if(min0>9){min1++;min0=0;}
if(min1>=6){hour0++;min1=0;}
if(hour0>9){hour1++;hour0=0;}
if(hour1==2&hour0==4){hour0=0,hour1=0;}
}//}}
/*****************检验忙信号子函数********************/
void WaitForEnable(void)
{
DataPort=0xff;
RS=0;
RW=1;
E=1;
delay(5);
E=0;
return;
}
/******************写命令到LCM子函数*******************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{
if(Attribc)WaitForEnable();
RS=0;RW=0;
DataPort=CMD;
E=1; E=0;
}
/*****************写数据到LCM子函数*******************/
void WriteDataLCM(uchar dataW)
{
WaitForEnable();
RS=1;RW=0;
DataPort=dataW;
E=1;E=0;
}
/*****************LCM初始化子函数********************/
void InitLcd()
{
WriteCommandLCM(0x38,1);
WriteCommandLCM(0x08,1);
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x06,1);
WriteCommandLCM(0x0c,1);
}
/**************显示指定坐标一个字符的子函数**********************/
void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,1);
WriteDataLCM(DData);
}
/*************************************/
void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code*DData)
{
uchar ListLength=0;
Y&=0x1;
X&=0xF;
while(X<=10)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}}
/*************************************/
/********************读忙子程序*********************/
void busy()
{
RS=0;
RW=1;
E=1;
delay(500);
E=0;
while(DB7_DB0&0x80);
return;
}
/*************初始化子程序***************/
void init(void)
{
lcd_wcom(0x01);//清0
busy();
lcd_wcom(0x38);//8位总线 双行 5*7显示
busy();
lcd_wcom(0x0f);//高电平表示开显示 高电平表示有光标 高电平光标闪烁
busy();
lcd_wcom(0x06);//光标移动方向,高电平右移 屏幕上所有文字是否左移或者右移。高电平表示有效
busy();
return;
}
/***********命令或地址写入子程序************/
void lcd_wcom ( uchar com)//当RS和R/W共同为低电平时可以写入指令或者显示地址
{
DB7_DB0=com;
RS=0;
RW=0;
E=1;
delay(500);
E=0;
return;
}
/************数据写入子程序*************/
void lcd_wdat(uchar dat)
{
DB7_DB0=dat;
RS=1;
RW=0;
E=1;
delay(1500);
E=0;
return;
}
/***************************************************/
void main()
{
char m;
len1=sizeof(tab2);
init();//初始化
lcd_wcom(0x40);//写年月日
for(m=0;m<32;m++)//
{
lcd_wdat(tab[m]);
}
lcd_wcom(0x80);//2009
for(num=0;num<4;num++)
{
lcd_wdat(tab2[num]);
delay(80);
}
lcd_wcom(0x84);//年
lcd_wdat(0);//
lcd_wcom(0x86);//08
for(num=4;num<6;num++)
{
lcd_wdat(tab2[num]);
delay(80);
}
lcd_wcom(0x88);//月 lcd_wdat(1);//
lcd_wcom(0x8A);//08
for(num=6;num<len1;num++)
{
lcd_wdat(tab2[num]);
delay(80);
}
lcd_wcom(0x8C);//日 lcd_wdat(2);//
while(1)
{
key();
{
DisplayOneChar(2,1,b[hour1]);
DisplayOneChar(3,1,a[hour0]);
DisplayOneChar(4,1,0x3a);
DisplayOneChar(5,1,w[min1]);
DisplayOneChar(6,1,s[min0]);
DisplayOneChar(7,1,0x3a);
DisplayOneChar(8,1,p[sec1]);
DisplayOneChar(9,1,q[sec0]);
delay(3000);
}
//DisplayListChar(0,0,&q[i]);
delay(100);
//conv();
}
}本回答被网友采纳

c语言万年历程序。编写程序打印任意给定的年份的日历或者某年某月的月 ...
include <stdio.h>\/\/ 判断某年是否为闰年int isLeapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 1;} return 0;}\/\/ 获取某年某月的天数int getMonthDays(int year, int month) { int days;switch (month) { case 2:days = i...

C语言程序设计万年历怎么编写
int IsLeapYear(int);main(){ int i;int day;int year;int temp;int temp_i;long int Year_days = 0;int Year_Start = 1;int Per_Year_Days;int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29};printf("Please enter the year: ");scanf("%d",&year);while(Year_...

求用C语言编写打印万年历的程序代码
int monthDay(int,int);int IsLeapYear(int);main(){ int days,weekDay,year,month=1,d,i;printf("please input the year:\\n");scanf("%d",&year);days=year-1+(year-1)\/400+(year-1)\/4-(year-1)\/100;while(month<=12){ printf("\\t\\t\\t%d-%d\\n",year,month);printf("Sun\\...

C语言万年历代码
\/\/Days[1~12]存储每个月有多少天,其中二月的天数是可变的(闰年29天,平年28天),这里初始化为28天 printf(" C语言简单万年历\\n"); \/\/打印标题 XunHuan: \/\/循环标号(可以通过goto跳转到这里)printf("请输入年份<0000~9999>: "); \/\/提示输入年份(0~9999)scanf("%d",&Year); \/...

C语言编写万年历~~速度
C语言编程万年历,要求输入年月,判断是否闰年;输入年月日,判断星期几;输入年份,打出12个月的月历;输入月份,打印出本月日历;要求用多个函数实现。 恩 就这 2天尽快,谢谢。匿名 | 浏览226 次 |举报 我有更好的答案推荐于2017-12-15 14:11:19 最佳答案 \/*C语言编程万年历要求输入年月,判断是否闰年;输入年...

求大神帮忙写一个c语言万年历代码,(要求输入一个年月,打印出对应的日历...
(时间范围: 1970 ~ 2105 年)include <stdlib.h>#include <stdio.h>#include #include <windows.h>int main (){ int year, month, n; printf ("年: "); scanf ("%d", &year); printf ("月: "); scanf ("%d", &month); time_t t, t1; struct tm *mkt = new tm, *gmt...

编写c语言万年历程序 要求打印任意年份的日历或某年某月的月历或者查询...
int numday[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};int IsLeap(int y){ return (y%400==0||y%4==0&&y%100!=0);} void print(int y,int m,int w){ int i,j,l;printf("Calendar %d-%02d\\n",y,m);printf...

怎么用C语言编写万年历程序
万年历 include "stdio.h" \/* Required for MS-DOS use *\/ define ENTER 0x1C0D \/* Enter key *\/ int year, month, day;static char *days[8] = {" ","Sunday ","Monday ","Tuesday ","Wednesday","Thursday ","Friday ","Saturday "};struct TIMEDATE { i...

编写c语言万年历程序 要求输入能够查询任意年份的日历或某年某月的...
int countyear,countday=0,weekflag,i,j,k,c;int startmon,endmon,year1;year1=year-1;countyear=(year1-year1%4)\/4-(year1-year10)\/100 (year1-year1@0)\/400;weekflag=(countyear*366 (year-1-countyear)*365 1)%7-1;if(month==0) {startmon=1;endmon=12;} else {startmon...

c语言编程“万年历”:输入年份后输入这一年元旦是周几然后出现这一年的...
c=c+day;s=year-1+(float)(year-1)\/4+(float)(year-1)\/100+(float)(year-1)\/400-40+c;return ((int)s%7);} int PrintAllYear(int year){ int temp;int i,j;printf("\\n\\n%d year\\n",year);for(i=1;i<=12;i++){ temp=DaySearch(year,i,1);if(i==1){ if(temp=...

相似回答