c语言实现万年历

 万年历打印是学习c语言路上的一次小小试炼,这也是经典练习例程本文实现的万年历包含的内容和功能:1. 判断日期输入是否正确2. 判断某天是星期几(基姆拉尔森计算公式)3. 判断某天是一年的第几天4. 如果只输入年份,显示整年历5. 如果输入年和月,显示月历6. 如果输入年月日,显示当月月历并显示是一年的第几天代码注释比较完整,本人c语言小白,以下直接上代码

主函数main.c

#include <stdio.h>
#include <stdbool.h>bool Jugdate(int year, int month, int day);  //判断日期是否输入正确
void dismonth(int year, int month);          //显示某月的日历
int Jugweek(int year, int month, int day);   //计算某一天是星期几
int Jugsday(int year, int month, int day);   //计算是一年中的第几天int main()
{int year,month,day,sday;     //分别是输入的年月日,接收计算一年第几天函数的返回值year=month=day=0;            //全部初始化为0,方便判断输入的日期的类型printf("请输入日期( 格式 : 2008/8/8 ):");scanf("%d/%d/%d",&year,&month,&day);while(getchar()!='\n');        //清空缓冲区//只输入了年份,显示全年的日历if(month == 0){                if(year<1)printf("error!\n");elsefor(int i = 1; i < 13; i++){dismonth(year,i);   puts("");}}//输入了年和月,显示一整月的日历else if(day == 0){            if(year<1 || month<1 || month>12) printf("error!\n");else dismonth(year,month);}//输入了年、月、日,显示一整月的日历并且显示是一年的第几天else{if(Jugdate(year,month,day)){    sday = Jugsday(year,month,day); printf("\n公元%6d年%3d月%3d日是一年的第 %-4d 天\n\n",year,month,day,sday);dismonth(year,month);}else printf("error!\n");}return 0;
}

日期判断函数

