2024年3月26日发(作者:)

题 目

指导教师

学生姓名

学 号 @@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@

专 业 @@@ @@@ @@@

教学单位

C语言课程设计

桌面日历

曹东燕

物理系 (盖章)

@@@ @@@@ @@@@@

目 录

1设计内容与设计要求…………………………………… 1

1.1系统功能简介……………………………………… 1

1.2系统运行环境 ………………………………………1

2功能划分,模块详细说明 ………………………………1

3程序流程图 ………………………………………………2

4运行的运行及说明 ………………………………………3

4.1系统的运行 …………………………………………3

4.2运行说明…………………………………………… 7

5总结 ………………………………………………………7

附件:源程序清单……………………………………………7

1设计内容与设计要求

1.1系统功能简介

 系统有简单的菜单界面,用户可以通过输入简单的选项来完

成相应的工作。

 用户可以选择某年或某年某月的日历进行统一查看,统一输

出。

 用户可以根据自己的需求查询某年某月特定日子是星期几。

 可以输出用户指定年份或月份的日历,形成一个.txt文档,

位于与程序相同目录下的文件夹中。

1.2系统运行环境

 Vc++6.0下运行,硬件基本无要求,现在的计算机系统基本都

可以运行该系统。

2功能划分,模块详细说明

系统的功能是通过子函数调用的方式来完成的,下面对程序

中用到的函数及其功能做一下说明。

 int weeks(long year,int mouth,int day);计算公元某年某

月某日是星期几函数。本函数通过switch语句的镶嵌使用,将计

算分为闰年和平年。

 int days(long year,int mouth); 此函数模块还是应用

switch语句,根据闰年和平年将月份天数做运算,用default :

mouth_days=30;来代替一年中天数为30的月份。

 int isleap(long year);此函数模块的功能是实现闰年与平

年的判断。

 void print(long year);此函数为日历打印公共模块通过函

数运算没隔一天输出一个制表符t,没七天输出一个换行符n,

从而使实现日历分行输出。

 void opreal();加载操作(功能选择),此函数为程序的主要

部分,此部分主要通过if,else if,else语据与程序中用户给出

1

的choose值加载相应的功能模块,整个条件共分为7个部分,即

程序的6个功能和退出操作,其中功能模块包括输入年,显示该

年万年历、查询某年某月的日历、查询某年某月某日为星期几、

保存打印年份日历到磁盘、保存打印月份日历到磁盘、查看帮助

文件5部分。前4部分主要是通过for循环语句实现;查看帮助文

件部分是用了printf()语句给与输出,保存打印月份日历到磁

盘是通过文件操作实现的,其中包括txt文件的创建、输入、保

存、关闭。

3程序流程图

程序整体流程图如图3-1所示:

开始

显示菜单

读取用户输入数字,执行

相关功能

输入

年,显

示该

年万

年历

查询

某年

某月

的日

查询

某年

某月

某日

为星

期几

保存

打印

年份

日历

到磁

保存

打印

月份

日历

到磁

查看

帮助

文件

退出

结束

图3-1 程序整体流程图

2

4系统的运行及说明

4.1系统的运行

系统初始运行时,会显示如图4-1所示的输入界面,用户可以

根据提示,进行相应的选择,来完成系统提供的各种功能。

图4-1输入界面

根据提示提示用户选择相应的数字键,按ENTER键后进入相应

的功能菜单。

如下图4-2是输入年,显示该年万年历的程序功能截图,此功

能通过日历公用打印模块与year函数实现,year函数通过for函数

循环打印数字与换行字符从而输出日历。

3

图4-2输入月份界面

图4-3输入年月查询日历界面

当选择功能2时,输入所查询的年月,系统将会给出相应的日

历,如图4-3所示,此功能的实现是通过for语句,循环打印数字,

给出相应的月份日历,与功能1的实现相比少一个关于mouth变量

的循环。

4

图 4-4 输入某年某月某日显示星期几界面

当选择功能3时,输入某年某月某日为星期几,界面如图4-3

所示,此模块调用了日历打印中的int weeks(long year,int mouth,int

day)函数,运用switch与case的镶嵌使用以及

两S=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+C;Xing_qi=S%7

个函数实现对星期的计算。

图 4-5 保存打印年份日历到磁盘界面

5

图 4-6 保存打印月份日历到磁盘界面

如图4-5 为保存打印年份日历到磁盘界面,及图 4-6 为保存打

印月份日历到磁盘界面,两个功能中均用到字符拼接函数strcat();

以及文件操作函数fopen()、fclose(),程序通过函数strcat()拼

接文件名与扩展名.txt,通过函数fopen()以写的形式打开文件,通

