如何编写Java程序进行多客人度假费用计算与汇总?

2026-05-08 03:272阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2181个文字,预计阅读时间需要9分钟。

如何编写Java程序进行多客人度假费用计算与汇总?

在开发交互式应用程序时,我们经常需要处理用户输入、执行复杂的计算,并将结果清晰展示给用户。本教程将以一个度假村预订系统为例,演示如何实现这一过程。

例如,使用HTML和JavaScript可以创建一个简单的预订表单,用户输入预订信息,系统进行计算并展示结果。以下是一个简单的示例:

核心问题解析

原始代码在实现度假村费用计算时,主要面临以下几个挑战:

  1. 多客人循环处理: 系统需要能够根据用户输入的客人数量,重复执行费用选择和计算过程。
  2. 方法间数据传递与汇总: 各个费用计算方法(如房间、餐饮、活动)需要将计算结果返回给主程序,并由主程序进行累加。特别是活动费用,其选择同时作为循环终止条件,需要特殊处理。
  3. 结果展示: 最终需要向用户展示总费用以及人均每晚的平均费用。
  4. 方法内部逻辑错误: 原始代码中,calculateRoomCost、calculateMealPlan 和 getActivitiesCost 方法在根据用户选择计算费用时,存在将用户选择值(1、2、3等)直接作为乘数进行计算的逻辑错误,导致费用计算不准确。

方法实现与修正

为了确保费用的准确计算,我们首先需要修正 calculateRoomCost、calculateMealPlan 和 getActivitiesCost 这三个方法内部的逻辑。这些方法应根据用户的选择返回对应的固定费用,而不是将选择值本身用于乘法。

calculateRoomCost 方法详解及修正

该方法负责计算房间费用。它接收总住宿晚数作为参数,并根据用户的房间选择返回对应的总房间费用。

原始问题: 原始代码将用户输入的 cost (即选择的房间类型,1、2或3) 与 100.00、200.00、300.00 相乘,并且 if 条件判断的是 nights 而非 cost,这导致了严重的逻辑错误。

修正后的逻辑: 根据用户选择(1、2或3),确定每晚的房间价格,然后乘以总住宿晚数。

