个人作业-ATM管理系统(简易版)

软件工程导论 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19
作业要求 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11477
作业的目标 编写ATM系统,了解该系统内部算法与机制
学号 AHPU <3190704128>

一.关于ATM系统编写的个人说明

  **本人编写的ATM系统,使用C语言,以及结构体,完成银行基本的“开户、销户、存款、取款、转账、信息查询等功能”。**
  (说明:目前账户开户支持三位数以内的账号)
  (是个菜鸡,欢迎大家批评指正~)

二.各个功能的模块化(实现函数)

头文件& 全局变量

 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 #include<conio.h>

 #define N 999 //其实此处的N可以用来控制账号,多少位都可以,这里我们规定少一点,先三位数账号吧

函数声明

struct node
{
	 char name[40];         //用户名
	 long acnumb;        //账号
	 char pword[6];			//密码
	 float balance;          //余额

}user[N];

//功能1:开户
void InputUserInfor(struct node user[]) ;

//功能2:销户
 void DeleteUserInfor(struct node user[]);

//功能3:存款
void Saving(struct node user[]); 

//功能4:取款
 void WithDrawal(struct node user[]); 

//功能5:转账
void Transfer(struct node user[]); 

//功能6:查询
void GetBalance(struct node user[]) ;

(1)开户

//功能1:开户 
void InputUserInfor(struct node user[]) 
{
	char pword2[6]; 
	int i,j;
	printf("请输入开户人账号,(目前支持三位数账户):");
	scanf("%d",&i); 
	user[i].acnumb=i;
	printf("请输入开户人%d姓名:",i);
	scanf("%s",user[i].name);	
	printf("请输入开户人%d的开户金额:",i);
	scanf("%f",&user[i].balance);
    printf("请输入账户密码:");
    getchar();
	gets(user[i].pword);
	printf("请再次输入账户密码:");
	gets(pword2);
	printf("\n");
	if(strcmp(pword2,user[i].pword)==0)
	{
		printf("开户名:%s\n",user[i].name);
		printf("您的账号为:%ld\n",user[i].acnumb);
		printf("您的开户金额为:%.2f\n",user[i].balance) ;
		printf("您的密码设置为:%s,请牢记您的密码!\n",user[i].pword);	
		printf("\t开户成功!\n") ; 	
	} 	
	else
	{
		printf("输入有误请重新设置!!!");
	}
	
}

(2)销户

//功能2:销户
 void DeleteUserInfor(struct node user[])
 {
 	int i,j,k;
	char pword2[6];
	printf("这里是销户功能界面,请按以下提示进行操作:\n"); 
	printf("请输入您的账号:");
	scanf("%d",&i);
	getchar(); 
	printf("请输入密码:");
	gets(pword2);
	getchar();
	if(strcmp(pword2,user[i].pword)==0)
	{
		if(user[i].balance>0) 
		{
			printf("您的账户余额为%.2f元,请前往柜台取出余额。\n",user[i].balance); 
		}
		else
		{
			printf("您确认销户吗?确认请输入1,取消请输入0:");
			scanf("%d",&j);
			if(j==1)
			{
				user[i].acnumb=0;
				for(k=0;k<40;k++)
				{
					user[i].name[k]='\0';
				}
				user[i].balance=0;
				for(k=0;k<6;k++)
				{
					user[i].pword[k]='\0';
				}
				printf("销户成功!\n");
			}
			else
				printf("您已终止销户办理,如有疑问请咨询营业点大堂经理!\n");
		}
	}
	else
		printf("您输入的密码有误!");
		
  }

(3)存款

//功能3:存款 
void Saving(struct node user[])
{
	int i;
	char pword2[6];
	long money;
	printf("请输入您的账号(目前支持三位数):");
	scanf("%d",&i); 
	getchar();
	printf("请输入账户密码:\n");
	gets(pword2);
	getchar();
	if(strcmp(pword2,user[i].pword)==0)
	{
	printf("请输入您需要存的金额,支持非整百(此处替代将钞票叠整齐放出存钞口,且放少于100张钞票):");
	scanf("%ld",&money);
	user[i].balance= user[i].balance+money;
	printf("\n"); 
	printf("存款成功!\n"); 
	printf("您的账号余额为:%.2f",user[i].balance);		
	} 	
	else
	{
	printf("输入有误请重新输入密码!!!");
	}	 
} 

(4)取款

void WithDrawal(struct node user[])
{
	int i,j;
	char pword2[6];
	long money;
	printf("请输入您的账号(目前仅三位数):");
	scanf("%d",&i); 
	getchar();
	printf("请输入密码:\n");
	gets(pword2);
	getchar();
	if(strcmp(pword2,user[i].pword)==0)
	{
		printf("请输入您需要取出的金额,支持非整百:\n");
		scanf("%ld",&money);
		user[i].balance= user[i].balance-money;
		printf("\n");
		printf("您已成功取款%d元\n",money); 
		printf("您的账号余额为:%.2f",user[i].balance);	
	}
	else
		printf("您输入的密码有误,请重新输入!");
	
}

