Во-первых, это довольно уродливо:
for (int i = 0; i < cityA.length; i++) {
System.out.print("Enter 5 temperatures for City A. ");
cityA[0] = keyboard.nextDouble();
cityA[1] = keyboard.nextDouble();
/* ... */
break;
Либо используйте цикл (подсказка: немного сдвиньте строку for
вниз, а затем сделайте назначения cityA[]
более общими) или не используйте цикл и сохраняйте жестко закодированные ссылки на массивы.(Я предпочитаю цикл for
.)
В очень немногих случаях имеет смысл помещать оператор break
в тело цикла for
.Это, конечно, не должно использоваться здесь.(Вы, возможно, никогда не увидите разумного случая, пока будете в школе.)
Теперь перейдем к мясу вашего вопроса: возврат двух массивов из одной функции.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. *.Сделайте вашу функцию достаточно универсальной, чтобы обрабатывать массивы обоих городов.(Это не должно быть сложно. Найдите, что на самом деле отличается между функциями, и выясните, как передать различные данные в параметре.)
Ваш профессор, возможно, также хотел, чтобы вы вернулимногомерный массив:
/* pseudo-code! */
city[][];
city[0][0] = 1; city[0][1] = 2; /* ... */
city[1][0] = 10; city[1][1] = 5; /* ... */
Но на данный момент это кажется маловероятным.(Также кажется, что это не стоит только для двух городов. Подумайте об этом, когда вам нужно обработать три или более городов.)
Обновление
Ваш новый кодвыглядит значительно лучше;Вы почти там.
public static double[] getHighTemperatures(String cityName, int numberOfDays)
{
Scanner keyboard = new Scanner(System.in);
double[] highsForNewYork = getHighTemperatures("New York", 5);
for (int i = 0; i < numberOfDays; i++)
highsForNewYork[i] = keyboard.nextDouble();
return (highsForNewYork);
}
getHighTemperatures()
рекурсивно вызывает себя здесь.Хотя рекурсивные функции очень полезны, здесь они не очень помогают.Вы называете то, что по сути является «вспомогательной подпрограммой», которую можно использовать для получения данных о любом городе, и жестко закодировали города, которые вас интересуют в рамках подпрограммы .Близко.:)
public static void main(String[]args)
{
double[] temp = new double[5];
String[]cities = new String[] {
"Miami", "Dallas";
getCityTemp(temp, cities);
}
}
main()
имеет список городов, да, но инициализация вашего массива немного сбита.Кроме того, я хотел бы предложить, чтобы ваша функция getCityTemp()
пыталась сделать слишком много - ваша main()
должна на очень высоком уровне описать, что вы пытаетесь выполнить с помощью программы в целом.(Функция main()
должна выглядеть почти как контур.)
public static double[] getCityTemp(double[]temp, String ... cities)
{
Scanner keyboard = new Scanner(System.in);
if (cities.length == 0) {
System.out.println("No argument passed.");
return;
}
String cityA = cities[0];
for (int i = 0; i < temp.length; i++) {
System.out.print("Enter 5 temperatures for City A. ");
temp[i] = keyboard.nextDouble();
if (i < cities.length) {
cityA = cities[i];
}
}
/* ... */
}
Мне обычно нравится этот вид защитного программирования - видеть, что что-то было передано, прежде чем полагаться наэто - но иногда просто Exception
, когда вещи взрываются просто прекрасно.Это тонкая позиция между тем, насколько «внутренние API» должны защищать себя, и какие значения возвращаемых ошибок имеют смысл из «внешних API».(Эти термины велики и помпезны применительно к программе, которая почти умещается на одном экране - но имейте это в виду, когда вы видите и создаете более крупные программы.)
Но учтите, что у вас есть ввод с клавиатурыв эта функция тоже.(Это может быть просто функцией итеративной разработки, и я возвращаюсь к вопросу довольно поздно.) Было бы best ограничить весь ввод с клавиатуры и вывод на дисплей небольшим набором функций и выполнить вычисление (я предполагаю, что вам нужно отсортировать массивы на следующей итерации вашей программы, чтобы вы могли найти минимум, максимум, медиану, среднее, стандартное отклонение и т. д.) в другом наборе подпрограмм.Старайтесь, чтобы каждая функция выполнялась как можно меньше: убедитесь, что каждая функция выполняет одну вещь.
Вот рекомендуемая перезапись:
public static void main(String[]args)
{
String[] cities = {
"Miami", "Dallas"
};
for (String city : cities) {
double[] highs = getCityTemp(city, 5);
printCityTemp(city, highs);
}
}
Яиспользуя более новый стиль for
loop , который исключает весь шаблонный код int i=0; i<array.length; i++
, общий для многих for
циклов.(Большое количество циклов for
повторяется по всем элементам массива.)
public static double[] getCityTemp(String city, int days)
{
Scanner keyboard = new Scanner(System.in);
double[] highs = new double[days];
System.out.print("Enter " + days + " temperatures for " + city + ": ");
for (int i = 0; i < days; i++) {
highs[i] = keyboard.nextDouble();
}
return highs;
}
Весь ввод ограничен getCityTemp()
, который вызывается несколько раз с различными параметрами, чтобы выбрать, какой город будет
public static void printCityTemp(String city, double[] highs)
{
System.out.print("Highs for " + city + " were: ");
for (double high : highs) {
System.out.print(high + " ");
}
System.out.println("");
return;
}
Эта простая процедура вывода предназначена для того, чтобы убедиться, что ввод был выполнен правильно.Я не знаю, идеально ли это для вашего приложения, но это должно быть полезно при отладке.
Обратите внимание, что я не проверял это - он может или не может скомпилировать.Возможно нет.Считайте, что это * псевдокод , чем фактический код.