万年历(C语言编程)

万年历(C语言编程),第1张

#include<stdioh>

#include<timeh>

int leap (int year)//判断闰年

{

if(year%4==0&&year%100!=0||year%400==0)

return 1;

else return 0;

}

int days_month (int month,int year)//判断月

{

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)

return 31;

if(month==4||month==6||month==9||month==11)

return 30;

if(month==2&&leap(year)==1) return 29;

else return 28;

}

int firstday(int month,int year)//判断年

{

int w;

w=(1+2month+3(month+1)/5+year+year/4+year/400-year/100)%7+1;

return w;

}

main()

{

//调用系统时间

time_t tval;

struct tm now;

tval = time(NULL);

now = localtime(&tval);

printf("现在时间: %4d年 %d月 %02d日 %d:%02d:%02d\n", now->tm_year+1900, now->tm_mon+1, now->tm_mday,

now->tm_hour, now->tm_min, now->tm_sec);

//调用结束

int i,j=1,k=1,a,b,month,year;

b=days_month(now->tm_mon+1,now->tm_year+1900);

a=firstday (now->tm_mon+1,now->tm_year+1900);

printf(" Sun Mon Tue Wed Thu Fri Sat \n");

if(a==7)

{

for(i=1;i<=b;i++)

{

printf("%4d",i);

if(i%7==0)

{

printf("\n");

}

}

}

if(a!=7)

{

while (j<=4a)

{

printf(" ");

j++;

}

for(i=1;i<=b;i++)

{

printf("%4d",i);

if(i==7k-a)

{

printf("\n");

k++;

}

}

}

printf("\n");

}

这是一个DS1302时钟程序,根据自己的硬件电路适当改改就可以做成日历了 /

DS1302控制程序 20111201 wqz

/

#include<reg52h>

#include<intrinsh>

typedef unsigned uchar;sbit sda=P2^1; //DS1302

sbit clk=P2^0;

sbit ce=P2^2;

//sbit sda=P3^4;

//sbit clk=P3^6;

//sbit ce=P3^5;

//

//sbit _138_A=P2^2; //138A,B,C口

//sbit _138_B=P2^3;

//sbit _138_C=P2^4;sbit IO =P1^7; //595控制信号

sbit RLK =P1^6;

sbit CLK =P1^5;#define my_delay5us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()

//#define T0_init() TMOD=0x01;TH0=0xb8;TL0=0x00;TR0=1;ET0=1;EA=1uchar cc[8]; //将要显示的时间由BCD码转换成要显示的数值存放在CC[]中

uchar bb[8]; //存放从DS1302中读取出来的数据

uchar aa[7]={0,30,18,20,12,6,11}; //初始时间

