课设万年历.docx

上传人:b****3 文档编号:4121581 上传时间:2022-11-28 格式:DOCX 页数:25 大小:473.24KB
下载 相关 举报
课设万年历.docx_第1页
第1页 / 共25页
课设万年历.docx_第2页
第2页 / 共25页
课设万年历.docx_第3页
第3页 / 共25页
课设万年历.docx_第4页
第4页 / 共25页
课设万年历.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

课设万年历.docx

《课设万年历.docx》由会员分享,可在线阅读,更多相关《课设万年历.docx(25页珍藏版)》请在冰豆网上搜索。

课设万年历.docx

课设万年历

课程设计Ⅰ

设计说明书

 

万年历的实现

 

学生姓名

学号

班级

成绩

指导教师

 

数学与计算机科学学院

2014年3月9日

课程设计任务书

2013—2014学年第2学期

专业:

学号:

姓名:

课程设计名称:

课程设计Ⅰ

设计题目:

万年历的实现

完成期限:

自2014年2月24日至2014年3月7日共2周

设计依据、要求及主要内容(可另加附页):

1.任务说明

运用C/C++结构体、函数、数据结构等基础知识,按以下要求编程实现万年历的功能:

1)阐述设计思想,画出流程图;2)输入任一年,判断该年是否为闰年;输入年月日计算该日为当年的那一天;3)输入任一年,显示该年的日历,日历包括阳历、星期;4)说明测试方法,写出完整的运行结果,较好的界面设计。

2.要求

1)问题分析和任务定义:

根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么;

2)逻辑设计:

写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图;

3)详细设计:

定义相应的存储结构并写出各函数的伪码算法;

4)程序编码:

把详细设计的结果进一步求精为程序设计语言程序;

5)程序调试与测试:

采用自底向上,分模块进行,即先调试低层函数;

6)结果分析:

程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。

算法的时间、空间复杂性分析;

7)编写课程设计报告。

3.参考资料。

以上要求中前三个阶段的任务完成后,先将算法流程图交指导老师面审,审查合格后方可进入后续阶段的工作。

设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。

指导教师(签字):

教研室主任(签字):

课程设计评阅

评语:

 

指导教师签名:

年月日

摘要

设计了一个万年历,该万年历具有日历显示功能,年历、月历、日历查询,闰年判断功能和星期查询功能。

本万年历采用VC++6.0作为软件开发环境,利用C语言和数据结构的相关知识,采用函数之间的调用关系实现了万年历的功能。

该万年历的除了简单的日期查询之外,还可以显示公历的节日。

操作简单,界面清晰,易于为用于所接受。

关键词:

万年历;函数;查询;参数检查

 

1课题描述

1.1任务

运用C/C++结构体、函数、数据结构等基础知识,按以下要求编程实现万年历的功能:

1)阐述设计思想,画出流程图;2)输入任一年,判断该年是否为闰年;输入年月日计算该日为当年的那一天;3)输入任一年,显示该年的日历,日历包括阳历、节日、星期;4)说明测试方法,写出完整的运行结果,较好的界面设计.

1.2要求

1)问题分析和任务定义:

根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么;

2)逻辑设计:

写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图;

3)详细设计:

定义相应的存储结构并写出各函数的伪码算法;

4)程序编码:

把详细设计的结果进一步求精为程序设计语言程序;

5)程序调试与测试:

采用自底向上,分模块进行,即先调试低层函数;

6)结果分析:

程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果,算法的时间、空间复杂性分析;

7)编写课程设计报告。

2需求分析

设计一个万年历程序。

主要功能是能够输出任意年份或月份的日历,程序的输出的月历格式与日常生活中使用的月历格式相同,最好能够支持通过命令行参数指定要输出的年份或月份。

为了更便捷地使用万年历,要注意以下几点:

1)日历显示功能。

能根据系统日期进行初始化,如果没有任何输入,则显示系统日期所在月份的月历。

2)日历查询、闰年判断功能。

输入日期进行查询,显示查询日期所在月份的月历,还将显示所在年份是否为闰年。

3)参数检查功能。

如果输入日期不合法,查询将被拒绝,并显示提示信息。

 

3逻辑设计

1)在该万年历的设计过程中,主要功能有年历查询,月历查询和日期查询,其功能模块如图3.1所示:

 

 

图3.1万年历功能模块

2)在该万年历中,采用函数之间的调用来完成结果的显示。

先进入菜单选择,选择之后,进入相应的模块(年历查询模块,月历查询模块,日期查询模块和退出模块)中,并进行相关查询。

如图3.2所示:

2、月历查询

3、日期查询

4、退出程序

1、年历查询

2、月历查询

3、日期查询

4、退出程序

1、年历查询

程序进入

记录当时的日期

离日期还有几天

 

图3.2万年历调用模块

 

4详细设计

4.1变量说明

