1.项目界面:
2.需求分析:
(1)完成收益入账;
(2)消费;
(3)查看明细;
(4)退出系统;
3.过程分析:
a.显示出零钱通菜单:
点击查看代码
System.out.println("\n=====零钱通菜单=====");
System.out.println("\t\t\t1 零钱通明细");
System.out.println("\t\t\t2 收益入账");
System.out.println("\t\t\t3 消费");
System.out.println("\t\t\t4 退 出");
System.out.println("请选择(1-4):");
b.使用输入函数和switch完成对数据的选择:
点击查看代码
Scanner in=new Scanner(System.in);
String key=in.next();
switch(key){
case "1":
System.out.println("1 零钱通明细");
break;
case "2":
System.out.println("2 收益入账");
break;
case "3":
System.out.println("3 消费");
break;
case "4":
System.out.println("4 退 出");
loor=false;//很细节
break;
default:
System.out.println("输入有误,请重新输入");
}
c. 使用do-while循环进行数据反复循环;
d.零钱通明细输出:
点击查看代码
String details = "---------零钱通明细---------";
case "1":
System.out.println(details);//变量在后续会不断格式化'
break;
e.收益入账:
点击查看代码
double money;//需要输入的金额
double balance = 0;//余额
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
case "2":
System.out.print("收益入账金额:"); //这行不用换行
money = in.nextDouble();
if (money <= 0) {
System.out.println("收益入账金额需要大于0");
break;//退出switch分支;
}
balance += money;//余额不断增加
date = new Date(); //获取当前日期
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;//字符串拼接也可以加等于;
break;
f.消费:
点击查看代码
case "3":
System.out.print("请输入消费金额:");
//两个都用print输出,输入函数会自动换行的
money = in.nextDouble();
if (money <= 0 || money > balance) {
System.out.println("消费金额应该在0-" + balance + "之间");
break;
}
balance -= money;
System.out.print("请输入消费说明:");
String note = in.next();
date = new Date();
details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
break;
g.退出:
点击查看代码
case "4":
String choice = null;
while (true) {
System.out.println("你确定要退出吗?y/n");
System.out.print("请输入指令:");
choice = in.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;//只有输出y和n才会退出
} else {
System.out.println("请输入正确的指令");
}
}
//if放while后面
if (choice.equals("y")) {
loor = false;//为了退出外层循环
}
break;
default:
System.out.println("输入有误,请重新输入");
}
} while (loor);
System.out.println("---------退出了零钱通系统---------");
4.面向过程编程代码:
点击查看代码
package smallchange.oop;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
public static void main(String[] args) {
boolean loor = true;//要写循环外面,不能写里面
//1. 输入1是明细 要利用拼接 打印出钱数和日期 2.2里面要打印出收益入账和输入值
String details = "---------零钱通明细---------";
double money;//需要输入的金额
double balance = 0;//余额
Date date = null; // date 是 java.util.Date 类型,表示日期
//因为后面还要反复获取,所以先设为空不直接Date date=new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //可以用于日期格式化的
do { //第一次循环一定能进入,能显示出第一次的界面
System.out.println("\n=====零钱通菜单=====");//在它上面设一行空的,每次循环都设一行空的
// 等输出每一个值的时候中间都会和它间隔一行(因为它在循环内);
System.out.println("\t\t\t1 零钱通明细");//要提示数字代表的 操作
System.out.println("\t\t\t2 收益入账");
System.out.println("\t\t\t3 消费");
System.out.println("\t\t\t4 退 出");
System.out.println("请选择(1-4):");
Scanner in = new Scanner(System.in);
String key = in.next();
switch (key) {
case "1":
System.out.println(details); //让1统一输出,格式在其他地方调好;
break;
case "2":
//找出不正确的金额条件,给出提示,直接break
//因为不正确条件可以一直用if
System.out.print("收益入账金额:"); //这行不用换行
money = in.nextDouble();
if (money <= 0) {
System.out.println("收益入账金额需要大于0");
break;
}
balance += money;//余额不断增加
date = new Date(); //获取当前日期
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;
//字符串拼接也可以加等于
break;
case "3":
System.out.print("请输入消费金额:");
//两个都用print输出,输入函数会自动换行的
money = in.nextDouble();
if (money <= 0 || money > balance) {
System.out.println("消费金额应该在0-" + balance + "之间");
break;
}
balance -= money;
System.out.print("请输入消费说明:");
String note = in.next();
date = new Date();
details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
//因为是消费 细节加减号,而且还要加在字符串里面
break;
//建议一段代码,完成一个小功能,不混在一起
case "4":
String choice = null;
while (true) {
System.out.println("你确定要退出吗?y/n");
System.out.print("请输入指令:");
choice = in.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;//只有输出y和n才会退出
} else {
System.out.println("请输入正确的指令");
}
}
//if放while后面
if (choice.equals("y")) {
loor = false;//为了退出外层循环
}
break;//要放外面,任何情况才能都退出switch
default:
System.out.println("输入有误,请重新输入");
//不用加break;
}
} while (loor);
System.out.println("---------退出了零钱通系统---------");
}
}
5.面向对象编程代码:
点击查看代码
package smallchange.oop.oop;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 该类是完成零钱通的各个功能的类
* 使用OOP(面向对象编程)
* 将各个功能对应一个方法.
*/
public class SmallChangeSysOOP {
//属性..
//定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
//2. 完成零钱通明细
//老韩思路, (1) 可以把收益入账和消费,保存到数组 (2) 可以使用对象 (3) 简单的话可以使用String拼接
String details = "---------零钱通明细---------";
//3. 完成收益入账 完成功能驱动程序员增加新的变化和代码
//老韩思路, 定义新的变量
double money = 0;
double balance = 0;
Date date = null; // date 是 java.util.Date 类型,表示日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //可以用于日期格式化的
//4. 消费
//定义新变量,保存消费的原因
String note = "";
//先完成显示菜单,并可以选择
public void mainMenu() {
do {
System.out.println("\n=====零钱通菜单=====");//在它上面设一行空的,每次循环都设一行空的
// 等输出每一个值的时候中间都会和它间隔一行(因为它在循环内);
System.out.println("\t\t\t1 零钱通明细");//要提示数字代表的 操作
System.out.println("\t\t\t2 收益入账");
System.out.println("\t\t\t3 消费");
System.out.println("\t\t\t4 退 出");
System.out.println("请选择(1-4):");
key = scanner.next();
//使用switch 分支控制
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("选择有误,请重新选择");
}
} while (loop);
System.out.println("---------退出了零钱通项目---------");
}
//完成零钱通明细
public void detail() {
System.out.println(details);
}
//完成收益入账
public void income() {
System.out.print("收益入账金额:");
money = scanner.nextDouble();
//money 的值范围应该校验 -》 一会在完善
//老师思路, 编程思想
//找出不正确的金额条件,然后给出提示, 就直接return
if(money <= 0) {
System.out.println("收益入账金额 需要 大于 0");
return; //退出方法,不在执行后面的代码。
}
//找出正确金额的条件
balance += money;
//拼接收益入账信息到 details
date = new Date(); //获取当前日期
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;
}
//消费
public void pay() {
System.out.print("消费金额:");
money = scanner.nextDouble();
//money 的值范围应该校验 -》 一会在完善
//找出金额不正确的情况
//过关斩将 校验方式.
if(money <= 0 || money > balance) {
System.out.println("你的消费金额 应该在 0-" + balance);
return;
}
System.out.print("消费说明:");
note = scanner.next();
balance -= money;
//拼接消费信息到 details
date = new Date(); //获取当前日期
details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
}
//退出
public void exit() {
//用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,
// 否则循环输入指令,直到输入y 或者 n
// 老韩思路分析
// (1) 定义一个变量 choice, 接收用户的输入
// (2) 使用 while + break, 来处理接收到的输入时 y 或者 n
// (3) 退出while后,再判断choice是y还是n ,就可以决定是否退出
// (4) 建议一段代码,完成一个小功能,尽量不要混在一起
String choice = "";
while (true) { //要求用户必须输入y/n ,否则就一直循环
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;
}
//第二个方案
// if("y".equals(choice)) {
// loop = false;
// break;
// } else if ("n".equals(choice)) {
// break;
// }
}
//当用户退出while ,进行判断
if (choice.equals("y")) {
loop = false;
}
}
}
========================================================================
package smallchange.oop.oop;
/**
* 这里我们直接调用SmallChangeSysOOP 对象,显示主菜单即可
*/
public class SmallChangeSysApp {
public static void main(String[] args) {
new SmallChangeSysOOP().mainMenu();
//只有调用一次对象时,可以不创建引用,直接调用;
}
}
6.细节总结
-
先构建出整个框架,再逐一实现每个功能;
-
先确定好零钱通明细,每次用到再不断增加内容;
-
“\n”放开头是再上一行多出一个空格,用于格式美观;
-
第一次循环一定能进入,所以选择do-while循环;
-
将数字代表的功能,再用switch进行输出选择,很有层次感;
-
先将日期方法配置好,方便下面直接用;
点击查看代码
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
===================================================================
date = new Date(); //获取当前日期
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;
-
需要进行条件判断时,建议找出不正确的条件,进行break,因为不正确条件可以一直用if;
-
字符串拼接也可以+=,配合"\n"使用进行换行拼接;
-
两个变量同时都用print输出,输入函数会自动换行的;
点击查看代码
System.out.print("收益入账金额:");
money = in.nextDouble();
System.out.print("请输入消费说明:");
String note = in.next();
-
因为是消费,所以输出时候需要加减号,而且还要加在字符串里面:"\t-" + money;
-
如果循环里面需要用到变量进行输入,可以在循环外面将变量设为空;
-
建议一段代码,完成一个小功能,不混在一起;
-
用while循环和do-while循环时,可以将一个为true的变量设为条件,想退出时设为false;
-
switch里面嵌套的其他循环结束后,要在嵌套循环外面加break,从而退出switch循环;
-
在方法中进行条件判断时,不正确的条件返回空即可,return;//退出方法;
-
在方法中进行this循环套用:case "1": this.detail();break;
-
只用调用一次对象时,可以不创建引用,直接调用:new SmallChangeSysOOP().mainMenu();
参考:
https://www.bilibili.com/video/BV1fh411y7R8?p=342&vd_source=f937f0092d385a7b990a2f3311d7d6ef
标签:java,money,System,choice,break,零钱,简单,println,out From: https://www.cnblogs.com/xljy/p/16704675.html