0

これは、ユーザーの帰属評点を取得し、その平均、偏差を見つけて、この情報を表形式で表示するためのコードです。私のプログラムはユーザー入力を受け取り、情報を適切に表示しますが、平均と偏差を正しく計算しません。実行すると、平均が 0 と表示されます。先生が教えてくれたのと同じように実行していますが、エラーが見つかりません。

import java.util.Scanner;

public class ClassScores{
public static void main(String[] args){
String[] names = {"Bashful","Doc","Dopey","Grumpy","Happy","Sleepy","Sneezy"};
double[] grades = new double[7];
double mean=0;
double[] difference = new double[7];

getScores(grades);
average(grades, mean);
deviation(grades,mean,difference);
displayResults(names, grades, difference, mean);
} 



public static double[] getScores(double[] grades)
{
Scanner kb= new Scanner(System.in);
System.out.println("Enter grades for students in alphabetical order.");
for (int i=0;i<grades.length; i++)
{
    grades[i]=kb.nextDouble();
}
return grades;  
}

public static double average(double[] grades, double mean)
{
double total = 0;
for (double i : grades)
{
    total += i;
}
if (grades.length>0)
{
    mean = total/grades.length;
}
return mean;
}

public static double[] deviation(double[] grades, double mean, double[] difference)
{
for (int i=0; i<grades.length; i++)
{
    difference[i]=grades[i]-mean;
}
return difference;
}

public static void displayResults(String[] names, double[] grades, double[] difference, double mean)
{
System.out.println("The average score is" +mean);
System.out.println("Student Name   Grade    Mean Deviation");

for (int i=0; i<names.length; i++)
{
    System.out.printf(names[i]);
    System.out.printf("%20f", grades[i]);
    System.out.printf("%20f", difference[i]);
    System.out.println();
}

}   

}

興味のある方のために編集したコードを次に示します。

java.util.Scanner をインポートします。

public class ClassScores{
public static void main(String[] args){
String[] names = {"Bashful","Doc","Dopey","Grumpy","Happy","Sleepy","Sneezy"};
double[] grades = new double[7];
double mean=0;
double[] difference = new double[7];

getScores(grades);
mean = average(grades);
deviation(grades,mean,difference);
displayResults(names, grades, difference, mean);
}



public static double[] getScores(double[] grades)
{
Scanner kb= new Scanner(System.in);
System.out.println("Enter grades for students in alphabetical order.");
for (int i=0;i<grades.length; i++)
{
    grades[i]=kb.nextDouble();
}
return grades;  
}

public static double average(double[] grades)
{
double total = 0;
for (double i : grades)
{
    total += i;
}
return total/(grades.length);
}

public static double[] deviation(double[] grades, double mean, double[] difference)
{
for (int i=0; i<grades.length; i++)
{
    difference[i]=grades[i]-mean;
}
return difference;
}

public static void displayResults(String[] names, double[] grades, double[] difference, double mean)
{
System.out.println("The average score is" +mean);
System.out.println("Student Name   Grade    Mean Deviation");

for (int i=0; i<names.length; i++)
{
    System.out.printf(names[i]);
    System.out.printf("%20f", grades[i]);
    System.out.printf("%20f", difference[i]);
    System.out.println();
}

}   

}
4

5 に答える 5

2

メソッドの戻り値を実際に使用することはありませんaverage。おそらく、それを に渡すか、メソッドでdisplayResultsに割り当てるつもりでした。meanmain()

于 2013-03-12T00:28:08.947 に答える
1

まず、平均メソッドは次のようになります。

public static double average(double[] grades)
{
    // Error check up front.
    if (grades.length == 0) { 
        throw new InvalidArgumentException("length is 0");
    }

    // These next lines are good.
    double total = 0;
    for (double i : grades)
    {
        total += i;
    }

    // Then you can just divide and return.
    return total / (grades.length);
}

メソッドにmeanパラメーターを渡す必要はありません。それはメソッドに aaverageを渡すようなものです。DogcreateDog

しかし、もっと重要なことは、 を呼び出している間average、結果をどこにも保存しないことです。あなたはそれを無視しているだけです。

ポインターのバックグラウンドから来ている場合は、Java がプリミティブを値meanで渡すことを覚えておいてください。メソッド内で , aを変更doubleしても、メソッド外の値には影響しません。代わりに、

double mean = average(grades);

したがって、 がゼロである根本的な理由meanは、それをゼロに設定し、決して変更しないためです。

double mean = 0;
于 2013-03-12T00:29:38.420 に答える
0

値を返してmeanいますが、メソッド呼び出しの結果を何にも代入していませんaverage。あなたが望むのは、メソッドの結果を変数に代入することです:

mean = average(grades);

また、averageメソッドでは、パラメーターとして受け取る必要はありませんmean。ローカルで宣言して返すだけです。

于 2013-03-12T00:28:42.667 に答える
0

average(grades, mean);変数のコピーaverage()をメソッドに送信します。のmean内部の変数は、同じ名前にもかかわらず、内部の変数average()とは何の関係もありません。問題を解決するには、次のようなことをする必要がありますmeanmain()

mean = average(grades, mean);

meanパラメータを削除し、 内でローカル変数を宣言することもお勧めしますaverage()。それからあなたはただすることができます

mean = average(grades);
于 2013-03-12T00:31:08.263 に答える
0

このメソッドは、値を返すように宣言されています。

public static double average(double[] grades, double mean)

ただし、メイン メソッドでは、返された結果を使用しません。次に、その関数にグローバルであり、値0が割り当てられている他の「平均」変数の値を出力しています。

double mean=0;
double[] difference = new double[7];

getScores(grades);
**average(grades, mean);**
deviation(grades,mean,difference);
displayResults(names, grades, difference, mean);

私はあなたが欲しいと思います:

getScores(grades);
**mean = average(grades, mean);**
deviation(grades,mean,difference);
displayResults(names, grades, difference, mean);
于 2013-03-12T00:31:48.607 に答える