#java #arrays #methods
#java #массивы #методы
Вопрос:
Я создаю программу, которая принимает ингредиенты и их калории на унцию, затем рецепты и их ингредиенты и унции каждого ингредиента. Я хочу рассчитать общее количество калорий в рецептах.
import java.util.*;
public class Restaurant {
for (int i=0; i<numRecipes; i ) {
System.out.println(recipeName[i] ":");
System.out.println(" calories"); // I would call the countCalories method here
}
}
}
Ответ №1:
Сначала вам нужно изменить countCalories
, чтобы вы передавали названия ингредиентов. Это позволит вам найти калорийность используемого ингредиента:
public static int countCalories(String[] ingredientName, String[] ingredientsUsed, double[] calories, double[] numOunces) {
double cal = 0;
for (int i = 0; i < ingredientsUsed.length; i ) {
for (int j = 0; j < ingredientName.length; j ) {
if (ingredientsUsed[i].equals(ingredientName[j])) {
cal = numOunces[i] * calories[j];
}
}
}
return (int) Math.round(cal);
}
Чтобы вызвать этот метод, я бы объединил два цикла над массивами в один и подсчитывал калории для каждого рецепта по мере их считывания. Таким образом, вам не нужно хранить ингредиенты и количества для более чем одного рецепта одновременно.
for (int i = 0; i < numRecipes; i ) {
recipeName[i] = scan.next();
int numIngredients = scan.nextInt();
String[] ingredientsUsed = new String[numIngredients];
double[] numOunces = new double[numIngredients];
for (int j = 0; j < numIngredients; j ) {
ingredientsUsed[j] = scan.next();
numOunces[j] = scan.nextDouble();
}
System.out.println(recipeName[i] ":");
System.out.println(countCalories(ingredientName, ingredientsUsed, calories, numOunces));
}
Комментарии:
1. Можете ли вы отредактировать вопрос, чтобы показать вводимые вами данные и ожидаемый результат?
2. Я получаю
SampleRoll: 53
в качестве выходных данных, которые находятся в пределах ошибки округления от ожидаемых 52… Какой тип округления вы должны использовать, чтобы получить результат в 52?3. Выполнение вычисления калорийности с
double
точностью вернет 52,3, а округление даст вам 52 — возможно, это ближе к тому, что вы должны делать. Я обновилcountCalories
метод, чтобы показать, как это сделать.4. Точное вычисление заключается в том, что
0.5×37 0.1×113 0.5×45 = 18.5 11.3 22.5 = 52.3
округление, которое вам было указано использовать, дает19 11 23 = 53
звуки, как будто в самом упражнении есть ошибка, либо в ожидаемом выходе, либо в инструкциях
Ответ №2:
Несколько замечаний по коду:
-
Каждый раз, когда вы запрашиваете ингредиенты для рецепта, вы создаете новые ингредиенты, используемые внутри цикла for, но вы не сохраняете его на уровне класса, поэтому после каждой итерации цикла for он уничтожается (его область действия находится внутри цикла for). Если в итоге вы хотите узнать только общее количество калорий в рецепте, вам следует рассчитать эти калории после цикла numIngredients, но все еще в цикле numRecipes, чтобы у вас все еще был список использованных ингредиентов
-
Чтобы вычислить общее количество калорий для одного рецепта, вам нужно вычислить калорийность каждого ингредиента. Значение в calories[0] соответствует ingredientName[0], но это не обязательно совпадает с ingredientsUsed[0]. Итак, для каждого элемента ingredientsUsed вам сначала нужно выполнить поиск ингредиента в ingredientName, чтобы узнать его номер индекса, который затем можно использовать для поиска калорий для этого ингредиента.
-
Если вы действительно хотите знать все рецепты и используемые в них ингредиенты, вам нужно построить двумерный массив, где размерность один соответствует рецепту, а размерность 2 является ингредиентом, используемым для рецепта.
String[] recipeName = new String[numRecipes]; // extra array to keep calories per recipe double[] recipeCalories = new double[]; for (int i=0; i<numRecipes; i ) { recipeName[i] = scan.next(); int numIngredients = scan.nextInt(); String[] ingredientsUsed = new String[numIngredients]; double[] numOunces = new double[]; for (int j=0; j<numIngredients; j ) { ingredientsUsed[j] = scan.next(); numOunces[j] = scan.nextDouble(); } recipeCalories [i]=countCalories(ingredientsUsed,ingredientName,calories,numOunces); } for (int i=0; i<numRecipes; i ) { System.out.println(recipeName[i] ": calories " recipeCalories[i]); } /** * ingrediensUsed : names of all ingredients in the recipe * ingredientName: names of all known ingredients * calories: calories per ingredientName * numOunces : ounces per ingredientUsed */ int countCalories (String[] ingredientsUsed, String[] ingredientName, double[] calories, double[] numOunces) { int cal=0; for (int i=0;i<ingredientsUsed.length;i ) { for (int n=0;n<ingredientName.length;n ) { if (ingredientsUsed[i].equals(ingredientName[n]) { // n is the corresponding index in the ingredientName and calories arrays cal = cal ((int)(numOunces[i] * calories[n] 0.5)); } } } return cal; }