public static double calculateRoomCost(int totalNights) { System.out.println("1: Standard Room no view $100/night"); System.out.println("2: Luxury Room with view $200/night"); System.out.println("3: Luxury Room with Balcony $300/night"); System.out.print("Please enter your choice: "); int choice = input.nextInt(); // 获取用户选择 double roomRatePerNight = 0; switch (choice) { case 1: roomRatePerNight = 100.00; break; case 2: roomRatePerNight = 200.00; break; case 3: roomRatePerNight = 300.00; break; default: System.out.println("Invalid room choice. Defaulting to Standard Room."); roomRatePerNight = 100.00; // 默认值或错误处理 break; } return roomRatePerNight * totalNights; // 返回总房间费用 }

calculateMealPlan 方法详解及修正

该方法负责计算餐饮费用。它接收总住宿晚数作为参数,并根据用户的餐饮计划选择返回对应的总餐饮费用。

立即学习“Java免费学习笔记(深入)”;

原始问题: 与 calculateRoomCost 类似,原始代码将用户输入的 x (即选择的餐饮计划,1、2、3或4) 与价格相乘,且 if 条件判断的是 nights 而非 x,同样存在逻辑错误。

修正后的逻辑: 根据用户选择(1、2、3或4),确定每晚的餐饮价格,然后乘以总住宿晚数。

public static double calculateMealPlan(int totalNights) { System.out.println("1: Lunch & Dinner only $65"); System.out.println("2: 3-Meals a day $150"); System.out.println("3: 3-Meals a day with drinks $225"); System.out.println("4: No meal plan $0"); System.out.print("Please enter your choice: "); int choice = input.nextInt(); // 获取用户选择 double mealCostPerNight = 0; switch (choice) { case 1: mealCostPerNight = 65.00; break; case 2: mealCostPerNight = 150.00; break; case 3: mealCostPerNight = 225.00; break; case 4: mealCostPerNight = 0; break; default: System.out.println("Invalid meal plan choice. Defaulting to No meal plan."); mealCostPerNight = 0; // 默认值或错误处理 break; } return mealCostPerNight * totalNights; // 返回总餐饮费用 }

getActivitiesCost 方法详解及修正

该方法负责获取用户选择的活动费用。它不接收额外参数,并根据用户的活动选择返回对应的活动费用。特殊地,选择“6: That's all--Done!”时,应返回一个特殊值(例如6),以作为循环终止的信号。

原始问题: 原始代码将用户输入的 loop (即选择的活动,1、2、3、4或5) 与价格相乘,这是错误的。例如,选择“1: Scuba Adventure $300”时,应返回 $300,而不是 1 * 300。

修正后的逻辑: 根据用户选择(1到5),直接返回对应的活动价格。选择6时,返回6作为退出信号。

public static double getActivitiesCost() { System.out.println("Choose from these activities"); System.out.println("1: Scuba Adventure $300"); System.out.println("2: Island Shopping Hop $100"); System.out.println("3: Paddle Boarding $125"); System.out.println("4: Deep Sea Fishing $500"); System.out.println("5: Beach Sitting $0"); System.out.println("6: That's all--Done!"); System.out.print("Please enter your choice: "); int choice = input.nextInt(); // 获取用户选择 switch (choice) { case 1: return 300.00; case 2: return 100.00; case 3: return 125.00; case 4: return 500.00; case 5: return 0; case 6: return 6; // 特殊值,表示活动选择结束 default: System.out.println("Invalid activity choice. Please try again."); return -1; // 表示无效选择,可能需要重新输入 } }

主程序 main 方法逻辑构建

main 方法是程序的入口点,它将协调用户输入、调用上述费用计算方法并累加总费用,最终展示结果。

初始化与用户输入

在 main 方法开始时,我们需要初始化一个 sum 变量来累加总费用,并获取客人数量和住宿晚数。

public static void main(String[] args) { double totalCost = 0; // 使用更清晰的变量名 // display welcome System.out.println("Welcome to Likuliku Lagoon Resort - Malolo Island, Fiji.\n"); System.out.println("Please enter number of guests: "); int numberOfGuests = input.nextInt(); System.out.println("How many nights will you be staying? "); int totalNights = input.nextInt();

客人信息循环处理

使用 for 循环遍历每一位客人。在每次循环中,收集该客人的房间、餐饮和活动费用。

for (int i = 0; i < numberOfGuests; i++) { System.out.println("-------------------------------------------------------------------"); System.out.println("Start entering details for guest #" + (i + 1)); // 累加房间和餐饮费用 totalCost += calculateRoomCost(totalNights); totalCost += calculateMealPlan(totalNights); // 处理活动费用,直到用户选择“完成” double activityChoice = 0; while (activityChoice != 6) { activityChoice = getActivitiesCost(); // 只有当选择不是“完成”且是有效选择时,才将活动费用累加到总费用中 if (activityChoice != 6 && activityChoice != -1) { totalCost += activityChoice; } } }

关键点:

  • for 循环确保了为每位客人收集信息。
  • calculateRoomCost(totalNights) 和 calculateMealPlan(totalNights) 的返回值直接累加到 totalCost。
  • getActivitiesCost() 方法在一个 while 循环中被调用,直到用户选择“6: That's all--Done!”。
  • if (activityChoice != 6 && activityChoice != -1) 条件非常重要,它确保只有实际的活动费用才会被累加,避免将退出信号(6)或无效选择(-1)误加到总费用中。

最终结果展示

循环结束后,totalCost 变量将包含所有客人的总费用。我们可以根据此值计算并显示总费用和人均每晚平均费用。

System.out.println("-------------------------------------------------------------------"); System.out.printf("The total cost estimate $%.2f%n", totalCost); // 计算人均每晚费用 if (numberOfGuests > 0 && totalNights > 0) { double averageNightlyCostPerPerson = totalCost / numberOfGuests / totalNights; System.out.printf("The average nightly cost per person is $%.2f%n", averageNightlyCostPerPerson); } else { System.out.println("Cannot calculate average nightly cost (guests or nights is zero)."); } } // end main

关键点:

  • 使用 printf 格式化输出,确保费用显示为两位小数。
  • 在计算人均每晚费用时,增加了对 numberOfGuests 和 totalNights 是否大于零的检查,以避免除零错误。

完整代码示例

下面是整合了所有修正和优化的完整 Java 代码:

import java.util.Scanner; public class Problem { static Scanner input = new Scanner(System.in); public static void main(String[] args) { double totalCost = 0;

本文共计2181个文字,预计阅读时间需要9分钟。

如何编写Java程序进行多客人度假费用计算与汇总?

在开发交互式应用程序时,我们经常需要处理用户输入、执行复杂的计算,并将结果清晰展示给用户。本教程将以一个度假村预订系统为例,演示如何实现这一过程。

例如,使用HTML和JavaScript可以创建一个简单的预订表单,用户输入预订信息,系统进行计算并展示结果。以下是一个简单的示例:

核心问题解析

原始代码在实现度假村费用计算时,主要面临以下几个挑战:

  1. 多客人循环处理: 系统需要能够根据用户输入的客人数量,重复执行费用选择和计算过程。
  2. 方法间数据传递与汇总: 各个费用计算方法(如房间、餐饮、活动)需要将计算结果返回给主程序,并由主程序进行累加。特别是活动费用,其选择同时作为循环终止条件,需要特殊处理。
  3. 结果展示: 最终需要向用户展示总费用以及人均每晚的平均费用。
  4. 方法内部逻辑错误: 原始代码中,calculateRoomCost、calculateMealPlan 和 getActivitiesCost 方法在根据用户选择计算费用时,存在将用户选择值(1、2、3等)直接作为乘数进行计算的逻辑错误,导致费用计算不准确。

方法实现与修正

为了确保费用的准确计算,我们首先需要修正 calculateRoomCost、calculateMealPlan 和 getActivitiesCost 这三个方法内部的逻辑。这些方法应根据用户的选择返回对应的固定费用,而不是将选择值本身用于乘法。

calculateRoomCost 方法详解及修正

该方法负责计算房间费用。它接收总住宿晚数作为参数,并根据用户的房间选择返回对应的总房间费用。

原始问题: 原始代码将用户输入的 cost (即选择的房间类型,1、2或3) 与 100.00、200.00、300.00 相乘,并且 if 条件判断的是 nights 而非 cost,这导致了严重的逻辑错误。

修正后的逻辑: 根据用户选择(1、2或3),确定每晚的房间价格,然后乘以总住宿晚数。

public static double calculateRoomCost(int totalNights) { System.out.println("1: Standard Room no view $100/night"); System.out.println("2: Luxury Room with view $200/night"); System.out.println("3: Luxury Room with Balcony $300/night"); System.out.print("Please enter your choice: "); int choice = input.nextInt(); // 获取用户选择 double roomRatePerNight = 0; switch (choice) { case 1: roomRatePerNight = 100.00; break; case 2: roomRatePerNight = 200.00; break; case 3: roomRatePerNight = 300.00; break; default: System.out.println("Invalid room choice. Defaulting to Standard Room."); roomRatePerNight = 100.00; // 默认值或错误处理 break; } return roomRatePerNight * totalNights; // 返回总房间费用 }

calculateMealPlan 方法详解及修正

该方法负责计算餐饮费用。它接收总住宿晚数作为参数,并根据用户的餐饮计划选择返回对应的总餐饮费用。

立即学习“Java免费学习笔记(深入)”;

原始问题: 与 calculateRoomCost 类似,原始代码将用户输入的 x (即选择的餐饮计划,1、2、3或4) 与价格相乘,且 if 条件判断的是 nights 而非 x,同样存在逻辑错误。

修正后的逻辑: 根据用户选择(1、2、3或4),确定每晚的餐饮价格,然后乘以总住宿晚数。

public static double calculateMealPlan(int totalNights) { System.out.println("1: Lunch & Dinner only $65"); System.out.println("2: 3-Meals a day $150"); System.out.println("3: 3-Meals a day with drinks $225"); System.out.println("4: No meal plan $0"); System.out.print("Please enter your choice: "); int choice = input.nextInt(); // 获取用户选择 double mealCostPerNight = 0; switch (choice) { case 1: mealCostPerNight = 65.00; break; case 2: mealCostPerNight = 150.00; break; case 3: mealCostPerNight = 225.00; break; case 4: mealCostPerNight = 0; break; default: System.out.println("Invalid meal plan choice. Defaulting to No meal plan."); mealCostPerNight = 0; // 默认值或错误处理 break; } return mealCostPerNight * totalNights; // 返回总餐饮费用 }

getActivitiesCost 方法详解及修正

该方法负责获取用户选择的活动费用。它不接收额外参数,并根据用户的活动选择返回对应的活动费用。特殊地,选择“6: That's all--Done!”时,应返回一个特殊值(例如6),以作为循环终止的信号。

原始问题: 原始代码将用户输入的 loop (即选择的活动,1、2、3、4或5) 与价格相乘,这是错误的。例如,选择“1: Scuba Adventure $300”时,应返回 $300,而不是 1 * 300。

修正后的逻辑: 根据用户选择(1到5),直接返回对应的活动价格。选择6时,返回6作为退出信号。

public static double getActivitiesCost() { System.out.println("Choose from these activities"); System.out.println("1: Scuba Adventure $300"); System.out.println("2: Island Shopping Hop $100"); System.out.println("3: Paddle Boarding $125"); System.out.println("4: Deep Sea Fishing $500"); System.out.println("5: Beach Sitting $0"); System.out.println("6: That's all--Done!"); System.out.print("Please enter your choice: "); int choice = input.nextInt(); // 获取用户选择 switch (choice) { case 1: return 300.00; case 2: return 100.00; case 3: return 125.00; case 4: return 500.00; case 5: return 0; case 6: return 6; // 特殊值,表示活动选择结束 default: System.out.println("Invalid activity choice. Please try again."); return -1; // 表示无效选择,可能需要重新输入 } }

主程序 main 方法逻辑构建

main 方法是程序的入口点,它将协调用户输入、调用上述费用计算方法并累加总费用,最终展示结果。

初始化与用户输入

在 main 方法开始时,我们需要初始化一个 sum 变量来累加总费用,并获取客人数量和住宿晚数。

public static void main(String[] args) { double totalCost = 0; // 使用更清晰的变量名 // display welcome System.out.println("Welcome to Likuliku Lagoon Resort - Malolo Island, Fiji.\n"); System.out.println("Please enter number of guests: "); int numberOfGuests = input.nextInt(); System.out.println("How many nights will you be staying? "); int totalNights = input.nextInt();

客人信息循环处理

使用 for 循环遍历每一位客人。在每次循环中,收集该客人的房间、餐饮和活动费用。

for (int i = 0; i < numberOfGuests; i++) { System.out.println("-------------------------------------------------------------------"); System.out.println("Start entering details for guest #" + (i + 1)); // 累加房间和餐饮费用 totalCost += calculateRoomCost(totalNights); totalCost += calculateMealPlan(totalNights); // 处理活动费用,直到用户选择“完成” double activityChoice = 0; while (activityChoice != 6) { activityChoice = getActivitiesCost(); // 只有当选择不是“完成”且是有效选择时,才将活动费用累加到总费用中 if (activityChoice != 6 && activityChoice != -1) { totalCost += activityChoice; } } }

关键点:

  • for 循环确保了为每位客人收集信息。
  • calculateRoomCost(totalNights) 和 calculateMealPlan(totalNights) 的返回值直接累加到 totalCost。
  • getActivitiesCost() 方法在一个 while 循环中被调用,直到用户选择“6: That's all--Done!”。
  • if (activityChoice != 6 && activityChoice != -1) 条件非常重要,它确保只有实际的活动费用才会被累加,避免将退出信号(6)或无效选择(-1)误加到总费用中。

最终结果展示

循环结束后,totalCost 变量将包含所有客人的总费用。我们可以根据此值计算并显示总费用和人均每晚平均费用。

System.out.println("-------------------------------------------------------------------"); System.out.printf("The total cost estimate $%.2f%n", totalCost); // 计算人均每晚费用 if (numberOfGuests > 0 && totalNights > 0) { double averageNightlyCostPerPerson = totalCost / numberOfGuests / totalNights; System.out.printf("The average nightly cost per person is $%.2f%n", averageNightlyCostPerPerson); } else { System.out.println("Cannot calculate average nightly cost (guests or nights is zero)."); } } // end main

关键点:

  • 使用 printf 格式化输出,确保费用显示为两位小数。
  • 在计算人均每晚费用时,增加了对 numberOfGuests 和 totalNights 是否大于零的检查,以避免除零错误。

完整代码示例

下面是整合了所有修正和优化的完整 Java 代码:

import java.util.Scanner; public class Problem { static Scanner input = new Scanner(System.in); public static void main(String[] args) { double totalCost = 0;