第十九周實訓-銀行系統
阿新 • • 發佈:2019-02-15
bank.h/* *Copyright (c) 2014, 煙臺大學計算機學院 *All rights reserved. *檔名稱:main.cpp *作者:高贊 *完成日期: 2015 年 7 月 14 日 *版本號:v1.0 * *問題描述:在基礎的銀行系統上進行如下改進: * 1.用動態陣列 * 2.增加User類中的資料成員,能夠記錄身份證號、家庭住址等資訊 * 3.記錄使用者的每一筆業務,並用檔案儲存 * 4.用二進位制檔案 */ #include <iostream> #include "bank.h" using namespace std; /*主函式:*/ int main() { cout<<"+----------------------+\n"; cout<<"+ 歡迎光臨CSDN銀行 +\n"; cout<<"+----------------------+\n"; if (pass()) { Bank b; b.work(); } return 0; }
/* *Copyright (c) 2014, 煙臺大學計算機學院 *All rights reserved. *檔名稱:Bank.h *內容概述:定義Bank,User和Record三個類 *作者:高贊 *完成日期: 2015 年 7 月 14 日 *版本號:v1.0 * *修改記錄1 *修改日期: 2015 年 7 月 17 日 *版本號:v1.0 *修改人:高贊 *修改內容: 增加檔案和函式註釋 */ #ifndef BANK_H_INCLUDED #define BANK_H_INCLUDED #include <cstring> using namespace std; class Bank; class Record //定義一個類記錄時間及操作 { private: int year; int month; int day; int hour; int minute; int secend; char operation[10]; //操作 double inMoney; //入賬 double outMoney; //出賬 public: void setRecord(int y,int mo,int d,int h,int mi,int s,char* o,double in,double out); void output(); //輸出賬戶交易記錄 friend void saveRecord(int ,char* ,double ,double); //儲存賬戶交易記錄 }; class User { public: void setUser(int acc, char* nam, int pw, double bal,char* id,char* ad,int sta); void showName(); //顯示名稱 void showIdAd(); //顯示身份證和地址 void showBalance(string prompt); //顯示餘額,前面加上提示詞prompt bool passwordIsRight(); //校驗密碼,輸入的密碼正確則返回true bool isNormalUser(); //存款、取款、轉帳等功能,需要賬戶處於正常姿態,處於正常狀態時返回true,其他情形返回false並提示 friend class Bank; //將Bank宣告為友元類,方便其訪問資料成員 void show() { cout<<" "<<account<<" "<<password<<" "<<name<<" "<<balance<<" "<<identity<<" "<<address<<" "<<status<<endl; } private: int account; //賬號 int password; //密碼 char name[50]; //使用者名稱 double balance; //賬戶餘額 char identity[50]; //身份證 char address[50]; //地址 int status; //狀態 0-正常 1-掛失 2-銷戶 }; class Bank { public: Bank(); //開始前從檔案中讀資料,存在陣列中 ~Bank(); //程式結束前,將陣列中的資料寫入到檔案中 void output(); //輸出到檔案 void work(); //業務驅動 void openAccount(); //開戶 void cancelAccount(); //登出賬戶 void save(); //存款 void withdraw(); //取款 void showAccount(); //查詢餘額 void transferAccounts(); //轉賬 void reportLoss(); //掛失 void cancelLoss(); //解除掛失 void updatePassword(); //更改密碼 int getUser(); //輸入賬號查詢使用者,返回使用者在物件陣列中的下標 private: int N; //實際的使用者數目 User *users; // 動態陣列 }; int pass(); //業務員登入 int chooseInMenu(); //顯示選單並由業務員選擇 int inputPassword(); //返回鍵盤輸入的密碼 #endif // BANK_H_INCLUDED
bank.cpp
/* *Copyright (c) 2014, 煙臺大學計算機學院 *All rights reserved. *檔名稱:Bank.cpp *內容概述:定義Bank類和Record類的成員函式和友元函式 *作者:高贊 *完成日期: 2015 年 7 月 14 日 *版本號:v1.0 * *修改記錄1 *修改日期: 2015 年 7 月 17 日 *版本號:v1.0 *修改人:高贊 *修改內容: 增加檔案和函式註釋 */ #include <iostream> #include <fstream> #include <cstdlib> #include <cstdio> #include <ctime> #include "bank.h" #include <ctype.h> using namespace std; const int upNum=2000; //系統最多容納的使用者數 /* *功能描述:為Record類資料成員賦值 *輸入引數:年月日時分秒,操作,出賬和入賬金額 *輸出引數:操作 *返回值:無 *其他說明: */ void Record::setRecord(int y,int mo,int d,int h,int mi,int s,char* o,double in,double out) { year=y; month=mo; day=d; hour=h; minute=mi; secend=s; strcpy(operation,o); outMoney=out; inMoney=in; } /* *功能描述:輸出Record類成員 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明: */ void Record::output() { cout<<year<<"年"<<month<<"月"<<day<<"日"<<hour<<"時"<<minute<<"分"<<secend<<"秒 "<<operation<<" 入賬:"<<inMoney<<" 出賬:"<<outMoney<<endl ; } /* *功能描述:把賬戶資訊儲存到賬戶相對應的檔案上 *輸入引數:賬號,操作,入賬金額,出賬金額 *輸出引數:操作 *返回值:無 *其他說明: */ void saveRecord(int a,char* b,double x,double z ) { Record r; int y,mo,d,h,mi,s; time_t rawtime; //獲取當前日期時間 struct tm * timeinfo; time ( &rawtime ); timeinfo=localtime ( &rawtime ); y=1900+timeinfo->tm_year; //年 mo=1+timeinfo->tm_mon;//月 d=timeinfo->tm_mday; //日 h=timeinfo->tm_hour; //時 mi=timeinfo->tm_min; //分 s=timeinfo->tm_sec; //秒 r.setRecord(y,mo,d,h,mi,s,b,x,z); char c1[15],c2[6]=".txt"; itoa(a,c1,10); //將int型賬號資料轉換為char陣列 strcat(c1,c2); //連線陣列組成新檔案儲存記錄 ofstream outfile(c1,ios::app|ios::binary); if(!outfile) //測試檔案開啟操作是否成功,不成功則提示後退出。 { cerr<<"open error!"<<endl; exit(1); } outfile.write((char*)&r,sizeof(r)); //二進位制寫入 outfile.close(); } /* *功能描述:用建構函式讀取檔案中儲存的業務資料 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:二進位制檔案讀取 */ Bank::Bank() { users=new User[upNum]; //動態陣列 ifstream infile("account.txt",ios::in|ios::binary); if(!infile) { cerr<<"open error!"<<endl; exit(1); } int i=0; char ch; infile>>ch; if(ch==EOF); else { infile.seekg(ios::beg); while(infile.read((char*)&users[i],sizeof(users[i]))) //當讀取成功…… { //users[i].show();測試資料if正確 i++; } } N = i; //用靜態資料成員 infile.close(); } /* 功能:, */ /* *功能描述:在退出系統時,刪除動態陣列空間 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明: */ Bank::~Bank() { delete []users;//刪除動態陣列 } /* *功能描述:將使用者陣列資料儲存到檔案中 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:二進位制寫入 */ void Bank::output() { ofstream outfile("account.txt",ios::out|ios::binary); if(!outfile) //測試檔案開啟操作是否成功,不成功則提示後退出。 { cerr<<"open error!"<<endl; exit(1); } int i; for(i=0; i<N; i++) { outfile.write((char*)&users[i],sizeof(users[i])); } outfile.close(); } /* *功能描述:辦理業務 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明: */ void Bank::work() { int iChoice; //用於選擇系統功能 //辦理業務 do { iChoice = chooseInMenu(); //從選單中獲得功能程式碼 switch(iChoice) { case 1: openAccount(); //開戶 break; case 2: cancelAccount(); //登出賬戶 break; case 3: save(); //存款 break; case 4: withdraw(); //取款 break; case 5: showAccount(); //查詢餘額 break; case 6: transferAccounts(); //轉賬 break; case 7: reportLoss(); //掛失 break; case 8: cancelLoss(); //解除掛失 break; case 9: updatePassword(); //更改密碼 break; case 0: cout<<"歡迎您再來. "<<endl; output(); } } while(iChoice); } /* *功能描述:開戶 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:在進入系統時,在讀入資料過程中,已經記錄了使用者數為N,在陣列中對應下標為0~N-1 * 開戶時要增加一個使用者,只要為下標為N的陣列元素置值,並在成功之後令N++即可。 * 賬號由系統自動生成(10001+序號),保證其連續,這樣在順序增加的時候,就保證了其有序。 */ void Bank::openAccount() { if(N==upNum) { cout<<"銀行使用者數已經達到上限,不能再開戶"; return; } //下面正常辦理開戶業務 int acc; //賬號 char nam[20]; //姓名 int pw; //密碼 double bal; //金額 string id; char ad[20]; int sta; //狀態 cout<<"正在開戶"<<endl; acc=10001+N; cout<<"賬號:"<<acc<<endl; cout<<"戶主姓名:"; cin>>nam; int iPass1, iPass2; cout<<"密碼:"; iPass1=inputPassword(); //輸入密碼1 cout<<"確認密碼:"; iPass2=inputPassword(); //輸入密碼2 if(iPass1==iPass2) { cout<<"身份證號碼:"; cin>>id; while(id.length()!=18) { cout<<"身份證號碼必須是18位!"<<endl<<"重新輸入:";//身份證號碼由18位數字字元組成 cin>>id; } char ID[20]; int ide=0,i; while(ide==0) { ide=1; strncpy(ID,id.c_str(),18); for(i=0; i<18; ++i) //身份證號碼最後一位可以是X { if((i!=17&&(ID[i]<48 || ID[i]>57)) || (i==17&&(ID[i]<48 || ID[i]>57)&&ID[i]!=88)) { cout<<"身份證號碼有誤!重新輸入:"; cin>>id; ide=0; break; } } } cout<<"輸入地址:"; cin>>ad; pw=iPass1; sta=0; //賬戶狀態為“正常” cout<<"存入金額:"; cin>>bal; users[N].setUser(acc, nam, pw, bal, ID,ad,sta); N++; //正式使用者數增加1,確認了新使用者已經加入 cout<<"開戶成功!"<<endl; output();//user陣列儲存到檔案 saveRecord(acc,"開戶",bal,0.0); //開戶資訊儲存到賬戶對應的檔案 } else { cout<<"兩次密碼不一致,未成功開戶!"<<endl; //沒有N++,則讀入的值無效 } } /* *功能描述:登出賬戶 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:找到賬戶,並將其狀態改為2-登出即可。 * 登出前應該檢查餘額,應該先取款再登出 */ void Bank::cancelAccount() { int who; //查詢到該賬號在陣列中對應的下標 who = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(who>=0) //說明id賬戶存在 { users[who].showName(); if(users[who].passwordIsRight()) { users[who].showBalance("餘額"); //提示"餘額"二字,顯示金額 cout<<"確認銷戶(y/n)?"; if(tolower(getchar())=='y') { users[who].showBalance("銷戶成功!本次取款金額為"); users[who].balance=0; //取款後餘額變0 users[who].status=2; //狀態變為登出 output(); saveRecord(users[who].account,"銷戶",0.0,users[who].balance);//銷戶資訊儲存到賬戶對應的檔案 } else { cout<<"你取消了操作,銷戶失敗!"<<endl; } fflush(stdin); //清除了getchar()時在鍵盤快取中的遺留,以免影響後續操作 } } } /* *功能描述:存款 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:需要保證賬戶存在,且處於正常狀態 */ void Bank::save() { int who; double money; who = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(who>=0) //說明id賬戶存在 { if(users[who].status==0) { users[who].showName(); cout<<"輸入存款額:"; cin>>money; users[who].balance+=money; users[who].showBalance("存款後,您有"); output(); saveRecord(users[who].account,"存款",money,0.0);//存款資訊儲存到賬戶對應的檔案 } else if(users[who].status==1) { cout<<"該使用者處於掛失狀態,存款失敗!"<<endl; } else { cout<<"該使用者已經銷戶,存款失敗!"<<endl; } } return; } /* *功能描述:取款 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:需要保證賬戶存在,且處於正常狀態,另外,餘額要足夠取 */ void Bank::withdraw() { int who; double money; who = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(who>=0) //說明id賬戶存在 { if(users[who].isNormalUser()) { users[who].showName(); if(users[who].passwordIsRight()) { cout<<"輸入取款額:"; cin>>money; if(money>users[who].balance) //親,不玩透支 { cout<<"餘額不足,取款失敗!"<<endl; } else { users[who].balance-=money; users[who].showBalance("取款後,還有"); output(); saveRecord(users[who].account,"取款",0.0,money);//取款資訊儲存到賬戶對應的檔案 } } } } return; } /* *功能描述:查詢賬戶,顯示使用者資訊 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:顯示使用者交易記錄 */ void Bank::showAccount() { int who; string sta[3]= {"正常","掛失","已經銷戶"}; who = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(who>=0) //說明id賬戶存在 { users[who].showName(); if(users[who].passwordIsRight()) { users[who].showIdAd(); users[who].showBalance("餘額"); cout<<"狀態:"<<sta[users[who].status]<<endl; } } Record r; char c1[15],c2[6]=".txt"; itoa(users[who].account,c1,10); strcat(c1,c2); ifstream infile(c1,ios::in|ios::binary); if(!infile) //測試檔案開啟操作是否成功,不成功則提示後退出。 { cerr<<"open error!"<<endl; exit(1); } while(infile.read((char*)&r,sizeof(r)) ) { r.output(); } infile.close(); return; } /* *功能描述:轉賬 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:需要保證兩個賬戶都存在,且處於正常狀態,另外,轉出賬戶的餘額要足夠 */ void Bank::transferAccounts() { int whoout, whoin; double money; cout<<"轉出自"; whoout = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(whoout>=0) //說明id賬戶存在 { if(users[whoout].isNormalUser()) { users[whoout].showName(); if(users[whoout].passwordIsRight()) { cout<<"輸入轉賬金額:"; cin>>money; if(money>users[whoout].balance) //親,不玩透支 { cout<<"餘額不足,轉賬失敗!"<<endl; } else { cout<<"轉出到"; whoin = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(whoin>=0) //說明id賬戶存在 { if(users[whoin].isNormalUser()) { users[whoout].balance-=money; users[whoin].balance+=money; users[whoout].showBalance("轉賬後,您還有"); output(); saveRecord(users[whoin].account,"轉賬",money,0.0);//轉賬資訊儲存到轉入賬戶對應的檔案 saveRecord(users[whoout].account,"轉賬",0.0,money);//轉賬資訊儲存到轉出賬戶對應的檔案 } } } } } } return; } /* *功能描述:掛失賬戶 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:賬戶狀態必須正常才可掛失 */ void Bank::reportLoss() { int who; who = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(who>=0) //說明id賬戶存在 { users[who].showName(); if(users[who].passwordIsRight()) { if(users[who].status==0) { users[who].status=1; cout<<"掛失成功"<<endl; output(); saveRecord(users[who].account,"掛失",0.0,0.0);//掛戶資訊儲存到賬戶對應的檔案 } else if(users[who].status==1) { cout<<"該賬戶已經處於掛失狀態"<<endl; } else { cout<<"該賬戶已銷戶,不能掛失"<<endl; } } } return; } /* *功能描述:解掛賬戶 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:賬戶狀態必須掛失才可解掛 */ void Bank::cancelLoss() { int who; who = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(who>=0) //說明id賬戶存在 { users[who].showName(); if(users[who].passwordIsRight()) { if(users[who].status==0) { cout<<"該賬戶處於正常狀態,不需要解除掛失"<<endl; } else if(users[who].status==1) { users[who].status=0; cout<<"解除掛失成功"<<endl; output(); saveRecord(users[who].account,"解掛",0.0,0.0);//解掛資訊儲存到賬戶對應的檔案 } else { cout<<"該賬戶已銷戶,操作無效"<<endl; } } } return; } /* *功能描述:改密碼 *輸入引數:無 *輸出引數:無 *返回值:無 *其他說明:新密碼需要確認一遍 */ void Bank::updatePassword() { int who; int iPass1, iPass2; who = getUser(); //根據賬號查詢使用者,返回使用者的下標 if(who>=0) //說明id賬戶存在 { users[who].showName(); if(users[who].passwordIsRight()) { cout<<"新密碼:"; iPass1=inputPassword(); //輸入密碼1 cout<<"確認密碼:"; iPass2=inputPassword(); //輸入密碼2 if(iPass1==iPass2) { users[who].password=iPass1; cout<<"修改成功!"<<endl; output(); saveRecord(users[who].account,"改密",0.0,0.0);//改密資訊儲存到賬戶對應的檔案 } else { cout<<"兩次輸入不同,修改失敗!"<<endl; } } } return; } /* *功能描述:輸入賬號查詢使用者,返回使用者在陣列中的下標 *入口引數:要查詢使用者的賬號 *輸入引數:無 *輸出引數:無 *返回值: 如果該使用者存在,返回該使用者在陣列中的下標,否則,返回一個負數(-1) *其他說明: 由賬號自動產生,使按賬號有序,本模組採用二分查詢 */ int Bank::getUser() { int id; cout<<"賬號:"; cin>>id; int index=-1; int low=0, high=N-1, mid; while(low<=high) { mid = (low+high)/2; if(users[mid].account==id) { index=mid; break; //找到了,立即退出迴圈 } else if (users[mid].account>id) high=mid-1; else low=mid+1; } if (index<0) cout<<"該使用者不存在,本次操作失敗!"<<endl; return index; //若找到,其值在0~N-1間,否則,保持-1 }
User.cpp
/*
*Copyright (c) 2014, 煙臺大學計算機學院
*All rights reserved.
*檔名稱:User.cpp
*內容概述:user類的成員函式定義
*作者:高贊
*完成日期: 2015 年 7 月 14 日
*版本號:v1.0
*
*修改記錄1
*修改日期: 2015 年 7 月 17 日
*版本號:v1.0
*修改人:高贊
*修改內容: 增加檔案和函式註釋
*/
#include <iostream>
#include "bank.h"
using namespace std;
/*
*功能描述:為User類資料成員賦值
*輸入引數:賬號,姓名密碼,餘額,身份證。地址。狀態
*輸出引數:姓名,身份證。地址
*返回值:無
*其他說明:
*/
void User::setUser(int acc, char* nam, int pw, double bal,char* id,char* ad,int sta)
{
account=acc;
password=pw;
strcpy(name,nam);
balance=bal;
strcpy(identity,id);
strcpy(address,ad);
status=sta;
}
/*
*功能描述:顯示賬戶姓名
*輸入引數:無
*輸出引數:無
*返回值:無
*其他說明:
*/
void User::showName()
{
cout<<"戶主姓名:"<<name<<endl;
}
/*
*功能描述:顯示賬戶餘額
*輸入引數:提示詞
*輸出引數:無
*返回值:無
*其他說明:
*/
void User::showBalance(string prompt)
{
cout<<prompt<<" "<<balance<<" 元"<<endl;
}
/*
*功能描述:顯示賬戶身份證號和地址
*輸入引數:無
*輸出引數:無
*返回值:無
*其他說明:
*/
void User::showIdAd()
{
cout<<"身份證號碼:"<<identity<<endl
<<"地址:"<<address<<endl;
}
/*
*功能描述:判斷密碼是否正確
*輸入引數:無
*輸出引數:判斷密碼是否正確的bool值
*返回值:正確返回1,錯誤返回0;
*其他說明:
*/
bool User::passwordIsRight()
{
int iPass;
bool right = true;
cout<<"輸入密碼:";
iPass=inputPassword();
if(iPass!=password)
{
right = false;
cout<<"輸入密碼錯誤,不能繼續操作!"<<endl;
}
return right;
}
/*
*功能描述:判斷賬戶狀態是否正常
*輸入引數:無
*輸出引數:判斷狀態是否正常的bool值
*返回值:正確返回1,錯誤返回0;
*其他說明:
*/
bool User::isNormalUser()
{
bool normal = true;
if(status!=0)
{
normal = false;
cout<<"該賬戶處於"<<(status==1?"掛失":"銷戶")<<"狀態,不能繼續操作..."<<endl;
}
return normal;
}
Work.cpp
/*
*Copyright (c) 2014, 煙臺大學計算機學院
*All rights reserved.
*檔名稱:Work.cpp
*內容概述:定義Bank成員函式中所需要用到的函式
*作者:高贊
*完成日期: 2015 年 7 月 14 日
*版本號:v1.0
*
*修改記錄1
*修改日期: 2015 年 7 月 17 日
*版本號:v1.0
*修改人:高贊
*修改內容: 增加檔案和函式註釋
*/
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include "bank.h"
using namespace std;
/*
*功能描述:驗證使用者密碼
*輸入引數:無
*輸出引數:判斷密碼是否正確的BOOL量
*返回值:密碼正確,返回1;不能通過密碼驗證,返回0
*其他說明:
*/
int pass()
{
char sNameInFile[20]; //由檔案中讀出的業務員使用者名稱
char sPassInFile[20]; //檔案中儲存的密碼,這一版本中,用字元儲存密碼
ifstream infile("password.txt",ios::in);
if(!infile)
{
cout<<"password file cannot open!"<<endl;
exit(1);
}
infile>>sNameInFile>>sPassInFile;
infile.close();
char sName[20]; //業務員登入時輸入的使用者名稱
char sPass[20]; //業務員登入時輸入的密碼
char ch;
int iTry=3; //進入系統時嘗試的次數
int right = 0; //要返回的結果:0-不正確 1-正確
//進入系統,密碼三次不對將退出
do
{
cout<<"請輸入業務員使用者名稱:";
cin>>sName;
cout<<"請輸入密碼:";
int i=0;
while((ch=getch())!='\r') //getch在接受輸入後,不在螢幕上顯示
{
sPass[i++]=ch;
putchar('*'); //接受任何字元,螢幕上只顯示*
}
sPass[i]='\0';
fflush(stdin);
cout<<endl;;
if(strcmp(sPass,sPassInFile)==0&&strcmp(sName,sNameInFile)==0)
{
right = 1;
break;
}
else
{
iTry--;
if(iTry>0)
cout<<"超過3次將退出,你還可以嘗試"<<iTry<<"次!"<<endl;
else
{
cout<<"對不起,你不能進入系統"<<endl;;
}
}
}
while(iTry);
return right;
}
/*
關於getch()的一點說明:
所在標頭檔案:conio.h
函式用途:從控制檯讀取一個字元,但不顯示在螢幕上
函式原型:int getch(void)
返回值:讀取的字元
在不同平臺,輸入回車,getch()將返回不同數值,而getchar()統一返回10(即\n)
1)windows平臺下ENTER鍵會產生兩個轉義字元 \r\n,因此getch返回13(\r)。
2)unix、 linux系統中ENTER鍵只產生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER鍵將產生 \r ,因此getch返回13(\r)。
為避免鍵盤快取區中未讀出的字元影響程式,用fflush(stdin);清除輸入快取區
*/
/*
*功能描述:顯示選單並由業務員選擇
*輸入引數:無
*輸出引數:使用者選擇的功能,範圍0-9
*返回值:使用者選擇的功能,範圍0-9
*其他說明:
*/
int chooseInMenu()
{
int i;
while(1)
{
cout<<endl;;
cout<<"+----------------------------+"<<endl;
cout<<"+ 1 開戶 2 銷戶 3 存款 +"<<endl;
cout<<"+ 4 取款 5 查詢 6 轉賬 +"<<endl;
cout<<"+ 7 掛失 8 解掛 9 改密 +"<<endl;
cout<<"+ 0 退出 +"<<endl;
cout<<"+----------------------------+"<<endl;
cout<<"請輸入操作指令:";
cin>>i;
if(i>=0 && i<=9)
break;
else
cout<<"請重新選擇功能"<<endl;;
}
return i;
}
/*
*功能描述:輸入密碼
*輸入引數:無
*輸出引數:整型的密碼值
*返回值:整型的密碼值
*其他說明:技術說明:
* (1)此功能在多個模組中都要用到且功能單一,故分離出來,單獨作業一個函式
* (2)為了便於在輸入中只顯示*,接受輸入時以字元形式輸入,而後轉為對應的整型數
* (3)規定密碼由不全為0的6位數字構成(當開頭是'0'時,實際不足6位),一旦輸入錯誤將重新輸入
* 附:在實際的系統中,密碼通常用字串描述,即使只允許出現數字字元,本例僅作為參考
*/
int inputPassword()
{
char ch; //接收字元形式密碼
int iPass=0; //要轉換為數字
int i;
while(1)
{
for(i=0; i<6; i++)
{
ch=getch(); //輸入但不顯示
putchar('*'); //輸出*
if(isdigit(ch))
iPass=iPass*10+(ch-'0');
else
{
iPass=0;
break; //退出for迴圈後,再次接受
}
}
fflush(stdin); //清除鍵盤快取區中已經有的輸入
cout<<endl;;
if(iPass==0) //此條件成立可能由兩種情況引起:輸入了非數字字元被直接重置為0,或6位全0後正常退出for迴圈
{
cout<<"密碼要求全為數字,且不能全0!"<<endl;;
cout<<"請重新輸入密碼: ";
}
else
break;
}
return iPass;
}
執行結果展示:
做加分專案時看似簡單,實則執行時BUG不斷。一個高效的演算法,一個巧妙的設計對整體的專案十分重要,當然還有不死心的精神。
從習慣了顯示屏上的亂碼和提示記憶體錯誤的彈窗,到解決問題後的徹悟,這中間必是一段漫漫枯燥坑爹之路——不過終於熬過去了就等驗收嘍。