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

您可能希望以单独的方法执行一项任务,如下所示:

 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();

如果返回某些内容,则将其保存到变量中。

因此,如果 likemyMethod()返回一个值,那么我们可以这样做以在调用方法中String获得我们的结果:myMethod()

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