购物卡管理系统课程设计.docx
《购物卡管理系统课程设计.docx》由会员分享,可在线阅读,更多相关《购物卡管理系统课程设计.docx(42页珍藏版)》请在冰豆网上搜索。
![购物卡管理系统课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/5/ed613385-46b0-4c15-a0fc-64eff7a2cd3f/ed613385-46b0-4c15-a0fc-64eff7a2cd3f1.gif)
购物卡管理系统课程设计
购物卡管理系统程序设计
一、题目要求:
设计购物卡管理系统,系统主要模块:
(1)实现系统内制卡、发卡功能;
(2)实现系统内账户及相关账户管理;
(3)实现卡交易和合法性检查;
(4)实现卡金融交易积分功能;
(5)实现卡报表功能;
(6)数据以文件形式存储。
【提示】
制卡:
指申请一张购物卡,但还没有使用。
发卡:
指该购物卡已经启用。
实现卡交易:
指从卡中消费掉一定的金额
二、需求分析
根据题目要求,由于数据要以文件形式存储,所以应提供文件的输入、输出等操作;在程序中要实现银行卡的各项功能,应提供制卡、发卡、存款、消费、查询账户相关信息、查询账户交易记录、查询全部信息、退出程序等一系列操作;另外还应提供键盘式选择菜单实现功能选择。
三、总体设计
分析了整个系统之后,根据上面的系统需求分析,可以将这个系统的设计分为如下七大模块:
制卡、发卡、存款、消费积分、查询账户相关信息、查询账户交易记录、查询全部信息
四、详细设计
1.主函数设计
主函数的设计比较简介,只包括一个主菜单函数,主要实现菜单功能,提供了菜单输入、模块选择、退出系统等模块的调用。
其中各功能模块用菜单方式选择。
【流程图】
【程序】
voidmain()
{
printf("\n\n\n\n\n\n\n\n\n");
printf("\t\t*********************购物卡管理系统************************\n");
printf("\n\n\n\t\t按任意键进入............");
getchar();
menu();
}
函数开头有“文件包含”的预处理命令,所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。
C语言提供了#include命令用来实现“文件包含”的操作。
在本程序中包含了一下头文件:
"string.h"、"ctype.h"、"stdio.h",方便调用库函数实现某些功能。
在程序设计中,只使用一些基本类型(或称简单类型)的变量(如整型、实型、字符型变量等)和构造类型数据——数组,是远远不够的。
有时候需要将不同类型的数据组合成一个有机的整体,以便于引用。
这些组合在一个整体中的数据是相互联系的。
在这个程序中,定义了一个结构体数组来存放购物卡用户的各种信息,包括账户卡号、户主姓名、账户余额、账户状态、账户积分,结构体如下:
structuser
{
intnum;/*账户号码*/
charname[20];/*户主名称*/
floatsurplus;/*账户余额*/
charstate[2];/*账户状态,y:
已启用,n:
未启用*/
intpoint;/*账户积分*/
}u[100];
同时在各分函数中,定义了int、float、char等一系列变量类型,用来实现函数功能。
在主函数前面,要加上对各功能函数的声明,声明的作用是把函数的名字、函数的类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查,例如函数名是否正确,实参与形参的类型和个数是否一致等。
主函数比较简单,但是函数的调用很多,所以,在程序的开头就加上了各函数的声明,如下:
voidc_c();/*制卡函数模块*/
voids_u();/*发卡函数模块*/
voidin_m();/*存款函数模块*/
voidout_m();/*取款函数模块*/
voidc_i();/*查询账户相关信息函数模块*/
voidc_r();/*查询账户交易记录函数模块*/
voidcheck();/*查询全部信息函数模块*/
voidmenu();/*主菜单函数模块*/
voidback();/*返回函数模块*/
voidcheck_b();/*给用户提示已有信息*/
实现菜单选择功能,使用的是switch语句,根据用户输入的菜单选项a,调用不同的函数实现各种功能:
switch(a)
{
case1:
c_c();break;/*制卡模块*/
case2:
s_u();break;/*发卡模块*/
case3:
in_m();break;/*存款模块*/
case4:
out_m();break;/*取款模块*/
case5:
c_i();break;/*查询账户相关信息模块*/
case6:
c_r();break;/*查询交易记录模块*/
case7:
check();break;/*查看所有信息模块*/
case8:
exit(0);break;/*退出模块*/
}
主菜单函数
[程序]
voidmenu()
{
intv,w1;
do
{
printf("\n\n\n\n");
printf("\t\t<________________________THEMENU_______________________>\n");
printf("\t\t||
(1)制卡操作||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||
(2)帐号激活||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||(3)帐户登陆||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||(4)报表操作||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||(5)退出||\n");
printf("\t\t||______________________________________________________||\n");
printf("\n\n\t\t请选择操作(1--5):
<>\b\b");
scanf("%d",&v);
if(v<1||v>5)
{
printf("\n\n\t\t**********输入有误!
************");
w1=1;
getchar();
}
elsew1=0;
}
while(w1==1);
switch(v)
{
case1:
made();break;/*制作*/
case2:
life();break;/*激活*/
case3:
enter();break;/*登陆*/
case4:
browse();break;/*报表*/
case5:
exit(0);/*退出*/
}
}
2、功能模块设计
2.1制卡模块
1、制卡
【数据结构】
所输入的数据信息在磁盘上以文本文件的形式保存,一条记录对应一个购物卡,既符合习惯也方便信息管理。
【分析】
制卡时需要把开卡的户主的信息输入,包括卡号、姓名、初始金额、是否开始使用此卡,并且还需要输出其信息。
把购物卡的卡号、姓名、密码、存款金额、消费金额、积分数作为结构体成员,存放在结构体数组:
structcredicard/*定义信用卡结构体*/
{
intnumber;
charname[20];
charID[20];
charword[8];
intflag;
floataccount;
intintegal;
intjifen;
}card[M];
【流程图】
【程序】
voidmade()/*制卡操作*/
{
inti;
charh[20];
do
{
printf("\n\n\t请输入要申请的号码:
<\t\t\t>\b\b\b\b\b\b\b");
scanf("%s",h);
if(strlen(h)!
=6)
{
printf("\n\n\n\t\t***************输入有误,请重新输入****************\n\n");
continue;
}
for(i=0;iif(strcmp(card[i].ID,h)==0)
{
printf("\n\n\t\t***********该号码已经存在,请重新输入************\n\n");
break;
}
}
while(((strlen(h))!
=6)||strcmp(card[i].ID,h)==0);
card[n].number=n;
strcpy(card[n].name,"***");
strcpy(card[n].ID,h);
strcpy(card[n].word,"000000");
card[n].flag=0;
card[n].account=0.00;
card[n].integal=0;
printf("\n\n\n\t\t********************制卡成功!
**********************\n\n");
print_one(n);
n++;
add();
menu();
}
2、显示卡的信息
【分析】
将刚制的卡的信息输出到屏幕。
【程序】
voidprint_one(intj)/*显示消息*/
{
printf("\n|----|--------------------|--------------------|----|----------|----------|");
printf("\n|NO.|name|ID|flag|account|integal|");
printf("\n|----|--------------------|--------------------|----|----------|----------|");
printf("\n|%4d|%20s|%20s|%4d|%10.2f|%10d|",
card[j].number,card[j].name,card[j].ID,card[j].flag,card[j].account,card[j].integal);
printf("\n|----|--------------------|--------------------|----|----------|----------|");
}
3、用文件的形式将卡保存
voidadd()/*写入文件*/
{
inti;
FILE*fp;
if((fp=fopen("score.txt","wb"))==NULL)
{
printf("\t\tCannotopenthefile\n");
return;
}
for(i=0;iif(fwrite(&card[i],sizeof(structcredicard),1,fp)!
=1)
{
printf("\t\tFilewriteerror\n");
return;
}
fclose(fp);
printf("\n\n\n\t\t************成功保存!
!
!
************");
}
2.2发卡模块
【分析】
该模块的功能是根据输入的卡号查找对应的记录,找到后可进行发卡,填写申请人的姓名、设置密码等操作,并决定是否激活。
最后登录此卡查看是否已激活,输出到屏幕。
【流
程图】
1、首先输入卡号进行激活该卡操作:
【程序】
voidhuo(intk)/*激活操作*/
{
charm[20],p[8];
intx,w2;
do
{
printf("\n\n\t\t是否激活该卡?
(1)是
(2)否\n");
printf("\n\t\t请选择卡号:
<>\b\b");
scanf("%d",&x);
if(x<1||x>2)
{w2=1;getchar();}
elsew2=0;
}
while(w2==1);
if(x==1)
{
printf("\n\n\t\t请输入姓名:
<\t\t\t>\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
scanf("%s",m);
strcpy(card[k].name,m);
printf("\n\n\t\t请输入六位数密码:
<>\b\b\b\b\b\b\b");
scanf("%s",p);
strcpy(card[k].word,p);
card[k].flag=1;
printf("\n\n\n\t\t********************激活成功!
**********************\n\n");
print_one(k);
add();
}
}
2、登陆该卡验证是否激活
【程序】
voidlife()/*登陆*/
{
intk=-1;
charh[20];
FILE*fp;
if((fp=fopen("score.txt","r"))==NULL)
{
printf("\t\tCannotopenthefile\n");
return;
}
for(n=0;!
feof(fp);n++)
{
fread(&card[n],sizeof(structcredicard),1,fp);
}
if(n==0)
printf("\n\n\t\t****************请先制卡*********************\n");
else
{
printf("\n\n\t请输入购物卡号码:
<\t\t\t>\b\b\b\b\b\b\b");
scanf("%s",h);
k=search(h);
if(k==-1)
printf("\n\n\t\t\t*****************该号码不存在!
****************\n");
else
{
if(card[k].flag==1)
printf("\n\n\t\t****************该卡已经激活!
*****************\n");
elsehuo(k);
}
}
menu();
}
intsearch(charh[20])
{
inti,k=-1;
for(i=0;iif(strcmp(card[i].ID,h)==0)k=i;
return(k);
}
3、进入该卡进行核对信息
【程序】
voidenter()/*进入*/
{
intk=-1;
charh[20];
if(n==0)
printf("\n\n\t\t****************请先制卡*********************\n");
else
{
printf("\n\n\t请输入购物卡号码:
<\t\t\t>\b\b\b\b\b\b\b");
scanf("%s",h);
k=search(h);
if(k==-1)
printf("\n\n\t\t\t*****************该号码不存在!
****************\n");
else
{
if(card[k].flag=0)
printf("\n\n\t\t************该卡还未激活,请先激活!
************\n");
else
hedui(k);
}
}
menu();
}
4、核对卡号密码
【程序】
voidhedui(intk)/*验证核对*/
{
intc=0,w3=0;
charp[8];
do
{
printf("\n\n\t\t*******请输入密码:
<>\b\b\b\b\b\b\b");
scanf("%s",p);
if(strcmp(card[k].word,p)!
=0)
{
printf("\n\n\t\t********密码不正确,请重新输入!
**********\n");
c++;
continue;
}
else
{
printf("\n\n\t\t**********密码正确!
***********\n");
w3=1;
menu1(k);
}
}
while(w3==0&&c<3);
}
5、核对户主信息并选择操作
【程序】
voidmenu1(intk)/*显示*/
{
intv,w4;
do
{
printf("\n\n\n");
printf("\t\t<_______________________THEMENU1_______________________>\n");
printf("\t\t||
(1)查询||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||
(2)存款||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||(3)消费||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||(4)修改密码||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||(5)返回主菜单||\n");
printf("\t\t||______________________________________________________||\n");
printf("\n\n\t\t请选择操作(1--5):
<>\b\b");
scanf("%d",&v);
if(v<1||v>5)
{w4=1;getchar();}
elsew4=0;
}
while(w4==1);
switch(v)
{
case1:
stat_one(k);break;
case2:
deposit(k);break;
case3:
fetch(k);break;
case4:
change(k);break;
case5:
menu();
}
}
2.3存款模块
【分析】
该模块的功能是在账户登录后,通过选择步骤进行对此卡进行此存款,最后以表格的形式将卡上的信息输出。
【流程图】
【程序】
voiddeposit(intk)
{
floata=0.00;
printf("\n\n\t\t请输入存款金额:
<\t\t>\b\b\b\b\b\b\b\b\b\b\b");
scanf("%f",&a);
card[k].account+=a;
printf("\n\n\t\t**********存款成功!
***********");
print_one(k);
add();
menu1(k);
}
2.4消费积分模块
【分析】
该模块的功能是使用该卡进行消费,最后以表格的形式将此卡现状输出到屏幕。
【
流程图】
【程序】
voidfetch(intk)/*消费*积分*/
{
floatb=0.00,jifen=0.00;
printf("\n\n\t\t请输入消费金额:
<\t\t>\b\b\b\b\b\b\b\b\b\b\b");
scanf("%f",&b);
if(b>card[k].account)
printf("\n\n\t\t**********余额不足!
*************");
else
{
card[k].account-=b;
card[k].integal=b;
card[k].jifen+=b;
printf("\n\n\t\t**********谢谢惠顾!
***********");
print_one(k);
add();
}
menu1(k);
}
2.5查询账户相关信息模块
【分析】
该模块的功能是在户主登录后对账户的信息进行查询,并且可以根据需要进行密码修改。
【选择程序】
voidmenu1(intk)/*显示*/
{
intv,w4;
do
{
printf("\n\n\n");
printf("\t\t<_______________________THEMENU1_______________________>\n");
printf("\t\t||
(1)查询||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||
(2)存款||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||(3)消费||\n");
printf("\t\t||------------------------------------------------------||\n");
printf("\t\t||(4)修改密码||\n");
printf("\t\t||---------------------------------------------