目录
面向对象和面向过程的区别
以洗衣服举例
面向对象
创建:洗衣机,衣服,洗衣粉(对象)
给对象赋予方法和属性
- 洗衣机:放入,开启
- 衣服:拿起
- 洗衣粉:加入
然后用上面的方法和对象执行
- 衣服(拿起)
- 洗衣机(放入)
- 洗衣粉(加入)
- 洗衣机(开启)
面向过程
- 把衣服拿起来放进洗衣机
- 向洗衣机里面放入洗衣粉
- 开启洗衣机
项目开发需求说明
使用java开发零钱通项目,可以完场收益入账,查看明细,退出系统等功能
项目界面演示
项目代码实现
编写文件
1.完成界面的设计
界面包含退出功能,确保输入4之后可以退出让这个程序结束
import java.util.Scanner;
public class SmallChangeSys {
public static void main(String[] args) {
boolean loop = true;
Scanner scanner = 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 = scanner.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,退出");
loop = false;
break;
default:
System.out.println("选择有误,请重新选择");
}
}while (loop);
System.out.println("退出了零钱通");
}
}
2.完成零钱通明细的内容
有三种思路可以实现零钱明细的显示
- 数组的方式,但是这种方式需要实现清除要写入多少条记录
- 字符串拼接的方式每增加一条然后在后面补充一行
- 使用对象,每个记录作为一个
下面选择第二种方式即字符串拼接的方式实现
先创建一个String变量
String details = "\n------------零钱通明细------------";
让第一项的输出变为输出details
3.完成收益入账的功能
在循环的函数外创建好变量,以及提前初始化Date函数
double money = 0;
double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
然后把2对应的功能改成
case "2":
System.out.println("收益入账金额");
money = scanner.nextDouble();
balance +=money;
date = new Date();
details += "\n收益入账\t" + money +"\t" + sdf.format(date) +"\t余额:\t" +balance;
break;
4.完成消费功能
消费功能需要注意的点
- 消费的金额不能大于余额(这个这边先不考虑,后面再考虑输入值的校验)
- 上一个功能的money变量一样可以用在这里
- 日期需要重新初始化
先在上面添加好空的Sting的消费原因
String note = "";
把3的对应功能改成
System.out.println("消费说明:");
note = scanner.next();
System.out.println("消费金额");
money = scanner.nextDouble();
balance -= money;
date =new Date();
details += "\n" + note + "\t-" +money + "\t"+sdf.format(date) +"\t余额:"+balance;
5.完成退出功能
思路:
- 在用户输入退出的时候先向用户确认是否退出
- 如果用户在选择的时候输入了不符合要求的值则继续问用户是否退出直到用户输入了符合要求的值
- 先做一个空的Sting变量choice作为接收输入的变量
- 然后判断值,如果为y则将loop替换为false
代码实现
case "4":
String chiose = "";
while (true) {
System.out.println("你确定要退出吗(y/n)");
chiose = scanner.next();
//先做一个用户输入输入的是否为y/n的判断
if(chiose.equals("y") || chiose.equals("n")){
break;
}
}
//然后根据用户的输入来进行相应的功能
if (chiose.equals("y")){
loop = false;
}
break;
注意:虽然可以在while里面直接进行loop的修改,不过还是建议尽量分为两步,因为这样可以提高程序的扩展性,比如以后你如果在这个功能要接收用户的其他输入的时候方便扩展,同时增加了代码的可读性
6.零钱通金额校验
什么时候需要金额校验?==>消费的时候
有一个非常重要的编程思想:正难则反
什么是符合要求的输入
- 消费后余额不能为负数
- 正数
什么是不符合要求的输入
- >余额的输入
- 金额<=0
从编程角度看很明显,写不符合要求的输入判断比写符合要求的输入判断简单得多而且这些条件不是互相关联的,完全可以一个if判断一条
因此从错误的输入的角度出发,仅需三行代码
//判断输入的数字是否不合法
if(money <=0 ||money>balance){
System.out.println("输入错误,输入范围:0-" + balance);
break;
}
7.面向过程的编程结束
最终代码
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 = "";
//1.零钱通明细
String details = "\n------------零钱通明细------------";
//2.收益入账
double money = 0;
double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//3.消费
String note = "";
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 = scanner.next();
switch (key) {
case "1":
System.out.println(details);
break;
case "2":
System.out.println("收益入账金额");
money = scanner.nextDouble();
balance +=money;
date = new Date();
details += "\n收益入账\t" + money +"\t" + sdf.format(date) +"\t余额:" +balance;
break;
case "3":
System.out.println("消费说明:");
note = scanner.next();
System.out.println("消费金额");
money = scanner.nextDouble();
//判断输入的数字是否不合法
if(money <=0 ||money>balance){
System.out.println("输入错误,输入范围:0-" + balance);
break;
}
balance -= money;
date =new Date();
details += "\n" + note + "\t-" +money + "\t"+sdf.format(date) +"\t余额:"+balance;
break;
case "4":
String chiose = "";
while (true) {
System.out.println("你确定要退出吗(y/n)");
chiose = scanner.next();
//先做一个用户输入输入的是否为y/n的判断
if(chiose.equals("y") || chiose.equals("n")){
break;
}
}
//然后根据用户的输入来进行相应的功能
if (chiose.equals("y")){
loop = false;
}
break;
default:
System.out.println("选择有误,请重新选择");
}
}while (loop);
System.out.println("退出了零钱通");
}
}
将代码转换为OOP(面向对象)版
仿照上面洗衣服的例子,然后进行步骤设计
- 创建对象
- 写入功能,属性
- 调用各个功能实现零钱通
1.创建变量
public class SmallChangeSysOOP {
//主菜单
public void mainMenu(){
}
//零钱通明细
public void detail(){
}
//收益入账
public void income(){
}
//消费
public void pay(){
}
//退出
public void exit(){
}
}
2.写入功能
直接把前面的功能放进去稍作改动即可(把结尾的break删去,然后把if中的break换为return)
package com.humouren.OOP;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSysOOP {
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
//1.零钱通明细
String details = "\n------------零钱通明细------------";
//2.收益入账
double money = 0;
double balance = 0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//3.消费
String note = "";
//主菜单
public void mainMenu() {
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 = scanner.next();
switch (key) {
case "1":
this.detail();
case "2":
this.income();
break;
case "3":
this.pay();
break;
case "4":
this.exit();
break;
}
} while (loop);
}
//零钱通明细
public void detail() {
System.out.println(details);
return;
}
//收益入账
public void income() {
System.out.println("收益入账金额");
money = scanner.nextDouble();
balance += money;
date = new Date();
details += "\n收益入账\t" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
}
//消费
public void pay() {
System.out.println("消费说明:");
note = scanner.next();
System.out.println("消费金额");
money = scanner.nextDouble();
//判断输入的数字是否不合法
if (money <= 0 || money > balance) {
System.out.println("输入错误,输入范围:0-" + balance);
return;
}
balance -= money;
date = new Date();
details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
}
//退出
public void exit() {
String chiose = "";
while (true) {
System.out.println("你确定要退出吗(y/n)");
chiose = scanner.next();
//先做一个用户输入输入的是否为y/n的判断
if (chiose.equals("y") || chiose.equals("n")) {
break;
}
}
//然后根据用户的输入来进行相应的功能
if (chiose.equals("y")) {
loop = false;
}
}
}
3.调用实现
然后在另一个文件中直接执行这个文件的主菜单就可以了
package com.humouren.OOP;
public class SmallChangeSysApp {
public static void main(String[] args) {
new SmallChangeSysOOP().mainMenu();
}
}