模拟ATM取款机
问题描述:采用结构化程序设计思想实现模拟ATM(自动柜员机)。
功能包括:
1、模拟ATM(自动柜员机)主界面;
2、模拟ATM(自动柜员机)的查询功能;
3、模拟ATM(自动柜员机)存款功能;
4、模拟ATM(自动柜员机)取款功能;
5、退出功能模块五(即:返回主界面return)。
设计思路:
本次模拟ATM取款机的开发使用C语言进行开发,采用全局变量allmoney来存储银行卡中的总钱数,用全局变量outmoney来存储用户总共取出的钱数。之所以采用全局变量,是因为全局变量的值在整个程序运行过程中只要有一处发生改变,其值就随之发生改变。这样便于统计银行卡的余额以及取出的总钱数。同时采用文件的来存储银行卡余额,当用户关闭程序,再次打开程序时,可以继续读取上次的银行卡余额。
此程序也限制了用户当日的取款数额上限,每次取款后,由outmone进行累加,当outmoney的数值大于20000时,取款操作无法进行。
源代码:
//文件名:模拟ATM取款机.CPP
//作者:Vector_山水之间
//学号:1508010333
//版本号:1.5
//主要功能:模拟ATM取款机,完成了存款,取款,查询余额,修改密码的功能.并且限制了单日取款金额不超过20000元
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
int allmoney; //定义全局变量,记录银行卡当前总额
int outmoney; //定义全局变量,记录取款总额
void savemoney(); //声明存款函数
void takemoney(); //声明取款函数
int menu() //菜单函数
{
int i;
do
{
printf("欢迎使用建设银行ATM取款机\n");
printf(" 1:存款\n");
printf(" 2:取款\n");
printf(" 3:查询余额\n");
printf(" 4:修改密码\n");
printf(" 5:保存存取款记录\n");
printf(" 6:退卡\n");
printf("存取款完成后,请选择选项5,保存存取款记录,以便记录您的交易信息!\n");
printf("请选择服务项:\n");
scanf("%d",&i);
return i;
}
while(i!=1&&i!=2&&i!=3&&i!=4);
}
void B(int number) //用户登录输入密码
{
int i,m=0;
printf("进行操作前,请输入密码(用户初始密码保存在password.txt中):\n");
scanf("%d",&i);system("cls");
if(i!=number)
do
{
printf("对不起密码输入错误,请重新输入\n");
m++;
scanf("%d",&i);
}
while(i!=number&&m<2);
if(m>1)
{
printf("已经累计三次输错密码,今日银行卡已被锁住,请按任意键退出系统,取回您的卡。\n");
exit(0); //如果三次输入错误,则退出
}
}
void C(int number) //修改密码
{
int i,m=0;
printf("请输入原始密码:\n");
scanf("%d",&i);system("cls");
if(i!=number)
do
{
printf("对不起密码输入错误,请重新输入\n");
m++;
scanf("%d",&i);
}
while(i!=number&&m<2);
if(m>1)
exit(0); //如果三次输入错误,则退出
}
void savemoney() //存款函数
{
float nowmoney1;
int money1; //存款金额变量
printf("请输入存款金额:\n");
scanf("%f",&nowmoney1);
money1 = (int)nowmoney1;
if(money1 != nowmoney1) //对存款金额进行验证,输入存款金额为小数时,无法存款
{
printf("存款金额输入有误!\n");
}
else
{
if(money1<0)
{
printf("温馨提示:存款金额应该大于等于0,请重新输入!\n");
savemoney();
}
else if((money1%100)!=0) //限制存款金额为100的整数倍
{
printf("温馨提示:存款金额应该为100的整数倍.请重新输入!\n");
savemoney();
}
else
{
printf("请稍后.......................\n");
Sleep(2000);
printf("存款成功,请继续进行其他业务!\n");
}
allmoney+=money1;
printf("存款后,卡上目前余额为%d\n\n",allmoney);
}
}
void takemoney() //取款函数
{
float nowmoney2;
int money2; //取款金额变量
printf("请输入取款金额:\n");
scanf("%f",&nowmoney2);
money2 = (int)nowmoney2;
if(money2 != nowmoney2) //防止输入的金额为小数
{
printf("取款金额输入有误!\n");
}
else
{
if(allmoney>=money2)
{
if(money2<0)
{
printf("取款金额应为正值,请重新输入取款金额!\n");
takemoney();
}
else if(money2>2000)
{
printf("单次取款金额超过上限,请重新输入取款金额!\n");
takemoney();
}
else if((money2%100)!=0) //限制取款金额为100的整数倍
{
printf("取款金额应为100的整数倍,请重新输入取款金额!\n");
takemoney();
}
else
{
printf("..............正在取钱%d..................\n",money2);
printf("请稍后.......................\n");
Sleep(2000);
printf("你已经取出%d元钱\n",money2);
}
allmoney-=money2;
outmoney+=money2;
printf("取款后,卡上余额为%d元钱\n\n",allmoney);
}
else
{
printf("卡上余额为%d元钱\n",allmoney);
printf("银行卡余额不足!请返回主菜单进行其他选项!\n");
}
}
}
void inquiremoney() //查询余额函数
{
printf("正在查询余额,请稍后.......................\n");
Sleep(2000);
printf("你的余额是%d\n",allmoney);
}
int main(int argc, char* argv[])
{
printf("欢迎使用建设银行ATM取款机\n");
system("pause");
int a,number; //number为用户密码
FILE *fp1; //文件操作,从passwor.txt中读取银行卡密码
if((fp1 = fopen("password.txt","r"))==NULL)
printf("银行卡密码读取失败!");
else
fscanf(fp1,"%d",&number);
fclose(fp1);
system("cls"); //清屏
aa: B(number); //输入密码
FILE *fp2; //从readbalance.txt中读取银行卡现有资金
if((fp2 = fopen("savebalance.txt","r"))==NULL)
printf("文件打开失败!");
else
{
fscanf(fp2,"%d",&allmoney);
}
fclose(fp2);
aaa: a = menu();
switch(a)
{
case 1:
savemoney();
system("pause");
system("cls");
goto aaa;
break;
case 2:
takemoney();
system("pause");
system("cls");
goto aaa;
break;
case 3:
inquiremoney();
system("pause");
system("cls");
goto aaa; //返回选择界面
break;
case 4:
int d,j;
C(number);
printf("请输入新的密码");
scanf("%d",&d);
system("cls"); //清屏
printf("请再次确认密码");
scanf("%d",&j);
system("cls");
if(d!=j)
printf("两次密码输入不同,请重新输入初始密码选择服务\n");
else
number=j;
printf("密码修改成功,请继续进行其他操作!\n");
goto aa; //返回选择界面
break;
case 5:
FILE *fp3;
if((fp3 = fopen("savebalance.txt","w"))==NULL)
printf("文件打开失败!");
else
fprintf(fp3,"%d",allmoney);
fclose(fp3);
goto aaa;
break;
case 6:
printf("欢迎使用,下次再见\n");
exit(0);
}
getch(); //防止exe文件在运行时快速关闭,使之随便输入一个结束程序
return 0;
}
程序测试:
测试用例
测试模块 |
测试内容 |
预期结果 |
是否与预期结果相符 |
用户取款数额的限制 |
取款数额为负 |
无法取款,请重新输入取款数额 |
是 |
取款数额不是100的整数倍 |
无法取款,请重新输入取款数额 |
是 |
|
取款数额超过银行卡余额 |
提示余额不足,无法取款,请重新输入取款数额 |
是 |
|
单次取款超过2000元 |
取款数额超过限制,无法取款,请重新输入取款数额 |
否 |
|
当日多次取款数额超过20000元 |
无法取款,取款数额超过限制 |
是 |
|
输入存款数额为小数 |
无法存款,提示存款数额不能为小数 |
否 |
#include<stdio.h>
int allmoney; //定义全局变量,记录银行卡当前总额
void takemoney(); //声明取款函数
void takemoney() //取款函数
{
float nowmoney2;
int money2; //取款金额变量
printf("请输入取款金额:\n");
scanf("%f",&nowmoney2);
money2 = (int)nowmoney2;
if(money2 != nowmoney2) //防止输入的金额为小数
{
printf("取款金额输入有误!\n");
}
else
{
if(allmoney>=money2)
{
if(money2<0)
{
printf("取款金额应为正值,请重新输入取款金额!\n");
takemoney();
}
else if(money2>2000)
{
printf("单次取款金额超过上限,请重新输入取款金额!\n");
takemoney();
}
else if((money2%100)!=0) //限制取款金额为100的整数倍
{
printf("取款金额应为100的整数倍,请重新输入取款金额!\n");
takemoney();
}
else
{
printf("..............正在取钱%d..................\n",money2);
printf("请稍后.......................\n");
Sleep(2000);
printf("你已经取出%d元钱\n",money2);
}
allmoney-=money2;
outmoney+=money2;
printf("取款后,卡上余额为%d元钱\n\n",allmoney);
}
else
{
printf("卡上余额为%d元钱\n",allmoney);
printf("银行卡余额不足!请返回主菜单进行其他选项!\n");
}
}
}
int main()
{
takemoney();
return 0;
}