目录
blog2
前言
关于难度和题目量
前三次大作业难度属于偏难水平,题目量也在可承受范围内
关于知识点
以下是一些总结的知识点:
- 类的定义:在Java中,使用class关键字来定义类,可以包含属性和方法。
- 继承和抽象类:通过extends关键字实现类的继承,抽象类使用abstract关键字定义,抽象方法需要在子类中实现。
- 接口:接口定义了一组方法的规范,类通过implements关键字实现接口,实现接口的类需要实现接口中定义的所有方法。
- HashMap和ArrayList:HashMap是Java中的哈希表实现,用于存储键值对;ArrayList是动态数组,用于存储对象的集合。
- 正则表达式:通过Pattern和Matcher类实现正则表达式的匹配和提取。
- 输入输出:使用Scanner类实现从控制台输入数据,System.out.println()用于输出数据。
- 排序:使用Collections.sort()方法对集合进行排序。
- 方法的重写和重载:在子类中重写父类的方法,实现不同的功能;方法重载是指在同一个类中,方法名相同但参数列表不同的情况。
- 深度复制: 复制之后的对象有一个新的地址
设计与分析
pta-7
一、项目简介
本文将介绍如何使用 Java 实现一个简单的电路系统。该系统可以模拟开关、调速器、风扇、灯泡等电子元件的工作状态,并根据用户输入的指令进行相应的操作。
二、项目实现
- 设备类:定义了设备类
Device
,其中包含设备名称、是否打开、引脚 1 电压、引脚 2 电压、电阻、电流等属性,以及显示设备信息、改变设备状态、调速等方法。 - 控制设备类:定义了控制设备类
ControlledDevice
,继承自设备类Device
,其中包含改变设备状态的方法。 - 控制设备类:定义了控制设备类
ControllingDevice
,继承自设备类Device
,其中包含调速方法。 - 串联电路类:定义了串联电路类
SeriesCircuit
,继承自设备类Device
,其中包含计算电流的方法。 - 开关类:定义了开关类
Switch
,继承自控制设备类ControllingDevice
,其中包含打开和关闭开关的方法。 - 调速器类:定义了调速器类
SpeedController
,继承自控制设备类ControllingDevice
,其中包含调速方法。 - 连续调速器类:定义了连续调速器类
ContinuousSpeedController
,继承自调速器类SpeedController
,其中包含改变调速值的方法。 - 换挡调速器类:定义了换挡调速器类
ShiftSpeedController
,继承自调速器类SpeedController
,其中包含换挡的方法。 - 风扇类:定义了风扇类
Fan
,继承自控制设备类ControlledDevice
,其中包含计算风速的方法。 - 吊扇类:定义了吊扇类
CeilingFan
,继承自风扇类Fan
,其中包含计算风速的具体实现。 - 灯泡类:定义了灯泡类
Lamp
,继承自控制设备类ControlledDevice
,其中包含计算亮度的方法。 - 白炽灯类:定义了白炽灯类
IncandescentLamp
,继承自灯泡类Lamp
,其中包含计算亮度的具体实现。 - 荧光灯类:定义了荧光灯类
FluorescentLamp
,继承自灯泡类Lamp
,其中包含计算亮度的具体实现。 - 主函数类:定义了主函数类
Main
,其中包含获取设备对象、处理用户指令、更新设备状态、显示设备信息等方法。
三、项目测试
- 输入设备指令,例如
[VCC 1-1]
、[1-2 2-1]
、[2-2 GND]
等。 - 输入控制指令,例如
#K1
、#F1+
、#L1:on
等。 - 输入结束指令
end
。 - 程序将输出设备的状态信息,例如开关的打开或关闭状态、调速器的当前速度、风扇的风速、灯泡的亮度等。
四、代码示例
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<String> stringArrayList = new ArrayList<>();
while (true) {
String s = scanner.nextLine();
if (s.equals("end")) {
break;
} else {
stringArrayList.add(s);
}
}
ArrayList<Device> deviceArrayList = new ArrayList<>();
for (String s : stringArrayList) {
if (GetDevice(s)!= null) {
deviceArrayList.add(GetDevice(s));
}
}
deviceArrayList.remove(deviceArrayList.size() - 2);
a(stringArrayList, deviceArrayList);
if (b(deviceArrayList)) {
if (deviceArrayList.size() == 1) {
deviceArrayList.get(0).setPin1(220);
} else {
for (int i = 0; i < deviceArrayList.size() - 1; i++) {
deviceArrayList.get(i).SpeedRegulation();
deviceArrayList.get(i + 1).setPin1(deviceArrayList.get(i).getPin2());
}
}
} else {
for (Device device : deviceArrayList) {
device.setPin1(0);
device.setPin2(0);
}
}
for (Device device : deviceArrayList) {
if (device instanceof Switch) {
device.show();
}
}
for (Device device : deviceArrayList) {
if (!(device instanceof Switch)) {
device.show();
}
}
}
}
五、总结
通过以上步骤,我们可以使用 Java 实现一个简单的电路系统。该系统可以模拟开关、调速器、风扇、灯泡等电子元件的工作状态,并根据用户输入的指令进行相应的操作。
六、代码分析
Metrics Details For File 'pta5.java'
Parameter Value
========= =====
Project Directory C:\Users\11813\Desktop\java文件
Project Name blog2
Checkpoint Name Baseline
File Name pta5.java
Lines 384*
Statements 274
Percent Branch Statements 21.5
Method Call Statements 95
Percent Lines with Comments 0.0
Classes and Interfaces 14
Methods per Class 3.64
Average Statements per Method 3.71
Line Number of Most Complex Method 362
Name of Most Complex Method Main.main()
Maximum Complexity 16
Line Number of Deepest Block 317
Maximum Block Depth 6
Average Block Depth 2.27
Average Complexity 2.25
Most Complex Methods in 13 Class(es): Complexity, Statements, Max Depth, Calls
CeilingFan.CalculateSpeed() 5, 11, 3, 3
CeilingFan.CeilingFan() 1, 1, 2, 1
CeilingFan.show() 1, 2, 2, 2
ContinuousSpeedController.change() 1, 1, 2, 0
ContinuousSpeedController.ContinuousSpeedController() 1, 1, 2, 1
ContinuousSpeedController.show() 1, 1, 2, 1
ContinuousSpeedController.SpeedRegulation() 1, 1, 2, 1
ControlledDevice.ControlledDevice() 1, 1, 2, 1
ControllingDevice.ControllingDevice() 1, 1, 2, 1
Device.change() 1, 0, 0, 0
Device.Device() 1, 0, 0, 0
Device.getI() 1, 1, 2, 0
Device.getName() 1, 1, 2, 0
Device.getPin1() 1, 1, 2, 0
Device.getPin2() 1, 1, 2, 0
Device.getR() 1, 1, 2, 0
Device.isOpen() 1, 1, 2, 0
Device.setI() 1, 1, 2, 0
Device.setName() 1, 1, 2, 0
Device.setOpen() 1, 1, 2, 0
Device.setPin1() 1, 1, 2, 0
Device.setPin2() 1, 1, 2, 0
Device.setR() 1, 1, 2, 0
Device.show() 1, 0, 0, 0
Device.SpeedRegulation() 1, 0, 0, 0
Fan.Fan() 1, 1, 2, 1
Fan.getSpeed() 1, 1, 2, 0
Fan.setSpeed() 1, 1, 2, 0
FluorescentLamp.CalculateLux() 3, 5, 3, 2
FluorescentLamp.show() 1, 2, 2, 2
IncandescentLamp.CalculateLux() 7, 9, 3, 4
IncandescentLamp.show() 1, 2, 2, 2
Lamp.getLux() 1, 1, 2, 0
Lamp.Lamp() 1, 2, 2, 1
Lamp.setLux() 1, 1, 2, 0
Main.a() 14, 32, 6, 18
Main.b() 3, 4, 4, 1
Main.GetDevice() 13, 38, 5, 21
Main.main() 16, 30, 5, 19
ShiftSpeedController.change() 5, 4, 3, 2
ShiftSpeedController.ShiftSpeedController() 1, 2, 2, 1
ShiftSpeedController.show() 1, 1, 2, 1
ShiftSpeedController.SpeedRegulation() 1, 1, 2, 1
SpeedController.SpeedController() 1, 1, 2, 1
Switch.change() 3, 4, 3, 0
Switch.isOpen() 1, 1, 2, 0
Switch.setOpen() 1, 1, 2, 0
Switch.show() 3, 6, 3, 1
Switch.SpeedRegulation() 3, 4, 3, 2
Switch.Switch() 1, 2, 2, 2
Switch.Switch() 1, 1, 2, 0
Block Depth Statements
0 18
1 67
2 88
3 48
4 32
5 18
6 3
7 0
8 0
9+ 0
pta-8
一、项目简介
本文将介绍如何使用 Java 实现一个简单的电路系统。该系统可以模拟开关、调速器、风扇、灯泡等电子元件的工作状态,并根据用户输入的指令进行相应的操作。
二、项目实现
- 设备类:定义了设备类
Device
,其中包含设备名称、是否打开、电阻、电流、电压等属性,以及计算电阻、计算电流、显示设备信息等方法。 - 控制设备类:定义了控制设备类
ControlledDevice
,继承自设备类Device
,其中包含改变设备状态的方法。 - 控制设备类:定义了控制设备类
ControllingDevice
,继承自设备类Device
,其中包含调速方法。 - 开关类:定义了开关类
Switch
,继承自控制设备类ControllingDevice
,其中包含打开和关闭开关的方法。 - 调速器类:定义了调速器类
SpeedController
,继承自控制设备类ControllingDevice
,其中包含调速方法。 - 连续调速器类:定义了连续调速器类
ContinuousSpeedController
,继承自调速器类SpeedController
,其中包含改变调速值的方法。 - 换挡调速器类:定义了换挡调速器类
ShiftSpeedController
,继承自调速器类SpeedController
,其中包含换挡的方法。 - 风扇类:定义了风扇类
Fan
,继承自控制设备类ControlledDevice
,其中包含计算风速的方法。 - 吊扇类:定义了吊扇类
CeilingFan
,继承自风扇类Fan
,其中包含计算风速的具体实现。 - 落地扇类:定义了落地扇类
FloorFan
,继承自风扇类Fan
,其中包含计算风速的具体实现。 - 灯泡类:定义了灯泡类
Lamp
,继承自控制设备类ControlledDevice
,其中包含计算亮度的方法。 - 白炽灯类:定义了白炽灯类
IncandescentLamp
,继承自灯泡类Lamp
,其中包含计算亮度的具体实现。 - 荧光灯类:定义了荧光灯类
FluorescentLamp
,继承自灯泡类Lamp
,其中包含计算亮度的具体实现。 - 线路类:定义了线路类
Line
,其中包含设备列表、是否为主线等属性,以及计算电阻、计算电流、显示设备信息等方法。 - 并联电路类:定义了并联电路类
ParallelCircuits
,其中包含设备列表等属性,以及计算电阻、计算电流、显示设备信息等方法。 - 输入类:定义了输入类
Input
,其中包含输入数据、解析数据等方法。 - 主函数类:定义了主函数类
Main
,其中包含读取输入数据、解析输入数据、计算电路状态、显示设备信息等方法。
三、项目测试
- 输入设备指令,例如
#T1:[IN K1]
、#T2:[VCC F1+]
、#M1:T1 T2
等。 - 输入控制指令,例如
#K1
、#F1+
、#L1:on
等。 - 输入结束指令
end
。 - 程序将输出设备的状态信息,例如开关的打开或关闭状态、调速器的当前速度、风扇的风速、灯泡的亮度等。
四、代码示例
import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Input input = new Input();
input.getInputData();
TreeMap<String, Device> deviceTreeMap = new TreeMap<>(new ReverseComparator());
ArrayList<Line> list = new ArrayList<>();
input.parse(deviceTreeMap, list);
for (Line line : list) {
if (line.getIsMain() == 1) {
line.countR();
}
}
for (Line line : list) {
if (line.getIsMain() == 1) {
line.setU(220);
int flag = 0;
for (Device device : line.getDeviceArrayList()) {
if (device instanceof SpeedController) {
device.SpeedRegulation();
line.is();
if (line.isOpen()) {
line.setI((220 - device.getU()) / line.getR());
line.countI();
flag = 1;
}
}
}
if (flag == 0) {
line.is();
if (line.isOpen()) {
line.setI(220 / line.getR());
line.countI();
}
}
}
}
for (Device device : deviceTreeMap.values()) {
device.show();
}
}
}
五、总结
通过以上步骤,我们可以使用 Java 实现一个简单的电路系统。该系统可以模拟开关、调速器、风扇、灯泡等电子元件的工作状态,并根据用户输入的指令进行相应的操作。
六、代码分析
Metrics Details For File 'pta6.java'
Parameter Value
========= =====
Project Directory C:\Users\11813\Desktop\java文件
Project Name blog2
Checkpoint Name Baseline
File Name pta6.java
Lines 746*
Statements 572
Percent Branch Statements 17.0
Method Call Statements 263
Percent Lines with Comments 0.3
Classes and Interfaces 18
Methods per Class 4.72
Average Statements per Method 5.09
Line Number of Most Complex Method 557
Name of Most Complex Method Input.parse()
Maximum Complexity 30
Line Number of Deepest Block 581
Maximum Block Depth 9+
Average Block Depth 2.60
Average Complexity 2.25
Most Complex Methods in 18 Class(es): Complexity, Statements, Max Depth, Calls
CeilingFan.CeilingFan() 1, 1, 2, 1
CeilingFan.Copy() 1, 9, 2, 6
CeilingFan.Count() 5, 11, 3, 3
CeilingFan.show() 1, 2, 2, 2
ContinuousSpeedController.change() 1, 1, 2, 0
ContinuousSpeedController.ContinuousSpeedController() 1, 1, 2, 1
ContinuousSpeedController.Copy() 1, 9, 2, 6
ContinuousSpeedController.getA() 1, 1, 2, 0
ContinuousSpeedController.setA() 1, 1, 2, 0
ContinuousSpeedController.show() 1, 1, 2, 1
ContinuousSpeedController.SpeedRegulation() 1, 1, 2, 1
ControlledDevice.ControlledDevice() 1, 1, 2, 1
ControllingDevice.ControllingDevice() 1, 1, 2, 1
Device.change() 1, 0, 0, 0
Device.Copy() 1, 6, 2, 0
Device.Count() 1, 0, 0, 0
Device.countI() 1, 0, 0, 0
Device.countR() 1, 1, 2, 0
Device.Device() 1, 0, 0, 0
Device.getI() 1, 1, 2, 0
Device.getName() 1, 1, 2, 0
Device.getR() 1, 1, 2, 0
Device.getU() 1, 1, 2, 0
Device.is() 1, 0, 0, 0
Device.isOpen() 1, 1, 2, 0
Device.setI() 1, 1, 2, 0
Device.setName() 1, 1, 2, 0
Device.setOpen() 1, 1, 2, 0
Device.setR() 1, 1, 2, 0
Device.setU() 1, 1, 2, 0
Device.show() 1, 0, 0, 0
Device.SpeedRegulation() 1, 0, 0, 0
Fan.Fan() 1, 1, 2, 1
Fan.getSpeed() 1, 1, 2, 0
Fan.setSpeed() 1, 1, 2, 0
FloorFan.Copy() 1, 9, 2, 6
FloorFan.Count() 11, 17, 3, 6
FloorFan.FloorFan() 1, 1, 2, 1
FloorFan.show() 1, 2, 2, 2
FluorescentLamp.Copy() 1, 9, 2, 6
FluorescentLamp.Count() 3, 5, 3, 2
FluorescentLamp.FluorescentLamp() 1, 1, 2, 1
FluorescentLamp.show() 1, 2, 2, 2
IncandescentLamp.Copy() 1, 9, 2, 6
IncandescentLamp.Count() 7, 9, 3, 4
IncandescentLamp.IncandescentLamp() 1, 1, 2, 1
IncandescentLamp.show() 1, 2, 2, 2
Input.a() 7, 10, 5, 12
Input.deepCopyArrayList() 2, 4, 3, 3
Input.getInputData() 4, 8, 4, 3
Input.parse() 30, 99, 9, 80
Lamp.getLux() 1, 1, 2, 0
Lamp.Lamp() 1, 2, 2, 1
Lamp.setLux() 1, 1, 2, 0
Line.Copy() 1, 10, 2, 7
Line.countI() 3, 9, 3, 7
Line.countR() 3, 9, 3, 4
Line.getDeviceArrayList() 1, 1, 2, 0
Line.getIsMain() 1, 1, 2, 0
Line.is() 3, 6, 4, 4
Line.setDeviceArrayList() 1, 1, 2, 0
Line.setIsMain() 1, 1, 2, 0
Main.b() 3, 4, 4, 1
Main.main() 11, 27, 7, 20
ParallelCircuits.Copy() 1, 9, 2, 6
ParallelCircuits.countI() 4, 14, 4, 8
ParallelCircuits.countR() 7, 17, 5, 6
ParallelCircuits.getDeviceArrayList() 1, 1, 2, 0
ParallelCircuits.is() 3, 6, 4, 4
ParallelCircuits.setDeviceArrayList() 1, 1, 2, 0
ReverseComparator.compare() 9, 23, 4, 6
ShiftSpeedController.change() 5, 4, 3, 2
ShiftSpeedController.Copy() 1, 9, 2, 6
ShiftSpeedController.getArr() 1, 1, 2, 0
ShiftSpeedController.getShift() 1, 1, 2, 0
ShiftSpeedController.setShift() 1, 1, 2, 0
ShiftSpeedController.ShiftSpeedController() 1, 2, 2, 1
ShiftSpeedController.show() 1, 1, 2, 1
ShiftSpeedController.SpeedRegulation() 1, 1, 2, 1
SpeedController.SpeedController() 1, 1, 2, 1
Switch.change() 3, 4, 3, 3
Switch.Copy() 1, 7, 2, 5
Switch.show() 3, 6, 3, 2
Switch.Switch() 1, 2, 2, 2
Switch.Switch() 1, 1, 2, 1
Block Depth Statements
0 21
1 118
2 238
3 59
4 42
5 53
6 22
7 5
8 10
9+ 4
改进建议
- 异常处理:
- 在
input
方法中,当用户输入end
时,可能会导致scanner.nextLine
抛出NoSuchElementException
。可以在try-catch
块中捕获该异常,并优雅地处理结束输入的情况。 - 在解析输入数据的过程中,如果遇到格式不正确的行,可以抛出自定义的异常,并在
main
方法中捕获和处理该异常,而不是直接打印错误信息。
- 在
- 代码注释:
- 在关键代码段添加注释,解释其功能和逻辑。
- 为类和方法添加文档注释,说明其作用、参数和返回值。
- 用户界面:
- 提供命令行选项,让用户可以指定输入文件和输出文件的路径。
- 考虑添加一些简单的交互提示,例如提示用户输入
end
来结束输入。
- 数据验证:
- 在解析问题库和试卷时,检查题号是否重复。
- 对于答案,检查其是否符合问题的类型(单选、多选、填空等)。
- 性能优化:
- 对于频繁使用的
HashMap
,可以考虑在创建时指定初始容量,以提高性能。 - 如果需要处理大量数据,可以考虑使用
BufferedReader
来逐行读取输入文件,而不是一次性读取所有内容到内存中。
- 对于频繁使用的
- 代码结构:
- 将不同类型的问题(单选、多选、填空)抽象为不同的类,继承自一个共同的父类,以提高代码的可读性和可维护性。
- 将解析输入数据的逻辑提取到单独的类中,以减少代码的复杂度。
- 测试用例:
- 编写更多的测试用例,覆盖各种情况,包括边界情况和异常情况。
- 使用测试框架(如JUnit)来自动化测试过程。
- 日志记录:
- 在关键位置添加日志记录,以便在出现问题时能够快速定位和解决。
- 可以将日志输出到文件或控制台。
- 扩展性:
- 设计代码时考虑到未来可能的扩展,例如支持新的问题类型或文件格式。
- 使用接口或抽象类来定义一些通用的功能,以便在需要时进行扩展。
- 代码风格:
- 遵循统一的代码风格,例如使用空格或制表符进行缩进、命名变量和方法时使用有意义的名称等。
- 可以使用代码格式化工具来自动格式化代码,确保风格一致。
以下是一个简单的示例,展示了如何添加异常处理和日志记录:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
class QuestionBase {
// 其他代码不变
}
abstract class Question {
// 其他代码不变
}
class SingleQuestion extends Question {
// 其他代码不变
}
class GapFillQuestion extends Question {
// 其他代码不变
}
class MulQuestion extends Question {
// 其他代码不变
}
class QuestionInPaper {
// 其他代码不变
}
class TextPaper {
// 其他代码不变
}
class Answer {
// 其他代码不变
}
class AnswerPaper implements Comparable<AnswerPaper> {
// 其他代码不变
}
class Student {
// 其他代码不变
}
class Parse {
// 其他代码不变
// 新增方法:处理输入异常
public static ArrayList<String> input() {
Scanner scanner = new Scanner(System.in);
ArrayList<String> stringArrayList = new ArrayList<>();
try {
while (true) {
String str4 = scanner.nextLine();
if (str4.equals("end")) {
break;
}
stringArrayList.add(str4);
}
} catch (Exception e) {
// 处理异常情况,例如输入异常
System.out.println("输入异常,请检查输入内容。");
}
return stringArrayList;
}
// 新增方法:记录日志
public static void log(String message) {
// 可以将日志输出到文件或控制台
System.out.println("Log: " + message);
}
}
class Show {
// 其他代码不变
}
public class Main {
public static void main(String[] args) {
ArrayList<String> stringArrayList = Parse.input(); // 输入数据用 list 的方式保存
HashMap<Integer, Question> questionHashMap = new HashMap<>(); // question.N question
Parse parse = new Parse();
questionHashMap = parse.Toquestionhashmap(stringArrayList);
questionHashMap = parse.DeleteQuestion(questionHashMap, stringArrayList);
HashMap<Integer, TextPaper> textPaperHashMap = parse.ToHashPaper(stringArrayList, questionHashMap);
HashMap<String, Student> stringStudentHashMap = parse.ToStudentHashmap(stringArrayList);
ArrayList<AnswerPaper> answerPaperArrayList = parse.ToAnswerpaperArraylist(stringArrayList, textPaperHashMap);
ArrayList<TextPaper> textPaperArrayList = parse.TotextPaperArrayList(stringArrayList, questionHashMap);
Show show = new Show();
show.ShowWrongFormat(stringArrayList);
show.ShowTextPaperScore(textPaperArrayList);
Collections.sort(answerPaperArrayList);
for (AnswerPaper answerPaper : answerPaperArrayList) {
answerPaper = show.show1(answerPaper);
show.show2(answerPaper, stringStudentHashMap);
}
}
}
在上述示例中,我们添加了一个input
方法来处理输入异常,并使用log
方法记录日志。这样可以提高代码的健壮性和可维护性。