Java模仿微信实现零钱通简易功能(两种版本)

最近刚刚复习了一下Java的面向对象三大特性,这里跟着hsp做个小零钱通实践一下,以下记录了学习和编写过程

1. 需求描述

使用Java 开发零钱通项目, 模仿微信实现简易功能,可以完成收益入账,消费,查看明细,退出系统等功能,先按照一般方法写,后期在改进为OOP

预期界面:(实际可能不同)

2. 需求分析

面对这样一个需求,先化繁为简

  1. 写一个菜单
  2. 完成零钱通明细.
  3. 完成收益入账
  4. 消费
  5. 退出
  6. 用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,否则循环输入指令,直到输入y 或者 n
  7. 在收益入账和消费时,判断金额是否合理,并给出相应的提示

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;

/**

* This class is used to complete various functions of zero money pass

* Using OOP (object-oriented programming)

* Each function corresponds to a method

*/

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的资料请关注其它相关文章!

以上是 Java模仿微信实现零钱通简易功能(两种版本) 的全部内容, 来源链接: utcz.com/p/251476.html

回到顶部