ATM管理系统
| 博客班级 | 计算机与信息学院AHPU-软件工程导论-计算机1 | 
|---|---|
| 作业要求 | 个人作业三-ATM管理系统 | 
| 作业目标 | 1)查询相关资料,了解ATM管理系统的需求 | 
| 2)设计一个简单的ATM管理系统,完成需求的功能 | |
| 学号 | <3180701116> | 
一、题目要求
编写一个ATM管理系统,语言不限,要求应包括以下主要功能:
(1)开户,销户
(2)查询账户余额
(3)存款
(4)取款
(5)转账(一个账户转到另一个账户)等...
允许网上查询参考,但请注意不要直接抄袭,可以理解看懂别人的代码,再自己编写
二、代码实现
1.头文件
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<stdio.h>
2.结构体与链表结点
typedef struct tagPerson{
	char szUsername[20];//用户名
	char szPassword[7];//密码 
	char szAccountNumber[20];//银行账户 
	float fMoney;//余额 
}Person; //(定义一个银行账户结构体的基本信息)
typedef struct tagNode{
	Person per;//数据域 
	struct tagNode *pNext;//指针域 
}Node;
Node *g_pHead=NULL;//链表头结点 
3.开户
int CreateAccount(){
	printf("\n\t\t\t\t\t请输入您的姓名:");
	char szUsername[20];
	scanf("%s",szUsername);//szUsername指针 地址 
	
	printf("\n\t\t\t\t\t请设置您的银行卡密码:"); 
	char szPassword[7];
	scanf("%s",szPassword);
	
	printf("\n\t\t\t\t\t请再次输入您的银行卡密码:"); 
	char szRePassword[7];
	scanf("%s",szRePassword);
	//判断两次输入的密码是否一致 
	if(strcmp(szPassword,szRePassword)!=0){//相同为0,不同不为0 
		printf("\n\t\t\t\t\t两次输入的密码不一致!\n");
		return 0;
	}
	//随机生成银行账号
	char szAccountNum[20];//0000 0000 0000 0000 0 0
	//1000~9999
	srand((unsigned int)time(NULL));
	sprintf(szAccountNum,"%d%d%d%d%d%d",rand()%9000+1000,
					rand()%9000+1000,rand()%9000+1000,rand()%9000+1000,rand()%10,rand()%10);//sprintf格式化字符串 
		
	//循环找到链表的尾结点	
	Node *p=g_pHead;
	while(g_pHead!=NULL&&p->pNext!=NULL){
		p = p->pNext;
	}
	
	//开辟一个新节点 
	Node *pNewNode=(Node*)malloc(sizeof(Node));
	strcpy(pNewNode->per.szUsername,szUsername);
	strcpy(pNewNode->per.szPassword,szPassword);
	strcpy(pNewNode->per.szAccountNumber,szAccountNum);
	pNewNode->per.fMoney=0.0f;
	pNewNode->pNext=NULL;
	
	//添加到尾结点后面
	if(g_pHead==NULL){
		g_pHead=pNewNode;
	}
	else{
		p->pNext=pNewNode; 
	}
	
	//打印信息
	printf("\n\t\t\t\t\t您的账户信息如下:\n"); 
	printf("\n\t\t\t\t\t\t姓名:%s\n",pNewNode->per.szUsername); 
	printf("\n\t\t\t\t\t\t卡号:%s\n",pNewNode->per.szAccountNumber); 
	printf("\n\t\t\t\t\t\t余额:%0.2f\n",pNewNode->per.fMoney); 
	
	printf("\n\t\t\t\t\t您好!您的账户申请成功!\n");
	
	return 1; 
} 
4.登录系统
int Login(){
	char szAccountNum[20];//账号
	char szPassword[7];//密码 
	
	printf("\n\t\t\t\t\t请输入您的卡号:");
	scanf("%s",szAccountNum);
	
	//遍历链表寻找当前账号 
	Node *p=g_pHead;
	while(p!=NULL){
		if(strcmp(p->per.szAccountNumber,szAccountNum)!=0){
			p=p->pNext;
			continue;
		}
		else{
			int i=0;
			for(i=0;i<3;i++){
				printf("\n\t\t\t\t\t请输入您的密码:");
				scanf("%s",szPassword);
				
				if(strcmp(szPassword,p->per.szPassword)!=0){
					printf("\n\t\t\t\t\t密码输入错误,请重新输入密码,剩余次数:%d\n",2-i);//控制输入密码次数不超过三次
					system("pause");
					system("cls");
					continue;
				}
				else{
					system("cls");
					//进入菜单页面 
					Menu(p);					
					return 1; 
				}
			}
		}
	} 
	printf("\n\t\t\t\t\t请输入您的密码:");
	
	return 1;
}
5.取款功能
	float fMoney;
	printf("\n\t\t\t\t\t请输入要取款的金额:");
	fflush(stdin);
	scanf("%f",&fMoney);
	while(fMoney<=0||fMoney>pNode->per.fMoney){
		printf("\n\t\t\t\t\t取款额不能小于等于零或者大于余额,请重新输入!\n");
		scanf("%f",&fMoney);
	}
	pNode->per.fMoney-=fMoney;
	printf("\n\t\t\t\t\t您的账户成功取出%.2f元!\n",fMoney); 
	return 1;
} 
6.存款功能
int Deposits(Node *pNode){
	float fMoney;
	printf("\n\t\t\t\t\t请输入要存款的金额:");
	fflush(stdin);
	scanf("%f",&fMoney);
	while(fMoney<=0){
		printf("\n\t\t\t\t\t存款额不能小于等于零,请重新输入!\n");
		printf("\n\t\t\t\t\t请输入要存款的金额:");
		scanf("%f",&fMoney);
	}
	pNode->per.fMoney+=fMoney;
	printf("\n\t\t\t\t\t您的账户成功存入%.2f元!\n",fMoney); 
	return 1;
}
7.转账功能
int TransFer(Node *pNode){
	char szAccountNum[20];
	float fMoney;
	printf("\n\t\t\t\t\t请输入要转入的账户卡号:");
	fflush(stdin);
	scanf("%s",szAccountNum);
	
	printf("\n\t\t\t\t\t请输入要转入的金额:");
	fflush(stdin);
	scanf("%f",&fMoney);
	
	//遍历寻找需要转入的账号
	Node *p=g_pHead;
	while(p!=NULL){
		if(strcmp(p->per.szAccountNumber,szAccountNum)!=0){
			p=p->pNext; 
			continue;
		}
		else{
			pNode->per.fMoney-=fMoney;
			p->per.fMoney+=fMoney;
			printf("\n\t\t\t\t\t转账成功!\n"); 
			return 1; 
		}
	}
	printf("\n\t\t\t\t\t转出账户不存在!\n");
	return 1;	
}
8.销户功能
int CancelAccount(){
	char Number[20],passWord[7];
	printf("\n\t\t\t\t\t请输入所需要注销的账户卡号:");
	scanf("%s",Number);
	
	Node *p=g_pHead,*q=g_pHead;
	while(p!=NULL){
		if(strcmp(p->per.szAccountNumber,Number)!=0){
			q=p;
			p=p->pNext;
			continue;
		}
		else{
			int i=0;
			for(i=0;i<3;i++){
				printf("\n\t\t\t\t\t请输入所需要注销的账户卡号密码:");
				scanf("%s",passWord);
				if(strcmp(passWord,p->per.szPassword)!=0){
					printf("\n\t\t\t\t\t密码输入错误,请重新输入密码,剩余次数:%d\n",2-i);
					system("pause");
					system("cls");
					continue;
				}
				else{
					q->pNext=p->pNext;
					free(p);
					printf("\n\t\t\t\t\t注销账户成功!\n");
					return 1;
				}
				printf("\n\t\t\t\t\t注销账户失败!\n");
				return 0;
			}
		}
	}
	return 1;
}
9.子菜单
void Menu(Node *pNode){
	char ch;
	start:
		printf("\n\n\t\t\t\t\t\t\t请选择您需要的业务:\n\n\n");
		printf("\n\t\t\t\t\t  1>取款\t\t\t2>查询\n");
		printf("\n\t\t\t\t\t  3>转账\t\t\t4>修改密码\n");
		printf("\n\t\t\t\t\t  5>存款\t\t\t6>退出\n");
		
		ch=getch();
		
		switch(ch){
			case '1'://取款
				WithDrawal(pNode); 
				system("pause");
				system("cls"); 
				break;
			case '2'://查询
				Find(pNode); 
				system("pause");
				system("cls");
				break;
			case '3'://转账 
				TransFer(pNode);
				system("pause");
				system("cls");
				break; 
			case '4'://修改密码
				ChangePa(pNode);
				system("pause");
				system("cls");
				break;
			case '5'://存款 
				Deposits(pNode);
				system("pause");
				system("cls");
				break;
			case '6'://退出 
				return;	
		}
		goto start;
}
10.修改密码
int ChangePa(Node *pNode){
	char passWord1[7],passWord2[7];
	printf("\n\t\t\t\t\t请输入原密码:");
	scanf("%s",passWord1);
	printf("\n\t\t\t\t\t请输入新密码:");
	scanf("%s",passWord2);
	for(int i=0;i<3;i++){
		if(strcmp(passWord1,pNode->per.szPassword)!=0){
			printf("\n\t\t\t\t\t原密码输入错误!还有%d次输入机会,请重新输入:\n",2-i);
			scanf("%s",passWord1);
		}
		else{
			strcpy(pNode->per.szPassword,passWord2);
			printf("\n\t\t\t\t\t密码修改完成!\n");
			return 1;
		} 
	}
	return 1;
}
11.主函数
int main(){
	start:
		printf("\n\n\t\t\t\t\t\t\tATM管理系统\n\n\n");
		
		printf("\t\t\t\t\t\t\t  1.开户\n");
		printf("\t\t\t\t\t\t\t  2.登录\n");
		printf("\t\t\t\t\t\t\t  3.销户\n");
		printf("\t\t\t\t\t\t\t  4.退出\n");
	
		char ch = getch();
		switch(ch){
			case '1'://开户
				CreateAccount();
				system("pause");
				system("cls");
				break;
			case '2'://登录
				Login();
				system("pause");
				system("cls");
				break; 
			case '3'://销户
				CancelAccount(); 
				system("pause");
				system("cls");
				break;
			case '4'://退出 
				exit(0); 
				break;	
		}
	goto start;
	return 0;
} 
三、代码运行
1.主菜单

2.开户

3.登录系统需输入个人信息

4.子菜单界面

5.存取款

6.查询信息

7.转账

四、个人小结
1.psp耗时表
| psp2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) | 
|---|---|---|---|
| Planning | 计划 | 500 | 700 | 
| Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 550 | 700 | 
| Development | 开发 | 200 | 300 | 
| Analysis | 需求分析(包括学习新技术) | 30 | 30 | 
| Design Spec | 生成设计文档 | 30 | 30 | 
| Design Review | 设计复审 | 20 | 20 | 
| Coding Standard | 代码规范 | 15 | 30 | 
| Design | 具体设计 | 15 | 10 | 
| Coding | 具体编码 | 120 | 150 | 
| Code Review | 代码复审 | 10 | 10 | 
| Test | 测试(自我测试,修改代码,提交修改) | 30 | 30 | 
| Reporting | 报告 | 15 | 10 | 
| Test Report | 测试报告 | 20 | 15 | 
| Size Measurement | 计算工作量 | 20 | 30 | 
| Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 30 | 
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号