《电影俱乐部管理系统.docx》由会员分享,可在线阅读,更多相关《电影俱乐部管理系统.docx(28页珍藏版)》请在三一办公上搜索。
1、电影俱乐部管理系统目录 第一部分:课程设计编号、名称、内容 . 1 第二部分:程序总体设计思路 . 2 第三部分:程序功能模块划分、图示及流程图 . 2 第四部分:程序设计数据、运行结果 . 8 第五部分:程序的优缺点 . 14 第六部分:程序改进思路 . 16 第七部分:附录 . 17 第一部分:课程设计编号、名称、内容 编号:二十九题 名称:电影俱乐部 内容: 允许俱乐部成员租用DVD。若想成为会员,首先应签约并且可按月缴纳费用。会员一次可租用三个DVD,没有时间限制。浏览所有可租用的DVD,新成员的开户,会员对其账户状况的查询以及俱乐部管理者对所有交易情况的查看。 需要分析 DVD信息和
2、俱乐部会员信息文件存储,提供文件的输入输出操作;注册新会员;提供文件的添加操作;实现按月缴纳费用;提供文件的修改操作;浏览信息应提供显示操作;实现查询则提供文件的查找操作;另外提供健盘式选择菜单以实现功能选择。 总体设计 整体设计为会员注册模块、会员交费模块、会员租用DVD模块、会员归还DVD模块、信息浏览模块和信息查询模块等。 第 1 页 共 25 页 第二部分:程序总体设计思路 由于C语言是面对过程的语言,故我的设计思路是根据目标程序运行的过程来编写的。 在编写本程序的过程中,首先借助老师给的指导材料,确定了目标程序运行的次序与界面,即本程序首先运行用户欢迎及版本说明界面,其次程序运行用户
3、登陆及新会员注册菜单界面,如果用户选择会员注册选项则程序进入新会员注册界面,如果用户选择用户登陆选项则程序进入用户登陆界面,在用户登陆界面中分管理员登陆和会员登陆选项,如果用户选择管理员登陆选项则程序进入管理员管理程序部分,如果用户选择了会员登陆则程序自动进入会员身份验证,如果会员信息验证成功,程序将进入会员信息管理程序部分。 其次,根据目标程序运行的次序与界面,确定设计顺利,设计界面 再次是按照程序运行的各界面下的菜单功能编写各功能模块,并调试程序各功能模块,使各模块能够稳定高效准确地完成对应功能。 最后是程序的总体调试及功能完善,此部分从管理员与会员的角度出发,考虑了更加人性化、更加合理、
4、更加高效准确、更加智能化的设计。 说明:关于各个功能模块的设计思路及程序运行具体过程见报告的第三、四、五部分。 第三部分:程序功能模块划分、图示及流程图 本程序功能模块根据程序设计的需求,综合程序的实用性、人性化、智能化的考虑,将程序划分为10个模块分别编写,程序主体功能将由这10个模块来完成。这10个模块依次是: 1.会员按月自动缴费模块 设计思路简述 用时间函数获取系统月份,并将月份存入磁盘上的文本文件当中,每次程序启动时都会将磁盘上的文本文件中数据读入,并与当前系统月份进行比较,两者的差值与每月会员费用乘积即每个会员应扣除的会费。此部分无需用户输入输出,程序启动时默默进行,自动按月进行每
5、个会员的缴费。 模块流程图 开始 读取文本文件中月份 第 2 页 共 25 页 获取系统月份 两者差值每月会费 会员账户余额扣费 会员余额存入文本 结束 2.会员注册模块 设计思路简述 要进行会员注册,首先每个会员务必接受入会协议,仅当选择了YES,才能再接着进行会员昵称、姓名、密码的填写,填写完基本信息后,程序将提示是否进行会员账户的充值,并将用户所有信息写入磁盘上的文本文件当中。 模块流程图 开始 接受入会协议 输入会员基本信息 新会员信息存入文本 结束 3.添加DVD信息入库模块 设计思路简述 与会员注册模块类似,程序将依次提示用户完成DVD的编号、片名、状态的输入。 模块流程图 开始
6、输入DVD信息 DVD信息存入文本 结束 第 3 页 共 25 页 4.会员账户充值模块 设计思路简述 先将磁盘上文本文件中的所有用户信息读入,并全部赋给结构体数组fuser,利用strcmp函数找出需要充值的用户对应的fuseri,并将其结构体成员中的balance进行充值累加,最后将结构体数组信息全部写入磁盘文件文本文件当中。 模块流程图 开始 读取文本中会员信息 输入充值金额 会员账户余额累加 会员信息存入文本 结束 5.浏览俱乐部DVD信息模块 设计思路简述 将磁盘上文本文件数据读入,并全部赋给结构体数组dvd,将结构体数组所有元素的各成员的全部内容全部输出,并采用分屏显示。 模块流程
7、图 开始 读取文本中DVD信息 输出所有DVD信息 结束 6浏览俱乐部会员信息模块 设计思路简述 将磁盘上文本文件数据全部读入,并全部赋给结构体数组mem,将结构体数组所有元素的各成员的全部内容全部输出,并采用分屏显示。 模块流程图 第 4 页 共 25 页 开始 读取文本中会员信息 输出所有会员信息 结束 7.浏览俱乐部交易信息模块 设计思路简述 将磁盘上文本文件数据全部读入,并全部赋给结构体数组mem,将结构体数组所有元素中符合state0的元素的各成员的信息全部输出,并采用分屏显示。 模块流程图 开始 读取文本中会员信息 输出state大于的会员 结束 8.会员租借DVD模块 设计思路简
8、述 本模块设计比较复杂,主要是将磁盘上与两文本文件数据全部读入,并分别赋给两个结构体数组mem与dvd,通过查找算法找到会员与所借DVD对应的两结构体数组元素memj、dvdk,并对memj所借的DVD信息进行添加,对dvdk状态信息改为可借出,最后将两结构体数组全部输入到与两文本文件当中。 模块流程图 开始 读取文本中会员信息 读取文本中DVD信息 查找租借DVD的会员 查找被租借的DVD 第 5 页 共 25 页 DVD的state置 清空会员DVD账户 结束 9. 会员归还DVD模块 设计思路简述 本模块设计与会员租借DVD模块设计相似,对会员结构体数组与DVD结构体数组的操作大体相反,
9、即可完成程序对会员归还DVD的相关信息记录与处理功能。 模块流程图 开始 读取文本中会员信息 读取文本中DVD信息 查找归还DVD的会员 查找被归还的DVD 会员账户中添加DVD DVD的state置 结束 10会员浏览账户信息模块 设计思路简述 先将磁盘上文本文件全部读入,并赋给结构体数组mem,通过查找算法找到对应会员的memj,并将其全部信息输出。 模块流程图 开始 读取文本中会员信息 依据姓名查找到会员 第 6 页 共 25 页 输出该会员信息 结束 会员按月自动缴费模块 用户欢迎界面 新会员注册 用户登陆 管理员登陆 新会员注册模块 浏览俱乐部所有DVD信息 浏览俱乐部DVD信息模块
10、 浏览俱乐部所有会员信息 浏览俱乐部会员信息模块 浏览俱乐部交易信息模块 浏览俱乐部所有交易情况 会员登陆 添加DVD信息入库模块 向俱乐部添加新DVD 租借DVD 会员租借DVD模块 归还DVD 会员归还DVD模块 会员账户充值 会员账户充值模块 会员详细账户查询 会员浏览账户信息模块 图示及流程图图标说明: 菜单图标 模块图标 *说明:以上各功能模块均会在第四部分的设计、运行结果中得以运行与实现。 第 7 页 共 25 页 第四部分:程序设计数据、运行结果 本程序是一款应用软件,故数据设计、程序运行结果应在程序的运用中得以体现,现在通过一个程序的运用事例来对数据设计、程序运行结果进行演示与
11、实现: 李明通过朋友介绍想加入电影俱乐部,于是到俱乐部管理员面前说明了意向,俱乐部管理员启动电影俱乐部管理系统,程序欢迎界面如下: 管理员按任意健继续,程序出现了用户登陆及新会员注册菜单界面。 管理员输入1,按Enter健,程序进入新会员注册界面,程序运行界面如下: 屏幕上显示出了入会协会,李明认真阅读了入会协议,没有疑问,决定接受协议,管理员输入1,并按下Enter确认接受协议并继续,程序接着提示新会员输入昵称、真实姓名、账户密码,根据李明的具体信息,完成新会员基本信息的填写后,程序提示是否进行账户充值,李明交给管理员20元,完成了账户的充值。运行界面及充值结果如以下界面显示: 第 8 页
12、共 25 页 李明知道最近电影俱乐部刚进了一部电影变形金刚,于是要求登陆自己的账户租DVD碟,程序相关运行界面如下: 第 9 页 共 25 页 李明回到会员菜单,选择会员详细账户查询 功能,程序运行界面如下: 第 10 页 共 25 页 李明一口气又借了二张DVD,分别是汽车总动员玩具总动员二,帐户详情如下: 李明租借碟完毕后高兴地回家了。此时管理员通过电影俱乐部管理系统添加新的DVD及浏览俱乐部所有DVD与会员信息、查看俱乐部的交易情况。 程序运行的界面依次如下: 第 11 页 共 25 页 第 12 页 共 25 页 过了一个月后,李明去俱乐部归还DVD影片,此时俱乐部每个会员的帐户余额都
13、产生了扣费,以下是扣费前后每个会员的帐户余额的对比: 第 13 页 共 25 页 于是,李明归还影片汽车总动员 ,并对帐户进行充值。程序运行的相关界面如下: *说明:上述程序运行过程,程序的各模块均得以运行,并产生了准确的结果,由此可说明程序的准确性、可靠性,另外,如果想进一步了解程序,请通过操作具体的程序或查看程序源代码。其中,源代码编译、链接可生成目标程序MOVICE1,程序要还需要 + + 三个数据文件,四者缺一不可。 第五部分:程序的优缺点 算法是程序的灵魂,程序的优点首先表现在算法上的优点,其次才是功能上的。 算法上的优点主要体现在以下三点: 第 14 页 共 25 页 1. 程序采
14、用模块化设计,程序的主体的功能大都由各功能模块完成。程序设计模块化有利于程序的进一步改进及有助于程序执行效率的提高。 2. 程序对数据的读写采用了fread与fwrite 函数,此数据的读取与存贮方式有利于磁盘数据的加密,即无法用记事本等程序对数据文件进行正常读取,即有助于数据的保护与加密。另外,对磁盘文本数据的修改有多种方式,通过对比研究发现,本程序采用fwrite函数一次性把所有修改过的结构体数组写入文本文件的修改方式,不仅克服了本次程序设计中文本文件不能顺利准确读取的难点,而且相较于传统的fprintf函数的写入方式与创建临时交换文件的写入方式,写入效率明显提高。具体可见会员租借DVD模
15、块 会员归还DVD模块等相关模块。 3. 程序执行次序控制、FOR循环、功能模块函数的巧妙结合。例如注册新会员界面结束,可返回用户欢迎界面,主要是借助注册新会员模块返回的值来实现的。另外,对结构体数组数据的修改采用了层次明显的程序步骤,有助于相应功能模块的准确高效运行。 当然,程序的源代码为白手写起,历时天,克服了非常多的困难,感觉到了很大的压力。程序的源代码是在边看书、边查资料、询问、长期思考与设计、调试、试验的基础上编写出来的,在编写程序的过程中,得到了许多的锻炼,编程的思维也得以塑造。 程序源代码经过数次精简,但仍然比较庞大,应是编程经验不足造成的,虽不能说本程序源代码比他人的类似代码运
16、行效率更高,占有资源更少,但是程序执行的准确性还是能够保障的。 功能上的优点主要体现在以下三点: 简洁明了的程序菜单。程序主要采用了四组层次不同的菜单,相互独立又相互联系,巧妙相接,符合用户的使用习惯与思维。 人性化的程序提示语言,程序提示语言较人性化,不仅大多为祈使语句、疑问句,而且提示明确,具有较强的明确的指导作用。程序提示不仅层次分明,提示方式多样,而且提示信息井然有序,更加有利于用户顺利、准确地进行程序的操作。 智能化的模块设计。程序的智能化主要体现在减少了许多人工操作。例如智能化的会员扣费系统,无须管理员手动干遇,程序自动依据系统时间按月进行会费扣除操作,再如功能模块操作结束后,均会
17、提示是否返回主菜单,并提示是否再进行类似的操作,这样给用户带来了操作的方便,大大提高了电影俱乐部的管理效率。 当然本程序完全达到了C语言课程设计题目的所有要求,并且超额完成。即本程序允许俱乐部成员租用DVD,若想成为会员,首先应签约并且可按月缴纳费用,会员一次可租用三个DVD,没有时间限制。浏览所有可租用的DVD,新成员的开户,会员对其账户状况的查询以及俱乐部管理者对所有交易情况的查看。 除此以外,程序还根据实际情况,给程序添加了向俱乐部添加新DVD功能,便于DVD影片库的更新与丰富,与此同时,程序各模块开发设计依据了程序的具体实际的使用情景,而有所改进,使其更具有实用性。 主要表现在以下四点
18、: 程序虽然经过多次精简,但仅仅是形式上、小范围的精简,仍未得到本质上的精简,即未找到更加简单、更加高效、更加合理、更小占用的资源的算法。 程序仍然存在不合理的地方,例如程序某些部分输入错误会导致程序中止或转向其他功第 15 页 共 25 页 能模块,即程序建议用户注意提示,进行合理的准确的输入,这样更有利于管理工作。 程序功能仍然不够完善。例如程序没有管理员对会员的删除功能模块管理员对DVD的删除及DVD信息修改功能模块会员信息修改的功能模块。 操作界面为DOS界面,不符合时代潮流,也不符合现代用户操作的习惯,信息表达方式不丰富,比较单一,缺少图片、音乐等元化表达方式。 第六部分:程序改进思
19、路 本部分主要是针对第五部分程序的优缺点提出程序的改进思路。 改进思路: . 算法上除了采用结构体数组外,考虑在程序的算法设计上引入链表结构,考察这样对数据组织存贮效率上是否具有提高作用。 . 就现有知识水平、经验来看,对我来说,本程序的算法设计上已经是最精简的了。C语言知识博大精深,有必要对C语言的专著进行研究学习,多阅读别人的程序代码、多动手实践操作与设计,这样便对程序算法精简改进提供了可能。 改进思路: 对每个数据输入段代码进行更深的研究与分析,明确变量的类型、可能的数值,然后进行分类判断,必要时借助for循环语句来控制程序进行,保障各模块运行相对独立,稳定准确执行各自功能。典型方法是如
20、果输入数据错误,通过printf输出问题,并用for或(do)while构成循环,直到用户输入正确为止。 改进思路: 管理员对会员的删除功能模块设计思路:将磁盘上文本文件 全部读入,并且全部赋给结构体数组mem,通过查找算法,找到相应的会员,将在其后的所以结构体依次向前进行结构体的整体赋值,新建方式打开一个文本文件,用fwrite将前(会员总数-1)个会员信息输出到文本文件当中。 管理员对DVD的删除及DVD信息修改功能模块设计思路:管理员对DVD的删除模块与管理员对会员的删除功能模块设计思路类似,在此不述,而管理员对DVD信息修改功能模块可参照会员租借、归还DVD模块的设计方法。 会员信息修
21、改的功能模块设计思路:可参照会员租借、归还DVD模块的设计方法。 改进思路: C语言是面向过程的语言,当时语言开发的程序主要是面向DOS用户,虽具有较强的绘图功能等等功能,但主要还是面向DOS的。当今的主流语言是面向对象的语言,开发的平台大多为WINDOWS界面平台,开发的程序也主要是WINDOWS组件基础之上的图形界面程序,故可将程序要求移植到VC+之上,借助VC+强大的功能,编写WINDOWS界面程序,利用API接口函数方便调用各种WINDOWS强大功能,服务程序,使程序更加丰富、直观、生动、高效。 第 16 页 共 25 页 第七部分:附录 *原创* C语言源代码: /*本代码为“电影俱
22、乐部管理系统”源代码,代码为中国地质大学041051班章斌原创,编写代码时多处采用原创的高效的算法。*/ /*代码包含的函数库申明*/ #include #include /*定义DVD信息结构体*/ typedef struct DVDinfo char No10; char name10; int state; DI; /*定义会员信息结构体*/ typedef struct MemberInfo char No10; char name10; char password20; float balance; DI borrowDVD3; int state; MI; /*会员按月自动缴费模
23、块*/ void month FILE *fp1; FILE *fp2; MI mem500; int month; int pmonth; int cost; int j; int i; struct date curr_date; getdate(&curr_date); month=curr_date.da_mon; fp1=fopen(month,r+); fp2=fopen(meminfo,r+); if(fp1=NULL)exit(0); if(fp2=NULL)exit(0); fread(&pmonth,sizeof(int),1,fp1); if(pmonth!=month)
24、 cost=5*abs(month-pmonth); for(j=0;fread(&memj,sizeof(struct MemberInfo),1,fp2)!=0;j+) memj.balance-=cost; rewind(fp2); for(i=0;ij;i+)fwrite(&memi,sizeof(struct MemberInfo),1,fp2); fwrite(&month,sizeof(int),1,fp1); 第 17 页 共 25 页 fclose(fp1); fclose(fp2); /*会员注册模块*/ int reg FILE *fp; MI newmem; int c
25、hoice; int i=0; int result; fp=fopen(meminfo,r+); clrscr; printf(*n); printf(Please fill in the information of new membersn); printf(*n); printf(The movie club rules:n); printf(1.Please pay for your renting every month per monthn); printf(2.You are allowed to rent less than 4 DVDsn); printf(3.Please
26、 protect DVDs you rented from clubn); printf(If you destory it,you will pay for itn); printf(4.Please remember your own password that is veryn); printf(important.If you forget it,you will afford alln); printf(-n); printf(Do you agree all above?n); printf(-n); printf(1.YESn); printf(2.NOn); printf(-n
27、); printf(Your chice:n); scanf(%d,&result); if(result=1) printf(-n); printf(Please input your nickname:n); scanf(%s,newmem.No); printf(Please input your true name:n); scanf(%s,newmem.name); printf(Please input your password:n); scanf(%s,newmem.password); for(;i3;i+) strcpy(newmem.borrowDVDi.No,); st
28、rcpy(newmem.borrowDVDi.name,); newmem.borrowDVDi.state=0; newmem.balance=0; newmem.state=0; if(fp=NULL)exit(0); fseek(fp,0L,2); fwrite(&newmem,sizeof(struct MemberInfo),1,fp); fclose(fp); printf(-n); printf(1.Increasing value of my balance nown); printf(2.Return to welcome pagen); printf(-n); printf
29、(Your Choice:); scanf(%d,&choice); if(choice=1)return(2); if(choice=2)return(-1); 第 18 页 共 25 页 /*添加DVD信息入库模块*/ int adddvd FILE *fp; DI newdvd; fp=fopen(dvdinfo,r+); if(fp=NULL)exit(0); clrscr; printf(*n); printf(Please fill in the information of new DVDn); printf(*n); printf(Please input DVD number
30、:n); scanf(%s,newdvd.No); printf(Please input DVD name:n); scanf(%s,newdvd.name); printf(Please input DVD state:n); scanf(%d,&newdvd.state); fseek(fp,0L,2); fwrite(&newdvd,sizeof(struct DVDinfo),1,fp); fclose(fp); /*会员账户充值模块*/ void money(char name) MI fuser500; int i; int j; float balance; FILE *fp;
31、 clrscr; printf(*n); printf(You are being to increase value of your balancen); printf(*n); fp=fopen(meminfo,r+); if(fp=NULL)exit(0); for(i=0;fread(&fuseri,sizeof(struct MemberInfo),1,fp)!=0;i+) if(strcmp(fuseri.name,name)=0) printf(The value you want to increase:); scanf(%f,&balance); fuseri.balance
32、+=balance; printf(-n); printf(OK,now your balance is:%fn,fuseri.balance); getch; rewind(fp); for(j=0;ji;j+)fwrite(&fuserj,sizeof(struct MemberInfo),1,fp); fclose(fp); /*浏览俱乐部DVD信息模块*/ void dvdinfo DI dvd500; int p=0; FILE *fp; int j; fp=fopen(dvdinfo,r); if(fp=NULL)exit(0); 第 19 页 共 25 页 printf(-DVD
33、S-INFORMATION-n); printf( No Name Staten); for(j=0;fread(&dvdj,sizeof(struct DVDinfo),1,fp)!=0;j+) p+; if(p%10)=0) getch; printf(-MEMBERS-n,(p-10),p); printf(%s %s %dn,dvdj.No,dvdj.name,dvdj.state); fclose(fp); getch; /*浏览俱乐部会员信息模块*/ void meminfo MI mem500; FILE *fp; int j; int p=0; fp=fopen(meminfo
34、,r); if(fp=NULL)exit(0); printf(-MEMBERS-INFORMATION-n); printf(No Name Balance BorrowDVD(No Name) Staten); for(j=0;fread(&memj,sizeof(struct MemberInfo),1,fp)!=0;j+) p+; if(p%10)=0) getch; printf(-MEMBERS-n,(p-10),p); printf(%s %s %f %s %s %s %dn,memj.No,memj.name,memj.balance,memj.borrowDVD0.name,
35、memj.borrowDVD1.name,memj.borrowDVD2.name,memj.state); fclose(fp); getch; /*浏览俱乐部交易信息模块*/ void sell MI mem500; FILE *fp; int j; fp=fopen(meminfo,r); if(fp=NULL)exit(0); printf(-SELLS-INFORMATION-n); printf(No Name Password Balance BorrowDVD Staten); for(j=0;fread(&memj,sizeof(struct MemberInfo),1,fp
36、)!=0;j+) if(memj.state0)printf(%s %s %s %f %s %dn,memj.No,memj.name,memj.password,memj.balance,memj.borrowDVD,memj.state); getch; fclose(fp); /*会员租借DVD模块*/ void rent(char name,char dvdnum) 第 20 页 共 25 页 DI dvd500; MI mem500; int mm; int md; int j; int k; int i; int f; FILE *fp1; FILE *fp2; fp1=fopen
37、(meminfo,r+); fp2=fopen(dvdinfo,r+); if(fp1=NULL)exit(0); if(fp2=NULL)exit(0); for(j=0;fread(&memj,sizeof(struct MemberInfo),1,fp1)!=0;j+) if(strcmp(memj.name,name)=0)mm=j; for(k=0;fread(&dvdk,sizeof(struct DVDinfo),1,fp2)!=0;k+) if(strcmp(dvdnum,dvdk.No)=0)md=k; if(dvdmd.state=1 & memmm.state0) dvd
38、md.state=0; memmm.state+; for(f=0;f3;f+) if(strcmp(,memmm.borrowDVDf.No)=0) memmm.borrowDVDf=dvdmd; break; rewind(fp1); rewind(fp2); for(i=0;ij;i+)fwrite(&memi,sizeof(struct MemberInfo),1,fp1); for(i=0;i0) dvdmd.state=1; for(f=0;f3;f+) if(strcmp(dvdnum,memmm.borrowDVDf.No)=0) strcpy(memmm.borrowDVDf
39、.No,); strcpy(memmm.borrowDVDf.name,); memmm.borrowDVDf.state=1; memmm.state-; rewind(fp1); rewind(fp2); for(i=0;ij;i+)fwrite(&memi,sizeof(struct MemberInfo),1,fp1); for(i=0;ik;i+)fwrite(&dvdi,sizeof(struct DVDinfo),1,fp2); fclose(fp1); fclose(fp2); /*会员浏览账户信息模块*/ void count(char name) MI mem500; FILE *fp;