【问题标题】:Finding highest of 10找到最高的 10
【发布时间】:2013-09-22 09:52:49
【问题描述】:

老实说,我一直在执行一项任务,但我已经被卡住了。我正在创建一个简单的 Java 小程序,让用户输入 10 个数字。程序会清理该输入,确保只输入了一个数字,并且该数字必须介于 0 和 9 之间。

到目前为止没有问题。使用给定的示例,在网上搜索正确的语法和逻辑。我的代码编译没有抱怨。但是,一旦我尝试了我的第一个数字,只要它的输入有效,我的程序就会启动并告诉我刚刚输入的数字是最大的,并且不会等待输入 10 个数字。

我的猜测是我有半个applet程序,并且我输出不正确,或者我的循环中有什么错误,但逻辑似乎很好。

差点忘了提。我不知道如何在小程序中输出文本,任何帮助都会很棒,但这不是我主要关心的问题。

我当前的代码:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import javax.swing.JOptionPane;

public class largest extends Applet implements ActionListener{
private static final long serialVersionUID = 1L;


//Create components for Applet
Label numberLabel = new Label("Enter a number:");
TextField numberField = new TextField(10);  // Sets the size of the text field, You still may type as much data into the field that you want, input will need to be sanitized later

Label topNumberLabel = new Label("The top number is:");
Button calcButton = new Button("Ok");
public void init()
{
    // Add controls to the applet window
    add(numberLabel);
    add(numberField);
    add(topNumberLabel);
    add(calcButton);
    calcButton.addActionListener(this);
    setSize(300, 200);  // Sets the size of the applet window
}

public void actionPerformed(ActionEvent e) {
    // Variables for counting, user input, and storage for largest number
    double counter = 0;
    double number = 0;
    double largest = 0;

    // Allows user to input 10 times
    while (counter<10)
    {
        try { //Sanitize user input, make sure input entered is a number
            number = Double.parseDouble(numberField.getText());
        } catch (NumberFormatException ex) {
            numberField.requestFocus();
            JOptionPane.showMessageDialog(null, "Input invalid, please enter an integer",
                    "///-D-A-T-A---E-R-R-O-R-\\\\\\", JOptionPane.ERROR_MESSAGE);
            return;
        }
        if (number < 0 || number > 9) { //Sanitize user input, make sure the given number is between 0 and 9
            numberField.requestFocus();
            JOptionPane.showMessageDialog(null,
                    "The number entered must be between 0 and 9",
                    "///-D-A-T-A---E-R-R-O-R-\\\\\\", JOptionPane.ERROR_MESSAGE);
            return;
        }
        counter++;

    // Determine what the largest number entered is by comparing to a baseline
    // of previous numbers or zero if just beginning loop
    if (number > largest)largest=number;

    }

        // Display's the largest number that got entered by user
        JOptionPane.showMessageDialog(null," The largest number entered was " + largest);
    }

}

【问题讨论】:

  • 你只是把同一个数字读了 10 遍。单击该按钮时,您的 actionPerformed 方法将运行并循环 10 次读取相同的数字。我还建议您不要在 Applet 类中扩展 ActionListener - 这会破坏 OO。您应该使用匿名类。您也可能想阅读this。特别注意“没有人再使用 AWT”部分...
  • 您的问题是您的 while 循环在您的 actionPerformed 方法内。因此,您只需一遍又一遍地循环,只需要一个动作。当然,一旦你循环了 10 次,你的循环就会退出并显示它的结果。想想如何在没有循环的情况下做到这一点。
  • 我必须使用循环。任务的一部分。我最初的解决方案是使用一个数组来解决这个问题,然后循环遍历一个数组,但是把它扔掉了。
  • 1) 为什么要编写小程序?如果是由于规范。老师请发给Why CS teachers should stop teaching Java applets。 2) 为什么选择 AWT 而不是 Swing?请参阅Swing extras over AWT 上的此答案,因为有很多放弃使用 AWT 组件的充分理由。如果您需要支持较旧的基于 AWT 的 API,请参阅 Mixing Heavyweight and Lightweight Components
  • 我完全同意小程序过于复杂,但是我的教科书里塞满了这些东西。我们的作业并不总是专门为 applet 设计的,但如果我的示例是基于 applet 的,则无需编写太多其他代码。

