我的循环有什么问题?

问题描述:

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个)。

当我尝试循环它做三个数字,这是上述代码我得到的错误“线程中的异常”主要“java.lang.ArrayIndexOutOfBoundsException:100”在线说,“sum = sum + List [ v];

其中,我相当肯定意味着List [v]中的v是一个大于List [v]中列出的值的数字(它试图获得只有数组的第101个值100个值)。

问题是我不知道为什么会这样,因为“v”应重新设置为0,在此之前循环试图再次运行。

+0

我建议,如果不是调试,那么更多的变量中的至少印刷值。这将有希望使得它更快地清除正在缠绕的东西。例如,我不认为有人会计算List数组的大小,这很乏味。并用较小的方法分割代码。 – rtybase

+0

你能解释一下你的'MovingAvgArray'会持有多少?也许使用一个小例子数据?在数组 “列表” 号码 –

+0

列表= 1, 2, 3, 4, 5, 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 – Origomar

我有一个llowed自己额外的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控制< 100 - ( x + 1))

结束。 一个仍99,X增加1,使一个+ X + 2 = 102

+1

谢谢你,我相信我解决了它与你所谈论的问题。我将这些值更改为0并将其更改为while循环。林不是100%确定,如果它的工作正常,因为程序仍然运行,我不得不重新检查数字,但它完成编译,所以我假设它不会经历一个无限循环。 – Origomar

+0

太好了,我建议你写几个单元测试,来测试这个类。如果您决定稍后改进代码,它也将帮助您避免增加回归问题。 – rtybase