#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
//--------------------ATM机模拟操作程序的设计--------------------------------------
typedef struct Accout //账户信息
{
char name[20]; //姓名
char no[20]; //账号
char pwd[7]; //密码
int balance;
struct Accout* next; //余额
}accout;
typedef struct Record //账户存取转账记录
{
char no[20];
char way[30];
int number;
struct Record* next;
}Record;
struct Accout* head = NULL; //文件缓冲区数据的开头
struct Accout* end = NULL; //文件缓冲区数据的尾部指针
struct Accout* head2 = NULL; //登入后账号数据的开头指针地址
//---------------------------我是分割线---------------------------------------------------------
int main() //主函数
{
//主函数页面:页面功能选项设计--->swich()选择功能--->
char choose;
void menu();
void kaihu();
void denglu();
struct Accout* p_1=NULL, * p_2 = NULL;
FILE* fpm;
if ((fpm = fopen("a1.txt", "r") == NULL))
{
printf("打开文件失败");
exit(0);
}
else
fpm = (fopen("a1.txt", "r"));
p_1 = ((struct Accout*)malloc(sizeof(struct Accout)));
end=head = p_1; //整个文件数据的开头地址,若文件中没有数据时,同时也时文件的结尾
while(!feof(fpm))
{
if (1 != fread(p_1, sizeof(struct Accout), 1, fpm))
break;
p_1->next = ((struct Accout*)malloc(sizeof(struct Accout))); //p->next指向下个数据地址的开头
p_2 = p_1; //保存当前数据的结点地址,使到最后一个数据时可以是p->next=NULL
p_1 = p_1->next; //刷新p_1指向下一个数据的开头
}
if (p_2 != NULL)
{
end = p_2;
}
p_2 = NULL;
fclose(fpm);
printf("\n\n *******************欢迎使用自动存取款系统***************\n");
printf("**\t\t\t\t\t\t\t**\n");
printf("**\t\t\t\t\t\t\t**\n");
printf("**\t\t①登入\t\t②开户\t\t\t**\n");
printf("**\t\t\t\t\t\t\t**\n");
printf(" ********************************************************");
printf("\n请输入选择序号:");
//选择的序号字符
choose = getchar();
switch (choose)
{
case '1':system("cls");
denglu();
break; //调用函数登入
case '2':system("cls");//清屏
kaihu(); //调用函数开户
break;
}
return 0;
}
void kaihu() //创建账户
{
/* 姓名,卡号,密码,余额
typedef struct Accout 账户信息
{
char name[20]; //姓名
char no[20]; //账号
char pwd[7]; //密码
int balance; //余额
}Accout; */
FILE* fp;
struct Accout * p1 = NULL;
struct Accout * p2 = NULL;
head2= p1 = ((struct Accout* )malloc(sizeof(struct Accout))); //开辟内存空间,程序缓冲区
end->next = head2;
printf("请输入您的姓名:");
scanf_s("%s",p1->name,230);
srand( time(NULL));
sprintf(p1->no, "%d%d%d%d%d", rand() % 10000,
rand() % 10000,
rand() % 10000,
rand() % 10000,
rand() % 1000); //格式化字符输出sprintf
printf("\n您的卡号为:%s",p1->no);
char pwd_1[7];
char pwd_2[7];
do {
printf("\n请输入您的密码:");
scanf_s("%s",pwd_1,7);
printf("\n请再次输入您的密码:");
scanf_s("%s", pwd_2, 7);
if (strcmp(pwd_1, pwd_2) != 0)
printf("输入的俩次密码不相同,请重新输入");
} while (strcmp(pwd_1, pwd_2) != 0);
strcpy(p1->pwd, pwd_1);
p1->balance = 0;
printf("账户余额为:%d\n", p1->balance);
if ((fp = (fopen("a1.txt", "b")) == NULL))
{
printf("打开文件失败");
exit(0);
}
else
fp = fopen("a1.txt", "b");
if((fwrite(p1, sizeof(struct Accout), 1, fp))==1);
printf("开户成功");
fclose(fp);
printf("任意输入一个数字,继续进行操作: ");
int a;
scanf_s("%d", &a);
void menu();
menu();
}
//---------------------------------------------
void denglu() //-------账号登录函数 ------------
{
char no[20];
char pwd[7];
printf("请输入账号:");
scanf_s("%s",no,19);
struct Accout* p_3;
p_3 = head;
for (; p_3 != NULL; p_3 = p_3->next)
{
if (strcmp(no, p_3->no) != 0)
continue;
else
break;
}
for (int i = 0; i < 3; i++)
{
printf("请输入密码");
scanf_s("%s",pwd,6);
if (strcmp(pwd, p_3->pwd))
break;
}
if (strcmp(pwd, p_3->pwd))
{
head2 = p_3;
void menu();
menu();
}
else
{
printf("密码三次输入错误,结束程序");
}
}
//------------------------------------------------------------
void inquiry() //查询
{
printf("姓名:%s\n账号:%s\n余额:%d\n ", head2->name, head2->no, head2->balance);
printf("任意输入一个数字,继续进行操作: ");
int a ;
scanf_s("%d",&a);
void menu();
menu();
}
//----------------------------------------------------------------------------------------------
void transfer() //转账函数
{
char no[20];
int number;
struct Accout* kahao; //转账对象的指针
struct Accout* p;
FILE* fp;
printf("请输入要转账给另一个账户的卡号:");
scanf_s("%s",no,19);
for (kahao = head; kahao!= NULL; kahao= kahao->next) //遍历寻找账户
{
if (strcmp(no, kahao->no) != 0)
continue;
else
break;
}
printf("\n请输入转账的金额:");
scanf_s("%d", &number);
head2->balance -= number;
kahao->balance += number;
fp =fopen("a1.txt", "w");
p = head;
for (;p!=NULL;p=p->next) //将缓冲区的数据全部写入文件,已覆盖方式
{
fwrite(p, sizeof(struct Accout), 1, fp);
}
fclose(fp);
printf("转账成功,当前账户余额为:%d",head2->balance);
printf("\n任意输入一个数字,继续进行操作");
int a;
scanf_s("%d", &a);
void menu();
menu();
}
//----------------------------------------------------
void cunkuan() //存款函数
{
int number;
struct Accout * p;
FILE* fp;
printf("请输入需要存的金额:");
scanf_s("%d", &number);
head2->balance += number;
if((fp= fopen("a1.txt", "w"))==NULL)
{
printf("文件打开失败");
exit(0);
}
else{
p = head;
for (; p != NULL; p = p->next) //将缓冲区的数据全部写入文件,已覆盖方式
{
fwrite(p, sizeof(struct Accout), 1, fp);
}
}
fclose(fp);
printf("\n当前账户余额为:%d", head2->balance);
printf("\n任意输入一个数字,继续进行操作");
int a;
scanf_s("%d", &a);
menu();
}
void qukuan()
{
int number;
struct Accout * p;
FILE* fp;
printf("请输入取款金额:");
scanf_s("%d", &number);
for (; head2->balance - number < 0;)
{
printf("\n余额不足,请重新输入:");
scanf_s("%d", &number);
}
head2->balance -= number;
if ((fp = fopen("a1.txt","w")) == NULL)
{
printf("文件打开失败");
exit(0);
}
else
{
for (p=head; p!= NULL; p =p->next) //将缓冲区的数据全部写入文件,已覆盖方式
{
fwrite(p, sizeof(struct Accout), 1, fp);
}
}
fclose(fp);
printf("当前余额为:%d", head2->balance);
printf("\n任意输入一个数字,继续进行操作: ");
int a;
scanf_s("%d", &a);
void menu();
menu();
}
void change_password() //更改密码函数
{
char pwd[7];
char pwd_2[7];
for(; strcmp(pwd, pwd_2) != 0;)
{
printf("请输入新密码:");
scanf_s("%s",pwd,6);
printf("请再一次输入密码:");
scanf_s("%s",pwd_2,6);
if (strcmp(pwd, pwd_2) != 0)
printf("俩次输入的密码不一样");
}
strcpy(head2->pwd, pwd);
FILE* p;
FILE* fp;
if ((fp = fopen("a1.txt", "w")) == NULL)
{
printf("文件打开失败");
exit(0);
}
else
{
p = head;
for (; p != NULL; p = head->next) //将缓冲区的数据全部写入文件,以覆盖方式
{
fwrite(p, sizeof(struct Accout), 1, fp);
}
}
fclose(fp);
printf("\n任意输入一个数字,继续进行操作: ");
int a;
scanf_s("%d", &a);
void menu();
menu();
}
void quit()
{
printf("\t\t\t\t欢迎下次使用");
head=head2 = NULL;
}
void menu() //菜单函数
{
char ch;
printf(" ");
printf(" \n");
printf(" *******欢迎使用自动存取款系统*****************\n");
printf("**\n");
printf(" * -------- -------- *\n");
printf(" * │ ①查询│ │ ④存款│ *\n");
printf(" * -------- -------- *\n");
printf("**\n");
printf(" * -------- *\n");
printf(" * │ ②转账│ │ ⑤取款│ *\n");
printf(" * ---- -------- *\n");
printf("* *\n");
printf(" * -------- *\n");
printf(" * │ ③改密│ │ ⑥退出│ *\n");
printf(" * -------- *\n");
printf("* *\n");
printf("******************************************************\n\n\n");
printf(" 请选择: ");
ch = getchar();
switch (ch)
{
case '1':
inquiry(); //查询函数
break;
case '2':
transfer(); //转移,转账。
break;
case '3':
change_password(); //修改密码
break;
case '4':
cunkuan(); //存款函数
break;
case '5':
qukuan(); //取款函数
break;
case '6':
quit(); //退出
break;
default:
printf("输入有误,请重新输入");
menu();
}
}