当前位置:编程学习 > C/C++ >>

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

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

补充:高手请直接给代码
追问:我想要的是用简单的C语言编的万年历系统
答案:说实话 你说的不是很清楚明白,我们都不知道你要的是什么比如你用什么显示,你用的是什么比如单片机?液晶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
   0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//"月"代码 0x01
   0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00,//"日"代码  0x02
   };
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();                               
 }
 }

实现输入年月日输出星期用蔡勒公式,

蔡勒(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,注意对负数的取模运算!)

 

其他的没怎么研究过

上一个:c语言和c++语言有什么不同
下一个:求一个C语言冒泡排序法的简单程序

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,