ATM管理系统(极简版)
Posted 07my
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ATM管理系统(极简版)相关的知识,希望对你有一定的参考价值。
一、说明
1.该系统只具备面向用户的基本功能(如开户、销户、存款、取款、转账、余额查询功能);
2.该系统用C语言实现。
二、ATM系统模块化代码
头文件& 全局变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
函数声明以及全局变量初始化
struct node
{
char username[12]; //账号
char password[40]; //密码
char name[40]; // 姓名
char tele[20]; //电话号码
char D[18]; //身份证号码
double balance; //余额 -
struct node *users;//指向下一结点的指针
};
int total;//需要录入的账户数量
int sum=0,flag=0;//记录系统中剩余账户信息的数量
struct node *users=NULL;//这个要放在外面声明,放在个函数内部,无法共享
void enter(); //开户(录入信息)
void dele(); //销户(删除信息)
void inquiry();//余额查询
void deposit(); //存款
void withdraw(); //取款
void transfer(); //转账(一个账户转到另一个账户)
void clear(int sum)//清除下标为sum位置的用户数据
{
if(users==NULL)
users=(struct node *)malloc(total*sizeof(struct node));
strcpy(users[sum].username,users[sum+1].username);
strcpy(users[sum].password,users[sum+1].password);
strcpy(users[sum].name,users[sum+1].name);
strcpy(users[sum].tele,users[sum+1].tele);
strcpy(users[sum].D,users[sum+1].D);
users[sum].balance=users[sum+1].balance;
}
功能1:开户
void enter() //开户(录入信息)............................................................................
{
int i;
if(flag==0) //通过flag开关,使得系统只有在第一次进入开户功能时才会要求输入开户人数
{
flag=1;
system("cls");
printf("请输入要开户的数量:");
scanf("%d",&total);
system("cls");
}
if(users==NULL)
users=(struct node *)malloc(total*sizeof(struct node)); //初始化
if(sum<total)
{
printf("请输入账号: ");
scanf("%s",users[sum].username);
printf("请输入密码: ");
scanf("%s",users[sum].password);
printf("请输入姓名: ");
scanf("%s",users[sum].name);
printf("请输入电话号码: ");
scanf("%s",users[sum].tele);
printf("请输入身份证号码: ");
scanf("%s",users[sum].D);
printf("请输入余额: ");
scanf("%lf",&users[sum].balance);
for(i=0;i<sum;i++)
{
if(strcmp(users[sum].username,users[i].username)==0)
{
printf("
操作失败!
用户名重复!
"); //检验是否与已注册账户用户名重复
printf("可录入人数为%d个,当前人数为%d个",total,sum);
printf("
按回车返回上一界面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
if(strcmp(users[sum].tele,users[i].tele)==0) //检验是否与已注册账户绑定电话重复
{
printf("
操作失败!
电话已被注册!
");
printf("可录入人数为%d个,当前人数为%d个",total,sum);
printf("
按回车返回上一界面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
if(strcmp(users[sum].D,users[i].D)==0) //检验是否与已注册账户绑定的身份证重复
{
printf("
操作失败!
该身份证号已被注册!
");
printf("可录入人数为%d个,当前人数为%d个",total,sum);
printf("
按回车返回上一界面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
}
if(i>=sum||sum==0) //第一个账号以及不与库中信息重复的账号操作成功
{
sum++;
printf("
操作成功!
");
printf("可录入人数为%d个,当前人数为%d个",total,sum);
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
}
return;
}
else
{
printf("人数超标
");
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
}
}
功能2:销户
void dele() //销户(删除信息)............................................................................
{
char D[18];
char password[40];
int i,k;
printf("请输入要销户的用户身份证号: ");
scanf("%s",D);
printf("请输入密码: ");
scanf("%s",password);
printf("
");
for(i=0;i<sum;i++)
{
if(strcmp(users[i].D,D)==0 && strcmp(users[i].password,password)==0) //在库中寻找该账号
{
for(k=i;k<sum;k++)
{
strcpy(users[k].username,users[k+1].username);
strcpy(users[k].password,users[k+1].password);
strcpy(users[k].name,users[k+1].name);
strcpy(users[k].tele,users[k+1].tele);
strcpy(users[k].D,users[k+1].D);
users[k].balance=users[k+1].balance;
}
sum--;
printf("
销户成功
");
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
}
if(i==sum)
printf("!不存在该用户信息!
");
else
{
printf("操作成功
");
sum--;
}
return;
}
功能3:余额查询
void inquiry()//余额查询............................................................................
{
char username[12];
char password[40];
int i,flag=0;
printf("
");
printf("
");
printf("请输入账号:");
scanf("%s",username);
printf("请输入密码:");
scanf("%s",password);
for(i=0;i<sum;i++)
if(strcmp(users[i].username,username)==0 && strcmp(users[i].password,password)==0) //在库中寻找该账号
{
flag=1;
printf("登录成功!
");
printf("剩余余额: %lf
",users[i].balance);
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
if(flag==0)
{
printf("
");
printf("错误!");
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
}
}
功能4:存款
void deposit()//存款............................................................................
{
char username[12];
char password[40];
double bal;
int i;
printf("请输入账号:");
scanf("%s",username);
printf("请输入密码:");
scanf("%s",password);
for(i=0;i<sum;i++)
{
if(strcmp(users[i].username,username)==0 && strcmp(users[i].password,password)==0) //在库中寻找该账号
{
printf("登录成功!
");
printf("剩余余额: %.2lf
",users[i].balance);
printf("请输入你的存款数目:");
scanf("%lf",&bal);
users[i].balance=users[i].balance+bal; //余额增加
printf("
");
printf("
操作成功!
");
printf("剩余余额: %.2lf
",users[i].balance);
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
}
printf("错误!
");
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
功能5:取款
void withdraw()//取款............................................................................
{
char username[40];
char password[40];
double bal;
int i;
printf("请输入账号:");
scanf("%s",username);
printf("请输入密码:");
scanf("%s",password);
for(i=0;i<sum;i++)
{
if(strcmp(users[i].username,username)==0 && strcmp(users[i].password,password)==0) //在库中寻找该账号
{
printf("登录成功!
");
printf("剩余余额: %.2lf
",users[i].balance);
printf("请输入你的取款数目:");
scanf("%lf",&bal);
users[i].balance=users[i].balance-bal; //余额减少
printf("
");
printf("
操作成功!
");
printf("剩余余额: %.2lf
",users[i].balance);
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
}
printf("错误!
");
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
功能6:转账
void transfer() //转账(一个账户转到另一个账户)
{
char username[40];
char password[40];
double bal;
int i,j;
printf("请输入账号:");
scanf("%s",username);
printf("请输入密码:");
scanf("%s",password);
for(i=0;i<sum;i++)
{
if(strcmp(users[i].username,username)==0 && strcmp(users[i].password,password)==0) //在库中寻找改账号
{
printf("
登录成功!
");
printf("请输入对方账户:");
scanf("%s",username);
for(j=0;j<total;j++)
{
if(strcmp(users[j].username,username)==0) //判断账户里是否有足够的钱进行转账操作
{
printf("
请输入转账数额:");
scanf("%lf",&bal);
if(users[i].balance<bal)
{
printf("余额不足!
");
printf("剩余余额: %.2lf
",users[i].balance);
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
users[j].balance=users[j].balance+bal; //转入用户加钱
users[i].balance=users[i].balance-bal; //转出用户扣钱
printf("
");
printf("
操作成功!
");
printf("剩余余额: %.2lf
",users[i].balance);
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
}
printf("未找到该用户!
");
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
}
printf("账号或密码错误!
");
printf("
按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
主函数:主菜单
int main()
{
int choice;
while(1)
{
printf("
************* 欢迎进入ATM系统 **************
");
printf("
");
printf("
");
printf(" 1:开户
");
printf(" 2:销户
");
printf(" 3:余额查询
");
printf(" 4:存款
");
printf(" 5:取款
");
printf(" 6:转账
");
printf(" 0:退出系统
");
printf("
");
printf(" *********** 请选择您需进行的选项 ****************
");
printf("
");
printf("请选择:");
scanf("%d",&choice);
printf("
");
switch(choice)
{
case 1:
system("cls");
enter(); //开户
break;
case 2:
system("cls");
dele(); //销户
break;
case 3:
system("cls");
inquiry(); //余额查询
break;
case 4:
system("cls");
deposit(); //存款
break;
case 5:
system("cls");
withdraw(); //取款
break;
case 6:
system("cls");
transfer(); //转账
break;
case 0:
exit(0);
break;
}
}
return 0;
}
三、程序调试
1、进入系统
2、开户(输入指令1)
①开户人数为2
②账户1:
③账户2:(回到上一页面后再次输入指令1进入二号人选的录入)
3、余额查询(输入指令3)
上图为账户1的余额
上图为密码和账号不匹配时的情况
4、存款(输入指令4)
上图为,给用户2存款的情况
5、取款(输入指令5)
上图为,给用户2取款的情况
6、转账(输入指令6)
上图为,登录用户2,再输入用户1账号,从而转账给用户1的情况
上图为此时用户1余额
7、销户(输入指令2)
通过绑定身份证加密码来进行销户,提高安全性,防止误被他人销户
上图为给用户1销户
上图为余额查询页面已查询不到用户1的情况
用户2还可正常使用
8、退出
输入指令0退出系统
三.个人小结
此系统是由以前编写过的学生籍贯系统改编而来,因为二者大体框架相同,并且有了框架的话,这次ATM编写的工程量可以减少,可以更加具有目的性。
此系统在结构体的使用上,采用的是结构体指针的方法,结构体指针和结构体数组在代码中使用起来的差距不大,只是结构体指针多了指针的初始化以及初始化判断而已。
还有要注意的是此系统的字符串比较函数strcmp(str1,str2):
如果返回值 < 0,则表示 str1 小于 str2;
如果返回值 > 0,则表示 str2 小于 str2;
如果返回值 = 0,则表示 str1 等于 str2。
由于个人能力和时间有限,此系统还有好多精细的部分还没有被开发出来,例如后台管理员系统、在创建用户输入密码时将密码以*****覆盖显示、采用手机号和身份证多方式登录以防忘记账号等等功能。这些只能依靠读者们来进行完善和优化了。
以上是关于ATM管理系统(极简版)的主要内容,如果未能解决你的问题,请参考以下文章