C语言课程设计报告1.docx
《C语言课程设计报告1.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告1.docx(27页珍藏版)》请在冰豆网上搜索。
![C语言课程设计报告1.docx](https://file1.bdocx.com/fileroot1/2023-5/23/6cb3c7d3-afbc-41da-ae7e-95537dd32d73/6cb3c7d3-afbc-41da-ae7e-95537dd32d731.gif)
C语言课程设计报告1
银行卡管理系统
一、题目要求
请设计《银行卡管理系统》,要实现系统的主要功能模块有:
(1)实现系统内制卡、发卡功能;
(2)实现系统内卡帐户几相关帐户管理;
(3)实现卡交易和合法性检查;
(4)实现卡金融交易积分功能;
(5)实现卡报表功能;
(6)数据以文件形式存储。
[提示]
制卡:
指申请一个银行卡,但还没有使用。
发卡;指该卡已经起用。
实现卡交易:
指从卡中消费掉一定金额。
二、需求分析
根据题目要求,由于数据以文件形式存储,因此应该提供文件的输入和输出等操作;在程序中需要浏览卡帐户信息,应提供显示、查找等操作;另外还应该提供键盘式选择采单实现功能选择。
三、总体设计
根据需求分析,可以将这个银行卡系统的设计分为5个模块:
制卡、发卡、管理、交易、报表。
银行卡管理系统
报表
交易
管理
发卡
制卡
四、详细设计
1.主函数
主函数比较简洁,只提供输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
[流程图]
显示功能选项
输入n,判断n是否是0-6
N
根据n的值调用个功能模块函数
Y
将main()函数体内的界面选择部分语句单独抽取出来作为一独立函数,便于系统执行完每部分功能模块后能够方便返回到系统界面。
[程序]
voidmenu()
{
intn,w1;
/*变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围内*/
do
{
voidnew_card();
voiduse_card();
voidconduct();
voidtransaction();
voidform();
puts("\n\t\t*********************MENU*********************\n\n");puts("\t\t\t\t1.Newcard");
puts("\t\t\t\t2.Usecard");
puts("\t\t\t\t3.Accountconduct");
puts("\t\t\t\t4.Transaction");
puts("\t\t\t\t5.Reportform");
puts("\t\t\t\t6.Exit");
puts("\n\n\t\t*********************************************\n");
printf("Choiceyournumber(1-6):
[]\b\b");
scanf("%d",&n);
if(n<1||n>6)/*对选择的数字作判断*/
{
w1=1;
getchar();
}
elsew1=0;
}while(w1==1);
/*选择功能*/
switch(n)
{case1:
new_card();break;
case2:
use_card();break;
case3:
conduct();break;
case4:
transaction();break;
case5:
form();break;
case6:
exit(0);
}
}
main()
{menu();
}
2.各功能模块设计
(1)制卡模块
[需求分析]
该模块的功能是增加新的卡,也就是新的帐户,让系统自动设置帐户原始信息(卡号自动加1,用户名为NO,钱数和积分都为0)。
采用追加的方式保存。
[分析]
由题目知,系统内的数据有卡号、姓名、钱数和积分。
单独看各数据信息,卡号和积分是整数,可以采用整型;姓名是字符型,采用字符型数组;钱数有可能为小数可采用实型。
数据信息存放在文件中,一条记录对应一个帐户。
用结构体数组存放若干个帐户信息。
structuser
{
intnum;
charname[10];
floatmoney;
intscore;
}user[30];
[流程图]
调用加载函数n=load_user(),并计算可以记录个数n
保存追加的记录
设置要追加的帐户数据
[程序]
/**************制卡模块****************/
voidnew_card()/*制卡模块*/
{intn,i;
n=load_user();
user[n+1].num=n+1;/*设置帐户数据*/
strcpy(user[n+1].name,"NO");/*设置帐户数据*/
user[n+1].money=0;user[n+1].score=0;/*设置帐户数据*/
save(n+1);
printf_onedata(n+1);
menu();
}
(2)发卡模块
[需求分析]
该模块的功能是起用新的卡,就是把新的卡的用户名设置为实际用户的名字,钱数和积分以用户的实际数据设置,从键盘中输入并写到原来输入文件中。
[流程图]
调用加载函数n=load_user();并计算可以记录个数n
输入要起用的卡数c
查找用户名为NO的卡
是否找到此卡
b>=c
记录找到的卡数b
返回菜单
YN
调用命名函数,修改帐户信息
保存修改记录
返回菜单
NY
[程序]
/***************发卡模块**************8*/
voiduse_card()/*发卡模块*/
{intn,c,b=0,i,k=-1;
n=load_user();
printf("Howmanynewcardsdoyouwant?
[]\b\b");
scanf("%d",&c);/*输入需要的卡数*/
for(i=0;iif(strcmp(user[i].name,"NO")==0)
{k=i;b+=1;
if(b>=c)printf("\nThereisanewcard!
\n");name(i);/*调用命名函数*/
else
menu();
}
if(k==-1)
{printf("\nthereisnonewcard!
\n");menu();}
}
(3)管理模块
[需求分析]
该模块的功能有两个,一是显示所有帐户记录,二是根据输入的卡号查找对应的帐户信息。
该模块采用菜单的形式分成3个部分:
浏览模块,查找模块,退出。
[流程图]
显示功能选项
输入n,判断n是否是0-3
N
Y
根据n的值调用个功能模块函数
[程序]
/*****************管理模块******************/
voidconduct()
{intn,w1;
do
{
voidbrowse_data();
intsearch_data();
puts("\n\t\t********************MENU********************\n\n");
puts("\t\t\t\t1.Browseall");
puts("\t\t\t\t2.Search");
puts("\t\t\t\t3.Back");puts("\n\n\t\t********************************************\n");
printf("Choiceyournumber(1-3):
[]\b\b");
scanf("%d",&n);
if(n<1||n>3)
{
w1=1;
getchar();
}
elsew1=0;
}while(w1==1);
switch(n)
{case1:
browse_data();break;
case2:
search_data();break;
case3:
menu();break;
}
}
(4)浏览模块
[需求分析]
该模块的功能是显示所有帐户信息。
[流程图]
显示帐户信息(10个一屏)
按任意键显示下一屏
按任意键返回菜单
[程序]
/*********************浏览模块***********************/
voidbrowse_data()/*浏览模块*/
{intn;
n=load_user();
printf_data(n);
printf_back();
}
(5)查找模块
[需求分析]
该模块的功能是根据输入的卡号查找对应的帐户信息。
查找完就返回到管理模块的菜单。
[流程图]
输入要查找的卡号
是否找到此
帐户信息
YN
显示找到的帐户信息
提示没有找到
询问用户是否继续查找
YN
返回管理模块菜单
让用户选择1)查找另一个
2)返回管理模块菜单
[程序]
/******************查找模块********************/
voidsearch()/*查找模块*/
{inti,n,k,w1,w2,w3;
structuseru;
n=load_user();
do
{
do
{k=-1;
printf("\n\nEnternumberthatyouwanttosearch!
NO:
");
scanf("%d",&u.num);/*输入要查找的卡号*/
for(i=0;iif(u.num==user[i].num)
{k=i;printf_onedata(k);}
if(k==-1)
{printf("\n\nNoexist!
please");
printf("\n\nAreyouagain?
\n\t1>.again2>.Noandback[]\b\b");
scanf("%d",&w1);
if(w1==2){menu();break;}
}
}while(k==-1&&w1==1);
printf("\n\nwhatdoyouwanttodo?
\n\t1>.Searchanother2>.Backmenu[]\b\b");
scanf("%d",&w2);
}while(w2==1);
conduct();
}
(6)交易模块
[需求分析]
该模块的功能是实现用户普通交易和金融交易,对交易后卡内钱数扣减和积分的增添。
该模块有3部分:
普通交易,金融交易,返回。
[流程图]
输入要进行交易的卡号
是否找到此
帐户信息
YN
提示没有找到
显示找到的帐户信息
返回管理模块菜单
让用户选择1)普通交易
2)金融交易3)返回
[程序]
/******************交易模块********************/
voidtransaction()/*交易模块*/
{inti,w2;
voidprintf_face(inti);
i=search_data();
if(i!
=-1)printf_face(i);/*调用显示菜单函数*/
}
voidprintf_face(inti)/*显示菜单函数*/
{intw2;
printf("\n\nWhatdoyouwanttodo?
\n\t1>.commontransaction2>.financialtransaction3>.back[]\b\b");
scanf("%d",&w2);
switch(w2)
{case1:
common(i);break;
case2:
financial(i);break;
case3:
menu();break;
}
}
(7)普通交易模块
[需求分析]
该模块的功能是根据用户输入的交易数据进行钱数的扣减,然后保存修改。
[流程图]
输入要交易的金额
交易金额是否大于或等于卡内金额
YN
询问用户是否继续交易
进行钱数的扣减并保存
提示输入错误
YN
让用户选择1)再交易
2)返回交易模块菜单
返回交易模块菜单
[程序]
voidcommon(inti)/*普通交易模块*/
{intt,n;
floatw;
load_user();
printf("Imputhowmuch:
[]\b\b");
scanf("%d",&w);/输入交易金额*/
if(user[i].money>=w)
{printf("\nItisallowed!
\n");
user[i].money-=w;
save(i);
}
elseprintf("\nInputError!
\n");
printf_face(i);
}
(8)金融交易模块
[需求分析]
该模块的功能是根据用户输入的金融交易数据进行钱数的扣减和积分的增添,然后保存修改。
[流程图]
输入要交易的金额
交易金额是否小于或等于卡内金额
YN
进行钱数的扣减和积分的增添并保存
提示输入错误
询问用户是否继续交易
YN
返回交易模块菜单
让用户选择1)再交易
2)返回交易模块菜单
[程序]
/*******************金融交易模块*********************/
voidfinancial(inti)/*金融交易模块*/
{intt,n;
floatw;
load_user();
printf("Imputhowmuch:
[]\b\b");/*输入交易今额*/
scanf("%d",&w);
if(user[i].money>=w)
{printf("\nItisallowed!
\n");
user[i].money-=w;
user[i].score=w;
save(i);
}
elseprintf("\nInputError!
\n");
printf_face(i);/*调用显示菜单函数*/
}
(9)报表模块
[需求分析]
该模块的功能是显示用户需要显示的帐户信息。
先根据用户输入的卡号查找对应的帐户信息,再显示在屏幕上。
[流程图]
让用户选择是否报表1)是
2)否,退出
(1)
(2)
让用户选择1)查找
2)返回主菜单
(2)
(1)
显示找到的帐户信息
返回主菜单
[程序]
/************************报表模块*************************/
voidform()/*报表模块*/
{intw;
printf("\nDoyouwanttoseetheform?
\n\t1>.YES2>.NOandBack[]\b\b");
scanf("%d",&w);
switch(w)
{case1:
search_data();menu();/*调用查找函数*/
case2:
menu();break;/*返回主菜单*/
}
getch();
}
3.公共函数
下面是在每个功能模块中都有可能用到的一些公共函数。
(1)加载函数load_user()
[说明]
该函数可以用来加载所有记录,并且可以返回所有记录的个数。
[程序]
/*加载记录或可以计算记录个数的函数*/
intload_user()/*加载记录或可以计算记录个数的函数*/
{FILE*fp;inti;
if((fp=fopen("USER.txt","r"))==NULL)/*以输出打开方式,在此前的记录被覆盖*/
{printf("\nCannotopenfile\n");
exit(0);
}
for(i=0;!
feof(fp);i++)
fscanf(fp,"%d%s%f%d\n",&user[i].num,user[i].name,&user[i].money,&user[i].score);
fclose(fp);
return(i);/*返回记录个数*/
}
(2)保存函数save(intn)
[说明]
形参n控制保存的个数。
[程序]
/*保存函数*/
voidsave(intn)/*保存函数,保存n个记录*/
{FILE*fp;
if((fp=fopen("USER.txt","a"))==NULL)/*以加载打开方式,数据加在文件末尾*/
{printf("\nCannotopenfile\n");
exit(0);}
fprintf(fp,"%d%s%d%d\n",user[n].num,user[n].name,user[n].money,user[n].score);
fclose(fp);
}
(3)命名函数name(inti)
[说明]
该函数是为新卡命名,达到起用卡的作用。
[程序]
/*命名函数*/
voidname(inti)/*命名函数*/
{charc[10];
ntb,j;
floata;
printf("Inputthename:
\b\b");
scanf("%s",c);/*输入用户名*/
strcpy(user[i].name,c);/*命名*/
printf("Inputthenumandscore:
\b\b");
scanf("%d,%d",&a,&b);
user[i].money=a;
user[i].score=b;
printf_onedata(i);
save(i);/*保存*/
}
(4)显示函数printf_data(intm)
[说明]
形参m表示第m个用户记录
[程序]
/*显示函数printf_data(intm)*/
voidprintf_data(intm)
{intj,n;
n=load_user();
for(j=0;j{if((j!
=0)&&(j%10==0))
{printf("\nPassanykeytocontinue...\n");
getch();
puts("\n\n");
}
printf_onedata(j);/*调用显示一个记录的函数*/
}
printf("\nThereare%drecord.\n",n);
printf("\nPassanykeytoback...");
getch();
menu();
}
(5)返回结构函数printf_back()
[程序]
/*返回结构函数*/
voidprintf_back()/*返回结构函数*/
{intk,w;
printf("\n\n\tSuccessful.^_^.\n\n");
printf("Whatdoyouwanttodo?
\n\n\t1>Exit.\t2>.Back:
[]\b\b");
scanf("%d",&w);
if(w==1)exit(0);
elseconduct();
}
(6)显示一个记录的函数printf_onedata(intj)
[说明]
形参j表示第j个用户记录
[程序]
/*显示一个记录的函数*/
voidprintf_onedata(intj)/*显示一个记录的函数*/
{printf("\nuser_numuser_nameuser_moneyuser_score\n");
printf("%2d%4s%8f%8d\n",user[j].num,user[j].name,user[j].money,user[j].score);
}
(7)另一查找函数search_data()
[程序]
/*另一查找函数*/
intsearch_data()/*另一查找函数*/
{inti,n,k,w1=1,w2,w3,w4;
structuseru;
n=load_user();
do
{k=-1;
printf("\n\nEnternumberthatyouwanttosearch!
NO:
");
scanf("%d",&u.num);
for(i=0;iif(u.num==user[i].num)
{k=i;printf_onedata(k);break;
}
if(k==-1)
{printf("\n\nNoexist!
please");
printf("\n\nAreyouagain?
\n\t1>.again2>.Noandback[]\b\b");
scanf("%d",&w1);
if(w1==2){menu();break;}
}
}while(k==-1&&w1==1);
return(k);
}
五、上机操作
1.数据源
001liang1112112
002liang2121161
003liang3111111
004liang4111161
005liang5151111
006liang6111171
007liang7117181
008liang8111191
009liang9181111
010liang10111311
011liang11181111
012liang12111111
013liang13191191
014liang14154117
015liang15113121
2.编译、连接和运行
3.结果
下面是各个模块的界面图:
(1)主菜单函数
(2)制卡模块
在主界面出现后输入1回车看见下图:
(3)发卡模块
在主界面上输入2回车,再根据提示输入数据,可以看见下图:
(4)管理模块
(5)浏览模块
在管理模块界面出现后按1