《Java程序小作业之自动贩卖机》#谭子

第一次写博客有点小小紧张哈,刚入门Java这门语言没多久,博主现在还在打基础中。这里为大伙们分享一下程序课的模拟作业,大概内容也不是很多,图一乐看个热闹就好了,如果需要借鉴的话,当然可以把这里的源码拿去玩玩的。就是,我们最后还有部分Bug问题没解决,就,图一乐吧!

        开学第一周是实训周,我们这边给到的题目的是整一个自动贩卖机的模拟,给了五天的作业时间,2天就已经写好了大致内容了,后面又花了3天在补Bug,最后勉强把论文报告的字数凑满。下面是我们课题组整的活。

一、设计思路

        本作业设计了6个类,分别为:贩卖机运行类(DrinkMachine)、菜单编辑类(Menu)、处理会员类(User)、处理货币类(MoneyCounter)、商品类(Goods)、用户类(Per)。其中,商品类与用户类为构造属性方法,分别为处理货币类及处理会员类所调用;贩卖机运行类是测试类,负责主菜单与分支菜单的逻辑管理及运行;菜单编辑类是主要控制类,为贩卖机运行类的附属管理,主要负责所有菜单逻辑分支及调用区,方便管理文字;处理会员登录拥有手机短信登录方法、会员注册方法、查询会员信息方法,便于管理会员菜单;处理货币类中存在结算方法及找零的两种方法,应对支付所出现的客观现象。

具体类的关系图如下:

根据程序设计需求,设计方案的系统工作流程内容如下:

  1. 系统主菜单及内置数组属性的初始化;
  2. 系统将默认拥有9种可选饮料信息,2位初始内置会员信息,1位管理员用户信息(固定的);
  3. 使用者可根据已设计的主菜单进行分支菜单的选择,本方案主菜单设计包含4种输入分支菜单的事件管理,如:输入1进入直接购买饮料菜单选择、输入2进入会员登录菜单选择、输入3进入管理商品菜单选择、输入0或其他数字刷新主菜单。
  4. 若用户在主菜单输入1,则可以直接购买饮料,并且进行现金投币支付的交易流程,倘若支付的金额不能够达到购买价格,将继续进行投币操作,当投币达到价格直接结算并返回主菜单;当投币数超过价格,则进行找零操作,返还用户现金并结算返回主菜单。在结算的同时,我们还提供了热量值计算及一次性购买多个饮料的选择。
  5. 若用户在主菜单输入2,则会跳转入会员菜单界面,用户可以通过输入相对应的数值来选择:手机短信一键登录、会员注册、会员信息查询、返回主菜单。我们为会员们提供了购买结算打七折的优惠。
  6. 若用户在主菜单输入3,则进入到管理员登录页面,需要输入该机器默认管理员名及密码,将会有3次判定输入错误的执行。输入3次失败则返回主菜单;输入成功则转换为管理商品菜单,拥有查询商品信息,添加新品种商品的权限。
  7. 该程序会一直循环,大部分分支菜单可通过输入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......嘿嘿,你来改吧!!!

        最后留张图来结尾吧。

  • 24
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值