0

その年の降水量などを計算するプログラムを作成しています。以下のコードの最初のブロックは、ユーザー入力を完全に処理します。ただし、配列の値が指定されるように、現在プログラムを変更しようとしています (基本的にはユーザー入力を排除しようとしています)。

2 番目のコード ブロックが機能しないのはなぜですか? r.getTotalRainFall、r.getAverageRainFall などの下部にエラーが表示されます。

thisYear 配列を導入しなければならなかったことに注意してください (これは必須です)。

コードブロック #1:

import java.util.*;

public class Rainfall {

Scanner in = new Scanner(System.in);
int month = 12;
double total = 0;
double average;
double months[];

public Rainfall() {
    months = new double[12];
}

public void enterMonthData() {
    for (int n = 1; n <= month; n++) {
        System.out.print("Enter the rainfall (in inches) for month #" + n + ": ");
        months[n - 1] = in.nextDouble();

        // Input Validation - Cannot accept a negative number
        while (months[n - 1] < 0) {
            System.out.print("Rainfall must be at least 0. Please enter a new value.");
            months[n - 1] = in.nextDouble();
        }
    }
}

public double getTotalRainFall() {
    total = 0;
    for (int i = 0; i < 12; i++) {
        total = total + months[i];
    }
    return total;
}

public double getAverageRainFall() {
    average = total / 12;
    return average;
}

/**
 * Returns the index of the month with the highest rainfall.
 */
public int getHighestMonth() {
    int highest = 0;
    for (int i = 0; i < 12; i++) {
        if (months[i] > months[highest]) {
            highest = i;
        }
    }
    return highest;
}

/**
 * Returns the index of the month with the lowest rainfall.
 */
public int getLowestMonth() {
    int lowest = 0;
    for (int i = 0; i < 12; i++) {
        if (months[i] < months[lowest]) {
            lowest = i;
        }
    }
    return lowest;
}

public static void main(String[]args) {
    Rainfall r = new Rainfall();
    r.enterMonthData();
    System.out.println("The total rainfall for this year is " + r.getTotalRainFall());
    System.out.println("The average rainfall for this year is " + r.getAverageRainFall());
    int lowest = r.getLowestMonth();
    int highest = r.getHighestMonth();
    System.out.println("The month with the highest amount of rain is " + (highest+1) + " with " + r.months[highest] + " inches");
    System.out.println("The month with the lowest amount of rain is  " + (lowest+1) + " with " + r.months[lowest] + " inches");
}
}

コードブロック #2:

package rain;

public class Rain {

int month = 12;
double total = 0;
double average; 
double getRainAt[];

 public Rain {
    getRainAt = new double[12];
}

double getTotalRainFall() {
    total = 0;
    for (int i = 0; i < 12; i++) {
        total = total + getRainAt[i];
    }
    return total;
}

   double getAverageRainFall() {
    average = total / 12;
    return average;
}

int getHighestMonth() {
    int high = 0;
    for (int i = 0; i < 12; i++) {
        if (getRainAt[i] > getRainAt[high]) {
            high = i;
        }
    }
    return high;
}

int getLowestMonth() {
    int low = 0;
    for (int i = 0; i < 12; i++) {
        if (getRainAt[i] < getRainAt[low]) {
            low = i;
        }
    }
    return low;
}


public static void main(String[] args) {
   // Create an array of rainfall figures.
  double[] thisYear = {1.6, 2.1, 1.7, 3.5, 2.6, 3.7,
                       3.9, 2.6, 2.9, 4.3, 2.4, 3.7 };

  int high;      // The high month
  int low;       // The low month

  // Create a RainFall object initialized with the figures
  // stored in the thisYear array.
  Rainfall r = new Rainfall(thisYear);

  // Display the statistics.
  System.out.println("The total rainfall for this year is " +
                     r.getTotalRainFall();
  System.out.println("The average rainfall for this year is " +
                     r.getAverageRainFall());
  high = r.getHighestMonth();
  System.out.println("The month with the highest amount of rain " +
                     "is " + (high+1) + " with " + r.getRainAt(high) +
                     " inches.");
  low = r.getLowestMonth();
  System.out.println("The month with the lowest amount of rain " +
                     "is " + (low+1) + " with " + r.getRainAt(low) +
                     " inches.");
    }
  }
}
4

