java零钱通实现

项目 - 零钱通

项目开发流程说明

项目需求说明

使用 Java 开发 零钱通项目 , 可以完成收益入账,消费,查看明细,退出系统等功能

项目的界面

 

 

 

项目代码实现

编写文件 SmallChangeSys.java 完成基本功能 (过程编程)

先使用过程编程,后面改成 OOP 版本

 

项目代码实现改进

  1. 用户输入4退出时 ,给出提示 "你确定要退出码?y/n" ,必须输入正确的y/n ,否则循环输入指令 ,知道输入y或者n

  2. 在收益入账和消费时 ,判断金额是否合理 ,并给出相应的提示

  3. 将面向过程的代码修改为面向对象的方法 ,编写SmallChangeSysOOP.java类 ,并使用 SmallChangeSysApp.java完成调试

     

化繁为简.

  1. 先完成显示菜单,并可以选择

  2. 完成零钱通明细.

  3. 完成收益入账

  4. 消费

  5. 退出

package com.edu.smallchange;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class SmallChangeSys {
  public static void main(String[] args) {

      //完成功能驱动我们去定义指定的变量
      boolean loop = true;
      Scanner scanner = new Scanner(System.in);
      String key = "";
      double balance = 0.0;
      double account = 0.0;
      Date date = null;
      //date是java.util.Date表示日期

      //定义新的变量 ,保存消费的原因
      String note = "";
      String details = "--------------零钱通明细-------------";
      do {
          System.out.println("-----------------项目菜单--------------------");
          System.out.println("-----------1.零钱通明细----------------------");
          System.out.println("-----------2.收益入账------------------------");
          System.out.println("-----------3.消费---------------------------");
          System.out.println("-----------4.退出---------------------------");
          System.out.println("请选择(1-4)");
          key = scanner.next();
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
          //用于将获取到的日期格式化
          //使用switch分支结构
          switch (key) {
              case "1":
                  System.out.println(details);
                  break;
              case "2":
                  System.out.println("--------------收益入账---------------");
                  System.out.println("请输入入账的金额:");
                  account = scanner.nextDouble();
                  if (account <= 0 ){
                      System.out.println("输入的金额有误,请重新输入");
                      break;
                  }else {
                      balance += account;
                      date = new Date();//获取当前日期
                      details += "\n收益入账\t+" + account + "\t" + sdf.format(date) + "\t余额:" + " " + balance;
                  }
                  break;
              case "3":
                  System.out.println("---------------消费------------------");
                  System.out.println("请输入消费的金额");
                  account = scanner.nextDouble();
                  //编程思想
                  //找出不正确金额的条件,然后给出提示,直接break
                  if (account <= 0 || account > balance){
                      System.out.println("输入有误,你的消费金额 应在 0-"+balance+",请重新输入");
                      break;
                  }else {
                      System.out.println("请输入消费说明");
                      note = scanner.next();
                      balance -= account;
                      date = new Date();//获取当前日期
                      details += "\n" + note +"\t-" +account+ "\t" + sdf.format(date) + "\t余额:" + " " + balance;
                  }
                  break;


              case "4":
                  System.out.println("---------------退出-------------------");
                  String Choice = "";
                  //建议一段代码,完成一个小功能,尽量不要混在一起
                  while (true) {//要求用户输入的必须是y/n否则就一直循环
                      System.out.println("你确定要退出码?y/n");
                      Choice = scanner.next();
                      if ("y".equals(Choice)||"n".equals(Choice)){
                          break;
                      }
                  }
                  if (Choice.equals("y"))
                  {
                      loop = false;
                      break;
                  }

                  break;
              default:
                  System.out.println("输入有误");

          }
      } while (loop);

      System.out.println("已退出零钱通项目");
  }
}

接下来我们来尝试将其更改为OOP 版本 ,即面向对象的版本

将面向过程的代码修改为面向对象的方法 ,编写SmallChangeSysOOP.java类 ,并使用 SmallChangeSysApp.java完成调试

SmallChangeSysOOP.java首先这个类是完成零钱通各个功能的类 , 因此我们可以将各个功能编写成方法

package com.edu.smallchange.oop;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class SmallChangeSysOOP {
  String key;
  double balance;
  double money;
  String note;
  boolean loop = true;
  String details = "-----------零钱通明细--------------";
  Date date;
  Scanner scanner = new Scanner(System.in);
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");

  public void mainMenu(){
      //显示零钱通菜单
      do {
          System.out.println("-----------------项目菜单OOP版本-------------");
          System.out.println("-----------1.零钱通明细----------------------");
          System.out.println("-----------2.收益入账------------------------");
          System.out.println("-----------3.消费---------------------------");
          System.out.println("-----------4.退出---------------------------");
          System.out.println("请选择(1-4)");
          key = scanner.next();
          switch (key){
              case "1":
                  this.show_details();
                  break;
              case "2":
                  this.income();
                  break;
              case "3":
                  this.Consumption();
                  break;
              case "4":
                  this.exit();
                  break;
              default:
                  System.out.println("输入有误");
          }
      }while (loop);
  }


  public void show_details(){
      System.out.println(details);
  }
  public void income(){
      System.out.println("--------------收益入账---------------");
      System.out.println("请输入入账的金额:");
      money = scanner.nextDouble();
      if (money <= 0 ){
          System.out.println("输入的金额有误,请重新输入");
          return;
          //退出方法,不在执行后面的代码
      }
      balance += money;
      date = new Date();//获取当前日期
      details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额:" + " " + balance;

  }
  //完成消费的方法
  public void Consumption(){
      System.out.println("---------------消费------------------");
      System.out.println("请输入消费的金额");
      money = scanner.nextDouble();
      //编程思想
      //找出不正确金额的条件,然后给出提示,直接break
      if (money <= 0 || money > balance){
          System.out.println("输入有误,你的消费金额 应在 0-"+balance+",请重新输入");
          return;
      }
      System.out.println("请输入消费说明");
      note = scanner.next();
      balance -= money;
      date = new Date();//获取当前日期
      details += "\n" + note +"\t-" +money+ "\t" + sdf.format(date) + "\t余额:" + " " + balance;
  }

  public void exit(){
      System.out.println("---------------退出-------------------");
      String Choice = "";
      //建议一段代码,完成一个小功能,尽量不要混在一起
      while (true) {//要求用户输入的必须是y/n否则就一直循环
          System.out.println("你确定要退出码?y/n");
          Choice = scanner.next();
          if ("y".equals(Choice)||"n".equals(Choice)){
              break;
          }
      }
      if (Choice.equals("y"))
      {
          loop = false;
      }
  }

SmallChangeSysApp.java 编写主类调用OOP类中的方法 ,即可完成零钱通的运行

package com.edu.smallchange.oop;

public class SmallChangeSysApp {
  public static void main(String[] args) {
      SmallChangeSysOOP smallChangeSysOOP = new SmallChangeSysOOP();
      smallChangeSysOOP.mainMenu();
  }
}

编写类的过程中的具体实现方式和面向过程的步骤差不多一致 ,但是我们将一个大的运行过程不断拆分 ,成了一个个小的 方法 ,这样的编写方式使得步骤模块化, 以后编写其他方法的时候 就可以直接调用OOP编程中的方法 ,而不是自己重新再去编写 ,同时需要注意的是 ,在编写的过程当中 ,入账和消费判断的内部 ,需要将原本的break退出更换为return 不然代码会报错 ,return一般用于方法 ,而break一般用于switch或者for这样的循环语句

posted @ 2022-04-28 17:01  comia  阅读(210)  评论(0)    收藏  举报