2016-11-13 9 views
0

私は、コマンドラインでいくつかの数字の平均、モーダル値と中央値を計算するプログラムを作る必要があります。数字は範囲内になければなりません[1,10]なぜそれが止まるのか理解できません。どこが間違っていますか?あなたがそのtry/catchを削除する場合は、エラーに関する詳細情報を入手しますコマンドラインから平均を計算するには?宿題excercize

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

'for(i = 0; i nakano531

+0

平均forループにドットを忘れてしまったようです:_for(i = 0; i Gulllie

答えて

1

まずステップ

:これはコードです。例外をキャッチしてそのメッセージだけを出力すると、スタックトレースのが欠落しているため、エラーが発生した行が正確に示されます。

まず、try/catchを削除し、メインメソッドで宣言を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を入力すると、それは3つの数字なので、配列には3つの要素があります。配列のインデックスはゼロから始まり、そうインデックスはその後、私の例では5ある最初の番号、allNumbers[0]を取るインデックス5で配列の値をインクリメントする0、1、2

forループであろう。これは、配列にインデックス5がないために例外が発生します。これは配列の「境界外」になります。

ここでの問題は、repetitionアレイの作成方法です。 3つの要素で作成するだけでは不十分です。あなたはあなたが与えられた[1,10]の範囲の任意の数を扱うことができるようにそれを作成する方法について考える必要があります。