资源描述
上海应用技术学院
课 程 设 计
-第二学期
设计题目:日程管理
1.课程设计任务书
上海应用技术学院课程设计任务书
课程名称
程序设计语言课程设计
课程代码
B704010
设计题目
1. 算术练习
2. 个人收支管理
3. 通讯录
4. 成绩统计簿
5. 图书借阅管理
6. 日程表管理
题目序号
6
设计时间
7 月1 日—— 年 7 月 12日
系(院)
计算机和信息工程学院
专业
班级
一、 课程设计任务(条件)、具体技术参数(指标)
1. 在指导书提供课程设计题目中选择一题或自选(但需经过指导老师认可)
2. 每个题目限一人完成,题目选定后不可更换。
3. 用户提供主操作界面应该方便用户操作。
4. 最终提交课程设计结果包含:
a) 课程设计汇报电子稿。
c) 源程序文件。
d) 可实施程序文件。
二、 对课程设计结果要求(包含课程设计说明书、图纸、图表、实物等软硬件要求)
1. 分析课程设计题目标要求;
2. 写出具体设计说明;
3. 编写程序代码,调试程序使其能正确运行;
4. 设计完成软件要便于操作和使用,有整齐、美观使用界面;
5. 设计完成后提交课程设计汇报和源代码文件电子文档。
三、 课程设计工作进度计划:
第一天 选择课程设计题目,分析课题要求,确定设计方案;
第二天 总体设计,模块划分
第三天绘制程序步骤图;
第四天 按功效模块编写具体设计说明;
第五天 编写程序代码
第六天 设计用户界面;
第七天运行和调试程序;
第八天写课程设计汇报;
第九天完成软件设计准备答辩
第十天 提交课程设计汇报;面试或答辩。
四、 关键参考资料
[1]谭浩强.C程序设计(第三版).北京:清华大学出版社,
[2]谭浩强.C程序设计题解和上机指导(第三版).北京:清华大学出版社,
[3] Herbert Schildt.C语言大全(第四版).北京:电子工业出版社,
[4]Samuel P.Harbison Ⅲ,Guy L.Steele.C语言参考手册(第5版).北京:机械工业出版社,
[5]程序设计语言课程设计指导书.
指导老师(署名): 教研室主任(署名):
7月1日 7 月 12日
目录:
1. 课程设计任务书**************2
2. 目标及要求******************6
2.1 课程设计目标
2.2 课程设计要求
3. 课程设计内容说明************7
3.1.程序功效介绍
3.2程序设计整体设计说明
3.3数据结构设计
3.4程序结构设计
3.41程序子程序及功效设计
3.42函数关键调用关系图
3.43 各模块步骤图
4. 运行结果*******************17
5. 源程序代码分析*************31
6.课程设计感悟***************42
2.目标及要求
2.1 课程设计目标
本课程设计是计算机科学和技术专业关键实践性步骤之一,是在学生学习完《程序设计语言》课程后进行一次全方面综合练习。本课程设计目标和任务:
1) 巩固和加深学生对C语言课程基础知识了解和掌握;
2) 掌握C语言编程和程序调试基础技能;
3) 利用C语言进行基础软件设计;
4) 掌握书写程序设计说明文档能力
5) 提升利用C语言处理实际问题能力。
2.2 课程设计要求
1) 分析课程设计题目标要求;
2) 写出具体设计说明;
3) 编写程序代码,调试程序使其能正确运行;
4) 设计完成软件要便于操作和使用,有整齐、美观使用界面;
5) 设计完成后提交课程设计汇报和源代码文件电子文档。
3.课程设计内容说明
3.1.程序功效介绍
本系统关键功效是实现日程表管理,有添加日程,删除日程,查询日程,显示日程,设置日程,修改日程,日程排序,读取日程,保留日程功效。每个日程信息包含:日程时间,日程名称,日程详情,日程提醒,日程标识。
3.2程序设计整体设计说明
本系统主函数是整个程序关键,子函数之间也是有联络,对日程删除,查询,显示,修改,保留,必需是在添加了日程,或读取了日程情况下进行。部分基础操作在子函数中数次反复使用,即可单独设定函数,数次调用即可。
运行程序 开始后进入主菜单,用户即可选择选择要进行操作,比如,1为添加日程,用户需输入对应信息。选择2为删除日程,根据日期或名称选中对应日程后,能够删除日程或日程设置。等等功效。当选择不存在时提醒用户选择错误并提醒重新选择。
3.3题目要求
3.31. 设计要求
基础功效:
添加日程信息;
删除日程信息;
查询管理;
设置管理;
拓展功效:
日程信息修改;
设置修改;
设置删除;
创新(自拟)功效:
程序实现其它功效由个人自拟。
3.32. 设计要求具体说明
添加日程信息:
需要输入日期、时间及相关事件名称,并提醒是否有时间冲突。
删除日程信息:
需要输入日期、时间后,显示相关事件名称,由用户确定是否删除。
查询功效:
a) 查询提前提醒事件,即提醒将要发生日程信息;
b) 查询某天日程信息。对已经过去和将要发生事件要区分显示。
设置功效:
a) 能够设置提前提醒时间。
b) 日程信息需写入文件,文件建立自我定义。
c) 输入日期、时间要进行合理性检验。
d) 设置提前提醒时间,并进行合理性检验。
拓展功效:
a) 能进行日程表信息修改;
b) 设置信息修改、删除。
3.33. 提醒:
定义适宜结构体类型,使用链表或数组方法组织数据。
3.4数据结构设计
本系统包含数据结构有:
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 name[100];
char detail[200];
struct richeng *next;
};
3.5程序结构设计
3.51程序子程序及功效设计
int main() //主函数
char Menu(); //显示菜单
int runnian(int year); //判定是否闰年
int time_panduan(struct Date_time time); //检验输入时间是否正当
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 richeng *p); //删除指定日程
void delet(); //删除日程
void search_zhiding_richeng(char name[100]); //按名称查询指定日程
void search(); //查询日程
void xiugai(); //修改事日程信息
void read(); //读取日程文件
void write(); // 写入日程文件
3.52函数关键调用关系图
3.53 各模块步骤图
l 添加日程
l 删除日程
l 查询日程
l 显示日程
l 修改程序
l 读取日程
l 保留日程
4.运行结果
1.点击运行,出现以下界面,可依据提醒,选择菜单,进行相关操作;
添加日程功效
2.选择菜单,输入1,进入添加日程功效,第一步:提醒输入日程时间,第二步:提醒输入日程名称,第三步:提醒输入日程具体内容。第四步:进入设置界面,提醒设置日程提醒时间。输入完成后回车,日程添加功效就完成了。
注意:在这个功效里,对于时间和日期正当性全部有检验,假如输入时间有错误,那么就会自动提醒输入不正确,请重新输入。
保留日程功效
3.完成菜单一添加日程功效后,按回车键返回主菜单,然后选择6,进入保留日程功效,选择6后,点击回车,界面提醒“ 保留成功”,这时日程保留就完成了,日程就保留在了“我日程.txt”,文本文档里了。我们就完成了对日程写入保留功效。
文件读取功效
4.完成日程保留写入功效以后,就会自动返回主菜单,选择5,进入文件读取功效,点击回车,屏幕上会显示已保留日程全部信息,包含日程日期,日程名称,具体信息,提醒时间;
进入查询日程功效
5.完成读文件功效以后,点击回车,回到主菜单就能够选择其它功效进行操作,比如选择3,进入查询日程功效,界面自动提醒:1.查询指定日程,2.退出操作,选择1,查询指定日程,提醒输入查询日程名称
。输入要查询日程名称后,相关这条日程具体信息就会显示。然后选择0,退出查询功效,返回主界面。
注意;假如输入日程名称不正确,系统会自动提醒,查找日程不存在。
修改功效
6.返回主菜单后选择4,进入日程修改功效,然后提醒输入要修改日程名称,输入名称,进入修改界面,1.修改日程时间,2.修改日程名称,3.修改日程详情,4.修改日程提醒时间, 0.退出。选择要修改内容,如选择4修改日程提醒时间,回车后,输入新提醒时间,回车,选择0完成,回车,返回主菜单,然后选择6保留日程,再选择5,读取日程,界面就显示修改后新日程新信息了,这么话,修改就成功了。
删除功效
6. 完成修改功效后,回车进入主菜单,选择2,进入删除功效,输入要删除日程名称,回车进入删除界面,选择1,确定删除,删除后,界面显示删除成功 。并返回主菜单。选择6,保留删除,选择5,读取日程,就看不到刚刚删除那条日程信息了。
5. 源程序代码:
#include <stdio.h>
#include <stdlib.h> //stdlib 头文件里包含了C语言部分函数
#include <string.h> //字符串头文件
#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 name[100];
char detail[200];
struct richeng *next;
}*head=NULL,*p0= NULL; //*head指向开头,*p0指向末尾
char set[20];
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(); //按名称选择日程
struct 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 name[100]); //查询指定日程,按名称查询
void search(); //查询日程
void xiugai(); //修改事日程
void read(); //读取日程
void write(); // 写入文件
int main() //主函数
{
struct richeng *p; //定义了结构体日程指针
char x;
char filename[100];
do
{
x=Menu();
switch(x)
{
case'0':
printf("\n*****谢谢使用*****\n\n");
break;
case'1':
add();
break;
case'2':
delet();
break;
case'3':
search();
break;
case'4':
xiugai();
break;
case'5':
read();
break;
case'6':
write();
break;
default:
printf("菜单选择错误!请重新选择!");
}
}while(x != '0');
return 0;
}
char Menu() //显示菜单 ;
{
char x[10];
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("**********************************************************\n\n");
printf("请选择菜单序号0-6:");
gets(x);
return x[0];
}
void add () //添加日程 ;
{
struct richeng *p;
struct Date_time time;
char RC_name[50];
char RC_detail[100];
do
{
printf("请输入日程日期,时间(年-月-日 时:分):\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); //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 == NULL) //寻求插入位置,新添加日程插到后面
{
head = p0 = p;
p0->next = NULL;
}
else
{
p0->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;
else
RN=0;
return RN;
}
int time_panduan(struct Date_time time) //检验输入时间是否正确
{
int Y=1;
int day_of_month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if( runnian(time.year) == 1)
{
day_of_month[1]=29;
}
if(time.year > 9999 || time.year <= 0)
Y=0;
if(time.month > 12 || time.month <= 0)
Y=0;
if(time.day>day_of_month[time.month-1] || time.day <= 0)
Y=0;
if(time.hour > 24 || time.hour < 0 )
Y=0;
if(time.min > 60 || time.min < 0 )
Y=0;
if(Y== 0)
printf("输入错误!\n");
return Y;
}
int date_panduan(int year,int month,int day) //检验输入日期是否正确
{
int Y= 1;
int day_of_month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(runnian(year)==1)
{
day_of_month[1]=29;
}
if(year > 9999 || year <= 0)
Y=0;
if(month > 12 || month <= 0)
Y=0;
if(day>day_of_month[month-1] || day <= 0)
Y=0;
if(Y== 0)
printf("输入错误!\n");
return Y;
}
void set_remind_program(struct richeng *p) //设置日程提醒日期
{
do
{
printf("请输入日程提醒时间(年-月-日 时:分):\n");
scanf("%d-%d-%d %d:%d",
&p->remind_date.year,&p->remind_date.month,&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 *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
)
)
{
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 richeng *p,*p1;
char select_event[50];
int sel =0;
p=select_name_program();
return(p); //返回指向选中日程指针
}
struct richeng * select_name_program() //按名称选择日程
{
struct richeng *p;
char select_event[50];
int i=0;
printf("\n请输入日程名称:");
scanf("%s",select_event);
p=head;
printf("\n请确定日程信息:\n");
while( p !=NULL && strcmp(p->name,select_event) != 0)
p=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("*日程名称:%s\n",(*p).name);
printf("*日程时间:%-4d-%-2d-%-2d %-d:%-2d\n",
(*p).date.year,
(*p).date.month,
(*p).date.day,
(*p).date.hour,
(*p).date.min);
printf("*日程详情:%s\n",p->detail);
printf("*提醒时间:%-4d-%-2d-%-2d %-d:%-2d\n",
(*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_name[50];
int X =0;
do
{
printf("\n请选择:\n");
printf("1.查询指定日程\n");
printf("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选择错误!\n\n");
}
}while( X!= 0);
}
void search_zhiding_richeng(char name[50]) //查询指定日程,按名称查询
{
struct richeng *p,*p_event;
p=head;
p_event = NULL;
printf("\n******查询日程信息以下******\n\n");
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_name[100];
char RC_detail[200];
int s = 0;
p=select_program(); //选中日程事件
if( p == NULL)
{
printf("\n*****无查找信息*****\n");
getchar();
return;
}
do
{
printf("\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,&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个字符以内:)\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.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*****读取信息以下*****\n\n");
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)
展开阅读全文