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管理系统(极简版)的主要内容,如果未能解决你的问题,请参考以下文章

URL 解析极简版

URL 解析极简版

URL 解析极简版

极简版OKEX比特币跨期对冲策略

Golang 入门系列-八怎样实现定时任务,极简版.

极简版OpenGL 超级宝典(第五版)环境配置 VS2010