一段路大学学生专用银行
一、基本量 1、定义常量和账户基本信息本行所提供的的服务包括以下几种:开户、显示、保存、登录、退出
登录成功后主要包括以下功能:存款、取款、查询余额、修改密码、转账、返回
本行账户信息主要包括:账号、姓名、性别、院系、专业、班级、卡号、开户行、开户时间、余额、状态、初始密码
//所用头文件 #include2、所有函数声明#include #include #include #include //定义常量 #define MAX_ID 10 //账号 #define MAX_NAME 20 //姓名 #define MAX_SEX 5 //性别 #define MAX_DEP 30 //院系 #define MAX_MAJOR 30 //专业 #define MAX_CLASS 30 //班级 #define MAX_CARD 30 //卡号 #define MAX_PASSWORD 10 //密码 #define MAX_BANK 30 //开户行 #define MAX_MONEY 20000 //最高取款(转账)限度 //账户信息 typedef struct ATM_ACCOUNT{ char xh[MAX_ID],xm[MAX_NAME],xb[MAX_SEX],yx[MAX_DEP],zy[MAX_MAJOR], bj[MAX_CLASS],kh[MAX_CARD],mm[MAX_PASSWORD],khh[MAX_BANK]; char zt;//银行卡状态 long khsj;//开户时间 float ye;//余额 }ATM_account; //定义几个全局变量 int max_account,//账户的上限值,存在一个文本文件中 cnt_account,//现有账户数,存在一个二进制文件中 sign;//登录账户的角标 ATM_account atm_account; ATM_account *p_account = &atm_account;//指向的内存块,存放具体的账户信息
void init();//初始化函数 int getNum();//获取本机所有账户函数 void menu1();//初始界面菜单函数 void welcome();//初始界面选择功能函数 void Open_account();//开户函数 void Show_account();//显示账户信息函数 void Login();//登录函数 void Save_account();//保存函数 void menu2();//主机菜单函数 void mainmenu();//主机菜单选择功能函数 void Money();//存取款金额选择函数 void Deposit();//存款函数 void Money_Slove1();//固定存款金额处理函数 void Other_Money1();//任意存款金额处理函数 void Draw();//取款函数 void Money_Slove2();//取款金额选择功能函数 void Sub_Money(int k);//固定金额取款处理函数 void Other_Money2();//任意金额取款处理函数 void Query();//查询余额函数 void ChangePwd();//修改密码函数 void Transfer();//转账函数 int validata_ID(char* p);//转账账户核对函数 int validata_Money(int money);//转账金额合法性检查函数3、初始化
//初始化
void init(){
FILE* fp;
int i = 0;
cnt_account=getNum();//获取本机现有账户数
if((fp=fopen("data\init.txt","r"))==NULL){
perror("init_init.txt");system("pause");return ;
}
fscanf(fp,"max_account=%d;",&max_account);
printf("max_account = %dn",max_account);
if(max_account<=0){
puts("初始化数据有误,程序终止执行!");system("pause");return ;
}
//内存分配!
p_account = (ATM_account *)malloc(max_account*sizeof(ATM_account));
if(p_account==NULL){
puts("内存分配失败,程序终止执行!");system("pause");return ;
}
fclose(fp);
if((fp=fopen("data\atm_account.dat","rb"))==NULL){
perror("init_atm_account.dat");system("pause");return;
}
fread( &cnt_account, sizeof(int),cnt_account, fp );
fread( p_account, sizeof(ATM_account),cnt_account , fp );
printf("共有%d个账户信息!n",cnt_account);
puts("初始化完毕!");
system("pause");
fclose(fp);
fp = NULL;
}
4、获取本机现有账户数
int getNum(){
FILE *fp;
int i = 0;
long pos = 0;
if((fp=fopen("data\atm_account.dat","rb"))==NULL){
perror("getNum_atm_account.dat");system("pause");return 0 ;
}
fseek(fp,0,SEEK_END);//定位文件函数
pos = ftell(fp);//pos---->文件的尺寸!!!!
if(pos==-1){
puts("文件定位出错!");system("pause");
return 0;
}
return pos/sizeof(ATM_account);//结果就是atm_account.dat存放了多少个账户的信息!!!
fclose(fp);
fp = NULL;
}
5、主函数
int main(){
init();//初始化
welcome();//欢迎界面
return 0;
}
二、初始界面
一)初始界面菜单
void menu1(){
puts("**********************************************");
puts("*1.开户 2.显示账户 3.登录 4.存盘 0.退出*");
puts("**********************************************");
printf("请选择:> ");
}
void welcome(){
int input = 0;
while(1){
system("cls");
menu1();
scanf("%d",&input);
switch(input){
case 1:Open_account();break;
case 2:Show_account();break;
case 3:Login();break;
case 4:Save_account();break;
case 0://退出之前要自动保存一下信息
Save_account();puts("欢迎下次使用!");system("pause");exit(0);
default:puts("选择错误,请重试!");system("pause");break;
}
}
}
二)开户
//1、开户
void Open_account(){
printf("账号:> ");scanf("%s",p_account[cnt_account].xh);
printf("姓名:> ");scanf("%s",p_account[cnt_account].xm);
printf("性别:> ");scanf("%s",p_account[cnt_account].xb);
printf("院系:> ");scanf("%s",p_account[cnt_account].yx);
printf("专业:> ");scanf("%s",p_account[cnt_account].zy);
printf("班级:> ");scanf("%s",p_account[cnt_account].bj);
printf("卡号:> ");scanf("%s",p_account[cnt_account].kh);
printf("开户行:> ");scanf("%s",p_account[cnt_account].khh);
p_account[cnt_account].khsj=time(0);
p_account[cnt_account].ye=0.0f;
p_account[cnt_account].zt='0';//账户状态良好为'0'
strcpy(p_account[cnt_account].mm,"000000");
cnt_account++;//开户数增加1
puts("开户完毕!");system("pause");
}
三)显示
//2、显示账户信息
void Show_account(){
int i=0;
if(cnt_account==0)
puts("还未有人开户,NO.1快去开户吧!");
else{
while(i
四)登录
此处若是三次登录都失败,可将账户锁定,锁定就将状态改为 '1'
//3、登录
void Login(){
int times = 0,i = 0;
int flag = 0;
char xh[MAX_ID],mm[MAX_PASSWORD];
do{
system("cls");
puts("欢迎使用农业银行ATM机");
printf("账号:> ");scanf("%s",xh);
printf("密码:> ");scanf("%s",mm);
//到p_account所指的内存中查找该账号和密码;
//如果比对上,则进入主操作界面(mainmenu());
//否则,重新输入账号、密码,循环,直到用完3次机会!
for(i=0;i
五)保存
//4、保存
void Save_account(){
FILE* fp;
int i = 0;
if((fp=fopen("data\atm_account.dat","wb"))==NULL){
perror("Save_account_atm_account.dat");system("pause");return;
}
fwrite(&cnt_account,sizeof(cnt_account),cnt_account,fp);//先写账户总数
i=fwrite(p_account,sizeof(ATM_account),cnt_account,fp);//再写具体的账户信息
if(i==0)
puts("存盘失败!");
else{
printf("保存完毕,共存入%d个账户信息!n",i);
}
system("pause");
fclose(fp);
fp = NULL;
}
三、主机界面
一)主机菜单
void menu2(){
puts("*****************************************");
puts("*** 1、存款 2、取款 3、查询余额 ***");
puts("*** 4、修改密码 5、转账 0、返回 ***");
puts("*****************************************");
printf("请选择:> ");
}
void mainmenu(){
int input = 0;
while(1){
system("cls");
menu2();
scanf("%d",&input);
switch(input){
case 1:Deposit();break;
case 2:Draw();break;//待完成项目
case 3:Query();break;
case 4:ChangePwd();break;
case 5:Transfer();break;
case 0:welcome();break;
default:puts("选择有误,请重试!");system("pause");break;
}
}
}
二)存款
存款金额:只能存入百元大钞(即:大于100且为100的整数倍)
1、存取款金额选择菜单
void Money(){
puts("****************************************************");
puts("*** 1、100元 ** 2、200元 ** 3、500元 ***");
puts("*** 4、1000元 ** 5、2000元 ** 6、其他金额 ***");
puts("******************** 0、返回 ***********************");
puts("****************************************************");
printf("请选择:> ");
}
2、存款
void Deposit(){
Money_Slove1();//存款
printf("%s的余额为:%.2fn",p_account[sign].xh,p_account[sign].ye);
puts("存款完毕!");system("pause");
}
3、处理存款金额
void Money_Slove1(){
int input = 0;
while(1){
system("cls");
Money();
scanf("%d",&input);
switch(input){
case 1:p_account[sign].ye += 100;
puts("已存入100元");system("pause");break;
case 2:p_account[sign].ye += 200;
puts("已存入200元");system("pause");break;
case 3:p_account[sign].ye += 500;
puts("已存入500元");system("pause");break;
case 4:p_account[sign].ye += 1000;
puts("已存入1000元");system("pause");break;
case 5:p_account[sign].ye += 2000;
puts("已存入2000元");system("pause");break;
case 6:Other_Money1();break;
case 0:return;
default:puts("选择有误,请重试!");system("pause");break;
}
}
}
void Other_Money1(){
int money = 0;
puts("本行仅支持存入百元大钞!");
printf("请输入存款金额:> ");scanf("%d",&money);
//判断存入金额是否为百元大钞
if(money>=100 && money%100==0){//是
p_account[sign].ye += money;
printf("已存入%d元n",money);
}
else{//否
puts("存入金额不符要求,无法存入!");
}
system("pause");
}
三)取款
取款金额条件:非负、余额充足、小于单笔上限、整取
1、取款
void Draw(){
printf("%s的余额为:%.2fn",p_account[sign].xh,p_account[sign].ye);
Money_Slove2();//取款
printf("%s的余额为:%.2fn",p_account[sign].xh,p_account[sign].ye);
puts("取款完毕!");system("pause");
}
2、处理取款金额
void Money_Slove2(){
int input = 0;
int k = 0;
while(1){
system("cls");
Money();
scanf("%d",&input);
switch(input){
case 1:k=100;Sub_Money(k);break;
case 2:k=200;Sub_Money(k);break;
case 3:k=500;Sub_Money(k);break;
case 4:k=1000;Sub_Money(k);break;
case 5:k=2000;Sub_Money(k);break;
case 6:Other_Money2();break;
case 0:return;
default:puts("选择有误,请重试!");system("pause");break;
}
}
}
void Sub_Money(int k){
if(k > p_account[sign].ye)
puts("余额不足,取款失败!");
else{
p_account[sign].ye -= k;
printf("已取走%d元n",k);
}
system("pause");
}
void Other_Money2(){
int money = 0;
puts("本行仅支持按50的倍数取款!");
printf("请输入取款金额:> ");scanf("%d",&money);
//判断取款金额:非负、小于余额、50的倍数、上限
if(money>=0 && money<=p_account[sign].ye && money%50==0 && money<=MAX_MONEY){//是
p_account[sign].ye -= money;
printf("已取走%d元n",money);
}
else{//否
puts("取款金额不符要求,无法取款!");
}
system("pause");
}
四)查询余额
void Query(){
printf("%s的余额为:%.2fn",p_account[sign].xh,p_account[sign].ye);
system("pause");
}
五)修改密码
输入原密码:核对,若输错原密码三次可锁定账户(此项本程序未实现)
输入新密码:三次新密码要一致才能修改原密码,修改完之后要重新登录,
void ChangePwd(){
char ori_mm[MAX_PASSWORD];
char new_mm1[MAX_PASSWORD], new_mm2[MAX_PASSWORD], new_mm3[MAX_PASSWORD];
printf("请输入原密码:> "); scanf("%s", ori_mm);
if (strcmp(ori_mm, p_account[sign].mm) == 0){
puts("密码正确!"); system("pause");//下一步
system("cls");
printf("请输入新密码:> "); scanf("%s", new_mm1);
puts("输入成功,请再次输入!"); system("pause");
do{
system("cls");
printf("请再次输入新密码:> "); scanf("%s", new_mm2);
if (strcmp(new_mm1, new_mm2) == 0){//判断两次密码是否一致
puts("输入成功,请再次输入!"); system("pause");
break;
}
else{
puts("两次密码不一致,请重新输入!"); system("pause");
}
} while (1);
do{
system("cls");
printf("请再次输入新密码:> "); scanf("%s", new_mm3);
//判断三次密码是否一致
if (strcmp(new_mm3, new_mm2) == 0){
strcpy(p_account[sign].mm, new_mm3);//修改密码
puts("输入成功,密码已修改,请重新登录!"); system("pause"); Login();
break;
}
else{
puts("密码输入不一致,请重新输入!"); system("pause");
}
} while (1);
}
else{
puts("原密码输入有误,无法修改密码!"); system("pause");
}
}
六)转账
1、转账
输入对方账号:1、是否存在,2、账户状态,3、不能转给自己
输入转账金额:1、非负数,2、50的倍数,3、上限
转账:1、修改自己的余额,2、修改对方的余额
记录交易信息:1、自己转出的,2、对方的转入(此功能未实现)
void Transfer(){
char reci_xh[MAX_ID];
int trans_sign;//转账的账号角标
again3:
system("cls");
printf("请输入需要转账的账号:> ");scanf("%s",reci_xh);
//判断账号合法性
trans_sign = validata_ID(reci_xh);
if(trans_sign>=0){//合法
int tra_amount = 0;
printf("请输入转账金额:> ");scanf("%d",&tra_amount);
if(validata_Money(tra_amount)>0){//合法
p_account[sign].ye -=tra_amount;p_account[trans_sign].ye += tra_amount;
printf("转账成功,共计转账%d元!",tra_amount);system("pause");
}
}
else{//非法
int a = 0;
puts("账号有误,重试请按——1 !");
a = getch();
if(a==1){
goto again3;
}
else{
puts("已取消转账!");system("pause");
return;
}
}
}
2、核对账户是否存在
遍历所有账户,若存在且账户状态良好(即为0)返回该账户下标,否则返回-1
int validata_ID(char* p){
//查找账户是否存在,存在返回其角标k,否则返回-1
int i = 0;
if(strcmp(p_account[sign].xh,p)!=0){//不是转给自己
for(i=0;i
3、核对金额是否合法
转账金额:非负、50的倍数、小于单笔最高转账金额、余额充足
int validata_Money(int money){
//转账金额合法返回值为1,否则-1
if(money>=0 && money%50==0 && money<=MAX_MONEY)
if(money<=p_account[sign].ye) return 1;
return -1;
}
本程序仅经过VS2013调试一次,暂未完成完整调试!!!!!!!!



