Вычисление значений с разными удвоениями различных индексов в массивах с использованием методов на Java

#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:

Несколько замечаний по коду:

  1. Каждый раз, когда вы запрашиваете ингредиенты для рецепта, вы создаете новые ингредиенты, используемые внутри цикла for, но вы не сохраняете его на уровне класса, поэтому после каждой итерации цикла for он уничтожается (его область действия находится внутри цикла for). Если в итоге вы хотите узнать только общее количество калорий в рецепте, вам следует рассчитать эти калории после цикла numIngredients, но все еще в цикле numRecipes, чтобы у вас все еще был список использованных ингредиентов

  2. Чтобы вычислить общее количество калорий для одного рецепта, вам нужно вычислить калорийность каждого ингредиента. Значение в calories[0] соответствует ingredientName[0], но это не обязательно совпадает с ingredientsUsed[0]. Итак, для каждого элемента ingredientsUsed вам сначала нужно выполнить поиск ингредиента в ingredientName, чтобы узнать его номер индекса, который затем можно использовать для поиска калорий для этого ингредиента.

  3. Если вы действительно хотите знать все рецепты и используемые в них ингредиенты, вам нужно построить двумерный массив, где размерность один соответствует рецепту, а размерность 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;
    }