0

次のコードのメソッド「aboveAverage」が正しく表示されず、できる限りのことを試しました。誰かが何がうまくいかないのか説明してもらえますか?

私のコード:

import java.util.*;
public class DailyCatch
{
  private int fishermanID, fisherID;
  private String dateOfSample, date;
  private double[] fishCaught = new double[10];
  private int currWeight = 0;
  private String summary;
  private double average;
  private int aboveAvg;

  public DailyCatch() {  }

  public DailyCatch (int fishermanID, String dateOfSample)
  {
    fisherID = fishermanID;
    date = dateOfSample;
  }

  public DailyCatch (int fishermanID, String dateOfSample, String weight)
  {
    this(fishermanID, dateOfSample);
    readWeights(weight);
  }

  public void addFish(double weight)
  {
    if (currWeight > 10)
    {
       // array full
    }
    else
    {
      fishCaught[currWeight] = weight;
      currWeight += 1;  // update current index of array
    }
  }

  private void readWeights(String weightsAsString) 
  {
    String[] weightsRead = weightsAsString.split("\\s+");
    for (int i = 0; i < weightsRead.length; i++) 
    {
       this.addFish(Double.parseDouble(weightsRead[i]));
    }
  } 

  public String toString()
  {
    return "Fisherman ID: " + fisherID + "\nDate:" + date + "\nFish Caught with Weights: " + Arrays.toString(fishCaught);
  }

  public void printWeights()
  {
     for (int i = 0; i < fishCaught.length; i++)
     {
          System.out.println(fishCaught[i]);
     } 
  }

  public double averageWeight()
  {
      double sum = 0;
     double count = 0;
     for (int i = 0; i < fishCaught.length; i++)
     {
          if (fishCaught[i] != 0)
          {
                  sum += fishCaught[i];
              count += 1;
                  average = sum/count;
          }
 }
  return average;
   }

    public String getSummary()
{   int storyTellerCount = 0;
    int keeperCount = 0;
    int throwBackCount = 0;
    for (int i = 0; i < fishCaught.length; i++)
    {
        if (fishCaught[i] > 5)
        {
            storyTellerCount++;
        }

        else if (fishCaught[i] >=1 && fishCaught[i] <= 5)
        {
            keeperCount++;
        }

        else if (fishCaught[i] < 1 && fishCaught[i] > 0)
        {
            throwBackCount++;
        }

    }  String summary = ("\nStoryteller - " + storyTellerCount+ "\nKeeper - " + keeperCount + "\nThrowback - " + throwBackCount);

        return summary;
}

public int aboveAverage()
{   
    int greatAvgCount = 0;
    for (int i = 0; i < fishCaught.length; i++)
    {
        if (fishCaught[i] > average)
        {
            aboveAvg = greatAvgCount++;
        }
    }
    return aboveAvg;
}   

}

テストコード:

public class BigBass
{
public static void main (String[]args)
{
//Part 1
DailyCatch monday1 = new DailyCatch(32, "4/1/2013", "4.1 5.5 2.3 0.5 4.8 1.5");
System.out.println(monday1);

//Part 2
DailyCatch monday2 = new DailyCatch(44, "4/1/2013");
System.out.println(monday2);
monday2.addFish(2.1);
monday2.addFish(4.2);
System.out.println(monday2);

//Part 3
System.out.println("\n\nSUMMARY OF FISHERMAN 32");
System.out.println(monday1.getSummary());

//Part 4
double avg = monday1.averageWeight();
System.out.printf("\nThere are %d fish above the average weight of %.1f.", monday1.aboveAverage(), avg);
}
}

ここで作業するには、パート 4 を取得する必要があります。平均を上回る魚が 2 匹釣られたことが返されますが、平均は 3.1 です。

4

4 に答える 4

3

単純な間違いです。

public int aboveAverage() {   
    int greatAvgCount = 0;
    for (int i = 0; i < fishCaught.length; i++) {
        if (fishCaught[i] > 3.1) {
            greatAvgCount++; // no 'return'
        }
    }
    return greatAvgCount;
} 
于 2013-05-02T13:24:16.087 に答える
0
if (fishCaught[i] > 3.1)
        {
            return greatAvgCount++;
        }

First try : 4.1 > 3.1

returns 0 ++基本的に 0 であるtrue

ループ内でカウンターをインクリメントし、return ステートメントを最後まで保持することができます。

于 2013-05-02T13:25:17.920 に答える
0

この行はあなたの問題です、

return greatAvgCount++;

あなたはgreatAvgCountをインクリメントしてからその初期値を返します。この行には「リターン」があってはなりません

上記のAverageメソッドは

public int aboveAverage()
{   
    int greatAvgCount = 0;
    for (int i = 0; i < fishCaught.length; i++)
    {
        if (fishCaught[i] > 3.1)
        {
            greatAvgCount++;
        }
    }
    return greatAvgCount;
} 

また、デバッグのためにそれを行っているだけかもしれませんが、その場合は十分公平ですが、「平均」を 3.1 としてハードコーディングすることは、一般的に悪い習慣と見なされます。平均を常に 3.1 にしたい場合 (つまり、書籍から調べたグローバル平均である場合は、呼び出された静的変数を宣言し、double AVERAGE=3.1平均が必要な場所でそれを使用するのがより一般的です。 " を変更すると、コード内の 1 か所で平均を変更するだけで済みます。平均がデータから計算される場合は、明らかに計算された値を使用する必要があります。

また、問題に直接関係するわけではありませんが、事前に定義された最大値が 10 の配列をキャッチした魚に使用するのはなぜですか。

private double[] fishCaught = new double[10];

になる

private ArrayList<Double> fishCaught = new ArrayList<Double>();
于 2013-05-02T13:25:20.907 に答える
0

試す

public int aboveAverage() {   
    int greatAvgCount = 0;
    for (int i = 0; i < fishCaught.length; i++) {
        if (fishCaught[i] > 3.1) {
            greatAvgCount++;
        }
    }
    return greatAvgCount;
} 
于 2013-05-02T13:25:36.230 に答える