0

因此,我正在尝试为我的 Java 课程编写一个简单的程序,并且我已经向老师寻求帮助,但是,这是一门远程学习课程,并没有从那个方向获得太多帮助。所以我在这里。

我们被要求解决的问题是创建一个程序,它将 (1) 向用户询问一个数字,(2) 找到所有用户定义的数字的总和,(3) 找到这些数字的平均值,(4)然后把它们放回给用户。

我不仅使用这些数字来排列我已经完成的事情,而且因为它们必须是单独的模块才能被调用。

我怎样才能让 userNum 变量在 while 语句期间更新。目前他们不是。或者有没有更简单的方法可以做到这一点,我忽略了。任何帮助是极大的赞赏。谢谢你。

public class P2 {

   public static void main(String[] args) {

        int userNumCount = 1;

        double userNum = input();
        double userSum = sum(userNum);
        double userAverage = average(userSum, userNumCount);

        sum(userNum);

        while (userNum != 0 && sum(userNum) <= 100){
            ++userNumCount;          
            output(userSum, userAverage);
            input();
            sum(userNum);
            average(userSum, userNumCount);
        }//end else
        while (userNum != 0 && sum(userNum) >=100){
            ++userNumCount;
            JOptionPane.showMessageDialog (null, "Warning, your sum is currently over 100!!!!!"); 
            output(sum(userNum), userAverage);
            input();
            sum(userNum);
            average(userSum, userNumCount);
    }//end else
        if (input() == 0){
            output(userSum, userAverage);
            JOptionPane.showMessageDialog (null, "Thank you for using this program have a nice day.");
    }//end else if


    }//end main module
    public static double input(){
        String userNumString;
        userNumString = JOptionPane.showInputDialog("Please enter your number or input 0 to end the program.");
        double userInput = Double.parseDouble (userNumString); 
        return userInput;
    }//end input module
    public static double sum(double userNum){  
        double userSum =+userNum;
        return userSum;
    }//end sum module
    public static double average (double userSum, int userNumCount){
        double userAverage = userSum/userNumCount;
        return userAverage;
    }//end average module
    public static void output (double userSum, double userAverage){
        JOptionPane.showMessageDialog (null, "The sum of the numbers input so far is: " + userSum + ". And the Average is " + userAverage + "." );
    }//end output module
}//end class
4

2 回答 2

2

从 main 中的方法返回的所有值都只是将它们的值返回为空。当您将变量传递给函数时,它们是按值传递的。例如:

public void main(String args[]){
    int f = 5;
    doSomething(f);
    System.out.println(f);
}
public int doSomething(int i){
    i+=1;
    return i;
}

返回的doSomething值为 6,但程序输出 5。当您调用函数时,将int i独立于 f 重新创建。到目前为止,您的程序只是丢弃这些值并保留旧值。

此外,您在 main 中有变量,称为userSum, 和userAverage,sum并且average您在不同的范围内重新定义这些变量。当代码流进入求和和平均时,它会为该方法创建新变量。如果您希望这些值相同,则需要将它们设为静态,方法是在您的 main 方法之外定义它们并将它们声明为静态。

我认为您可能遇到的问题是范围。几乎每次你有一个左括号时,程序都会改变范围。当一个块被关闭时(当有一个右括号时),变量的范围结束,即它们不再存在。例如:

class someClass 
{
    //Block 0
    static int staticNum = 0;
    public static main(String args[])
    {
        //Block 1
        int level1 = 0;
        if(true) 
        {
            //Block 2
            int level2 = 0;
        } else  {
            //Block 3
            level1++;      //ok because the level1 is accessible from here
            staticNum++;    //ok because staticNum is static
        }
        //resume block 1
        level2++; //not ok because level2 was in a different scope
        doSomething(level1)
    }
    public static void doSomething(int i){
        //Block 5
        int level1 = 0; //different than the one in the main method
        i++; //ok but once execution leaves i wont exist anymore
        staticNum++; //ok because staticNum is static and exists in the class's scope
        level1++; //not ok because level1 is not defined for this scope
    }
}

当执行在一个块中时,它可以访问嵌套级别“高于”它的块中的任何变量。综上所述,在块 2 和块 3 中,您可以访问块 1 或块 0 中的任何内容。块 3 无法访问块 2 中的变量,因为它们超出了彼此的范围,因为当块关闭所有在该块中实例化的变量被释放。块 5 的范围与块 1,2 和 3 完全不同。

块 0 是特殊的,因为它与类相关联。声明的方法体之外的任何内容static都是类范围的变量,因为您可以在任何可以访问该类的地方访问它。你会使用类似的东西ClassName.staticNum在另一个类中访问它。此外,当您在类内部访问它时,您使用静态值的任何方法也需要声明为静态的。

类主体中未声明为静态的任何内容都是实例变量。它与类的一个实例相关联,这些实例称为对象。一个类定义了一个对象的模板。例如,假设我们有两个计算机类型的对象。Computer 类定义了每台计算机具有哪些变量(实例变量),以及每台计算机共享哪些变量(静态变量)。因此,如果我有具有实例变量鼠标和键盘的计算机 A,它与另一台计算机 B 实例变量鼠标和键盘完全不同,但它们可以共享一个名为 Computer.innernette 的静态变量。

于 2013-01-31T01:01:10.363 回答
1

这是不正确的。

public static double sum(double userNum){  
    double userSum =+userNum;
    return userSum;
}

在基本的伪语言中,每次调用此方法时都会发生这种情况

receive userNum
create userSum
set userSum = 0
add userNum to userSum
give userSum

每次该方法将返回它给出的值,而不是我认为您期望的运行总数。

如果您声明了两个具有相同名称的变量,它们仍然是不同的。您想要做的是引用同一个变量,为此您需要在声明变量的范围内拥有引用。

获得运行总数

public class P2 {

    public static double userSum = 0; 
    //because this is a public member it's scope is global i.e. you can refer to it anywhere.

    ...
    public static void main(String[] args) {
    ... 
    /* do not declare userSum here.
       if you do any reference to userSum will use the local variable 
       not the global variable.
       double userSum = 0; <-- declare local variable it's scope is until the 
                               end of this method nothing outside the method 
                               can see it but you can pass it as a parameter
       userSum = 1; <-- local variable is set to 1
       P2.userSum = 2; <-- local variable is set to 1 global is set to 2
    */
       input();// for this the input method is called and returns a value,
               // but you haven't said to put it anywhere so java will throw it away
               // all that effort for nothing.

       userNum = input(); // in this case it will put the new value in userNum.
    }

    public static double sum(double userNum){  
        userSum =+userNum; // do not declare userSum use it from the class context
        return userSum;
    }

    ...

}

进一步参考范围

于 2013-01-31T01:00:55.687 回答