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


发布评论