#include <stdio.h>int main()
{int Year,Month;/*判断输入年份是否是闰年*/_Bool isLeapYear(int);/*判断每月天数*/int monthDays(int,int);/*判断某个日期是星期几*/int getWeekDay(int,int,int);/*判断输入年份一月一日星期几*/int yearstartday(int); /*输出某年某月的日历*/void outMonthDays(int,int);/*输出1582年某月日历*/void outMonthDays1582(int,int);printf("请输入年份(公元前用负数表示):");scanf("%d",&Year);if(Year == 0){printf("输入错误,没有公元零年"); }else{if(Year > 0){printf("       公元%d年日历为:\n",Year);}else{printf("      公元前%d年日历为:\n",-Year);}printf("=====================================\n");if(Year != 1582)      //为计算及表达简略,不在输出中加入修正,单独编写1582年输出函数 {for(Month=1;Month<=12;Month++){outMonthDays(Year,Month);}}else{for(Month=1;Month<=12;Month++){outMonthDays1582(Year,Month);}}}return 0;
}/*判断输入年分一月一日星期几*/
int yearstartday(int Year)
{int detayear,corday,weekstartday,detaday;detayear = Year - 2000;    //以2000年为参考计算每年一月一日星期几   2000.01.01周六 if(detayear>0){corday = 2;           detayear -= 1;//这个corday和detayear一起解释,这是修正了一个计算错误,计算的时候2000年是闰年,应该//让detaday为2,又因为计算2000年以后的年份时,比如计算2020年,只需要计算到2019在内//要间隔多少天,一月一日不需要计算2020年内的天数对星期的影响,所以就让detayear减1//让corday赋值为2 }else{corday = 0;    //大于1582年小于2000年的时候不需要修正 if (detayear <= -418)   {corday = -3;    //大于等于0001年小于等于1582年,做一次修正 //1582年由于历史原因,10月少了10天,当年只有355天 if(detayear <= -2000){corday = -1;   //公元零年不存在,按照计算公式,如果这一年存在的话,它应该是闰年 }                  //闰年每年相隔两天,剔除这两天的误差}}detaday = (detayear / 400) * 2 - detayear / 100 + detayear / 4 + detayear + corday;//相隔天数 //下面解释一下detaday计算公式的计算方式//平年有365天,365除以7余1;闰年有366天,366除以7余2.这样我们就可以,先取一个参考年份, //然后用这个年份一月一日星期几来推算别的年份,为了计算方便,我选择2000年 //相隔年份里面,如果是平年,应该记为一天;如果是闰年,则应该是两天//(detayear / 400) * 2 - detayear / 100 + detayear / 4 这些计算出了相隔年份里有多少闰年// 后面detayear把不管是闰年还是平年都计算上了,那么再加上闰年有几个就可以,也就是前面的那些//corday做计算公式的修正,不同年份区域有不同值 weekstartday = (6 + detaday % 7) % 7;//6是2000年一月一日为周六,detaday % 7先将计算出的“相隔天数 ”进行周期处理,也可以不用,//即使用后面的式子:weekstartday = (6 + detaday) % 7; //最后也取余7了,同样进行了周期处理 return weekstartday;//weekstartday即为一月一日周几,0代表周日
}/*判断闰年函数的具体实现*/
_Bool isLeapYear(int Year)     //布尔函数
{if(Year%4==0 && Year%100!=0 || Year%400==0){return 1;}elsereturn 0;
}/*判断每月天数的具体实现*/
int monthDays(int Year,int Month){if(Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12){return 31;}else if(Month == 4 || Month == 6 || Month == 9 || Month == 11){return 30;}else{if(isLeapYear(Year)){return 29;}elsereturn 28;}
}/*判断某年某月某号是周几的具体实现*/
int getWeekDay(int Year,int Month,int Day){int i,temp,weekday,Days=0;for(i=1;i<=Month-1;i++){Days += monthDays(Year,i);  //也可以定义全局数组解决 }Days = Days + Day-1;           //weekstartday里面包含了开始那天,这里剔除一天 temp = yearstartday(Year)+Days;weekday = temp % 7;           //weekday即为周几,0代表周日 if(Year==1582&&Month>10)     //1582年10月后面少了10天,10 % 7 = 3 {weekday -= 3;}return weekday;
}/*输出某年某月日历的具体实现*/
void outMonthDays(int Year,int Month){int i,j,weekday;printf("           %d月日历\n",Month);printf("  日  一  二  三  四  五  六\n");weekday = getWeekDay(Year,Month,1);for(i=0;i<weekday;i++){printf("    ");}for(j=1;j<=monthDays(Year,Month);j++){printf("%4d",j);if((j+weekday)%7==0){printf("\n");}}printf("\n");printf("-------------------------------------\n");
}/*输出1582年某月日历的具体实现*/
void outMonthDays1582(int Year,int Month){int i,j,weekday;printf("           %d月日历\n",Month);printf("  日  一  二  三  四  五  六\n");weekday = getWeekDay(Year,Month,1);for(i=0;i<weekday;i++){printf("    ");}for(j=1;j<=monthDays(Year,Month);j++){if(Month == 10){if(j>4&&j<15){//这里为空,是为了提示从4号以后删除了10天 }else{printf("%4d",j);if(j==16||j==23||j==30)   //没有再写函数约束,通过查到的日历直接定义换行 {printf("\n");}   }   }else{printf("%4d",j);if((j+weekday)%7==0){printf("\n");}}}printf("\n");printf("-------------------------------------\n");
}

C语言编写万年历,解决1582年历史问题相关推荐

  1. 用C语言编写万年历6,C语言编写万年历

    <C语言编写万年历>由会员分享,可在线阅读,更多相关<C语言编写万年历(8页珍藏版)>请在人人文库网上搜索. 1.C语言编写万年历 [要求]:1 程序运行后,首先在屏幕上显示主 ...

  2. c语言编写万年历课程设计,用C语言编写万年历 C课程设计.pdf

    用C语言编写万年历 C课程设计 用用 C++语言编写万年历语言编写万年历 用用 语言编写万年历语言编写万年历 学生姓名:学生姓名: 指导老师:指导老师: 学生姓名学生姓名:: 指导老师指导老师:: 摘 ...

  3. c语言万年历代码作业,用c语言编写万年历程序

    用c语言编写万年历程序 <C 程序设计>课程设计报告 2011-2012学年第二学期 设计题目:万年历的设计 指导教师: 李素若 完成时间:2012 年 6月 1日至 2011年 6月 2 ...

  4. 教你用C语言编写万年历,程序员超乎你的想象!

    学了C语言的小编闲来无事就想搞点事情做,发现可以用C语言做万年历,计算器,俄罗斯方块儿游戏之类的,就从万年历开始玩耍啦. Step 1. 新建一个程序 制作一个应用当然必不可少的就是新建程序啦,小编这 ...

  5. 用java语言编写万年历

    import java.util.Scanner;//万年历 public class Demo12{          public static void main(String []args){ ...

  6. c语言编写万年历程序显示时间,C语言格式化输出日历(万年历)

    C语言控制台输出日历.先输入年份,然后输入每行显示的月份个数. 如图: 代码如下: #include int main(void) { int a, i, j, n, k, t, w, x, y, z ...

  7. c语言万年历源代码csdn,用C语言编写万年历,可以阳历和阴历转换?谢了

    匿名用户 1级 2009-01-27 回答 我写 的 #include"stdio.h" void print(int);//函数声明 int dobb(int); int dat ...

  8. 万年历c语言实验报告下载,用c语言编写万年历

    #include void main() { int i,j,temp,temp_i,day,year; long int yeardays; long int sumday(int year); / ...

  9. (C语言)实验2 用C语言编写程序

    [实验目的] 1.熟悉顺序.分支和循环三种基本的控制结构. 2.使用C语言编制简单的顺序.分支和循环三种基本的控制结构的程序. 3.尝试用C 语言编写程序解决实际问题. [实验要求] 1.实验共4题, ...

最新文章

  1. 你离开学只差这个视频:李宏毅机器学习2020版正式开放上线
  2. Swift、Flutter 共同瞄准 Windows!
  3. opengl地球贴纹理_一文看懂材质/纹理 Material, Texture, Shading, Shader 的区别
  4. 记事本写python怎么运行-从头学Python之编写可执行的.py文件
  5. H5 中的 new FileReader() 以及 识别上传的文件是否为图片
  6. 解决Error: Cannot find module 'node-sass'问题
  7. 世界公认最好的记忆方法_毕业清单日签 I 世界公认最好的学习方法,没有之一。...
  8. ubuntu中如何解压rar文件
  9. Spring 实例化bean的三种方式
  10. 小技巧:用python迅速打印Java写 的Flink代码中的hive建表语句
  11. Spring 中的事件处理
  12. python3图片转代码_python3图片转换二进制存入mysql示例代码
  13. makefile之目标与依赖(1)
  14. 让Google earth叠加中文地图
  15. Multisim 14元件伏安特性测量
  16. invalid constant type: 18
  17. 天津联通移动电信DNS
  18. 编程小知识之 struct 构造函数(C#)
  19. Windows下Xampp搭建DVWA 常见的错误修改
  20. 计算机顶级会议Rankings

热门文章

  1. 【Linux】资源查看top显示信息说明|top、iftop、iotop、htop、atop工具
  2. ROS学习笔记之导航(仿真)
  3. CSS样式自动换行(总结)
  4. Matlab-稀疏矩阵
  5. 计算机网络笔记—计算机网络概述
  6. matlab zigzag算法,MATLAB 实现zigzag扫描(z字形扫描)
  7. 深度学习--------图片的位深度含义
  8. 基于JSP的网上书城
  9. IdentityServer4 获取Token及刷新Token
  10. 计算机等级考试培训课件,全国计算机等级考试培训课件.ppt