经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言打印某一年的日历
来源:jb51  时间:2021/6/15 9:23:26  对本文有异议

本文通过实例为大家分享了C语言打印某一年日历的具体代码,供大家参考,具体内容如下

输入一个年份(1970以后的),以 2*6 的格式打印当年的日历。

主要思路:遍历日期,根据日期标记每一行应该打印的内容,存放到一个数组中,然后遍历数组,根据数组的内容逐行打印。代码如下:

  1. // 打印日历
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <stdio.h>
  4.  
  5. char month[12][10] = { "January", "February", "March", "April", "May", "June",
  6. "July", "August", "September", "October", "November", "December" };
  7.  
  8.  
  9. //计算某日期是当年的第几天
  10. int day_in_year(int y, int m, int d) {
  11. int r_day = 0;
  12. int m_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//每个月的天数
  13. m_days[1] += y % 400 == 0 || y % 4 == 0 && y % 100 != 0;
  14. for (int i = 0; i < m - 1; ++i) {
  15. r_day += m_days[i];
  16. }
  17. r_day += d;
  18. return r_day;
  19. }
  20.  
  21. //计算某日是星期几
  22. int getWeek(int y, int m, int d) {
  23. //先计算出来距离1970年1月1日周四有多少天
  24. int days = 0; //当日距离1970.1.1的天数
  25. int res; //存放结果,周几
  26.  
  27. if (y == 1970) {
  28. days = day_in_year(y, m, d);
  29. }
  30. else {
  31. for (int i = 1970; i < y; ++i) {
  32. days = days + 365 + (i % 400 == 0 || i % 4 == 0 && i % 100 != 0);
  33. }
  34. days += (day_in_year(y, m, d) - 1);//因为算的是距离多少天,所以需要减一
  35. }
  36.  
  37. //然后计算当日是周几
  38. res = (days + 4) % 7;
  39. return res;
  40. }
  41.  
  42. //打印日历
  43. void displayCalendar(int y) {
  44. int m_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//每个月的天数
  45. m_days[1] = 28 + (y % 400 == 0 || y % 4 == 0 && y % 100 != 0);
  46. int week_l;//左边月份的第一天是周几
  47. int week_r;//右边月份的第一天是周几
  48. for (int m = 0; m < 6; ++m) {//m控制月份,比实际月份小1
  49. //打印日历的表头
  50. printf("%-12s %-12s\n", month[m], month[m + 6]);
  51. printf("--------------------------- --------------------------- \n");
  52. printf("Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat \n");
  53. week_l = getWeek(y, m + 1, 1);//求出左边月份的第一天是星期几
  54. week_r = getWeek(y, m + 7, 1);//求出右边列月份的第一天是星期几
  55. int date_l = 1;
  56. int date_r = 1;
  57. while (date_l <= week_l + m_days[m] || date_r <= week_r + m_days[m + 6]) {
  58. //在范围内,打印
  59. int tag[15] = { 0 };//用来标记应该打印什么,整数表示打印日期,-1表示打印空格
  60. tag[7] = -1;//左右界线
  61. for (int p = 0; p < 7; ++p, ++date_l, ++date_r) {//p为tag的指针
  62. //根据指针p给tag赋值
  63. if (date_l <= week_l + m_days[m]) {
  64. if (date_l < week_l) {
  65. //指针还没有到左边月份的第一天,应该打印空格
  66. tag[p] = -1;
  67. }
  68. else {
  69. //记录应该打印的日期
  70. tag[p] = date_l - week_l;
  71. }
  72. }
  73. else {//该打印的日期标记完了,其他的用空格补上
  74. tag[p] = -1;
  75. }
  76. //标记右边的情况,逻辑与左边的一样
  77. if (date_r <= week_r + m_days[m + 6]) {
  78. if (date_r < week_r) {
  79. tag[p + 8] = -1;
  80. }
  81. else {
  82. tag[p + 8] = date_r - week_r;
  83. }
  84. }
  85. else {
  86. tag[p + 8] = -1;
  87. }
  88. }
  89. //一行一行打印
  90. for (int i = 0; i < 15; ++i) {
  91. if (tag[i] == -1||tag[i] == 0) {
  92. //没有日期要打印,打印四个空格
  93. printf(" ");
  94. }
  95. else {
  96. //有日期打印,打印日期
  97. printf("%-4d", tag[i]);
  98. }
  99. }
  100. printf("\n");
  101. }
  102. printf("\n");
  103. }
  104. }
  105.  
  106. int main() {
  107.  
  108. int year;//输入年份,打印该年的日历
  109. scanf("%d", &year);
  110. displayCalendar(year);
  111. return 0;
  112. }

运行效果如下:

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号