zoukankan      html  css  js  c++  java
  • 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("***************************************
    ");
    	printf("**                                   **
    "); 
    	printf("**         欢迎使用ATM系统           **
    ");
    	printf("**                                   **
    ");
    	printf("***************************************
    ");
    	printf("请输入用户账号:");
    	scanf("%d",&card);
    	printf("
    请输入密码:");
    	scanf("%s",&passward);
    	for(r=p->next;r!=NULL;r=r->next){
    		count2++;
    		if(card==r->card && strcmp(r->passward,passward)==0){
    			printf("
    登录成功
    ");
    			break;
    		}else{
    			count1++;
    		}
    	}
    	if(count1==count2){
    		printf("
    登录失败
    ");
    		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("
    继续操作(1)
    ");
    		printf("
    退出系统(0)
    ");
    		scanf("%d",&flag1);
    		system("cls"); 
    		
    	}
    	savefile(p);						//重新将新增的信息写入事先编好的text文件里
    
    
    	return 0;
    }
    
    

    目录导航界面

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

    用户信息文件读入

    //读入现有用户数据
    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("***************************************
    ");
    		printf("**                                   **
    "); 
    		printf("**  ERROR:无法正常读入用户数据!!  **
    ");
    		printf("**           (系统退出)              **
    ");
    		printf("**                                   **
    ");
    		printf("***************************************
    ");
    		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	%d	%f	%s	%s
    ",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("请输入身份证号,密码,姓名(回车键隔开):
    ");
    	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("
    开户成功
    ");
    	printf("新增用户:卡号:%d	身份证:%d	余额:%f	姓名:%s
    ",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
    ",p->money); 
    			break;
    		}
    	}
    
    } 
    

    取款

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

    存款

    //存款
    void put_money(struct user* p,int card){
    	for(;p!=NULL;p=p->next){
    		if(card==p->card){
    			printf("您当前的余额为:%.2f
    ",p->money); 
    			break;
    		}
    	}
    	printf("请输入您想要存储的金额:");
    	float money;
    	scanf("%f",&money);
    	p->money=p->money+money;
    	printf("操作成功,您当前的余额为:%.2f
    ",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("
    转账用户不存在,请检查账号输入是否有误。
    ");
    			printf("
    当前您还有一次操作机会
    ");
    			goto label;
    		}else{
    			printf("
    本次转账操作强行结束
    ");
    			return; 
    		}
    	
    	}
    	printf("请输入您想要转账的金额:");
    	float tmoney;
    	scanf("%f",&tmoney);
    	if(tmoney<=r->money){
    		r->money=r->money-tmoney;		//您的用户减钱 
    		q->money=q->money+tmoney;		//目标用户加钱 
    		printf("
    操作成功,您的当前余额:%.2f
    ",r->money);
    	} else{
    		printf("操作失败,您的账户余额不足
    ");
    	}	
    }
    

    销户

    //销户
    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
    ",r->money); 
    			break;
    		}
    	}
    	int flag;
    	printf("取出全部金额并销户(1)
    ");
    	printf("取消销户(0)
    ");
    	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
  • 相关阅读:
    VMWare相关知识
    QTP中的DataTable操作
    解决Access的sql语句join两次出错的问题
    .net环境用GDI+绘制倾斜文字
    用JS读取XML文件
    再认识asp.net的postback机制:探索__doPostBack的来龙去脉
    用Jquery读取Json内容
    JS取URL参数值的一个方法
    WinForm在窗体里面添加窗体
    ASP.NET2.0Theme回顾总结
  • 原文地址:https://www.cnblogs.com/lancedu/p/14002386.html
Copyright © 2011-2022 走看看