标签: java loops applet logic highest


【解决方案1】:

您按预期循环了 10 次,但每次您只是使用 getText() 获取字段的值。这不会等待用户更改数字,因此所有 10 个数字都是相同的。您必须将counterlargest 定义为字段,并在每次调用actionPerformed 时更改。代码如下:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import javax.swing.JOptionPane;

public class largest extends Applet implements ActionListener{
    private static final long serialVersionUID = 1L;

    private int counter = 0; // These are the variables
    private double largest = 0; // from actionPerformed().

    // ...

    public void actionPerformed(ActionEvent e) {
        // Variable for user input
        double number = 0;

        try { //Sanitize user input, make sure input entered is a number
            number = Double.parseDouble(numberField.getText());
        } catch (NumberFormatException ex) {
            numberField.requestFocus();
            JOptionPane.showMessageDialog(null,
                    "Input invalid, please enter an integer",
                    "///-D-A-T-A---E-R-R-O-R-\\\\\\",
                    JOptionPane.ERROR_MESSAGE);
            return;
        }
        if (number < 0 || number > 9) { //Sanitize user input, make sure the given number is between 0 and 9
            numberField.requestFocus();
            JOptionPane.showMessageDialog(null,
                    "The number entered must be between 0 and 9",
                    "///-D-A-T-A---E-R-R-O-R-\\\\\\",
                    JOptionPane.ERROR_MESSAGE);
            return;
        }
        counter++;
        // Determine what the largest number entered is by comparing to a baseline
        // of previous numbers or zero if just beginning loop
        if (number > largest)largest=number;
        // Allows user to input 10 times
        if (counter==10)
        {
            // Display's the largest number that got entered by user
            JOptionPane.showMessageDialog(null,
                    "The largest number entered was " + largest);
        }
    }
}

【讨论】:

  • mm、double 和 int 转换错误。使我的变量加倍。您添加的代码使它告诉我我输入的第一个数字是最大的,然后让我无限输入数字。像你说的那样去制造柜台和最大的领域
  • @FustratedSyntax 好的,解决了这个问题,只需将largest 设置为double :) 但是,counter 仍应为int,消耗更少的内存并且没有舍入错误。
  • 好的。老实说,我对此很陌生,我如何制作最大和数字字段?您添加的代码不允许我继续添加数字:/
  • @FustratedSyntax 让字段将它们放在类中,但不要放在任何方法中(参见我的代码,它们在serialVersionUID 之后)。为了让它在第 10 个之后继续接受数字,并且每次在第 10 个之后显示最大的数字,只需将 if (counter==10) 替换为 if (counter&gt;=10)
  • 哦,好吧,我已经这样做了。但你的代码不起作用。我根本无法输入 10 个数字。只有一个,然后我得到你最大的数字是第一个,然后我可以无限输入。我不希望它继续接受数字,这实际上是我遇到的错误:C。它需要让我输入 10 然后告诉我最高,然后终止(添加终止代码会很容易)
【解决方案2】:

因为这条线

number = Double.parseDouble(numberField.getText());

在您在字段中输入数字后立即执行 10 次,在循环结束之前您将没有时间更改字段中的数字。

【讨论】:

  • 不完全正确。 ActionListener 附加到按钮上。
  • 是的,这是真的,后面是“number = Double.parseDouble(numberField.getText());”完成了 10 次。
猜你喜欢
  • 2021-11-10
  • 2013-12-11
  • 1970-01-01
  • 2021-07-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多