1. 程式人生 > >模擬ATM取款機

模擬ATM取款機

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