首页 > 代码库 > 银行储蓄系统的设计与实现
银行储蓄系统的设计与实现
作者:夏晓林
地点:烟大计控
时间:2017.04.23
题目描述:
模拟银行柜台业务的要求,实现一个小型的银行储蓄系统软件的开发,其中包括开户、存款、取款、转账、改密、挂失、解挂、销户等功能。
在开发过程中,请按照问题求解过程的要求,体验开发过程中需要做的工作。除了下面的系统基本功能的描述外,鼓励开展调研,使开发的软件尽量符合实际的银行储蓄系统的实际业务内容。可以参考8.1节中关于选用合适的数据结构的讨论,确定数据存储方案。
要求在程序运行过程中或者程序结束运行之前,将业务发生的数据保存到文件中,并在下一次运行时,能从文件中读取数据,使业务能够继续在原有的基础上开展。可以使用文本文件,也可以使用二进制文件。
根据模块化程序设计的要求,将各功能设计成独立的函数实现。必要时,提取出公共的功能设计专门的函数,作为支持各函数中的子功能要调用的模块。建议设计“”菜单“”式的操作界面,方便用户的使用。
各功能的要求分别如下:
(1)开户:增加一个银行账户,输入账号、姓名、密码、金额、状态自动设置为0(正常)。建议输入密码的过程中,以*号代替实际输入的符号显示出来(实际方法请利用搜索引擎获得帮助)。作为对密码的设置,在输入一次密码后,需要再次输入密码,两次输入一致后,才接受并保存。由于设置了密码,其他业务都需要 在输入账号密码斗殴正确后才能继续。
(2)存款:输入账号、金额,增加该账号的金额
(3)取款:输入账号、金额,减少取款的金额。要求取款额不能超过原余额
(4)查询:输入账号,显示账户信息。
(5)转账:输入转出的账号及金额以及转入的账号,减少转出账号的金额,增加转入账号的金额。要求转出账户的金额不能超过该账号的余额,转出减少的金额,与转入账户增加的金额相同。
(6)挂失:输入账号,将其状态变为1(挂失)。处于挂失状态的账户,不能进行除解挂以外的任何操作。
(7)解挂:输入账户,将其状态变为0。
(8)销户:输入账号,确认后,提示将余额全部取完,将余额置为0,并将状态state置为2(销户)。办理销户的账号,不能再执行除查询以外的功能。
(9)改密:用新密码代替旧密码。新密码要求输入两次,一致后才确认改密成功。
C语言代码:
#include <stdio.h> #include <stdlib.h> #include<ctype.h>//isdigit函数的头文件 #include <conio.h>//getch()的头文件 #define NumMax 1000 int N; void OpenAccount();//开户 void SaveMoney();//存款 void DrawMoney();//取款 void Inquire();//查询 void TransferAccounts();//转账 void ReportTheLoss();//挂失 void SolutionToHang();//解挂 void ClosingAccount();//销户 void ChangeThePassword();//改密 int search();//判断账号的位置 int InputPassword();//输入密码 int judge(); typedef struct { int num;//账号 char name[20];//用户名 int password;//密码 double balance;//余额 int status;//状态:0正常 1挂失 2销户 } Account; Account user[NumMax]; int main() { int i=0,a; FILE *fp; if ((fp=fopen("account.txt", "r"))==NULL) { printf("打不开文件!"); exit(0); } while(fscanf(fp,"%d %s %d %lf %d",&user[i].num, user[i].name, &user[i].password, &user[i].balance,&user [i].status ) != EOF) { i++; } fclose(fp); N=i; printf("---------\n"); printf("欢迎光临!\n"); printf("---------\n"); while(a!=10) { printf("*************************\n"); printf("请选择您的操作:\n"); printf("1.开户 2.存款 3.取款 4.查询 5.转账\n"); printf("6.挂失 7.解挂 8.销户 9.改密 10.欢迎再次使用\n"); printf("*************************\n"); scanf("%d",&a); if(a>0&&a<=10) { switch(a) { case 1: OpenAccount(); break; case 2: SaveMoney(); break; case 3: DrawMoney(); break; case 4: Inquire(); break; case 5: TransferAccounts(); break; case 6: ReportTheLoss(); break; case 7: SolutionToHang(); break; case 8: ClosingAccount(); break; case 9: ChangeThePassword(); break; case 10: printf("欢迎再次使用!\n"); break; } } else printf("输入错误。请重新输入\n"); } if ((fp=fopen("account.txt", "w"))==NULL) { printf("打不开文件!"); exit(0); } for(i=0; i<N; i++) fprintf(fp,"%d %s %d %lf %d\n",user[i].num, user[i].name, user[i].password, user[i].balance,user[i].status ); fclose(fp); return 0; } void OpenAccount() { if(N==NumMax) { printf("银行用户数已达上限,不能开户"); return; } printf("正在开户\n"); user[N].num=10001+N; printf("账号:%d\n", user[N].num); printf("户主姓名:"); scanf("%s", user[N].name); int mima1, mima2; printf("密码:"); mima1=InputPassword(); printf("确认密码:"); mima2=InputPassword(); if(mima1==mima2) { user[N].password=mima1; user[N].status=0; N++; printf("成功开户!\n"); } else { printf("两次密码不一致,未成功开户!\n"); } } void SaveMoney() { int a; int num;//账号 int who;//查找到该账号在数组中对应的下标 int mima; double money; char str[100]; printf("请输入您的账号:\n"); scanf("%d",&num); who = search(num); if(who<0) printf("该用户不存在,存款失败!\n"); else { if(user[who].status==0) { printf("请输入密码:"); mima=InputPassword(); if(mima!=user[who].password) printf("密码错误,请重新输入:"); else { printf("户主姓名:%s\n", user[who].name); printf("输入存款额:"); scanf("%s", str); a=judge(str); while(a!=1) { printf("输入错误,请重新输入存款额\n"); scanf("%s", str); a=judge(str); } if(a==1) { money=atoi(str); if(money<0||money>1000000) printf("输入金额太大,自动退出\n"); else { user[who].balance+=money; printf("您的当前余额为%.2f元. \n",user[who].balance); } } } } else if(user[who].status==1) printf("该用户处于挂失状态,存款失败!\n"); else if(user[who].status==2) printf("该用户已经销户,存款失败!\n"); } } void DrawMoney() { char str[100]; int a; int num, who,mima; double money; printf("账号:"); scanf("%d", &num); who = search(num); if(who<0) { printf("该用户不存在,取款失败!\n"); } else { if(user[who].status==0) { printf("户主姓名:%s\n", user[who].name); printf("密码:"); mima=InputPassword(); if(mima!=user[who].password) { printf("输入密码错误,取款失败!\n"); } else { printf("输入取款额:"); scanf("%s", str); a=judge(str); while(a!=1) { printf("输入错误,请重新输入取款额\n"); scanf("%s", str); a=judge(str); } if(a==1) { money=atoi(str); if(money>user[who].balance) printf("余额不足,取款失败!\n"); else { user[who].balance-=money; printf("取款成功,您的余额为%.2f元. \n",user[who].balance); } } } } else if(user[who].status==1) { printf("该用户处于挂失状态,取款失败!\n"); } else { printf("该用户已经销户,取款失败!\n"); } } printf("欢迎下次光临\n"); } void Inquire() { int num, who; int mima; printf("账号:"); scanf("%d", &num); who = search(num); if(who<0) { printf("该用户不存在,查询完毕!\n"); } else { printf("户主姓名:%s\n", user[who].name); printf("密码:"); mima=InputPassword(); if(mima!=user[who].password) { printf("输入密码错误,不能继续查询其他信息!\n"); } else { printf("余额:%.2f元. \n",user[who].balance); printf("状态:"); if(user[who].status==0) { printf("正常\n"); } else if(user[who].status==1) { printf("挂失\n"); } else { printf("已经销户\n"); } } } printf("欢迎下次光临\n"); } void TransferAccounts() { char str[100]; int a; int num, whoout, whoin; int mima; double money; printf("输入转出账号:"); scanf("%d", &num); whoout = search(num); if(whoout<0) { printf("该用户不存在,转账失败!\n"); } else { if(user[whoout].status==0) { printf("户主姓名:%s\n", user[whoout].name); printf("密码:"); mima=InputPassword(); if(mima!=user[whoout].password) { printf("输入密码错误,转账失败!\n"); } else { printf("输入转账金额:"); scanf("%s", str); a=judge(str); while(a!=1) { printf("输入错误,请重新输入转账金额\n"); scanf("%s", str); a=judge(str); } if(a==1) { money=atoi(str); if(money>user[whoout].balance) { printf("余额不足,转账失败!\n"); } else { printf("输入转入账号:"); scanf("%d", &num); whoin = search(num); if(whoin<0) { printf("转入账户不存在,转账失败!\n"); } else { if(user[whoin].status>0) { printf("转入账户异常,转账失败!\n"); } else { user[whoout].balance-=money; user[whoin].balance+=money; printf("转账后,您还有%.2f元. \n",user[whoout].balance); } } } } } } else printf("该账户异常,转账失败!\n"); } printf("欢迎下次光临\n"); } void ReportTheLoss() { int num, who; int mima; printf("账号:"); scanf("%d", &num); who = search(num); if(who<0) { printf("该用户不存在,不能挂失!\n"); } else { printf("户主姓名:%s\n", user[who].name); printf("密码:"); mima=InputPassword(); if(mima!=user[who].password) { printf("输入密码错误,不能继续操作!\n"); } else { if(user[who].status==0) { user[who].status=1; printf("挂失成功\n"); } else if(user[who].status==1) { printf("该账户已经处于挂失状态\n"); } else { printf("该账户已销户,不能挂失\n"); } } } } void SolutionToHang() { int num, who; int mima; printf("账号:"); scanf("%d", &num); who = search(num); if(who<0) { printf("该用户不存在,解除挂失失败!\n"); } else { printf("户主姓名:%s\n", user[who].name); printf("密码:"); mima=InputPassword(); if(mima!=user[who].password) { printf("输入密码错误,不能继续操作!\n"); } else { if(user[who].status==0) { printf("该账户处于正常状态,不需要解除挂失\n"); } else if(user[who].status==1) { user[who].status=0; printf("解除挂失成功\n"); } else { printf("该账户已销户,操作无效\n"); } } } } void ClosingAccount() { int num; int who; int mima; printf("待销户账号:"); scanf("%d", &num); who = search(num); if(who<0) { printf("该用户不存在,销户失败!\n"); } else { printf("户主姓名:%s\n", user[who].name); printf("密码:"); mima=InputPassword(); if(mima==user[who].password) { printf("余额:%.2f 元\n", user[who].balance); user[who].balance=0; user[who].status=2; printf("取款 %.2f 元,销户成功!\n", user[who].balance); } else { printf("输入的密码错误,销户失败!\n"); } } } void ChangeThePassword() { int num, who; int mima, mima1, mima2; printf("账号:"); scanf("%d", &num); who = search(num); if(who<0) { printf("该用户不存在,修改密码失败!\n"); } else { printf("户主姓名:%s\n", user[who].name); printf("密码:"); mima=InputPassword(); if(mima!=user[who].password) { printf("输入密码错误,不能继续操作!\n"); } else { printf("新密码:"); mima1=InputPassword(); printf("确认密码:"); mima2=InputPassword(); if(mima1==mima2) { user[who].password=mima1; printf("修改成功!\n"); } else { printf("两次输入不同,修改失败!\n"); } } } } int search(int num) { int index=-1; int low=0, high=N-1, mid; while(low<=high) { mid = (low+high)/2; if(user[mid].num==num) { index=mid; break; } else if (user[mid].num>num) high=mid-1; else low=mid+1; } return index; } int InputPassword() { char c; //接收字符形式密码 int mima=0; //要转换为数字 int i; while(1) { for(i=0; i<6; i++) { c=getch();//输入但不显示 putchar(‘*‘); if(isdigit(c))//isdight主要用于检查参数c是否为阿拉伯数字0到9 头文件为#include<ctype.h> mima=mima*10+(c-‘0‘); else { mima=0; break; } } fflush(stdin); //清除键盘缓存区中已经有的输入 printf("\n"); if(mima==0) { printf("密码要求全为数字,且不能全0!\n"); printf("请重新输入密码: "); } else break; } return mima; } int judge(char*s)//判断输入的金额是否符合要求 { int a,i=0; while(s[i]!=‘\0‘) { if(s[i]<‘0‘||s[i]>‘9‘) { a=0; break; } i++; } if(a!=0) a=1; return a; }心得体会:#include<ctype.h>是isdigit函数的头文件,isdight主要用于检查参数c是否为阿拉伯数字0到9 ,同时,getch()输入但不显示,学会了输入密码但是显示出*号,scanf函数是有返回值的,如果输入的相对应的话就返回1,不符合输入要求就会返回0,在输入金额密码的过程中克制了输入字符数字组合、字符串等问题。
银行储蓄系统的设计与实现