bool Jugdate(int year, int month, int day)
{if(year<1 || month<1 || month>12 || day < 1){  //年和日不能小于1,月在1-12之间return false;}else {if(year%4 == 0 && year%100 != 0 || year%400 == 0){if(month == 2 && day>29) {   //闰年的2月份,天数大于29,返回falsereturn false;}}else if(month == 2 && day>28) {   //平年的2月份,天数大于28,返回falsereturn false;}switch(month){case 4:case 6:case 9:case 11:     //小月天数大于30,返回false  if(day>30){return false;}case 1:case 3:case 5:case 7:case 8:case 10:case 12:  //大月天数大于31,返回falseif(day>31){return false;}}}return true;  //经过考验说明日期正确,返回true
}

显示整月月历函数

void dismonth(int year, int month)
{int enter;  //接收判断星期几的返回值,用于换行显示int monD[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//平年每月天数数组int monL[12] = {31,29,31,30,31,30,31,31,30,31,30,31};//润年每月天数数组int *mon;   //根据是否闰年,选择指向每月天数的数组enter = Jugweek(year,month,1);  //计算每月1号是星期几char head[2][40] = {"*  *  *  *  *  *  *  *  *  *  *  *  *","   Sun  Mon Tues  Wed Thur  Fri  Sat"};puts(head[0]);printf("%15d 年 %d 月\n",year,month);puts(head[0]);puts(head[1]);if(year%4 == 0 && year%100 != 0 || year%400 == 0){mon = monL;  //闰年指针指向monL数组}else {mon = monD;  //闰年指针指向monD数组}printf("%*s",enter*5,""); //根据1号星期几,打印不同空格,实现日历开始打印位置for(int i = 1; i <= mon[month-1]; i++){printf("%5d",i);   //循环打印每一天enter++;if(enter>6){       //到周六就换行puts("");enter = 0;}}puts("");puts(head[0]);return;
}

星期判断函数

int Jugweek(int year, int month, int day)
{int weekday;//保存星期计算结果,0表示星期天,1表示星期一,2表示星期二...if(1==month || 2==month) {   //如果是1、2月按照前一年的13、14月计算month+=12; year--;}   weekday = (day+1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;//基姆拉尔森计算公式return weekday;
}

判断某天是一年的第几天

int Jugsday(int year, int month, int day)
{int sday,leap=0;//sday:一年第几天计算结果,leap:闰年为1,平年为0int sumday[12] = {0,31,59,90,120,151,181,212,243,273,304,334};//前n个月总共有多少天的数组if(year%4 == 0 && year%100 != 0 || year%400 == 0)leap = 1; //闰年赋值给leap为1if(month<3)sday = sumday[month-1] + day; //前两月取数组中的值和天数相加elsesday = sumday[month-1] + day + leap; //后面月份需要加上leap,解决闰年多一天return sday;
}

运行效果展示

     测试时,我添加了一个死循环,使其一直运行方便测试,一年的年历就是将每个月都打印,内容过多就不一一展示了,根据示例,可以看出万年历的基本功能已经实现了
请输入日期( 格式 : 2008/8/8 ):2008/13/32
error!
请输入日期( 格式 : 2008/8/8 ):2022/2/29
error!
请输入日期( 格式 : 2008/8/8 ):2022/8
*  *  *  *  *  *  *  *  *  *  *  *  *2022 年 8 月
*  *  *  *  *  *  *  *  *  *  *  *  *Sun  Mon Tues  Wed Thur  Fri  Sat1    2    3    4    5    67    8    9   10   11   12   1314   15   16   17   18   19   2021   22   23   24   25   26   2728   29   30   31
*  *  *  *  *  *  *  *  *  *  *  *  *请输入日期( 格式 : 2008/8/8 ):1949/10/1公元  1949年 10月  1日是一年的第 274  天*  *  *  *  *  *  *  *  *  *  *  *  *1949 年 10 月
*  *  *  *  *  *  *  *  *  *  *  *  *Sun  Mon Tues  Wed Thur  Fri  Sat12    3    4    5    6    7    89   10   11   12   13   14   1516   17   18   19   20   21   2223   24   25   26   27   28   2930   31
*  *  *  *  *  *  *  *  *  *  *  *  *

c语言万年历并计算是一年中第几天相关推荐

  1. c语言万年历计算任意年的天数,C语言万年历.doc

    C语言万年历 C 语 言 课 程 设 计 报 告 设计题目:学生姓名:学生学号:专业班级:学院名称:同组人姓名:指导老师:姚 兰 年 月 日 1 需求分析 问题描述输入数据要求 /*如果给定的日期中年 ...

  2. c语言万年历查询程序代码,C语言 万年历程序(示例代码)

    C语言 万年历程序 原代码:[email protected]:~/c++$ cat 123.c #include #define Mon   1 #define Tues  2 #define We ...

  3. c语言万年历大作业报告,C语言万年历设计报告

    <C语言万年历设计报告>由会员分享,可在线阅读,更多相关<C语言万年历设计报告(14页珍藏版)>请在人人文库网上搜索. 1.C 语言课程 设计报告 题目:编写万年历系统编写万年 ...

  4. C语言 万年历 C语言 万年历

    C语言 万年历 C语言 万年历 ***************************************    2022    ********************************* ...

  5. 用linux下的C语言编程万年历,C语言 万年历程序

    C语言 万年历程序 原代码:chunli@Linux:~/c++$ cat 123.c #include #define Mon   1 #define Tues  2 #define Wed   3 ...

  6. R语言sd函数计算数值标准差实战(Standard Deviation)

    R语言sd函数计算数值标准差实战(Standard Deviation) 目录 R语言sd函数计算数值标准差实战(Standard Deviation) #基本语法 #sd

  7. R语言自定义函数计算dataframe每列中的缺失值NA的个数、缺失值问题及其填充示例

    R语言自定义函数计算dataframe每列中的缺失值NA的个数.缺失值问题及其填充示例 目录

  8. R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例、拟合方差分析模型(two-way ANOVA)、计算Eta Squared

    R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例.拟合方差分析模型(two-way ANOVA).计算Eta Squared 目录

  9. R语言IQR函数计算四分位数范围IQR(Interquartile Range)实战

    R语言IQR函数计算四分位数范围IQR(Interquartile Range)实战 目录 R语言IQR函数计算四分位数范围IQR(Interquartile Range)实战 #基本语法

最新文章

  1. 攻读计算机视觉和机器学习硕士给我带来了什么?
  2. 51nod 1275 连续子段的差异
  3. android eclipse 环境
  4. bzoj1002 生成树计数 找规律
  5. 图像的打开、修改、显示和保存示例(OpenCV 2.0)
  6. webpack 打包编译优化之路
  7. etc的常见算法_谈常用的几个机器学习算法,学懂算法也可以这么简单!
  8. 2017蓝桥杯c语言C组承压计算,蓝桥杯2017Java B组---分巧克力and承压计算
  9. 12nm 制程、Zen+ 微架构 AMD Ryzen 7 2700X 处理器详细测试 - 电脑领域 HKEPC Hard
  10. DrawTool画笔之图形笔
  11. 如何用编程得出泰坦尼克号生还者的年龄段?
  12. Android Progress、SeekBar 实现进度条、可滑动的进度条
  13. 图像的连通域标记算法及工具介绍
  14. 国内较高水平的计算电磁学方面的高校和教授们
  15. 23个可以免费学习编程的网站
  16. 车载android 电源管理
  17. python 代理ip池_GitHub - xuan525/proxy_pool: Python爬虫代理IP池(proxy pool)
  18. [mysql安装教程]解决ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)问题
  19. Beam search 算法的通俗理解
  20. 论文项目复现笔记----Emotion Driven Monocular Face Capture and Animation

热门文章

  1. 通过中断来控制led灯亮
  2. Access 数据库防下载 for IIS 6.0
  3. Arnold折射中使用LPE单独提取某个材质的渲染结果
  4. SpaceX在法兰克福成立Starlink有限公司​
  5. 肇庆学院与韶关学院计算机专业,韶关学院,肇庆学院,嘉应学院,湛江师范学院,惠州学院哪个好,最好将其排名...
  6. set but not used 警告
  7. emui11是鸿蒙过渡,透过EMUI11看鸿蒙OS 将延续三大原则
  8. Java时区处理之夏令时,冬令时 - 美国的6个时区
  9. 内网攻防------架设无赖AP
  10. mac知名的清理软件 cleanmymac和腾讯柠檬哪个好