0

私のマークプログラムの平均を計算するために2番目の配列を実装する方法を見つけようとして、いくつかの困難があります。各生徒が各課題 (5 人の生徒、4 つの課題) で受け取ったスコアを格納するために、1 つの 2D 配列を使用しています。私は学生の平均配列を機能させることができましたが、個々の割り当てマークを計算するときは (5 人の学生の合計 /5 )。私は Indexoutofbounds 例外を取得し続けます。私は 2 次元配列に非常に慣れておらず、適切に読み取る方法をまだ見つけようとしています。私のコードは次のとおりです。

import java.util.Scanner;
public class Marks
{
private String[] names;
private int[][] assignments;
private double[] stuAvgArray;
private double[] assignAvgArray;
    public Marks()
    {
        names = new String[5];
        assignments = new int[5][4];
        stuAvgArray = new double[5];
        assignAvgArray = new double[4];
    }

public void getInput()
{
    Scanner input = new Scanner(System.in);
    System.out.println("Enter 5 student names: ");
    for(int i = 0; i < names.length; i++)
        names[i] = input.nextLine();

    for(int row = 0; row < assignments.length; row++)
    {
        System.out.println("Enter the 4 marks for: " + names[row]);
        for(int col = 0; col < assignments[row].length; col++)
        {
            assignments[row][col] = input.nextInt();
            stuAvgArray[row] += assignments[row][col];

        }
        stuAvgArray[row] = (stuAvgArray[row]/4);
    }
    for (int col = 0; col < assignments.length; col++)
    {
        for(int row = 0; row < assignments[col].length; row++)

assignAvgArray[行] += 割り当て[行][列];

        assignAvgArray[col] = (assignAvgArray[col]/5);
    }

}

public String toString()
{
    String output = ("Student \t\t\t Marks \t\t\t\t Average \n" +
                    "Name \t\t\t\t out of 10 \t\t\t out of 10 \n" +
                    "\t\t A1 \t A2 \t A3 \t A4");
            for(int i = 0; i < assignments.length; i++)
            {
                output = output + "\n" + names[i];
                for(int col = 0; col < assignments[i].length; col++)
                {
                    output = output + "\t " + assignments[i][col] + "\t ";
                }
                output = output + "\t\t" + stuAvgArray[i];
                output = output + "\n" + assignAvgArray[i];
            }

    return output;
}

}

Javaがエラーの原因を指摘している場所を太字にしました。配列スポット [[(0,0),(1,0),(2,0),(3,0),(4,0)],[ を読み込んで保存し、計算しようとしています。 (0,1),(1,1),(2,1),(3,1),(4,1)..など]]

私が尋ねようとしているのは、この例外を与えないループを作成し、各列のすべての値を別々の場所に保存し、新しい配列に保存された各数値を 5 で割って平均を得る方法です。

私の問題を理解していただくために他にできることがあれば、お知らせください。

PS: これは本来あるべき姿です。

Student     Marks               Average
Name        out of 10           out of 10
        A1  A2  A3  A4  
Joe Smith   8   9   10  4   7.75
Tommy Jones     9   9   8   5   7.50
Sara Lee    0   10  10  9   7.25
Bob Fowler  10  9   9   0   7.00
Jane Doe    10  10  10  10  10.00
**Average   7.40    9.40    9.40    5.60**

行の平均を計算しましたが、太字の列の平均が残念です

4

2 に答える 2

2

次の行は間違っています。

for(int row = 0; row < assignments[col].length; col++)

row代わりにインクリメントを使用していますcol。その結果、そのループのブロックで範囲外エラーが発生しています。

それを次のように置き換えます。

for(int row = 0; row < assignments[col].length; row++)

しかし、これだけの問題ではないと思います。入力の読み取り方によるとassignments、最初の次元の行番号と 2 番目の次元の列番号を持つ 2D 配列です。ただし、ここではディメンションを混合しています。コードは次のとおりです。

for (int col = 0; col < assignments.length; col++)
{
    for (int row = 0; row < assignments[col].length; row++) {
         assignAvgArray[row] += assignments[row][col];
    }

    assignAvgArray[col] = (assignAvgArray[col]/5);
}

ご覧のとおり、を使用colして識別していrowます。assignments.length行数です。

for (int col = 0; col < assignments[0].length; col++)
{
    for (int row = 0; row < assignments.length; row++) {
         assignAvgArray[row] += assignments[row][col];
    }

    assignAvgArray[col] = (assignAvgArray[col]/5);
}
于 2014-01-21T19:17:16.627 に答える