【发布时间】:2022-01-07 11:07:44
【问题描述】:
我对 Java 很陌生,我正在努力学习。我要解决的问题的实际问题在上图中。如果我的问题描述不够详细,请参考图片。我目前正在编写一个与购买咖啡有关的 Java 程序。我有一种方法可以计算购买咖啡的成本(BuyCoffee)和使用的资源量。还有不同类型的咖啡,每种咖啡使用不同数量的资源。我还有另一种计算咖啡售出后剩余资源的方法**(getRemainingResources)**。我在循环我的 getRemainingResources 方法时遇到问题。所以当我买一次咖啡时,我拥有的资源量就会减少。我有一种方法来填充这些资源。但是每次我再次尝试购买相同的咖啡时,我剩余的资源量并没有减少。我的代码如下
import java.util.Scanner;
public class MethodsTest {
//global variable--starting quantity of resources in machine
static final int water = 400;
static final int milk = 540;
static final int coffeeBean = 120; // in g
static int disposableCups = 9;
static final int cost = 550; //in $
//global variable --refill quantity of resources in machine
static int fillWater, fillMilk, fillCoffeeBeans, fillDisposableCups;
//global variable -- remaining quantity of resources in machine
static int newRemCost, remCost, remWater, remMilk, remCoffeeBean, remDisposableCups;
static int espressoWater, espressoMilk, espressoCoffeeBeans, espressoCost; // Resources for espresso
static int latteWater, latteMilk, latteCoffeeBeans, latteCost;
static int cappuccinoWater, cappuccinoMilk, cappuccinoCoffeeBeans, cappuccinoCost;
static int regWater, regMilk, regCoffeeBeans, regCost; //Resources for regular coffees
static void FillCoffeeMachine() {
Scanner input = new Scanner(System.in);
System.out.println("Write how many ml of water you want to add: ");
fillWater = input.nextInt();
System.out.println("Write how many ml of milk you want to add: ");
fillMilk = input.nextInt();
System.out.println("Write how many grams of coffee beans you want to add: ");
fillCoffeeBeans = input.nextInt();
System.out.println("Write how many disposable cups of coffee you want to add: ");
fillDisposableCups = input.nextInt();
MainMenu();
}
static void BuyCoffee() { //method for buying coffee
disposableCups--;// always decreasing when coffee is sold
class TypesOfCoffee {
void Espresso() { //nested class, since there are different kind of coffee
espressoWater = 250;
espressoMilk = 0;
espressoCoffeeBeans = 16;
espressoCost = 4;
if (remWater > espressoWater && remMilk > espressoMilk && remCoffeeBean > espressoCoffeeBeans) {
System.out.println("I have enough resources, making you a coffee!");
} else if (remWater < espressoWater) {
System.out.println("Sorry, not enough water!");
disposableCups++;
} else if (remCoffeeBean < espressoCoffeeBeans) {
System.out.println("Sorry, not enough coffee beans!");
disposableCups++;
} else
disposableCups++;
}
void Latte() {
latteWater = 350;
latteMilk = 75;
latteCoffeeBeans = 20;
latteCost = 7;
if (remWater > latteWater && remMilk > latteMilk && remCoffeeBean > latteCoffeeBeans) {
System.out.println("I have enough resources, making you a coffee!");
} else if (remWater < latteWater) {
System.out.println("Sorry, not enough water!");
disposableCups++;
} else if (remMilk < latteMilk) {
System.out.println("Sorry, not enough milk!");
disposableCups++;
} else if (remCoffeeBean < latteCoffeeBeans) {
System.out.println("Sorry, not enough coffee beans!");
disposableCups++;
} else
disposableCups++;
}
void Cappuccino() {
cappuccinoWater = 200;
cappuccinoMilk = 100;
cappuccinoCoffeeBeans = 12;
cappuccinoCost = 6;
if (remWater > cappuccinoWater && remMilk > cappuccinoMilk && remCoffeeBean > cappuccinoCoffeeBeans) {
System.out.println("I have enough resources, making you a coffee!");
} else if (remWater < cappuccinoWater) {
System.out.println("Sorry, not enough water!");
disposableCups++;
} else if (remMilk < cappuccinoMilk) {
System.out.println("Sorry, not enough milk!");
disposableCups++;
} else if (remCoffeeBean < cappuccinoCoffeeBeans) {
System.out.println("Sorry, not enough coffee beans!");
disposableCups++;
} else
disposableCups++;
}
void regularCoffee() {
regWater = 200;
regMilk = 50;
regCoffeeBeans = 15;
regCost = 0;
if (remWater > regWater && remMilk > regMilk && remCoffeeBean > regCoffeeBeans) {
System.out.println("I have enough resources, making you a coffee!");
} else if (remWater < regWater) {
System.out.println("Sorry, not enough water!");
disposableCups++;
} else if (remMilk < regMilk) {
System.out.println("Sorry, not enough milk!");
disposableCups++;
} else if (remCoffeeBean < regCoffeeBeans) {
System.out.println("Sorry, not enough coffee beans!");
disposableCups++;
} else
disposableCups++;
}
}
Scanner input = new Scanner(System.in);
System.out.println("What kind of coffee would you like to buy today?");
System.out.println("""
Please enter:
1 for espresso
2 for latte
3 for cappuccino
4 for a regular coffee
back - to go back to main menu""");
String choice = input.next();
switch (choice) { //lets user choose what type of coffee to buy
case "1":
new TypesOfCoffee().Espresso();
break;
case "2":
new TypesOfCoffee().Latte();
break;
case "3":
new TypesOfCoffee().Cappuccino();
break;
case "4":
new TypesOfCoffee().regularCoffee();
break;
case "back":
MainMenu();
break;
default:
System.out.println("Please enter an option from the above");
}
MainMenu();
}
static void takeMoney() { //method to take the money
System.out.println("I gave you" + " " + "$" + remCost);
newRemCost = remCost;
MainMenu();
}
static void getRemainingResources() {
//TODO --has to loop..but it works only once
remDisposableCups = fillDisposableCups + disposableCups;
boolean found = remDisposableCups > 0; // true for coffee to be sold
while (found) {
remWater = water + fillWater - espressoWater - cappuccinoWater - latteWater;//
remMilk = milk + fillMilk - espressoMilk - cappuccinoMilk - latteMilk;
remCoffeeBean = coffeeBean + fillCoffeeBeans - espressoCoffeeBeans - cappuccinoCoffeeBeans - latteCoffeeBeans;
remCost = cost + espressoCost + cappuccinoCost + latteCost - newRemCost;
//found = remDisposableCups > 0 && remWater>=water && remMilk>=milk&&remCoffeeBean>=coffeeBean;
System.out.println("The coffee machine has: ");
System.out.println(remWater + " " + "ml of water");
System.out.println(remMilk + " " + "ml of milk ");
System.out.println(remCoffeeBean + " " + "g of coffee beans ");
System.out.println(remDisposableCups + " " + "disposable cups ");
System.out.println("$" + remCost + " " + "of money");
found = remDisposableCups < 0;
}
MainMenu();
}
static void MainMenu() { // Gives user option to decide what they want to do
Scanner input = new Scanner(System.in);
System.out.println("Main Menu: " + "\n");
System.out.println("Please choose from the following options below");
System.out.println("""
To buy coffee - Enter buy
To fill the machine - Enter fill
To get cash from machine - Enter take
To see remaining resources - Enter remaining
To exit program - Enter exit""");
String choice = input.next();
switch (choice) {
case "buy":
BuyCoffee();
break;
case "fill":
FillCoffeeMachine();
break;
case "take":
takeMoney();
break;
case "remaining":
getRemainingResources();
break;
case "exit":
System.exit(0);
break;
default:
MainMenu();//goes back to main menu if user types in an unknown value
}
}
public static void main(String[] args) {
MainMenu();
}
}
【问题讨论】:
-
只是不要从其他方法调用
#MainMenu,它们会在方法体的末尾返回到调用者(在本例中为#MainMenu)。使#MainMenu循环,直到输入“退出”作为选项。最后一个技巧是不要在各种方法中重新初始化Scanner对象,而是将单个Scanner作为静态资源或作为方法参数传递。这专门针对System.in上的Scanner -
谢谢,我将扫描仪更改为静态资源,并在我的 switch 语句中循环主菜单。我仍然有同样的问题,因为当我尝试使用购买咖啡(两次)购买相同的咖啡时,资源并没有减少。我认为这与我的 getRemainingResource 方法@Rogue 有关
-
谢谢,我把Scanner改成静态资源,在switch语句块中循环了MainMenu。但我仍然有同样的问题。如果我使用两次购买咖啡,资源(牛奶,水等)的数量应该减少两次,但只会减少一次。这意味着 getRemainingResources 没有循环。剩余的资源量只减少了一次,但应该减少两次(如果我调用两次buyCoffee)即我两次购买相同的咖啡@Rogue
-
本案例中的资源是牛奶、咖啡豆、水、一次性杯子等
-
可能是学习如何使用调试器的好时机,它可以让您逐步执行代码并查看变量的值。我会说有一些“设计缺陷”(很多不必要的
static,最好作为个人classes 的方法)。TypesOfCoffee中的大问题是您有正在调用的 方法,并且这些方法都在调用开始时设置了这些常量值。所以TypesOfCoffee#latte会在每次调用时将latteWater设置为350。
标签: java recursion methods while-loop nested-loops