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[46],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;
		}
	}     
}

以上代码就是关于银行开户过程,即储户注册信息,进入结构体。

(文章未完,敬请期待!)

上一篇:测试用例设计之场景图法


下一篇:First Project -用函数写的ATM+购物商城程序