最近刚刚复习了一下Java的面向对象三大特性,这里跟着hsp做个小零钱通实践一下,以下记录了学习和编写过程
1. 需求描述
使用Java 开发零钱通项目, 模仿微信实现简易功能,可以完成收益入账,消费,查看明细,退出系统等功能,先按照一般方法写,后期在改进为OOP
预期界面:(实际可能不同)
2. 需求分析
面对这样一个需求,先化繁为简
- 写一个菜单
- 完成零钱通明细.
- 完成收益入账
- 消费
- 退出
- 用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,否则循环输入指令,直到输入y 或者 n
- 在收益入账和消费时,判断金额是否合理,并给出相应的提示
3. 实现零钱通主要功能
3.1 写一个菜单
先完成显示菜单,并可以选择菜单,并且给出对应提示
public static void main(String[] args) {
// define related variables
Scanner scanner = new Scanner(System.in);
String key = "";
boolean loop = true;
do {
System.out.println("==========Small Change Menu==========");
System.out.println("\t\t\t1 show change details");
System.out.println("\t\t\t2 income entry");
System.out.println("\t\t\t3 consumption");
System.out.println("\t\t\t4 exit");
System.out.println("please choose 1-4:");
key = scanner.next();
//use switch to control
switch (key) {
case "1":
System.out.println("1 show change details");
break;
case "2":
System.out.println("2 income entry");
break;
case "3":
System.out.println("3 consumption");
break;
case "4":
System.out.println("4 exit");
System.out.println(" you have exit the SmallChange");
loop = false;
break;
default:
System.out.println("err please choose again");
}
} while (loop);
}
3.2 零钱通明细
思路
(1) 可以把收益入账和消费保存到数组
(2) 可以使用对象
(3) 简单的话可以使用String拼接
这里直接采取第三种方式
改变一下switch的case1
String details = "-----------------零钱通明细------------------";
case "1":
System.out.println(details);
break;
3.3 收益入账
完成收益入账
定义新的变量
double money = 0;
double balance = 0;
Date date = null; // date 是 java.util.Date 类型,表示日期
//if you don't like the default format of displaying date ,change it with sdf
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
修改switch中的case2
System.out.print("Income recorded amount:");
money = scanner.nextDouble();
//the range of money should be limited
//give the hits of the illegal money value 就直接break
balance += money;
//拼接收益入账信息到 details
date = new Date(); //Get the current time
details += "\n收益入账\t+" + money + "\t" + sdf.format(date)+ "\t" + balance;
break;
效果演示:
保证入账>0
3.4 消费
定义新的变量
String note = "";
修改switch中的case3
case "3":
System.out.print("Consumption amount:");
money = scanner.nextDouble();
//the range of money should be limited
System.out.print("Consumption Description:");
note = scanner.next();
balance -= money;
//Splicing consumption information to details
date = new Date();//Get the current time
details += "\n"+note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
效果演示:
3.5 用户退出改进
给出确认,是否要退出
用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,
否则循环输入指令,直到输入y 或者 n
(1) 定义一个变量 choice, 接收用户的输入
(2) 使用 while + break, 来处理接收到的输入时 y 或者 n
(3) 退出while后,再判断choice是y还是n ,就可以决定是否退出
(4) 建议一段代码完成功能,不混在一起
case "4":
String choice = "";
while (true) {
//The user is required to enter Y / N, otherwise it will cycle all the time
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;
}
//scheme 2
// if("y".equals(choice)) {
// loop = false;
// break;
// } else if ("n".equals(choice)) {
// break;
// }
}
if (choice.equals("y")) {
loop = false;
}
break;
效果演示:
3.6 改进金额判断
收入时
if (money <= 0) {
System.out.println("The income entry amount must be greater than 0");
break;
}
支出时
if (money <= 0 || money > balance) {
System.out.println("Your consumption amount should be 0-" + balance);
break;
}
效果演示
4. 面向过程版实现
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
// try to reduce complexity to simplicity
//1. First complete the display menu,
// and you can select the menu to give the corresponding prompt
//2. Complete change details
//3. Complete income entry
//4. consumption
//5. exit
//6. When the user enters 4 to exit, the prompt "are you sure you want to exit?
// Y / N" will be given. You must enter the correct Y / N,
// otherwise cycle the input instruction until y or n is entered
//7. When the income is recorded and consumed,
// judge whether the amount is reasonable and give corresponding tips
public static void main(String[] args) {
// define related variables
Scanner scanner = new Scanner(System.in);
String key = "";
boolean loop = true;
//2. complete the change details
//(1) 可以把收益入账和消费,保存到数组 (2) 可以使用对象 (3) 简单的话可以使用String拼接
String details = "-----------------Change details------------------";
//3. complete income entry
double money = 0;
double balance = 0;
Date date = null; // date 是 java.util.Date 类型,表示日期
//if you don't like the default format of displaying date ,change it with sdf
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//4. consumption
//define new variable,store the reason why consume
String note = "";
do {
System.out.println("\n==========Small Change Menu==========");
System.out.println("\t\t\t1 show change details");
System.out.println("\t\t\t2 income entry");
System.out.println("\t\t\t3 consumption");
System.out.println("\t\t\t4 exit");
System.out.println("please choose 1-4:");
key = scanner.next();
//use switch to control
switch (key) {
case "1":
System.out.println(details);
break;
case "2":
System.out.print("Income recorded amount:");
money = scanner.nextDouble();
//the range of money should be limited
//commonly use <if> to judge the wrong situation make the code easy to read
//give the hits of the illegal money value 就直接break
if (money <= 0) {
System.out.println("The income entry amount must be greater than 0");
break;
}
balance += money;
//Splicing consumption information to details
date = new Date(); //Get the current time
details += "\n" + "Income " + "\t" + "+" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "3":
System.out.print("Consumption amount:");
money = scanner.nextDouble();
//the range of money should be limited
if (money <= 0 || money > balance) {
System.out.println("Your consumption amount should be 0-" + balance);
break;
}
System.out.print("Consumption Description:");
note = scanner.next();
balance -= money;
//Splicing consumption information to details
date = new Date();//Get the current time
details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
case "4":
String choice = "";
while (true) {
//The user is required to enter Y / N, otherwise it will cycle all the time
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;
}
//scheme 2
// if("y".equals(choice)) {
// loop = false;
// break;
// } else if ("n".equals(choice)) {
// break;
// }
}
if (choice.equals("y")) {
loop = false;
}
break;
default:
System.out.println("err please choose again");
}
} while (loop);
System.out.println(" you have exit the SmallChange");
}
}
5. 优化成OOP版
很多东西可以直接复制过来变成方法,把原来的改过来是简单的
5.1 实现OOP版
那么先有一个执行的主类SmallChangeSysApp
//Call the object directly and display the main menu
public class SmallChangeSysApp {
public static void main(String[] args) {
new SmallChangeSysOOP().mainMenu();
}
}
还有一个类专门是对象,我们叫它为SmallChangeSysOOP
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSysOOP {
//basic variables
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
//display details
String details = "-----------------Change details------------------";
//income
double money = 0;
double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
// consume
String note = "";
public void mainMenu() {
do {
System.out.println("\n================Small Change Menu(OOP)===============");
System.out.println("\t\t\t1 show change details");
System.out.println("\t\t\t2 income entry");
System.out.println("\t\t\t3 consumption");
System.out.println("\t\t\t4 exit");
System.out.println("please choose 1-4:");
key = scanner.next();
switch (key) {
case "1":
this.detail();
break;
case "2":
this.income();
break;
case "3":
this.pay();
break;
case "4":
this.exit();
break;
default:
System.out.println("Choose the wrong number please choose again");
}
} while (loop);
}
public void detail() {
System.out.println(details);
}
public void income() {
System.out.print("Income recorded amount:");
money = scanner.nextDouble();
if (money <= 0) {
System.out.println("The income entry amount must be greater than 0");
return; //exit and do not execute next sentence.change break to return
}
balance += money;
date = new Date();
details += "\nIncome \t+" + money + "\t" + sdf.format(date) + "\t" + balance;
}
public void pay() {
System.out.print("Consumption amount:");
money = scanner.nextDouble();
if (money <= 0 || money > balance) {
System.out.println("Your consumption amount should be 0-" + balance);
return;
}
System.out.print("consumption description:");
note = scanner.next();
balance -= money;
date = new Date();
details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
}
//退出
public void exit() {
//When the user enters 4 to exit, the prompt "are you sure you want to exit?
// Y / N" will be given. You must enter the correct Y / n
String choice = "";
while (true) {
System.out.println("are you really gonna exit? y/n");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;
}
//scheme 2
// if("y".equals(choice)) {
// loop = false;
// break;
// } else if ("n".equals(choice)) {
// break;
// }
}
if (choice.equals("y")) {
loop = false;
}
}
}
5.2 OOP的好处
OOP版主函数很简单,只要new这个对象就可以了,关于这个对象的其他方法也好属性也好,不用放在主函数里面,那样在主函数也可以自由加上想加得到内容,未来假如有他人要用,不用把整个文件拷过去,只要把类交给对方即可,这样扩展和可读性大大提升,要加什么功能就再写方法原先的扩展功能很麻烦,要来回切
以上就是Java模仿微信实现零钱通简易功能(两种版本)的详细内容,更多关于Java的资料请关注编程网其它相关文章!