俱乐部DVD管理系统C语言.doc
《俱乐部DVD管理系统C语言.doc》由会员分享,可在线阅读,更多相关《俱乐部DVD管理系统C语言.doc(28页珍藏版)》请在冰点文库上搜索。
![俱乐部DVD管理系统C语言.doc](https://file1.bingdoc.com/fileroot1/2023-4/30/e50eb524-df84-4231-8734-f807f9289df3/e50eb524-df84-4231-8734-f807f9289df31.gif)
俱乐部DVD管理系统
题目要求
允许俱乐部成员租用DVD。
若想成为会员,首先应签约并且可按月缴纳费用。
会员一次可租用三个DVD,没有时间限制。
可浏览所有可租用的DVD,能实现新成员的开户,会员对其账户状况的查询以及俱乐部管理者对所有交易情况的查看功能。
需求分析
DVD信息和俱乐部会员信息用文件存储,提供文件的输入输出操作;注册新会员,提供文件的添加操作;实现按月交纳费用,提供文件的修改操作;浏览信息应提供显示操作;实现查询则提供文件的查找操作;另外提供键盘是选择菜单以实现功能选择。
总体设计
整体设计为会员注册模块,会员缴费模块,会员租用DVD模块,会员租用DVD模块,信息浏览模块和信息查询模块等。
选择菜单以实现功能选择。
如下图所示。
俱乐部管理系统
注册
缴费
归还
租用
浏览
查询
输信息
修改
详细设计
1主函数
主函数一般设计的比较简单,只提供输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
如下图所示。
voidmenu()/*实现键盘选择式菜单*/
{
intn,k;
do
{puts("\t\t*********************MENU*********************\n\n");
puts("\t\t\t\t1.enter");
puts("\t\t\t\t2.MemberRegister");
puts("\t\t\t\t3.MemberPayment");
puts("\t\t\t\t4.DVDReturn");
puts("\t\t\t\t5.DVDRent");
puts("\t\t\t\t6.MessageBrowse");
puts("\t\t\t\t7.MessageSearch");
puts("\t\t\t\t8.modify");
puts("\t\t\t\t9.Exit");
puts("\n\n\t\t*******************************************\n\n");
printf("Choiceyournumber(1-9):
[]\b\b");
scanf("%d",&n);
if(n<1||n>9)/*对输入的数字做判断*/
{k=1;getchar();}
elsek=0;
}while(k==1);
switch(n)/*switch函数实现功能选择*/
{case1:
enter();break;/*输入信息模块*/
case2:
Register();break;/*会员注册模块*/
case3:
Payment();break;/*会员缴费模块*/
case4:
Reback();break;/*会员归还DVD模块*/
case5:
Rent();break;/*会员租用DVD模块*/
case6:
Browse();break;/*信息浏览模块*/
case7:
Search();break;/*信息查询模块*/
case8:
modify();break;/*信息修改模块*/
case9:
exit(0);
}
}
开始
显示一系列功能选项
输入n,判断n是否是1-9
根据n的值调用各功能模块函数
结束
2各功能模块设计
(1)输入模块
【数据结构】
原始数据有两类:
一是会员信息,二是DVD信息;两个信息分别保存在两个文件中。
文件名分别为member.txt,dvd.txt。
采用结构体的形式把信息作为一个整体来处理。
会员的信息用结构体数组形式表示如下:
structMember
{
charname[20];
charsex[20];
intage;
chardvd1[20];
chardvd2[20];
chardvd3[20];
intdate;/*表示会员该缴费的时期*/
}Mem[M];/*member[m]中每个数组元素对应一个会员的信息*/
DVD的信息用结构体数组表示如下:
structDvd
{
charnum[20];
charname[20];
charperson[20];
intyes;/*yes=1表示DVD被借,yes=0表示DVD未被借*/
}Dvd[N];/*dvd[n]中每一个元素对应一个dvd的信息*/
开始
输入i选择想要输入的信息
i=1,调用函数enterM()
i=2,调用函数enterN()
结束
voidenterM()/*输入会员信息模块*/
{inti,m;
printf("howmanyMembers?
:
");
scanf("%d",&m);
printf("\nEnterMemberdatanow\n\n");
for(i=0;i{printf("\nintput%dthMemberrecord.\n",i+1);
printf("name\tsex\tage\tdvd1\tdvd2\tdvd3\tday\n");scanf("%s%s%d%s%s%s%d",Mem[i].name,Mem[i].sex,&Mem[i].age,Mem[i].dvd1,Mem[i].dvd2,Mem[i].dvd3,&Mem[i].date);}
saveM(m);/*调用保存函数*/
printf_back();/*一个任务结束时让用户选择是继续浏览还是返回*/
}
voidenterD()/*输入模块*/
{inti,n;
printf("howmanyDVDs?
:
");
scanf("%d",&n);
printf("\nEnterDVDdatanow\n\n");
for(i=0;i{printf("\nintput%dthDVDrecord.\n",i+1);
printf("number\tname\tperson\tyes\n");
scanf("%s%s%s%d",Dvd[i].num,Dvd[i].name,Dvd[i].person,&Dvd[i].yes);}
saveD(n);/*调用保存函数*/
printf_back();/*一个任务结束时让用户选择是继续浏览还是返回*/
}
voidenter()
{inti;
printf("whatdoyouwanttoenter?
1).Membermessage2).DVDmessage[]\b\b");
scanf("%d",&i);
switch(i)
{case1:
enterM();break;
case2:
enterD();break;
menu();/*如果输入的数字不是1-2,返回菜单栏*/
}
(2)注册模块
【需求分析】
该模块的功能是用会员的注册,从键盘输入并逐条写到原来的输入文件中。
如图所示。
开始
调用加载函数n=load()
并计算可以记录的个数n
输入用户要加载的记录个数m
K=n+m
调用输入函数
保存追加的记录
结束
voidRegister()/*追加模块*/
{
inti,n,m,k;
FILE*fp;
n=loadM();/*调用加载函数n=load(),并计算可以记录的个数*/
printf("Howmanymembersareyouwanttoadd(0-%d)?
:
",N-1-n);
scanf("%d",&m);/*输入要追加的记录个数*/
k=m+n;/*加载后结构体数组中元素的个数*/
if((fp=fopen("member.txt","ab"))==NULL)
{printf("cannotopenfile\n");
}
for(i=n;i{printf("\nInput%dthmemberrecord.\n",i-n+1);
input(i);/*调用输入函数*/
fwrite(&Mem[i],sizeof(structMember),1,fp);/*载入文件*/
printf("\n");
}
printf_back();/*一个任务结束时让用户选择是继续浏览还是返回*/
}
(3)缴费模块
【需求分析】
该模块的功能是记录会员的缴费情况以及进行修改。
如下图所示。
开始
输入日期
判断从0-n需要交费的会员
j=1,会员缴费
j!
=1,会员未交费
结束
voidPayment()/*修改模块*/
{inti,n,k,j;
n=loadM();/*调用加载函数n=load(),并计算可以记录的个数*/
printf("\nInputtoday'sday");
scanf("%d",&k);
for(i=0;i<=n;i++)
if(Mem[i].date\n",i+1);
scanf("%d",&j);/*如果会员该缴费的日期小于输入的日期显示该缴费*/
if(j==1)printf("memberhavepaid\n");
elseprintf("membernotpaid\n");}
printf_back();/*一个任务结束时让用户选择是继续浏览还是返回*/
}
注:
该函数的不足之处是显示会员缴费之后不能是文件中会员该缴费日期不会变。
必须利用修改模块进行修改。
(4)归还模块
【需求分析】
该模块的功能是管理DVD的情况,会员归还后消除会员记录和DVD的记录。
如下图所示。
结束
开始
输入会员号码以及要归还的DVD名
判断会员所借的DVD中等于要归还的DVD名的
等于,会员对应的DVD=0,DVD信息中yes=0
voidReback()
{inti,n;
printf("Inputthenumberofmember");
scanf("%d",&n);
printf("InputthenumberofDVD");
scanf("%d",&i);
if(Mem[n].dvd1==Dvd[i].name){strcpy(Mem[n].dvd1,'0');Dvd[i].yes=0;}
if(Mem[n].dvd2==Dvd[i].name){strcpy(Mem[n].dvd2,'0');Dvd[i].yes=0;}
if(Mem[n].dvd3==Dvd[i].name){strcpy(Mem[n].dvd3,'0');Dvd[i].yes=0;}
printf_back();/*一个任务结束时让用户选择是继续浏览还是返回*/
}
注:
该函数可是算是一个失败的函数,因为输入会员的号码后,程序根本没有默认,及归还会员所借的DVD之后,会员信息里并没有将原来所借的DVD归还,并且DVD信息中已归还的DVD的yes值并不归零,必须在利用修改模块进行信息的修改。
(5)租用模块
【需求分析】
该模块的功能是对会员借用DVD进行管理,先判断该会员能否再借用,可以后记录会员借用的DVD,同时DVD信息中也会记录下会员的姓名。
如下图所示。
开始
输入要租用DVD的会员以及要租用的DVD名
判断会员信息中DVD是否有等于零的
无,显示不能租借
有,为零的DVD等于要租用的DVD名,DVD信息中person等于会员名
结束
voidRent()
{inti,j;
printf("Inputthenumberofmember");
scanf("%d",&i);
printf("InputthenumberofDVDwhatyouwanttorent!
");
scanf("%d",&j);
if(Mem[i].dvd1!
=0||Mem[i].dvd2!
=0||Mem[i].dvd3!
=0)
printf("cannotrentanymore!
");/*判断该会员是否还可以借*/
elseif(strcmp(Mem[i].dvd1,’0’)){strcpy(Mem[i].dvd1,Dvd[j].name);Dvd[j].yes=1;strcpy(Dvd[j].person,Mem[i].name);}/*表示若dvd1为零,则借用成功*/
elseif(strcmp(Mem[i].dvd2,’0’)){strcpy(Mem[i].dvd2,Dvd[j].name);Dvd[j].yes=1;strcpy(Dvd[j].person,Mem[i].name);}
elseif(strcmp(Mem[i].dvd3,’0’)){strcpy(Mem[i].dvd3,Dvd[j].name);Dvd[j].yes=1;strcpy(Dvd[j].person,Mem[i].name);}
printf_back();}/*一个任务结束时让用户选择是继续浏览还是返回*/
(6)浏览操作
【需求分析】
该模块的功能是显示所有会员的记录信息。
开始
调用加载函数loadM()并计算个数
输出全部会员信息
调用加载函数loadN()并计算个数
输出全部DVD信息
结束
voidBrowse()/*浏览模块*/
{inti,j,n,x,y,z,k;
n=loadM();/*调用加载函数n=load(),并计算可以记录的个数*/
printf("\n\tnamesexagedvd1dvd2dvd3day\n");
for(i=0;i{if((i!
=0)&&(i%10==0))
{printf("\n\nPassanykeytocontiune\n");
getch();
}
printf_Mone(i);/*调用显示一个会员信息记录的函数*/
printf("\n");
}
printf("\n\tThereare%drecord.\n",n);
z=loadD();
printf("\n\tnumnamepersonyes\n");
for(i=0;i{if((i!
=0)&&(i%10==0))
{printf("\n\nPassanykeytocontiune");
getch();
}
printf_Done(i);/*调用显示一个DVD信息记录的函数*/
printf("\n");
}
printf("\tThereare%drecord.\n",z);
printf("\nPassanykeytoback");
getchar();
printf_back();/*一个任务结束时让用户选择是继续浏览还是返回*/
}
(7)查询操作
【需求分析】
该模块的功能是根据输入的会员的姓名查找对应的记录,找到以后可以进行增加,删除或修改信息的操作。
如下图所示。
注:
由于查询会员信息和查询DVD信息是一样的,因此流线图只呈现一种。
开始
输入会员姓名
查找该会员记录
找到则显示信息
没有则提示没有记录
结束
voidSearch()/*查询模块*/
{inti,n,m,k;
structMembers;
structDvdt;
n=loadM();/*调用加载函数n=load(),并计算可以记录的个数*/
printf("\n\nEntermembernamethatyouwanttosearch!
name:
");
scanf("%s",s.name);
printf("\n\tnamesexagedvd1dvd2dvd3day\n");
for(i=0;iif(strcmp(s.name,Mem[i].name)==0)/*通过字符串比较函数查找想要查询的会员*/
{printf_Mone(i);break;}/*调用显示找到会员信息记录的函数*
m=loadD();/*调用加载函数n=load(),并计算可以记录的个数*/
printf("\n\nEnterDVDnamethatyouwanttosearch!
name:
");
scanf("%s",t.name);
printf("\n\tnumnamepersonyes\n");
for(i=0;iif(strcmp(t.name,Dvd[i].name)==0)
{printf_Done(i);break;}
printf_back();/*一个任务结束时让用户选择是继续浏览还是返回*/
}
(8)修改模块
【需求分析】
程序要求中并没有要求有修改模块,但是在缴费模块中需要用到修改模块,而且,由于未知原因,租用模块和归还模块不能正常运行,也要用到修改模式进行修改,才能实现程序的可用性。
同样在此也只显示修改会员的信息,修改DVD信息是一样的。
输入要修改的会员名
开始
显示该会员的记录
输入新信息
新信息覆盖旧信息
结束
intmodify()
{inti,n,m,k;
structMembers;
structDvdt;
n=loadM();/*调用加载函数n=load(),并计算可以记录的个数*/
printf("\n\nEnternamethatyouwanttosearch!
name:
");
scanf("%s",s.name);
printf("\n\tnamesexagedvd1dvd2dvd3day\n");
for(i=0;iif(strcmp(s.name,Mem[i].name)==0)
/*运用查找模块,找到想要修改的会员的记录*/
{printf_Mone(i);
/*利用只显示一条会员信息函数,显示找到的会员信息*/
printf("\npleaseenterthemembermassages:
\nnamesexagedvd1dvd2dvd3date\n");
scanf("%s%s%d%s%s%s%d",s.name,s.sex,s.age,s.dvd1,s.dvd2,s.dvd3,s.date);/*输入新的信息*/
strcpy(Mem[i].name,s.name);
strcpy(Mem[i].sex,s.sex);
strcpy(Mem[i].dvd1,s.dvd1);
strcpy(Mem[i].dvd2,s.dvd2);
strcpy(Mem[i].dvd3,s.dvd3);/*利用字符串复制将新信息载入文件*/
Mem[i].age=s.age;
Mem[i].day=s.day;/*整型就直接赋值*/
}
m=loadD();/*调用加载函数n=load(),并计算可以记录的个数*/
printf("\n\nEnternamethatyouwanttosearch!
name:
");
scanf("%s",t.name);
printf("\n\tnumnamepersonyes\n");
for(i=0;iif(strcmp(t.name,Dvd[i].name)==0)
{
printf_Done(i);
printf("pleaseenterthedvdmassages:
numnamepersonyes\n");
scanf("%s%s%s%d",t.num,t.name,t.person,t.yes);
strcpy(Dvd[i].num,t.num);
strcpy(Dvd[i].name,t.name);
strcpy(Dvd[i].person,t.person);
Dvd[i].yes=t.yes;
}
printf_back();/*一个任务结束时让用户选择是继续浏览还是返回*/
}
3公共函数
下面介绍一些在每个功能模块中都有可能会用到的一些公共函数。
(1)保存函数save(intn)
【说明】
形参m控制保存的个数。
该模块的功能是将输入的信息保存到文件中。