第一次写博客有点小小紧张哈,刚入门Java这门语言没多久,博主现在还在打基础中。这里为大伙们分享一下程序课的模拟作业,大概内容也不是很多,图一乐看个热闹就好了,如果需要借鉴的话,当然可以把这里的源码拿去玩玩的。就是,我们最后还有部分Bug问题没解决,就,图一乐吧!
开学第一周是实训周,我们这边给到的题目的是整一个自动贩卖机的模拟,给了五天的作业时间,2天就已经写好了大致内容了,后面又花了3天在补Bug,最后勉强把论文报告的字数凑满。下面是我们课题组整的活。
一、设计思路
本作业设计了6个类,分别为:贩卖机运行类(DrinkMachine)、菜单编辑类(Menu)、处理会员类(User)、处理货币类(MoneyCounter)、商品类(Goods)、用户类(Per)。其中,商品类与用户类为构造属性方法,分别为处理货币类及处理会员类所调用;贩卖机运行类是测试类,负责主菜单与分支菜单的逻辑管理及运行;菜单编辑类是主要控制类,为贩卖机运行类的附属管理,主要负责所有菜单逻辑分支及调用区,方便管理文字;处理会员登录拥有手机短信登录方法、会员注册方法、查询会员信息方法,便于管理会员菜单;处理货币类中存在结算方法及找零的两种方法,应对支付所出现的客观现象。
具体类的关系图如下:
根据程序设计需求,设计方案的系统工作流程内容如下:
- 系统主菜单及内置数组属性的初始化;
- 系统将默认拥有9种可选饮料信息,2位初始内置会员信息,1位管理员用户信息(固定的);
- 使用者可根据已设计的主菜单进行分支菜单的选择,本方案主菜单设计包含4种输入分支菜单的事件管理,如:输入1进入直接购买饮料菜单选择、输入2进入会员登录菜单选择、输入3进入管理商品菜单选择、输入0或其他数字刷新主菜单。
- 若用户在主菜单输入1,则可以直接购买饮料,并且进行现金投币支付的交易流程,倘若支付的金额不能够达到购买价格,将继续进行投币操作,当投币达到价格直接结算并返回主菜单;当投币数超过价格,则进行找零操作,返还用户现金并结算返回主菜单。在结算的同时,我们还提供了热量值计算及一次性购买多个饮料的选择。
- 若用户在主菜单输入2,则会跳转入会员菜单界面,用户可以通过输入相对应的数值来选择:手机短信一键登录、会员注册、会员信息查询、返回主菜单。我们为会员们提供了购买结算打七折的优惠。
- 若用户在主菜单输入3,则进入到管理员登录页面,需要输入该机器默认管理员名及密码,将会有3次判定输入错误的执行。输入3次失败则返回主菜单;输入成功则转换为管理商品菜单,拥有查询商品信息,添加新品种商品的权限。
- 该程序会一直循环,大部分分支菜单可通过输入0退回主菜单,然后继续循环。
二、功能结构
1、具体功能模块流程图如下图所示。
2、具体类图构造如下图所示。
三、源代码
1、DrinkMachine类:
package oneproject;
import java.util.Scanner;
public class DrinkMachine {
/*
*构建售卖机系统
*/
public static void main(String[] args) {
int a;
while (true){
Menu one = new Menu();
one.Menu1();
Scanner sc=new Scanner(System.in);
a=sc.nextInt();
switch (a){
case 1:
Menu two = new Menu();
two.Menu2();
break;
case 2:
Scanner vi = new Scanner(System.in);
User sm = new User();
sm.theUser();
System.out.println("【输入 1 进入购买】\n【输入 2 返回上一级】\n【输入 0 返回主菜单】");
int v=vi.nextInt();
switch (v){
case 1:
Menu three = new Menu();
three.Menu3();
break;
case 2:
User st = new User();
st.theUser();
break;
case 0:
DrinkMachine dz = new DrinkMachine();
dz.main(new String[]{});
default:
System.out.println("输入无效,自动返回主菜单");
DrinkMachine dx = new DrinkMachine();
dx.main(new String[]{});
}
continue;
case 3:
Menu four = new Menu();
four.Menu4();
case 0:
System.out.println("刷新成功");
break;
default:
System.out.println("输入无效,自动返回主菜单");
DrinkMachine dt = new DrinkMachine();
dt.main(new String[]{});
}
}
}
}
2、Menu类:
package oneproject;
import java.util.Scanner;
public class Menu {
private static final int size=100;
private static Goods[] gs=new Goods[size];
private static int goodsIndex=0;
static {
gs[goodsIndex++] = new Goods(1,"无糖可乐",10,0,10);
gs[goodsIndex++] = new Goods(2,"百事可乐",10,950,10);
gs[goodsIndex++] = new Goods(3,"芬达",10,916,10);
gs[goodsIndex++] = new Goods(4,"罐装芬达",20,538,10);
gs[goodsIndex++] = new Goods(5,"冰红茶",20,525,10);
gs[goodsIndex++] = new Goods(6,"蒙牛牛奶",20,692500,10);
gs[goodsIndex++] = new Goods(7,"营养快线",20,355040,10);
gs[goodsIndex++] = new Goods(8,"脉动",20,49200,10);
gs[goodsIndex++] = new Goods(9,"罐装椰奶",30,509600,10);
}
public static void query(){
for (Goods j:gs){
if (j!=null)
System.out.println(j.toString());
}
}
public static void query1(){
for (Goods q:gs){
if (q!=null)
System.out.println(q.toString());
}
}
/*
* 管理所有菜单文字
*/
public void Menu1(){
System.out.println("=============欢迎进入饮料售卖机==============");
System.out.println(" 1-购买饮料");
System.out.println(" 2-会员登录(享受七折优惠)");
System.out.println(" 3-管理员登录");
System.out.println(" 0-刷新界面");
System.out.println("==========================================");
}
public void Menu2(){
try{
System.out.println("以下饮料供您选择:");
query();
System.out.println("请选择饮品:");
Scanner in=new Scanner(System.in);
int id=in.nextInt();
int i;
boolean flag=false;
while(true){
for (i=0;i<gs.length;i++){
if(gs[i].getId()==id){
System.out.println("您选择的是:"+gs[i].getName());
System.out.println("请投入现金进行支付");
flag=true;
break;
}
}
if (flag==true)
break;
else{
System.out.println("无此饮料,请重新选择(0 退出)");
id=in.nextInt();
if (id==0){
System.out.println("欢迎下次购买...");
return;
}
else i=0;
}
}
System.out.println("输入数量");
Scanner co = new Scanner(System.in);
int count=co.nextInt();
if (count<=10 & count>0){
int total = (int) (gs[i].getPrice()*count);
double cal=count*gs[i].getKl();
MoneyCounter mc=new MoneyCounter();
mc.Cal(total);
System.out.println("卡路里小提示:\n预计摄入热量值为:"+cal+"焦");
}else {
System.out.println("限制购买瓶数为10瓶,请重新选择...");
Menu io=new Menu();
io.Menu2();
}
}catch (Exception e){
System.out.println("输入无效");
e.printStackTrace();
}
}
public void Menu3(){
try{
System.out.println("以下饮料供您选择:");
query1();
System.out.println("请选择饮品:");
Scanner ip=new Scanner(System.in);
int id=ip.nextInt();
int k;
boolean choose=false;
while(true){
for (k=0;k<gs.length;k++){
if(gs[k].getId()==id){
System.out.println("您选择的是:"+gs[k].getName());
System.out.println("【请投入现金进行支付】");
choose=true;
break;
}
}
if (choose==true)
break;
else{
System.out.println("无此饮料,请重新选择(输入 0 退出)");
id=ip.nextInt();
if (id==0){
System.out.println("欢迎下次购买...");
return;
}
else k=0;
}
}
System.out.println("输入数量");
Scanner co = new Scanner(System.in);
int count=co.nextInt();
if (count<=10 & count>0){
int total = (int) (gs[k].getPrice()*count*7/10);
double cal=count*gs[k].getKl();
MoneyCounter mc=new MoneyCounter();
mc.Cal(total);
System.out.println("卡路里小提示:\n预计摄入热量值为:"+cal+"焦");
}else {
System.out.println("限制购买瓶数为10瓶,请重新选择");
Menu io=new Menu();
io.Menu3();
}
}catch (Exception e1){
System.out.println("输入无效,请重新输入");
e1.printStackTrace();
}
}
public void Menu4(){
System.out.println("请使用该机器的默认管理员用户名及密码登录");
String admin = "123";
String adminPassword = "123456";
for(int j=0;j<3 ;j++ ){
Scanner a1 = new Scanner(System.in);
System.out.println("请输入管理员用户名:");
String adm1 = a1.nextLine();
System.out.println("请输入管理员密码:");
String adm2 = a1.nextLine();
if(adm1.equals(admin) && adm2.equals(adminPassword)){ //验证管理员名与密码是否正确
System.out.println("欢迎管理员登录");
int b;
while (true){
System.out.println("=============欢迎进入管理员系统==============");
System.out.println(" 1-查询饮料信息");
System.out.println(" 2-添加新饮料");
System.out.println(" 0-退出页面");
System.out.println("==========================================");
Scanner sc=new Scanner(System.in);
b=sc.nextInt();
switch (b){
case 2:
int id,price,Kl,num;
String name;
System.out.println("请输入编号(从10开始计入):");
id=sc.nextInt();
System.out.println("请输入名称:");
name=sc.next();
System.out.println("请输入价格:");
price=sc.nextInt();
System.out.println("请输入热量值:");
Kl=sc.nextInt();
System.out.println("请输入数量:");
num=sc.nextInt();
System.out.println("添加饮料成功!当前饮料售卖机的饮料种类为:"+(++goodsIndex)+"种");
gs[goodsIndex++] = new Goods(id,name,price,Kl,num);
break;
case 1:
System.out.println("请输入您需要查询的饮料编号:");
System.out.println("若无法查询到该编号,则自动返回主菜单");
Scanner er = new Scanner(System.in);
int id1 = er.nextInt();
int hi=0;
for (int o =0; o<goodsIndex; o++){
int hi1 = hi+1;
if (hi1==1){
if (gs[id1].getId() == o){
System.out.println("饮料编号:"+gs[o].getId() );
System.out.println("饮料名称:"+gs[o].getName() );
System.out.println("饮料价格:"+gs[o].getPrice() );
System.out.println("饮料热量:"+gs[o].getKl() );
System.out.println("饮料数量:"+gs[o].getNum() );
break;
}
}else {
DrinkMachine dx = new DrinkMachine();
dx.main(new String[]{});
}
}
case 0:
System.out.println("刷新成功");
DrinkMachine drinkMachine = new DrinkMachine();
drinkMachine.main(new String[]{});
default:
System.out.println("输入无效,自动返回主菜单");
DrinkMachine dt = new DrinkMachine();
dt.main(new String[]{});
}
}
}else{
if(j==2){
System.out.println("您的错误次数达到极限,请10分钟后再次尝试");
}
System.out.println("用户名或密码错误,您还有"+(2-j)+"次机会");
}
}
}
public void Menu5(){
System.out.println("=============欢迎进入用户管理系统==============");
System.out.println(" 1-手机信息登录");
System.out.println(" 2-会员注册");
System.out.println(" 3-会员查询");
System.out.println(" 0-返回主菜单");
System.out.println("==========================================");
}
}
3、Goods类:
package oneproject;
public class Goods {
/*
* 构造商品属性方法
*/
private int id;
private String name;
private int price;
private int Kl;
private int num;
public Goods(){}
public Goods(int id,String name,int price,int Kl,int num){
this.id=id;
this.name=name;
this.price=price;
this.Kl=Kl;
this.num=num;
}
public String toString(){
return id+"."+name+"("+price+"元)"+"\t"+"\t"+Kl+"焦"+"\t"+num+"瓶";
}
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getKl() {
return Kl;
}
public void setKl(int Kl) {
this.Kl = Kl;
}
public int getNum(){return num;}
public void setNum(int num){this.num=num;}
}
4、User类:
package oneproject;
import java.util.Scanner;
public class User {
/*
* 会员用户注册及登录
*/
private static final int person = 100;
private static Per[] pe = new Per[person];
private static int perIndex = 0;
static {
pe[perIndex++] = new Per(1, "雅塔莱斯", "女", "666");
pe[perIndex++] = new Per(2, "终极帝皇侠", "男", "4399");
}
public void newUser() {
Scanner c1 = new Scanner(System.in);
System.out.println("请输入手机号码登录:");
String userName = c1.nextLine();
System.out.println("请输入验证码:");
String password = c1.nextLine();
System.out.println("【正在验证中】");
for (int i = 0; i < 3; i++) {
Scanner us = new Scanner(System.in);
System.out.println("请再次输入您的手机号码:");
String u1 = us.nextLine();
System.out.println("请输入登录时使用的验证码:");
String u2 = us.nextLine();
if (u1.equals(userName) && u2.equals(password)) { // 验证用户名与密码是否正确
System.out.println("欢迎" + "\t" + "【" + userName + "】" + "\t" + "登录");
break;
} else {
if (i == 2) {
System.out.println("您的错误次数达到极限,请10分钟后再次尝试");
DrinkMachine we = new DrinkMachine();
we.main(new String[] {});
}
System.out.println("手机号或验证码与首次输入不一致,请重新输入...\n" + "您还有" + (2 - i) + "次机会");
}
}
}
public void register() {
System.out.println("注册您的专属会员编号");
System.out.println("【请从序号 3 开始填写】");
int number;
String call, femininitytest, personpw;
Scanner iu = new Scanner(System.in);
System.out.println("请输入编号:");
number = iu.nextInt();
System.out.println("请输入名称:");
call = iu.next();
System.out.println("请输入性别:");
femininitytest = iu.next();
System.out.println("请输入密码:");
personpw = iu.next();
System.out.println("注册成功!\n当前会员数量为" + (++perIndex));
pe[perIndex - 1] = new Per(number, call, femininitytest, personpw);
}
public void inquiry() {
System.out.println("请输入您需要查询的会员编号:");
System.out.println("若无法查询到该编号,则自动返回主菜单");
Scanner et = new Scanner(System.in);
int id2 = et.nextInt();
for (int i = 0; i < perIndex; i++) {
if (id2 == 1 | id2 == 2) {
System.out.println("会员编号:" + pe[id2 - 1].getNumber());
System.out.println("会员名称:" + pe[id2 - 1].getCall());
break;
} else if (pe[i].getNumber() == id2) {
System.out.println("会员编号:" + pe[id2 - 1].getNumber());
System.out.println("会员名称:" + pe[id2 - 1].getCall());
System.out.println(pe[id2 - 1].getFemininitytest());
System.out.printf("查询成功,自动返回上级菜单\n");
break;
}
}
return;
}
public void theUser() {
int c;
Menu pi = new Menu();
pi.Menu5();
Scanner cg = new Scanner(System.in);
c = cg.nextInt();
switch (c) {
case 1:
User yi = new User();
yi.newUser();
break;
case 2:
User yq = new User();
yq.register();
break;
case 3:
User qu = new User();
qu.inquiry();
DrinkMachine di = new DrinkMachine();
di.main(new String[] {});
break;
case 0:
DrinkMachine dt = new DrinkMachine();
dt.main(new String[] {});
default:
System.out.println("输入无效,自动返回主菜单");
DrinkMachine dz = new DrinkMachine();
dz.main(new String[] {});
}
}
}
5、MoneyCounter类:
package oneproject;
import java.util.*;
public class MoneyCounter {
/*
* 顾客结算机制
*/
public void Cal(int Price){
Scanner in = new Scanner(System.in);
System.out.println("投币口在下方,只支持人民币!");
int totalPay = in.nextInt();
if(totalPay == Price){
Equal();
}
else if(totalPay>Price){
More(Price,totalPay);
}
else{
for(int i=0;totalPay<Price;i++){ //当投入金额小于饮料价格,提示继续投币
Scanner input=new Scanner(System.in);
System.out.println("投入金额不足以支付本次交易,请继续投币");
int everyPay =input.nextInt();
totalPay += everyPay;
}
if(totalPay == Price){ //当再次投币出现投币金额等于价格时,调用Equal方法
Equal();
}
else{
More(Price,totalPay);
}
}
}
public void Equal(){ //当投入硬币与价格相同时
System.out.println("请在出口处取出饮料,找零为0元");
System.out.println("欢迎下次使用!");
}
public void More(int Price,int totalPay){
int backPay = totalPay-Price;
int fiveHp = backPay/50;
int fiveHRemain = backPay-fiveHp * 50;
int twoHp = fiveHRemain/20;
int twoHRemain = fiveHRemain-twoHp * 20;
int oneHp = twoHRemain/10;
int oneHRemain = twoHRemain-oneHp * 10;
int fiftyp = oneHRemain/5;
int fiftyRemain = oneHRemain-fiftyp*5;
int tenp = fiftyRemain;
System.out.println("请在出口处取饮料,找零为:"+backPay+"\n"+"分别为:");
System.out.println("50元:"+fiveHp+"张");
System.out.println("20元:"+twoHp+"张");
System.out.println("10元:"+oneHp+"张");
System.out.println("5元:"+fiftyp+"张");
System.out.println("1元:"+tenp+"张");
System.out.println("请在出口处取出饮料,欢迎下次使用!");
}
}
6、Per类:
package oneproject;
public class Per {
/*
构造会员类
*/
private String call;
private int number;
private String personpw;
private String femininitytest;
public Per(){}
public Per(int number,String call,String femininitytest,String personpw){
this.call=call;
this.number=number;
this.personpw=personpw;
this.femininitytest=femininitytest;
}
public String toString(){
return "会员号码:"+number+"\n"+"会员名称"+call+"\n"+femininitytest;
}
public int getNumber(){
return number;
}
public void setNumber(int number){
this.number = number;
}
public String getCall(){
return call;
}
public void setCall(String call) {
this.call = call;
}
public String getPersonpw() {
return personpw;
}
public void setPersonpw(String personpw) {
this.personpw = personpw;
}
public String getFemininitytest() {
return femininitytest;
}
public void setFemininitytest(String femininitytest) {
this.femininitytest = femininitytest;
}
}
四、运行结果展示
因为截图放太多反而不好看,所以这里就简单地说一下我和我滴小伙伴们造的作业都有哪些内容:
1.主菜单的可选选项,进入分支菜单(共3个分菜单,1个刷新返回主菜单);
2.直接购买商品菜单,附带了卡路里值的计算及一次购买多个同种商品的操作,最终结算支付金额、找零及卡路里预摄入总值;
3.进入会员菜单,拥有内容:手机号二次输入登录(三次判错机会)、注册会员、查询会员;(只有查询存在bug,只能查询注册的第10编号内的信息,其他编号都没办法查询到)
4. 进入管理员菜单,需要先输入默认用户名及密码(三次判错机会),拥有的功能:可以添加新品种商品信息、查询商品信息。(和上面一样,只能查询到新注册的3的编号内信息)
五、作业总结
呃,这次作业大部分代码块是我负责编写的,本文的构图由宝子哥绘制,调试内容是啊宇哥整的(虽然没放多少内容在这里)。我们的作业使用到了循环and判断的嵌套、一维数组的调用、构造方法及调用方法等,涉及到的都是比较基础的Java初步知识。其实还有很多可以改进的,局限于能力不足及时间管理,就......(没摆烂啊)
如果有哪天,谁谁谁也一样遇到了类似的模拟作业,突然搜到这里来了,本文的代码是完全可以拿去耍耍的,不过查询内容存在的bug......嘿嘿,你来改吧!!!
最后留张图来结尾吧。