一.前言
Java编程语言是当今最流行的编程语言之一,由于其跨平台性、面向对象性和安全性等特点,受到广泛的应用。
作为一名计算机专业的学生,在学习Java编程语言时,我们需要完成多个作业来巩固所学知识。
在前三次Java作业中,我们已经学习了Java的基础知识和常用技术,通过完成这些作业,我们更深入地了解了Java编程语言的特点和使用方法。
下面对这三次作业做一个简单的总结:
1.知识点:
进一步掌握java中类,抽象类及接口的使用,继续完化菜单系列题目。
2.题量与难度:
题量适中,菜单系统外的题目难度适中。对于菜单系统系列题目难度较大,已经无法独自完成。
3.题目:
实验四:菜单计价程序-4
期中: 测验1-圆类设计, 测验2-类结构设计,测验3-继承与多态,测验4-抽象类与接口。
二.设计与分析
1.实验四
7-1 菜单计价程序-4
在菜单3上进行的改进:
本次课题比菜单计价系列-3增加的异常情况:
1、菜谱信息与订单信息混合,应忽略夹在订单信息中的菜谱信息。输出:"invalid dish"
2、桌号所带时间格式合法(格式见输入格式部分说明,其中年必须是4位数字,月、日、时、分、秒可以是1位或2位数),数据非法,比如:2023/15/16 ,输出桌号+" date error"
3、同一桌菜名、份额相同的点菜记录要合并成一条进行计算,否则可能会出现四舍五入的误差。
4、重复删除,重复的删除记录输出"deduplication :"+序号。
5、代点菜时,桌号不存在,输出"Table number :"+被点菜桌号+" does not exist";本次作业不考虑两桌记录时间不匹配的情况。
6、菜谱信息中出现重复的菜品名,以最后一条记录为准。
7、如果有重复的桌号信息,如果两条信息的时间不在同一时间段,(时段的认定:周一到周五的中午或晚上是同一时段,或者周末时间间隔1小时(不含一小时整,精确到秒)以内算统一时段),此时输出结果按不同的记录分别计价。
8、重复的桌号信息如果两条信息的时间在同一时间段,此时输出结果时合并点菜记录统一计价。前提:两个的桌号信息的时间都在有效时间段以内。计算每一桌总价要先合并符合本条件的饭桌的点菜记录,统一计价输出。
9、份额超出范围(1、2、3)输出:序号+" portion out of range "+份额,份额不能超过1位,否则为非法格式,参照第13条输出。
10、份数超出范围,每桌不超过15份,超出范围输出:序号+" num out of range "+份数。份数必须为数值,最高位不能为0,否则按非法格式参照第16条输出。
11、桌号超出范围[1,55]。输出:桌号 +" table num out of range",桌号必须为1位或多位数值,最高位不能为0,否则按非法格式参照第16条输出。
12、菜谱信息中菜价超出范围(区间(0,300)),输出:菜品名+" price out of range "+价格,菜价必须为数值,最高位不能为0,否则按非法格式参照第16条输出。
13、时间输入有效但超出范围[2022.1.1-2023.12.31],输出:"not a valid time period"
14、一条点菜记录中若格式正确,但数据出现问题,如:菜名不存在、份额超出范围、份数超出范围,按记录中从左到右的次序优先级由高到低,输出时只提示优先级最高的那个错误。
15、每桌的点菜记录的序号必须按从小到大的顺序排列(可以不连续,也可以不从1开始),未按序排列序号的输出:"record serial number sequence error"。当前记录忽略。(代点菜信息的序号除外)
16、所有记录其它非法格式输入,统一输出"wrong format"
17、如果记录以“table”开头,对应记录的格式或者数据不符合桌号的要求,那一桌下面定义的所有信息无论正确或错误均忽略,不做处理。如果记录不是以“table”开头,比如“tab le 55 2023/3/2 12/00/00”,该条记录认为是错误记录,后面所有的信息并入上一桌一起计算。
本次作业比菜单计价系列-3增加的功能:
菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+基础价格+"T"
例如:麻婆豆腐 9 T
菜价的计算方法:
周一至周五 7折, 周末全价。
代码如下
import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalTime; import java.time.temporal.ChronoField; import java.util.Scanner; public class Main { public static void main(String[] args) { @SuppressWarnings("resource") Scanner in = new Scanner(System.in); Dish[] dish = new Dish[10]; String[] command = in.nextLine().split(" "); for(int i = 0; !command[0].equals("table"); i++) { if(isNumeric(command[1])) { if(command.length > 2) { if(command.length < 4) dish[i] = new Dish(command[0],Integer.parseInt(command[1]),true); else { System.out.println("wrong format"); System.exit(0); } } else dish[i] = new Dish(command[0],Integer.parseInt(command[1]),false); if(!(dish[i].getUtilPrice() > 0&&dish[i].getUtilPrice() < 300)) { System.out.println(dish[i].getName()+" price out of range "+dish[i].getUtilPrice()); dish[i] = new Dish(); } } else { dish[i] = new Dish(); System.out.println("wrong format"); } command = in.nextLine().split(" "); } Menu menu = new Menu(dish); if(isTable(command)) { Table[] table = new Table[10]; int tableNum =0; for(tableNum = 0; command[0].equals("table"); tableNum++) { table[tableNum] = new Table(Integer.parseInt(command[1]),command[2],command[3]); System.out.println("table "+table[tableNum].getNum()+": "); Record[] records = new Record[10]; command = in.nextLine().split(" "); for(int j = 0; !(command[1].equals("delete")||isTable(command)); j++) { if(command[0].length() > 2) { if(command.length > 3) records[j] = new Record(1,new Dish(),0,0); else System.out.println("invalid dish"); } else { if(menu.searthDish(command[1]).getName().equals("notexist")) { System.out.println(command[1]+" does not exist"); records[j] = new Record(); } else { records[j] = new Record(Integer.parseInt(command[0]),menu.searthDish(command[1]),Integer.parseInt(command[2]),Integer.parseInt(command[3])); } } command = in.nextLine().split(" "); if(command[0].equals("end")) break; } Order order = new Order(records,menu); table[tableNum].setOrder(order); order.showOrder(); if(!command[0].equals("end")) { while(command[1].equals("delete")) { order.delARecordByOrderNum(Integer.parseInt(command[0])); command = in.nextLine().split(" "); if(command[0].equals("end")) break; } } } for(int i = 0; i < tableNum; i++) { table[i].showTotal(); } } else System.out.println("wrong format"); } public static boolean isTable(String[] table ) { if(table.length < 5) { if(table[0].equals("table")) { if(isNumeric(table[1])) { if(table[3].length() == 8) return true; else return false; } else return false; } else return false; } else return false; } public static boolean isNumeric(String str) { if (str == null) { return false; } int sz = str.length(); for (int i = 0; i < sz; i++) { if (Character.isDigit(str.charAt(i)) == false) { return false; } } return true; } } class Dish{ private String name; private int util_price; private boolean t; public Dish() { name = ""; util_price = 0; t = false; } public Dish(String name,int util_price,boolean t){ this.name = name; this.util_price = util_price; this.t = t; } public String getName() { return name; } public int getUtilPrice() { return util_price; } public boolean getT() { return t; } public int getPrice(int portion){ double price = 0; switch(portion){ case 1:{ price = util_price; break; } case 2:{ price = util_price * 1.5; break; } case 3:{ price = util_price * 2; break; } } if(price - (int)price >= 0.5) return (int)price + 1; else return (int)price; } } class Menu{ private Dish[] dishs; public Menu(Dish[] dishs) { this.dishs = new Dish[dishs.length]; for(int i = 0; i < dishs.length; i++) { if(dishs[i] == null) this.dishs[i] = new Dish(); else this.dishs[i] = dishs[i]; } } public Dish searthDish(String dishName) { int num = 0; Dish flag = new Dish("notexist",0,false); for(int i = 0; i < dishs.length; i++) { if(dishs[i].getName().equals(dishName)) { num = i; flag = new Dish("exist",0,false); } } if(flag.getName().equals("exist")) return dishs[num]; else return flag; } public Dish addDish(String dishName,int unit_price,boolean t) { return new Dish(dishName,unit_price,t); } } class Record{ private int orderNum; private Dish d; private int portion; private int num; public Record() { orderNum = 0; d = new Dish(); portion = 0; num = 0; } public Record(int orderNum,Dish d,int portion,int num) { this.orderNum = orderNum; this.d = d; this.portion = portion; this.num = num; } public int getOrderNum(){ return orderNum; } public Dish getDish() { return d; } public int getPortion() { return portion; } public int getNum() { return num; } public int getPrice() { if(!d.getT()&&(portion < 0||portion > 3)) return 0; else if(d.getT()&&(portion < 0||portion > 3)) return 0; else { if(num > 15) return 0; else return d.getPrice(portion)*num; } } public void Priceshow() { if(portion < 10) { if(!d.getT()&&(portion < 0||portion > 3)) System.out.println(orderNum+" num out of range "+portion); else if(d.getT()&&(portion < 0||portion > 3)) System.out.println(orderNum+" portion out of range "+portion); else { if(num > 15) System.out.println(orderNum+" num out of range "+num); else System.out.println(orderNum+" "+d.getName()+" "+getPrice()); } } else System.out.println("wrong format"); } } class Order{ private Record[] records; private Menu menu; public Order(Record[] records,Menu menu) { this.records = new Record[records.length]; for(int i = 0; i < records.length; i++) if(records[i] == null) this.records[i] = new Record(); else this.records[i] = records[i]; this.menu = menu; } public Record[] getRecords() { return records; } public int getTotalPrice() { int TotalPrice = 0; for(int i = 0; i < records.length; i++) { TotalPrice += records[i].getPrice(); } return TotalPrice; } public Record addARecord(int orderNum,String dishName,int portion,int num) { Dish d = menu.searthDish(dishName); Record error = new Record(); if(d.getName().equals("")) return error; else return new Record(orderNum,d,portion,num); } public void delARecordByOrderNum(int orderNum) { int flag = findRecordByNum(orderNum); if(flag != -1) { if(records[flag].getNum() == 0) System.out.println("deduplication "+ orderNum); records[flag] = new Record(orderNum,new Dish(),0,0); } else System.out.println("delete error"); } public int findRecordByNum(int orderNum) { for(int i = 0; i < records.length; i++) { if(records[i].getOrderNum() == orderNum) { return i; } } return -1; } public void showOrder() { for(int i = 0; i < records.length; i++) { if(records[i].getNum() != 0) { int m = i; for(m = i; m > 0; m--) { if(records[m-1].getOrderNum() >= records[i].getOrderNum()) { System.out.println("record serial number sequence error"); records[i] = new Record(); break; } } if(m == 0) records[i].Priceshow(); } else { if(records[i].getOrderNum() == 1) System.out.println("wrong format"); } } } } class Table { private int num; private Order order; private LocalDate date; private LocalTime time; private double total; public Table(int num,String date,String time) { this.num = num; if(check(date)) { String[] DATE = date.split("/"); this.date = LocalDate.of(Integer.parseInt(DATE[0]),Integer.parseInt(DATE[1]),Integer.parseInt(DATE[2])); } else this.date = LocalDate.of(1,1,1); String[] TIME = time.split("/"); this.time = LocalTime.of(Integer.parseInt(TIME[0]),Integer.parseInt(TIME[1]),Integer.parseInt(TIME[2])); this.total = 0.0; } public void setOrder(Order order) { this.order = order; } public int getNum() { return num; } public Order getOrder() { return order; } public LocalDate getDate() { return date; } public LocalTime getTime() { return time; } public double getTotal() { return total; } public int getWeek() { return date.get(ChronoField.DAY_OF_WEEK); } public int OpeningHours(int week,LocalTime time,boolean T) { if(week <= 5) { if(T) { return 7; } else { if(time.isAfter(LocalTime.of(16,59,59))&&time.isBefore(LocalTime.of(20,30,1))) return 8; else if(time.isAfter(LocalTime.of(10,29,59))&&time.isBefore(LocalTime.of(14,30,1))) return 6; else return -1; } } else { if(time.isAfter(LocalTime.of(9,30,0))&&time.isBefore(LocalTime.of(21,30,0))) return 10; else return -1; } } public int getDiscountedPrice() { int discountedPrice = 0; Record[] records = order.getRecords(); double[] price = new double[records.length]; for(int i = 0; i < records.length; i++) { price[i] = records[i].getPrice()*OpeningHours(getWeek(),getTime(),records[i].getDish().getT())*0.1; if(price[i] - (int)price[i] >= 0.5) price[i] = (int)price[i] + 1; else price[i] = (int)price[i]; } for(int i = 0; i < price.length; i++) discountedPrice += (int)price[i]; return discountedPrice; } public void showTotal() { int judge = OpeningHours(getWeek(),getTime(),false); if(judge == -1) System.out.println("table"+" "+num+"out of opening hours"); else { if(date.isAfter(LocalDate.of(2020,1,1))&&date.isBefore(LocalDate.of(2023,12,31))) System.out.println("table"+" "+num+": "+order.getTotalPrice()+" "+getDiscountedPrice()); else System.out.println("not a valid time period"); } } public static boolean check (String str) { SimpleDateFormat sd = new SimpleDateFormat("yyyy/MM/dd"); try { sd.setLenient(false); sd.parse(str); } catch (Exception e) { return false; } return true; } }
类图如下
基础类的分析
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
2.实验五
7-1 菜单计价程序-5
在实验三的基础上对功能的增加:
1、菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+口味类型+英文空格+基础价格+"T"
例如:麻婆豆腐 川菜 9 T
菜价的计算方法:
周一至周五 7折, 周末全价。
特色菜的口味类型:川菜、晋菜、浙菜
川菜增加辣度值:辣度0-5级;对应辣度水平为:不辣、微辣、稍辣、辣、很辣、爆辣;
晋菜增加酸度值,酸度0-4级;对应酸度水平为:不酸、微酸、稍酸、酸、很酸;
浙菜增加甜度值,甜度0-3级;对应酸度水平为:不甜、微甜、稍甜、甜;
例如:麻婆豆腐 川菜 9 T
输入订单记录时如果是特色菜,添加口味度(辣/酸/甜度)值,格式为:序号+英文空格+菜名+英文空格+口味度值+英文空格+份额+英文空格+份数
例如:1 麻婆豆腐 4 1 9
单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值,spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出,例如:
acidity num out of range : 5
输出一桌的信息时,按辣、酸、甜度的顺序依次输出本桌菜各种口味的口味度水平,如果没有某个类型的菜,对应的口味(辣/酸/甜)度不输出,只输出已点的菜的口味度。口味度水平由口味度平均值确定,口味度平均值只综合对应口味菜系的菜计算,不做所有菜的平均。比如,某桌菜点了3份川菜,辣度分别是1、3、5;还有4份晋菜,酸度分别是,1、1、2、2,辣度平均值为3、酸度平均值四舍五入为2,甜度没有,不输出。
一桌信息的输出格式:table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格+"川菜"+数量+辣度+英文空格+"晋菜"+数量+酸度+英文空格+"浙菜"+数量+甜度。
如果整桌菜没有特色菜,则只输出table的基本信息,格式如下,注意最后加一个英文空格:
table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格
例如:table 1: 60 36 川菜 2 爆辣 浙菜 1 微甜
计算口味度时要累计本桌各类菜系所有记录的口味度总和(每条记录的口味度乘以菜的份数),再除以对应菜系菜的总份数,最后四舍五入。
注:本题要考虑代点菜的情况,当前桌点的菜要加上被其他桌代点的菜综合计算口味度平均值。
2、考虑客户订多桌菜的情况,输入时桌号时,增加用户的信息:
格式:table+英文空格+桌号+英文空格+":"+英文空格+客户姓名+英文空格+手机号+日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
例如:table 1 : tom 13670008181 2023/5/1 21/30/00
约束条件:客户姓名不超过10个字符,手机号11位,前三位必须是180、181、189、133、135、136其中之一。
输出结果时,先按要求输出每一桌的信息,最后按字母顺序依次输出每位客户需要支付的金额。不考虑各桌时间段的问题,同一个客户的所有table金额都要累加。
输出用户支付金额格式:
用户姓名+英文空格+手机号+英文空格+支付金额
代码如下
import java.util.*; // 菜品类 class Dish { String name; // 菜名 double unitPrice; // 单价 public Dish(String name, double unitPrice) { this.name = name; this.unitPrice = unitPrice; } double getPrice(int portion) { double price = unitPrice; if (portion == 2) { price *= 1.5; } else if (portion == 3) { price *= 2; } return Math.round(price); } } // 菜谱类 class Menu { List<Dish> dishes; // 菜品列表 public Menu() { dishes = new ArrayList<>(); } Dish searchDish(String dishName) { // 根据菜名在菜谱中查找菜品 for (Dish dish : dishes) { if (dish.name.equals(dishName)) { return dish; } } return null; } Dish addDish(String dishName, double unitPrice) { // 添加菜品到菜谱 Dish existingDish = searchDish(dishName); if (existingDish != null) { existingDish.unitPrice = unitPrice; return existingDish; } else { Dish newDish = new Dish(dishName, unitPrice); dishes.add(newDish); return newDish; } } } // 订单记录类 class OrderRecord { int orderNum; // 序号 Dish dish; // 菜品 int portion; // 份额 public OrderRecord(int orderNum, Dish dish, int portion) { this.orderNum = orderNum; this.dish = dish; this.portion = portion; } double getPrice() { // 计算菜品价格 return dish.getPrice(portion); } } // 订单类 class Order { List<OrderRecord> records; // 订单记录列表 public Order() { records = new ArrayList<>(); } double getTotalPrice() { // 计算订单的总价 double totalPrice = 0; for (OrderRecord record : records) { totalPrice += record.getPrice(); } return Math.round(totalPrice); } OrderRecord addRecord(int orderNum, String dishName, int portion) { // 添加订单记录 Dish dish = Menu.searchDish(dishName); if (dish == null) { System.out.println("** " + dishName + " does not exist"); return null; } OrderRecord record = new OrderRecord(orderNum, dish, portion); records.add(record); return record; } void removeRecord(int orderNum) { // 根据序号删除订单记录 OrderRecord record = findRecordByNum(orderNum); if (record == null) { System.out.println("delete error"); return; } records.remove(record); } OrderRecord findRecordByNum(int orderNum) { // 根据序号查找订单记录 for (OrderRecord record : records) { if (record.orderNum == orderNum) { return record; } } return null; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Menu menu = new Menu(); // 创建菜谱 Order order = new Order(); // 创建订单 while (true) { String input = scanner.nextLine(); if (input.equals("end")) { break; } String[] parts = input.split(" "); if (parts[0].startsWith("table")) { // 处理桌号标识 // 处理桌号标识 } else if (parts.length == 2) { // 处理菜单记录 String dishName = parts[0]; double unitPrice = Double.parseDouble(parts[1]); menu.addDish(dishName, unitPrice); } else if (parts.length == 4) { // 处理点菜记录 int orderNum = Integer.parseInt(parts[0]); String dishName = parts[1]; int portion = Integer.parseInt(parts[2]); order.addRecord(orderNum, dishName, portion); } else if (parts.length == 2 && parts[1].equals("delete")) { // 处理删除记录 int orderNum = Integer.parseInt(parts[0]); order.removeRecord(orderNum); } } for (OrderRecord record : order.records) { System.out.println(record.orderNum + " " + record.dish.name + " " + record.getPrice()); } System.out.println("Total price: " + order.getTotalPrice()); scanner.close(); } }
类图如下
新知识点:Math.round(),split(),
1.Math.round()可以简单的理解为四舍五入函数,在负数的情况下0.5不进位。
2. split 函数是用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回;
3.Integer.parseInt(String)就是将String字符类型数据转换为Integer整型数据,如果遇到不能转换的字符则会抛出异常!简而言之,这个代码就是用来把任何进制的数据转化成10进制的数据。
(1)parseInt(String s)
将字符串s转换为十进制的数字,默认为十进制
(2)parseInt(String s,int radix)
radix代表转换的进制,不写默认为十进制
3.期中
7-1 测验1-圆类设计
代码如下
import 期中.Point;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
double x1 = in.nextDouble();
double y1 = in.nextDouble();
double x2 = in.nextDouble();
double y2= in.nextDouble();
Point p1 = new Point(x1,y1);
Point p2 = new Point(x2,y2);
double getLength = x2 - x1;
double getHeight = y1 - y2;
double getArea = getLength * getHeight;
System.out.println(String.format("%.2f",getArea));
}
}
新知识点:Math类
在 Java 中 Math 类封装了常用的数学运算,提供了基本的数学操作,如指数、对数、平方根和三角函数等。Math 类位于 java.lang 包,它的构造方法是 private 的,因此无法创建 Math 类的对象,并且 Math 类中的所有方法都是类方法,可以直接通过类名来调用它们。
1.静态常量:
Math 类中包含 E 和 PI 两个静态常量,正如它们名字所暗示的,它们的值分别等于 e(自然对数)和 π(圆周率)。
调用 Math 类的 E 和 PI 两个常量,并将结果输出。代码如下:
- System.out.println("E 常量的值:" + Math.E);
- System.out.println("PI 常量的值:" + Math.PI);
2.求最大值、最小值和绝对值
在程序中常见的就是求最大值、最小值和绝对值问题,如果使用 Math 类提供的方法可以很容易实现。这些方法的说明如表 1 所示。
方法 | 说明 |
---|---|
static int abs(int a) | 返回 a 的绝对值 |
static long abs(long a) | 返回 a 的绝对值 |
static float abs(float a) | 返回 a 的绝对值 |
static double abs(double a) | 返回 a 的绝对值 |
static int max(int x,int y) | 返回 x 和 y 中的最大值 |
static double max(double x,double y) | 返回 x 和 y 中的最大值 |
static long max(long x,long y) | 返回 x 和 y 中的最大值 |
static float max(float x,float y) | 返回 x 和 y 中的最大值 |
static int min(int x,int y) | 返回 x 和 y 中的最小值 |
static long min(long x,long y) | 返回 x 和 y 中的最小值 |
static double min(double x,double y) | 返回 x 和 y 中的最小值 |
static float min(float x,float y) | 返回 x 和 y 中的最小值 |
3.求整运算
方法 | 说明 |
---|---|
static double ceil(double a) | 返回大于或等于 a 的最小整数 |
static double floor(double a) | 返回小于或等于 a 的最大整数 |
static double rint(double a) | 返回最接近 a 的整数值,如果有两个同样接近的整数,则结果取偶数 |
static int round(float a) | 将参数加上 1/2 后返回与参数最近的整数 |
static long round(double a) | 将参数加上 1/2 后返回与参数最近的整数,然后强制转换为长整型 |
7-2 测验2-类结构设计
代码如下
import java.util.Scanner; public class Circle { private double radius; public Circle() { // 默认构造函数 } public Circle(double radius) { this.radius = radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public double calculateArea() { return Math.PI * radius * radius; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double radius = scanner.nextDouble(); if (radius <= 0) { System.out.println("Wrong Format"); } else { Circle circle = new Circle(radius); double area = circle.calculateArea(); System.out.println(String.format("%.2f", area)); } scanner.close(); } }
7-3 测验3-继承与多态
代码如下
public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int choice = input.nextInt(); switch(choice) { case 1://Circle double radiums = input.nextDouble(); Shape circle = new Circle(radiums); printArea(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); printArea(rectangle); break; } }
public class Circle { private double radius; public Circle() { // 默认构造函数 } public Circle(double radius) { this.radius = radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public double calculateArea() { return Math.PI * radius * radius; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double radius = scanner.nextDouble(); if (radius <= 0) { System.out.println("Wrong Format"); } else { Circle circle = new Circle(radius); double area = circle.calculateArea(); System.out.println(String.format("%.2f", area)); } scanner.close(); } }
7-4 测验4-抽象类与接口
代码如下
abstract class Shape implements Comparable { public Shape() { } public abstract double getArea(); } interface Comparable { } class Point { double x,y; public Point() { } 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 = new Point(); Point lowerRightPoint = new Point(); public Rectangle() { } @Override public double getArea() { double Area = Length * Height; return Area; } public Rectangle(Point topLeftPoint, Point lowerRightPoint) { this.topLeftPoint = topLeftPoint; this.lowerRightPoint = lowerRightPoint; } public Point getTopLeftPoint() { return topLeftPoint; } public void setTopLeftPoint(Point topLeftPoint) { this.topLeftPoint = topLeftPoint; } public Point getLowerRightPoint() { return lowerRightPoint; } public void setLowerRightPoint(Point lowerRightPoint) { this.lowerRightPoint = lowerRightPoint; } double Length; double Height; } abstract class Shape implements Comparable { public Shape() { } public abstract double getArea(); } import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int choice = input.nextInt(); switch(choice) { case 1://Circle double radiums = input.nextDouble(); Shape circle = new Circle(radiums); double Area = 3.14159 * radiums * radiums; System.out.println(String.format("%.2f",Area)); 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); double getLength = x2 - x1; double getHeight = y1 - y2; double getArea = getLength * getHeight; System.out.println(String.format("%.2f",getArea)); break; } } private static void printArea(Shape shape) { shape.getArea(); } }
三.错误与分析
7-1 测验1-圆类设计
在计算圆的面积时,PI刚开始一直都在用数字来尝试,一直都没有得到正确答案,考试结束之后才知道Math.PI。
四.总结
1.难度逐渐上升,需要熟练的掌握Java中类的使用及Object和String类中一些方法的使用。其中,最主要的是对类的使用,如类的继承、封装和多态性等。更加深入地理解面向对象的编程思想,熟悉Java编程语言的类和对象的使用方法。重点是对Javabean的基本使用,类的广泛应用。通过这些练习,我们可以更深入地掌握Java编程语言的常用技术,如数据结构、输入输出、异常处理等。对于菜单系统已经无法独自完成题目要求。
五.改进建议
逻辑有些混乱,不能理清思路导致不能流畅地写出代码,并且使用的算法较为复杂,有些题目是可以用到更简单的方法,有许多简单易懂的算法和思路。
标签:总结,return,期中考试,double,int,Dish,new,public From: https://www.cnblogs.com/lsy--/p/17514490.html