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("\n\n操作失败!\n用户名重复!\n");             //检验是否与已注册账户用户名重复
    		printf("可录入人数为%d个,当前人数为%d个",total,sum);
    		printf("\n\n按回车返回上一界面......");
    		clear(sum);
   			getchar();
  			getchar();
  			system("cls");
			break; 
	}
	if(strcmp(users[sum].tele,users[i].tele)==0)             //检验是否与已注册账户绑定电话重复
    	{
    	        printf("\n\n操作失败!\n电话已被注册!\n");
    		printf("可录入人数为%d个,当前人数为%d个",total,sum);
    		printf("\n\n按回车返回上一界面......");
    		clear(sum);
   			getchar();
  			getchar();
  			system("cls");
			break; 
	}
	if(strcmp(users[sum].D,users[i].D)==0)             //检验是否与已注册账户绑定的身份证重复
    	{
    		printf("\n\n操作失败!\n该身份证号已被注册!\n");
    		printf("可录入人数为%d个,当前人数为%d个",total,sum);
    		printf("\n\n按回车返回上一界面......");
    		clear(sum);
   		getchar();
  		getchar();
  		system("cls");
		break; 
	}
    }
    if(i>=sum||sum==0)          //第一个账号以及不与库中信息重复的账号操作成功
    {
	sum++;
   	printf("\n\n操作成功!\n");
   	printf("可录入人数为%d个,当前人数为%d个",total,sum);
   	printf("\n\n按回车返回上一界面......");
   	getchar();
  	getchar();
  	system("cls");
    }
    return;
  }
  else
  {
	printf("人数超标\n ");   
	printf("\n\n按回车返回上一界面......");
        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("\n");
   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("\n销户成功\n");
	    printf("\n\n按回车返回上一界面......");
            getchar();
            getchar();
            system("cls");
            return;
      }
   }
   if(i==sum)
      printf("!不存在该用户信息!\n\n");
   else
   {
      printf("操作成功\n");
      sum--;
   }
   return;
}

功能3:余额查询

void inquiry()//余额查询............................................................................
{
   char username[12];
   char password[40];
   int i,flag=0;
   printf("\n");
   printf("\n");
   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("登录成功!\n");
            printf("剩余余额: %lf\n",users[i].balance);
	    printf("\n\n按回车返回上一界面......");
	    getchar();
	    getchar();
	    system("cls");
            return;
      }
      if(flag==0)
      {
        printf("\n");
        printf("错误!");
	printf("\n\n按回车返回上一界面......");
	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("登录成功!\n");
        printf("剩余余额: %.2lf\n",users[i].balance);
        printf("请输入你的存款数目:");
        scanf("%lf",&bal);
        users[i].balance=users[i].balance+bal;            //余额增加
	printf("\n");
	printf("\n操作成功!\n");
	printf("剩余余额: %.2lf\n",users[i].balance);
	printf("\n\n按回车返回上一界面......");
        getchar();
        getchar();
        system("cls");
        return;
       }
   }
   printf("错误!\n");
   printf("\n\n按回车返回上一界面......");
   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("登录成功!\n");
        printf("剩余余额: %.2lf\n",users[i].balance);
	printf("请输入你的取款数目:");
        scanf("%lf",&bal);
        users[i].balance=users[i].balance-bal;          //余额减少
	printf("\n");
	printf("\n操作成功!\n");
	printf("剩余余额: %.2lf\n",users[i].balance);
	printf("\n\n按回车返回上一界面......");
        getchar();
        getchar();
        system("cls");
        return;
     }
   }
   printf("错误!\n");
   printf("\n\n按回车返回上一界面......");
   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("\n登录成功!\n\n");
	printf("请输入对方账户:");
        scanf("%s",username);
        for(j=0;j<total;j++)
   	{
      	   if(strcmp(users[j].username,username)==0)           //判断账户里是否有足够的钱进行转账操作
	   {
              printf("\n请输入转账数额:");
              scanf("%lf",&bal);
              if(users[i].balance<bal)
              {
        	printf("余额不足!\n");
        	printf("剩余余额: %.2lf\n",users[i].balance);
  		printf("\n\n按回车返回上一界面......");
  		getchar();
 		getchar();
   		system("cls");	
   		return;
	      }
	      users[j].balance=users[j].balance+bal;              //转入用户加钱
	      users[i].balance=users[i].balance-bal;              //转出用户扣钱
	      printf("\n");
	      printf("\n操作成功!\n");
	      printf("剩余余额: %.2lf\n",users[i].balance);
	      printf("\n\n按回车返回上一界面......");
   	      getchar();
   	      getchar();
    	      system("cls");
    	      return;
            } 
    	}
    	printf("未找到该用户!\n");
  	printf("\n\n按回车返回上一界面......");
  	getchar();
 	getchar();
   	system("cls");
   	return;
	}
   }
   printf("账号或密码错误!\n");
   printf("\n\n按回车返回上一界面......");
   getchar();
   getchar();
   system("cls");
   return;
} 

主函数:主菜单

int main()
{
   int choice;
   while(1)
   {
    printf("\n\n\t\t************* 欢迎进入ATM系统 **************\n");
    printf("\n");
    printf("\n");
    printf("\t\t1:开户\n");
    printf("\t\t2:销户\n");
    printf("\t\t3:余额查询\n");
    printf("\t\t4:存款\n");
    printf("\t\t5:取款\n");
    printf("\t\t6:转账\n");
    printf("\t\t0:退出系统\n");
    printf("\n");
    printf("\t\t*********** 请选择您需进行的选项 ****************\n\n\n");
    printf("\n\n");
    printf("请选择:");
    scanf("%d",&choice);
    printf("\n\n");
    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。
由于个人能力和时间有限,此系统还有好多精细的部分还没有被开发出来,例如后台管理员系统、在创建用户输入密码时将密码以*****覆盖显示、采用手机号和身份证多方式登录以防忘记账号等等功能。这些只能依靠读者们来进行完善和优化了。
posted @ 2020-11-18 00:28  Yarn_mist  阅读(410)  评论(0)    收藏  举报