| 最近刚刚复习了一下Java的面向对象三大特性,这里跟着hsp做个小零钱通实践一下,以下记录了学习和编写过程
 1. 需求描述使用Java 开发零钱通项目, 模仿微信实现简易功能,可以完成收益入账,消费,查看明细,退出系统等功能,先按照一般方法写,后期在改进为OOP预期界面:(实际可能不同)
 
  2. 需求分析面对这样一个需求,先化繁为简 写一个菜单完成零钱通明细.完成收益入账消费退出用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,否则循环输入指令,直到输入y 或者 n在收益入账和消费时,判断金额是否合理,并给出相应的提示
 3. 实现零钱通主要功能3.1 写一个菜单    public static void main(String[] args) {
        
        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();
            
            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; 
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
 修改switch中的case2  System.out.print("Income recorded amount:");
                    money = scanner.nextDouble();
                    
                    
                    balance += money;
                    
                    date = new Date(); 
                    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();
                    
                    System.out.print("Consumption Description:");
                    note = scanner.next();
                    balance -= money;
                    
                    date = new Date();
                    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) {
                        
                        System.out.println("你确定要退出吗? y/n");
                        choice = scanner.next();
                        if ("y".equals(choice) || "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 {
    
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        String key = "";
        boolean loop = true;
        
        
        String details = "-----------------Change details------------------";
        
        double money = 0;
        double balance = 0;
        Date date = null; 
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        
        
        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();
            
            switch (key) {
                case "1":
                    System.out.println(details);
                    break;
                case "2":
                    System.out.print("Income recorded amount:");
                    money = scanner.nextDouble();
                    
                    
                    
                    if (money <= 0) {
                        System.out.println("The income entry amount must be greater than 0");
                        break;
                    }
                    balance += money;
                    
                    date = new Date(); 
                    details += "\n" + "Income " + "\t" + "+" + money + "\t" + sdf.format(date) + "\t" + balance;
                    break;
                case "3":
                    System.out.print("Consumption amount:");
                    money = scanner.nextDouble();
                    
                    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;
                    
                    date = new Date();
                    details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
                    break;
                case "4":
                    String choice = "";
                    while (true) {
                        
                        System.out.println("你确定要退出吗? y/n");
                        choice = scanner.next();
                        if ("y".equals(choice) || "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 
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 {
    
    boolean loop = true;
    Scanner scanner = new Scanner(System.in);
    String key = "";
    
    String details = "-----------------Change details------------------";
    
    double money = 0;
    double balance = 0;
    Date date = null;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    
    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; 
        }
        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() {
        
        
        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;
            }
            
        }
        if (choice.equals("y")) {
            loop = false;
        }
    }
}
 5.3 OOP的好处OOP版主函数很简单,只要new这个对象就可以了,关于这个对象的其他方法也好属性也好,不用放在主函数里面,那样在主函数也可以自由加上想加得到内容,未来假如有他人要用,不用把整个文件拷过去,只要把类交给对方即可,这样扩展和可读性大大提升,要加什么功能就再写方法原先的扩展功能很麻烦,要来回切  
 小结: 希望老铁给个一键三连哦 |