5

ユーザーに日数と気温を入力するように求めるプログラムを作成するように言われたJavaプロジェクトがあります。そこから、平均気温、平均気温を上回った日を見つけ、気温を最高から最低に並べ替える必要があります。*私はこれらのことをすべて成功裏に完了しましたが、私の教授は、別のメソッドを作成してコードを簡素化するように私に求めています。たとえば、平均を超える日数のメソッドを用意するなどです。私はこの概念を理解していますが、この方法でどのようにアプローチし、進めるかはわかりません。*助けてください?

これまでのコードは次のとおりです。

import java.util.Scanner;

public class NumberAboveAverage {

    /**
     * @param args
     */
    public static void main(String[] args) {

        System.out.println("Enter number of days of temperature to calculate:");
        Scanner keyboard = new Scanner(System. in);
        int day = keyboard.nextInt();
        int[] temperature = new int[day];

        System.out.println("Enter " + day + " temperatures to calculate.");

        for(int i=0; i<day; i++){
            temperature[i] = keyboard.nextInt();
        }

        int sum = 0;
        for(int i=0; i<day; i++){
            sum = sum + temperature[i];

        }

        int average = sum/day;
        System.out.println("The average temperature is: " + average); 

        int daysOver=0;
        for(int i=0; i<day; i++){
            if (temperature[i] > average){
                daysOver++;
            }   
        }
        System.out.println("The temperature was above average for " + daysOver + " day(s).");


            for (int i = 0; i < temperature.length; i++) {
                int min = i;
                for (int j = i; j < temperature.length; j++) {
                    if (temperature[j] < temperature[min])
                        min = j;
                }
                int temp;
                temp = temperature[i];
                temperature[i] = temperature[min];
                temperature[min] = temp;
            }

    System.out.print("The temperatures in increasing order are: ");
    for(int i=0; i<day; i++){
        System.out.print(temperature[i]+" ");
    }

}   
}
4

6 に答える 6

4

コードの分解への良いアプローチは、英語で同じ分解です! あなたはそれを自分で言いました:

ユーザーに日数と気温の入力を求めるプログラムを作成します。そこから、平均気温、平均気温を上回った日を見つけ、気温を最高から最低に並べ替える必要があります。

  • 日数と気温を入力するようにユーザーに依頼します
  • 平均気温を見つける
  • 温度を並べ替える

これをコードに変換できます。

public static void main(String []args) {
  int[] temperature = getUserInput();
  int average = getAverage(temperature);
  int daysOver = getDaysOver(temperature, threshold);

  System.out.println("Average of : " + average + " with " + daysOver + " really hot days");
}

これで、これらの関数にコードを入れて、好きなものを印刷できます:)

于 2012-11-02T02:22:19.723 に答える
1

コードをステップに分割し、それぞれがパズルのピースを解決します。たとえば、平均気温を計算するメソッド、平均気温を上回った日数を計算する別のメソッド、気温を昇順で並べ替える別のメソッドを用意します。

于 2012-11-02T02:20:37.603 に答える
1

コードであなたの質問に答えるのではなく、いくつかの指針を示します。

抽象化できる関数がいくつかあります。

  • 平均を計算する関数。
  • 平均を超えた日数を計算する関数。
  • 温度をソートする機能。
  • 温度を順番に出力する機能。
于 2012-11-02T02:22:06.243 に答える
1

以下のように、1 つのタスクを別の方法で実行することができます。

 public static void main(String[] args) {
    int[] temperature = new int[1];
    Scanner keyboard = new Scanner(System. in);
    readTemperatures(keyboard, temperature);
    int sum = getSum(temperature);
    int average = sum/temperature.length;
    System.out.println("The average temperature is: " + average); 
    int daysOver=getDaysOver(temperature, average);
    System.out.println("The temperature was above average for " 
                                                         + daysOver + " day(s).");
    sortTemperature(temperature);
    printTemperature(temperature);
 }

以下のようにメソッドを作成します。

private static void printTemperature(int[] temperature) {
    System.out.print("The temperatures in increasing order are: ");
     for(int i=0; i<temperature.length; i++){
        System.out.print(temperature[i]+" ");
     }
}

private static void readTemperatures(Scanner keyboard, int[] temperature){
       System.out.println("Enter number of days of temperature to calculate:");
       int day = keyboard.nextInt();
       temperature = new int[day];
       System.out.println("Enter " + day + " temperatures to calculate.");
       for(int i=0; i<day; i++){
        temperature[i] = keyboard.nextInt();
       }
}

残りのメソッドを完了します。

于 2012-11-02T02:30:49.480 に答える
0

さて、初心者のために、いくつかの合理的に完全なステートメントのシーケンスを選択してください。

int daysOver=0;
for(int i=0; i<day; i++){
    if (temperature[i] > average){
        daysOver++;
    }   
}

フィードする必要のあるパラメーターと必要な結果を把握します。

  • 日(多分「numDays」と呼ぶべきですが、それは別の議論です)
  • 温度[]
  • しきい値(平均)
  • 帰り日

(私は、ナンスについてdayは、配列のサイズから得られる複雑さ/「最適化」を無視しています。)

したがって、メソッドは次のようになります。

computeDaysOver(int[] temperature, int average, int day) {
    int daysOver=0;
    for(int i=0; i<day; i++){
        if (temperature[i] > average){
            daysOver++;
        }   
    }
 }

ただし、戻りタイプを指定して、実際に返す必要があります。

int computeDaysOver(int[] temperature, int average, int day) {
    int daysOver=0;
    for(int i=0; i<day; i++){
        if (temperature[i] > average){
            daysOver++;
        }   
    }
    return daysOver;
 }

そしてもちろん、元のコードがあった場所を新しいメソッドに置き換える必要があります。

int daysOver = computeDaysOver(temperature, average, day);

関数に含める操作を選択するときは、入力と出力の数が制限され、目的が明確になっている操作を「円で囲む」ことが重要であることに注意してください。任意のセットだけでなく、接続された操作の完全なセットを含めるようにしてください。

たとえばcomputeAverage、総和ループと除算を含む関数を作成できます。合計だけを計算する必要がない限り、通常、関数内に合計ループだけがあり、外部(または別の関数)に除算があることはありません。また、何らかの理由で合計を別の関数として必要とした場合はcomputeAverage、合計をパラメーターとして渡すのではなく、関数で合計関数を呼び出してから除算を実行します。

(この場合、これらの例はかなり些細なものですが、原則ははるかに大きく、より複雑なコードブロックに引き継がれます。)

于 2012-11-02T02:25:11.577 に答える
0

では、なぜ自分のコードを別の方法に分割する必要があるのでしょうか? これは、異なる異なるロジック/要件を分離するために、code becomes readable and bug hunting becomes easy.

あなたの場合、次のことを行う必要があります。

calculating the average will go into separate method.
sorting the temperatures-will go into separate method..
A method that prints temperatures in order.

このため、メソッドには戻り値の型があります。これは、計算してロジックを通過した後、何らかの出力が得られることを意味します。したがって、戻り値の型のメソッドを使用してこの値を取得できます。

その後、このようにクラスのオブジェクトを作成できます

MyClass myClassObj = new MyClass();

myClassObjそして、このように参照変数を使用してメソッドを呼び出します

myClassObj.myMethod();

何かを返す場合は変数に保存します。

したがって、 likeが値をmyMethod()返す場合、次のようにして、呼び出し元のメソッドでString結果を取得できます。myMethod()

String myStrVar = myClassObj.myMethod();
于 2012-11-02T02:30:31.523 に答える