为了应付c语言课程设计,挑了个简单的题目随便写了写

题目描述:

桌面日历

1) 按照输入的年份,显示这一年每月日历。

2) 按照输入的年份和月份,显示这个月的日历。

3)显示当月的日历。

日历显示形式同挂历。

用到的知识点:

函数、简单的函数调用、简单的逻辑关系

实现功能演示:

主界面:

功能一:

功能二:

功能三:

完整代码

#include <stdio.h>
#include <time.h>
// 判断是否为闰年函数
int isLeapYear(int);
// 判断某年某月的第一天是周几的函数
int daysWeek(int, int);
// 判断月份有几天函数
int monthDays(int, int);
// 输出某年某月日历函数
void monthCalendar(int, int);
int main()
{int Year, Month;// 模式选择int mode;printf("-----------------------------------------\n");printf("|               简易日历                |\n");printf("-----------------------------------------\n");printf("|     (1) 输入年份打印出全年历          |\n");printf("-----------------------------------------\n");printf("|     (2) 输入年份月份打印出月日历      |\n");printf("-----------------------------------------\n");printf("|     (3) 打印出当前月的日历            |\n");printf("-----------------------------------------\n");printf("|    请输入数字1 2 3以选择要使用的功能  |\n");printf("-----------------------------------------\n");printf("输入数字:");scanf("%d", &mode);printf("\n");if (mode == 1){// 实现第一个功能printf("请输入年份: ");scanf("%d", &Year);// 从1遍历到12月 代表1月到十二月for (int i = 1; i <= 12; i++){printf("--------------------------------------------------\n");printf("%d 年 %d 月\n", Year, i);monthCalendar(Year, i);}}else if (mode == 2){// 实现第二个功能printf("请输入年份: ");scanf("%d", &Year);printf("请输入月份: ");scanf("%d", &Month);monthCalendar(Year, Month);}else if (mode == 3){// 固定格式time_t timep;struct tm *p;time(&timep);p = gmtime(&timep);//获取当前年份,从1900开始,所以要加1900Year = 1900 + p->tm_year;//获取当前月份,范围是0-11,所以要加1Month = 1 + p->tm_mon;printf("当前时间为:%d年%d月\n", Year, Month);printf("--------------------------------------------------\n");printf("%d 年 %d 月\n", Year, Month);monthCalendar(Year, Month);}else{printf("请输入数字1 2 3选择功能 输入其他字符无效!");}return 0;
}
// 判断是否为闰年
int isLeapYear(int Year)
{// 如果能整除4且不能整除100或能整除400,则为闰年if (Year % 4 == 0 && Year % 100 != 0 || Year % 400 == 0){return 1;}return 0;
}
// 判断月份有几天
int monthDays(int Year, int Month)
{// 如果月份为1、3、5、7、8、10、12 天数为31天if (Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12){return 31;}// 如果月份为4、6、9、11 天数为30天else if (Month == 4 || Month == 6 || Month == 9 || Month == 11){return 30;}else{// 月份为2月 如果是闰年 天数为29天if (isLeapYear(Year)){return 29;}// 如果不是闰年 天数为28天return 28;}
}
// 判断某年某月的第一天是周几
int daysWeek(int Year, int Month)
{// day用于记录总天数// day1记录每月的天数,结合下面代码理解int day = 0, day1 = 0;// 得到从1900年到某年的天数/*** @brief* 由于1900年1月1日为周一 得到1900年到某年的天数之后* 只需要用天数取7的余数,余数即是某年1月1日的周几* 所以也可以换为其他1月1日为周一的年份,使用1900年* 后,只能判断出1900年之后的年份*/for (int i = 1900; i < Year; i++){// 判断闰年if (isLeapYear(i)){day = day + 366;}else{day = day + 365;}}//判断月份for (int m = 1; m <= Month; m++){day1 = monthDays(Year, m);if (m < Month){// 计算天数day = day + day1;}}// week为某年某月第一天的周几int week = day % 7;return week;
}
// 具体实现打印某年某月日历
void monthCalendar(int Year, int Month)
{printf("--------------------------------------------------\n");printf("一\t二\t三\t四\t五\t六\t日\n");//判断这个月的第一天是星期几int t = daysWeek(Year, Month);// 判断月份有几天int day1 = monthDays(Year, Month);for (int i = 0; i < t; i++){printf("\t");}//控制输出格式for (int i = 1; i <= day1; i++){printf("%d\t", i);if ((i + t) % 7 == 0){printf("\n");}}printf("\n");printf("--------------------------------------------------\n");printf("\n");
}

代码详解

大体思路:

功能的核心在于打印出某年中某月的日历,要想实现这个功能,需要知道:

这个月一共有几天、这个月的第一天是星期几

找到月份的天数思路:

首先判断月份,如果月份为1、3、5、7、8、10、12 天数为31天,如果月份为4、6、9、11 天数为30天,月份为2月时,如果年份是闰年,天数为29天,不是闰年天数为28天

判断月份第一天是周几思路:

首先要找一个1月1日为周一的年份,这里选用1900年举例

假如现在需要找到2022年9月份的第一天是周几

就需要得到1900年到2022年的总天数,总天数 = 整年数 × 年份天数 + 整月数 × 月份天数

也就是(2022-1900)× 年份天数(闰年366 平年365) + 8(要算9月份的日历,整月数为8) × 月份天数

然后再用总天数取7的余数,就是9月份一号的周几

表达能力有限,看不懂可以百度一下

代码详解:

判断闰年函数

如果一个年份可以整除4且不能整除100 或者可以整除400,则为闰年

int isLeapYear(int Year)
{if (Year % 4 == 0 && Year % 100 != 0 || Year % 400 == 0){return 1;}return 0;
}

判断每月天数函数

如果月份为1、3、5、7、8、10、12 天数为31天

如果月份为4、6、9、11 天数为30天

月份为2月 如果是闰年 天数为29天 否则为28天

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;}return 28;}
}

判断某年某月的第一天是周几函数

结合着注释和上面解释

int daysWeek(int Year, int Month)
{// day用于记录总天数// day1记录每月的天数,结合下面代码理解int day = 0, day1 = 0;// 得到从1900年到某年的天数/*** @brief* 由于1900年1月1日为周一 得到1900年到某年的天数之后* 只需要用天数取7的余数,余数即是某年1月1日的周几* 所以也可以换为其他1月1日为周一的年份,使用1900年* 后,只能判断出1900年之后的年份*/for (int i = 1900; i < Year; i++){// 判断闰年if (isLeapYear(i)){day = day + 366;}else{day = day + 365;}}printf("整年天数%d",day);//判断月份for (int m = 1; m <= Month; m++){day1 = monthDays(Year, m);if (m < Month){// 计算天数day = day + day1;}}// week为某年某月第一天的周几printf("月份天数%d",day);int week = day % 7;return week;
}

具体实现打印函数

调用上面写好的函数

void monthCalendar(int Year, int Month)
{printf("--------------------------------------------------\n");printf("一\t二\t三\t四\t五\t六\t日\n");//判断这个月的第一天是星期几int t = daysWeek(Year, Month);// 判断月份有几天int day1 = monthDays(Year, Month);for (int i = 0; i < t; i++){printf("\t");}//控制输出格式for (int i = 1; i <= day1; i++){printf("%d\t", i);if ((i + t) % 7 == 0){printf("\n");}}printf("\n");printf("--------------------------------------------------\n");printf("\n");
}

主函数

声明一个变量mode,用于功能的选择,将不同的功能写到不同的if语句中

其中获取当前系统时间的代码为固定格式,详细可以看这篇文章

C语言获取当前的日期及时间_Coder802的博客-CSDN博客_c 获取时间

功能一(全年历)的实现:写一个for循环 从1遍历到12,调用12次写好的函数

功能二(月份日历):输入年份和月份 调用函数

功能三(当前月日历):获取系统时间年份和月份,作为参数调用函数

int main()
{int Year, Month;// 模式选择int mode;printf("-----------------------------------------\n");printf("|               简易日历                |\n");printf("-----------------------------------------\n");printf("|     (1) 输入年份打印出全年历          |\n");printf("-----------------------------------------\n");printf("|     (2) 输入年份月份打印出月日历      |\n");printf("-----------------------------------------\n");printf("|     (3) 打印出当前月的日历            |\n");printf("-----------------------------------------\n");printf("|    请输入数字1 2 3以选择要使用的功能  |\n");printf("-----------------------------------------\n");printf("输入数字:");scanf("%d", &mode);printf("\n");if (mode == 1){// 实现第一个功能printf("请输入年份: ");scanf("%d", &Year);// 从1遍历到12月 代表1月到十二月for (int i = 1; i <= 12; i++){printf("--------------------------------------------------\n");printf("%d 年 %d 月\n", Year, i);monthCalendar(Year, i);}}else if (mode == 2){// 实现第二个功能printf("请输入年份: ");scanf("%d", &Year);printf("请输入月份: ");scanf("%d", &Month);monthCalendar(Year, Month);}else if (mode == 3){// 固定格式time_t timep;struct tm *p;time(&timep);p = gmtime(&timep);//获取当前年份,从1900开始,所以要加1900Year = 1900 + p->tm_year;//获取当前月份,范围是0-11,所以要加1Month = 1 + p->tm_mon;printf("当前时间为:%d年%d月\n", Year, Month);printf("--------------------------------------------------\n");printf("%d 年 %d 月\n", Year, Month);monthCalendar(Year, Month);}else{printf("请输入数字1 2 3选择功能 输入其他字符无效!");}return 0;
}