过函数fprintf()传入需要写入的内容即日历内容,在通过函数fclose

()关闭并保存文件,实现打印保存日历到磁盘的功能。

图 4-6

日历帮助文件界面

6

如图 4-6 是日历程序帮助文件界面,其中包含程序功能介绍和

使用方法两部分。本功能的实现主要是通过printf()函数实现的。

4.2运行说明

首先打开软件,根据给出的信息输入相应的功能模块数字,输

入完毕后按“ENTER”键进入,再根据提示执行相应的操作,程序

使用完毕后输入数字7退出程序。

5总结

通过这次实习,让我们初步有了编写系统的能力,我们对很多

的函数有了新的认识,也学会了运用多种函数,也明白了编写软件

的基本过程,和基本方法。编写软件的过程中我们又学到了曾经自

己不知道的函数或是自己不会的函数的用法。这次课程设计课总的

来说让我受益匪浅。

在软件的设计过程中遇到了很多的困难。在软件一次一次的调

试失败下,曾经想过要放弃。我最后还是让自己坚持了下来,毫不

畏惧困难,在同学的帮助与讲解下我总算是顺利的完成了软件的设

计。

在程序的编写过程中我们发现有很多的知识漏洞和缺陷,需要

进一步努力学习来完善自己。

在这几天的编写过程中我们对c语言有了更进一步的认识和了

解。此次编程过程的经验和知识肯定能促进我以后的学习。

此次课程设计不仅给了我们很多很好的经验,也让我们体会到

了失败时的焦急和难受,也体会到了成功时的兴奋与喜悦。

附件:源程序清单

#include

#include

#include

#include

int weeks(long year,int mouth,int day); //计算公元某年某月是星期几函数

int days(long year,int mouth); //计算某年某月总共有多少天的函数

7

int isleap(long year);//判断润年或者平年

void print(long year);//显示年日历

void opreal();//加载操作(功能选择)

void main()

{

}

int weeks(long year,int mouth,int day) //计算公元某年某月某日是星期几函数

{

opreal();

getch();

long S;

int Xing_qi,C;

switch(isleap(year))

{

case 0: //平年计算

switch(mouth)

{

case 1: C=day;break;

case 2: C=31+day;break;

case 3: C=59+day;break;

case 4: C=90+day;break;

case 5: C=120+day;break;

case 6: C=151+day;break;

case 7: C=181+day;break;

case 8: C=212+day;break;

case 9: C=243+day;break;

case 10: C=273+day;break;

case 11: C=304+day;break;

case 12: C=334+day;break;

default : break;

8

}

} break;

case 1: //闰年计算

switch(mouth)

{

case 1: C=day;break;

case 2: C=31+day;break;

case 3: C=60+day;break;

case 4: C=91+day;break;

case 5: C=121+day;break;

case 6: C=152+day;break;

case 7: C=182+day;break;

case 8: C=213+day;break;

case 9: C=244+day;break;

case 10: C=274+day;break;

case 11: C=305+day;break;

case 12: C=335+day;break;

default :break;

} break;

}

S=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+C;

Xing_qi=S%7;

return Xing_qi;

int days(long year,int mouth) //计算某年某月总共有多少天的函数

{

int mouth_days; //某月份天数

switch(mouth)

{

9

}

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12: mouth_days=31;break;

case 2: switch(isleap(year))

{

}break;

case 1:

case 0:

mouth_days=29;break;

mouth_days=28;break;

default:break;

default : mouth_days=30;break;

}

return mouth_days;

int isleap(long year) //平年返回0,闰年返回1

{

}

void print(long year) //显示某年的日历

{

if((year%4==0&&year%100!=0)||(year%400==0)) return 1;

else return 0;

int mouth,mouth_days,sday,i;

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

{

printf("%ld年%d月",year,mouth);

if(isleap(year))

printf("(闰年)nn");

10

}

else printf("(平年)nn");

sday=weeks(year,mouth,1);//计算某年某月的1号是星期几

mouth_days=days(year,mouth);//计算某年某月的有多少天

printf("周日t周一t周二t周三t周四t周五t周六nn");//打印日历

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

{

}

for(i=1;i<=mouth_days;i++) //每七天打印换行

{

}

printf("nnn");

}

printf("%dt",i);

if((i+sday)%7==0)

{

}

printf("n");

printf("t");

void opreal()

