问答详情
源自:12-1 综合练习

鄙人愚钝,最后程序有一个BUG,就是会显示多辆相同车名,求大神指点。

父类Car
package com.imooc;

public abstract class Car {
    //定义全局变量,+m用于区分参数
    public String mName;
    public int mMoney;
    public int mPeopleNum;
    public int mThingNum;
    //定义抽象方法用于创建租车类型与价目表
    public abstract void show();
}


子类——载人车类
package com.imooc;

public class People extends Car {
    // 定义构造方法,用于保存传递进来的name,money,peopleNum;
    public People(String name, int money, int peopleNum) {
        this.mName = name;// 将传递进来的name参数保存在当前对象中的mName属性中,nName是继承父类Car所得到的,下同
        this.mMoney = money;
        this.mPeopleNum = peopleNum;
    }

    public void show() {
        // TODO Auto-generated method stub
        System.out.println(mName + "\t\t" + mMoney + "天/元\t\t" + mPeopleNum
                + "人");// "\t"为制表符,为了让格式更好看
    }

}


子类——载物车类
package com.imooc;

public class Thing extends Car {

    public Thing(String name, int money, int thingNum) {
        this.mName = name;// 将传递进来的name参数保存在当前对象中的mName属性中,nName是继承父类Car所得到的,下同
        this.mMoney = money;
        this.mThingNum = thingNum;
    }

    public void show() {
        // TODO Auto-generated method stub
        System.out.println(mName + "\t\t" + mMoney + "天/元\t\t" + mThingNum
                + "吨");// "\t"为制表符,为了让格式更好看
    }

}


子类——皮卡类
package com.imooc;

public class PeopleAndThing extends Car {

    public PeopleAndThing(String name, int money, int peopleNum, int thingNum) {
        this.mName = name;// 将传递进来的name参数保存在当前对象中的mName属性中,nName是继承父类Car所得到的,下同
        this.mMoney = money;
        this.mPeopleNum = peopleNum;
        this.mThingNum = thingNum;
    }

    public void show() {
        // TODO Auto-generated method stub
        System.out.println(mName + "\t\t" + mMoney + "天/元\t\t" + mPeopleNum
                + "人," + mThingNum + "吨");// "\t"为制表符,为了让格式更好看
    }

}


函数主入口
package com.imooc;

import java.util.Scanner;//导入工具类Scanner用于输入数据

public class Main {

    public static void main(String[] args) {
        Car[] cars = { new People("奥迪A4", 500, 4), new People("马自达", 400, 4),
                new PeopleAndThing("皮卡雪6", 450, 4, 2),
                new People("金龙", 800, 20), new Thing("松花江", 400, 4),
                new Thing("依维柯", 1000, 20) };// 用多态的方式初始化对象,并将对象保存在数组cars里
                                                // new+构造方法(参数) = 对象
        System.out.println("欢迎使用答答租车系统!您是否要租车:");
        System.out.println("Y 是/ N 否");
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象
                                                    // ,并将地址传给引用类型变量scanner
        String input = scanner.next(); // 将输入的值传给新定义的String类型的input
        /**
         * 判断输入的值,如果是其他数则一直循环,是Y跳出循环,输入N结束程序
         */
        while (true) {
            if (input.equals("Y") || input.equals("y")) {
                System.out.println("序号\t\t汽车名称\t\t租金\t\t容量");
                for (int i = 0; i < cars.length; i++) {// 通过遍历cars数组来访问对象
                    System.out.print(i + 1 + "\t\t");// 创建序号,注意用print而不是println
                    cars[i].show();// 调用各个对象的show()方法以显示菜单
                }
                break;
            } else if (input.equals("N") || input.equals("n")) {
                System.out.println("欢迎下次光临!");
                System.exit(0);
            } else {
                System.out.println("输入有误,请重新输入");
                input = scanner.next();// 重新将输入的值赋给input
            }
        }
        System.out.println("请输入租车的数量:");
        int nums = scanner.nextInt();// 定义nums保存车辆数量
        int sumPeople = 0;
        int sumThing = 0;
        int sumMoney = 0;//一天的总金额
        int sp = 0;// 可载人车的数量
        int st = 0;// 可载物车的数量
        String[] choicePeopleCarName = new String[nums];// 可载人车的名字数组
        String[] choiceThingCarName = new String[nums];// 可载物车的名字数组
        Car[] choiceCars = new Car[nums];// 定义初始化数组用于保存被选中的车辆对象
        for (int i = 0; i < nums; i++) {
            System.out.println("请输入车辆序号:");
            int num = scanner.nextInt();// 定义num保存车辆序号
            /**
             * 判断车辆序号的正确性,如果有误,则使这次循环无效
             */
            if(num > 6 || num <= 0){
                System.out.println("输入有误,请输入正确的车辆序号!");
                num = scanner.nextInt();
                i--;
                continue;
            }
            choiceCars[i] = cars[num - 1];// num-1是因为序号没有0,而数组有
            if (choiceCars[i] instanceof People
                    || choiceCars[i] instanceof PeopleAndThing) {
                choicePeopleCarName[sp] = choiceCars[i].mName;
                sp++;
                sumPeople += choiceCars[i].mPeopleNum;
            }
            if (choiceCars[i] instanceof Thing
                    || choiceCars[i] instanceof PeopleAndThing) {
                choiceThingCarName[st] = choiceCars[i].mName;
                st++;
                sumThing += choiceCars[i].mThingNum;
            }
            sumMoney += choiceCars[i].mMoney;
        }
        System.out.println("请输入租车天数:");
        int days = scanner.nextInt();
        scanner.close();// 关闭输入流
        System.out.println(">>>>>>>>>>>>>>>>>账单<<<<<<<<<<<<<<<<<<");
        System.out.println("您所租车的总数量为:" + nums);
        System.out.println("您所租的总天数为:" + days);
        System.out.println("可载人车辆为:");
        for (int i = 0; i < sp; i++) {
            System.out.print(choicePeopleCarName[i] + " ");
        }
        System.out.println("可载人数为:" + sumPeople);
        System.out.println("可载物车辆为:");
        for (int i = 0; i < st; i++) {
            System.out.print(choiceThingCarName[i] + " ");
        }
        System.out.println("可载物数为:" + sumThing);
        System.out.println("总金额为:" + (sumMoney * days));
    }

}


提问者:Ninja_z 2016-05-15 21:51

个回答

  • Castle__
    2016-05-16 17:00:45
    已采纳

    String[] choicePeopleCarName = new String[nums];// 可载人车的名字数组

    String[] choiceThingCarName = new String[nums];// 可载物车的名字数组

    你的这两个数组,存车辆名字的时候是遍历选中的车辆,每个名字都存进去,输出的时候也是将的存进去的所有名字按序输出一遍

    所以当你选了2辆相同的车子,名字就重复了。

  • 丿Tomorrow
    2016-05-16 14:13:40

    不好意思,没看出来,多调试几遍程序吧