⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atm.cpp

📁 一个简单的C语言写的模拟银行ATM自动催取款的系统
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define FORMAT "%d\n%s\n%s\n%s\n%s\n%s\n%d\n"
#include <conio.h>//getch()函数所在的头文件
#define cls system("cls")//实现清屏
#define pause system("pause")//暂停
#define len sizeof(struct user)
#define max_pass_len 20//用于限制密码长度的
#define file FILE
#define null 0

typedef struct user
{
char name[20];
int number;
int num;
char pass[max_pass_len+1];
float money;
struct user *next;
}user;

typedef struct records//查询历史记录的结构体
{
	int count;
	char time[20];
	char type[20];
	int number;
	float money;
}records;

void information()//说明性文字
{
printf("\t\t***************************************\n\n");
printf("\t\t          欢迎使用银行交易系统\n");
printf("\n\t\t***************************************\n");
printf("\t\t-1-开户;\n\t\t-2-办理业务;\n\t\t-3-退出;\n");
}

void get_pass(char *passwd)//该函数用于获取密码
{
    unsigned char c;//unsigned char 的用法和unsigned int 的用法相似
    int i=0;    
    while ((c=getch())!='\r')//这里用的是‘\r’而不是‘\n’在于这里接收的是回车而不是换行
    {
        if (i<max_pass_len)
        {
            passwd[i] = c;
			i++;
            putchar('*');
        }//用于排除空格和其它不可打印字符的操作
        else if (i>0 && c=='\b')//实现退格操作
        {
            i--;
            putchar('\b');
    putchar(' ');//用于覆盖星号
    putchar('\b');//实现退格操作(删除用于覆盖星号的空格)
        }
    }
    putchar('\n');
    passwd[i]='\0';//置字符串结束标志
}

int get_inf(user *p)//获取账户信息的函数
{
int flag=1;
char pass[max_pass_len+1];
printf("用户名:");
scanf("%s",p->name);
printf("账号:");
scanf("%d",&p->number);
printf("请输入证件号:");
scanf("%d",&p->num);
printf("请输入密码:    ");
get_pass(pass);
printf("请再次输入密码:");
get_pass(p->pass);
while(strcmp(pass,p->pass))//确保用户记住自己的密码
{
   printf("两次输入不一致,请重新输入!\n");
   printf("请输入密码:    ");
   get_pass(pass);
   printf("请再次输入密码:");
   get_pass(p->pass);
   if(flag++>3)
   {
    printf("输入错误次数太多!\n");
    pause;
    return 0;
   }
}
printf("金额:");
scanf("%f",&p->money);
pause;
return 0;
}

user *add(user *head)//用于新增用户
{
user *cust=(user *)malloc(len);
user *p0=cust,*p1=head,*p2;//p0指向stud,p1指向head
get_inf(cust);
if(head==null)//原先的链表为空的情况
{
   head=p0;
   p0->next=null;
}
else
{
   while((p0->number>p1->number)&&(p1->next!=null))
   {
    p2=p1;
    p1=p1->next;
   }//特定条件下的指针后移
   if(p0->number<=p1->number)
   {
    if(head==p1)
     head=p0;//插入到原来的第一个结点之前
    else
     p2->next=p0;
    p0->next=p1;
   }
   else
   {
    p1->next=p0;
    p0->next=null;
   }//插入到最后的结点之后
}
return head;
}

int save(user *head,user *cust)//用于实现存款的函数
{
user *p=head;
float money;
if(!head)
{
   printf("错误!没有账户信息!\n");
   pause;
   return 0;
}
while(cust->number!=p->number)
   p=p->next;
if(cust->number==p->number)
{
   printf("请输入金额:");
   scanf("%f",&money);//还应该把这次记录保存到record里,该怎么弄了?
   if(money>1e-6)//由于money是浮点数,所以采用此操作
   {
    p->money+=money;
    printf("操作成功!\n");
    pause;
   }
   else
    printf("输入错误,请检查!\n");
}
return 0;
}

int withdraw(user *head,user *cust)//实现取款的函数
{
user *p=head;
float money;
if(!head)
{
   printf("错误!没有账户信息!\n");
   pause;
   return 0;
}
while(cust->number!=p->number)
   p=p->next;
if(cust->number==p->number)
{
   printf("请输入金额:");//还应该把这次记录保存到record里,该怎么弄了?
   scanf("%f",&money);
   if(money>1e-6)
   {
    if(money>p->money)//余额不足时的反应
    {
     printf("对不起,余额不足,请核对!\n");
     pause;
     return 0;
    }
    else
    {
     p->money-=money;
     printf("操作成功!\n");
     pause;
    }
   }
   else
    printf("输入错误,请检查!\n");
}
return 0;
}

int trans(user *head,user *cust)//实现转帐的函数
{
	int number;
	user *p=head;
    float money;
    if(!head)
	{
      printf("错误!没有账户信息!\n");
         pause;
      return 0;
	}
    else printf("请输入你要转帐的帐号:\n");
          scanf("%d",&number);
	while(number!=p->number)
          p=p->next;
	if(number==p->number)
	{
       printf("请输入转帐的金额:");
         scanf("%f",&money);
    if(money>1e-6)
	{
        if(money>p->money)//余额不足时的反应
		{
            printf("对不起,余额不足,请核对!\n");
             pause;
           return 0;
		}
        else
		{
		    p->money-=money;
		    cust->money+=money;
		}
	}
    else
       printf("输入错误,请检查!\n");
	}
    else
	   printf("您输入的帐号不存在!");
	    return 0;
}


