c语言饭卡管理系统课程设计报告Word格式文档下载.docx
- 文档编号:21624767
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:38
- 大小:478.06KB
c语言饭卡管理系统课程设计报告Word格式文档下载.docx
《c语言饭卡管理系统课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《c语言饭卡管理系统课程设计报告Word格式文档下载.docx(38页珍藏版)》请在冰豆网上搜索。
在主菜单中选择5,注销旧饭卡。
在主菜单中选择6,要求用户输入饭卡号和挂失信息,然后更新该饭卡的挂失信息。
在主菜单中选择7,
在主菜单中选择0,显示“感谢使用本软件!
已正常退出,按任意键结束。
”按任意键退出本系统。
第2部分《饭卡管理系统》的设计与功能实现
1.总体设计
图1初始的主模块
图2细分后的主模块图
2.数据结构
例如:
structcard
{charname[10],num[10];
floatyu,sum;
intguashi;
};
num[10]表示学号放在一维数组中,name[10]表示姓名放在一维数组中,yu表示余额,sum表示消费金额的累积,guashi表示挂失的情况。
3.算法设计
图3主函数流程图
图4建立饭卡模块流程图
图5买饭模块流程图
图6续钱模块流程图
图7添加新饭卡模块流程图
图8注销旧饭卡模块流程图
图9设置与解除挂失模块流程图
图10创新功能模块流程图
4.程序代码设计
采用模块化的思想,按照“自顶向下,逐步细化”的原则设计算法。
(1)菜单的设计
1,本例需要输出主菜单选择界面,简单菜单的制作可利用printf函数实现。
用printf函数将菜单项逐一打印到屏幕上,界面中的边框可以通过多个printf函数输出的“|”和“-”拼接起来。
2,菜单应根据用户的选择做出不同的反应,因此需要使用分支结构实现选择选项的功能。
根据题意,主菜单含有8个菜单选项,属于多分支条件判断,使用带break和switch语句最为合适。
3,因为本例具有重复选择主菜单选项的功能,因此需要使用循环结构。
在本例中菜单至少要显示一次,随后才判断是否继续选择主菜单,所以使用do-while循坏比较好,因为do-while循坏是先执行循环体,然后再判断表达式。
4,作为菜单,应该给用户一个正常的出口,即满足一定条件时退出程序。
为了给用户提供方便,我们采用人机对话形式,当用户选择某一菜单项后,系统立即完成相应的功能,然后询问用户是否需要继续选择,只要用户继续选择(输入y或Y),主菜单就会在屏幕上反复出现,只有当用户不再选择(输入N或n),才可退出主菜单。
除此之外,为了使用方便,在主菜单中还特设0选项,选择它也能正常退出程序。
为了实现上述功能,有关语句都应放在do-while循环体中。
选择选项的程序段可设计成如下形式:
choose=getchar();
switch(choose)
{
case'
1'
:
mycreat();
break;
2'
mybuy();
3'
myaddyu();
4'
myaddcard();
5'
myzhuxiao();
6'
mysetguashi();
7'
mynew();
0'
{printf("
\n非常感谢使用本软件!
\n已正常退出,按任意键结束...."
);
exit(0);
}break;
default:
\n该选项非法!
"
}
(2)设计各模块的算法,这是逐步细化的过程。
1,建立饭卡模块,函数名mycreat。
在该模块中输入学生的卡号,姓名,充值钱数,并将它们存放在文件中;
每输入一组数据,记录数增1。
建立饭卡的程序设计如下:
voidmycreat()
inti=1;
structcardtemp={0};
FILE*fp=NULL;
charyes_no='
\0'
;
temp.guashi=0;
temp.sum=0;
system("
cls"
fp=fopen("
D:
\\饭卡管理系统\\files\\card.dat"
"
a"
if(fp==NULL){printf("
\n\n饭卡文件丢失!
按任意键继续..."
getchar();
else
{
fclose(fp);
do
{
printf("
\n请输入第%d个记录:
\n\n"
i);
卡号:
scanf("
%s"
&
temp.num);
if(myexist(temp.num)!
=1)
{
fp=fopen("
printf("
姓名:
scanf("
temp.name);
充值钱数:
%f"
temp.yu);
fprintf(fp,"
%10s%10s%20.2f%4d%20.2f\n"
temp.num,temp.name,temp.yu,temp.guashi,temp.sum);
fclose(fp);
i++;
}
elseprintf("
卡号重复!
\n"
\n请问您要继续吗?
do
yes_no=getchar();
}while(yes_no!
='
Y'
&
yes_no!
y'
N'
n'
}while(yes_no=='
||yes_no=='
}
}
在文件夹中寻找已输入的卡号用函数myexist系统自动用循环将文件中读入的学
号一一做比较。
用fp=fopen("
追加打开文件,输入学生的姓名,充值钱数,并将它们存放在文件中;
用do---while语句实现人机对话的功能,机器问用户是否继续,如果继续就接着建立新饭卡,否则返回主菜单。
2,买饭设计模块,函数名mybuy.
voidmybuy()
system("
fp=fopen("
r"
while(feof(fp)==0)
{fscanf(fp,"
%s%s%f%d%f"
temp[i].num,temp[i].name,&
temp[i].yu,&
temp[i].guashi,&
temp[i].sum);
i++;
fclose(fp);
printf("
\n请输入卡号:
num_temp);
if(myexist(num_temp)==-1)printf("
\n卡号不存在!
elseif(myguashi(num_temp)==1)printf("
\n本卡已冻结!
elseif(myyu(num_temp)==0)printf("
\n余额不够,请续费!
else
{for(j=0;
j<
i;
j++)
if(strcmp(num_temp,temp[j].num)==0)break;
\n请输入消费金额:
money);
\n卡号姓名余额\n"
\n消费前:
%-10s%-10s%-10.2f\n"
temp[j].num,temp[j].name,temp[j].yu);
\n消费后:
temp[j].num,temp[j].name,temp[j].yu-money);
temp[j].yu=temp[j].yu-money;
temp[j].sum=temp[j].sum+money;
w"
for(j=0;
i-1;
fprintf(fp,"
temp[j].num,temp[j].name,temp[j].yu,temp[j].guashi,temp[j].sum);
\n\n此次消费成功!
按任意键返回主菜单....."
getch();
return;
\n\n此次消费失败!
按任意键返回主菜单..."
判断卡号存在模块:
函数名myexist。
系统自动用循环将文件中读入的学号一一做比较。
判断卡号挂失情况模块:
函数名myguashi。
系统自动用if---else语句判断挂失情况。
判断卡号余额情况模块:
函数名myyu。
系统自动用if---else语句分别判断卡号余额是否充足。
3,续钱设计模块,函数名myaddyu。
voidmyaddyu()
%s%s%f%d%f\n"
i++;
\n\n请输入卡号:
num_temp);
if(myexist(num_temp)==1&
myguashi(num_temp)==0)
{if(strcmp(num_temp,temp[j].num)==0)
{printf("
\n请输入续费金额:
续费前:
%-10s%-10s%-10.2f\n\n"
续费后:
%-10s%-10s%-10.2f\n"
temp[j].num,temp[j].name,temp[j].yu+money);
temp[j].yu=temp[j].yu+money;
for(k=0;
k<
k++)
temp[k].num,temp[k].name,temp[k].yu,temp[k].guashi,temp[k].sum);
\n\n续费成功!
按任意键返回主菜单......"
\n\n卡号不存在或已挂失!
判断卡号存在情况:
判断挂失情况:
用for循环结构找寻对应的学号,并输入续费金额,使续费成功。
备注:
以下函数为续钱设计模块的子函数:
temp[k].num,temp[k].name,&
temp[k].yu,&
temp[k].guashi,&
temp[k].sum);
k++;
for(i=0;
i<
k;
i++)
{if(strcmp(num,temp[i].num)==0)
{flag=1;
returnflag;
4,添加新饭卡模块,函数名myaddcard。
添加饭卡模块设计程序如下:
voidmyaddcard
{inti=0;
structcardtemp={0};
FILE*fp=NULL;
charyes_no='
temp.guashi=0;
temp.sum=0;
if(fp==NULL){printf("
\n饭卡文件丢失!
do
i+1);
if(myexist(temp.num)!
=1)
}elseprintf("
\n卡号重复!
\n\n要继续吗?
do{yes_no=getch();
}while(yes_no!
}while(yes_no=='
没有找到,符合条件并输入学生的姓名,充值钱数,并将它们存放在文件中;
5,注销旧饭卡模块,函数名myzhuxiao。
fclose(fp);
if(myexist(num_temp)==1)
if(strcmp(num_temp,temp[j].num)==0)
for(k=j;
temp[k]=temp[k+1];
\n注销成功!
\n%s不存在!
查找学生饭卡卡号用比较函数strcmp(num_temp,temp[j].num)==0。
用for循环语句利用数组的替换使学生饭卡被注销。
6,设置与解除挂失模块,函数名mysetguashi。
|******************************************|\n"
|请输入选项编号(0~2)|\n"
|1--设置挂失|\n"
||\n"
|2--解除挂失|\n"
|0--返回|\n"
\n请输入操作编号"
if(choose=='
)
if(myexist(num_temp)==1)
temp[j].guashi=1;
\n设置成功!
}else{printf("
\n此卡不存在!
elseif(choose=='
temp[j].guashi=0;
%10s%10s%20.2f%4d%20.2f%\n"
此卡不存在!
用if---else语句分别选择设置和解除挂失功能。
以下函数为设置与解除挂失的子函数:
intmyguashi(charnum[10])
{FILE*fp=NULL;
structcardtemp[N]={0};
inti=0,j;
{if(strcmp(num,temp[j].num)==0)
if(temp[j].guashi==1)
return1;
return0;
7,创新功能模块,函数名mynew。
do
fp=fopen("
if(fp==NULL){printf("
\n打开文件失败!
while(feof(fp)==0)
fscanf(fp,"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 管理 系统 课程设计 报告