大家好,我是辰梦~
时隔几月,又和大家见面了,接近期末了,最近着实有点忙。
今天,我想跟大家分享的是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;
}
}
}
以上代码就是关于银行开户过程,即储户注册信息,进入结构体。