簡單的收支記賬軟體的實現詳細解釋(不連線資料庫)
使用java語言實現簡單的收支記賬軟體
該專案在尚學堂進行學習,個人整理並將我遇到的問題也整合其中,力求通俗易懂。
整個軟體在命令列中執行,包括有四個部分的顯示:收支明細、登記收入、登記輸出、退出。通過使用者選擇對應的數字序號,進行相應的功能使用。
該專案由兩個類實現,一個是主類Account,一個是工具類Utility,接下來通過五個部分的設計實現整個軟體。
1.主選單介面設計
設計一個Account類包括有收支明細、登記收入、登記輸出、退出四項功能以及讓使用者選擇數字序號的提示語。
主選單部分程式碼設計如下(程式碼中對應要點之後有解釋):
boolean isFlag= true;
while (isFlag){//要點一
System.out.println("-------------------收支軟體----------------------");
System.out.println(" 1.收支明細");
System.out.println(" 2.登記收入");
System.out.println(" 3.登記輸出");
System.out.println(" 4.退 出");
System. out.println(" 請選擇(1-4):");
char key=Utility.readMenu();//要點2
switch (key){//要點3
case '1':
case '2':
case '3':
case '4':
}
要點一: 為了實現使用者每次選擇功能執行完成後能夠再次返回到主選單介面,整個部分由一個while迴圈語句包裹,設定boolean型變數isFlag預設值為true是為了保持迴圈持續進行。那麼程式如何結束?將isFlag的值變為false就好了,具體內容請看退出部分的設計。
要點二: 此處呼叫了Utility下的readMenu方法,該方法的作用是獲取使用者輸入的字元,並進行判斷是否符合格式,格式正確則返回一個char格式資料。該方法程式碼如下:
public static char readMenu(){
char c;
for(; ; ){
String str=getKeyBoard(1);//由於c是char型別,無法直接通過getKeyBoard方法賦值,故需要間接轉換格式
c=str.charAt(0);
if (c !='1'&&c!='2'&&c!='3'&&c!='4' ){
System.out.println("選擇錯誤,請重新選擇!");
continue;
}else break;
}
return c;
}
其中還呼叫了本類下的getKeyBoard()方法,該方法同樣是為了規格化輸入,括號內的引數指定了可以接受的字元數,格式正確返回一個String型別的資料。該方法程式碼如下:
private static Scanner scanner=new Scanner(System.in);//由於之後方法呼叫時是靜態方法,scanner物件需定義為靜態。
private static String getKeyBoard(int limit){
String line="";
while (scanner.hasNext()){
line=scanner.nextLine();
if (line.length()<1||line.length() > limit){
System.out.println("輸入長度(不大於"+limit+")錯誤,請重新輸入");
continue;
}
break;
}
return line;
}
要點三: 為了實現使用者選擇不同功能從而出現不同結果,此處使用switch分支語句進行判定。例如,如果使用者鍵入數字 ‘1‘’,則進入switch分支中 case’1’ 的內容中。
2.收支明細功能設計
該模組主要通過表格的形式顯示,進行顯示的內容有收支、賬戶金額、收支金額、說明。而且表格內容要隨著使用者的新增資訊而增多,如何通過簡單的方法實現表格的效果?由於表格只會增加,且隨著使用者的新增每次只新增一行,一個可行的辦法是,設定一個字串(這裡為details),初始化時向字串中寫入表頭,而隨著使用者每次新增資料,就順勢向details中新增內容,則該字串中的內容就是一個不斷新增的表格了。該部分程式碼如下:
String details="收支\t賬戶金額\t收支金額\t說 明\n";
case '1':
System.out.println("-----------------當前收支明細記錄-----------------");
System.out.println(details);
System.out.println("-----------------------------------------------");
break;
3.登記收入功能設計
該部分主要功能是獲取使用者輸入的金額資訊和附加的說明資訊,並新增到收支明細中去,程式碼如下:
int balance=0;//設定一個初始金額,方便之後的加減。
case '2':
System.out.print("本次收入金額:");
int i=Utility.readNumber();
balance+=i;//計算使用者賬戶總金額
System.out.print("說明資訊:");
String str=Utility.readinfo();
details+="收入\t"+balance+"\t\t"+i+"\t\t"+str+"\n";//向字串中新增相應的資訊。
break;
該方法中使用了Utility中的readNumber()方法和readinfo方法,這兩個方法的作用分別是獲取使用者輸入的數字和字串,若符合規則則返回一個int型別資料和String型別資料。以下是程式碼(由於獲取數字的方法使用了int型別,則必須輸入一個int型別的資料,如有需要,請將方法中的型別修改。):
public static int readNumber(){//獲取並規範數字格式
int n;
for(;;) {
String str = getKeyBoard(4);
try {
n=Integer.parseInt(str);//格式轉換
break;
}
catch (NumberFormatException e){
System.out.println("請輸入正確的數字!");
}
}
return n;
}
public static String readinfo(){//獲取並規範說明資訊的格式。
String str=getKeyBoard(20);
return str;
}
4.登記支出功能設計
該部分內容與登記支出部分大體類似,修改的地方是在計算賬戶總金額時,需要減去使用者輸入的數字,程式碼如下:
case '3':
System.out.print("本次支出金額:");
int i1=Utility.readNumber();
balance-=i1;
System.out.print("說明資訊:");
String str1=Utility.readinfo();
details+="支出\t"+balance+"\t\t"+i1+"\t\t"+str1+"\n";
break;
5.退出功能設計
該模組的功能是退出軟體系統,方法是終止整個主類的主體:while迴圈。要終止while迴圈就需要讓括號中的引數判定為false,則只需要將isFlag變數設定為false即可。該模組為了防止使用者誤操作,進行了二次確定,實現思想與上述獲取並規範使用者輸入的方法類似,以下是程式碼:
case '4':
System.out.println("你真的要退出嗎?<Y/N>");
char b=Utility.readExit();
if (b=='Y'){
isFlag=false;
}else break;
此處呼叫了Utility類下的readExit方法。該方法作用是規範使用者輸入,確保最終傳入的字母是為Y或N,為了實現無論大小寫都可以識別,若是小寫則轉換為大寫。
public static char readExit(){
char c;
String str=getKeyBoard(1).toUpperCase();
c=str.charAt(0);
return c;
}
整個專案到此設計完成。