<5>c语言实现ATM存取款系统(文件、排序)

#include<stdio.h>
#include<String.h>
#include<math.h>
#include<stdlib.h>
#include<windows.h>
#define N 100

typedef struct info {
	char account[21];
	char user[21];
	long dsit;
	long pw;
	struct info *next;
}Info;

void login();
void regist();
int menu();
int refer();
int deposit();
int withdraw();
int transfer();
int resetPW();
int judgePW(long ps);
int search(char *s,int psw);
int searchAC(char *s);
void OutFile();
void InFile();
void Sort();
void Print();

Info *pt, *head = NULL, *tail, *p0;


main()
{
	int choice = -1;
	OutFile();

	while(1)
	{
		printf("               欢迎使用银行存取款系统             \n");
		printf("\n         ================================       \n");
		printf("           1.登录                                 \n");
		printf("           2.注册                                 \n");
		printf("           3.退出                                 \n");
		printf("\n         ================================       \n");

		printf("\t*  请输入您的选择:");
			scanf("%d", &choice);
		switch(choice)
		{
			case 1:
				system("cls");
		    	login();
				break;
			case 2:
				system("cls");
				regist();
				break;
			case 3:
                Sort();
                Print();
				InFile();
				exit(0);
				break;
			default:
				printf("输入有误,请重输...\n");
				break;
		}
	}
}

/登录//

void login()
{
	int flag;
	char my_act[100];
	long password;
	int X = -1;

	printf("\t\t=================****登录****=================\n\n");
	printf("\t\t*  输入账户:    ");
		scanf("%s", my_act);
	printf("\n");
	printf("\t\t*  输入密码:    ");
		scanf("%ld", &password);
	flag = search(my_act,password);
	if(flag == 1) {
		printf("\t\t登录成功,正在跳转页面...\n");
		p0 = pt;
		Sleep(2000);
		system("cls");
		while(1)
		{
			X = menu();//成功进入
			if(X == 1)
			{
				system("cls");
				menu();
			}
			else
				return;
		}

	}
	else if(flag == 0) {
		printf("\t\t账号或密码错误,请重新输入...\n");
		Sleep(2000);
		system("cls");
		return;
	}
}

int search(char *s,int psw) {
	if(head == NULL) {
		return 0;
	}
	pt = head;
	while(1) {
		if(strcmp(pt->account, s)==0&&pt->pw==psw) {
			return 1;
		}
		if(pt->next == NULL) break;
		pt = pt->next;
	}
	return 0;
}

int searchAC(char *s) {
	if(head == NULL) {
		return 0;
	}
	pt = head;
	while(1) {
		if(strcmp(pt->account, s)==0) {
			return 1;
		}
		if(pt->next == NULL) break;
		pt = pt->next;
	}
	return 0;
}

注册///
void regist()
{
	printf("\t\t=================****注册****=================\n\n");
	struct info *p1;
	p1 = (Info *)malloc(sizeof(Info));
	p1->next = NULL;
	int flag;

	printf("\t\t请输入您的账户....\n");
	printf("\t\t");
		scanf("%s", p1->account);
	printf("\t\t请输入用户名......\n");
	printf("\t\t");
		scanf("%s", p1->user);
	printf("\t\t输入您的密码......\n");
	printf("\t\t");
		scanf("%ld", &p1->pw);
	flag = search(p1->account,p1->pw);
	if(flag == 1) {
		printf("\t\t账户已存在,请重新注册......\n");
		Sleep(2000);
		system("cls");
		return;

	}
	else if(flag == 0) {
		printf("\t\t注册成功\n");
		//flagN = N; //标记当前注册账户是链表中的第几个
		p1->dsit = 0;
		if(head == NULL) {
			head = p1;
			tail = p1;
			//n ++;
			Sleep(2000);
			system("cls");
			return;
		}
		else {
			tail->next = p1;
			tail = p1;
			//n ++;
			Sleep(2000);
			system("cls");
			return;
		}
	}
}


主页面/

int menu()
{
	printf("\t\t=================****主页面****=================\n\n");
	printf("\t\t====================****************=================\n\n");
	printf("\t\t* 1. 查询                                              \n");
	printf("\t\t* 2. 存钱                                              \n");
	printf("\t\t* 3. 取钱                                              \n");
	printf("\t\t* 4. 转账                                              \n");
	printf("\t\t* 5. 修改密码                                          \n");
	printf("\t\t* 6. 安全退出                                          \n");
	printf("\t\t=====================================================\n\n");

	int choice = -1;
	int Y = -1;

	printf("\t\t *");
	printf("我的选择:");
		scanf("%d", &choice);
	while(1)
	{
		switch(choice)
		{
			case 1:
				system("cls");
				Y = refer();
				break;
			case 2:
				system("cls");
				Y = deposit();
				break;
			case 3:
				system("cls");
				Y = withdraw();
				break;
			case 4:
				system("cls");
				Y = transfer();
				break;
			case 5:
				system("cls");
				Y = resetPW();
				break;
			case 6:
				system("cls");
				return 0;
			default:
				printf("输入有误,请重输...\n");
				return 1;
		}
		switch(Y)
		{
			case 0:
				printf("出现错误!\n");
				return 0;
				break;
			case 1:  /*正常情况menu返回1重新进入menu*/
				return 1;
				break;
			case 2:
				Y = deposit();
				break;
			case 3:
				Y = withdraw();
				break;
			case 4:
				Y = transfer();
				break;
			case 5:
				Y = resetPW();
				break;
		}
	}
}

//查询/

int refer()
{
	printf("\t\t=================****查询****=================\n\n");
	printf("\t\t*  您的账户余额为:\n");
	printf("\t\t*  %ld\n", p0->dsit);
	Sleep(3000);
	system("cls");
	return 1;
}

//取款//

int deposit()
{
	long rMoney;
	printf("\t\t=================****存款****=================\n\n");
	printf("\t\t*  输入您要存入的钱数(整百):\n\n");
	printf("\t\t*  ");
		scanf("%ld", &rMoney);
	if(rMoney%100 != 0)
	{
		printf("\t\t*  出现错误,请重试...\n\n");
		return 2;
	}
	p0->dsit += rMoney;
	printf("\t\t*  存钱成功...\n\n");
	Sleep(2000);
	system("cls");
	return 1;
}

//取款/

int withdraw()
{
	long omoney;
	printf("\t\t=================****取款****=================\n\n");
	printf("\t\t*  输入您要取出的钱数...\n\n");
	printf("\t\t*  ");
		scanf("%ld", &omoney);
	if(omoney%100 != 0)
	{
		printf("\t\t*  出现错误...\n\n");
		Sleep(2000);
		system("cls");
		return 3;
	}
	if(omoney > p0->dsit)
	{
		printf("\t\t*  余额不足...\n\n");
		system("cls");
		return 1;
	}
	p0->dsit -= omoney;
	printf("\t\t*  取钱成功...\n\n");
	Sleep(2000);
	system("cls");
	return 1;
}

转账

int transfer()
{
	struct info *pFlag;
	char ob[20];
	long money;
	int flag;
	printf("\t\t=================****转账****=================\n\n");
	printf("\t\t*  请输入您要转账的账户...\n");
	printf("\t\t*  ");
		scanf("%s", ob);
	flag = searchAC(ob);
	pFlag = pt;
	if(flag == 1) {
		printf("\t\t*  输入要转出的钱数(整百):\n");
		printf("\t\t*  ");
			scanf("%ld", &money);
		if(money%100 != 0)
		{
			printf("\t\t *");
			printf("\t\t出现错误,请重试...\n");
			Sleep(2000);
			system("cls");
			return 1;
		}
		if(money > p0->dsit)
		{
			printf("\t\t*  余额不足.....\n");
			return 1;
		}
		p0->dsit -= money;
		pFlag->dsit += money;
		Sleep(2000);
		printf("\t\t*  转账成功...");
		Sleep(2000);
		system("cls");
		return 1;
	}
	else if(flag == 0) {
		printf("\t\t*  对不起,您输入的账户不存在...\n");
		printf("*****************请稍等*********************");
		Sleep(2000);
		system("cls");
		return 1;

	}
}

///修改密码

int resetPW()
{
	long  password1, password2;
	long newpassword;
	printf("\t\t=================****修改密码****=================\n\n");
	printf("\t\t*  请输入原始密码...\n\n");
	printf("\t\t*  ");
		scanf("%ld", &password1);
	printf("\t\t*  请再次输入...\n\n");
	printf("\t\t*  ");
		scanf("%ld", &password2);
	if(p0->pw == password1 && p0->pw == password2)
	{
		printf("\t\t*  输入新密码...\n\n");
		printf("\t\t*  ");
			scanf("%ld", &newpassword);
		if(judgePW(newpassword) == 1)
		{
			p0->pw = newpassword;
			printf("\t\t*  密码重置成功...\n\n");
			Sleep(2000);
			system("cls");
			return 1;
		}
		else
		{
			printf("\t\t*  输入的密码不符合规则,请重试...\n");
			Sleep(2000);
			system("cls");
			return 5;
		}

	}
	else
	{
		printf("\t\t*  密码错误...\n");
		Sleep(2000);
		system("cls");
		return 1;
	}
	return 1;
}
//密码判断
int judgePW(long ps)
{
	int n, k;
	for(k=0; k<6; k++)
	{
		n = ps%10;
		ps = ps/10;
		if(n < 0 || n > 9)
		{
			return 2;
		}
	}
	return 1;
}
///文件读取
void  OutFile(){
	FILE *fp;
	Info *p;
    fp = fopen("record.txt","rb+");
	if(!fp) {
		printf("ERROR!");
		return;
	}
    while(1){
        p = (Info *)malloc(sizeof(Info));
        fread(p,sizeof(Info),1,fp);
        if(p->next==NULL){
            tail->next=p;
            tail=p;
            break;
		}
		else{
			if(head == NULL){
				p->next = NULL;
				head = tail = p;
			}
			else {
				p->next=NULL;
				tail->next=p;
				tail=p;
			}
        }
    }
    fclose(fp);
}
//文件读入
void InFile(){
	FILE *ft;
	Info *p;
	p = head;
    while(p->next != NULL){
        ft = fopen("record.txt","wb+");
        fwrite(p, sizeof(Info), 1, ft);
        p = p->next;
    }
    fwrite(p, sizeof(Info), 1, ft);
    fclose(ft);
}
//排序/
void Sort(){
    Info *p, *pt, *p1, *p2, *p0, *px;
    /*链表冒泡法排序*/
    while(1) {
        p0 = head->next;
        /*包含头结点的比较为特殊情况,先进行比较*/
        if(head->pw > p0->pw) {
            head->next = p0->next;
            p0->next= head;
            head = p0;
        }//此时p0等于head
        //print(head);
        pt = head;
        while(1) {//p0为前置节点,p1,p2为要比较的节点
            p0 = pt;
            p1 = p0->next;
            p2 = p1->next;
            if(p1->pw > p2->pw) {
                p1->next = p2->next;
                p0->next = p2;
                p2->next = p1;
                if(p1->next==NULL || p1==px) {
                    px = p2;
                    break;
                }
            }
            else {
                if(p2->next==NULL || p2==px) {
                    px = p1;
                    break;
                }
            }
            pt = pt->next;
        }
        /*px的作用:每进行一次循环比较,就将一个最大的数
        推到最后,而px就记录这个最大数的前面一个数,排序完后
        px == head->next*/
        if(px == head->next) break;
    }
}
///账号查询
void Print(){
	Info *p;
	p=head;
	while(1){
		printf("%ld ", p->pw);
		if(p->next == NULL) break;
		p=p->next;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值