大家好,我是辰梦~
时隔几月,又和大家见面了,接近期末了,最近着实有点忙。
今天,我想跟大家分享的是ATM取款机代码。这里面,虽说代码很多,但并不难,如果你想了解C语言的灵魂——指针,那可能会让你失望了。我这篇文章,适合新手,如何去学习函数模块化,各个函数模块相互独立又相互联系。
话不多说,请看下面:
(友情提示:请先在D盘处建立一个“bank”文件夹,在“bank”文件夹里再建立一个文本文档“account”,进行保存数据 )
1. 函数头文件
整个代码的头文件不多,最核心的stdio.h肯定要有,这个不多说。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include <math.h>
#include<conio.h>//getch()函数头文件
关于process.h头文件,为了确保exit(0)退出程序
string.h这个初学者,应该都了解,这个是关于字符串的头文件。
2. 结构体与函数声明
这个ATM取款机程序中,就我个人而言,要用到的功能函数挺多的,先在这里把所有的函数声明,全部给复制粘贴到本文章中。
int init();//初始化
void menu_welcome();//欢迎界面
void menu_main();//主控界面
void addAccount();//新开户
void menu_addAccount(); //新开户界面目录
void menu_addAccountDetail(); //新开户具体填写的储户信息
void updateAccount();//修改开户信息
void copystr(char str1[],char str2[],int len);//将修改的信息赋值给原来的数据(即覆盖原来的储户信息)
void menu_updateAccount();//修改开户信息的界面目录
void queryAccount();//查询开户信息
void quit();//退出
void quit2();//保存 开户信息,但不退出
int save(int accountCard);//只保存,不退出
void login();//ATM取款机登录
void menu_login();//登录菜单
void ATM_login();//ATM取款机身份验证,如输入密码
void change_password();//储户修改密码,非银行柜员(银行柜员是用来修改储户信息)
void help();//ATM取款机使用帮助
void help2();//ATM取款机使用帮助
int ATM_catalog(int accountCard);//ATM功能菜单
int depoist(int accountCard);//存款
int withdrawal(int accountCard);//取款
int find_money(int accountCard);//查询余额
int transfer_accounts(int accountCard);//转账
void admin_login();//管理员(即银行柜员)登录
void menu_admin();//银行管理员登录的具体功能信息
void admin();//银行工作人员的具体操作
void finish();//结束ATM取款机
int finish2(int accountCard);//储户交易完毕,选择退出时出现的页面
void save_password();//储户自己修改密码,并保存进文件当中
int save_transfer(int accountCard);//转账信息进行保存,并保存进文件当中
别看有这么多,其实有几个函数都是相似的,就比如保存文件信息吧,关于这个功能函数,在本程序中有好几种(大多类似,或者相同)
ATM取款机灵魂人物代表——结构体,正式登场!!
struct BankAccount1
{
int accountCard;//账户卡号
char accountName[11];//账户名称 字符串后面的结束标记'/0'
char mobile[12];//手机号码
char cardId[19];//身份证
char password[7];//密码
double money;// 余额
} bankAccounts[100],bac={0,'\0','\0','\0','\0',0.0};
在本ATM取款机程序中,包含卡号,姓名,电话号码,身份证号码,密码,余额六个部分,我也相信你们能够写的更多一些,比如储户的家庭地址写入结构体当中。
3. 银行开户功能函数相关代码
关于这一点,登录该ATM取款机,首先要去注册信息,你才会选择登录ATM取款机,进行取款、存款、查询余额等方面的功能。
在这里,我先把相关代码,贴出来,供大家参考!
void menu_addAccountDetail(){
puts("\n请输入新的储户开户信息:\n");
puts("姓名 身份证号码 (18位) 手机号码(11位) 初始余额(100-20000)\n");
}
void addAccount()
{
//储户新开户,显示菜单
char ch1;
char digitFlag='1';//身份证数字标记 ‘0’不是数字;‘1’全部是数字
int i=0;
while(1)
{
menu_addAccount();
//控制输入的内容只能是'0'和'1'
do{
ch1=getchar();
}while(ch1<'0'||ch1>'1');
if(ch1=='0')
break; //跳出while(1)循环,返回到银行工作人员菜单
//执行储户新开户
while(1)
{
menu_addAccountDetail();
//输入储户的信息
//姓名 身份证号码 手机号码 初始余额
scanf("%s%s%s%lf",&bac.accountName,&bac.cardId,&bac.mobile,&bac.money);
printf("\n储户姓名 身份证号码 手机号码 初始余额\n");
printf("%s %s %s %lf\n",bac.accountName,bac.cardId,bac.mobile,bac.money);
// 验证输入的姓名信息是否合法
if(strlen(bac.accountName)<1||strlen(bac.accountName)>10)
{
printf("账户名称长度需在1到10之间,请重新输入!\n");
system("pause");
system("cls");
continue;
}
// 身份证号码
// 身份证号码必须是17位数字
if(strlen(bac.cardId)!=18)
{
printf("身份证号码长度只能18位,请重新输入!\n");
system("pause");
system("cls");
continue;
}
//身份证号码前18位必须是数字
//通过数字标记,判断身份证号码是否全部是数字
// ‘0’不是数字;‘1’全部是数字
digitFlag='1';
for(i=0;i<18;i++)
{
if(bac.cardId[i]<'0'||bac.cardId[i]>'9')
digitFlag='0';
}
//如果 身份证号码 不是数字,返回去重新输入;
// 全部是数字,继续执行;
if(digitFlag=='0')
{
printf("身份证号码18位必须是数字,请重新输入!\n");
system("pause");
system("cls");
continue;
}
//如果 手机号码不是11位,返回去重新输入
// 是11位,继续执行;
if(strlen(bac.mobile)!=11)
{
printf("手机号码长度只能11位,请重新输入!\n");
system("pause");
system("cls");
continue;
}
//默认手机号码全是数字
digitFlag='1';
//判断完手机是11位后,判断手机号是否全部是数字
for(i=0;i<11;i++)
{
if(bac.mobile[i]<'0'||bac.mobile[i]>'9')
digitFlag='0';
}
//如果 手机号码 不是数字,返回去重新输入;
// 全部是数字,继续执行;
if(digitFlag=='0')
{
printf("手机号码必须是数字,请重新输入!\n");
system("pause");
system("cls");
continue;
}
//判断初始余额是否为50元,不是,返回去重新输入;
// 是,继续执行;
if(bac.money<100||bac.money>20000)
{
printf("初始余额必须大于为100元或者小于20000元,请重新输入!\n");
system("pause");
system("cls");
continue;
}
if(fmod(bac.money,100)!=0)//当输入的初始金额不是100的整数倍是,提示输入非法
{
printf("你输入初始金额不是100的整数倍,请重新输入!\n");
system("pause");
system("cls");
continue;
}
// 如果验证输入正确,保存到新的储户信息
// 系统自动生成新的储户卡号、密码
//系统自动生成新的储户卡号、密码
//bac.accountCard =842+N;
bac.accountCard =842+N;
//将输入的身份证后六位作为初始密码保存
bac.password[0]=bac.cardId[12];
bac.password[1]=bac.cardId[13];
bac.password[2]=bac.cardId[14];
bac.password[3]=bac.cardId[15];
bac.password[4]=bac.cardId[16];
bac.password[5]=bac.cardId[17];
//将当前输入的验证合法的储户信息保存到新开户的储户信息
bankAccounts[N] = bac;
printf("\n\n卡号:%d\n",bac.accountCard);
printf("初始密码:%s\n",bac.password);
N++;
break;
}
}
}
以上代码就是关于银行开户过程,即储户注册信息,进入结构体。
4.密码输入
关于这一点,我仔细思考了一下。加入了一些改变,如输入密码时控制台上显示星号*,而不以输入的数字显示。
printf("输入新的密码:");
char password[6];
// scanf("%s",password);
for(i=0;i<100;i++)//密码输入6位 ,这里的 i<100 表示输入密码时可以超过6位,因为后面有判断密码的长度
{
//从键盘输入一个字符,就赋值到password
password[i]=getch(); //getch() 表示输入的密码不显示在控制台上
printf("*");//输入一个字符时,控制台上显示*号
if(password[i]=='\r')//‘\r’表示输入回车
{
break;//当输入回车符号的时候,将会跳出这个输密码的循环,进行判断密码是否合理,如必须是6位的数字
}
}
password[i]='\0';//加上反斜杠0,在密码的末尾处加上空字符
这里只是一处,在本程序中,拥有3处需要输入密码的地方。在修改原先的密码时,没有写到退格符,就是说,即便你在键盘上输入退格键,它也会显示出星号,所以我又做了一些变化,加了退格键进去!
5.取款操作
int depoist(int accountCard)//存款
{
while(1)
{
printf("请输入你想存多少钱:");
double save;//定义即将存的钱
scanf("%lf",&save);
if(save<100||save>20000)//当输入的金额大于2万元,或者小于100元,提示输入非法
{
printf("你输入的金额过大或者过小,请输入100-20000元\n");
system("pause");
continue;//结束当前循环,重新输入金额
}
//double型不能用%号来求余,但可以用fmod函数
if(fmod(save,100)!=0)//当输入的金额不是100的整数倍是,提示输入非法
{
printf("你输入的不是100的整数倍,请重新输入!\n");
system("pause");
continue;
}
bac.money=double(bankAccounts[accountCard-842].money+save);//总的余额==文件(后台数据)的余额+你要存的钱
printf("现在的总余额为:%lf元\n",bac.money);
bankAccounts[accountCard-842].money=bac.money;//将总的余额保存于结构体,保存于文件当中
printf("存款成功!!\n");
system("pause");
ATM_catalog(accountCard);//返回到ATM主菜单
}
}
在这里我就简单的再说明一下,大部分注释都在代码中。
fmod(a,b)函数,其实是对double类型的值求余,在整个程序当中,余额就是用的double型,所以用到了fmod()函数。
在这里运用while(1)死循环,表示输入错误,要求重新输入正确的值,否则将不会退出该功能函数模块。
6.总结
根据本次ATM取款机,C语言大作业,我清晰地了解了C语言的各个函数功能(C语言部分函数),对于该ATM模拟取款机程序,我感觉不太满意,代码不够精简,加上使用的是数组保存数据不够安全,所以我自己做了一个目标。
- 程序中多加使用指针
- 程序中代码一定要规范,思路应该更加清晰
- 多加一些书上的函数,书上的函数太多都没有用到
7.完整代码
篇幅太长,这里就不展示演示效果了(自己下去试吧),若有问题,可私信或评论。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include <math.h>
#include<conio.h>//getch()函数头文件
//储户信息:Account.txt
struct BankAccount1
{
int accountCard;//账户卡号
char accountName[11];//账户名称 字符串后面的结束标记'/0'
char mobile[12];//手机号码
char cardId[19];//身份证
char password[7];//密码
double money;// 余额
} bankAccounts[46],bac={0,'\0','\0','\0','\0',0.0};
//bankAccounts是全局变量 存储全部的储户信息
//bac存储临时输入的一个新储户信息
int N=0;//保存储户个数 是全局变量
FILE *file;//储户文件指针file全局变量
FILE *fp;//储户余额的位置
int init();//初始化
void menu_welcome();//欢迎界面
void menu_main();//主控界面
void addAccount();//新开户
void menu_addAccount(); //新开户界面目录
void menu_addAccountDetail(); //新开户具体填写的储户信息
void updateAccount();//修改开户信息
void copystr(char str1[],char str2[],int len);//将修改的信息赋值给原来的数据(即覆盖原来的储户信息)
void menu_updateAccount();//修改开户信息的界面目录
void queryAccount();//查询开户信息
void quit();//退出
void quit2();//保存 开户信息,但不退出
int save(int accountCard);//只保存,不退出
void login();//ATM取款机登录
void menu_login();//登录菜单
void ATM_login();//ATM取款机身份验证,如输入密码
void change_password();//储户修改密码,非银行柜员(银行柜员是用来修改储户信息)
void help();//ATM取款机使用帮助
void help2();//ATM取款机使用帮助
int ATM_catalog(int accountCard);//ATM功能菜单
int depoist(int accountCard);//存款
int withdrawal(int accountCard);//取款
int find_money(int accountCard);//查询余额
int transfer_accounts(int accountCard);//转账
void admin_login();//管理员(即银行柜员)登录
void menu_admin();//银行管理员登录的具体功能信息
void admin();//银行工作人员的具体操作
void finish();//结束ATM取款机
int finish2(int accountCard);//储户交易完毕,选择退出时出现的页面
void save_password();//储户自己修改密码,并保存进文件当中
int save_transfer(int accountCard);//转账信息进行保存,并保存进文件当中
int main()
{
char ch;
//初始化
//从文件读取数据到内存
if(init() == -1)
{
printf("初始化系统失败!");
system("pause");//系统暂停
exit(0);
}
help2();//ATM使用指南
//欢迎界面
menu_welcome();
while(1)
{
system("cls");//每次回到主函数,必须先清屏一次
//主界面
menu_main();
do{
ch = getchar();
}while(ch < '1' || ch > '4');
//如果输入的内容是1到6的数字就执行相应的功能
switch(ch)
{
case '1': //银行工作人员登录系统
system("cls");
admin_login();
break;
case '2'://ATM取款机系统,储户登录系统
system("cls");
login();
break;
case '3'://ATM取款机使用指南
system("cls");
help();
break;
case '4'://退出系统
system("cls");
finish();
break;
}
}
return 0;
}
void admin_login()//管理员(即银行柜员)登录
{
int count=0;//定义密码输入次数
int admin_name;//银行柜员的登录账号,1000
char admin_password[6];//银行柜员的登录密码,6位,123456
int i=0;//定义i,循环时需要用到,所以初始化i值为0
while(1)
{
system("cls");//这里做个清屏,表示输入卡号或者密码输入错误,要求重新输入的时候,清除控制台上以前输入的信息(卡号或者密码)
puts("**************************************");
puts("\n\n\n\n");
printf("输入工作账号:");
scanf("%d",&admin_name);
system("cls");
puts("**************************************");
puts("\n\n\n\n");
printf("输入工作密码(6位):");
// scanf("%s",&admin_password);
while((admin_password[i]=getch())!='\r') //‘\r’表示输入回车
{//当输入回车符号的时候,将会跳出这个输密码的循环,进行判断密码是否合理,如必须是6位的数字
//从键盘输入一个字符,就赋值到admin_password
//getch() 表示输入的密码不显示在控制台上
//如果输入密码过程中 ,通过按退格键可以将光标移到前面位置
if(admin_password[i]=='\b')//'\b'表示退格符
{//当输入空格符时,执行下面代码
int j=0;
i--;//将i值也要减一,表示即将保存或者“个人认为输出的正确密码 ”
system("cls");
puts("**************************************");
puts("\n\n\n\n");
printf("输入工作密码(6位):");
for(j=0;j<i;j++)//在该for循环中,输出比刚才说错的密码少一个,少的那个字符就是我们输错的字符
{
putchar('*');//输出*星号
}
continue;//继续执行下一个输入字符 ,跳转就近的while函数中继续输入字符
}
//判断完储户是否有按下退格 、回车键,才输出字符
putchar('*');//输入一个字符时,控制台上显示*号
i++;//使i值变化,才能够继续往下输字符,直至输入回车键停止
}
admin_password[i]='\0';//加上反斜杠0,在密码的末尾处加上空字符,字符串末尾必须加上反斜杠0
if(admin_name==1000)//判断账号
{
if(strcmp(admin_password,"123456")==0)//判断密码
{
printf("\n登录成功!即将进入开户界面...\n");//进入此行代码,说明账号密码都匹配成功
system("pause");
admin();//银行工作人员开户界面
}
else//密码错误
{
count++;//密码输错一次,次数加一
printf("密码输入错误,已输入%d次,还剩下%d次机会\n",count,3-count);
if(count==3)
{
printf("密码输入次数已达上限!!,总共输入次数为3次!!\n");
system("pause");
main();//返回主菜单
}
}
}
else
{
count++;//密码输错一次,次数加一
printf("账号输入错误,已输入%d次,还剩下%d次机会\n",count,3-count);
if(count==3)
{
printf("账号输入次数已达上限!!,总共输入次数为3次!!\n");
system("pause");
main();//返回主菜单
}
}
}
}
void admin()
{//银行工作人员开户的相关功能
while(1)
{
int ch;
system("cls");//每次回到主函数,必须先清屏一次
menu_admin();// 调用银行工作人员登录系统的菜单
do{
ch = getchar();
}while(ch < '1' || ch > '7');
//如果输入的内容是1到6的数字就执行相应的功能
switch(ch)
{
case '1': //新用户开户
system("cls");
addAccount();
break;
case '2': //用户开户修改
system("cls");
updateAccount();
break;
case '3': //用户开户信息查询
system("cls");
queryAccount();
break;
case '4'://退出系统,并保存开户信息
system("cls");
quit();
break;
case '5'://ATM取款机使用指南
system("cls");
help();
break;
case '6'://返回主菜单
system("cls");
main();
break;
case '7'://保存信息,并返回主菜单
quit2();
break;
}
}
}
void menu_welcome()
{
printf("****************************************\n");
printf("* 欢迎使用重工666银行储户开户系统 *\n");
printf("****************************************\n");
}
void finish()
{
printf("*************************************************\n");
printf("* 欢迎你再次使用重工666银行储户开户系统 *\n");
printf("* bye bye~~ *\n");
printf("*************************************************\n");
exit(0); //退出ATM程序
}
int finish2(int accountCard)
{
puts("请确认你的信息是否保存,如果没有保存,请按1,若已经保存,请按0退出系统!\n");
int choice;
scanf("%d",&choice);
switch(choice)
{
case 0:
printf("*************************************************\n");
printf("* 欢迎你再次使用重工666银行储户开户系统 *\n");
printf("* bye bye~~ *\n");
printf("*************************************************\n");
exit(0);
case 1:
ATM_catalog(accountCard);//ATM功能菜单
break;
default:
puts("输入有误!请输入1或者0!");
}
return 0;
}
void menu_main()
{//ATM取款机的登录的菜单
puts("**********************************");
puts("* <-ATM取款机'主菜单'-> *");
puts("*请选择需要的服务: *");
puts("* *");
puts("* 1.银行工作人员登录系统 *");
puts("* *");
puts("* 2.储户登录系统 *");
puts("* *");
puts("* 3.ATM取款机使用指南! *");
puts("* *");
puts("* 4.退出! *");
puts("* *");
puts("**********************************");
printf("-----------------输入你的选项:");
}
void menu_admin()
{//银行工作人员的登录菜单
puts("**********************************");
puts("*请选择需要的服务: *");
puts("* *");
puts("* 1.储户新开户 *");
puts("* *");
puts("* 2.储户信息修改 *");
puts("* *");
puts("* 3.储户信息查询 *");
puts("* *");
puts("* 4.退出并保存开户信息 *");
puts("* *");
puts("* 5.ATM取款机使用指南! *");
puts("* *");
puts("* 6.返回主菜单 *");
puts("* *");
puts("* 7.保存信息,并返回到主菜单 *");
puts("**********************************");
puts("\n");
printf("-----------------输入你的选项:");
}
int init()
{
//将储户信息从文件读取内存
int i = 0;
if((file = fopen("d:\\bank\\account.txt","r+")) == NULL)
return -1;//文件打开失败
//读取所有的储户信息到内存
while(fscanf(file, "%d%s%s%s%s%lf\n",
&bankAccounts[i].accountCard,
&bankAccounts[i].accountName,
&bankAccounts[i].cardId,
&bankAccounts[i].mobile,
&bankAccounts[i].password,
&bankAccounts[i].money)!= EOF)//文件内容未完继续读取
i++;
N=i;//将读取的储户个数保存在全局变量N中
return 0;
}
void quit()
{
int i;
rewind(file);//将文件指针移动到开始位置
//将N个储户信息全部保存到文件
for(i = 0; i < N; i++)
{
printf("%d %s %s %s %s %.2lf\n",
bankAccounts[i].accountCard,
bankAccounts[i].accountName,
bankAccounts[i].mobile,
bankAccounts[i].cardId,
bankAccounts[i].password,
bankAccounts[i].money);
fprintf(file,"%d %s %s %s %s %.2lf\n",
bankAccounts[i].accountCard,
bankAccounts[i].accountName,
bankAccounts[i].cardId,
bankAccounts[i].mobile,
bankAccounts[i].password,
bankAccounts[i].money);
}
fclose(file);
puts("信息已保存,即将退出系统。\n");
system("pause");
exit(0);//退出ATM取款机
}
void quit2()//开户信息中,保存储户信息,但不退出ATM,只是返回到ATM主菜单
{
int i;
rewind(file);//将文件指针移动到开始位置
//将N个储户信息全部保存到文件
for(i = 0; i < N; i++)
{
printf("%d %s %s %s %s %.2lf\n",
bankAccounts[i].accountCard,
bankAccounts[i].accountName,
bankAccounts[i].mobile,
bankAccounts[i].cardId,
bankAccounts[i].password,
bankAccounts[i].money);
fprintf(file,"%d %s %s %s %s %.2lf\n",
bankAccounts[i].accountCard,
bankAccounts[i].accountName,
bankAccounts[i].cardId,
bankAccounts[i].mobile,
bankAccounts[i].password,
bankAccounts[i].money);
}
fclose(file);
puts("信息已保存,按任意键返回主菜单。\n");
system("pause");
main();//保存好信息后,进入程序开始界面----即主菜单
}
int save(int accountCard)//储户登录之后,保存存款、取款等信息
{//只保存不退出ATM取款机
int i;
rewind(file);//将文件指针移动到开始位置
//将N个储户信息全部保存到文件
for(i = 0; i < N; i++)
{
fprintf(file,"%d %s %s %s %s %.2lf\n",
bankAccounts[i].accountCard,
bankAccounts[i].accountName,
bankAccounts[i].cardId,
bankAccounts[i].mobile,
bankAccounts[i].password,
bankAccounts[i].money);
}
i=accountCard-842;
printf("%d %s %s %s %s %.2lf\n",
bankAccounts[i].accountCard,
bankAccounts[i].accountName,
bankAccounts[i].cardId,
bankAccounts[i].mobile,
bankAccounts[i].password,
bankAccounts[i].money) ;
fclose(file);
puts("信息已保存,按任意键返回ATM交易界面。\n");
system("pause");
ATM_catalog(accountCard);//保存好信息后,返回到ATM交易界面
return 0;
}
void menu_addAccount(){
puts("**********************************");
puts("*请选择需要的服务: *");
puts("* *");
puts("* 1.储户新开户 *");
puts("* *");
puts("* 0.退出 *");
puts("**********************************");
}
void menu_addAccountDetail(){
puts("\n请输入新的储户开户信息:\n");
puts("姓名 身份证号码 (18位) 手机号码(11位) 初始余额(100-20000)\n");
}
void addAccount()
{
//储户新开户,显示菜单
char ch1;
char digitFlag='1';//身份证数字标记 ‘0’不是数字;‘1’全部是数字
int i=0;
while(1)
{
menu_addAccount();
//控制输入的内容只能是'0'和'1'
do{
ch1=getchar();
}while(ch1<'0'||ch1>'1');
if(ch1=='0')
break; //跳出while(1)循环,返回到银行工作人员菜单
//执行储户新开户
while(1)
{
menu_addAccountDetail();
//输入储户的信息
//姓名 身份证号码 手机号码 初始余额
scanf("%s%s%s%lf",&bac.accountName,&bac.cardId,&bac.mobile,&bac.money);
printf("\n储户姓名 身份证号码 手机号码 初始余额\n");
printf("%s %s %s %lf\n",bac.accountName,bac.cardId,bac.mobile,bac.money);
// 验证输入的姓名信息是否合法
if(strlen(bac.accountName)<1||strlen(bac.accountName)>10)
{
printf("账户名称长度需在1到10之间,请重新输入!\n");
system("pause");
system("cls");
continue;
}
// 身份证号码
// 身份证号码必须是17位数字
if(strlen(bac.cardId)!=18)
{
printf("身份证号码长度只能18位,请重新输入!\n");
system("pause");
system("cls");
continue;
}
//身份证号码前18位必须是数字
//通过数字标记,判断身份证号码是否全部是数字
// ‘0’不是数字;‘1’全部是数字
digitFlag='1';
for(i=0;i<18;i++)
{
if(bac.cardId[i]<'0'||bac.cardId[i]>'9')
digitFlag='0';
}
//如果 身份证号码 不是数字,返回去重新输入;
// 全部是数字,继续执行;
if(digitFlag=='0')
{
printf("身份证号码18位必须是数字,请重新输入!\n");
system("pause");
system("cls");
continue;
}
//如果 手机号码不是11位,返回去重新输入
// 是11位,继续执行;
if(strlen(bac.mobile)!=11)
{
printf("手机号码长度只能11位,请重新输入!\n");
system("pause");
system("cls");
continue;
}
//默认手机号码全是数字
digitFlag='1';
//判断完手机是11位后,判断手机号是否全部是数字
for(i=0;i<11;i++)
{
if(bac.mobile[i]<'0'||bac.mobile[i]>'9')
digitFlag='0';
}
//如果 手机号码 不是数字,返回去重新输入;
// 全部是数字,继续执行;
if(digitFlag=='0')
{
printf("手机号码必须是数字,请重新输入!\n");
system("pause");
system("cls");
continue;
}
//判断初始余额是否为50元,不是,返回去重新输入;
// 是,继续执行;
if(bac.money<100||bac.money>20000)
{
printf("初始余额必须大于为100元或者小于20000元,请重新输入!\n");
system("pause");
system("cls");
continue;
}
if(fmod(bac.money,100)!=0)//当输入的初始金额不是100的整数倍是,提示输入非法
{
printf("你输入初始金额不是100的整数倍,请重新输入!\n");
system("pause");
system("cls");
continue;
}
// 如果验证输入正确,保存到新的储户信息
// 系统自动生成新的储户卡号、密码
//系统自动生成新的储户卡号、密码
//bac.accountCard =842+N;
bac.accountCard =842+N;
//将输入的身份证后六位作为初始密码保存
bac.password[0]=bac.cardId[12];
bac.password[1]=bac.cardId[13];
bac.password[2]=bac.cardId[14];
bac.password[3]=bac.cardId[15];
bac.password[4]=bac.cardId[16];
bac.password[5]=bac.cardId[17];
//将当前输入的验证合法的储户信息保存到新开户的储户信息
bankAccounts[N] = bac;
printf("\n\n卡号:%d\n",bac.accountCard);
printf("初始密码:%s\n",bac.password);
N++;
break;
}
}
}
//储户信息修改,由银行工作人员专门修改
void updateAccount()
{
//输入要修改的储户卡号:
//验证是否存在
// 不存在,提示卡号输入错误,重新输入
// 存在
// 显示储户信息界面
// 输入修改内容(联系电话)
// 验证输入的联系电话必须是数字,长度为11位
// 输入错误,提示重新输入
// 输入成功保存
int accountCard;//账户卡号
int i=0,digit=1;//digit表示输入卡号错误,请重新输入
while(1)
{
printf("输入要修改的储户卡号:");
scanf("%d",&accountCard);
rewind(file);//将光标调到文件最开头,进行遍历
for(i=0;i<N;i++)
{//在所有用户信息中遍历,找到符合输入的储户卡号
if(accountCard==bankAccounts[i].accountCard)
{
printf("匹配成功!即将进入储户信息修改界面...\n");
system("pause");
}
else
{
digit=0;//赋值于0,表示卡号输入错误
}
}
while(1)
{
digit=1;//进入该循环,表明匹配到账户信息,故赋值于1
char ch1;
menu_updateAccount();//调用修改开户信息的界面目录
do
{
ch1=getchar();
}while(ch1<'0'||ch1>'2');
switch(ch1)
{
case '0':
admin();//返回银行工作人员界面
break;
case '1'://修改密码
printf("输入新的密码:");
char password[6];
// scanf("%s",password);
//输入密码
for(i=0;i<100;i++)//密码输入6位 ,这里的 i<100 表示输入密码时可以超过6位,因为后面有判断密码的长度
{
//从键盘输入一个字符,就赋值到login_password
password[i]=getch(); //getch() 表示输入的密码不显示在控制台上
printf("*");//输入一个字符时,控制台上显示*号
if(password[i]=='\r')//‘\r’表示输入回车
{
break;//当输入回车符号的时候,将会跳出这个输密码的循环,进行判断密码是否合理,如必须是6位的数字
}
}
password[i]='\0';//加上反斜杠0,在密码的末尾处加上空字符
printf("\n");
if(strlen(password)!=6)
{
printf("输入错误,密码必须是6位数!!\n");
system("pause");
digit=0;
break;
}
for(i=0;i<6;i++)
{
if(password[i]<'0'||password[i]>'9')
{
printf("输入错误,密码必须是数字!!\n");
system("pause");
digit=0;
break;
}
}
printf("修改成功!!\n");
//accountCard-842表示确保修改的是该储户的基本信息
copystr(password,bankAccounts[accountCard-842].password,6);//修改成功后,将修改后的数据赋值给结构体进行保存于文件当中
system("pause");
break;
case '2'://修改电话号码
printf("输入新的电话号码:");
char mobile[11];
scanf("%s",mobile);
if(strlen(mobile)!=11)
{
printf("输入错误,电话号码必须是11位数!!\n");
system("pause");
digit=0;
break;
}
for(i=0;i<11;i++)
{
if(mobile[i]<'0'||mobile[i]>'9')
{
printf("输入错误,电话号码必须是数字!!\n");
system("pause");
digit=0;
break;
}
}
printf("修改成功!!\n");
copystr(mobile,bankAccounts[accountCard-842].mobile,11);//修改成功后,将修改后的数据赋值给结构体进行保存于文件当中
system("pause");
break;
default:
printf("输入错误,请重新输入0-2!!\n");
}
if(digit==0)
{
continue;//结束当前循环,进行下一循环
}
}
if(digit==0)//卡号输入错误
{
printf("查无用户,请检查输入的卡号是否有误!\n");
system("pause");
return;//结束当前循环,并返回主目录
}
}
}
void copystr(char str1[],char str2[],int len)//修改信息时候,会用到
{//将输入的数据,依次输入进结构体中,再由结构体保存进文件
int i=0;
while(i<len)
{
str2[i]=str1[i];//str1为你修改的信息,str2一般为结构体(赋值到的地方)
i++;
}
}
void menu_updateAccount()//修改开户信息的界面目录
{
puts("**********************************");
puts("*请选择需要的服务: *");
puts("* *");
puts("* 1.修改密码 *");
puts("* *");
puts("* 2.修改电话号码 *");
puts("* *");
puts("* 0.退出 *");
puts("**********************************");
}
void queryAccount()//查询开户信息,银行工作人员
{
//运用另外一种方法,将学生信息打到终端屏上
//实现原理:将输入到文件的内容,依次从文件读取到终端屏
system("cls");
char str[1000];//定义字符串
file=fopen("d:\\bank\\account.txt","r");
printf("卡号 姓名 身份证 手机号码 密码 余额\n");
while(fgets(str,1000,file) != 0)//运用fgets函数,实现读取文件的功能
{
printf("%s",str);//输出文件中的内容
}
system("pause");
while(1)
{
char choice;
printf("按A(a)键返回到银行工作人员菜单目录!\n");
scanf("%s",&choice);
switch(choice)
{
case 'a':
return ;//返回到银行工作人员菜单目录,实测有效
break;
case 'A':
system("cls");//返回英航工作人员菜单前,先清屏
return ;
break;
default:
printf("输入错误!!!\n");
}
}
}
void login()//ATM取款机登录菜单
{
system("cls");
char ch1;
int i=0;
while(1)
{
//调用登录菜单目录
menu_login();
do
{
ch1=getchar();//输入选项
}while(ch1<'1'||ch1>'5');//限定条件,如果不是1-5,则继续输入
while(1)
{
switch(ch1)
{
case '1':
ATM_login();//进入ATM取款机,进行身份验证
break;
case '2':
change_password();//忘记密码后,修改密码
break;
case '3' ://返回主菜单
system("cls");
main();
break;
case '4'://使用帮助
help();
login();
break;
case '5'://退出程序
finish();
break;
}
}
}
}
void menu_login()//登录菜单显示的具体功能
{
puts(" /储户登录系统\\\\\\ ");
puts(" ");
puts("**********************************");
puts("* <-登录菜单-> *");
puts("* *");
puts("* 1.登录 *");
puts("* *");
puts("* 2.忘记密码 *");
puts("* *");
puts("* 3.返回主菜单 *");
puts("* *");
puts("* 4.使用帮助 *");
puts("* *");
puts("* 5.退出 *");
puts("**********************************");
printf("---------输入你的选项:");
}
void help()//使用帮助
{
system("cls");
puts(" <-使用ATM指南-> \n");
puts("1.使用本产品,请仔细阅读帮助说明\n");
puts("2.使用本次产品之前,请到银行工作人员处先注册,详细参考3\n");
puts("3.注册新储户,请选择“主菜单”中的第一个选项“银行工作人员登录系统”\n");
puts("4.管理员(银行工作人员)账号:1000 | 管理员(银行工作人员)密码:123456\n");
puts("5.进入“银行工作人员登录系统”后,会有七个选择,选择第一项“注册新用户”即可\n");
puts("6.注册新用户之后,一定要选择第四项或者第七项选择进行保存储户信息,具体参考7和8\n");
puts("7.“银行工作人员登录系统”中的第四项是保存信息后会关闭程序,慎重!\n");
puts("8.“银行工作人员登录系统”中的第七项是保存信息后会返回到主菜单,即程序开始页面\n");
puts("9.一般第一次使用该ATM模拟器,请选择“主菜单”的第三项,有“ATM取款机使用指南”\n");
puts("10.若创建完账户后,请来到“主菜单”,选择第二项“储户登录系统”,即可完成登录\n");
puts("11.选进“储户登录系统”后,会来到一个“登录菜单”,根据需求选择相应的功能\n");
puts("12.登录之后,会来到“ATM主要功能”,就是常说的ATM交易界面,其中共有八大功能\n");
puts("13.进行“ATM主要功能”页面时,前四个选项操作以后一定要进行第八项保存信息,否则无法保存\n");
puts("14.如果忘记密码,请来到“登录菜单”,选择第二项“修改密码”,即可更改自己的密码\n");
puts("15.如果忘记密码,请来到银行工作人员处,修改储户信息,也可以更改自己的密码\n");
puts("16.欢迎使用本产品,若有不足之处,请拨打电话或者留言开发者,提出建议\n");
puts("17.开发者联系方式:“QQ:2435556127”\n");
system("pause");
}
void help2()//使用帮助
{
system("cls");
puts(" <-使用ATM指南-> \n");
puts("1.使用本产品,请仔细阅读帮助说明\n");
puts("2.使用本次产品之前,请到银行工作人员处先注册,详细参考3\n");
puts("3.注册新储户,请选择“主菜单”中的第一个选项“银行工作人员登录系统”\n");
puts("4.管理员(银行工作人员)账号:1000 | 管理员(银行工作人员)密码:123456\n");
puts("5.进入“银行工作人员登录系统”后,会有七个选择,选择第一项“注册新用户”即可\n");
puts("6.注册新用户之后,一定要选择第四项或者第七项选择进行保存储户信息,具体参考7和8\n");
puts("7.“银行工作人员登录系统”中的第四项是保存信息后会关闭程序,慎重!\n");
puts("8.“银行工作人员登录系统”中的第七项是保存信息后会返回到主菜单,即程序开始页面\n");
puts("9.一般第一次使用该ATM模拟器,请选择“主菜单”的第三项,有“ATM取款机使用指南”\n");
puts("10.若创建完账户后,请来到“主菜单”,选择第二项“储户登录系统”,即可完成登录\n");
puts("11.选进“储户登录系统”后,会来到一个“登录菜单”,根据需求选择相应的功能\n");
puts("12.登录之后,会来到“ATM主要功能”,就是常说的ATM交易界面,其中共有八大功能\n");
puts("13.进行“ATM主要功能”页面时,前四个选项操作以后一定要进行第八项保存信息,否则无法保存\n");
puts("14.如果忘记密码,请来到“登录菜单”,选择第二项“修改密码”,即可更改自己的密码\n");
puts("15.如果忘记密码,请来到银行工作人员处,修改储户信息,也可以更改自己的密码\n");
puts("16.欢迎使用本产品,若有不足之处,请拨打电话或者留言开发者,提出建议\n");
puts("17.开发者联系方式:“QQ:2435556127”\n");
system("pause");
char choice;
printf("是否已阅读以上指南(1-已阅读,0-未阅读并退出程序)\n") ;
scanf("%s",&choice);
switch(choice)
{
case '1':
break;
case '0':
exit(0);
default:
printf("输入错误!!\n");
system("pause");
help2();//再次输入选项
// system("color 07"); //白色
}
}
void ATM_login()//进行身份验证,核实后将进行取款、存款等操作
{
int accountCard;//账户卡号
int count=0;//记录输入 密码的次数,达到3次返回登录菜单
while(1)
{
int i=0,digit;//digit==0时表示输入卡号错误,请重新输入
system("cls");//清屏
puts("********************************");
puts("\n\n\n");
printf("输入要你的的储户卡号:");
scanf("%d",&accountCard);
rewind(file);//将光标调到文件最开头,进行遍历
for(i=0;i<N;i++)
{//在所有用户信息中遍历,找到符合输入的储户卡号
if(accountCard==bankAccounts[i].accountCard)
{
printf("卡号匹配成功!\n");
system("pause");
digit=1;
break;//匹配成功后,应该跳出for循环
}
else
{
digit=0;//赋值于0,表示卡号输入错误
}
}
if(digit==0)
{
printf("查无用户,请检查输入的卡号是否有误!\n");
system("pause");
login();//结束当前循环,并返回登录界面
}
while(1)
{
// digit=1;//匹配成功,该用户已注册
system("cls");
puts("**************************************");
puts("\n\n\n\n");
printf("请输入密码(6位):");
char login_password[6];//登录时的密码,便于观看,否则容易和上面弄混淆
// scanf("%s",&login_password);//输入密码
i=0;//开始输入密码,将i值初始化为0
while((login_password[i]=getch())!='\r') //‘\r’表示输入回车
{//当输入回车符号的时候,将会跳出这个输密码的循环,进行判断密码是否合理,如必须是6位的数字
//从键盘输入一个字符,就赋值到login_password
//getch() 表示输入的密码不显示在控制台上
//如果输入密码过程中 ,通过按退格键可以将光标移到前面位置
if(login_password[i]=='\b')//'\b'表示退格符
{//当输入空格符时,执行下面代码
int j=0;
i--;//将i值也要减一,表示即将保存或者“个人认为输出的正确密码 ”
system("cls");
puts("**************************************");
puts("\n\n\n\n");
printf("请输入密码(6位):");
for(j=0;j<i;j++)//在该for循环中,输出比刚才说错的密码少一个,少的那个字符就是我们输错的字符
{
putchar('*');//输出*星号
}
continue;//继续执行下一个输入字符 ,跳转就近的while函数中继续输入字符
}
//判断完储户是否有按下退格 、回车键,才输出字符
putchar('*');//输入一个字符时,控制台上显示*号
i++;//使i值变化,才能够继续往下输字符,直至输入回车键停止
}
login_password[i]='\0';//加上反斜杠0,在密码的末尾处加上空字符
if(strcmp(bankAccounts[accountCard-842].password,login_password)==0)//匹配输入密码是否与文件中的密码相匹配
{
printf("\n密码匹配成功,交易正在处理...\n");
system("pause");
ATM_catalog(accountCard);//跳转到ATM取款机功能菜单
}
else
{
printf("密码输入错误,请重新输入!\n");
count++;
printf("输入错误,已输入%d次,还剩下%d次机会\n",count,3-count);
if(count==3)
{
printf("密码输入次数已达上限!!,总共输入次数为3次!!\n");
system("pause");
login();//返回登录菜单
}
system("pause");
continue;
}
}
}
}
void change_password()//储户修改密码,非银行柜员(银行柜员是用来修改储户信息)
{
int accountCard;//账户卡号
int i=0,digit=1;//digit表示输入卡号错误,请重新输入
while(1)
{
printf("输入你的储户卡号:");
scanf("%d",&accountCard);
rewind(file);//将光标调到文件最开头,进行遍历
for(i=0;i<N;i++)
{//在所有用户信息中遍历,找到符合输入的储户卡号
if(accountCard==bankAccounts[i].accountCard)
{
printf("匹配成功!即将进入输入密码阶段...\n");
break;
}
else
{
digit=0;//赋值于0,表示卡号输入错误
}
}
if(digit==0)
{
printf("查无用户,请检查输入的卡号是否有误!\n");
system("pause");
login();//结束当前循环,并返回登录界面
}
int count=0;
while(1)
{
printf("输入新的密码:");
char password[6];
// scanf("%s",password);
for(i=0;i<100;i++)//密码输入6位 ,这里的 i<100 表示输入密码时可以超过6位,因为后面有判断密码的长度
{
//从键盘输入一个字符,就赋值到password
password[i]=getch(); //getch() 表示输入的密码不显示在控制台上
printf("*");//输入一个字符时,控制台上显示*号
if(password[i]=='\r')//‘\r’表示输入回车
{
break;//当输入回车符号的时候,将会跳出这个输密码的循环,进行判断密码是否合理,如必须是6位的数字
}
}
password[i]='\0';//加上反斜杠0,在密码的末尾处加上空字符
//因为密码是字符串,所以用strcmp()函数,直接相等会跳过下面这行代码
// printf("旧密码:%s",bankAccounts[accountCard-842].password) ;
printf("\n");
if(strcmp(password,bankAccounts[accountCard-842].password)==0)//表明输入的新密码与旧密码相同的情况
{
count++;
printf("新输入的密码不能与旧密码相同,你还有%d次机会!\n",3-count);
if(count==3)//当修改密码达到3次,直接返回登录菜单
{
printf("修改密码已达上限!返回登录菜单\n") ;
system("pause");
login();
}
continue;
}
for(i=0;i<6;i++)
{
if(password[i]<'0'||password[i]>'9')
{
printf("输入错误,密码必须是数字!!\n");
system("pause");
digit=0;
break;
}
}
if(strlen(password)!=6)
{
printf("输入错误,密码必须是6位数!!\n");
system("pause");
digit=0;
break;
}
printf("修改成功!!,新的密码为:%s\n",password);
//accountCard-842表示确保修改的是该储户的基本信息
copystr(password,bankAccounts[accountCard-842].password,6);//修改成功后,将修改后的数据赋值给结构体进行保存于文件当中
system("pause");
save_password();//退出修改密码功能,并保存于文件
}
}
}
void save_password()//储户自己修改密码,并保存进文件当中
{
int i;
rewind(file);//将文件指针移动到开始位置
//将N个储户信息全部保存到文件
for(i = 0; i < N; i++)
{
fprintf(file,"%d %s %s %s %s %.2lf\n",
bankAccounts[i].accountCard,
bankAccounts[i].accountName,
bankAccounts[i].cardId,
bankAccounts[i].mobile,
bankAccounts[i].password,
bankAccounts[i].money);
}
fclose(file);
puts("信息已保存,按任意键返回登录菜单。\n");
system("pause");
login();//保存好信息后,返回到登录菜单
}
int ATM_catalog(int accountCard)//ATM功能菜单
{
system("cls");
puts("**********************************");
puts("* <-ATM主要功能-> *");
puts("* *");
puts("* 1.存款 *");
puts("* *");
puts("* 2.取款 *");
puts("* *");
puts("* 3.查询余额 *");
puts("* *");
puts("* 4.转账 *");
puts("* *");
puts("* 5.返回登录界面 *");
puts("* *");
puts("* 6.返回主菜单 *");
puts("* *");
puts("* 7.退出 *");
puts("* *");
puts("* 8.保存信息 *");
puts("**********************************");
printf("---------输入你的选项:");
char ch1;
do
{
ch1=getchar();//输入选项
}while(ch1<'1'||ch1>'8');//限定条件,如果不是1-5,则继续输入
while(1)
{
switch(ch1)
{
case '1':
depoist(accountCard);//存款
break;
case '2':
withdrawal(accountCard);//取款
break;
case '3':
find_money(accountCard); //查询余额
break;
case '4' ://转账
system("cls");
transfer_accounts(accountCard);
break;
case '5' ://返回登录页面
system("cls");
login();
break;
case '6'://返回主菜单
system("cls");
main();
break;
case '7'://退出并保存
system("cls");
finish2(accountCard);
break;
case '8'://保存信息,但不退出
system("cls");
save(accountCard);
break;
}
}
}
int depoist(int accountCard)//存款
{
while(1)
{
printf("请输入你想存多少钱:");
double save;//定义即将存的钱
scanf("%lf",&save);
if(save<100||save>20000)//当输入的金额大于2万元,或者小于100元,提示输入非法
{
printf("你输入的金额过大或者过小,请输入100-20000元\n");
system("pause");
continue;//结束当前循环,重新输入金额
}
//double型不能用%号来求余,但可以用fmod函数
if(fmod(save,100)!=0)//当输入的金额不是100的整数倍是,提示输入非法
{
printf("你输入的不是100的整数倍,请重新输入!\n");
system("pause");
continue;
}
bac.money=double(bankAccounts[accountCard-842].money+save);//总的余额==文件(后台数据)的余额+你要存的钱
printf("现在的总余额为:%lf元\n",bac.money);
bankAccounts[accountCard-842].money=bac.money;//将总的余额保存于结构体,保存于文件当中
printf("存款成功!!\n");
system("pause");
ATM_catalog(accountCard);//返回到ATM主菜单
}
}
int withdrawal(int accountCard)//取款
{
while(1)
{
printf("请输入你想取多少钱:");
double take;//定义即将取的钱
scanf("%lf",&take);
if(take>bankAccounts[accountCard-842].money)//当取的钱大于你账户所拥有的余额,提示输入非法
{
printf("亲,卡里没有那么多钱啦!\n");
system("pause");
continue;//结束当前循环,重新输入金额
}
if(fmod(take,100)!=0)//当输入的金额不是100的整数倍是,提示输入非法
{
printf("你输入的不是100的整数倍,请重新输入!\n");
system("pause");
continue;
}
if(take<100||take>20000)//当输入的金额大于2万元,或者小于100元,提示输入非法
{
printf("你输入的金额过大或者过小,请输入100-20000元\n");
system("pause");
continue;//结束当前循环,重新输入金额
}
bac.money=double(bankAccounts[accountCard-842].money-take);//总的余额==文件(后台数据)的余额-你要取的钱
printf("现在的总余额为:%lf元\n",bac.money);
bankAccounts[accountCard-842].money=bac.money;//将总的余额保存于结构体,保存于文件当中
printf("取款成功!!\n");
system("pause");
ATM_catalog(accountCard);//返回到ATM主菜单
}
}
int find_money(int accountCard)//查询余额
{
printf("你的账户所剩余额为:%.2lf\n",bankAccounts[accountCard-842].money);//将总的余额保存于结构体,保存于文件当中
system("pause");
ATM_catalog(accountCard);//返回到ATM主菜单
return 0;
}
int transfer_accounts(int accountCard)//转账
{
int count=0;//定义输入卡号的次数
while(1)
{
printf("请输入你要转账的卡号:");
int transfer_accountCard;//定义要转账的卡
scanf("%d",&transfer_accountCard);
//判断要转账的卡号,是否是自己的卡号(换个说法,就是不能给自己的银行卡转账)
if(transfer_accountCard==bankAccounts[accountCard-842].accountCard)
{
count++;
printf("请不要跟自己的银行卡转账,你还有%d次输入机会!\n",3-count);
if(count==3)//当修改密码达到3次,直接返回ATM交易界面
{
printf("输入卡号已达上限!返回ATM交易界面\n") ;
system("pause");
ATM_catalog(accountCard); //返回ATM交易界面
}
continue; //结束当前循环,开始下一个循环,即跳转到该函数模块的while(1)处,重新开始
}
//判断该卡是否存在,不存在则返回ATM交易界面
rewind(file);//将光标调到文件最开头,进行遍历
int i;
int digit=1;
fseek(file,0,0);//将光标移到文件的开头
for(i=0;i<N;i++)
{//在所有用户信息中遍历,找到符合输入的储户卡号
if(transfer_accountCard==bankAccounts[i].accountCard)
{
printf("匹配成功!即将进入转账界面...\n");
system("pause");
digit=1;
break;//匹配成功后,跳出for循环
}
else
{
digit=0;
}
}
if(digit==0)
{
count++;
printf("未找到该用户!\n");
printf("你还有%d次输入机会!\n",3-count);
if(count==3)
{
printf("输入次数已达上限!!返回ATM交易界面\n");
system("pause");
ATM_catalog(accountCard);//返回到ATM交易界面,就是有存款、取款等功能操作的页面
}
continue;
}
printf("请输入你要转入多少的钱:");
double take;//定义转入他卡的金钱
scanf("%lf",&take);
if(take>bankAccounts[accountCard-842].money)//当取的钱大于你账户所拥有的余额,提示输入非法
{
printf("亲,卡里没有那么多钱啦!不能够转账哦~\n");
system("pause");
continue;//结束当前循环,重新输入金额
}
if(fmod(take,100)!=0)//当输入的金额不是100的整数倍是,提示输入非法
{
printf("你输入的不是100的整数倍,请重新输入!\n");
system("pause");
continue;
}
if(take<100||take>20000)//当输入的金额大于2万元,或者小于100元,提示输入非法
{
printf("你输入的金额过大或者过小,请输入100-20000元\n");
system("pause");
continue;//结束当前循环,重新输入金额
}
bac.money=double(bankAccounts[accountCard-842].money-take);//总的余额==文件(后台数据)的余额-你要转账的钱
printf("转账后的总余额为:%lf元\n",bac.money);
bankAccounts[accountCard-842].money=bac.money;//将总的余额保存于结构体,保存于文件当中
//他卡的总余额 等于 他卡剩下的余额加上被转账的余额 如: bankAccounts[transfer_accountCard-842].money+take
bankAccounts[transfer_accountCard-842].money+=take;//将他卡的余额保存于结构体,保存于文件当中
printf("转账成功!!\n");
system("pause");
save_transfer(accountCard);//保存信息,并返回到ATM交易界面
}
}
int save_transfer(int accountCard)//转账信息进行保存,并保存进文件当中
{
int i;
rewind(file);//将文件指针移动到开始位置
//将N个储户信息全部保存到文件
for(i = 0; i < N; i++)
{
fprintf(file,"%d %s %s %s %s %.2lf\n",
bankAccounts[i].accountCard,
bankAccounts[i].accountName,
bankAccounts[i].cardId,
bankAccounts[i].mobile,
bankAccounts[i].password,
bankAccounts[i].money);
}
fclose(file);
puts("信息已保存,按任意键返回ATM交易界面。\n");
system("pause");
ATM_catalog(accountCard);//保存好信息后,返回到ATM交易界面
return 0;
}