完整word版电影俱乐部管理系统C语言实习报告.docx
《完整word版电影俱乐部管理系统C语言实习报告.docx》由会员分享,可在线阅读,更多相关《完整word版电影俱乐部管理系统C语言实习报告.docx(40页珍藏版)》请在冰豆网上搜索。
完整word版电影俱乐部管理系统C语言实习报告
第一部分:
课程设计编号、名称、内容
编号:
二十九题
名称:
电影俱乐部
内容:
【要求】
允许俱乐部成员租用DVD。
若想成为会员,首先应签约并且可按月缴纳费用。
会员一次可租用三个DVD,没有时间限制。
浏览所有可租用的DVD,新成员的开户,会员对其账户状况的查询以及俱乐部管理者对所有交易情况的查看。
【提示】
(1)需要分析
DVD信息和俱乐部会员信息文件存储,提供文件的输入输出操作;注册新会员;提供文件的添加操作;实现按月缴纳费用;提供文件的修改操作;浏览信息应提供显示操作;实现查询则提供文件的查找操作;另外提供健盘式选择菜单以实现功能选择。
(2)总体设计
整体设计为会员注册模块、会员交费模块、会员租用DVD模块、会员归还DVD模块、信息浏览模块和信息查询模块等。
第二部分:
程序总体设计思路
由于C语言是面对过程的语言,故我的设计思路是根据目标程序运行的过程来编写的。
在编写本程序的过程中,首先借助老师给的指导材料,确定了目标程序运行的次序与界面,即本程序首先运行[用户欢迎及版本说明]界面,其次程序运行[用户登陆]及[新会员注册]菜单界面,如果用户选择[会员注册]选项则程序进入新会员注册界面,如果用户选择[用户登陆]选项则程序进入用户登陆界面,在用户登陆界面中分[管理员登陆]和[会员登陆]选项,如果用户选择[管理员登陆]选项则程序进入管理员管理程序部分(此部分具有[浏览俱乐部所有DVD信息功能][浏览俱乐部所有会员信息功能][浏览俱乐部所有交易情况功能][向俱乐部添加新DVD的功能]四大功能),如果用户选择了[会员登陆]则程序自动进入会员身份验证,如果会员信息验证成功,程序将进入会员信息管理程序部分(此部分具有[租借DVD功能][归还DVD功能][会员账户充值功能][会员详细账户查询功能]四大功能)。
其次,根据目标程序运行的次序与界面,确定设计顺利,设计界面(包括各部分菜单与用户提示信息。
)
再次是按照程序运行的各界面下的菜单功能编写各功能模块,并调试程序各功能模块,使各模块能够稳定高效准确地完成对应功能。
最后是程序的总体调试及功能完善,此部分从管理员与会员的角度出发,考虑了更加人性化、更加合理、更加高效准确、更加智能化的设计。
说明:
关于各个功能模块的设计思路及程序运行具体过程见报告的第三、四、五部分。
第三部分:
程序功能模块划分、图示及流程图
【功能模块划分及其流程图】
本程序功能模块根据程序设计的需求,综合程序的实用性、人性化、智能化的考虑,将程序划分为10个模块分别编写,程序主体功能将由这10个模块来完成。
这10个模块依次是:
1.[会员按月自动缴费模块]
[设计思路简述]
用时间函数获取系统月份,并将月份存入磁盘上的文本文件当中,每次程序启动时都会将磁盘上的文本文件中数据读入,并与当前系统月份进行比较,两者的差值与每月会员费用(默认为5元/月)乘积即每个会员应扣除的会费。
此部分无需用户输入输出,程序启动时默默进行,自动按月进行每个会员的缴费。
[模块流程图]
2.[会员注册模块]
[设计思路简述]
要进行会员注册,首先每个会员务必接受入会协议(屏幕将会自动显示协议),仅当选择了[YES],才能再接着进行会员昵称、姓名、密码的填写,填写完基本信息后,程序将提示是否进行会员账户的充值,并将用户所有信息写入磁盘上的文本文件当中。
[模块流程图]
3.[添加DVD信息入库模块]
[设计思路简述]
与会员注册模块类似,程序将依次提示用户完成DVD的编号、片名、状态(如果管理员不想把某DVD片借出,可将DVD状态设为0)的输入。
[模块流程图]
4.[会员账户充值模块]
[设计思路简述]
先将磁盘上文本文件中的所有用户信息读入,并全部赋给结构体数组fuser,利用strcmp()函数找出需要充值的用户对应的fuser[i],并将其结构体成员中的balance(余额)进行充值累加,最后将结构体数组信息全部写入磁盘文件文本文件当中。
[模块流程图]
5.[浏览俱乐部DVD信息模块]
[设计思路简述]
将磁盘上文本文件数据读入,并全部赋给结构体数组dvd,将结构体数组所有元素的各成员的全部内容全部输出,并采用分屏显示(每10行将会有一暂停,任意健继续进行俱乐部DVD信息浏览)。
[模块流程图]
6.[浏览俱乐部会员信息模块]
[设计思路简述]
将磁盘上文本文件数据全部读入,并全部赋给结构体数组mem,将结构体数组所有元素的各成员的全部内容全部输出,并采用分屏显示(每10行一暂停,任意健继续进行俱乐部会员信息浏览)。
[模块流程图]
7.[浏览俱乐部交易信息模块]
[设计思路简述]
将磁盘上文本文件数据全部读入,并全部赋给结构体数组mem,将结构体数组所有元素中符合state>0的元素的各成员的信息全部输出,并采用分屏显示(每10行将有一暂停,任意健继续进行俱乐部会员信息浏览)。
[模块流程图]
8.[会员租借DVD模块]
[设计思路简述]
本模块设计比较复杂,主要是将磁盘上与两文本文件数据全部读入,并分别赋给两个结构体数组mem与dvd,通过查找算法找到会员与所借DVD对应的两结构体数组元素mem[j]、dvd[k],并对mem[j]所借的DVD信息进行添加,对dvd[k]状态信息改为可借出,最后将两结构体数组全部输入到与两文本文件当中。
[模块流程图]
9.[会员归还DVD模块]
[设计思路简述]
本模块设计与会员租借DVD模块设计相似,对会员结构体数组与DVD结构体数组的操作大体相反,即可完成程序对会员归还DVD的相关信息记录与处理功能。
[模块流程图]
10.[会员浏览账户信息模块]
[设计思路简述]
先将磁盘上文本文件全部读入,并赋给结构体数组mem,通过查找算法找到对应会员的mem[j],并将其全部信息输出。
[模块流程图]
【模块划分图示及程序流程图】
图示及流程图图标说明:
*说明:
以上各功能模块均会在[第四部分的设计、运行结果]中得以运行与实现。
第四部分:
程序设计数据、运行结果
本程序是一款应用软件,故数据设计、程序运行结果应在程序的运用中得以体现,现在通过一个程序的运用事例来对数据设计、程序运行结果进行演示与实现:
【软件运用举例】
李明通过朋友介绍想加入电影俱乐部,于是到俱乐部管理员面前说明了意向,俱乐部管理员启动电影俱乐部管理系统,程序欢迎界面如下:
管理员按任意健继续,程序出现了[用户登陆]及[新会员注册]菜单界面。
管理员输入[1],按[Enter]健,程序进入新会员注册界面([会员注册模块]),程序运行界面如下:
屏幕上显示出了[入会协会],李明认真阅读了入会协议,没有疑问,决定接受协议,管理员输入[1],并按下[Enter]确认接受协议并继续,程序接着提示新会员输入昵称、真实姓名、账户密码,根据李明的具体信息,完成新会员基本信息的填写后,程序提示是否进行账户充值,李明交给管理员20元,完成了账户的充值([会员账户充值模块])。
运行界面及充值结果如以下界面显示:
李明知道最近电影俱乐部刚进了一部电影《变形金刚》(真人版),于是要求登陆自己的账户租DVD碟([会员租借DVD模块]),程序相关运行界面如下:
李明回到[会员菜单],选择[会员详细账户查询]([会员浏览账户信息模块])功能,程序运行界面如下:
李明一口气又借了二张DVD,分别是《汽车总动员》《玩具总动员二》,帐户详情如下:
李明租借碟完毕后高兴地回家了。
此时管理员通过[电影俱乐部管理系统]添加新的DVD及浏览俱乐部所有DVD与会员信息、查看俱乐部的交易情况([添加DVD信息入库模块]、[浏览俱乐部DVD信息模块]、[浏览俱乐部会员信息模块]、[浏览俱乐部交易信息模块])。
程序运行的界面依次如下:
过了一个月后,李明去俱乐部归还DVD影片,此时俱乐部每个会员的帐户余额都产生了扣费(每人每月5元)([会员按月自动缴费模块]),以下是扣费前后每个会员的帐户余额的对比:
于是,李明归还影片[汽车总动员]([会员归还DVD模块]),并对帐户进行充值。
程序运行的相关界面如下:
*说明:
上述程序运行过程,程序的各模块均得以运行,并产生了准确的结果,由此可说明程序的准确性、可靠性,另外,如果想进一步了解程序,请通过操作具体的程序或查看程序源代码。
其中,源代码编译、链接可生成目标程序MOVICE~1,程序要还需要++三个数据文件,四者缺一不可。
第五部分:
程序的优缺点
【程序的优点】
算法是程序的灵魂,程序的优点首先表现在算法上的优点,其次才是功能上的。
[算法上的优点]主要体现在以下三点:
1.程序采用模块化设计,程序的主体的功能大都由各功能模块完成。
程序设计模块化有利于程序的进一步改进及有助于程序执行效率的提高。
2.程序对数据的读写采用了fread()与fwrite()函数,此数据的读取与存贮方式有利于磁盘数据的加密,即无法用记事本等程序对数据文件进行正常读取,即有助于数据的保护与加密。
另外,对磁盘文本数据的修改有多种方式,通过对比研究发现,本程序采用fwrite()函数一次性把所有修改过的结构体数组写入文本文件的修改方式,不仅克服了本次程序设计中文本文件不能顺利准确读取的难点,而且相较于传统的fprintf()函数的写入方式与创建临时交换文件的写入方式,写入效率明显提高。
具体可见[会员租借DVD模块][会员归还DVD模块]等相关模块。
3.程序执行次序控制、FOR循环、功能模块函数的巧妙结合。
例如[注册新会员]界面结束,可返回[用户欢迎]界面,主要是借助注册新会员模块返回的值来实现的。
另外,对结构体数组数据的修改采用了层次明显的程序步骤,有助于相应功能模块的准确高效运行。
当然,程序的源代码为白手写起,历时3天,克服了非常多的困难,感觉到了很大的压力。
程序的源代码是在边看书、边查资料、询问、长期思考与设计、调试、试验的基础上编写出来的,在编写程序的过程中,得到了许多的锻炼,编程的思维也得以塑造。
程序源代码经过数次精简,但仍然比较庞大,应是编程经验不足造成的,虽不能说本程序源代码比他人的类似代码运行效率更高,占有资源更少,但是程序执行的准确性还是能够保障的。
[功能上的优点]主要体现在以下三点:
1.简洁明了的程序菜单。
程序主要采用了四组层次不同的菜单,相互独立又相互联系,巧妙相接,符合用户的使用习惯与思维。
2.人性化的程序提示语言,程序提示语言较人性化,不仅大多为祈使语句、疑问句,而且提示明确,具有较强的明确的指导作用。
程序提示不仅层次分明,提示方式多样,而且提示信息井然有序,更加有利于用户顺利、准确地进行程序的操作。
3.智能化的模块设计。
程序的智能化主要体现在减少了许多人工操作。
例如智能化的会员扣费系统,无须管理员手动干遇,程序自动依据系统时间按月进行会费扣除操作,再如功能模块操作结束后,均会提示是否返回主菜单,并提示是否再进行类似的操作,这样给用户带来了操作的方便,大大提高了电影俱乐部的管理效率。
[当然本程序完全达到了C语言课程设计题目的所有要求,并且超额完成。
]即本程序[允许俱乐部成员租用DVD,若想成为会员,首先应签约并且可按月缴纳费用,会员一次可租用三个DVD,没有时间限制。
浏览所有可租用的DVD,新成员的开户,会员对其账户状况的查询以及俱乐部管理者对所有交易情况的查看。
]
除此以外,程序还根据实际情况,给程序添加了[向俱乐部添加新DVD]功能,便于DVD影片库的更新与丰富,与此同时,程序各模块开发设计依据了程序的具体实际的使用情景,而有所改进,使其更具有实用性。
【程序的缺点】主要表现在以下四点:
1.程序虽然经过多次精简,但仅仅是形式上、小范围的精简,仍未得到本质上的精简,即未找到更加简单、更加高效、更加合理、更小占用的资源的算法。
2.程序仍然存在不合理的地方,例如程序某些部分输入错误会导致程序中止或转向其他功能模块,即程序建议用户注意提示,进行合理的准确的输入,这样更有利于管理工作。
3.程序功能仍然不够完善。
例如程序没有[管理员对会员的删除功能模块][管理员对DVD的删除及DVD信息修改功能模块][会员信息修改的功能模块]。
4.操作界面为DOS界面,不符合时代潮流,也不符合现代用户操作的习惯,信息表达方式不丰富,比较单一,缺少图片、音乐等元化表达方式。
第六部分:
程序改进思路
本部分主要是针对第五部分[程序的优缺点]提出程序的改进思路。
【针对第一点:
程序算法精简问题】
>>改进思路:
1.算法上除了采用结构体数组外,考虑在程序的算法设计上引入链表结构,考察这样对数据组织存贮效率上是否具有提高作用。
2.就现有知识水平、经验来看,对我来说,本程序的算法设计上已经是最精简的了。
C语言知识博大精深,有必要对C语言的专著进行研究学习,多阅读别人的程序代码、多动手实践操作与设计,这样便对程序算法精简改进提供了可能。
【针对第二点:
用户输入错误问题】
>>改进思路:
对每个数据输入段代码进行更深的研究与分析,明确变量的类型、可能的数值,然后进行分类判断(if或switch语句),必要时借助for循环语句来控制程序进行,保障各模块运行相对独立,稳定准确执行各自功能。
典型方法是如果输入数据错误,通过printf输出问题,并用for或(do)while构成循环,直到用户输入正确为止。
【针对第三点:
程序功能完善问题】
>>改进思路:
[管理员对会员的删除功能模块]设计思路:
将磁盘上文本文件全部读入,并且全部赋给结构体数组mem,通过查找算法(综合fread、if与strcmp函数),找到相应的会员,将在其后的所以结构体依次向前进行结构体的整体赋值,新建方式打开一个文本文件,用fwrite将前(会员总数-1)个会员信息输出到文本文件当中。
[管理员对DVD的删除及DVD信息修改功能模块]设计思路:
[管理员对DVD的删除模块]与[管理员对会员的删除功能模块]设计思路类似,在此不述,而[管理员对DVD信息修改功能模块]可参照[会员租借、归还DVD模块]的设计方法。
[会员信息修改的功能模块]设计思路:
可参照[会员租借、归还DVD模块]的设计方法。
【针对第四点:
操作界面单调问题】
>>改进思路:
C语言是面向过程的语言,当时语言开发的程序主要是面向DOS用户,虽具有较强的绘图功能等等功能,但主要还是面向DOS的。
当今的主流语言是面向对象的语言,开发的平台大多为WINDOWS界面平台,开发的程序也主要是WINDOWS组件基础之上的图形界面程序,故可将程序要求移植到VC++之上,借助VC++强大的功能,编写WINDOWS界面程序,利用API接口函数方便调用各种WINDOWS强大功能,服务程序,使程序更加丰富、直观、生动、高效。
第七部分:
附录(源代码)
*原创*C语言源代码:
/*本代码为“电影俱乐部管理系统”源代码,代码为中国地质大学(武汉)041051班章斌原创,编写代码时多处采用原创的高效的算法。
*/
/*代码包含的函数库申明*/
#include
#include
/*定义DVD信息结构体*/
typedefstructDVDinfo
{
charNo[10];
charname[10];
intstate;
}DI;
/*定义会员信息结构体*/
typedefstructMemberInfo
{
charNo[10];
charname[10];
charpassword[20];
floatbalance;
DIborrowDVD[3];
intstate;
}MI;
/*会员按月自动缴费模块*/
voidmonth()
{
FILE*fp1;
FILE*fp2;
MImem[500];
intmonth;
intpmonth;
intcost;
intj;
inti;
structdatecurr_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)
{
cost=5*abs(month-pmonth);
for(j=0;fread(&mem[j],sizeof(structMemberInfo),1,fp2)!
=0;j++)
{
mem[j].balance-=cost;
}
rewind(fp2);
for(i=0;i}
fwrite(&month,sizeof(int),1,fp1);
fclose(fp1);
fclose(fp2);
}
/*会员注册模块*/
intreg()
{
FILE*fp;
MInewmem;
intchoice;
inti=0;
intresult;
fp=fopen("meminfo","r+");
clrscr();
printf("***************************************************\n");
printf("Pleasefillintheinformationofnewmembers\n");
printf("***************************************************\n");
printf("Themovieclubrules:
\n");
printf("1.Pleasepayforyourrentingeverymonthpermonth\n");
printf("2.Youareallowedtorentlessthan4DVDs\n");
printf("3.PleaseprotectDVDsyourentedfromclub\n");
printf("Ifyoudestoryit,youwillpayforit\n");
printf("4.Pleaserememberyourownpasswordthatisvery\n");
printf("important.Ifyouforgetit,youwillaffordall\n");
printf("---------------------------------------------------\n");
printf("Doyouagreeallabove?
\n");
printf("---------------------------------------------------\n");
printf("1.YES\n");
printf("2.NO\n");
printf("---------------------------------------------------\n");
printf("Yourchice:
\n");
scanf("%d",&result);
if(result==1)
{
printf("---------------------------------------------------\n");
printf("Pleaseinputyournickname:
\n");
scanf("%s",newmem.No);
printf("Pleaseinputyourtruename:
\n");
scanf("%s",newmem.name);
printf("Pleaseinputyourpassword:
\n");
scanf("%s",newmem.password);
for(;i<3;i++)
{
strcpy(newmem.borrowDVD[i].No,"");
strcpy(newmem.borrowDVD[i].name,"");
newmem.borrowDVD[i].state=0;
}
newmem.balance=0;
newmem.state=0;
if(fp==NULL)exit(0);
fseek(fp,0L,2);
fwrite(&newmem,sizeof(structMemberInfo),1,fp);
fclose(fp);
}
printf("------------------------------------\n");
printf("1.Increasingvalueofmybalancenow\n");
printf("2.Returntowelcomepage\n");
printf("------------------------------------\n");
printf("YourChoice:
");
scanf("%d",&choice);
if(choice==1)return
(2);
if(choice==2)return(-1);
}
/*添加DVD信息入库模块*/
intadddvd()
{
FILE*fp;
DInewdvd;
fp=fopen("dvdinfo","r+");
if(fp==NULL)exit(0);
clrscr();
printf("*****************************************\n");
printf("PleasefillintheinformationofnewDVD\n");
printf("*****************************************\n");
printf("PleaseinputDVDnumber:
\n");
scanf("%s",newdvd.No);
printf("PleaseinputDVDname:
\n");
scanf("%s",newdvd.name);
printf("PleaseinputDVDstate:
\n");
scanf("%d",&newdvd.state);
fseek(fp,0L,2);
f