万年历查询系统理解与功能增添
万年历查询系统
在软件工程综合实践专题课上,老师让我们分析之前做过的小程序,重构小部分代码,满足客户的需求,通过理解需求,设计,开发,回归测试去读程,评价并增添新的功能。
这是我在脚本之家查到的一个万年历查询的小程序。
这是一个简单的万年历查询系统,用户通过输入想要查询的年份可以查到该年的详细日历。
源代码里已经定义好了星期,月份,规定查询的年份大于1901,整个程序运用switch,case语句、循环嵌套语句和条件语句并用递归的方法使整个程序运行成功并能显示日历。代码用Define规定好星期,月份的大小,每个月要加上上个月的天数,然后要考虑到闰年的特殊情况,利用条件语句计算如果是闰年就要加一天。
代码如下:
代码来源:https://www.jb51.net/article/51878.htm
#include<stdio.h>
#define Mon 1
#define Tues 2
#define Wed 3
#define Thur 4
#define Fri 5
#define Sat 6
#define Sun 0
#define January_days 31
#define February_days 28
#define March_days 31
#define April_days 30
#define May_days 31
#define June_days 30
#define July_days 31
#define August_days 31
#define September_days 30
#define October_days 31
#define November_days 30
#define December_days 31
#define first1month January_days
#define first2month January_days+February_days
#define first3month January_days+February_days+March_days
#define first4month January_days+February_days+March_days+April_days
#define first5month January_days+February_days+March_days+April_days+May_days
#define first6month January_days+February_days+March_days+April_days+May_days+June_days
#define first7month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days
#define first8month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days
#define first9month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days
#define first10month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days+October_days
#define first11month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days+October_days+November_days
int known_weekday = Tues;
int known_year = 1901;
int konwn_month = 1;
int known_day = 1;
int day_count(int month)
{
switch(month)
{
case 1: return 0;break;
case 2: return first1month;break;
case 3: return first2month;break;
case 4: return first3month;break;
case 5: return first4month;break;
case 6: return first5month;break;
case 7: return first6month;break;
case 8: return first7month;break;
case 9: return first8month;break;
case 10: return first9month;break;
case 11: return first10month;break;
case 12: return first11month;break;
}
}
char * month_name(int month)
{
switch(month)
{
case 1:
return "一月";
break;
case 2:
return "二月";
break;
case 3:
return "三月";
break;
case 4:
return "四月";
break;
case 5:
return "五月";
break;
case 6:
return "六月";
break;
case 7:
return "七月";
break;
case 8:
return "八月";
break;
case 9:
return "九月";
break;
case 10:
return "十月";
break;
case 11:
return "十一月";
break;
case 12:
return "十二月";
break;
default:
break;
}
}
/*按格式打印某年某月名称*/
void first_line_print(int month, int year)
{
//printf("%20s %d \n",month_name(month),year);
printf("%8d年 %s \n",year, month_name(month));
}
/*按格式打印星期名称*/
void week_print()
{
//printf("%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n","Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat.");
printf("%-3s%-3s%-3s%-3s%-3s%-3s%-3s\n","日", "一", "二", "三", "四", "五", "六");
}
/*计算该年该月份与已知日子之间的距离天数*/
int date_distance_count(int month, int year)
{
int leap_year_count = 0;
int i;
int distance;
if (year > known_year)
{
for (i=known_year; i<year; i++)
{
if(((i%4 == 0) && (i%100 != 0) ) || (i%400 == 0))
{
leap_year_count++;
}
}
if (month > 2)
{
if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0))
{
leap_year_count++;
}
}
}
else
if (year == known_year)
{
if (month > 2)
{
leap_year_count = 1;
}
}
distance = (year - known_year)*365 + leap_year_count + day_count(month);
return distance;
}
/*确定该月份第一天是星期几*/
int makesure_firstday_weekday(int month, int year)
{
int date_distance = 0;
int weekday;
date_distance = date_distance_count(month, year);
weekday = (known_weekday + date_distance)%7;
return weekday;
}
/*依次打印出该月份的日子*/
void print_in_turn(int month, int firstday, int year)
{
int i = 1;
int weekday;
switch(firstday)
{
case Sun:
break;
case Mon:
printf("%-3s","");
break;
case Tues:
printf("%-6s","");
break;
case Wed:
printf("%-9s","");
break;
case Thur:
printf("%-12s","");
break;
case Fri:
printf("%-15s","");
break;
case Sat:
printf("%-18s","");
break;
}
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
for(i=0; i<31; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
case 2:
{
if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) /*闰年*/
{
for(i=0; i<29; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
else /*平年*/
{
for(i=0; i<28; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
}
case 4:
case 6:
case 9:
case 11:
{
for(i=0; i<30; i++)
{
weekday = (firstday + i)%7;/*计算该天是星期几*/
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");/*如果是星期六,则换行*/
}
}
break;
}
}
}
void date_print(int month, int year)
{
int firstday;
firstday = makesure_firstday_weekday(month, year);
print_in_turn(month, firstday, year);
printf("\n");
}
void main_month(int month, int year)
{
first_line_print(month, year);
week_print();
date_print(month, year);
printf("\n\n");
}
void main_calendar(int year)
{
int i;
for(i=1; i<=12; i++)
{
main_month(i, year);
}
}
int main()
{
int year;
printf("请输入年份:year = ");
scanf("%d",&year);
printf("\n");
while(year < 1902)
{
printf("请输入大于1901的年份\n");
printf("请输入年份:year = ");
scanf("%d",&year);
printf("\n");
}
main_calendar(year);
scanf(" ");
return 0;
}
创新
以上是这个小程序的全部功能,但是现在往往人们在查日历的时候可能不是看遍一年的日历,用户会想看某一个月的日历
想到这点之后,我便考虑,能不能参照这段代码,自己做出一个可以查询某个月的日历,这样这个万年历查询系统会更加实用。
经过自己的钻研与实践,我编出了一小段代码,可以实现查询某一个月份的日历
代码如下:
void search_month(int year,int month)
{
int i=0,j,k=0,m; //j用于记录某月的第一天是星期几 m用于记录某月的天数 k用于换行提示
char x[10]=" ";
m=days_month(year,month);
j=someday(year,month,1);
//输出某月的日历
printf("------------------------------------------\n");
printf("%s\n",str);
for(;i<j;i++)
{
printf("%s",x);k++;
}
for(i=1;i<=m;i++)
{
k++;
if(k%7==0)
{
if(i<10)
{
printf(" %d ",i);
printf("\n");
}
else if(i>=10)
{
printf(" %d ",i);
printf("\n");
}
}
else
{
if(i<10)
{
printf(" %d ",i);
}
else if(i>=10)
{
printf(" %d ",i);
}
}
}
printf("\n------------------------------------------\n");
}
通过这段函数我们可以查询某一个月份的日历,使这个万年历程序更加完善。
心得体会:
根据老师上课的要求,我先上网搜索了一下关于万年历的基本需求,并且寻找了相关的代码,在大致了解了需求之后,才可以真正的开始理解代码的构造,而通过此次的作业,我发现需求设计,编写程序以及测试都是缺一不可的环节,环环相扣,而每一个编程者都有不同的编程风格,想要理解他们的编程手法,首先最重要的是要理解编程的需求所在,并且对他做架构以及拆分。
通过这次查询、分析与修改程序,使我更加懂得,做一个程序时,不能只考虑一个功能,要从用户等多方面考虑,功能太单一会导致 我也对应的添加了一些功能用来完善并且加强对于代码的理解。
转载于:https://www.cnblogs.com/malajisi/p/10467392.html
万年历查询系统理解与功能增添相关推荐
- c++万年历查询系统大一课程设计
#include<iostream> #include<iomanip> #include<string> using namespace std; void h1 ...
- 简易的万年历查询系统(C++版本)
要求: 本人是在VS2017中完成该代码. 注:以下代码并非全部原创,本人在一定程度上参考了百度文库中一篇文章的代码,原址如下 https://wenku.baidu.com/view/3af97dd ...
- SSM出租车查询系统 毕业设计-附源码220915
SSM出租车查询系统 摘 要 随着经济的日益增长,信息化时代已经到来,生活中各种信息趋向数字化.清晰化.出租车查询系统就是在这样的一个环境中诞生的,交通的日益发达,出租车信息复杂化.因此我们将发挥计 ...
- SSM出租车查询系统毕业设计-附源码220915
摘 要 随着经济的日益增长,信息化时代已经到来,生活中各种信息趋向数字化.清晰化.出租车查询系统就是在这样的一个环境中诞生的,交通的日益发达,出租车信息复杂化.因此我们将发挥计算机的庞大的存储空间, ...
- 基于JAVA的城市公交查询系统毕业论文(含源文件)
获取项目源文件,学习交流联系Q:1225467431 摘要:公交查询系统是城市道路交通的重要组成部分,是城市发展的必然产物,是联系国民生活.社会生产和流通领域的关键环节.安阳城市公交查询系统的发展处于 ...
- 基于JAVA的城市公交查询系统毕业论文
欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye2 摘要:公交查询系统是城市道路交通的重要组成部分,是城市发展的必然产物,是联系国民生活.社会生产 ...
- SSM+特殊病例查询系统 毕业设计-附源码231832
特殊病例查询系统的设计与实现 摘 要 大数据时代下,数据呈爆炸式地增长.为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势.在特殊病例查询的要 ...
- 基于PHP+MySQL汽车查询系统的设计与实现
随着时代的发展,汽车已经逐渐成为人们代步的主要工具之一,按时因为工业的发展,汽车的品牌和型号也层出不穷,如此多的汽车信息如何能够让爱车人士更好的 汽车查询系统的主要功能包含:汽车的类别管理.汽车的信息 ...
- 城市公交查询系统android
摘 要: 基于计算机网络开发的信息管理系统,能够提高管理员管理的效率,改善服务质量.优秀的城市公交查询系统能够帮助管理者更加有效管理用户查询公交线路,业务规范,可以提高克服人工管理带来的错误等不利因 ...
最新文章
- 正常的人|正确的作息时间
- 网站信息统计的简单实现过程
- Ubuntu下ICE-3.4.2的安装
- 贝叶斯规则(Bayes’ rule)
- 虚拟机上的Linux学习
- 深入浅出SharePoint——WSS升级和数据迁移
- C语言islower函数介绍、示例和实现
- Illustrator 教程,如何在 Ai 中创建一个新文档?
- 2012怎么设置index.php,配置伪静态.htaccess去掉wordpress固定连接里的index.php
- 飞卢服务器维护什么时候结束,2019年10月8日定期维护公告
- 安装vray显示指定服务器没安装,Vray使用手册——安装常见问题
- mysql 多选数据类型_【多选题】Mysql定点数数据类型包括( )。【本题2项正确】...
- linux查看java堆栈
- SoundPool循环播放
- 计算机如何从光盘启动不了,电脑如何设置光驱启动?开机设置光驱为第一启动的步骤...
- 百度地图api使用时标注图标显示不出来
- ULINE(插入水平线)
- JavaWeb项目部署服务器并配置ssl证书教程
- 阿里云服务器安装postgresql
- excel报错无法粘贴信息,原因复制区域跟粘贴区域形状不同