вызов методов, параметров и аргументов - PullRequest
2 голосов
/ 22 февраля 2020

Это, наверное, тупой вопрос. Мой следующий код выглядит хорошо, но на выходе он не ожидает результатов моего сценария тестирования ios. Код следующий:

 import java.util.Scanner;
  public class PartyPlannerLab {
                      public static Scanner input = new Scanner(System.in);

    public static int getGuestCount(int guests) {
        while(true) {
            System.out.print("Enter number of guests: ");
            guests = input.nextInt();
            if (guests >= 1 && guests <= 100)
                break;
            else 
                System.out.println("The guest count must be at least 1, but does not exceed 100. Please enter again.");
        }
        return guests;
    }
    public static int getSlicesPerPerson(int slicesPerPerson) {
        while(true) {
        System.out.print("Enter number of slices per person: ");
        slicesPerPerson = input.nextInt();
        if (slicesPerPerson >= 1 && slicesPerPerson <= 8)
            break;
        else
            System.out.println("The pizza slice count must be at least 1, but does not exceed 8. Please try again.");
        }
        return slicesPerPerson;
    }
    public static double computeRoomCost(int guests, double roomCost) {
        if (guests <= 30)
            roomCost = 100.00;
        else
            roomCost = 200.00;
        return roomCost;
    }
    public static double computeSodaCost(double sodaCost, int guests) {
        sodaCost = guests * 1.50;
        return sodaCost;

    }
    public static void printSummary(int guests, double roomCost, double sodaCost, double pizzaCost) {
        System.out.println("Total Guests: " + guests);
        System.out.println("RoomCost: $" + roomCost);
        System.out.println("SodaCost: $" + sodaCost);
        System.out.println("PizzaCost: $" + pizzaCost);
        System.out.println("Total Cost: $" +(roomCost + sodaCost + pizzaCost));
    }
    public static void main(String[] args) {
        int guests = 0;
        int slicesPerPerson = 0;
        double roomCost = 0.0;
        double sodaCost = 0.0;
        double pizzaCost = 0.0;
        getGuestCount(guests);
        getSlicesPerPerson(slicesPerPerson);
        computeRoomCost(guests, roomCost);
        computeSodaCost(sodaCost, guests);
        printSummary(guests, roomCost, sodaCost, pizzaCost);

        input.close();
    }


    }

Один выход выглядит следующим образом:

Enter number of guests: 10
Enter number of slices per person: 2
Total Guests: 0
RoomCost: $0.0
SodaCost: $0.0
PizzaCost: $0.0
Total Cost: $0.0

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Вы не используете возвращаемые значения getGuestCount, getSlicesPerPerson et c.

Эти методы возвращают значение , что в основном означает, что вы можете использовать их, как будто они являются ценностью. input.nextInt также возвращает значение, поэтому вы можете поместить его справа от =.

Внутри метода getGuestCount кажется для изменения значения guests передан, но это изменение не будет отражаться на стороне вызывающего, потому что Java является передачей по значению. Вы как бы выбрасываете значение, которое было передано.

Фактически, ваши методы будут работать только так, как они есть, если аргументы передаются по ссылке, так что методы могут изменять переменные прошло. Но это невозможно в Java. См. этот пост о разнице между передачей по значению и передачей по ссылке.

Правильный способ переписать ваши методы в Java - это вернуть значение (которое они уже делаете, но вы не используете возвращаемое значение) и удалите посторонний параметр.

public static int getGuestCount() {
    int guests;
    while(true) {
        System.out.print("Enter number of guests: ");
        guests = input.nextInt();
        if (guests >= 1 && guests <= 100)
            break;
        else 
            System.out.println("The guest count must be at least 1, but does not exceed 100. Please enter again.");
    }
    return guests;
}
public static int getSlicesPerPerson() {
    int slicesPerPerson;
    while(true) {
    System.out.print("Enter number of slices per person: ");
    slicesPerPerson = input.nextInt();
    if (slicesPerPerson >= 1 && slicesPerPerson <= 8)
        break;
    else
        System.out.println("The pizza slice count must be at least 1, but does not exceed 8. Please try again.");
    }
    return slicesPerPerson;
}
public static double computeRoomCost(int guests) {
    double roomCost;
    if (guests <= 30)
        roomCost = 100.00;
    else
        roomCost = 200.00;
    return roomCost;
}
public static double computeSodaCost(int guests) {
    double sodaCost = guests * 1.50;
    return sodaCost;
}

Вот как вы «используете возвращаемые значения»: вместо передачи переменной Если вы хотите изменить метод, поместите его слева от = в операторе присваивания:

    guests = getGuestCount();
    slicesPerPerson = getSlicesPerPerson();
    roomCost = computeRoomCost(guests);
    sodaCost = computeSodaCost(guests);
1 голос
/ 22 февраля 2020

Причина, по которой вы не получаете вывод, состоит в том, что значения, которые вы инициализировали в своем основном методе, не обновляются с помощью вызовов метода, которые вы делаете.

Приведенный ниже код может решить проблему, с которой вы столкнулись -

 public static void main(String[] args) {
    int guests = 0;
    int slicesPerPerson = 0;
    double roomCost = 0.0;
    double sodaCost = 0.0;
    double pizzaCost = 0.0;
    guests = getGuestCount(guests);
    slicesPerPerson = getSlicesPerPerson(slicesPerPerson);
    roomCost = computeRoomCost(guests, roomCost);
    sodaCost = computeSodaCost(sodaCost, guests);
    printSummary(guests, roomCost, sodaCost, pizzaCost);

    input.close();
}

Примечание- Нет необходимости передавать параметр в методы getGuestCount & getSlicesPerPerson , поскольку ввод берется из ввода / вывода

...