C语言实现万年历小程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语⾔实现万年历⼩程序
⼀、杂谈
⼤⼀学了C之后⼀直困惑,C到底怎么⽤?它不像HTML那么直观,也没有SQL那么常⽤,更没有Java那么功能强⼤,那他为何还存在,并依然⽕热呢?
答案很简单:编程语⾔是⼀家,C语⾔结构简单,但所蕴含的逻辑思维和其他语⾔⼤致相同,适合初学者。

编程不是⼀蹴⽽就,能⼒需要⽇积⽉累,推荐想我⼀样的初学者,⼤家⾃⼰动⼿玩玩简单的C程序!
⼆、万年历
像这样⼀个简单的全年⽇历,仔细观察不难发现由每个⽉的⽇历组成,每个⽉有最多6⾏,占6周,每周7天;
程序如下:
设定⽇历⼤⼩:
int date[12][6][7]; //12个⽉,每⽉最多6⾏,每⾏7天
int calendar[ ][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 year;
char title[]="SUN MON TUE WED THU FRI SAT"; //周⼏
int sw,leap,i,j,k,wd,day; //变量
// sw 周⼏,leap 0平年 1闰年,i,j,k辅助变量,wd 第⼏周,day ⽇
提⽰⽤户输⼊想要查询的年份:(回车换⾏)
printf("Please input the year whose calendar you want to know: ");
scanf("%d%*c",&year);
再计算该年1⽉1 ⽇是起于周⼏:
(由于公元1⽉1⽇设为星期六,故3⽉1⽇为星期三。

为使算法达到最简,故本算法以“星期”为计算单位。

且选3⽉1⽇为基⽉。

每 4年(3个平年+1个闰年)共208周+5天 =208*7+5=1461
每百年共100*(208周+5天)-1天=5217周+5天 (整百年暂设为平年)
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天
即400年⼀轮回!)
long int getyear(int year,int month){
if(month<3) return year-1; //以元年3⽉为基⽯
else return year;
}
long int getmonth(int month){
if(month<3) return month+13; //将⽉份调⾄下个⽉
else return month+1;
}
long int getday(int year,int month,int day){
return 1461L*getyear(year,month)/4+153L*getmonth(month)/5+day; //计算距离元年3⽉1⽇天数
//计算⽅法:每四年⼀周期1461天(相当于计算平均每年多少天)
//每五个⽉⼀周期153天(相当于计算平均每⽉多少天)
}
int getweekday(int year,int month,int day){
return(int)((getday(year,month,day)%7-2+7)%7); //得该⽇期的星期数
//得到的天数除以7天取余,减去3⽉1⽇周三,其他均为保证正数1-7的附加计算
}
判断是否为闰年:
leap= year%4==0 && year%100||year%400==0 ;
将⽇历置为空:
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;
填充该年⽇期:
sw=getweekday(year,1,1);
for(i=0;i<12;i++)
for(wd=0,day=1; day <= calendar[leap][i]; day++){
date[i][wd][sw]=day;
sw = ++sw%7;
if(sw==0)
wd++;
}
格式化输出:
printf("\n|==================The Calendar of Year %d =====================|\n|",year); for(i=0;i<6;i++){
for(wd=0,k=0;k<7;k++)
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);
for(j=0;j<wd;j++){
printf(" ");
for(k=0;k<7;k++)
if(date[i][j][k])
printf("%4d",date[i][j][k]);
else printf(" ");
printf(" ");
for(k=0;k<7;k++)
if(date[i+6][j][k])
printf("%4d",date[i+6][j][k]);
else printf(" ");
printf(" |\n|");
}
scanf("%*c");
}
puts("=================================================================|"); puts("\n Press any key to quit...");
结果为
完整代码:
#include "stdio.h"
long int getyear(int year,int month){
if(month<3) return year-1;
else return year;
}
long int getmonth(int month){
if(month<3) return month+13;
else return month+1;
}
long int getday(int year,int month,int day){
return 1461L*f(year,month)/4+153L*g(month)/5+day;
}
int getweekday(int year,int month,int day){
return(int)((n(year,month,day)%7-2+7)%7);
}
int date[12][6][7];
int calender[ ][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}};
main()
{int sw,leap,i,j,k,wd,day;
int year;
char title[]="SUN MON TUE WED THU FRI SAT";
printf("Please input the year whose calendar you want to know: ");
scanf("%d%*c",&year);
sw=w(year,1,1);
leap=year%4==0&&year%100||year%400==0;
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;
for(i=0;i<12;i++)
for(wd=0,day=1;day<=day_tbl[leap][i];day++){
date[i][wd][sw]=day;
sw=++sw%7;
if(sw==0) wd++;
}
printf("\n|==================The Calendar of Year %d =====================|\n|",year); for(i=0;i<6;i++){
for(wd=0,k=0;k<7;k++)
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);
for(j=0;j<wd;j++)
{
printf(" ");
for(k=0;k<7;k++)
if(date[i][j][k])
printf("%4d",date[i][j][k]);
else printf(" ");
printf(" ");
for(k=0;k<7;k++)
if(date[i+6][j][k])
printf("%4d",date[i+6][j][k]);
else printf(" ");
printf(" |\n|");
}
scanf("%*c");
}
puts("=================================================================|"); puts("\n Press any key to quit...");
}
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

相关文档
最新文档