当前位置:   article > 正文

C语言实现万年历_c语言写日历代码

c语言写日历代码

C语言实现万年历

一、项目介绍

需求和功能是用纯C语言实现一个可以属于年份,属于一个年份就可以显示该年各个月份的日历,如同日历一般,每个月当中每天对应的星期均可查看,即万年历,要求格式整齐,星期对照直观。

二、运行截图

三、完整源码

  1. #include<stdio.h>
  2. #include<windows.h>
  3. #define Mon 1
  4. #define Tues 2
  5. #define Wed 3
  6. #define Thur 4
  7. #define Fri 5
  8. #define Sat 6
  9. #define Sun 0
  10. #define January_days 31
  11. #define February_days 28
  12. #define March_days 31
  13. #define April_days 30
  14. #define May_days 31
  15. #define June_days 30
  16. #define July_days 31
  17. #define August_days 31
  18. #define September_days 30
  19. #define October_days 31
  20. #define November_days 30
  21. #define December_days 31
  22. #define first1month January_days
  23. #define first2month January_days+February_days
  24. #define first3month January_days+February_days+March_days
  25. #define first4month January_days+February_days+March_days+April_days
  26. #define first5month January_days+February_days+March_days+April_days+May_days
  27. #define first6month January_days+February_days+March_days+April_days+May_days+June_days
  28. #define first7month January_days+February_days+March_days+April_days+May_days+June_days \
  29. +July_days
  30. #define first8month January_days+February_days+March_days+April_days+May_days+June_days \
  31. +July_days+August_days
  32. #define first9month January_days+February_days+March_days+April_days+May_days+June_days \
  33. +July_days+August_days+September_days
  34. #define first10month January_days+February_days+March_days+April_days+May_days+June_days \
  35. +July_days+August_days+September_days+October_days
  36. #define first11month January_days+February_days+March_days+April_days+May_days+June_days \
  37. +July_days+August_days+September_days+October_days+November_days
  38. int known_weekday = Tues;
  39. int known_year = 1901;
  40. int konwn_month = 1;
  41. int known_day = 1;
  42. int day_count(int month)
  43. {
  44. switch(month)
  45. {
  46. case 1: return 0;break;
  47. case 2: return first1month;break;
  48. case 3: return first2month;break;
  49. case 4: return first3month;break;
  50. case 5: return first4month;break;
  51. case 6: return first5month;break;
  52. case 7: return first6month;break;
  53. case 8: return first7month;break;
  54. case 9: return first8month;break;
  55. case 10: return first9month;break;
  56. case 11: return first10month;break;
  57. case 12: return first11month;break;
  58. }
  59. }
  60. const char* month_name(int month)
  61. {
  62. switch(month)
  63. {
  64. case 1:
  65. return "一月";
  66. break;
  67. case 2:
  68. return "二月";
  69. break;
  70. case 3:
  71. return "三月";
  72. break;
  73. case 4:
  74. return "四月";
  75. break;
  76. case 5:
  77. return "五月";
  78. break;
  79. case 6:
  80. return "六月";
  81. break;
  82. case 7:
  83. return "七月";
  84. break;
  85. case 8:
  86. return "八月";
  87. break;
  88. case 9:
  89. return "九月";
  90. break;
  91. case 10:
  92. return "十月";
  93. break;
  94. case 11:
  95. return "十一月";
  96. break;
  97. case 12:
  98. return "十二月";
  99. break;
  100. default:
  101. break;
  102. }
  103. }
  104. /*按格式打印某年某月名称*/
  105. void first_line_print(int month, int year)
  106. {
  107. //printf("%20s %d \n",month_name(month),year);
  108. printf("%8d年 %s \n",year, month_name(month));
  109. }
  110. /*按格式打印星期名称*/
  111. void week_print()
  112. {
  113. //printf("%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n","Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat.");
  114. printf("%-3s%-3s%-3s%-3s%-3s%-3s%-3s\n","日", "一", "二", "三", "四", "五", "六");
  115. }
  116. /*计算该年该月份与已知日子之间的距离天数*/
  117. int date_distance_count(int month, int year)
  118. {
  119. int leap_year_count = 0;
  120. int i;
  121. int distance;
  122. if (year > known_year)
  123. {
  124. for (i=known_year; i<year; i++)
  125. {
  126. if(((i%4 == 0) && (i%100 != 0) ) || (i%400 == 0))
  127. {
  128. leap_year_count++;
  129. }
  130. }
  131. if (month > 2)
  132. {
  133. if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0))
  134. {
  135. leap_year_count++;
  136. }
  137. }
  138. }
  139. else
  140. if (year == known_year)
  141. {
  142. if (month > 2)
  143. {
  144. leap_year_count = 1;
  145. }
  146. }
  147. distance = (year - known_year)*365 + leap_year_count + day_count(month);
  148. return distance;
  149. }
  150. /*确定该月份第一天是星期几*/
  151. int makesure_firstday_weekday(int month, int year)
  152. {
  153. int date_distance = 0;
  154. int weekday;
  155. date_distance = date_distance_count(month, year);
  156. weekday = (known_weekday + date_distance)%7;
  157. return weekday;
  158. }
  159. /*依次打印出该月份的日子*/
  160. void print_in_turn(int month, int firstday, int year)
  161. {
  162. int i = 1;
  163. int weekday;
  164. switch(firstday)
  165. {
  166. case Sun:
  167. break;
  168. case Mon:
  169. printf("%-3s","");
  170. break;
  171. case Tues:
  172. printf("%-6s","");
  173. break;
  174. case Wed:
  175. printf("%-9s","");
  176. break;
  177. case Thur:
  178. printf("%-12s","");
  179. break;
  180. case Fri:
  181. printf("%-15s","");
  182. break;
  183. case Sat:
  184. printf("%-18s","");
  185. break;
  186. }
  187. switch(month)
  188. {
  189. case 1:
  190. case 3:
  191. case 5:
  192. case 7:
  193. case 8:
  194. case 10:
  195. case 12:
  196. {
  197. for(i=0; i<31; i++)
  198. {
  199. weekday = (firstday + i)%7;
  200. printf("%-3d",i+1);
  201. if(weekday == Sat)
  202. {
  203. printf("\n");
  204. }
  205. }
  206. break;
  207. }
  208. case 2:
  209. {
  210. if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) /*闰年*/
  211. {
  212. for(i=0; i<29; i++)
  213. {
  214. weekday = (firstday + i)%7;
  215. printf("%-3d",i+1);
  216. if(weekday == Sat)
  217. {
  218. printf("\n");
  219. }
  220. }
  221. break;
  222. }
  223. else /*平年*/
  224. {
  225. for(i=0; i<28; i++)
  226. {
  227. weekday = (firstday + i)%7;
  228. printf("%-3d",i+1);
  229. if(weekday == Sat)
  230. {
  231. printf("\n");
  232. }
  233. }
  234. break;
  235. }
  236. }
  237. case 4:
  238. case 6:
  239. case 9:
  240. case 11:
  241. {
  242. for(i=0; i<30; i++)
  243. {
  244. weekday = (firstday + i)%7;/*计算该天是星期几*/
  245. printf("%-3d",i+1);
  246. if(weekday == Sat)
  247. {
  248. printf("\n");/*如果是星期六,则换行*/
  249. }
  250. }
  251. break;
  252. }
  253. }
  254. }
  255. void date_print(int month, int year)
  256. {
  257. int firstday;
  258. firstday = makesure_firstday_weekday(month, year);
  259. print_in_turn(month, firstday, year);
  260. printf("\n");
  261. }
  262. void main_month(int month, int year)
  263. {
  264. first_line_print(month, year);
  265. week_print();
  266. date_print(month, year);
  267. printf("\n\n");
  268. }
  269. void main_calendar(int year)
  270. {
  271. int i;
  272. for(i=1; i<=12; i++)
  273. {
  274. main_month(i, year);
  275. }
  276. }
  277. int main()
  278. {
  279. int year;
  280. printf("请输入年份:year = ");
  281. scanf("%d",&year);
  282. printf("\n");
  283. while(year < 1902)
  284. {
  285. printf("请输入大于1901的年份\n");
  286. printf("请输入年份:year = ");
  287. scanf("%d",&year);
  288. printf("\n");
  289. }
  290. main_calendar(year);
  291. scanf(" ");
  292. return 0;
  293. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/389337?site
推荐阅读
相关标签
  

闽ICP备14008679号