【问题标题】:What is wrong with my looping?我的循环有什么问题?
【发布时间】:2017-06-21 20:14:20
【问题描述】:
public class Prices {

    public static void main(String[] args) {
    int i = 100; 
    int z = 0;
    int x = 0;
    int a = 0;
    int v = 0;
    double sum = 0;
    double[][] MovingAvgArray = new double[i][i];
    double[] List = {20.19, 21.67, 22.49,   22.26,23.99, 23.75, 23.34, 23.54, 23.25, 23.9, 23.84, 23.19, 22.03, 22.7,   21.14, 22.54, 24.36, 24.85, 23.96, 25.1,    20.79, 19.96, 19.98,    19.54, 19.09, 18.47, 18.59, 18.96, 18.93, 18.79, 19.06, 19.82, 19.5, 19.13, 19.25, 18.9,    19.05,  19.02,  19.09,  18.73,  18.44,  18.65,  18.07,  18.12,  17.92,  18.21,  17.81,  18.57,  18.92,  18.4,   17.83,  17.83,  18.55,  18.25,  18.55,  17.72,  17.28,  17.37,  16.99,  16.28,  17.02,  15.68,  15.73,  16.45,  15.54,  15.15,  15.51,  15.51,  15.54,  15.05,  14.98,  15.88,  16.14,  16.2,   16, 16.82,  17.74,  18.01,  17.99,  18.01,  16.99,  18, 18.3,   19.02,  18.14,  18.95,  19.19,  18.67,  17.63,  17.6,   17.56,  18.59,  18.57,  19.07,  19.57,  19.59,  18.71,  18.71,  18.75,  19.37};


      do{  

         do{

            for(;v < a + x +2;) 
            {
               sum = sum + List[v];  
               v++;               
            }

            MovingAvgArray[x][z] = sum;
            MovingAvgArray[x][z] = (MovingAvgArray[x][z])/(x + 2.0);

            System.out.println(MovingAvgArray[x][z]);
            z++;
            a++;
            sum = 0;
            v--;  

         }while(z<100-(x+1));
         v = 0;
         z=0;
         x++;
         }while(x<i-2);
    }
}

该程序的目标是获取数据列表的移动平均值(在 for 循环中计算),从前两个数字的移动平均值开始,然后是前三个,等等。并将其插入到 MovingAvgArray。两个数字的移动平均值将在数组值 [0][0 到 (i-3)] 上,三个数字的平均值将在值 [0][0 到 (i-4)] 上,等等。直到这不再可能。

如果我取出最外面的 do-while 循环,程序运行不会出错,但只计算两个数字的移动平均值(将有 98 个)。

当我尝试循环执行三个数字(即上述代码)时,我在“sum=sum+List[v ];

我很确定这意味着 List[v] 中的 v 是一个大于 List[v] 中列出的值的数字。 (它试图在只有 100 个值的数组中获取第 101 个值)。

问题是我不知道为什么会这样,因为在这个循环再次尝试运行之前,“v”应该被设置回 0。

【问题讨论】:

  • 我建议,如果不调试,那么至少打印更多变量的值。希望这将有助于更快地弄清楚到底发生了什么。例如,我认为没有人会计算 List 数组的大小,这很乏味。并将代码拆分为更小的方法。
  • 您能多解释一下您的MovingAvgArray 将持有什么吗?也许使用一个小的示例数据?
  • 数组中的数字列表 "List"= 1, 2, 3, 4, 5, 6 MovingAvgArray 将保存 (1+2)/2, (2+ 3)/2, (3+4)/2, (4+5)/2, (5+6)/2 数组的第二列将保存 - (1+2+3)/3,。 (2+3+4)/3, (3+4+5)/3, (4+5+6)/3 第三列将保持 - (1+2+3+4)/4, (2+3 +4+5)/4, (3+4+5+6)/4

标签: java loops nested-loops


【解决方案1】:

我允许自己在代码中添加额外的 println,比如

            v--;
            System.out.println(" ------------------ v=" + v);
            System.out.println(" ------------------ z=" + z);
            System.out.println(" ------------------ x=" + x);
            System.out.println(" ------------------ a=" + a);

        } while (z < 100 - (x + 1));
        System.out.println(" HERE ");
        v = 0;

只是为了观察:

19.060000000000002
 ------------------ v=99
 ------------------ z=99
 ------------------ x=0
 ------------------ a=99
  HERE 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
    at Prices.main(Prices.java:24)

这意味着由

控制的循环

而 (z

结束。 a还是99,x加1,使得a + x + 2=102

【讨论】:

  • 谢谢您,我相信我解决了与您所说的内容有关的问题。我将这些值更改为 0 并将其更改为 while 循环。我不能 100% 确定它是否正常工作,因为程序仍在运行,我必须重新检查数字,但它完成了编译,所以我假设它没有经历无限循环。
  • 太好了,我建议编写一些单元测试来测试类。如果您决定稍后改进代码,它还将帮助您避免添加回归问题。
猜你喜欢
  • 2011-04-23
  • 2016-04-26
  • 1970-01-01
  • 2017-10-02
  • 2011-03-10
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多