1)year表示年份的变量;

2)month表示月份的变量;

3)day表示日期的变量;

4)select表示菜单选择的变量;

5)i表示月份的变量;

6)j表示一个月中的某一天的变量;

7)sum判断某天是一年中的第几天的变量;

8)number判断某天离公元1年1月1日还有几天的变量;

9)a[]表示每月天数的数组变量;

10)year1系统时间年份的变量;

11)month1系统时间月份的变量;

12)day1系统时间日期的变量;

以上均为整形变量。

4.2各个算法的流程图

4.2.1闰年的判断

闰年的判断,能被4整除但不能100整除,或者能被400整除的年份为闰年,否则为平年。

日期的查询,就是直接打印该月份的月历。

1)算法程序

intisleap(intyear)/*判断是否为闰年*/

{

if(year%4==0&&year%100!

=0||year%400==0)

return1;

else

return0;

}

intmaxDay(intyear,intmonth)/*每月的天数*/

{

inta[]={31,28,31,30,31,30,31,31,30,31,30,31};/*每个月中的天数*/

if(isleap(year))

a[1]=29;/*闰年2月份有29天*/

returna[month-1];

}

2)流程图

4.2.2对天数的判断

对天数进行判断确定是星期几:

难点在于判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期:

nday=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+nday;w=nDay%7。

其中:

year:

要查询的年份;nday:

从该年的一月一日起到改天的天数;w:

得出的星期数,w==0表示星期天。

在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过定长度输出日期,在遇到某天是星期六时,就换行输出,因此可以按照月历的格式输出。

1)算法程序

inteachyeartotal(intyear,intmonth,intday)/*判断某天是一年中的第几天*/

{

inti,sum=0;

for(i=1;i

sum+=maxDay(year,i);

sum+=day;

returnsum;

}

intweek(intyear,intmonth,intday)/*对天数进行判断确定是星期几*/

{

intnumber=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400

+eachyeartotal(year,month,day);

number=number%7;

returnnumber;

}

 

2)流程图

 

5程序源代码

以下为万年历的源代码(其中包括主函数和12个子函数):

/*****************************包含的头文件******************************/

#include"time.h"

#include"stdio.h"

#include"math.h"

#include"windows.h"

#include"conio.h"

/***********************************函数声明*********************************/

inteachyeartotal(intyear,intmonth,intday);/*判断某天是一年中的第几天*/

intcounterdays(intyear,intmonth,intday);/*判断今天距特定日期的天数*/

intweek(intyear,intmonth,intday);/*对天数进行判断确定是星期几*/

intmaxDay(intyear,intmonth);/*每月的天数*/

intisleap(intyear);/*判断是否为闰年*/

voidwhatweek(intyear,intmonth,intday);/*判断是星期几*/

voiddisplay(intyear,intmonth);/*输出年月*/

voiddisplay1(intyear);/*输出年历*/

voiddisplay2(intyear,intmonth);/*输出月历*/

voiddisplay3(intyear,intmonth,intday);/*输出日历*/

voidjieri(intmonth,intday);/*判断是否公历节日*/

voidgetmenu();/*显示菜单选择*/

/**************************************主函数*******************************/

voidmain()

