前言
在这篇Blog中,我将总结之前所涉及到的PTA题目集4、5以及期中考试的情况。这些题目涉及了不同的知识点和题量,并具有一定的难度。本次Blog的重点将分析PTA中的菜单计价系列的题目以及期中考试的题目。
设计与分析
菜单计价系列题目分析
菜单计价系列的题目要求设计一个点菜计价程序,根据输入的信息计算并输出总价格。输入包括菜单和订单两部分,以"end"作为结束标识。菜单由一条或多条菜品记录组成,每条记录包含菜名、基础价格和其他信息。订单包含桌号标识、点菜记录、删除信息和代点菜信息。
在设计这个程序时,我使用了以下类来实现功能:
Dish类:表示菜品,包含菜品名称和单价等属性,以及计算菜品价格的方法。
Menu类:表示菜单,包含菜品数组,用于保存所有菜品信息。它提供了根据菜名查找菜品和添加菜品的方法。
Record类:表示点菜记录,包含序号、菜品、份额和计价等属性。它提供了计算价格的方法。
Order类:表示订单,包含点菜记录数组,用于保存用户点的所有菜品信息。它提供了计算订单总价、添加记录、删除记录和查找记录的方法。
通过这些类的设计,我能够有效地表示菜单和订单的信息,并且能够进行价格的计算和记录的管理。
部分代码:
`import java.util.*;
class Dish {
String name;
int unit_price;
public Dish(String name, int unit_price) {
this.name = name;
this.unit_price = unit_price;
}
public int getPrice(int portion) {
double price;
if (portion == 1) {
price = unit_price;
} else if (portion == 2) {
price = unit_price * 1.5;
} else if (portion == 3) {
price = unit_price * 2;
} else {
throw new IllegalArgumentException("Invalid portion: " + portion);
}
return (int) Math.round(price);
}
}
class Menu {
private Map<String, Dish> dishMap;
public Menu() {
dishMap = new HashMap<>();
}
public void addDish(String dishName, int unit_price) {
dishMap.put(dishName, new Dish(dishName, unit_price));
}
public Dish searchDish(String dishName) {
return dishMap.get(dishName);
}
}
class Record {
int orderNum;
Dish dish;
int portion;
int num;
public Record(int orderNum, Dish dish, int portion, int num) {
this.orderNum = orderNum;
this.dish = dish;
this.portion = portion;
this.num = num;
}
public int getPrice() {
return dish.getPrice(portion) * num;
}
}
class Order {
private Map<Integer, Record> recordMap;
public Order() {
recordMap = new HashMap<>();
}
public void addRecord(int orderNum, Dish dish, int portion, int num) {
recordMap.put(orderNum, new Record(orderNum, dish, portion, num));
}
public void deleteRecord(int orderNum) {
recordMap.remove(orderNum);
}
public int getTotalPrice() {
int totalPrice = 0;
for (Record record : recordMap.values()) {
totalPrice += record.getPrice();
}
return totalPrice;
}
}
class Table {
String tableNum;
List
public Table(String tableNum) {
this.tableNum = tableNum;
this.orderInfo = new ArrayList<>();
}
public void addOrderInfo(String info) {
orderInfo.add(info);
}
}
public class Main {
private static final double WEEKDAY_DISCOUNT = 0.8;
private static final double WEEKEND_DISCOUNT = 1.0;
private static final String WEEKDAY_OPENING_START = "17:00:00";
private static final String WEEKDAY_OPENING_END = "20:30:00";
private static final String WEEKDAY_LUNCH_START = "10:30:00";
private static final String WEEKDAY_LUNCH_END = "14:30:00";
private static final String WEEKEND_OPENING_START = "09:30:00";
private static final String WEEKEND_OPENING_END = "21:30:00";
private static boolean isWeekdayOpeningTime(String time) {
return isWithinTimeRange(time, WEEKDAY_OPENING_START, WEEKDAY_OPENING_END);
}
private static boolean isWeekdayLunchTime(String time) {
return isWithinTimeRange(time, WEEKDAY_LUNCH_START, WEEKDAY_LUNCH_END);
}
private static boolean isWeekendOpeningTime(String time) {
return isWithinTimeRange(time, WEEKEND_OPENING_START, WEEKEND_OPENING_END);
}
private private static boolean isWithinTimeRange(String time, String startTime, String endTime) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date currentTime = sdf.parse(time);
Date startTimeRange = sdf.parse(startTime);
Date endTimeRange = sdf.parse(endTime);
return currentTime.after(startTimeRange) && currentTime.before(endTimeRange);
} catch (ParseException e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
// 创建菜单
Menu menu = new Menu();
menu.addDish("Dish1", 10);
menu.addDish("Dish2", 15);
menu.addDish("Dish3", 20);
// 创建订单
Order order = new Order();
order.addRecord(1, menu.searchDish("Dish1"), 2, 2);
order.addRecord(2, menu.searchDish("Dish2"), 1, 3);
// 创建餐桌
Table table = new Table("Table1");
table.addOrderInfo("Order 1: " + order.getTotalPrice());
// 获取当前时间
String currentTime = "17:30:00";
// 根据时间计算折扣
double discount;
if (isWeekdayOpeningTime(currentTime)) {
discount = WEEKDAY_DISCOUNT;
} else if (isWeekdayLunchTime(currentTime)) {
discount = WEEKDAY_DISCOUNT;
} else if (isWeekendOpeningTime(currentTime)) {
discount = WEEKEND_DISCOUNT;
} else {
discount = 1.0;
}
// 应用折扣
int totalPrice = (int) (order.getTotalPrice() * discount);
// 输出结果
System.out.println("Table: " + table.tableNum);
for (String info : table.orderInfo) {
System.out.println(info);
}
System.out.println("Total Price: " + totalPrice);
}
}
`
期中考试题目分析
这是一个关于抽象类与接口的期中考试题目。考生需要根据给定的代码框架,完成类的设计和功能实现。
题目要求在测验3的基础上进行重构,实现对列表内图形按照面积进行排序的功能。提示中提到Shape类需要实现Comparable接口。
以下是提供的Main类的源代码:
`public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
ArrayList
int choice = input.nextInt();
while(choice != 0) {
switch(choice) {
case 1://Circle
double radius = input.nextDouble();
Shape circle = new Circle(radius);
list.add(circle);
break;
case 2://Rectangle
double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
Point leftTopPoint = new Point(x1, y1);
Point lowerRightPoint = new Point(x2, y2);
Rectangle rectangle = new Rectangle(leftTopPoint, lowerRightPoint);
list.add(rectangle);
break;
}
choice = input.nextInt();
}
list.sort(Comparator.naturalOrder()); // 正向排序
for(int i = 0; i < list.size(); i++) {
System.out.print(String.format("%.2f", list.get(i).getArea()) + " ");
}
}
}`
输入格式:
首先输入图形类型(1代表圆形;2代表矩形;0代表结束输入)。
然后根据图形类型输入相应的参数。
输出格式:
按升序排序输出列表中各图形的面积(保留两位小数),各图形面积之间用空格分隔。
我们需要根据题目要求补充代码,实现Shape类的比较功能,并完成图形类的设计。在给定的Main类中,使用ArrayList存储图形对象,并对其进行排序。最后按要求输出排序后的图形面积。
源代码:
`import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
ArrayList
int choice = input.nextInt();
while (choice != 0) {
switch (choice) {
case 1://Circle
double radiums = input.nextDouble();
Shape circle = new Circle(radiums);
list.add(circle);
break;
case 2://Rectangle
double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
Point leftTopPoint = new Point(x1, y1);
Point lowerRightPoint = new Point(x2, y2);
Rectangle rectangle = new Rectangle(leftTopPoint, lowerRightPoint);
list.add(rectangle);
break;
}
choice = input.nextInt();
}
list.sort(new Comparator<Shape>() {
@Override
public int compare(Shape o1, Shape o2) {
double s1 = o1.getArea();
double s2 = o2.getArea();
if (s1 > s2)
return 1;
else if (s1 < s2)
return -1;
return 0;
}
});
for (int i = 0; i < list.size(); i++) {
System.out.print(String.format("%.2f", list.get(i).getArea()) + " ");
}
}
}
class Point {
double x;
double y;
public Point() {
// TODO Auto-generated constructor stub
}
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
class Rectangle extends Shape {
Point topLeftPoint;
Point lowerRihgtPoint;
public Rectangle(Point topLeftPoint, Point lowerRihgtPoint) {
this.topLeftPoint = topLeftPoint;
this.lowerRihgtPoint = lowerRihgtPoint;
}
public Rectangle() {
}
public Point getTopLeftPoint() {
return topLeftPoint;
}
public void setTopLeftPoint(Point topLeftPoint) {
this.topLeftPoint = topLeftPoint;
}
public Point getLowerRihgtPoint() {
return lowerRihgtPoint;
}
public void setLowerRihgtPoint(Point lowerRihgtPoint) {
this.lowerRihgtPoint = lowerRihgtPoint;
}
public double getLenght() {
return Math.abs(topLeftPoint.getX() - lowerRihgtPoint.getX());
}
public double getHeight() {
return Math.abs(topLeftPoint.getY() - lowerRihgtPoint.getY());
}
public double getArea() {
return getHeight() * getLenght();
}
}
class Circle extends Shape {
double raduim;
public Circle() {
}
public Circle(double raduim) {
this.raduim = raduim;
}
public double getRaduim() {
return raduim;
}
public void setRaduim(double raduim) {
this.raduim = raduim;
}
public double getArea() {
return Math.PI * raduim * raduim;
}
}
class Shape implements Comparator
public Shape() {
// TODO Auto-generated constructor stub
}
public double getArea() {
return 0;
}
@Override
public int compare(Shape o1, Shape o2) {
// TODO Auto-generated method stub
double s1 = o1.getArea();
double s2 = o2.getArea();
if (s1 > s2)
return 1;
else if (s1 < s2)
return -1;
return 0;
}
}`
采坑心得
测验4-抽象类与接口总结:
这个作业要求在测验3的基础上进行重构,实现对图形列表按照图形的面积进行排序的功能。在Main类中,通过Scanner读取用户输入的图形类型和参数,并根据输入创建对应的图形对象,然后将这些图形对象添加到ArrayList
菜单计价程序-5总结:
这个作业是在菜单计价程序-3的基础上进行修改和增加功能。在输入内容中,新增了特色菜的输入格式和口味度值,对应不同菜系的口味度范围进行处理。在输出格式中,要求按顺序输出每桌的订单记录处理信息,并计算每桌的总价。针对特色菜,还要输出不同菜系的口味度水平。口味度水平由口味度平均值确定,只综合对应口味菜系的菜计算,不做所有菜的平均。如果整桌菜没有特色菜,则只输出基本信息。在计算口味度时需要累计本桌各类菜系所有记录的口味度总和,再除以对应菜系菜的总份数,最后进行四舍五入。
在提交源码的过程中,我遇到了一些问题并从中吸取了一些经验。我注意到在提交代码之前,需要仔细检查代码的正确性,并进行充分的测试。我遵循了严格的测试流程,确保我的代码能够正确地处理各种输入情况,并且生成正确的输出结果。
另外,我还发现在编码过程中,注释和代码的可读性非常重要。我努力保持代码的清晰和易于理解,同时添加了适当的注释来解释
总结
在这两次作业中,我学到了一些有用的知识和技能。以下是我的学习总结:
抽象类与接口:通过测验4的作业,我了解了抽象类和接口的概念以及它们在Java中的使用。我学会了如何定义抽象类和接口,以及如何在子类中实现接口或扩展抽象类。这种设计模式使得代码更加灵活和可扩展,通过接口和抽象类可以定义通用的方法和属性,同时又能够为不同的子类提供不同的实现。
类的设计与重构:在测验4的题目中,我需要根据给定的要求重新设计类,并实现列表内图形的排序功能。这个任务要求我思考如何合理地组织类的结构,使得不同类之间能够协同工作。我通过创建Shape类和其子类Circle和Rectangle,以及实现Comparable接口,实现了按照图形面积进行排序的功能。
集合类的使用:在测验4的作业中,我使用了ArrayList作为存储图形对象的容器,并使用了sort方法对列表进行排序。这让我对集合类的使用更加熟练,了解了如何向列表中添加元素、遍历列表以及排序列表。
输入与输出处理:在菜单计价程序的作业中,我学会了处理输入和输出的格式。通过解析输入的文本内容,我能够提取出所需的信息,并根据要求进行相应的计算和处理。同时,我也学到了如何根据不同的情况进行输出,包括错误提示和结果展示。
面向对象编程思想:通过这两次作业,我进一步理解了面向对象编程的思想和原则。我学会了如何将现实世界中的问题抽象成类和对象,以及如何设计合理的类结构和关系。面向对象编程的思想使得代码更易读、易维护,提高了代码的可重用性和可扩展性。
通过这两次作业,我不仅学到了具体的编程技巧和知识,还提升了解决问题和设计程序的能力。我将继续努力学习和实践,进一步提升自己的编程水平。
标签:题目,String,期中考试,double,PTA,int,new,return,public From: https://www.cnblogs.com/2004zzz/p/17518033.html