uchar code write_rtc[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //时间寄存器写地址

uchar code tember[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管显示表void my_delay1ms(int t); //延时1ms函数

void write_1byte(uchar temp); //写一字节数据

uchar read_1byte(); //读一字李数据

void write_addr_data(uchar Addr, uchar Data); //先写地址再写数据

uchar writeadd_readdat(uchar ucAddr); //先写地址再读数据

void write1_readM(); //连续读多个字节数据

void ds1302_init(); //DS1302初始化/

主函数

/void main()

{

uchar i,j,dat; my_delay1ms(10);

ds1302_init(); //给DS1302付初值 11年12月20日 周六 18-30-00

// T0_init(); while(1)

{

write1_readM(); //读DS1302中的数据 cc[0]=bb[0]%16;

cc[1]=bb[0]/16;

cc[2]=10;

cc[3]=bb[1]%16;

cc[4]=bb[1]/16;

cc[5]=10;

cc[6]=bb[2]%16;

cc[7]=bb[2]/16; for(j=0;j<8;j++)

{

dat=tember[cc[j]];

RLK=0;

my_delay5us();

for(i=0;i<8;i++)

{

if(dat&0x80)IO=1;

else IO=0;

my_delay5us();

CLK=1;

my_delay5us();

CLK=0;

dat<<=1;

}

my_delay5us();

RLK=1;

}

my_delay1ms(500);

}

}//void my_delay1ms(int t) //延时

{

uchar i,j;

while(t--)

{

for(i=4;i>0;i--)

for(j=50;j>0;j--);

}

}//void write_1byte(uchar temp) //写一字节数据

{

uchar i; clk=0;

my_delay5us();

for (i=0;i<8;i++)

{

if(temp&0x01)sda=1;

else sda=0;

my_delay5us();

clk=1;

my_delay5us();

clk=0;

temp>>=1;

}

}//uchar read_1byte() //读一字节数据

{

uchar i,num;

for (i=0;i<8;i++)

{

num>>=1;

if(sda)

num|=0x80;

my_delay5us();

clk=1;

my_delay5us();

clk=0;

}

return num;

}//void write_addr_data(uchar Addr, uchar Data) //先写地址再写数据

{

ce = 0;

my_delay5us();

clk = 0;

my_delay5us();

ce = 1;

my_delay5us();

write_1byte(Addr); // 地址,命令

write_1byte(Data); // 写1Byte数据

my_delay5us();

clk=1;

my_delay5us();

ce =0;

} //uchar writeadd_readdat(uchar ucAddr) //先写地址再读数据

{

uchar num1=0; ce = 0 ;

my_delay5us();

clk = 0;

my_delay5us();

ce = 1;

my_delay5us();

write_1byte(ucAddr); // 地址,命令

num1 = read_1byte(); // 读1Byte数据

my_delay5us();

clk = 1;

my_delay5us();

ce =0; return(num1);

}//void write1_readM() //连续读多个字节数据

{

uchar i,Addr; Addr=0x81;

for (i=0;i<7;i++)

{

bb[i] = writeadd_readdat( Addr);//格式为: 秒 分 时 日 月 星期

Addr += 2;

}

}//void ds1302_init() //初始时间 11年12月20日 周六 18-30-00

{

uchar i,p,tmp; for(i=0;i<7;i++)

{ /如想设置DS1302的“秒”,设置时间为37秒,所以输入的是十/

tmp=aa[i]/10; /进制数37,对应的16进制是0x25,但是DS1302寄存器使用的是压/

aa[i]=aa[i]%10; /缩BCD码,所以应该写入BCD数值37才行,即0x37。所以需要将/

aa[i]=aa[i]+tmp16; /10进制的37转换为16进制表示的0x37/

}

write_addr_data(0x8E,0X00);

p=write_rtc; //传地址

for(i=0;i<7;i++) //7次写入 秒分时日月周年

{

write_addr_data(p,aa[i]);

p++;

} write_addr_data(0x8E,0x80);

}////void ET0_ser() interrupt 1

//{

//// uchar i;

//

// TH0=0x55;

// TL0=0x00;

//

//// P0=tember[cc[i]];

//// switch(i)

//// {

//// case 0 : _138_A=1;_138_B=1;_138_C=1; break;

//// case 1 : _138_A=0;_138_B=1;_138_C=1; break;

//// case 2 : _138_A=1;_138_B=0;_138_C=1; break;

//// case 3 : _138_A=0;_138_B=0;_138_C=1; break;

//// case 4 : _138_A=1;_138_B=1;_138_C=0; break;

//// case 5 : _138_A=0;_138_B=1;_138_C=0; break;

//// case 6 : _138_A=1;_138_B=0;_138_C=0; break;

//// case 7 : _138_A=0;_138_B=0;_138_C=0; break;

//// }

//// i++;

//// if(i==8)i=0;

//}

#include <windowsh>

#include <winnth>

#include<iostream>

#include<iomanip>

using namespace std;

int week(int,int,int); //根据年月日判断星期几

int leap_year(int); //判断闰年

void display_year(int ); //显示某年日历

void demand_day(int,int,int); //查询某天

int main()

{

int y,m,d,es=1;

while(es)

{

HANDLE consolehwnd;

consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(consolehwnd,12);

cout<<"请选择 *** 作:\n1→显示某年日历\

\n2→查询某天\n0→退出"<<endl;

char tp[20];cin>>tp;

if(tp[1]!='\0'||tp[0]>'2'||tp[0]<'0'){cout<<"输入有误"<<endl;continue;}

switch(tp[0]-48)

{

case 1:{cout<<"请输入年份:";cin>>y;system("cls");display_year(y);break;}

case 2:{cout<<"请输入年、月、日,以空格分开:";cin>>y>>m>>d;system("cls");

demand_day(y,m,d);break;}

case 0:{es=0;break;}

}

}

return 0;

}

//-----根据年月日判断星期几-------------------------

int week(int y,int m, int d)

{

int week1,yy=y;

if(m==1) {m=13;yy--;}

if(m==2) {m=14;yy--;}

week1=(d+2m+3(m+1)/5+yy+yy/4-yy/100+yy/400)%7;

int s;

switch (week1)

{

case 0: s=1; break;

case 1: s=2; break;

case 2: s=3; break;

case 3: s=4; break;

case 4: s=5; break;

case 5: s=6; break;

case 6: s=0; break;

}

return s;

}

//----判断闰年-------------------------------------

int leap_year(int y)

{

int i;

if((y%4==0&&y%100!=0)||y%400==0)i=1;

else i=0;

return i;

}

//--------显示某年日历------------------------

void display_year(int y)

{

int n1,n2,i,j,a[13],c,d;

HANDLE consolehwnd;

consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(consolehwnd,5);

cout<<setw(38)<<y<<"年"<<endl;

cout<<setw(28)<<"";

for(i=1;i<=27;i++)cout<<'';

cout<<endl;

a[1]=a[3]=a[5]=a[7]=a[8]=a[10]=a[12]=31;//

a[4]=a[6]=a[9]=a[11]=30; //确定每月天数

if(leap_year(y))a[2]=29;

else a[2]=28; //

for(i=1;i<=11;i+=2) //六次循环

{

SetConsoleTextAttribute(consolehwnd,1);

cout<<setw(14)<<i<<"月"<<setw(42)<<i+1<<"月"<<endl;

SetConsoleTextAttribute(consolehwnd,2);

cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)\

<<"四"<<setw(4)<<"五"<<setw(4)<<"六";

cout<<setw(16)<<' ';

cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)\

<<"四"<<setw(4)<<"五"<<setw(4)<<"六"<<endl;

SetConsoleTextAttribute(consolehwnd,7);

n1=week(y,i,1);n2=week(y,i+1,1);

if(n1) //-----------

{

for(j=1;j<=n1;j++) //

cout<<setw(4)<<' ';

}

for(j=1;j<=7-n1;j++)

cout<<setw(4)<<j;

cout<<setw(16)<<' ';

if(n2)

{ //-----输出每次循环的第一行---

for(j=1;j<=n2;j++)

cout<<setw(4)<<' ';

}

for(j=1;j<=7-n2;j++)

cout<<setw(4)<<j;

cout<<endl; //--------------

c=8-n1;d=8-n2;

for(int m=1;m<6;m++) //每月日历最多占六行

{

if(c>a[i])cout<<setw(47)<<' ';//若c>a[i],则该月的这一行全部输出空格

for(j=c;j<=a[i];j++)

{

cout<<setw(4)<<j;

if((j-c+1)%7==0){c=j+1;break;}

if(j==a[i]){cout<<setw((6-week(y,i,a[i]))4)<<' ';c=j+1;break;}

//如果j是该月最后一天,该行剩下的全部补空格

}

cout<<setw(16)<<' ';

if(d>a[i+1])cout<<setw(47)<<' ';

for(j=d;j<=a[i+1];j++)

{ //

cout<<setw(4)<<j;

if((j-d+1)%7==0){d=j+1;break;}

if(j==a[i+1]){cout<<setw((6-week(y,i+6,a[i+1]))4)<<' ';d=j+1;break;}

}

cout<<endl;

}

cout<<endl;

}

cout<<endl;

}

