模擬ATM取款機
模擬ATM取款機
問題描述:採用結構化程式設計思想實現模擬ATM(自動櫃員機)。
功能包括:
1、模擬ATM(自動櫃員機)主介面;
2、模擬ATM(自動櫃員機)的查詢功能;
3、模擬ATM(自動櫃員機)存款功能;
4、模擬ATM(自動櫃員機)取款功能;
5、退出功能模組五(即:返回主介面return)。
設計思路:
本次模擬ATM取款機的開發使用C語言進行開發,採用全域性變數allmoney來儲存銀行卡中的總錢數,用全域性變數outmoney來儲存使用者總共取出的錢數。之所以採用全域性變數,是因為全域性變數的值在整個程式執行過程中只要有一處發生改變,其值就隨之發生改變。這樣便於統計銀行卡的餘額以及取出的總錢數。同時採用檔案的來儲存銀行卡餘額,當用戶關閉程式,再次開啟程式時,可以繼續讀取上次的銀行卡餘額。
此程式也限制了使用者當日的取款數額上限,每次取款後,由outmone進行累加,當outmoney的數值大於
原始碼:
//檔名:模擬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;
}