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 }

浙公网安备 33010602011771号