1、上海应用技术学院课 程 设 计-第二学期设计题目:日程管理1.课程设计任务书上海应用技术学院课程设计任务书课程名称程序设计语言课程设计课程代码B704010设计题目1 算术练习2 个人收支管理3 通讯录4 成绩统计簿5 图书借阅管理6 日程表管理题目序号6设计时间 7 月1 日 年 7 月 12日系(院)计算机和信息工程学院专业班级一、 课程设计任务(条件)、具体技术参数(指标)1. 在指导书提供课程设计题目中选择一题或自选(但需经过指导老师认可)2. 每个题目限一人完成,题目选定后不可更换。3. 用户提供主操作界面应该方便用户操作。4. 最终提交课程设计结果包含:a)课程设计汇报电子稿。c)
2、源程序文件。d)可实施程序文件。二、 对课程设计结果要求(包含课程设计说明书、图纸、图表、实物等软硬件要求)1. 分析课程设计题目标要求;2. 写出具体设计说明;3. 编写程序代码,调试程序使其能正确运行;4. 设计完成软件要便于操作和使用,有整齐、美观使用界面;5. 设计完成后提交课程设计汇报和源代码文件电子文档。三、 课程设计工作进度计划:第一天 选择课程设计题目,分析课题要求,确定设计方案;第二天 总体设计,模块划分第三天绘制程序步骤图;第四天 按功效模块编写具体设计说明;第五天 编写程序代码第六天 设计用户界面;第七天运行和调试程序;第八天写课程设计汇报;第九天完成软件设计准备答辩第十
3、天 提交课程设计汇报;面试或答辩。四、 关键参考资料 1谭浩强C程序设计(第三版)北京:清华大学出版社, 2谭浩强C程序设计题解和上机指导(第三版)北京:清华大学出版社,3 Herbert SchildtC语言大全(第四版)北京:电子工业出版社, 4Samuel P.Harbison ,Guy L.SteeleC语言参考手册(第5版)北京:机械工业出版社,5程序设计语言课程设计指导书指导老师(署名): 教研室主任(署名): 7月1日 7 月 12日目录:1. 课程设计任务书*22. 目标及要求*62.1 课程设计目标2.2 课程设计要求3. 课程设计内容说明*73.1.程序功效介绍3.2程序设
4、计整体设计说明 3.3数据结构设计3.4程序结构设计3.41程序子程序及功效设计3.42函数关键调用关系图3.43 各模块步骤图4. 运行结果*175. 源程序代码分析*316.课程设计感悟*422.目标及要求2.1 课程设计目标本课程设计是计算机科学和技术专业关键实践性步骤之一,是在学生学习完程序设计语言课程后进行一次全方面综合练习。本课程设计目标和任务:1) 巩固和加深学生对C语言课程基础知识了解和掌握;2) 掌握C语言编程和程序调试基础技能;3) 利用C语言进行基础软件设计;4) 掌握书写程序设计说明文档能力5) 提升利用C语言处理实际问题能力。2.2 课程设计要求1) 分析课程设计题目
5、标要求;2) 写出具体设计说明;3) 编写程序代码,调试程序使其能正确运行;4) 设计完成软件要便于操作和使用,有整齐、美观使用界面;5) 设计完成后提交课程设计汇报和源代码文件电子文档。3.课程设计内容说明3.1.程序功效介绍本系统关键功效是实现日程表管理,有添加日程,删除日程,查询日程,显示日程,设置日程,修改日程,日程排序,读取日程,保留日程功效。每个日程信息包含:日程时间,日程名称,日程详情,日程提醒,日程标识。3.2程序设计整体设计说明 本系统主函数是整个程序关键,子函数之间也是有联络,对日程删除,查询,显示,修改,保留,必需是在添加了日程,或读取了日程情况下进行。部分基础操作在子函
6、数中数次反复使用,即可单独设定函数,数次调用即可。运行程序 开始后进入主菜单,用户即可选择选择要进行操作,比如,1为添加日程,用户需输入对应信息。选择2为删除日程,根据日期或名称选中对应日程后,能够删除日程或日程设置。等等功效。当选择不存在时提醒用户选择错误并提醒重新选择。3.3题目要求3.31. 设计要求 基础功效: 添加日程信息; 删除日程信息; 查询管理; 设置管理; 拓展功效: 日程信息修改; 设置修改; 设置删除; 创新(自拟)功效: 程序实现其它功效由个人自拟。 3.32. 设计要求具体说明 添加日程信息: 需要输入日期、时间及相关事件名称,并提醒是否有时间冲突。 删除日程信息:
7、需要输入日期、时间后,显示相关事件名称,由用户确定是否删除。 查询功效: a) 查询提前提醒事件,即提醒将要发生日程信息; b) 查询某天日程信息。对已经过去和将要发生事件要区分显示。 设置功效: a) 能够设置提前提醒时间。 b) 日程信息需写入文件,文件建立自我定义。 c) 输入日期、时间要进行合理性检验。 d) 设置提前提醒时间,并进行合理性检验。 拓展功效: a) 能进行日程表信息修改; b) 设置信息修改、删除。 3.33. 提醒: 定义适宜结构体类型,使用链表或数组方法组织数据。3.4数据结构设计本系统包含数据结构有:struct Date_time /定义时间结构体; int y
8、ear;int month;int day;int hour;int min; struct richeng/定义日程结构体; struct Date_time date; struct Date_time remind_date; char name100; char detail200; struct richeng *next;3.5程序结构设计3.51程序子程序及功效设计int main()/主函数char Menu(); /显示菜单 int runnian(int year); /判定是否闰年 int time_panduan(struct Date_time time); /检验输
9、入时间是否正当int date_panduan(int year,int month,int day);/检验输入日期是否正当struct richeng * select_name_program();/根据名称选择日程 void show(struct richeng *p); /显示指针指向日程信息 void set_remind_program(struct richeng *p);/设置日程提醒时间 struct richeng * select_program();/选择日程 void add ();/添加日程void delet_zhiding_richeng(struct ri
10、cheng *p); /删除指定日程void delet();/删除日程void search_zhiding_richeng(char name100);/按名称查询指定日程void search();/查询日程 void xiugai();/修改事日程信息void read();/读取日程文件void write();/ 写入日程文件 3.52函数关键调用关系图3.53 各模块步骤图l 添加日程l 删除日程l 查询日程l 显示日程 l 修改程序l 读取日程l 保留日程4.运行结果1.点击运行,出现以下界面,可依据提醒,选择菜单,进行相关操作;添加日程功效2.选择菜单,输入1,进入添加日程功
11、效,第一步:提醒输入日程时间,第二步:提醒输入日程名称,第三步:提醒输入日程具体内容。第四步:进入设置界面,提醒设置日程提醒时间。输入完成后回车,日程添加功效就完成了。注意:在这个功效里,对于时间和日期正当性全部有检验,假如输入时间有错误,那么就会自动提醒输入不正确,请重新输入。保留日程功效3.完成菜单一添加日程功效后,按回车键返回主菜单,然后选择6,进入保留日程功效,选择6后,点击回车,界面提醒“ 保留成功”,这时日程保留就完成了,日程就保留在了“我日程.txt”,文本文档里了。我们就完成了对日程写入保留功效。文件读取功效4.完成日程保留写入功效以后,就会自动返回主菜单,选择5,进入文件读取
12、功效,点击回车,屏幕上会显示已保留日程全部信息,包含日程日期,日程名称,具体信息,提醒时间;进入查询日程功效5.完成读文件功效以后,点击回车,回到主菜单就能够选择其它功效进行操作,比如选择3,进入查询日程功效,界面自动提醒:1.查询指定日程,2.退出操作,选择1,查询指定日程,提醒输入查询日程名称。输入要查询日程名称后,相关这条日程具体信息就会显示。然后选择0,退出查询功效,返回主界面。注意;假如输入日程名称不正确,系统会自动提醒,查找日程不存在。修改功效6.返回主菜单后选择4,进入日程修改功效,然后提醒输入要修改日程名称,输入名称,进入修改界面,1.修改日程时间,2.修改日程名称,3.修改日
13、程详情,4.修改日程提醒时间, 0.退出。选择要修改内容,如选择4修改日程提醒时间,回车后,输入新提醒时间,回车,选择0完成,回车,返回主菜单,然后选择6保留日程,再选择5,读取日程,界面就显示修改后新日程新信息了,这么话,修改就成功了。删除功效6. 完成修改功效后,回车进入主菜单,选择2,进入删除功效,输入要删除日程名称,回车进入删除界面,选择1,确定删除,删除后,界面显示删除成功 。并返回主菜单。选择6,保留删除,选择5,读取日程,就看不到刚刚删除那条日程信息了。5. 源程序代码:#include #include /stdlib 头文件里包含了C语言部分函数#include /字符串头文
14、件 #define A sizeof(struct richeng) /宏定义 就是在程序编译前,用sizeof(struct richeng) 替换A struct Date_time /定义时间结构体; int year;int month;int day;int hour;int min; struct richeng/定义日程结构体; struct Date_time date; /包含了时间结构体 struct Date_time remind_date; /提醒时间 char name100; char detail200; struct richeng *next; *head=
15、NULL,*p0= NULL; /*head指向开头,*p0指向末尾char set20;char Menu(); /显示菜单 int runnian(int year); /判定是否闰年 int time_panduan(struct Date_time time); /检验输入时间是否正确int date_panduan(int year,int month,int day);/检验输入日期是否正确void show(struct richeng *p); /显示指针指向日程事件信息 struct richeng * select_name_program();/按名称选择日程 struc
16、t richeng * select_program();/选择日程 void set_remind_program(struct richeng *p);/设置日程提醒日期 void add ();/添加日程void delet_zhiding_richeng(struct richeng *p); /删除指定日程void delet();/删除日程void search_zhiding_richeng(char name100);/查询指定日程,按名称查询 void search();/查询日程 void xiugai();/修改事日程void read();/读取日程void write
17、();/ 写入文件 int main()/主函数struct richeng *p; /定义了结构体日程指针 char x;char filename100;dox=Menu();switch(x)case0:printf(n*谢谢使用*nn);break;case1:add();break;case2:delet();break; case3:search();break;case4:xiugai();break;case5:read();break;case6:write();break;default: printf(菜单选择错误!请重新选择!);while(x != 0);return
18、 0;char Menu() /显示菜单 ; char x10;printf(n*¥欢迎使用日程表系统¥*n);printf(1)添加日程n);printf(2)删除日程n);printf(3)查询日程n);printf(4)修改日程n);printf(5)读取日程n);printf(6)保留日程n);printf(0)退出操作n);printf(*nn);printf(请选择菜单序号0-6:);gets(x); return x0; void add () /添加日程 ;struct richeng *p;struct Date_time time;char RC_name50;char R
19、C_detail100;doprintf(请输入日程日期,时间(年-月-日 时:分):n);scanf(%d-%d-%d %d:%2d,&time.year,&time.month,&time.day,&time.hour,&time.min); while(time_panduan(time)=0); /输入日程时间 printf(日程名称(100个字符以内):n);scanf(%s,RC_name); /输入日程名称 printf(具体描述 (200个字符以内):n);scanf(%s,RC_detail); /输入日程具体信息 p=(struct richeng * )malloc(A)
20、; /Malloc 向系统申请分配指定size个字节内存空间strcpy(*p).name, RC_name); strcpy(*p).detail, RC_detail);(*p).date.year = time.year; /赋值 (*p).date.month = time.month;(*p).date.day = time.day;(*p).date.hour = time.hour;(*p).date.min = time.min;printf(添加日程设置n);/添加日程同时是否添加日程设置 set_remind_program(p); /调用设置日程提醒时间函数if(head
21、 = NULL)/寻求插入位置,新添加日程插到后面 head = p0 = p;p0-next = NULL;elsep0-next = p;p0 = p;p0-next = NULL;/p0一直指向最终一个数据 printf(n-按回车键返回-n); int runnian(int year) /判定闰年;int RN=0;if( (year % 4 = 0 & year%100 != 0) | ( year % 400 = 0 ) )RN=1;elseRN=0;return RN;int time_panduan(struct Date_time time) /检验输入时间是否正确 int
22、 Y=1;int day_of_month12=31,28,31,30,31,30,31,31,30,31,30,31;if( runnian(time.year) = 1)day_of_month1=29;if(time.year 9999 | time.year 12 | time.month day_of_monthtime.month-1 | time.day 24 | time.hour 60 | time.min 9999 | year 12 | month day_of_monthmonth-1 | day remind_date.year,&p-remind_date.mont
23、h,&p-remind_date.day,&p-remind_date.hour,&p-remind_date.min);getchar(); while(time_panduan(p-remind_date) = 0); /对输入时间进行判定 void delet ()/删除日程 struct richeng *p;p=select_program(); /调用选择日程函数 if( p = NULL)return;getchar();delet_zhiding_richeng(p); /调用删除指定日程函数 void delet_zhiding_richeng(struct richeng
24、*p) /删除指定日程 struct richeng *p_s; struct richeng *p_l;int s = 0;int sure = 0;p_s = p_l = head;while(p_s != NULL /指针不为空 & ( strcmp(p_s-name,p-name) != 0 |p_s-date.year != p-date.year |p_s-date.month != p-date.month |p_s-date.day != p-date.day |p_s-date.hour != p-date.hour |p_s-date.min != p-date.min )
25、 ) p_l = p_s;p_s =p_s-next;/p_s指向指定日程,p_l指向此日程上一个 /删除此日程事件printf(确定删除?:n);printf(1.删除n);scanf(%d,&sure);getchar();if(sure = 1)if(p_s = head & p_s != NULL)head=p_s-next; else if(p_s != NULL) p_l-next = p_s-next;printf(删除成功n); struct richeng * select_program() /选择日程 struct Date_time time;struct richen
26、g *p,*p1;char select_event50;int sel =0; p=select_name_program();return(p);/返回指向选中日程指针 struct richeng * select_name_program() /按名称选择日程 struct richeng *p;char select_event50;int i=0;printf(n请输入日程名称:);scanf(%s,select_event);p=head;printf(n请确定日程信息:n);while( p !=NULL & strcmp(p-name,select_event) != 0)p
27、=p-next; if(p = NULL) /假如没有找到指定日程 printf(n*没有找到日程*n);getchar();return NULL; show(p);return p;void show(struct richeng *p) /显示指针指向日程事件信息 struct tm *newtime; printf($n);printf(*日程名称:%sn,(*p).name);printf(*日程时间:%-4d-%-2d-%-2d %-d:%-2dn,(*p).date.year,(*p).date.month,(*p).date.day,(*p).date.hour, (*p).d
28、ate.min);printf(*日程详情:%sn,p-detail);printf(*提醒时间:%-4d-%-2d-%-2d %-d:%-2dn,(*p).remind_date.year,(*p).remind_date.month,(*p).remind_date.day,(*p).remind_date.hour,(*p).remind_date.min);printf(n);void search() /查询日程 struct Date_time time;char RC_name50;int X =0; doprintf(n请选择:n);printf(1.查询指定日程n);prin
29、tf(0.退出操作:n);scanf(%d,&X);getchar();switch(X)case 0:break; case 1:printf(请输入事件名称:); scanf(%s,RC_name);getchar();search_zhiding_richeng(RC_name);break;default:printf(n选择错误!nn);while( X!= 0); void search_zhiding_richeng(char name50) /查询指定日程,按名称查询 struct richeng *p,*p_event;p=head;p_event = NULL; print
30、f(n*查询日程信息以下*nn); while(p != NULL) if(strcmp(*p).name, name) = 0) p_event = p; show(p); p = (*p).next; /假如一直没有找到指定日程 if(p_event = NULL)printf(n*无查询日程*n);void xiugai()struct richeng *p;struct Date_time time;struct Date_time remind_time;char RC_name100;char RC_detail200;int s = 0; p=select_program();/
31、选中日程事件 if( p = NULL)printf(n*无查找信息*n);getchar();return;doprintf(n*请选择要修改项目*n);printf(1.修改日程时间n);printf(2.修改日程名称n);printf(3.修改日程详情n);printf(4.修改日程提醒n);printf(0.完成n);scanf(%d,&s);getchar();switch(s)case 0:break;case 1:/输入日程时间 printf(请输入日程日期,时间(年-月-日 时:分):n);scanf(%d-%d-%d %d:%d,&time.year,&time.month,
32、&time.day,&time.hour,&time.min); (*p).date.year = time.year;(*p).date.month = time.month;(*p).date.day = time.day;(*p).date.hour = time.hour;(*p).date.min = time.min;break; case 2:/输入日程名称 printf(日程事件名称(100个字符以内):n);scanf(%s,RC_name); strcpy(*p).name, RC_name);break;case 3:/输入日程详情 printf(具体描述 (200个字符
33、以内:)n);scanf(%s,RC_detail); strcpy(*p).detail, RC_detail);break;case 4:/输入提醒时间 printf(提醒日程日期,时间(年-月-日 时:分):n);scanf(%d-%d-%d %d:%d,&remind_time.year,&remind_time.month,&remind_time.day,&remind_time.hour,&remind_time.min); (*p).remind_date.year = remind_time.year;(*p).remind_date.month = remind_time.
34、month; (*p).remind_date.day = remind_time.day;(*p).remind_date.hour = remind_time.hour;(*p).remind_date.min = remind_time.min;break;default:printf(n菜单选择错误!请重新选择!n);while( s != 0);void read()struct richeng *p;FILE *fp;fp = fopen(我日程.txt,rb);if(fp = NULL)printf(n文件无法打开!n);exit (0); head = NULL;printf(n*读取信息以下*nn);while(!feof(fp) /指向文件末尾 p=(struct richeng *) malloc(A);if(fread(p,A,1,fp) != 1) /用sizeof(struct richeng) 替换A break;show(p);if(head = NULL)