0

问题是 :

水果店每天出售几种水果。编写一个程序,从用户那里读取几行输入。每行包括一个水果的名称、每公斤的价格(整数)、销售的公斤数(整数)。

该程序应计算并打印所有出售的水果和获得最大利润的水果的收入。

提示:-您可以假设用户将插入有效数据-用户可以通过输入单词“stop”作为水果名称来停止程序。

示例输入和输出:

在每一行中,插入水果的名称、每公斤的价格、销售的公斤数。要停止程序,请插入“停止”作为水果名称


香蕉 2 11 芒果 3 8 桃子 4 5

停止


售出的所有水果赚到的钱:66个获得最大利润的水果:芒果


我现在写的:

public static void main(String[] args) { 
// TODO code application logic here 
Scanner input = new Scanner (System.in); 
String fruitname= " "; 
String maxfruit = " "; 
int price = 0,number=0; 
int sum=0; 
int max=0; 


System.out.print("Fruit name, " + "price in killogram, number of killogram sold: "); 

while (!fruitname.equals("stop")) 
{ 
fruitname = input.next(); 
price = input.nextInt(); 
number = input.nextInt(); 
} 
if (fruitname.equals("stop")) 
{ 
sum = sum+(price*number); 

} 
if (max<(price*number)) 
{ 
max = price*number; 
maxfruit = fruitname; 
} 


System.out.println("the earned money of all fruits is " + sum); 
System.out.println("fruit that achieved the largest profit is "+ maxfruit); 
} 
} 

该程序没有阅读我提交给它的内容,不知道为什么并且没有给我总和和最大水果..我写的内容有什么问题?

4

5 回答 5

1

工作变体:

public class FruitTest {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);


    System.out.print("Fruit name, " + "price in killogram, number of killogram sold: ");

    String text = input.nextLine();

    String[] words = text.split(" ");

    List<Fruit> fruits = parseInput(words);

    int sum = getSum(fruits);

    String popular = getPopularFruitName(fruits);

    System.out.println("Got fruits: " + fruits.toString());
    System.out.println("the earned money of all fruits is " + sum);
    System.out.println("fruit that achieved the largest profit is " + popular);
}

private static String getPopularFruitName(List<Fruit> fruits) {
    int max = 0;
    String name = null;

    for (Fruit fruit : fruits) {
        int checkVal = fruit.getPrice() * fruit.getAmount();
        if(checkVal > max) {
            max  = checkVal;
            name = fruit.getName();
        }
    }

    return name;
}

private static int getSum(List<Fruit> fruits) {
    int result = 0;
    for (Fruit fruit : fruits) {
        result += fruit.getPrice() * fruit.getAmount();
    }
    return result;
}

private static List<Fruit> parseInput(String[] words) {
    List<Fruit> result = new ArrayList<Fruit>();
    int element = 1;
    final int name = 1;
    final int price = 2;
    final int amount = 3;

    Fruit fruit = null;
    for (String word : words) {
        if (word.equals("stop") || word.isEmpty()) {
            break;
        }
        if(element > amount)
            element = name;

        switch (element) {
            case name:
                fruit = new Fruit(word);
                result.add(fruit);
                break;
            case price:
                if (fruit != null) {
                    fruit.setPrice(Integer.valueOf(word));
                }
                break;
            case amount:
                if(fruit != null) {
                    fruit.setAmount(Integer.valueOf(word));
                }
                break;
        }
        element++;
    }

    return result;
}

static class Fruit {
    String name;
    int price  = 0;
    int amount = 0;


    Fruit(String name) {
        this.name = name;
    }

    String getName() {
        return name;
    }

    int getPrice() {
        return price;
    }

    void setPrice(int price) {
        this.price = price;
    }

    int getAmount() {
        return amount;
    }

    void setAmount(int amount) {
        this.amount = amount;
    }

    @Override
    public String toString() {
        return name + ". $" + price +
               ", amount=" + amount;
    }
}
}

代码注释 - 这是解析所有输入字符串并将其解析为存储所有数据(名称、价格和金额)的对象的正确方法。将所有解析的对象存储到数组或列表中,然后在循环解析的水果数组时计算最大和流行水果

于 2013-11-13T21:33:48.280 回答
1

如您所见,您的读取发生在while循环中:

while (!fruitname.equals("stop")) 
{ 
    fruitname = input.next(); 
    price = input.nextInt(); 
    number = input.nextInt(); 
} 

每次循环 - 它都会覆盖这些值。最后,当您阅读 stop 并退出循环时 - 您fruitname就是stop。因此,您需要修复您希望如何在输入中读取的逻辑

于 2013-11-13T21:15:06.537 回答
0
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class FruitSells {
    public static void main(String... args) {
        BufferedReader bufer = new BufferedReader(new InputStreamReader(System.in));
        try {
            String str;
            String[] inarr;
            int sumMoney = 0;
            do {
                str = (String) bufer.readLine();
                inarr = str.split(" ");
                for(int i = 1; i < inarr.length; i += 3) {
                    sumMoney += Integer.parseInt(inarr[i]) * Integer.parseInt(inarr[i + 1]);
                }
                System.out.println(sumMoney);
                sumMoney = 0;
            } while (!str.equals("stop"));


        } catch(IOException ex) {
            System.out.println("Problems with bufer.readLine()");
        }
    }
}

像这样的东西,您可以对其进行现代化改造。对不起,我不会说话))当然也可以正确书写))

于 2013-11-13T22:34:15.613 回答
0

我发现了一些错误。最重要的是在while条件下。看一下这个。

public static void main(String[] args) { 
    // TODO code application logic here 
    Scanner input = new Scanner (System.in); 
    String fruitname = null;
    String maxfruit = null;
    int fruitSum = 0;
    int totalSum = 0; 
    int max = 0; 

    System.out.print("Fruit name, " + "price in killogram, number of killogram sold: "); 


    while(!(fruitname = input.next()).equals("stop")){
        fruitSum = input.nextInt() * input.nextInt();
        totalSum += fruitSum;
        if(fruitSum > max){
            maxfruit = fruitname;
            max = fruitSum;
        }

    }

    System.out.println("the earned money of all fruits is " + totalSum); 
    System.out.println("fruit that achieved the largest profit is "+ maxfruit); 
} 
} 
于 2013-11-13T21:23:23.170 回答
0

哦,它正在阅读它。

问题是它没有做你想做的事。

我可以看到的代码问题是:

  • 您没有将水果数量或价格存储在任何地方,您需要将值存储在数组或其他东西(maxFruit,MaxValue)中以便稍后进行比较。
  • 当您读取水果值并输入“停止”字符串时,代码中的下一步是等待价格,这样即使您输入“停止”,它也不会退出循环,您需要重组您的扫描仪循环。

如果它是一个初学者课程,它可能没问题,但是你正在编写的代码不是面向对象的,不要在 main 中编写逻辑。

您可能想学习调试它是学习编码时非常有用的工具,如果您在调试模式下运行该程序,您会看到值正在获取输入以及正在发生的一切,Netbeans 和 Eclipse 非常好调试器,花半个小时学习调试的基础知识是值得的。当我开始的时候,它确实对我帮助很大。

于 2013-11-13T21:23:26.577 回答