Java 程序女巫应该计算收到的捐款金额 [已关闭]

Java programme witch should calculate the amount of donations received [closed]

提问人:Euler007 提问时间:11/7/2023 最后编辑:Scott HunterEuler007 更新时间:11/7/2023 访问量:72

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

16天前关闭。

我们假设第 1 部分中烤制的蛋糕和其他菜肴被分发给一群人,以换取自愿捐赠。该方案应计算收到的捐款金额,并根据生产成本计算捐款的产出,无论捐款是盈利还是亏损。必须输入蛋糕的生产成本。

首先,应输入烘焙产生的生产成本(= Kosten)(以十进制数表示)和捐赠人数(= Anzahl der Abnhemer)。然后输入每人的捐款金额(=Spendenanzhal)(以小数形式显示)。

一旦当前捐款金额至少与基于上次输入的捐款的费用一样高,就会显示一条消息(参见示例)。在此之后可能会有进一步的捐款。如果没有盈利(即成本超过捐款总额),该计划应在最后显示“亏损”。

确保格式与示例完全对应。

例:

? Costs: 5.20
? Number of customers: 5
? Donation: 2.50
? Donation: 0.80
? Donation: 2.00
--- Profit zone ---
? Donation: 0.50
? Donation: 1.00
Total donations: 6.8
Example:

? Cost: 4.80
? Number of recipients: 3
? Donation: 0.5
? Donation: 1
? Donation: 0.20
Total donations: 1.7
Loss

我目前的代码是:

package einfprog;

    public class Bsp02 {
        public static void main(String[] args) {
        // TODO: Implement.
       // Teil 2

        SavitchIn in = new SavitchIn();//Teil 2
        
        System.out.print("? Kosten: ");
        double kosten = in.readDouble();

        System.out.print("? Anzahl der Abnehmer: ");
        int anzahlAbnehmer = in.readInt();

        // Gesamtspenden und Anzahl der Spenden
        double gesamtspenden = in.readInt();
        int spendenAnzahl = in.readInt();

        boolean gewinnZoneErreicht = false;

        // Eingabe der Spenden pro Person
        while (true) {
            System.out.print("? Spende: ");
            double spende = in.readDouble();
            
            gesamtspenden += spende;

            if (!gewinnZoneErreicht && gesamtspenden >= kosten) {
                gewinnZoneErreicht = true;
                System.out.println("--- Gewinnzone ---");
            }
            // Wenn alle Personen gespendet haben
            if (spendenAnzahl == anzahlAbnehmer) {
                break;
            }

        }

        System.out.println("Gesamtspenden: " + gesamtspenden);

        // Prüfen, ob Gewinn oder Verlust erzielt wurde
        if (gesamtspenden >= kosten) {
            
        } else {
            System.out.println("Verlust");
        }
    }
}

该程序通过测试进行测试(我不知道它到底要求什么)。目前我得到一个输出错误,我认为这是由于while循环造成的。

donateNumber 为 0,始终保持 0。因此,if 语句 donateNumber == numberofpurchasers 的条件永远不会导致 true(如果 numberofpurchasers != 0) 可变数量的捐赠目前没有增加 - 但我可以为此添加一个(在 while 循环中)?spendenAnzahl++;

但是,如果没有另一个输出错误或超时,我无法让它工作 - 有人可以说明我如何解决这个问题吗?

非常感谢您的帮助!

java while-loop 输出

评论