//--------查询某天------------

void demand_day(int y,int m,int d)

{

int n;

HANDLE consolehwnd;

consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(consolehwnd,5);

n=week(y,m,d);

switch(n)

{

case 1:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期一"<<endl;break;

case 2:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期二"<<endl;break;

case 3:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期三"<<endl;break;

case 4:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期四"<<endl;break;

case 5:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期五"<<endl;break;

case 6:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期六"<<endl;break;

case 0:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期日"<<endl;break;

default:break;

}

cout<<endl;

}

/你好,这个问题我来回答,希望能被采纳://函数功能输出year的日历/#include<stdioh>void

main(){int

a,b,c,d,e,f,i,j,k,n,m,year;printf("input

the

year:\n");

scanf("%d",&year);

//输入数据的初始化;b=year;c=year%4;d=year/4;e=d1461+c365;f=e%7;j=f;

//初始化Year年的第一天的星期;m=j;printf("%d年的日历\n",year);for(a=1;a<=12;a++)

//函数的主要部分,主要实现日历的打印部分

{

if(a==1||a==3||a==5||a==7||a==8||a==10||a==12)k=31;

else

if(a==4||a==6||a==9||a==11)k=30;

else

if((year%4==0&&year%100!=0)||(year%400==0))k=29;

else

k=28;

printf("%d月份\n

STAT

SUN

MON

TUE

WED

THUR

FRI\n",a);

m=j;

if(m<=5)m=m+1;

else

m=m-6;

for(n=1;n<=m;n++)printf("

");

for(i=1;i<=k;i++,j++)

{if(j==7)j=0;

if(i<10)printf("

%d",i);

else

printf("

%d",i);

if(j==5)printf("\n");

}

printf("\n\n\n");

}}

以上就是关于万年历(C语言编程)全部的内容,包括:万年历(C语言编程)、单片机做的日历 c语言程序、c语言 万年历的程序设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9690381.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存