如何从命令行计算平均值?家庭作业excercize

时间:2016-11-13 02:31:13

标签: java

我必须制作一个程序来计算命令行中插入的某些数字的平均值,模态值和中位数。数字必须在[1,10]范围内我无法理解为什么它会停止。我哪里错了?这是代码:

import java.lang.Integer;
import java.util.Arrays; 

class Stat{
    public static void main(String[] args){


        int i,median,modalValue = 0;
        float average, sum = 0;
        int repetition[] = new int[args.length];
        Integer allNumbers[] = new Integer[args.length];


        //check numbers range
            try{

                //reading args from command line
                for( i = 0; i < args.length; i++){
                    //if not in range --> exception
                    if(Integer.parseInt(args[i]) < 1 || Integer.parseInt(args[i]) > 10)
                        throw new Exception("Exception: insert number out of range. Restart the programm.");

                //put numbers in an array
                allNumbers[i] = new Integer(args[i]);
                }

                //sorting the array
                Arrays.sort(allNumbers);

                //calculate average
                for( i = 0; i < allNumbers length; i++ ){
                    sum += allNumbers[i];
                }
                average = sum / (i + 1) ;
                System.out.println("Average: " + average);

                //calcolate modal value (most frequent number)
                for( i = 0; i < repetition.length; i++){        //counting numbers occurrences
                    repetition[allNumbers[i]]++;
                }

                for( i = 1; i < repetition.length; i++){        //checking which number occurrences the most
                    if(repetition[i] >= repetition[i-1])
                        modalValue = repetition[i];
                }

                System.out.println("Modal Value: " + modalValue);


                //calculating median value
                if((allNumbers.length) % 2 == 0){       //even
                    median = allNumbers.length/2;,
                }else{                                  //odd
                    median = (allNumbers.length/2) + 1; 
                }
                System.out.println("Median: " + allNumbers[median]);


            }catch(Exception e) {                   //out of range
                System.out.println(e.getMessage());
            }




    }

}

1 个答案:

答案 0 :(得分:1)

第一步

如果删除try / catch,您将获得有关错误的更多信息。通过捕获异常并打印出它的消息,你错过了它的堆栈跟踪,这将告诉你错误发生在哪一行。

首先,删除try / catch,并允许main方法通过将其声明更改为:public static void main(String[] args) throws Exception {来抛出异常。再次编译并运行它,以允许异常使程序崩溃。

抛出什么类型的异常?它说的是什么行号?

第二步

接下来,让我们看看一些有助于计算模态值的代码:

int repetition[] = new int[args.length];

for (i = 0; i < repetition.length; i++) {
    repetition[allNumbers[i]]++;
}

第一行将创建一个数组,其元素数与命令行中提供的数字相同。例如,如果您提供数字5 8 9,即三个数字,那么数组将包含三个元素。数组索引从零开始,因此索引将为0,1和2。

for循环将取第一个数字allNumbers[0],在我的示例中为5,并在索引5处增加数组中的值。这会导致异常,因为数组没有索引5.这将是&#34;在边界之外&#34;数组。

这里的问题是如何创建repetition数组。仅使用三个元素创建它是不够的。你需要考虑如何创建它,以便它能够处理你给出的[1,10]范围内的任何数字。