ATM系统作业

一.关于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-19 08:27  EmperorSky  阅读(186)  评论(0编辑  收藏  举报