3 に答える 3

2

2つのクラスをリファクタリングしました

現在、Rainクラスにはmainメソッドのみが含まれていますが、他のすべてのロジックはRainfallクラスに含まれています

Rainfallクラスにはメソッドがあります-雨のベースを取得するgetRainAt()Rainfallクラスの特定の月には、引数としてdouble配列を受け取るコンストラクターがあるため、この引数を指定してインスタンス化する必要があります。

今すぐクラスを見て、これが要件に合っているかどうかを確認してください。

import java.util.*;

public class Rainfall {

Scanner in = new Scanner(System.in);
int month = 12;
double total = 0;
double average;
double months[];

public Rainfall(double newmonths[]){
    months = newmonths;
}

public void enterMonthData() {
    for (int n = 1; n <= month; n++) {
        System.out.print("Enter the rainfall (in inches) for month #" + n
                + ": ");
        months[n - 1] = in.nextDouble();

        // Input Validation - Cannot accept a negative number
        while (months[n - 1] < 0) {
            System.out
                    .print("Rainfall must be at least 0. Please enter a new value.");
            months[n - 1] = in.nextDouble();
        }
    }
}

public double getTotalRainFall() {
    total = 0;
    for (int i = 0; i < 12; i++) {
        total = total + months[i];
    }
    return total;
}

public double getAverageRainFall() {
    average = total / 12;
    return average;
}

/**
 * get rain given the month number
 */
public double getRainAt(int month){
    double rainValue = 0;
    for (int i = 0; i < months.length; i++) {
        if(month == i){
            rainValue = months[i];
            break;
        }
    }
    return rainValue;
}

/**
 * Returns the index of the month with the highest rainfall.
 */
public int getHighestMonth() {
    int highest = 0;
    for (int i = 0; i < 12; i++) {
        if (months[i] > months[highest]) {
            highest = i;
        }
    }
    return highest;
}

/**
 * Returns the index of the month with the lowest rainfall.
 */
public int getLowestMonth() {
    int lowest = 0;
    for (int i = 0; i < 12; i++) {
        if (months[i] < months[lowest]) {
            lowest = i;
        }
    }
    return lowest;
}
}

レインクラスには現在メインメソッドしかありません

public class Rain {

public static void main(String[] args) {
    // Create an array of rainfall figures.
    double[] thisYear = { 1.6, 2.1, 1.7, 3.5, 2.6, 3.7, 3.9, 2.6, 2.9, 4.3,
            2.4, 3.7 };

    int high; // The high month
    int low; // The low month

    // Create a RainFall object initialized with the figures
    // stored in the thisYear array.
    Rainfall r = new Rainfall(thisYear);

    // Display the statistics.
    System.out.println("The total rainfall for this year is "
            + r.getTotalRainFall());
    System.out.println("The average rainfall for this year is "
            + r.getAverageRainFall());
    high = r.getHighestMonth();
    System.out.println("The month with the highest amount of rain " + "is "
            + (high + 1) + " with " + r.getRainAt(high) + " inches.");
    low = r.getLowestMonth();
    System.out.println("The month with the lowest amount of rain " + "is "
            + (low + 1) + " with " + r.getRainAt(low) + " inches.");
  }
 }

お役に立てれば

于 2012-05-06T08:39:08.893 に答える
1

これが単なるコピーエラーであったかどうかはわかりませんが、2番目のブロックでクラスを呼び出しましたRainが、rをとして宣言しましRainfallた。

于 2012-05-06T06:44:35.397 に答える
1

初期化するためだけにgetRainAtクラスを作成している理由がわからない場合は、Rainクラスコンストラクターを使用してこれを実行してみてください。

これを置き換えます:

public class getRainAt {
    public getRainAt() {
    getRainAt = new double[12];
    }
}

と:

public Rain() {
    getRainAt = new double[12];
}

現在、Rainfallの代わりにRainを使用しているため、メインメソッドでは次のようになります。Rainr = new Rain();

于 2012-05-06T06:20:11.807 に答える