📄 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 + -