表达能力不佳,代码写的比较捞,有什么看不懂的地方可以私聊我,看到都会回的~~~

c语言课程设计之桌面日历(完整源码+注释)相关推荐

  1. c语言课程设计 日历显示,c语言课程设计_电子日历.doc

    c语言课程设计_电子日历 第 PAGE \* Arabic \* MERGEFORMAT 14 页第 PAGE \* Arabic \* MERGEFORMAT 14 页 课 程 设 计( 论 文 ) ...

  2. C语言实现哈希表(附完整源码)

    C语言实现哈希表 C语言实现哈希表附完整源码 C语言实现哈希表附完整源码 #include<stdio.h> #include<stdlib.h> #define SUCCES ...

  3. Python语言打造智能语音助手——附完整源码

    Python语言打造智能语音助手--附完整源码 随着智能家居.智能办公等领域的逐渐兴起,实现语音控制与交互已成为了一种趋势.而Python语言是一门极具魅力的编程语言,其强大的库.简洁的语法以及易于学 ...

  4. C语言删除链表的算法(附完整源码)

    C语言删除链表的算法 C语言删除链表的算法完整源码(定义,实现,main函数测试) C语言删除链表的算法完整源码(定义,实现,main函数测试) #include <iostream>st ...

  5. C语言merge sort归并排序算法(附完整源码)

    C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...

  6. c语言实现stack的算法(附完整源码)

    C语言实现stack的算法 C语言实现stack的算法完整源码(定义,实现,main函数测试) C语言实现stack的算法完整源码(定义,实现,main函数测试) #ifndef STACK_H #d ...

  7. C语言flood fill 泛洪算法(附完整源码)

    C语言flood fill 泛洪算法 泛洪算法引出 C语言flood fill 泛洪算法完整源码(定义,实现,main函数测试) 泛洪算法引出 给定2D屏幕,像素的位置和要填充的颜色的新值,请用新颜色 ...

  8. C语言dijkstra最短距离的算法(附完整源码)

    C语言dijkstra最短距离的算法 C语言dijkstra最短距离的算法完整源码(定义,实现,main函数测试) C语言dijkstra最短距离的算法完整源码(定义,实现,main函数测试) #in ...

  9. C语言实现词典编排算法(附完整源码)

    实现词典编排算法 实现以下接口 C语言实现词典编排算法完整源码(定义,实现,main函数测试) 实现以下接口 void PrintSortedPermutations(char *str);//词典编 ...

最新文章

  1. 一波三折用OSD部署Vista中文企业版(下):SMS2003系列之九
  2. 《游戏开发物理学(第2版)》一1.3 坐标系
  3. 自学python系列10:python的函数和函数式编程
  4. Codeforces Round #481 (Div. 3) A. Remove Duplicates
  5. gtp6 linux 启动_Win10更新后导致双系统(LinuxWindows)开机引导失败出现grub rescue的修复办法...
  6. 公共互联网网络安全突发事件应急预案_安徽新规:发生重大突发事件,官方5小时内必须发声...
  7. 如何使用python爬取百度图片_python实现爬取百度图片的方法示例
  8. HDU 2003 求绝对值
  9. python的基础命令_Python必学之命令行常用的命令
  10. leetcode 224. 基本计算器(栈)
  11. 【单片机实验】矩阵键盘
  12. JS 浏览器差异(IE和FF)
  13. 如何通过R建立流程图:DiagrammeR
  14. mp4文件如何转换为webm格式
  15. 论坛介绍 | COSCon'22 开源文化
  16. agentweb回到首页_AgentWeb , 一个简洁易用的 Android Web 库
  17. jav中什么是组织java程序_在Java中,开发图形用户界面的程序需要使用一个系统提供的类库,这个类库就是以下的______包。A.jav...
  18. mysql 删除时间一个星期_我用财务管理系统花费一天时间做账,别人用一个星期也追赶不上...
  19. 计算机系统(六):应用层(上篇)
  20. Coursera-MachineLearning-Week2编程题目整理

热门文章

  1. 高性能计算机系统硬件结构图,硬件资源
  2. AD 未将对象引用设置到对象的实例
  3. e480换高分屏_ThinkPadE480电脑(i5-8250u 8G内存 256G固态 高分屏0QCD 14英寸) 京东5699元...
  4. 浏览被植入木马的网站,可能也会中木马
  5. python计算ks值 代码_python画KS图,求KS值
  6. The analysis of frame
  7. python三级考什么_什么是计算机三级考试?计算机三级考什么?
  8. 画图神器-drawio(配合markdown使用更佳)
  9. 《太傻十日谈》读后感
  10. 2013年中南大学复试-惠民工程