ps:内容为本人学习韩顺平老师课程的笔记,全部all总都为个人总结。
功能
思路
化繁为简
1.菜单
do while循环loop是循环的条件(Boolean变量) 里面嵌套switch
```java
package smallchange;
import java.util.Scanner;
public class SmallChangeSys {
public static void main(String[] args) {
boolean loop=true;
Scanner sc=new Scanner(System.in);
String key="";//整形也可以
do {
System.out.println("=========零钱通菜单========");
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=sc.next();
switch(key) {
case"1"://如果是正型还用写“”吗
System.out.println("1 零钱通明细");
break;//这里的break只是脱离switch循环但dowhile还在
case"2":
System.out.println("2 收益入账");
break;
case"3":
System.out.println("3 消费");
break;
case"4":
System.out.println("4 退出");
loop=false;//这个才把while循环退出了
break;
default:
System.out.println("选择有误,请重新选择");
break;//是要有的,但是是最后一个选择就没有必要了
}
}while(loop);
System.out.println("=======退出零钱通项目=======");
}
}
2.完成零钱通明细
收入 入账 消费
放入 数组(不确定有多大) 对象 字符串拼接完成
这里选择第3个
```java
String details="--------零钱通明细----------";
case"1":
System.out.println(details);
3.零钱通收益入账
入账 钱数(会有个范围校验) 时间 余额
首先就是定义新的变量 所以是功能驱动程序员增加新的变化和代码
介绍一下时间的用法
import java.util.Date;
Date date=null;
date=new Date();
System.out.println(date);
输出是这样的
我们要换个格式
Date date=null;
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");//可以用于日期格式化
date=new Date();
System.out.println(sdf.format(date));
这回输出就是
details+="\n收益入账\t+"+money+"\t"+sdf.format(date)+"\t"+balance;
输出的时候
4.消费
变量
消费名称
5.退出
String choice="";
//while循环确保输入的是y或n
while(true) {
System.out.println("你确定要退出吗? y/n");
choice=sc.next();
if("y".equals(choice) || "n".equals(choice)) {
break;//只是退出switch里的while
}
}//其实在这里也可以分y和n但是尽量一段代码,只完成一个小功能
//是y就退出整个 n的话不做讨论
if("y".equals(choice)) {
loop=false;
}
break;//这个一定是要有的,要不然还会执行default
6.补充:收益和消费的时候判断金额是否合理
当要增加功能的时候我们要知道代码要在什么地方写
思路:找出不正确的金额的条件,然后给出提示,就直接break
//2
if(money<=0) {//说错误的
System.out.println("收益入账金额需要大于0");
break;//直接打道回府
}
//3
if(money<=0 ||money>balance) {
System.out.println("你的消费金额应该在0-"+balance);
break;
}
这样写就是很方便,分支少,方便修改
加入再加入其他的条件,那么就是分支会多,如果按照错误的写就是直接再添加独自的
过程编程代码
package smallchange;
import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SmallChangeSys {
public static void main(String[] args) {
boolean loop=true;
Scanner sc=new Scanner(System.in);
String key="";//整形也可以
//2.明细
String details="--------零钱通明细----------";
//3.收益入账
double money=0;
double balance=0;
Date date=null;
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");//可以用于日期格式化
//4.消费原因
String note="";
do {
System.out.println("\n=========零钱通菜单========");//\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=sc.next();
switch(key) {
case"1":
System.out.println(details);
break;
case"2":
System.out.println("收益入账金额:");
money=sc.nextDouble();
//money的值应该校验 收益
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.println("消费金额");
money=sc.nextDouble();
//也有范围校验
if(money<=0 ||money>balance) {
System.out.println("你的消费金额应该在0-"+balance);
break;
}
System.out.println("消费说明:");
note=sc.next();
balance-=money;
date=new Date();
details+="\n"+note+"\t-"+money+"\t"+sdf.format(date)+"\t"+balance;
break;
case"4":
String choice="";
//while循环确保输入的是y或n
while(true) {
System.out.println("你确定要退出吗? y/n");
choice=sc.next();
if("y".equals(choice) || "n".equals(choice)) {
break;//只是退出switch里的while
}
}//其实在这里也可以分y和n但是尽量一段代码,只完成一个小功能
//是y就退出整个 n的话不做讨论
if("y".equals(choice)) {
loop=false;
}
break;//这个一定是要有的,要不然还会执行default
default:
System.out.println("选择有误,请重新选择");
break;
}
}while(loop);
System.out.println("=======退出零钱通项目=======");
}
}
面向对象OOP
上面是过程编程,现在换成oop来感受一下切身好处
把各个功能都对应成方法
package OOP;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSysOOP {
boolean loop=true;
Scanner sc=new Scanner(System.in);
String key="";
String 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=========零钱通菜单(OOP)========");
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=sc.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("选择有误,请重新选择");
}
}while(loop);
System.out.println("=======退出零钱通项目=======");
}
//零钱通明细
public void detail() {
System.out.println(details);
}
//完成收益入账
public void income() {
System.out.println("收益入账金额:");
money=sc.nextDouble();
if(money<=0) {
System.out.println("收益入账金额需要大于0");
return;//break换为return,退出方法,不再执行后面的代码
}
balance+=money;
date=new Date();
details+="\n收益入账\t+"+money+"\t"+sdf.format(date)+"\t"+balance;
//这个break不再有必要了
}
//消费
public void pay() {
System.out.println("消费金额");
money=sc.nextDouble();
if(money<=0 ||money>balance) {
System.out.println("你的消费金额应该在0-"+balance);
return;
}
System.out.println("消费说明:");
note=sc.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("你确定要退出吗? y/n");
choice=sc.next();
if("y".equals(choice) || "n".equals(choice)) {
break;
}
}
if("y".equals(choice)) {
loop=false;
}
}
}
package OOP;
public class SmallChangeSysAPP {
public static void main(String[] args) {
new SmallChangeSysOOP().mainMenu();//不用再分2部了,目的是一样的
}
}
好处:
1.系统了很多,代码可读性
2.方便他人使用,加用自己的东西