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.主菜单
ATM管理系统
2.开户
ATM管理系统
3.登录系统需输入个人信息
ATM管理系统
4.子菜单界面
ATM管理系统
5.存取款
ATM管理系统
6.查询信息
ATM管理系统
7.转账
ATM管理系统

四、个人小结

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
上一篇:实验二 结构化分析与设计


下一篇:How to check memory usage per process in Linux