在要求用户输入新输入之前,Loop会执行所有操作,而不是仅仅根据需要进行重新分配

时间:2015-11-10 21:16:04

标签: java

我最近被分配了一个功课,用不同的语言编写代码,这是我在python中使用的唯一语言。我的代码应该做的是询问用户输入,然后首先将其设置为高,低并开始计算平均值。

public Form1()
    {
        InitializeComponent();

        int x = 100;
        int y = 0;

        // create 361 labels, set their dimensions
        for (int i = 0; i < 361; i++)
        {
            board[i] = new Label();
            board[i].Parent = pictureBox1;
            board[i].Location = new Point(x, y);
            board[i].Name = "label" + i;
            board[i].Width = 55;
            board[i].Height = 55;
            board[i].Text = "0";
            board[i].BackColor = Color.Black;
            board[i].BringToFront();

        }


        // set the position of the label
        foreach (Label i in board)
        {
            if (x >= 580)
            {
                x = 0;
                y = y + i.Height + 55;
            }

            i.Location = new Point(x, y);
            this.Controls.Add(i);
            x += i.Width;
        }

我现在遇到的问题是它遍历整个循环而不是重新分配用户输入。这可能与我的{}有关,但我不确定。

3 个答案:

答案 0 :(得分:0)

由于此代码中存在大量受损的编码约定和最佳实践,因此我将忽略其中大部分内容并专注于您的案例中重要的内容:

  1. 您的代码永远不会离开循环。这是因为您定义了static int User_input = 0;,然后在循环中定义了一个具有相同名称的变量,它隐藏了静态变量并存储了用户输入。但是,它是在while条件中检查的静态变量。
  2. 你不打印你应该去的地方。首先,你有else;基本上什么都不做,因为它包含一个空语句。然后你总是执行剩下的循环。
  3. 以下是“固定”代码:

    public class HGP1316 {
        static int Running_total = 0;
        static double Average = 0.0;
        static int User_input = 0;
        static double counter = 0.0 ;
        static int Highest_input = -1;
        static int Lowest_input = -1;
        public static void main(String[] args) {
            {
                System.out.println("This program will give you the highest, lowest, and average of the integers you \n"
                        + "enter. To end enter a negative number ");
            }
    
            Scanner user_input = new Scanner( System.in );
            while (User_input >= 0) {
                System.out.print("Please enter an integer: ");
                User_input = user_input.nextInt();
    
                if (User_input >= 0)
                {
                    Running_total = Running_total + User_input;
                    counter = counter + 1;
                    if (counter == 1)
                    {
                        Highest_input = User_input;
                        Lowest_input = User_input;
                    }
    
                    if (User_input > Highest_input)
                    {
                        Highest_input = User_input;
                    }
    
                    if (User_input < Lowest_input)
                    {
                        Lowest_input = User_input;
                    }
                } else {
                    Average = (Running_total / counter);
                    System.out.println ("The Highest value entered was : "+ Highest_input);
                    System.out.println ("The Lowest value entered was : " + Lowest_input);
                    System.out.println("The Average of enteries was : "+ Average);
                }
            }
            user_input.close();
        }
    }
    

答案 1 :(得分:0)

在Java中,您可以对局部变量和类变量使用相同的变量名。对于局部变量和字段也是如此。

你有一个局部变量

Integer User_input;

和一个类变量

static int User_input = 0;

在while条件中,您使用的是类变量,它始终为0。 您的示例中不需要类变量 - 仅使用局部变量。

轻松检查:您可以使用类名(HGP1316.User_input)预先添加类变量 - 代码将正确编译。

详细了解class variables

答案 2 :(得分:0)

您的代码存在一些问题。首先,您的变量名称非常相似,因此调试起来很困难。其次,您的变量User_input不应该是Integer对象的实例,它应该是int这样的原语:static int User_input = 0

第三,在while循环的每次迭代中重新创建扫描程序变量user_input。扫描仪应该在循环之前一次声明:

Scanner input_scanner = new Scanner(System.in);
while (...)
{
    // get user input
}

第四,进行while循环检查是User_input >= 0并且使用if语句检查同样的事情是多余的。相反,做......

Scanner input_scanner = new Scanner(System.in);
while (input_scanner.hasNext())
{
    System.out.print("Please enter an integer: ");
    User_input = input_scanner.nextInt();

    if (User_input >= 0)
    { 
        // hanlde input
    }
}

第五,即使计数器为零,检查后的if语句仍然使用,这是不必要的。要解决此问题,请使用else ifelse语句,如下所示:

if (counter == 1)
{
    Highest_input = User_input;
    Lowest_input = User_input; 
}
else if (User_input > Highest_input)
{
    Highest_input = User_input;
}
else if (User_input < Lowest_input)
{
    Lowest_input = User_input;
}

第六,当用户输入负数时,您需要最终摆脱循环,目前,您只是不在平均值计算中包含该数字,但您的while循环仍在运行! (还有一个语法错误:else;应该是else)。

else
{
    Average = (Running_total / counter);
    System.out.println ("The Highest value entered was : "+ Highest_input);
    System.out.println ("The Lowest value entered was : " + Lowest_input);
    System.out.println("The Average of enteries was : "+ Average);

    break;
}

第七,最后,您需要关闭扫描仪:input_scanner.close()

以上是您完成上述所有修复后的最终工作代码:

static int Running_total = 0;
static double Average = 0.0;
static int User_input = 0;
static double counter = 0.0 ;
static int Highest_input = -1;
static int Lowest_input = -1; 

public static void main(String[] args) {

    System.out.println("This program will give you the highest, lowest, and average of the integers you \n"
      + "enter. To end enter a negative number ");

    Scanner input_scanner = new Scanner( System.in );
    while (input_scanner.hasNext())
    {
        System.out.print("Please enter an integer: ");
        User_input = input_scanner.nextInt();
        if (User_input >= 0)
        {
            Running_total = Running_total + User_input;
            counter = counter + 1; 
            if (counter == 1)
            {
                Highest_input = User_input;
                Lowest_input = User_input;
            }
            else if (User_input > Highest_input)
            {
                Highest_input = User_input;
            }
            else if (User_input < Lowest_input)
            {
                Lowest_input = User_input;
            }
        }
        else
        {
            Average = (Running_total / counter);
            System.out.println ("The Highest value entered was : "+ Highest_input);
            System.out.println ("The Lowest value entered was : " + Lowest_input);
            System.out.println("The Average of enteries was : "+ Average);
            break;
        }
    }
    input_scanner.close();
}