当前位置: 首页 > 编程笔记 >

C语言实现万年历小程序

杜凯
2023-03-14
本文向大家介绍C语言实现万年历小程序,包括了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...");
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍C++实现万年历功能,包括了C++实现万年历功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现万年历的具体代码,供大家参考,具体内容如下 1.此万年历功能 1>日期加减天数 2>日期与日期之间的差值 3>输入年月显示当月日历 2.代码实现 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍C++实现简易万年历,包括了C++实现简易万年历的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现简易的万年历,供大家参考,具体内容如下 代码如下: 运行结果: 代码中没有检查输入错误的机制,写的比较粗糙,有许多错误之处望指正。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Java 实现万年历总结,包括了Java 实现万年历总结的使用技巧和注意事项,需要的朋友参考一下 一,Java实现万年历的代码: 二.一个Java万年历,比较简单的那种,显示年月日、星期几、当前日期是第几周、显示闰年、打印万年历等,还可显示当前日期是一年中的第几天,指定日期是星期几等,采用了基姆拉尔森计算公式 ,W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/40

  • 本文向大家介绍C语言实现关机小程序,包括了C语言实现关机小程序的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现关机小程序,立即关机和定时关机的具体代码,供大家参考,具体内容如下 之前小编遇到的一个有趣题目,大家都来了解一下 题目要求:用C语言编写一个关机程序 程序分析 系统提示一分钟之后关机,如果输入“我爱你”就注销关机,否则将跳到关机程序,继续提示,如果一分钟之内输入不对

  • 本文向大家介绍C语言实现简单扫雷小程序,包括了C语言实现简单扫雷小程序的使用技巧和注意事项,需要的朋友参考一下 扫雷是一款大众类的益智小游戏。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。 首先带大家简单来了解一下扫雷的游戏机制: 随便点一个格子,会有一块,上面的数字就代表数字周围八个格子会有几个雷,是1他周围就只有1个雷,2就有两个雷,以此类

  • 本文向大家介绍C语言实现扫雷程序,包括了C语言实现扫雷程序的使用技巧和注意事项,需要的朋友参考一下 使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现。 game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