模拟ATM取款机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34778691/article/details/70195456

                                                模拟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;
}





猜你喜欢

转载自blog.csdn.net/qq_34778691/article/details/70195456