为什么我的代码提供错误输出?

时间:2013-12-11 19:33:17

标签: java

我正在尝试编写一个程序来模仿我的CS类自动售货机的操作。我有一个双阵列股票,代表特定“槽”的项目数量[我的自动售货机很奇怪,有点像一个长的自动售货机有1列不同的项目]。到目前为止,这是我的代码:

 public class VendingMachine
{
    // define fields here
    public static double itemPrice[];
    public static String[] itemName; 
    public static int stock[][];
    public static  int maxPerSlot;
    public static double cashAmmount;

    public VendingMachine(int numslots, int maxperslot, double cash)
    {   
        final  int numSlots = numslots;
        maxPerSlot = maxperslot;
        cashAmmount = cash;
        stock = new int[numSlots][1];

        itemPrice = new double[numSlots];
        itemName = new String[numSlots];

        // complete this method
    }

    public void setProduct(int slot, String product, double price)
    {   int Slot = slot;
        itemPrice[Slot] = price; 
        itemName[Slot] = product;
        stock[Slot][0] = 0; 

        //
    }

    public void restockProduct(String product, int quantity)
    {   
        String Product = product;
        int Quantity = quantity;

        for(int i = 0; i < itemName.length;i++){
            if (Quantity > (maxPerSlot-stock[i][0])){
            return;
            }
            if (Product.equals(itemName[i])&&Quantity < maxPerSlot){
                    stock[i][0] += Quantity;


            }else if ((maxPerSlot-stock[i][0])==0){

                continue;

            }
        }

        //Put # of products in slot that holds it and if that slot is full put the rest in the next 
        //available slot that holds that product, if all full return error.
    }

    public double getCashOnHand()
    {
        return cashAmmount; // replace this line with your code
    }

    public int getQuantity(int slot)
    {
        return stock[slot][0]; // replace this line with your code
    }

    public int getQuantity(String product)
    {   int total = 0;

        for (int i = 0; i<itemName.length;i++){
            if (product == itemName[i]){
                total += this.getQuantity(i);
            }
        }
        return total;
    }

    public boolean buyItem(int slot)
    {   int snum = slot;
        double price = 0;
        if (stock[snum][0] != 0){
            stock[snum][0]--;
        price= itemPrice[snum];
        cashAmmount += price;
        return true;
        } else {
        return false;}
        // replace this line with your code
    }
}

以及运行它的主要方法:

public class vmd
{
    public static void main(String[] args)
    {
        boolean success;

        // vending machine w/ 20 slots, 10 items maximum per slot, $5 cash on hand
        VendingMachine v = new VendingMachine(20, 10, 5.00);
        v.setProduct(0, "Cheesy Poofs", 0.75);
        v.setProduct(1, "Red Bull", 1.25);
        v.setProduct(2, "Cheesy Poofs", 0.75);
        v.restockProduct("Cheesy Poofs", 8);
        v.restockProduct("Red Bull", 7);
        v.restockProduct("Cheesy Poofs", 5); // 2 more go into slot 0, remaining 3 into slot 2

        success = v.buyItem(0);
        System.out.println(success); // should print "true"

        System.out.println(v.getCashOnHand()); // should print "5.75"

        System.out.println(v.getQuantity(2));// should print "9"    
        System.out.println(v.getQuantity("Cheesy Poofs")); // should print "12"
    }
}

当我运行这个想法时,我一直得到:

true
5.75
8
15 
当我想要得到时,我的出局是:

true
5.75
9
12

作为我的输出。为什么是这样?我假设它与restockProduct()方法有关,但我似乎无法缩小它,它真的让我紧张。根据我的CS老师的说法,restockProduct()方法假设将给定数量的指定产品添加到自动售货机并将尽可能多的项目放入指定用于保存该特定产品类型的第一个插槽中(使用setProduct())。

如果并非所有物品都适合第一个插槽,请将尽可能多的物品放入容纳该类产品的第二个插槽等。对于部分信用,您的方法至少应该能够找到为指定产品指定的第一个插槽,并将所有项目放在那里“。

3 个答案:

答案 0 :(得分:1)

你是对的,restockProducts没有做你想要的。这就是你拥有的:

public void restockProduct(String product, int quantity)
{   
    String Product = product;
    int Quantity = quantity;

    for(int i = 0; i < itemName.length;i++){
        if (Quantity > (maxPerSlot-stock[i][0])){
        return;
        }
        if (Product.equals(itemName[i])&&Quantity < maxPerSlot){
                stock[i][0] += Quantity;


        }else if ((maxPerSlot-stock[i][0])==0){

            continue;

        }
    }

所以当你第一次重新进货"Cheesy Poofs"时,会发生以下情况:

  1. 在循环0上,你是Cheesy Poofs,所以你放了8个项目。
  2. 在循环1上,你的类型错误,所以没有任何内容
  3. 在第2循环中,你有Cheesy Poofs,所以你把8放在那里。
  4. 不知何故,你需要记住你在第一个插槽中放了8个。此外,你需要有一个机制将一些放入一个插槽,一些放入另一个插槽,现在我不认为你的代码可以实现。

答案 1 :(得分:0)

你的问题在这里:

for(int i = 0; i < itemName.length;i++){
    if (Quantity > (maxPerSlot-stock[i][0])){
        return;
}

你第一次要求补货“Cheesy Poofs”

v.restockProduct("Cheesy Poofs", 8);

将8个项目放入机器。

你第二次打电话给补货俗气:

v.restockProduct("Cheesy Poofs", 5);

无法做任何事情。您的if语句表示如果数量(5)大于maxPerSlot - current stock(10 - 8)或仅为2,则返回。

5大于2,因此方法结束,并且没有任何内容添加到您的计算机上。

此外,您需要在其中放置某种控件,以便在将所有8个项目添加到计算机后突破循环。当你站起来时,你会在两个不同的插槽中添加8个俗气的噗声。一旦你将8添加到第一个Cheesy Poof行,你应该从剩下的库存中删除8个。

我冒昧地重建了这个方法,这就是我认为你想要实现的目标:

public void restockProduct(String product, int quantity)
{   
    String Product = product;
    int Quantity = quantity;

    for(int i = 0; i < itemName.length;i++){

        if (Product.equals(itemName[i])){

            if (Quantity > (maxPerSlot-stock[i][0])){
                Quantity -= maxPerSlot-stock[i][0];
                stock[i][0] += maxPerSlot-stock[i][0];

            }
            if (Quantity <= (maxPerSlot-stock[i][0])){
                stock[i][0] += Quantity;
                return;
            }
        }
    }
}

答案 2 :(得分:0)

你在其他人描述的restockProduct中有几个问题,无论如何你可以将restockProduct函数改为这个:

public void restockProduct(final String product, int quantity)
{
    for (int i = 0; i < itemName.length; i++)
    {
        if ( (product.equals(itemName[i]) || "".equals(product) ) && (maxPerSlot - stock[i][0]) > 0)
        {
            stock[i][0] += quantity;
            if (stock[i][0] > maxPerSlot)
            {
                quantity = stock[i][0] - maxPerSlot;
                stock[i][0] = maxPerSlot;
            }
            else
                return;
        }
    }

    if (quantity > 0)
        throw new IllegalArgumentException("Cannot stock product");
}

注意:我们要么将产品插入产品已经存在的插槽中,也就是根本没有产品 注2:插入后我们正在检查是否有任何休息,我们应该进一步插入或一切都在这里