Java练手项目 — 零钱通

  学习了各种各样的Java知识点之后,我们一定要检验自己知识点的掌握水平,最好的检验方式要么是面试、要么是做项目。今天,我就带大家来做一个 Java基础的项目,当然,这个项目是参考网络上其它人的思路的,仅在这里做一个分享。如有侵权,可以联系我删除。

   项目名称 — 零钱通

   项目概述:使用Java编程语言开发零钱通项目(模拟微信零钱通项目),可以完成收益入账、消费、查看明细、退出系统等功能。

   项目界面如下:

        

 

  提示:在完成基本功能之后,我们会对项目进行改进,改进得更加人性化、智能化、合理化,具体改进项目如下。

        

  项目代码编写基本思路和步骤:

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

 1   public static void main(String[] args) {
 2         // 定义相关的变量
 3         boolean loop = true;
 4         Scanner scanner = new Scanner(System.in);
 5         String key = "";
 6         do {
 7             System.out.println("===============零钱通菜单===============");
 8             System.out.println("\t\t\t1 零钱通明细");
 9             System.out.println("\t\t\t2 收益入账");
10             System.out.println("\t\t\t3 消费情况");
11             System.out.println("\t\t\t4 退    出");
12             System.out.print("请选择(1-4):");
13             key = scanner.next();
14             //使用switch分支控制
15             switch (key) {
16                 case "1":
17                     System.out.println("1 零钱通明细");
18                     break;
19                 case "2":
20                     System.out.println("2 收益入账");
21                     break;
22                 case "3":
23                     System.out.println("3 消费情况");
24                     break;
25                 case "4":
26                     System.out.println("4 退    出");
27                     loop = false;
28                     break;
29                 default:
30                     System.out.println("选择有误,请重新选择");
31             }
32         }while(loop);
33         System.out.println("-------退出了零钱通项目-------");
34     }

 

  2.完成零钱通明细功能

  3.完成收益入账

    收益入账需要的因素有:收益的金额、余额、日期,因此需要根据不同的需求定义不同的变量

 

 

 目前,完整的代码如下:

 1 package com.lxxedu.smallchange;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import java.util.Scanner;
 6 
 7 public class SmallChangeSys {
 8     //1.先完成显示菜单,并可以选择菜单,给出对应提示信息
 9     //2.完成零钱通明细(老韩思路:把收益入账和消费保存到数组中;也可以使用对象完成;简单的话可以使用String拼接)
10     public static void main(String[] args) {
11         // 定义相关的变量
12         boolean loop = true;
13         Scanner scanner = new Scanner(System.in);
14         String key = "";
15 
16         String details = "------------零钱通明细------------";
17         //3.完成收益入账  完成功能驱动程序员增加新的变量和代码
18         //定义新的变量
19         double money = 0;
20         double balance = 0;
21         Date date = null;  //date是java.util.Date 类型,表示日期
22         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //可以用于日期格式化的
23         do {
24             System.out.println("\n===============零钱通菜单===============");
25             System.out.println("\t\t\t1 零钱通明细");
26             System.out.println("\t\t\t2 收益入账");
27             System.out.println("\t\t\t3 消费情况");
28             System.out.println("\t\t\t4 退    出");
29             System.out.print("请选择(1-4):");
30             key = scanner.next();
31             //使用switch分支控制
32             switch (key) {
33                 case "1":
34                     System.out.println(details);
35                     break;
36                 case "2":
37                     System.out.print("收益入账金额:");
38                     money = scanner.nextDouble();
39                     //money的的值应该校验
40                     balance += money;
41                     //拼接收益入账信息到details
42                     date = new Date();  //获取当前的日期
43                     details += "\n收益入账\t+" +money + "\t" +sdf.format(date) + "\t" + balance;45                     break;
46                 case "3":
47                     System.out.println("3 消费情况");
48                     break;
49                 case "4":
50                     System.out.println("4 退    出");
51                     loop = false;
52                     break;
53                 default:
54                     System.out.println("选择有误,请重新选择");
55             }
56         }while(loop);
57         System.out.println("-------退出了零钱通项目-------");
58     }
59 }

   4.完成零钱通消费功能

     消费所需的变量:消费的商家名称

 

 

 

 目前,完整代码如下:

 1 package com.lxxedu.smallchange;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import java.util.Scanner;
 6 
 7 public class SmallChangeSys {
 8     //1.先完成显示菜单,并可以选择菜单,给出对应提示信息
 9     //2.完成零钱通明细(老韩思路:把收益入账和消费保存到数组中;也可以使用对象完成;简单的话可以使用String拼接)
10     //3.完成收益入账
11     //4.完成消费功能
12     public static void main(String[] args) {
13         // 定义相关的变量
14         boolean loop = true;
15         Scanner scanner = new Scanner(System.in);
16         String key = "";
17 
18         String details = "------------零钱通明细------------";
19         //3.完成收益入账  完成功能驱动程序员增加新的变量和代码
20         //定义新的变量
21         double money = 0;
22         double balance = 0;
23         Date date = null;  //date是java.util.Date 类型,表示日期
24         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //可以用于日期格式化的
25         //4.完成消费功能
26         String note = "";
27         do {
28             System.out.println("\n===============零钱通菜单===============");
29             System.out.println("\t\t\t1 零钱通明细");
30             System.out.println("\t\t\t2 收益入账");
31             System.out.println("\t\t\t3 消费情况");
32             System.out.println("\t\t\t4 退    出");
33             System.out.print("请选择(1-4):");
34             key = scanner.next();
35             //使用switch分支控制
36             switch (key) {
37                 case "1":
38                     System.out.println(details);
39                     break;
40                 case "2":
41                     System.out.print("收益入账金额:");
42                     money = scanner.nextDouble();
43                     //money的的值应该校验
44                     balance += money;
45                     //拼接收益入账信息到details
46                     date = new Date();  //获取当前的日期
47                     details += "\n收益入账\t+" +money + "\t" +sdf.format(date) + "\t" + balance;
48                     break;
49                 case "3":
50                     System.out.print("消费金额:");
51                     money = scanner.nextDouble();
52                     //money的的值应该校验
53                     System.out.print("消费说明:");
54                     note = scanner.next();
55                     balance -= money;
56                     //拼接消费信息到 details
57                     date = new Date();  //获取当前的日期
58                     details += "\n"+ note + "\t-" + money  + "\t" + sdf.format(date) + "\t" + balance;60                     break;
61                 case "4":
62                     System.out.println("4 退    出");
63                     loop = false;
64                     break;
65                 default:
66                     System.out.println("选择有误,请重新选择");
67             }
68         }while(loop);
69         System.out.println("-------退出了零钱通项目-------");
70     }
71 }

  以上已经完成了零钱通的基本功能,下面来对我们已做的零钱通的项目进行代码改进


 

 

  第1个功能思路分析:首先找到编程的位置,代码应该编写在"退出"分支结构中,需要定义变量,判断输入的是y还是n还是其它字符,如果是其它字符,就需要一直循环输入,直到输入的是y或者n才退出循环,退出循环后还要根据用户输入的是y还是n从而决定是否退出零钱通系统,具体功能代码如下:

 

 

   第2个功能思路分析:入账和消费时,都应该判断价格是否合理,比如入账,不可能入账金额是<=0元的,再说消费,不可能消费的价格是负数,或者消费的金额大于余额的。

 

 

 

  目前,完整代码如下:

 1 package com.lxxedu.smallchange;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import java.util.Scanner;
 6 
 7 public class SmallChangeSys {
 8     //1.先完成显示菜单,并可以选择菜单,给出对应提示信息
 9     //2.完成零钱通明细(老韩思路:把收益入账和消费保存到数组中;也可以使用对象完成;简单的话可以使用String拼接)
10     //3.完成收益入账
11     //4.完成消费功能
12     public static void main(String[] args) {
13         // 定义相关的变量
14         boolean loop = true;
15         Scanner scanner = new Scanner(System.in);
16         String key = "";
17 
18         String details = "------------零钱通明细------------";
19         //3.完成收益入账  完成功能驱动程序员增加新的变量和代码
20         //定义新的变量
21         double money = 0;
22         double balance = 0;
23         Date date = null;  //date是java.util.Date 类型,表示日期
24         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //可以用于日期格式化的
25         //4.完成消费功能
26         String note = "";
27         do {
28             System.out.println("\n===============零钱通菜单===============");
29             System.out.println("\t\t\t1 零钱通明细");
30             System.out.println("\t\t\t2 收益入账");
31             System.out.println("\t\t\t3 消费情况");
32             System.out.println("\t\t\t4 退    出");
33             System.out.print("请选择(1-4):");
34             key = scanner.next();
35             //使用switch分支控制
36             switch (key) {
37                 case "1":
38                     System.out.println(details);
39                     break;
40                 case "2":
41                     System.out.print("收益入账金额:");
42                     money = scanner.nextDouble();
43                     //money的的值应该校验
44                     if(money <= 0) {
45                         System.out.println("收入入账金额 需要 大于 0");
46                         break;
47                     }
48                     balance += money;
49                     //拼接收益入账信息到details
50                     date = new Date();  //获取当前的日期
51                     details += "\n收益入账\t+" +money + "\t" +sdf.format(date) + "\t" + balance;
52                     break;
53                 case "3":
54                     System.out.print("消费金额:");
55                     money = scanner.nextDouble();
56                     //money的的值应该校验
57                     //找出金额不正确的情况
58                     if(money<=0 || money > balance) {
59                         System.out.println("你的消费金额应该在0~" + balance);
60                         break;
61                     }
62                     System.out.print("消费说明:");
63                     note = scanner.next();
64                     balance -= money;
65                     //拼接消费信息到 details
66                     date = new Date();  //获取当前的日期
67                     details += "\n"+ note + "\t-" + money  + "\t" + sdf.format(date) + "\t" + balance;
68                     break;
69                 case "4":
70                     //(1)定义一个变量 choice
71                     String choice = "";
72                     //(2)使用while+break循环,来处理接收到的输入是 y或者n
73                     while(true) {
74                         System.out.println("你确定要退出吗?y/n");
75                         choice = scanner.next();
76                         if("y".equals(choice) || "n".equals(choice)) {
77                             break;
78                         }
79                     }
80                     //(3)当用户退出while后,再判断输入的是y还是n,就可以决定是否退出
81                     if(choice.equals("y")) {
82                         loop = false;
83                     }
84                     break;
85                 default:
86                     System.out.println("选择有误,请重新选择");
87             }
88         }while(loop);
89         System.out.println("-------退出了零钱通项目-------");
90     }
91 }

 

    第3个功能思路分析:编写SmallchangeSysOOP.java类完成主要功能,并且使用SmallChangeSysApp.java完成测试。

 

  SmallChangeSysOOP类的源代码

    将各个功能对应一个方法

 

  1 package com.lxxedu.smallchange.oop;
  2 
  3 import java.text.SimpleDateFormat;
  4 import java.util.Date;
  5 import java.util.Scanner;
  6 
  7 //改类是完成零钱通的各个功能的类
  8 //要求使用oop(面向对象编程)完成
  9 public class SmallChangeSysOOP {
 10     //属性
 11     // 定义相关的变量
 12     boolean loop = true;
 13     Scanner scanner = new Scanner(System.in);
 14     String key = "";
 15 
 16     String details = "------------零钱通明细------------";
 17     //3.完成收益入账  完成功能驱动程序员增加新的变量和代码
 18     //定义新的变量
 19     double money = 0;
 20     double balance = 0;
 21     Date date = null;  //date是java.util.Date 类型,表示日期
 22     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //可以用于日期格式化的
 23     //4.完成消费功能
 24     String note = "";
 25     //1.显示主菜单
 26     public void mainMenu() {
 27         do {
 28             System.out.println("\n===============选择零钱通菜单===============");
 29             System.out.println("\t\t\t1 零钱通明细");
 30             System.out.println("\t\t\t2 收益入账");
 31             System.out.println("\t\t\t3 消费情况");
 32             System.out.println("\t\t\t4 退    出");
 33             System.out.print("请选择(1-4):");
 34             key = scanner.next();
 35             //使用switch分支控制
 36             switch (key) {
 37                 case "1":
 38                     this.detail();
 39                     break;
 40                 case "2":
 41                     this.income();
 42                     break;
 43                 case "3":
 44                     this.pay();
 45                     break;
 46                 case "4":
 47                     this.exit();
 48                     break;
 49                 default:
 50                     System.out.println("选择有误,请重新选择");
 51             }
 52         }while(loop);
 53     }
 54 
 55     //2.完成零钱通明细
 56     public void detail() {
 57         System.out.println(details);
 58     }
 59 
 60     //3.完成收益入账
 61     public void income() {
 62         System.out.print("收益入账金额:");
 63         money = scanner.nextDouble();
 64         //money的的值应该校验
 65         if(money <= 0) {
 66             System.out.println("收入入账金额 需要 大于 0");
 67             return;  //退出方法,不再执行后面的代码
 68         }
 69         balance += money;
 70         //拼接收益入账信息到details
 71         date = new Date();  //获取当前的日期
 72         details += "\n收益入账\t+" +money + "\t" +sdf.format(date) + "\t" + balance;
 73     }
 74 
 75     //4.完成消费功能
 76     public void pay() {
 77         System.out.print("消费金额:");
 78         money = scanner.nextDouble();
 79         //money的的值应该校验
 80         //找出金额不正确的情况
 81         if(money<=0 || money > balance) {
 82             System.out.println("你的消费金额应该在0~" + balance);
 83             return;
 84         }
 85         System.out.print("消费说明:");
 86         note = scanner.next();
 87         balance -= money;
 88         //拼接消费信息到 details
 89         date = new Date();  //获取当前的日期
 90         details += "\n"+ note + "\t-" + money  + "\t" + sdf.format(date) + "\t" + balance;
 91     }
 92 
 93     //5.退出
 94     public void exit() {
 95         //(1)定义一个变量 choice
 96         String choice = "";
 97         //(2)使用while+break循环,来处理接收到的输入是 y或者n
 98         while(true) {
 99             System.out.println("你确定要退出吗?y/n");
100             choice = scanner.next();
101             if("y".equals(choice) || "n".equals(choice)) {
102                 break;
103             }
104         }
105         //(3)当用户退出while后,再判断输入的是y还是n,就可以决定是否退出
106         if(choice.equals("y")) {
107             loop = false;
108         }
109     }
110 }

  SmallChangeSysAPP类的源代码

    测试SmallChangeSysOOP功能代码

1 package com.lxxedu.smallchange.oop;
2 
3 public class SmallChangeSysApp {
4     public static void main(String[] args) {
5         new SmallChangeSysOOP().mainMenu();
6     }
7 }

 

posted @ 2023-01-14 10:08  C说编程  阅读(453)  评论(0)    收藏  举报