{

static long year;

int choose,flag=1;

while(flag)

{

printf("„„„„„„„„欢迎使用万年历„„„„„„„„nn");

printf("„„„请输入数字选择功能:„„„nn");

printf("1.输入年,显示该年万年历;n");

printf("2.查询某年某月的日历;n");

printf("3.查询某年某月某日为星期几;n");

11

printf("4.保存打印年份日历到磁盘;n");

printf("5.保存打印月份日历到磁盘;n");

printf("6.查看帮助文件;n");

printf("7.退出.n");

scanf("%d",&choose);

if(choose==1)

{

}

else if(choose==2)

{

int mouth,mouth_days,sday,i;

printf("请输入年 月(中间用空格隔开):n");

scanf("%ld%d",&year,&mouth);

printf("%ld年%d月",year,mouth);

if(isleap(year))

printf("(闰年)nn");

printf("请输入年份:");

scanf("%ld",&year);

printf("这是%ld年的日历!nn",year);

print(year);

else printf("(平年)nn");

sday=weeks(year,mouth,1);//计算某年某月的1号是星期几

mouth_days=days(year,mouth);//计算某年某月的有多少天

printf("周日t周一t周二t周三t周四t周五t周六nn");//打印日历

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

{

}

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

{

12

printf("t");

}

printf("%dt",i);

if((i+sday)%7==0)

{

}

printf("n");

printf("nnn");

}

else if(choose==3)

{

}

else if(choose==4)

{

FILE *fp;

char filename[20];

int mouth,mouth_days,sday,i;

printf("请输入要打印保存的年份:");

scanf("%ld",&year);

printf("请输入保存的文件名:");

scanf("%s",filename);

strcat(filename,".txt");

if((fp=fopen(filename,"w"))==NULL)

printf("cannot open filen");

int m,d;

printf("请输入年 月 日(中间用空格隔开):");

scanf("%ld%d%d",&year,&m,&d);

printf("%ld年%d月%d日为星期%dnn",year,m,d,weeks(year,m,d));

fprintf(fp,"tt %ld年的日历nn",year);

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

{

13

fprintf(fp,"%ld年%d月",year,mouth);

if(isleap(year))

fprintf(fp,"(闰年)nn");

else fprintf(fp,"(平年)nn");

sday=weeks(year,mouth,1);//计算某年某月的1号是星期几

mouth_days=days(year,mouth);//计算某年某月的有多少天

fprintf(fp,"周日t周一t周二t周三t周四t周五t周六nn");//

打印日历

}

}

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

{

}

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

{

}

fprintf(fp,"nnn");

fprintf(fp,"%dt",i);

if((i+sday)%7==0)

{

}

fprintf(fp,"n");

fprintf(fp,"t");

fclose(fp);

printf("保存文件成功!n");

else if(choose==5)

{

FILE *fp;

char filename[20];

int mouth,mouth_days,sday,i;

14

printf("请输入要打印保存的年 月:");

scanf("%ld%d",&year,&mouth);

printf("请输入保存的文件名:");

scanf("%s",filename);

strcat(filename,".txt");

if((fp=fopen(filename,"w"))==NULL)

printf("cannot open filen");

fprintf(fp,"tt%ld年%d的日历nn",year,mouth);

fprintf(fp,"%ld年%d月",year,mouth);

fclose(fp);

if(isleap(year))

fprintf(fp,"(闰年)nn");

else fprintf(fp,"(平年)nn");

sday=weeks(year,mouth,1);//计算某年某月的1号是星期几

mouth_days=days(year,mouth);//计算某年某月的有多少天

fprintf(fp,"周日t周一t周二t周三t周四t周五t周六nn");//打印日历

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

{

}

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

{

}

fprintf(fp,"nnn");

fprintf(fp,"%dt",i);

if((i+sday)%7==0)

{

}

fprintf(fp,"n");

fprintf(fp,"t");

printf("保存文件成功!n");

15

}

else if(choose==6)

{

printf("nnnn");

printf("tt*************欢迎使用多功能万年历

*************ttttn");

printf("功能介绍:n");

printf(" 本程序具有多种日历查询方法,可以按照年份,月份分别

进行查询,同时可以查询给定日期为某个星期的星期几,最显著的功能是,本日历可以根

据给定的年份或者月份生成txt文档的日历,操作简单。n");

printf("n");

printf("使用方法:n");

printf("1、根据需要选择相应的功能菜单;n");

printf("2、进入相应的功能菜单后,根据相应的屏幕提示输入相应的年

份,或者月份,若同时输入年份和月份,中间请用空格键隔开;n");

printf("3、当打印日历文件时,输入年,或年月后,会在相对位置与程

序相同的地方生成对应名字的txt日历文档;n");

");

printf("4、程序使用完毕,按照屏幕提示输入数字键“7”退出程序。

}

printf("nn");

else if(choose==7)

{

}

else

{

printf("输入错误,请重新选择!n");

continue;

16

printf("程序结束,谢谢使用!n");

break;

}

}

}

17