0赞 Old Dog Programmer 11/7/2023
您需要设计您的程序以符合您收到的要求: 1 提示用户输入成本。2 让用户输入成本。3 提示用户输入捐赠者数量。4 让用户输入捐赠者的数量。5 启动一个循环,该循环将为每个捐赠者迭代一次(在步骤 4 中输入的数字)。每次迭代时,5.1 都会提示用户输入捐赠金额。5.2 让用户输入捐款金额。
0赞 Old Dog Programmer 11/7/2023
在提交或提交代码之前,请务必自行运行和测试代码。如果为您提供了示例,请在测试中使用这些示例。创建其他示例。检查结果是否符合预期,并符合要求。
0赞 Old Dog Programmer 11/7/2023
你有一个循环。为了防止程序出现“无限循环”,需要在循环中执行 a。循环中的唯一是条件的:。因此,循环将在且仅当为 true 时退出。但是,循环中的任何内容都不会改变这些值中的任何一个。因此,循环要么迭代一次,要么“永远”迭代。哪种情况取决于它们在循环开始之前是相等还是不相等。(忽略了循环的可能性。这里不适用。while (true)breakbreakif (spendenAnzahl == anzahlAbnehmer) { break; }(spendenAnzahl == anzahlAbnehmer)return
0赞 Euler007 11/7/2023
@OldDogProgrammer:谢谢 - 那么我已经在我的帖子中正确命名了这个问题 - 但我仍然不明白如何解决它。(spendenAnzahl == anzahlAbnehmer) 是否还必须根据示例给出?代码不是由我测试的,而是由存储一些测试用例的程序测试的。

答:

1赞 DevilsHnd - 退した 11/7/2023 #1

确保你所有的变量都与某事相关。我不是.由于您已经在循环块中添加了一个循环中断机制,因此使用while (true) {while

if (spendenAnzahl == anzahlAbnehmer) { break; }

为什么不使用这个概念作为循环的条件,而不仅仅是使用你已经在发挥作用并稍微表达的变量 不同,类似于:whiletrue

while (donationCount < numberOfCustomers) {

然后在循环块中,在一开始,有 .现在你可以摆脱它了.whiledonationCount++;if (spendenAnzahl == anzahlAbnehmer) { break; }

将其付诸实践将如下所示(请务必阅读代码中的注释):

// Open a Keyboard input stream:
Scanner in = new Scanner(System.in);

// Get the Target Cost from User:
System.out.print("Required Target Cost? -> $");
double cost = in.nextDouble();

// Get the number of Customers that will be donating:
System.out.print("Number of Customers?  -> ");
int numberOfCustomers = in.nextInt();

// Total donations and number of donations
double totalDonated = 0.0d;         // Will hold the total sum of donations acquired.
int donationCount = 0;              // Counter for number of donations processed.
boolean profitZoneReached = false;  // Flag to indicate when in a donations profit state.

/* Enter donations per person. Iterate through 
   each Customer that will be donating.     */
while (donationCount < numberOfCustomers) {
    donationCount++;
    System.out.print("Customer Donation #" + (donationCount) + "? -> $");
    double donation = in.nextDouble();
    totalDonated += donation;  // Add the current donation to `totalDonated`:

    /* If the profitZoneReached flag is false and the 
       total donated amount has surpassed or equals the 
       Cost then set the profitZoneReached flag to true
       and display "--- Profit Zone ---".  */
    if (!profitZoneReached && totalDonated >= cost) {
        profitZoneReached = true;
        System.out.println("--- Profit Zone ---");
    }
}

// Indicate the sum of donations formatted to two decimal places):
System.out.println("Total donations:      -> $" + String.format("%.02f", totalDonated));

/* Check whether Target, Profit, or Loss was achieved:
   All displayed values are formatted to two decimal 
   places.        */
if (totalDonated == cost) {
    System.out.println("On Cost Target of     -> $" + String.format("%.02f", cost) + " :)");
}
else if (totalDonated > cost) {
    System.out.println("At a Profit of        -> $" + 
            String.format("%.02f", (totalDonated - cost)) + " :D");
}
else {
    System.out.println("At a Loss of          -> $" + String.format("%.02f", (cost - totalDonated)) + " :(");
}

评论

0赞 Euler007 11/7/2023
@DevilsHand:非常感谢你对我的错误的事实解释——我能够:)解决问题。