# include <stdioh>
# include <mathh>
void printmonth(int m);
void printhead(int m);
int daysofmonth(int m);
int firstday(int y);
int year,weekday;
void main()
{
int i;
printf("请输入年份:");
scanf("%d",& year);
weekday=firstday(year);
printf("\n\n");
printf(" %d年\n",year);
for(i=1;i<=12;i++)
{
printmonth(i);
printf("\n");
}
printf("\n\n");
}
void printmonth(int m) //打印每月日历
{
int i,days;
printhead(m);
days=daysofmonth(m);
for(i=1;i<=days;i++)
{
printf("%5d",i);
weekday=(weekday+1)%7;
if (weekday==0) printf("\n ");
}
}
void printhead(int m) //打印每月的日历头(判定起始位置)
{
int i;
printf("\n%d月 日 一 二 三 四 五 六\n",m);
printf(" ");
for(i=0;i<weekday;i++)
printf(" ");
}
int daysofmonth(int m) //每月的天数
{
switch (m)
{
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;
}
}
int firstday(int y) //判断某年元旦是星期几
{
double s ;
s=floor(year-1+(year-1)/40-(year-1)/1000+(year-1)/4000+1);
return (int)s%7;
}
#include <stdioh>
#include <stdlibh>
#include <mathh>
char month[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nev","Dec"};
char week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int j_leapyear(int year) //定义函数检测输入年份是否为闰年
{
if((/year%400==0/year%4==0&&year%100!=0)||(year%400==0))
return (1);
// else if(year%4==0&&year%100!=0)
// return (1);
else return 0;
}
int month_day(int year,int month) //检测该年月份有多少天
{
int mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(j_leapyear(year)&&month==2)
return 29;
else return (mon_day[month-1]);
}
int j_week(int year,int month,int day) //检测该天是星期几
{
int d=0,i; //d表示该天在该年份的累计天数
int w;
/ int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(j_leapyear(year)==1)
month_day[1]=29;
for(i=0;i<month;i++)
d+=month_day[i];
d=d+day;/
for(i=1;i<month;i++)
d+=month_day(year,i);
d+=day;
w=(year-1)+(int)(year-1)/4-(int)(year-1)/100+(int)(year-1)/400+d;//网上公式
return ((int)w%7);
}
int allyear(int year) //输出全年日历
{
int i,j,b;
printf("\n%d 日历",year);
for(i=1;i<=12;i++)
{
printf("\n\n\t%s\n",month[i-1]);
// printf(" 7 1 2 3 4 5 6 \n");
printf(" S M T W T F S \n");
b=j_week(year,i,1);
for(j=1;j<=month_day(year,i)+b;j++)
{
if(j<=b)
printf(" ");
else if(j-b<10)
printf("%2d ",j-b);
else printf("%2d ",j-b);
//else printf("%2d ",j-b);
if(j%7==0)
putchar('\n');
}
putchar('\n');
}
return 0;
}
void month_print(int year,int month) //输入一个年月,输出这个月的日历
{
int i,c,d;
c=month_day(year,month);
printf("\n\n %d年%d月日历\n",year,month);
printf(" S M T W T F S \n");
d=j_week(year,month,1);
for(i=1;i<=c+d;i++)
{
if(i<=d)
printf(" ");
else printf("%2d ",i-d);
if(i%7==0)
putchar('\n');
}
putchar('\n');
}
int jisuan_day(int year,int month,int day,int x,int y,int z) //输入年月日,输出距x年y月z日有多少天,星期几,以及是否是公历节日
{
int i,a,b,c=0,d=0,days=0,m=0,n=0,t;
a=year>=xyear:x;
b=year<xyear:x;
if(a>b)
{
for(i=b+1;i<a;i++)
c+=j_leapyear(i);
}
else c=0;
if(year!=x)
d=a-b-1;
else d=0;
m=365d+c;
if(year<x)
{
for(i=month;i<=12;i++)
n+=month_day(year,i);
days=m+n+z-day;
}
else if(year>x)
{
for(i=y;i<=12;i++)
n+=month_day(x,i);
for(i=1;i<month;i++)
n+=month_day(year,i);
days=m+n+day-z;
}
else
{
for(i=month>=yy:month;i<(month>=ymonth:y);i++)
n+=month_day(x,i);
days=abs(day-z)+n; //输出距离y月z日有多少天
}
printf("这天离%d年%d月%d号有%d天\n",x,y,z,days);
t=j_week(year,month,day);
if(t==0) //输出星期几
printf("这天星期日");
else if(t==1)
printf("这天星期一");
else if(t==2)
printf("这天星期二");
else if(t==3)
printf("这天星期三");
else if(t==4)
printf("这天星期四");
else if(t==5)
printf("这天星期五");
else if(t==6)
printf("这天星期六");
putchar('\n');
if(month==1&&day==1)
printf("这天是元旦节");
else if(month==2&&day==14)
printf("这天是情人节");
else if(month==3&&day==8)
printf("这天是妇女节");
else if(month==3&&day==12)
printf("这天是植树节");
else if(month==4&&day==1)
printf("这天是愚人节");
else if(month==4&&day==4)
printf("这天是清明节");
else if(month==5&&day==1)
printf("这天是劳动节");
else if(month==6&&day==1)
printf("这天是儿童节");
else if(month==8&&day==1)
printf("这天是建军节");
else if(month==9&&day==10)
printf("这天是教师节");
else if(month==10&&day==1)
printf("这天是国庆节");
else if(month==12&&day==25)
printf("这天是圣诞节");
else printf("这天不是特殊节日");
putchar('\n');
return days;
}
void fish_or_net(int year,int month,int day) //判断是打鱼还是晒网
{
int q;
int i,a,b,c=0,d=0,days=0,m=0,n=0;
a=year>=1990year:1990;
b=year<1990year:1990;
if(a>b)
{
for(i=b+1;i<a;i++)
c+=j_leapyear(i);
}
else c=0;
if(year!=1990)
d=a-b-1;
else d=0;
m=365d+c;
if(year<1990)
{
for(i=month;i<=12;i++)
n+=month_day(year,i);
days=m+n+1-day;
}
else if(year>1990)
{
for(i=1;i<=12;i++)
n+=month_day(1990,i);
for(i=1;i<month;i++)
n+=month_day(year,i);
days=m+n+day-1;
}
else
{
for(i=month>=11:month;i<(month>=1month:1);i++)
n+=month_day(1990,i);
days=abs(day-1)+n; //先确定这天离1990年1月1日有多少天
}
q=days%5+1;
if(q==1||q==2||q==3) //判断打鱼还是晒网
printf("渔人今天打鱼");
else printf("渔人今天晒网");
putchar('\n');
}
/int main() //这部分内容用来校检
{
int j_leapyear(int year);
int month_day(int year,int month);
int j_week(int year,int month,int day);
int allyear(int year);
void month_print(int year,int month);
int jisuan_day(int year,int month,int day,int x,int y,int z);
void fish_or_net(int year,int month,int day);
int x,y,z,year,month,day;
// allyear(2015);
//month_print(2016,12);
printf("请输入今天的日期(按年,月,日输入,如2016,1,14表示2016年1月14日):");
scanf("%d,%d,%d",&x,&y,&z);
printf("\n请随便输入一个日期,格式同上:");
scanf("%d,%d,%d",&year,&month,&day);
jisuan_day(year,month,day,x,y,z);
// fish_or_net(x,y,z);
return 0;
} // 这部分内容是用来检测上述函数是否出错的
/
int main()
{
int j_leapyear(int year);
int month_day(int year,int month);
int j_week(int year,int month,int day);
int allyear(int year);
void month_print(int year,int month);
int jisuan_day(int year,int month,int day,int x,int y,int z);
void fish_or_net(int year,int month,int day); //函数声明
int option,year,month,day,x,y,z;
char ny;
system("color 1f");
while (1)
{
printf("\n\n\t 欢迎来到由编写的程序\n\n");
printf(" 请选择您需要的服务,输入编号回车结束\n");
printf(" 1输入一个年份,输出该年的日历\n");
printf(" 2输入年月,输出这个月的日历。\n");
printf(" 3输入年月日,输出据今天还有多久,星期几,是否是公历节日。\n");
printf(" 4某人自1990年1月1日开始打鱼,“三天打鱼,两天晒网”,输入一个1990年以后的日期,输出他这一天是打鱼还是晒网。\n");
printf(" 5退出\n");
scanf("%d",&option);
switch(option) //switch分支结构
{
case 1:
while(1) //while循环,后面的1是常数,表示一直到break才结束循环
{
printf("请输入一个年份:");
scanf("%d",&year);
allyear(year);
printf("你想继续查询日历么?(y表示继续,n表示结束)");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 2:
while (1)
{
printf("输入年月:");
scanf("%d,%d",&year,&month);
month_print(year,month);
printf("你想继续查询日历么?(y表示继续,n表示结束):");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 3:
while (1)
{
printf("输入年月日:");
scanf("%d,%d,%d",&year,&month,&day);
printf("请输入今天的日期:");
scanf("%d,%d,%d",&x,&y,&z);
jisuan_day(year,month,day,x,y,z);
printf("你想继续查询么?(y表示继续,n表示结束):");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 4:
while (1)
{
printf("输入1990年1月1日以后的一个日期:");
scanf("%d,%d,%d",&year,&month,&day);
fish_or_net(year,month,day);
printf("你想继续查询渔人是打鱼还是晒网么?(y表示继续,n表示结束):");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 5:
while (1)
{
printf("确认么?y表示是的,n表示不是");
scanf("%c",&ny);
if(ny=='y')
exit(1); //表示退出程序
else if(ny=='n')
break;
}
break;
default:printf("对不起,暂时没有这个服务");
break;
}
}
return 0;
}
这是一个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;
//}
实验名称:万年历的查询及打印
内容:设计一个查询并打印万年历的程序。
步骤:
1.
画出程序流程图;
2.
编写程序;
3.
调试程序,对调试过程中出现的问题进行分析,找出错误的原因并予改正;
4.
写出通过调试并修改正确的原程序。
要求:
1.
程序运行后,首先在屏幕上显示主菜单:
1.
查询某年某月某日是星期几
2.
查询某年是否是闰年
3.
打印某年的全年日历
4.
退出
2.
在主菜单中输入1后,显示:
“请输入年月日(XXXX,XX,XX)”
运行后输出:XXXX年XX月XX日是星期X,是否继续查询(Y/N)?
如果输入Y,则重新显示
“请输入年月日(XXXX,XX,XX)”,否则回到主菜单。
3.
在主菜单中输入2后,显示:
“请输入要查哪一年?(XXXX)”
运行后输出:XXXX年是(否)是闰年,是否继续查询(Y/N)?
如果输入Y,则重新显示,“请输入要查哪一年?(XXXX)”,否则回到主菜单。
4.
在主菜单中输入3后,显示:
“请输入要打印的年份(XXXX)”
运行后输出XXXX年的日历,格式为:
XXXX
X(月数)
0
1
2
3
4
5
6
S
M
T
W
T
F
S
x
x
x
x
x
x
x
x
x
x
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
X(月数)
0
1
2
3
4
5
6
S
M
T
W
T
F
S
x
x
x
x
x
x
x
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
运行完后显示:“是否继续打印(Y/N)?”
如果输入Y,则重新显示,“请输入要打印的年份(XXXX)”,否则回到主菜单。
5.
在主菜单中输入4后,显示:“是否要真的退出(Y/N)?”
如果输入Y,结束程序运行,否则重新显示主菜单。
提示:
1
闰年计算:满足下列二者之一,是闰年:
能被4整除,但不能被100整除;
能被4整除,且能被400整除。
2闰年的二月是29天,平年的二月是28天
3星期几的计算:
S=X-1+(X-1)/4+(X-1)/100+(X-1)/400+C
X是年份,C是该年从元旦开始到到这一日的天数。
S/7的余数既是星期数
例1:1982年12月26日
由于1982年不是闰年(不能被4整除),所以该年的二月是28天。
C=31+28+31+30+31+30+31+31+30+31+30+26=360
(1月到11月的天数+12月的实际天数)
S=1982-1+(1982-1)/4+(1982-1)/100+(1982-1)/400+360=28213925
S/7=2821/7=403
余数为0,所以该日是星期天。
例2:2000年3月8日
由于2000年是闰年(能被4整除,又能被100和400整除),所以该年的二月是29天。
C=31+29+8=68
(1月到2月的天数+3月的实际天数)
S=2000-1+(2000-1)/4+(2000-1)/100+(2000-1)/400+68=2551757
S/7=2551/7=364
余数为3,所以该日是星期三。
此题不是很难,我会前三个
关键是算那一年的第一天是周几
给你个基本算法,一年是365天,闰年366天
364是7的倍数,这样一年多出一天,中间多少个闰年,在加上相应的天数即可
400年多出来的天数是400+97=497也是7的倍数,那么400年一轮回,这样就算400年以内的即可
一个子函数,返回这一年的第一天是周几,很好做
int ye(int year)
{
int y=year%400;
int day=y;
int i;
for(i=0;i<y;i++)
if(闰年判断)
day++;
return day%7;
}
做一个月份天数的全局数组
int mo[12]={31,28,31,30,31,30,31,31,30,31,30,31};
需要时用一个if判断闰年改变m0[1]的值是28还是29
打印子函数,有一个小技巧,就是每个月前面的空缺部分,这个1月份是ye子函数的返回值,后面的你看和前面月份是不是重合啊,吧这个记录下来在下一月份用即可
1 2
3 4
这样月份排列更好打印一些,你的那个截图有点麻烦
int pr(int year)
{
int k=ye(year);
int i,j,;
if(闰年判断)
mo[1]=29;
else
mo[1]=28;
for(i=0;i<12;i++)
{
printf("周几英文的打印");
for(j=0;j<k;j++)
printf("一般是四个空格,就是月份前面空缺的打印");
for(j=1;j<=mo[i];j++)
{
printf("%4d",j);
k++;
if((k+j)%7==0)
printf("\n");
}
k%=7;
if(k!=0)
printf("\n");
}
}
如果像你那样,感觉需要赋值一个大一点的数组,在吧数组打印出来更好,呵呵
以上就是关于用C语言编写一个日历全部的内容,包括:用C语言编写一个日历、C语言年历显示程序设计、单片机做的日历 c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)