(5)转账

void Transfer(struct node user[]) 
{
	int i,j;
	long money;
	printf("请保证目前银行有大于等于两个的开户账号!");
	printf("目前不支持跨行转账!");
	printf("请输入汇款人编号,如0,1:") ;
	scanf("%d",&i);
	printf("请输入汇款金额:"); 
	scanf("%ld",&money);
	printf("请输入收款人编号,如0,1:");
	scanf("%d",&j);
	user[i].balance=user[i].balance-money;
	user[j].balance=user[j].balance+money;
	printf("\n");
	printf("成功转账%ld元,您的账户余额为%.2f",money,user[i].balance);
}

(6)查询余额

void GetBalance(struct node user[]) 
{
	int i,j;
	char pword2[6];
	printf("这里是查询功能界面,请按以下提示进行操作:\n"); 
	printf("请输入您的账号:");
	scanf("%d",&i);
	getchar(); 
	printf("请输入密码:");
	gets(pword2);
	getchar();
	if(strcmp(pword2,user[i].pword)==0)
	{
		printf("\t  账号 :%ld\n",user[i].acnumb);
		printf("\t用户名 :");
		puts(user[i].name);
		printf("\t  余额 :%.2f",user[i].balance);	
	}
	else
	printf("您输入的密码有误!");	
}

功能菜单

int Menu(void)
{
	int item;
	system("cls"); //清屏操作
	printf("\n\t\t  这是中国nb银行ATM系统\n\n");
	printf("\t\t  请选择您要进行的操作:\n\n");
	printf("\t______________________________________________\n");
	printf("\t\n");
	printf("\t|***************   1:开户   *****************|\n");
	printf("\t|***************   2:销户   *****************|\n");
	printf("\t|***************   3:存款   *****************|\n");
	printf("\t|***************   4:取款   *****************|\n");
	printf("\t|***************   5:转账   *****************|\n");
	printf("\t|***************   6:查询余额 ***************|\n");
	printf("\t|***************   0:退出   *****************|\n");
	printf("\t______________________________________________\n");
	printf("\n\n 请输入指令:");
	scanf("%d",&item); /*读用户选择的命令*/
	return item;
}
int main()
{
	int item;

	while(1)
	{
		item=Menu();
		switch(item)
		{
		case 1:
			InputUserInfor(user);
			getchar();
			break;
		case 2:
			DeleteUserInfor(user); 
			getchar();
			getchar();
			break;
		case 3:
			Saving(user);
			getchar();
			getchar();
			break;
		case 4:
			WithDrawal(user);
			getchar();
			getchar();
			break;
		case 5:
			Transfer(user);
			getchar();
			getchar();
			break;
                case 6:
        	        GetBalance(user) ;
        	        getchar();
        	        break;
		        case 0:
			printf("您已退出ATM系统,欢迎下次使用,再见!\n\n");
			exit(0);
			getchar();
			break;
		default:
			printf("\n\n输入的命令不对,请重新输入!!!\n\n");
			getchar();
			getchar();
			break;
		}
	}
}

三.程序调试

(1)开户

 账户1:

 账户2:

(2)存款(这里对账户1进行操作)

(3)取款(这里对账户2进行操作)

(4)转账(这里由账户1转300元至账户2)

(5)销户(这里对账户1进行销户)

我们可以看到,有余额不可以进行销户。

** 所以我们下面取出余额 **

接下来继续进行对账户1的销户

(6)查询余额(这里对账户1和账户2同时进行查询,验证查询功能和销户是否成功)


(7)退出系统

三.个人小结

(1)PSP表格

(2)个人总结

 其实之前用C语言编写过销售管理系统,所以对于这次的ATM系统的编写来说,初步的用户界面设计就比较轻松了,而且对于结构体的使用也会更加熟练。
  就算法而言,ATM系统的计算很简易,多数就是数据的加减。
  我有考虑怎么将用户的输入密码进行覆盖显示就是输入“111111”,同步显示出来的是“******”,但是目前我没有掌握这个方法。好像我们同学里有会的,我之前做课设的时候有见到。
  
  
  **然后就是关于这么多字符串的处理:**
  我将密码固定为六位数,并以字符数组形式储存。每次用户进行金额查询或存取时,会进行输入密码和原始密码的比较,成功了才可以继续进行后面的操作。
  这里使用到strcmp(str1,str2),这个函数,如果两个字符串ASCII码一致,则返回0,否则返回-1?(好像是)
  然后就是字符串的整体输入,使用gets(str1),比起for语句循环逐个输入要方便很多。
posted @ 2020-11-16 16:54  社会幺儿  阅读(227)  评论(0)    收藏  举报