{

intyear,month,day,select,runyear;

while

(1)

{

voidgetmenu();

printf("请输入相应数字:

");/*菜单选择*/

scanf("%d",&select);

system("cls");//清屏命令

switch(select)

{

case1:

/*当选择为1时显示年历*/

printf("年历显示:

输入年(如2011):

");

scanf("%d",&year);

runyear=isleap(year);

if(runyear==1)

printf("\n\n\n该年为闰年\n\n\n");

else

printf("\n\n\n该年为平年\n\n\n");

if(year>0&&year<10000)/*显示年份从0-10000*/

{

display1(year);/*调用函数*/

}

else

system("cls");

break;

case2:

/*当选择为2显示月历*/

printf("月历显示:

输入年月(如2011,6):

");

scanf("%d,%d",&year,&month);

if(year>0&&year<10000&&month>=1&&month<=12)

{

display2(year,month);

}

else

system("cls");

break;

case3:

/*当选择为3时显示日期*/

printf("日期显示:

输入年月日(比如2011,6,23):

");

scanf("%d,%d,%d",&year,&month,&day);

if(year>0&&year<10000&&month>=1&&month<=12&&day>=1&&day<=maxDay(year,month))

{

display3(year,month,day);

}

else

system("cls");

break;

case4:

exit(0);

default:

/*当输入其他数字时,输入无效,重新输入*/

system("cls");

printf("输入无效,重新输入!

\n");

}

}

}

/****************************判断是否为闰年****************************/

intisleap(intyear)

{

if(year%4==0&&year%100!

=0||year%400==0)

return1;

else

return0;

}

/*******************************每月的天数*****************************/

intmaxDay(intyear,intmonth)

{

inta[]={31,28,31,30,31,30,31,31,30,31,30,31};/*每个月中的天数*/

if(isleap(year))

a[1]=29;/*闰年2月份有29天*/

returna[month-1];

}

/***********************判断某天是一年中的第几天************************/

inteachyeartotal(intyear,intmonth,intday)

{

inti,sum=0;

for(i=1;i

sum+=maxDay(year,i);

sum+=day;

returnsum;

}

/********************对天数进行判断确定是星期几***************************/

intweek(intyear,intmonth,intday)

{

intnumber=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400

+eachyeartotal(year,month,day);

number=number%7;

returnnumber;

}

/****************************输出年月*********************************/

voiddisplay(intyear,intmonth)

{

intmax,number,i,j=1;

max=maxDay(year,month);

number=week(year,month,1);

printf("%4s%4s%4s%4s%4s%4s%4s\n","Sun","Mon","Tue","Wed",

"Thu","Fri","sat");

for(i=0;i

printf("");/*1号前的星期补空格*/

while(j<=max)

{

printf("%6d",j);

if(i%7==6)

printf("\n");/*每7格换一行*/

i++;

j++;

}

printf("\n\n");

}

/******************************输出年历****************************/

voiddisplay1(intyear)

{

inti;

printf("\n");

for(i=1;i<=12;i++)

{

printf("%d年%d月\n\n",year,i);

display(year,i);

}

}

/****************************输出月历****************************/

voiddisplay2(intyear,intmonth)

{

printf("\n%d年%d月\n",year,month);

display(year,month);

}

/******************************输出日历**************************************/

voiddisplay3(intyear,intmonth,intday)

{

whatweek(year,month,day);

jieri(month,day);

counterdays(year,month,day);

}

 

/****************************判断是星期几************************************/

voidwhatweek(intyear,intmonth,intday)

{

intnumber;

number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);

number=number%7;

switch(number)

{

case0:

printf("\n%d年%d月%d日是星期日",year,month,day);break;

case1:

printf("\n%d年%d月%d日是星期一",year,month,day);break;

case2:

printf("\n%d年%d月%d日是星期二",year,month,day);break;

case3:

printf("\n%d年%d月%d日是星期三",year,month,day);break;

case4:

printf("\n%d年%d月%d日是星期四",year,month,day);break;

case5:

printf("\n%d年%d月%d日是星期五",year,month,day);break;

case6:

printf("\n%d年%d月%d日是星期六",year,month,day);break;

default:

system("cls");

printf("出现错误!

\n");

}

}

/*******************************判断今天距特定日期的天数********************/

intcounterdays(intyear,intmonth,intday)

{

intyear1,days0,days1,month1,days,day1;

time_ttimep;

structtm*p;

time(&timep);

p=gmtime(&timep);

year1=(1900+p->tm_year);

month1=(1+p->tm_mon);

day1=(p->tm_mday);/*获取系统时间year1、month1、day1分别为年、月、日*/days0=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);days1=(year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+eachyeartotal(year1,month1,day1);

days=days0-days1;/*计算出两个日期之间的时间差*/

printf("\n\n今天距%d年%d月%d日还有%d天\n\n",year,month,day,days);

returndays;

}

/****************************判断是否公历节日*****************************/

voidjieri(intmonth,intday)

{

if(month==1)

switch(day)

{

case1:

printf(",这天是元旦");

}

if(month==2)

switch(day)

{

case14:

printf(",这天是情人节");

}

if(month==3)

switch(day)

{

case8:

printf(",这天是妇女节");

break;

case12:

printf(",这天是植树节");

}

if(month==4)

switch(day)

{

case1:

printf(",这天是愚人节");

}

if(month==5)

switch(day)

{

case1:

printf(",这天是劳动节");

break;

case4:

printf(",这天是青年节");

}

if(month==6)

switch(day)

{

case1:

printf(",这天是儿童节");

}

if(month==7)

switch(day)

{

case1:

printf(",这天是建党节");

}

if(month==8)

switch(day)

{

case1:

printf(",这天是建军节");

}

if(month==9)

switch(day)

{

case10:

printf(",这天是教师节");

}

if(month==10)

switch(day)

{

case1:

printf(",这天是国庆节");

}

if(month==12)

switch(day)

{

case25:

printf(",这天是圣诞节");

}

}

/**********************************显示菜单选择*****************************/

voidgetmenu()

{

printf("************主菜单************\n\n");

printf("*1、年历显示*\n\n");

printf("*2、月历查询*\n\n");

printf("*3、日期查询*\n\n");

printf("*4、退出系统*\n\n");

printf("******************************\n\n");

}

 

6程序调试与测试

6.1调试结果

通过前期的上网,看有关书籍进行程序源代码的编写,编写完之后通过后期的改错,调试结果没有错误。

显示结果如图6.1所示(0error(s),0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1