#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include <time.h>
#include <cstdlib>


/*全局变量，变量值为预存金额，在实际应用中这个值应从文本文件中读取*/
double total=1000;

/*得到并输出系统日期时间，读者可以将其直接应用到自己的项目中*/
void dateTime()/*取得当前时间*/
{
long t;
   struct tm *pt ;/*结构体变量*/
   char *pc ;

   time(&t);/*time函数向指针形变量t中存入自1970年1月1日0时0分0秒起到此刻经过的秒数*/
pt=localtime(&t); /*将秒数转化为本地的日期时间结构体*/
printf("%d年%d月%d日 %d时%d分%d秒",pt->tm_year+1900,pt->tm_mon+1,pt->tm_mday,pt->tm_hour,pt->tm_min,pt->tm_sec);
}

/*密码输入函数*/
void pass()
{
printf("---------欢迎使用ATM自动取款机取款------------\n");
	int n,password;
	for(n=1;n<=3;n++)/*最多输入三次*/
	{
        /*根据输入次数变换提示语句*/
		if(n==1) printf("请输入密码，最多3次:");
		else printf("密码错误,请重新输入:");

		scanf("%d",&password);
		if(password==12345) break;/*只要输入正确随时终止循环*/
	}

	if(n>3)/*当n值为4 时说明用户至少已经错误 3 次，则吞卡*/
	{
		printf("\n卡于");
		dateTime(); 
		printf("被吞，请与银行工作人员联系\n\n");
		exit(0);/*结束整个程序的运行*/
	}
}

/*服务菜单提供函数*/
int service()
{
	int select;
	printf("*********为您提供如下服务**********\n");
	printf("查询余额--1\n");
	printf("取款--2\n");
	printf("快速取款--3\n");
	printf("存款--4\n");
	printf("取卡--0\n");
	printf("----------------------------------\n");
	printf("请输入选项:");
	scanf("%d",&select);
	return select;
}

/*余额显示函数*/
void selectmoney()
{
	printf("\n\n 您的余额:%f 元 \n\n",total);
}

/*取款函数*/
void getmoney()
{
	int number;
	int flag;
	printf("取卡金额:");
	scanf("%d",&number);/*输入取款金额*/

    /*如果总金额高于取款额，则可以取款，否则无法取款*/
	if(total>=number)
	{
		total=total-number;/*余额修改*/
		printf("取走 %d 元\n",number);

 /*凭证打印，打印凭证也可以在快速取款，存款使用，避免代码重复，后面快速取款，存款里省略，实际应用可以都使用打印凭证功能。*/
		printf("是否打印凭证(1/0)?");
		scanf("%d",&flag);
		if(flag==1)
{
			printf("\n您于");
			dateTime();
			printf("取款 :%d元\n",number);
		}
	}
	else
	{
		printf("余额不足!");
	}
}

/*快速取款函数，可以根据提供的100,200,500,1000选项快速取款*/
void quickgetmoney()
{	
int select ,number;
	char flag;

    /*选择取款金额*/
	printf("\t\t----选择取款金额\n");
	printf("\t\t100(1)\t\t200(2)\n\t\t500(3)\t\t1000(4)\n");
	scanf("%d",&select);

 /*根据用户选择，设置取款金额*/
	switch(select)
{
	case 1:number=100;break;
	case 2:number=200;break;
	case 3:number=500;break;
	case 4:number=1000;break;
	}

	if(total>=number)
{
printf("请取现金 %d 元\n",number);
total=total-number;
}
else
printf("余额不足!");
}

/*存款函数*/
void savemoney()
{
	int number;
	char flag;
	printf("请输入存款金额：");
	scanf("%d",&number);
	total=total+number;
	printf("您已成功存入%d元\n",number); 
}

/*退出函数，在实际应用中，金额以及存取款记录均保存在记事本中，本函数需要关闭相应的文件*/
void exitatm()
{
	printf("请取卡\n");
	exit(0);
}

/*子功能调用函数*/
void selectservice(int select)
{
	switch(select)
{
	case 1:selectmoney();break;
	case 2:getmoney();break;
	case 3:quickgetmoney();break;
	case 4:savemoney();break; 
	case 0:exitatm();break;
	default:printf("非法操作\n");
	}
}

/*主函数采用死循环方式，为用户提供无限次服务，直到用户操作非法或用户选择退出*/
 main()
{
	int select;
	pass();/*调用密码输入函数，密码输入失败则终止程序执行*/
	do{
		select=service();/*显示功能菜单，接受并返回用户选择*/
		selectservice(select);/*根据用户选择调用相关功能函数*/
	}while(1);
}
