題
我對 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();
}
}
uj5u.com熱心網友回復:
它現在應該去但是還有其他錯誤(除了掃描儀,他們已經告訴過您)例如,您不能在沒有“剩余”的情況下購買咖啡(還有:靜態變數太多,未使用OO .. .) 這只是一個例子。我更正了您要求的錯誤的代碼,但會有很多變化。
import java.util.Scanner;
public class MethodsTest {
//global variable--starting quantity of resources in machine
static final int water = 40000;
static final int milk = 54000;
static final int coffeeBean = 12000; // in g
static int disposableCups = 900;
static final int cost = 550; //in $
static int remCost = 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, 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 = remCost espressoCost cappuccinoCost latteCost - newRemCost;
espressoCost = 0;
cappuccinoCost = 0;
latteCost = 0;
//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();
}
}
uj5u.com熱心網友回復:
您撰寫的代碼極其復雜,這就是為什么您看不到錯誤所在的原因。幾點意見:
- Java 是一種面向物件 (OO) 語言。OO 范式圍繞著創建類和它們的物件、繼承和多型性(從父類繼承行為,但在每個子類中的行為不同)。
- 您的代碼看起來就像您正在嘗試重新創建結構化編程,就像舊版本的 Basic 或 Macro Assembler 一樣,只需遵守 Java 的語法。您需要真正了解 OO 編程的作業原理,因此首先嘗試查找有關此的教程。
- 不要在一個大類中實作所有內容。嘗試識別應用程式中的不同物體。例如:CoffeMachine、Coffee、Espresso、Latte、RegularCoffee、...為每個識別的物體創建一個類。彼此相似的類可能應該是繼承的一部分,例如 Espresso、Lattte 等應該繼承更通用的類 Coffee(當您可以說“A 是 B 的一種”時,A 繼承了 B)。
- 不要使用靜態變數(除非有很好的理由,但這種情況很少見)。當您創建它們的物件時,讓每個類都有自己的實體屬性:remainingWater、remainingMilk 等是物件 CoffeeMachine 的屬性。它們不是全球性的東西。
- 不要使用靜態方法,如 C 或 Basic 中的子程式。相反,創建類的物件并呼叫它們的實體方法。
- 不要像 Basic 或 Assembler 那樣使用跳轉和標簽。相反,在回圈中呼叫物件的方法并在必要時中斷回圈。
- 如果您在應用程式中檢測到錯誤,請利用 Java 的例外機制 - 拋出例外并讓呼叫者處理錯誤。
- 方法名稱在 Java 中以小寫字母開頭(這是普遍接受的約定,而不是句法規則)。
我遵循上述原則為您的應用程式創建了不同的設計,因此首先從教程中學習面向物件編程的基礎知識,然后將以下代碼與您的代碼進行比較,看看有什么不同。
主類(主選單回圈的入口點):
public class Main
{
public static void main(String[] args)
{
new Main().run();
}
void run()
{
CoffeeMachine coffeeMachine = new CoffeeMachine(400, 540, 120, 9, 550);
while (coffeeMachine.mainMenu()); // loops until mainMenu returns false
}
}
咖啡機:
import java.util.Scanner;
public class CoffeeMachine
{
private Scanner input = new Scanner(System.in);
private int water;
private int milk;
private int coffeeBeans;
private int disposableCups;
private int money;
public CoffeeMachine(int water, int milk, int coffeeBeans, int disposableCups, int money)
{
this.water = water;
this.milk = milk;
this.coffeeBeans = coffeeBeans;
this.disposableCups = disposableCups;
this.money = money;
}
void fill() {
System.out.println("Write how many ml of water you want to add: ");
water = input.nextInt();
System.out.println("Write how many ml of milk you want to add: ");
milk = input.nextInt();
System.out.println("Write how many grams of coffee beans you want to add: ");
coffeeBeans = input.nextInt();
System.out.println("Write how many disposable cups for coffee you want to add: ");
disposableCups = input.nextInt();
}
public void selectCoffee()
{
while (true)
{
System.out.println("What kind of coffee would you like to buy today?");
System.out.println(
" Please enter:\n"
" 1 for espresso\n"
" 2 for latte\n"
" 3 for cappuccino\n"
" 4 for a regular coffee\n"
" back - to go back to main menu");
String choice = input.next();
try {
switch (choice) { //lets user choose what type of coffee to buy
case "1":
buy(new Espresso());
return;
case "2":
buy(new Latte());
return;
case "3":
buy(new Cappuccino());
return;
case "4":
buy(new RegularCoffee());
return;
case "back":
return;
default:
System.err.println("Please enter an option from the above");
}
}
catch (InsufficientResourcesException exception) {
System.err.println("Error buying coffee: " exception.getLocalizedMessage());
}
}
}
public void buy(Coffee coffee) throws InsufficientResourcesException
{
if (coffee.getWaterCost() > water)
throw new InsufficientResourcesException("water", "ml", coffee.getWaterCost(), water);
if (coffee.getMilkCost() > milk)
throw new InsufficientResourcesException("milk", "ml", coffee.getMilkCost(), milk);
if (coffee.getCoffeeBeansCost() > coffeeBeans)
throw new InsufficientResourcesException("coffee beans", "g", coffee.getCoffeeBeansCost(), coffeeBeans);
if (disposableCups < 1)
throw new InsufficientResourcesException("disposable cups", "units", 1, disposableCups);
System.out.println("Buying 1 cup of " coffee.getClass().getSimpleName());
water -= coffee.getWaterCost();
milk -= coffee.getMilkCost();
coffeeBeans -= coffee.getCoffeeBeansCost();
disposableCups--;
money = coffee.getMoneyCost();
}
public void takeMoney()
{
System.out.println("I gave you $" money ". The money tray is now empty.");
money = 0;
}
public void showResources()
{
System.out.println("The coffee machine has: ");
System.out.println(water " ml of water");
System.out.println(milk " ml of milk ");
System.out.println(coffeeBeans " g of coffee beans ");
System.out.println(disposableCups " disposable cups ");
System.out.println("$" money " of money");
}
public boolean mainMenu() { // Gives user option to decide what they want to do
System.out.println("Main Menu: " "\n");
System.out.println("Please choose from the following options below");
System.out.println(
" To buy coffee - Enter buy\n"
" To fill the machine - Enter fill\n"
" To get cash from machine - Enter take\n"
" To see remaining resources - Enter remaining\n"
" To exit program - Enter exit");
String choice = input.next();
switch (choice) {
case "buy":
selectCoffee();
break;
case "fill":
fill();
break;
case "take":
takeMoney();
break;
case "remaining":
showResources();
break;
case "exit":
return false;
}
return true;
}
}
和咖啡課:
public abstract class Coffee
{
private int waterCost;
private int milkCost;
private int coffeeBeansCost;
private int moneyCost;
protected Coffee(int waterCost, int milkCost, int coffeeBeansCost, int moneyCost)
{
this.waterCost = waterCost;
this.milkCost = milkCost;
this.coffeeBeansCost = coffeeBeansCost;
this.moneyCost = moneyCost;
}
public int getWaterCost()
{
return this.waterCost;
}
public int getMilkCost()
{
return this.milkCost;
}
public int getCoffeeBeansCost()
{
return this.coffeeBeansCost;
}
public int getMoneyCost()
{
return this.moneyCost;
}
}
public class Espresso extends Coffee
{
public Espresso()
{
super(250, 0, 16, 4);
}
}
public class Cappuccino extends Coffee
{
public Cappuccino()
{
super(200, 100, 12, 6);
}
}
public class Latte extends Coffee
{
public Latte()
{
super(350, 75, 20, 7);
}
}
public class RegularCoffee extends Coffee
{
public RegularCoffee()
{
super(200, 50, 15, 0);
}
}
最后但并非最不重要的是,例外類:
public class InsufficientResourcesException extends Exception
{
private static final long serialVersionUID = 1L;
public InsufficientResourcesException(String whatResource, String unit, int required, int available)
{
super("Insufficient resources: required " required " " unit " of " whatResource " but available " available " " unit);
}
}
擁有一個好的架構對于軟體來說是最重要的。如果您的架構被正確應用,錯誤將是不可能的,如果它們發生,它們將很容易修復。此外,更改具有良好架構的應用程式既簡單又安全。
另一方面,糟糕的架構使錯誤幾乎是肯定的,很難找到和修復,并且應用程式不能輕易更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/371654.html
上一篇:最長遞增子序列錯誤答案
