ATM取款机-C语言期末大作业

大家好,我是辰梦~
时隔几月,又和大家见面了,接近期末了,最近着实有点忙。
今天,我想跟大家分享的是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模拟取款机程序,我感觉不太满意,代码不够精简,加上使用的是数组保存数据不够安全,所以我自己做了一个目标。

  1. 程序中多加使用指针
  2. 程序中代码一定要规范,思路应该更加清晰
  3. 多加一些书上的函数,书上的函数太多都没有用到
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;
} 

(文章完,收藏,关注加点赞!)

  • 19
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
好的,下面是一个简单的C语言ATM取款机的示例代码,包含了一些基本的功能: ```c #include <stdio.h> // 假定账户余额为1000元 double balance = 1000.0; // 取款函数 void withdraw(double amount) { if (balance >= amount) { balance -= amount; printf("取款%.2f元成功,余额%.2f元\n", amount, balance); } else { printf("余额不足,无法取款\n"); } } // 存款函数 void deposit(double amount) { balance += amount; printf("存款%.2f元成功,余额%.2f元\n", amount, balance); } // 查询余额函数 void inquire() { printf("当前余额为:%.2f元\n", balance); } int main() { int choice; double amount; while (1) { // 显示菜单 printf("\n请选择需要的操作:\n"); printf("1. 取款\n"); printf("2. 存款\n"); printf("3. 查询余额\n"); printf("4. 退出\n"); printf("请输入选择的序号:"); // 获取用户输入 scanf("%d", &choice); // 根据用户选择执行相应的操作 switch (choice) { case 1: printf("请输入取款金额:"); scanf("%lf", &amount); withdraw(amount); break; case 2: printf("请输入存款金额:"); scanf("%lf", &amount); deposit(amount); break; case 3: inquire(); break; case 4: printf("再见!\n"); return 0; default: printf("无效的选择,请重新输入\n"); break; } } } ``` 这个示例代码实现了一个简单的ATM取款机,包括取款、存款和查询余额三个功能。用户可以根据菜单进行选择,并进行相应的操作。在这个示例中,账户余额被保存在全局变量`balance`中,取款、存款和查询余额的函数分别实现了相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fy哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值