int modify_pass(user *head,user *cust)//用于修改密码
{
user *p=head;
int flag=1;
char pass1[max_pass_len+1],pass2[max_pass_len+1];
if(!head)
{
   printf("错误!没有账户信息!\n");
   pause;
   return 0;
}
while(cust->number!=p->number)//用于找账号
   p=p->next;
if(cust->number==p->number)//找到时才进行操作
{
   printf("请输入密码:    ");
   get_pass(pass1);
   printf("请再次输入密码:");
   get_pass(pass2);
   while(strcmp(pass1,pass2))
   {
    printf("两次输入不一致,请重新输入!\n");
    printf("请输入密码:    ");
    get_pass(pass1);
    printf("请再次输入密码:");
    get_pass(pass2);
    if(flag++>3)
    {
     printf("输入错误次数太多!\n");
     pause;
     return 0;
    }
   }
   if(strcpy(p->pass,pass1))
    printf("操作成功!\n");
   else
   {
    printf("操作失败!\n");
    return 0;
   }
   pause;
}
return 0;
}

user *cancle(user *head,user *cust)//删除帐户的函数
{
	FILE *fp;
	user *p1,*p=head;
	fp=fopen("record.txt","rb");
	while(p)
	{fread(p,sizeof(struct user),1,fp);
    p=p->next;//将文件信息读入
	if(!head)
	{
       printf("错误!没有账户信息!\n");
         pause;
       return 0;
	}
	while(cust->number!=p->number&&p->next!=null)//用于找账号
	{p1=p;p=p->next;}
	if(cust->number==p->number)
	{if(p==head) head=p->next;
	else p1->next=p->next;
	printf("操作成功,帐号已删除\n");
	}
	else printf("错误!没有帐号信息!\n");
	return head;
	}
}
	 
int check(user *head,user *cust)//用于查询
{
user *p=head;
if(!head)
{
   printf("错误!没有账户信息!\n");
   pause;
   return 0;
}
while(cust->number!=p->number)
   p=p->next;
if(cust->number==p->number)
{
   printf("账户信息如下:\n");
   printf("户名:%s\n帐号:%d\n余额:%.2f\n",cust->name,cust->number,cust->money);
}
pause;
return 0;
}

user *select_2(user *head)//二级菜单功能实现的函数
{
user *cust,*p=head;
int choice,number,flag=1,lab=0;
char pass[max_pass_len+1];
cls;
if(!head)
{
   printf("错误,没有记录!\n");
   pause;
   return head;//链表为空则直接返回
}
printf("请输入账号:");
scanf("%d",&number);
while(p!=null)
{
   if(number==p->number)
   {
    cust=p;
    lab=1;
    break;
   }
   p=p->next;
}
if(!lab)
{
   printf("错误,没有账户信息!\n");
   pause;
   return head;
}  
printf("请输入密码:");
get_pass(pass);
while(strcmp(pass,cust->pass))//密码不一致则重新输入
{
   printf("密码输入错误,请重新输入!\n");
   printf("请输入密码:   ");
   get_pass(pass);
   if(flag++>3)
   {
    printf("输入错误次数太多!\n");
    pause;
    return head;
   }
}
cls;
printf("\t\t-1-存款;\n\n\t\t-2-取款;\n\n\t\t-3-修改密码;\n\n\t\t-4-查询;\n\n\t\t-5-帐户注销;\n\n\t\t-6-转帐;\n\n\t\t-7-退出。\n");
printf("\n请选择:");
scanf("%d",&choice);
cls;
switch(choice)
{
case 1:
   save(head,cust);//存款
   break;
case 2:
   withdraw(head,cust);//取款
   break;
case 3:
   modify_pass(head,cust);//修改密码
   break;
case 4:
   check(head,cust);//查询
   break;
case 5:
   cancle(head,cust);//注销帐户(此函数还没有编出来)
case 6:
	trans(head,cust);//转帐(此函数尚未编完)
case 7:
	break;
default:
   {
    printf("对不起,没有您需要的功能!\n");
    pause;
    cls;
   }
}
return head;
}

user *select(user *head,int choice)//一级菜单功能的操作
{
file *fp;
user *p=head;
switch(choice)
{
case 1:
   cls;
   head=add(head);//开户
   break;
case 2:
   cls;
   head=select_2(head);//业务办理
   break;
case 3:
   cls;
   if(!(fp=fopen("record.txt","wb")))
   {
    printf("错误,无法建立文件!\n");
   }
   while(p)
   {
    fwrite(p,sizeof(struct user),1,fp);
    p=p->next;
   }//将信息保存到文件
   printf("\n\n\n\n\n\n\n\n\t\t\t\t谢谢使用!\n\n\n\n\n\n\n\n\n\n");
   getch();
   exit(0);
default:
   {
    printf("对不起,没有您需要的功能!\n");
    pause;
    cls;
   }
}
cls;
return head;
}

void main()
{ 
int choice=0;
user *head=null;
system("title 银行交易模拟系统");
while(choice!=3)
{
   cls;
   information();
   printf("\n请选择:");
   scanf("%d",&choice);
   head=select(head,choice);
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -