ATM管理系统

名称 内容
课程班级 班级连接
作业要求 ATM管理系统
学号 3180701313

作业要求

编写一个ATM管理系统,语言不限,要求应包括以下主要功能:

(1)开户,销户

(2)查询账户余额

(3)存款

(4)取款

(5)转账(一个账户转到另一个账户)等...

允许网上查询参考,但请注意不要直接抄袭,可以理解看懂别人的代码,再自己编写

源代码

导入函数和数据结构设置

全系统使用单链表进行数据的存储操作,对于ATM系统的操作中,用户使用自己的卡号以及密码登录系统。进入系统后用户选择要进行的操作,对于开户操作用户可以帮助其他人进行开户,也可以增加自己的账户,但是在进行其他操作的时候用户只可以对自己的账户进行操作,基于这样的思考,之后的其他操作系统不再要求用户输入卡号,直接读入用户登入系统时的卡号进行操作。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 6 //密码六位

/*
1、文件读写出现有用户信息
2、开户,销户
3、余额查询
4、存款,取款,转账 
*/ 
struct user{
	int card;			//卡号 2020 04 06 001 
	char name[6];			//姓名 
	int person_num;	//身份证号 3610 2000 0919
	float money;		 	//余额
	char passward[N];		//密码 
	struct user *next;		//指向下一个结点 
};

主函数设置

int main() {
	struct user *p=NULL;
	int card=2001,count1=0,count2=0;
	char passward[N],c;
	int flag;
	struct user *r=NULL;
	int flag1=1;
	p=readfile(p);						            //从文件里读取用户信息
	printf("***************************************\n");
	printf("**                                   **\n"); 
	printf("**         欢迎使用ATM系统           **\n");
	printf("**                                   **\n");
	printf("***************************************\n");
	printf("请输入用户账号:");
	scanf("%d",&card);
	printf("\n请输入密码:");
	scanf("%s",&passward);
	for(r=p->next;r!=NULL;r=r->next){
		count2++;
		if(card==r->card && strcmp(r->passward,passward)==0){
			printf("\n登录成功\n");
			break;
		}else{
			count1++;
		}
	}
	if(count1==count2){
		printf("\n登录失败\n");
		exit(0);
	}
	while(flag1){
		menu();
		printf("选择相应操作:");
		scanf("%d",&flag);
		switch(flag){
			case 1:{						//开户 
				p=add_user(p);
				break;
			}
			case 2:{						//查询账号余额 
				search_user(p,card);
				break;
			}
			case 3:{						//取款 
				get_money(p,card);
				break;
			}
			case 4:{						//存款 
				put_money(p,card);
				break;
			}
			case 5:{						//转账 
				turn_money(p,card); 
				break;
			}
			case 6:{						//销户
				p=delete_user(p,card);
				break;
			}
			default :exit(0);break;
		}
		printf("\n继续操作(1)\n");
		printf("\n退出系统(0)\n");
		scanf("%d",&flag1);
		system("cls"); 
		
	}
	savefile(p);						//重新将新增的信息写入事先编好的text文件里


	return 0;
}

目录导航界面

//菜单
void menu(){
	system("cls");
	printf("************************************************\n");
    printf("**           1、开户       2、查询            **\n");
    printf("**           3、取款       4、存款            **\n");
    printf("**           5、转账       6、销户            **\n");
    printf("**               退出(任意键)               **\n");
    printf("************************************************\n");
} 

用户信息文件读入

//读入现有用户数据
struct user * readfile(struct user *p){
	struct user * r=NULL;
	FILE *fp;				//定义文件指针
	p=(struct user*)malloc(sizeof(struct user));
	p->next=NULL;
	if ((fp = fopen("user.txt", "r")) == NULL){                  //读入失败
		printf("***************************************\n");
		printf("**                                   **\n"); 
		printf("**  ERROR:无法正常读入用户数据!!  **\n");
		printf("**           (系统退出)              **\n");
		printf("**                                   **\n");
		printf("***************************************\n");
		exit(0); 
	}else{                                                            //读入成功
		while (!feof(fp))
		{
			r=(struct user*)malloc(sizeof(struct user));
			fscanf(fp,"%d%d%f%s%s",&r->card,&r->person_num,&r->money,&r->passward,&r->name);
			r->next=p->next;
			p->next=r;
		}
	}
	fclose(fp);
	return p;	
}

用户信息写入文档

//写入用户信息
void savefile(struct user *p)
{
	struct user *r=NULL;
	FILE *fp;
	r=p->next;
	fp=fopen("user.txt","w+");
	while(r!=NULL)
	{
		fprintf(fp,"%d\t%d\t%f\t%s\t%s\n",r->card,r->person_num,r->money,r->passward,r->name);
		r=r->next;
	}
	fclose(fp);
}

开户

//开户
struct user *add_user(struct user *p){
	struct user *r;
	struct user *q;
	char c;
	r=(struct user*)malloc(sizeof(struct user));
	printf("请输入身份证号,密码,姓名(回车键隔开):\n");
	scanf("%d",&r->person_num);
	scanf("%s%s",&r->passward,&r->name);
	r->card=2000+rand()%100;
	for(q=p;q!=NULL;q=q->next){
		if(q->card==r->card){
			r->card=r->card+1;
		}else{
			continue;
		}
	}
	r->money=0;
	r->next=p->next;
	p->next=r;
	printf("\n开户成功\n");
	printf("新增用户:卡号:%d\t身份证:%d\t余额:%f\t姓名:%s\n",r->card,r->person_num,r->money,r->name);
	return p;
} 

查询账号余额

//查询
void search_user(struct user* p,int card){
	for(;p!=NULL;p=p->next){
		if(card==p->card){
			printf("您当前的余额为:%.2f\n",p->money); 
			break;
		}
	}

} 

取款

//取款
void get_money(struct user* p,int card){
	for(;p!=NULL;p=p->next){
		if(card==p->card){
			printf("您当前的余额为:%.2f\n",p->money); 
			break;
		}
	}
	printf("请输入您想要取出的金额:");
	float money;
	scanf("%f",&money);
	if(money<=p->money){
		p->money=p->money-money;
		printf("\n操作成功,当前余额:%.2f\n",p->money);
	} else{
		printf("操作失败,账户余额不足\n");
	}
} 

存款

//存款
void put_money(struct user* p,int card){
	for(;p!=NULL;p=p->next){
		if(card==p->card){
			printf("您当前的余额为:%.2f\n",p->money); 
			break;
		}
	}
	printf("请输入您想要存储的金额:");
	float money;
	scanf("%f",&money);
	p->money=p->money+money;
	printf("操作成功,您当前的余额为:%.2f\n",p->money); 
} 

转账

//转账
void turn_money(struct user* p,int card){
	struct user * r;
	struct user * q;
	int con=0;
	for(r=p;r!=NULL;r=r->next){
		if(card==r->card){
			int money;
			money=r->money;
			break;
		}
	}
label:	printf("请输入您想要的转账对象的卡号:");
	int tcard;
	scanf("%d",&tcard); 
	con++;
	int count=0;		//0表示账号不存在,1表示账号存在 
	for(q=p;q!=NULL;q=q->next){
		if(tcard==q->card){
			count=1; 
			break;
		}
	}
	if(count==0){			//判断转账用户是否存在 
		if(con<2){
			printf("\n转账用户不存在,请检查账号输入是否有误。\n");
			printf("\n当前您还有一次操作机会\n");
			goto label;
		}else{
			printf("\n本次转账操作强行结束\n");
			return; 
		}
	
	}
	printf("请输入您想要转账的金额:");
	float tmoney;
	scanf("%f",&tmoney);
	if(tmoney<=r->money){
		r->money=r->money-tmoney;		//您的用户减钱 
		q->money=q->money+tmoney;		//目标用户加钱 
		printf("\n操作成功,您的当前余额:%.2f\n",r->money);
	} else{
		printf("操作失败,您的账户余额不足\n");
	}	
}

销户

//销户
struct user * delete_user(struct user* p,int card){
	struct user* r;
	struct user* q;
	r=p;
	for(;r!=NULL;r=r->next){
		if(card==r->card){
			printf("当前账号存在余额:%.2f\n",r->money); 
			break;
		}
	}
	int flag;
	printf("取出全部金额并销户(1)\n");
	printf("取消销户(0)\n");
	scanf("%d",&flag);
	
	if(flag==1){
		for(r=p;r!=NULL;r=r->next){
			q=r->next;
			if(q->card==card){
				r->next=q->next;
				free(q);
				break;
			}
		}
	}else{
		return p;
	} 
	
	return p; 
} 

运行截图

文档准备

登录

以卡号2001号用户,杜扬帆为测试实例:

开户

查询余额

取款

存款

转账

销户

完成后保存文件

在以上的操作中,我们重新开了一个新的账号:卡号:2047 身份证:36108756 姓名:胡俊涵; 而在销户的时候将我们的登录账号:卡号:2001 身份证:36100406 姓名:杜扬帆
因此得到一下的结果:

小结

总结

在编写ATM管理系统的时候,能够完成系统的基本职能。但是可能在一些细节的方面考虑不够周全,代码没有经过二次加工为初代产品,可能会有部分瑕疵没有发现。

psp表格

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 20 15
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10 8
Development 开发 180 220
Analysis 需求分析(包括学习新技术) 25 20
Design Spec 生成设计文档 30 25
Design Review 设计复审 15 10
Coding Standard 代码规范 10 5
Design 具体设计 20 15
Coding 具体编码 40 50
Code Review 代码复审 15 13
Test 测试(自我测试,修改代码,提交修改) 20 15
Reporting 报告 25 30
Test Report 测试报告 5 5
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 10 10

posted on 2020-11-18 21:45  沐羽琉年  阅读(251)  评论(0编辑  收藏  举报