Mở đầu
Tập bài tập 4 bao gồm ba nhiệm vụ lập trình chính:
- Thiết kế lớp nhân vật trong trường học: Bài toán hướng đối tượng cơ bản, chú trọng kế thừa và quản lý thuộc tính
- Thiết kế lớp sinh viên và sinh viên đại học: Liên quan đến kế thừa và kiểm soát quyền truy cập, tập trung vào xây dựng lớp và ghi đè phương thức
- Chương trình chấm điểm câu hỏi: Phát triển đa mô-đun, thách thức trong phân tích đầu vào, thiết kế hướng đối tượng và thực hiện logic phức tạp.
Từ tổng thể, bộ đề kiểm tra kỹ năng thiết kế lớp, kế thừa, đa hình, phân tích đầu ra/đầu vào với mức độ ngày càng sâu sắc, yêu cầu cao về khả năng phân tích logic và kỹ năng lập trình. Đặc biệt câu thứ ba liên quan đến xử lý dữ liệu, mở rộng quy tắc chấm điểm, là trọng tâm của phân tích này.
Tập bài tập 5 gồm hai bài lập trình:
- Câu 1 mô phỏng mạch điện thông minh gia đình là bài toán thiết kế hệ thống phức tạp, khó khăn nằm ở thiết kế lớp trừu tượng và thực hiện logic kết nối thiết bị
- Câu 2 thao tác tập hợp là bài debug cổ điển, mức độ vừa phải nhưng cần hiểu rõ về giao diện tập hợp và lớp triển khai cụ thể
- Câu 3 chưa hoàn thành
Tập bài tập 6 chỉ có một bài duy nhất, là phiên bản nâng cấp mô phỏng mạch điện đồ nội thất thông minh. So với thiết kế và phân tích mạch nối tiếp, việc thực hiện ban đầu kiểm soát trạng thái thiết bị và tính toán điện áp trong mạch đơn giản, bộ bài tập này giới thiệu mạch song song, nâng cao độ phức tạp cấu trúc mạch, đồng thời tăng thêm thiết kế thiết bị điều khiển và logic trạng thái.
Thiết kế và phân tích
Tập bài tập 4
Bài đầu tiên
Phân tích sơ đồ lớp:
Sơ đồ lớp cho bài toán này như sau:
Phân tích mã nguồn:
Ứng dụng đa hình: Thông qua việc ghi đè phương thức display(), đạt được sự khác biệt hành vi giữa các lớp con.
Cấu trúc mã nguồn:
public class Person {
protected String fullName;
protected int yearsOld;
public Person(String fullName, int yearsOld) { ... }
public void display() { ... }
}
public class Learner extends Person { ... }
public class Worker extends Person { ... }
public class Professor extends Worker { ... }
public class Assistant extends Worker { ... }
Bài thứ hai
Phân tích mã nguồn:
Bài này tập trung vào thực hiện kế thừa và thiết lập quyền truy cập hợp lý. Thuộc tính fullName và yearsOld của lớp cha Learner là protected, lớp con Undergraduate có thể truy cập trực tiếp.
Phân tích sơ đồ lớp:
Learner:
- Thuộc tính: fullName (protected), yearsOld (protected)
- Phương thức: display()
Undergraduate kế thừa từ Learner:
- Thuộc tính: major (private)
- Phương thức: display() (ghi đè)
Phân tích mã nguồn:
Sự linh hoạt của kế thừa: Qua việc ghi đè phương thức display(), lớp con có thể mở rộng chức năng của lớp cha.
Đoạn mã nguồn:
public class Learner {
protected String fullName;
protected int yearsOld;
public Learner(String fullName, int yearsOld) { ... }
public void display() { ... }
}
public class Undergraduate extends Learner {
private String major;
public Undergraduate(String fullName, int yearsOld, String major) { ... }
@Override
public void display() { ... }
}
Bài thứ ba
Phân tích mã nguồn:
Mã nguồn này chứa các mô-đun chức năng chính sau:
- Quản lý ngân hàng câu hỏi: Hỗ trợ nhiều loại câu hỏi, bao gồm câu hỏi thường, câu hỏi trắc nghiệm, câu hỏi nhiều lựa chọn, câu hỏi điền khuyết
- Quản lý đề thi: Định nghĩa đề thi và các câu hỏi tương ứng cùng điểm số
- Quản lý sinh viên: Ghi nhận thông tin sinh viên và nội dung trả lời của họ
- Xử lý bài làm và chấm điểm: Thực hiện chấm điểm bài làm sinh viên, hỗ trợ điểm một phần và logic chấm điểm đặc biệt theo loại câu hỏi
- Cảnh báo và đầu ra hệ thống: Như tổng điểm đề thi không bằng 100, số hiệu đề thi không hợp lệ...
Giải thích chức năng mã nguồn chính:
1. Thiết kế lớp:
Mã nguồn thiết kế nhiều lớp hướng đối tượng, mỗi lớp đảm nhận chức năng độc lập:
Question (lớp cơ sở câu hỏi):
- Bao gồm nội dung câu hỏi (content) và đáp án (answer)
- Cung cấp cơ sở kế thừa cho các loại câu hỏi khác
MultiSelectQuestion và FillBlankQuestion (các lớp con câu hỏi):
- Kế thừa từ Question, lần lượt xử lý câu hỏi nhiều lựa chọn và câu hỏi điền khuyết
ExamPaper (lớp đề thi):
- Bao gồm số hiệu đề thi (id), danh sách số hiệu câu hỏi (questionIds), điểm từng câu (scores) và tổng điểm (totalScore)
Student (lớp sinh viên):
- Bao gồm số hiệu sinh viên (id) và tên (name)
ResponseSheet (lớp bài làm):
- Bao gồm số hiệu đề thi (examPaperId), số hiệu sinh viên (studentId), câu trả lời của sinh viên (answers)
2. Luồng công việc chương trình chính:
Lõi chương trình chính bao gồm các phần sau:
(1) Phân tích đầu vào:
Sử dụng biểu thức chính quy để phân tích đầu vào người dùng, xử lý dữ liệu tương ứng dựa trên tiền tố khác nhau.
Dữ liệu câu hỏi:
#N, #Z, #K lần lượt tương ứng với câu hỏi thường, câu hỏi nhiều lựa chọn và câu hỏi điền khuyết, tạo đối tượng Question lưu vào questions.
Dữ liệu đề thi:
#T tương ứng với đề thi, phân tích số hiệu câu hỏi và điểm số, lưu vào testPapers.
Dữ liệu sinh viên:
#X phân tích thông tin sinh viên, lưu vào students.
Dữ liệu bài làm:
#S phân tích bài làm sinh viên và câu trả lời, lưu vào responseSheets.
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line;
Pattern questionPattern = Pattern.compile("#N:(\\d+) #Q:(.+?) #A:(.+)");
Pattern multiSelectPattern = Pattern.compile("#Z:(\\d+) #Q:(.+?) #A:(.+)");
Pattern fillBlankPattern = Pattern.compile("#K:(\\d+) #Q:(.+?) #A:(.+)");
Pattern examPattern = Pattern.compile("#T:(\\d+)(.*)");
Pattern studentPattern = Pattern.compile("#X:(.+)");
Pattern answerPattern = Pattern.compile("#S:(\\d+) (\\w+) #A:(.*)");
(2) Phát hiện cảnh báo: Nếu tổng điểm đề thi không phải 100, xuất thông tin cảnh báo: alert: full score of test paper X is not 100 points
(3) Logic chấm điểm: Hoàn thành chấm điểm trong phương thức evaluate(), chủ yếu bao gồm các bước sau:
Chấm điểm câu hỏi nhiều lựa chọn:
- Nếu câu trả lời của sinh viên hoàn toàn trùng khớp đáp án đúng, được điểm tối đa
- Nếu chỉ đúng một phần (thiếu hoặc chọn sai), được nửa điểm
- Nếu không có mục trùng khớp, được 0 điểm
Chấm điểm câu hỏi điền khuyết:
- Hoàn toàn đúng: Được điểm tối đa
- Trùng khớp một phần: Được nửa điểm
- Câu trả lời sai hoặc để trống: Được 0 điểm
Chấm điểm câu hỏi thường:
- Câu trả lời hoàn toàn trùng khớp: Được điểm; ngược lại không được điểm
Xuất kết quả:
Định dạng: Kết quả chấm điểm từng câu + Tổng điểm sinh viên
3. Phân tích biểu thức chính quy:
Biểu thức chính quy dùng để nhận diện mẫu đầu vào:
Mẫu câu hỏi:
- Câu hỏi thường: #N:(\\d+) #Q:(.+?) #A:(.+)
- Câu hỏi nhiều lựa chọn: #Z:(\\d+) #Q:(.+?) #A:(.+)
- Câu hỏi điền khuyết: #K:(\\d+) #Q:(.+?) #A:(.+)
- Mẫu đề thi: #T:(\\d+)(.*)
Trích xuất số hiệu đề thi và điểm từng câu.
Mẫu dữ liệu sinh viên: #X:(.+)
Trích xuất số hiệu và tên sinh viên.
Mẫu bài làm: #S:(\\d+) (\\w+) #A:(.*)
Trích xuất câu trả lời sinh viên, phân bổ nội dung câu trả lời theo số hiệu câu hỏi.
Tập bài tập 5
Bài đầu tiên
1. Mô-đun chức năng cốt lõi:
(1) Lớp trừu tượng Component
Định nghĩa hành vi và thuộc tính cơ bản cho tất cả thiết bị, mọi thiết bị đều kế thừa từ lớp này.
Biến thành viên cốt lõi:
- identifier: định danh thiết bị, như K1, F2...
- category: loại thiết bị, phân biệt các loại thiết bị, như K (công tắc), F (bộ điều tốc phân cấp)...
- inputVoltage và outputVoltage: điện áp đầu vào và đầu ra
Phương thức cốt lõi:
- setInputVoltage(double voltage): Thiết lập điện áp đầu vào cho thiết bị
- computeOutputVoltage(): Tính toán điện áp đầu ra (do lớp con thực hiện)
- computeState(): Tính toán trạng thái thiết bị, mặc định không làm gì
- getOutputState(): Lấy trạng thái đầu ra của thiết bị, dùng để hiển thị cuối cùng
- compareTo(Component other): Hỗ trợ sắp xếp thiết bị (theo ưu tiên loại thiết bị và số hiệu)
(2) Phân loại thiết bị:
Thiết bị điều khiển (ControlComponent)
Thiết bị điều khiển chịu trách nhiệm điều chỉnh điện áp và áp dụng điều khiển lên thiết bị khác, chia thành các loại sau:
SwitchComponent (công tắc)
- Điều khiển dòng điện trong mạch thông qua trạng thái (0: bật hoặc 1: đóng)
- Phương pháp chuyển đổi trạng thái: toggle()
- Quy tắc điện áp đầu ra:
- bật (mạch hở): Điện áp đầu ra là 0
- đóng (mạch kín): Điện áp đầu ra là điện áp đầu vào
DiscreteSpeedController (bộ điều tốc phân cấp)
- Hỗ trợ 4 cấp (0-3), điều khiển tỷ lệ điện áp đầu ra thông qua cấp độ
- Phương pháp điều chỉnh cấp độ: adjustLevel(char operation), hỗ trợ tăng/giảm cấp độ
- Quy tắc điện áp đầu ra: điện áp đầu vào nhân với tỷ lệ tương ứng cấp độ (0.0, 0.3, 0.6, 0.9)
ContinuousSpeedController (bộ điều tốc liên tục)
- Tỷ lệ điện áp đầu ra có thể điều chỉnh chính xác (0.00-1.00)
- Phương pháp thiết lập tham số: setParameter(double param), điều khiển tỷ lệ đầu ra
- Quy tắc điện áp đầu ra: điện áp đầu vào nhân với giá trị tham số
Thiết bị bị điều khiển (ControlledComponent)
Thiết bị bị điều khiển tính toán trạng thái riêng dựa trên điện áp đầu vào, nhưng không ảnh hưởng đến dòng điện trong mạch.
IncandescentLight (đèn sợi đốt)
- Độ sáng thay đổi tuyến tính theo điện áp đầu vào (10V-220V tương ứng độ sáng 50-200)
- Quy tắc tính độ sáng: điện áp đầu vào dưới 10V thì độ sáng là 0; vượt quá 220V thì độ sáng là 200
CeilingFan (quạt trần)
- Tốc độ quay thay đổi tuyến tính theo điện áp đầu vào (80V-150V tương ứng tốc độ 80rpm-360rpm)
- Dưới 80V thì dừng quay (tốc độ là 0), vượt quá 150V thì tốc độ là 360rpm
DaylightLamp (đèn huỳnh quang)
- Điện áp đầu vào là 0 thì độ sáng là 0, ngược lại độ sáng cố định là 180
(3) Lõi mô phỏng mạch điện:
Phân tích đầu vào
- Thông tin kết nối: Dạng [K1-F1] biểu thị mối quan hệ kết nối giữa các thiết bị
- Lệnh điều khiển: Dạng #K1 hoặc #F1+, dùng để điều khiển hành vi thiết bị
Tạo và kết nối thiết bị
- createComponent(String deviceId): Tạo đối tượng thiết bị tương ứng dựa trên định danh thiết bị
- simulateCircuit(): Mô phỏng dòng điện và thay đổi trạng thái thiết bị trong mạch
- Thiết lập điện áp ban đầu là 220V (VCC)
- Thiết bị điều khiển ảnh hưởng điện áp đầu vào của thiết bị phía sau, thiết bị bị điều khiển không ảnh hưởng mạch
Phân tích lệnh điều khiển
Hỗ trợ ba loại lệnh điều khiển:
- Lệnh chuyển đổi công tắc (#K1)
- Lệnh điều chỉnh cấp độ bộ điều tốc phân cấp (#F1+ hoặc #F1-)
- Lệnh thiết lập tham số bộ điều tốc liên tục (#L1:0.75)
2. Logic chạy:
(1) Xử lý đầu vào
Phân tích mối quan hệ kết nối, xây dựng ánh xạ thiết bị và danh sách mạch.
Theo lệnh điều khiển đầu vào, điều chỉnh trạng thái thiết bị.
(2) Mô phỏng mạch điện
Trong trạng thái ban đầu, tính toán điện áp đầu ra theo cấu hình thiết bị mặc định.
Sau khi áp dụng lệnh điều khiển, mô phỏng lại dòng điện và tính toán trạng thái thiết bị.
(3) Xuất kết quả
Sắp xếp thiết bị theo loại và số hiệu.
Xuất trạng thái mỗi thiết bị, định dạng @định danhThiếtBị:trạngThái.
// Xử lý chân1
Component component1 = null;
if (!pin1.equals("VCC") && !pin1.equals("GND")) {
String deviceId1 = pin1.split("-")[0];
component1 = componentsMap.get(deviceId1);
if (component1 == null) {
component1 = createComponent(deviceId1);
if (component1 != null) {
componentsMap.put(deviceId1, component1);
circuit.add(component1);
}
}
}
// Xử lý chân2
Component component2 = null;
if (!pin2.equals("VCC") && !pin2.equals("GND")) {
String deviceId2 = pin2.split("-")[0];
component2 = componentsMap.get(deviceId2);
if (component2 == null) {
component2 = createComponent(deviceId2);
if (component2 != null) {
componentsMap.put(deviceId2, component2);
circuit.add(component2);
}
}
}
3. Đặc điểm thiết kế:
Thiết kế hướng đối tượng
- Lớp trừu tượng Component cung cấp giao diện thống nhất, các thiết bị khác nhau thực hiện đa hình thông qua kế thừa
- Thiết kế phân tầng thiết bị điều khiển và thiết bị bị điều khiển, trách nhiệm rõ ràng
- Khả năng mở rộng mạnh mẽ
- Thiết bị mới có thể dễ dàng thêm vào bằng cách kế thừa lớp Component
- Phân tích lệnh điều khiển có thể mở rộng, hỗ trợ thêm thao tác
Thực hiện mô phỏng mạch điện đơn giản hóa
- Sử dụng danh sách tuyến tính mô phỏng dòng điện trong mạch
- Truyền điện áp thông qua inputVoltage và outputVoltage
Bài thứ hai
Phân tích vấn đề:
Chương trình tồn tại các vấn đề sau:
- Thiếu khai báo import gói
- List chưa khởi tạo thành lớp triển khai cụ thể (ví dụ ArrayList)
- Duyệt không chuyển kiểu đúng cách
- Cần sửa chương trình để lưu trữ và xuất thông tin sinh viên đúng cách
Giải thích điểm sửa:
- Import các gói java.util.ArrayList và java.util.List
- Khởi tạo List thành ArrayList
, đảm bảo lưu trữ có thứ tự - Sử dụng vòng lặp tăng cường đơn giản hóa mã nguồn, tránh chuyển kiểu rõ ràng
- Phân tầng lớp trừu tượng (CircuitElement → Device → các thiết bị cụ thể)
- Phân tách mạch điện và thiết bị, khiến cấu trúc mạch và hành vi thiết bị độc lập riêng, logic rõ ràng
- Thêm thiết bị mới chỉ cần kế thừa lớp Device, mở rộng cấu trúc mạch mới cũng rất thuận tiện
- Logic mô phỏng mạch nối tiếp và song song chính xác và phổ dụng, hỗ trợ lồng ghép mạch điện phức tạp
- Định dạng đầu vào trực quan, hỗ trợ định nghĩa mạch và điều khiển thiết bị linh hoạt
- Đầu ra sắp xếp theo loại thiết bị và số hiệu, thuận tiện quan sát
- Tách phân tích mạch điện và cập nhật trạng thái thiết bị, giảm độ liên kết hàm
- Cho các loại mạch khác nhau, thiết kế quy trình tính toán rõ ràng hơn, giảm chi phí gỡ lỗi
- Trong phiên bản tiếp theo thêm phát hiện ngắn mạch và xử lý ngoại lệ điện áp vượt ngưỡng, nâng cao độ tin cậy mô phỏng mạch điện
- Phân tích nút mạch điện phức tạp cần tối ưu thuật toán thêm
- Tăng cường chú thích và viết tài liệu mã nguồn, thuận tiện hiểu nhanh và sửa đổi khi lặp lại
- Thích đáng tăng giảng dạy ví dụ liên quan đến thiết kế hướng đối tượng và mô phỏng mạch điện
- Tăng thiết kế ví dụ điều khiển thiết bị IoT thực tế, khiến thực hiện mã nguồn gần hơn với tình huống ứng dụng thực tế
Xuất:
no:1001 name:zs
no:1002 name:ls
Bài thứ ba chưa hoàn thành
Tập bài tập 6
Chỉ có một bài duy nhất, là phiên bản nâng cấp hệ thống nhà thông minh
Thêm quạt đứng và thêm mạch song song vào logic mạch điện
1. Cấu trúc trừu tượng:
CircuitElement: Lớp trừu tượng, đại diện cho một thành phần mạch điện, cung cấp giao diện tính điện trở (getResistance) và hành vi mô phỏng (simulate).
Device: Lớp trừu tượng, kế thừa từ CircuitElement, biểu thị thiết bị trong mạch điện (như công tắc, đèn, quạt...). Bao gồm thuộc tính cơ bản identifier (định danh duy nhất, như K1) và category (loại thiết bị, như K biểu thị công tắc).
getNumber: Phân tích phần số trong định danh thiết bị, thuận tiện cho sắp xếp.
ControlDevice: Lớp trừu tượng, kế thừa từ Device, biểu thị thiết bị điều khiển (như công tắc và bộ điều tốc).
ControlledDevice: Lớp trừu tượng, kế thừa từ Device, biểu thị thiết bị bị điều khiển (như đèn và quạt).
Thông qua thiết kế phân tầng lớp trừu tượng, chương trình trừu tượng hóa rõ ràng hành vi thiết bị và thành phần mạch điện, thuận tiện cho mở rộng.
2. Các lớp thiết bị cụ thể:
Thiết bị điều khiển
SwitchDevice: Thiết bị công tắc, có hai trạng thái (mở và đóng), xuất điện áp theo trạng thái khi mô phỏng.
StepSpeedController: Bộ điều tốc phân cấp, có 4 cấp (0-3), điều chỉnh cấp độ qua phương thức increase và decrease.
ContinuousSpeedController: Bộ điều tốc liên tục, điện áp đầu ra điều chỉnh theo tỷ lệ (0.00-1.00).
Thiết bị bị điều khiển
IncandescentLight: Đèn sợi đốt, tính độ sáng (0-200 lux) theo điện áp đầu vào.
DaylightLight: Đèn huỳnh quang, độ sáng là 0 hoặc 180, tắt khi điện áp đầu vào là 0, ngược lại bật.
CeilingFan: Quạt trần, tính tốc độ quay (0-360 vòng/phút) theo điện áp đầu vào.
FloorFan: Quạt đứng, tốc độ phân cấp thay đổi theo điện áp đầu vào, phạm vi đầu ra 0-360 vòng/phút.
Mỗi loại thiết bị đều triển khai phương thức getResistance và simulate, khiến chúng có thể tham gia mô phỏng mạch điện.
3. Cấu trúc mạch điện:
SeriesCircuit: Mạch nối tiếp, tính tổng điện trở là tổng điện trở các thành phần, mô phỏng theo tỷ lệ điện trở phân phối điện áp đầu vào.
ParallelCircuit: Mạch song song, tính điện trở tương đương là nghịch đảo của tổng nghịch đảo các nhánh, mô phỏng phân phối cùng điện áp đầu vào cho các nhánh.
Thiết kế lớp mạch điện khiến các thiết bị khác nhau có thể tổ hợp thành cấu trúc mạch điện phức tạp hơn.
4. Logic chính:
Logic chính chia thành các bước sau:
4.1 Phân tích đầu vào
Đầu vào gồm mô tả mạch điện và lệnh điều khiển:
#T: Định nghĩa mạch nối tiếp.
#M: Định nghĩa mạch song song.
Khác bắt đầu bằng # là lệnh điều khiển.
Thiết bị định danh duy nhất qua identifier, khi phân tích mạch sẽ theo loại thiết bị tạo thể hiện lớp tương ứng.
4.2 Xây dựng mạch điện
Phân tích mô tả mạch thành đối tượng SeriesCircuit và ParallelCircuit.
Qua định danh thiết bị, thêm thiết bị theo thứ tự vào mạch, hỗ trợ mạch lồng ghép.
4.3 Xử lý lệnh điều khiển
Thay đổi trạng thái thiết bị theo lệnh điều khiển:
#Kx: Chuyển đổi trạng thái công tắc.
#Fx+ hoặc #Fx-: Bộ điều tốc phân cấp tăng hoặc giảm cấp.
#Lx:ratio: Bộ điều tốc liên tục thiết lập tỷ lệ.
4.4 Mô phỏng mạch điện
Bắt đầu từ mạch chính, mô phỏng với 220V là điện áp đầu vào.
Theo cấu trúc mạch và phương thức simulate của thiết bị, tính toán trạng thái đầu ra mỗi thiết bị.
4.5 Tạo đầu ra
Sắp xếp theo loại thiết bị và ID, xuất trạng thái các thiết bị (như độ sáng, tốc độ quay, cấp độ...).
for (String conn : connections) {
String[] pins = conn.split(" ");
for (String pin : pins) {
if (pin.equals("IN") || pin.equals("OUT")) continue;
String deviceId = pin.split("-")[0];
Device device = devicesMap.get(deviceId);
if (device != null && !series.elements.contains(device)) {
series.elements.add(device);
}
}
}
circuitsMap.put(circuitId, series);
} else if (line.startsWith("#M")) {
// Mạch song song
String[] parts = line.split(":");
String circuitId = parts[0].substring(1); // Loại bỏ '#'
String branchesPart = parts[1].trim();
ParallelCircuit parallel = new ParallelCircuit();
branchesPart = branchesPart.replace("[", "").replace("]", "").trim();
String[] branchIds = branchesPart.split(" ");
for (String branchId : branchIds) {
CircuitElement branch = circuitsMap.get(branchId);
if (branch instanceof SeriesCircuit) {
parallel.branches.add((SeriesCircuit) branch);
}
}
circuitsMap.put(circuitId, parallel);
} else if (line.startsWith("#")) {
// Lệnh điều khiển
controlCommands.add(line);
}
Điểm nổi bật thiết kế:
Thiết kế mô-đun:
Khả năng mở rộng mạnh mẽ:
Mô phỏng mạch điện:
Thiết kế đầu vào/đầu ra rõ ràng:
Kinh nghiệm khắc phục sự cố
Vấn đề 1: Logic khớp một phần câu hỏi nhiều lựa chọn phức tạp, thực hiện ban đầu sai.
Giải pháp: Phân chia thành ba trường hợp hoàn toàn khớp, khớp một phần và khớp sai.
Vấn đề 2: Định dạng dữ liệu đầu vào đa dạng, xử lý biên khi phân tích không đủ.
Giải pháp: Sử dụng biểu thức chính quy xác minh định dạng đầu vào, bắt ngoại lệ.
Vấn đề 3: Ban đầu không sử dụng double trong tính toán, dẫn đến mất độ chính xác trong tính toán điện áp và độ sáng.
Giải pháp: Thống nhất sử dụng kiểu double lưu trữ và truyền điện áp, xử lý làm tròn khi xuất.
Vấn đề 4: Nút đầu vào và đầu ra mạch song song chưa liên kết đúng, dẫn đến kết quả tính toán mạch song song bất thường.
Giải pháp: Thiết kế lại lớp ParallelCircuit, thêm chức năng liên kết động nút đầu vào và đầu ra.
Gợi ý cải tiến
Hướng tối ưu mã nguồn:
Gợi ý mở rộng chức năng:
Tổng kết
Giai đoạn học tập này củng cố các khả năng sau:
Khả năng thiết kế và thực hiện hướng đối tượng: Thành thạo đóng gói lớp và kế thừa, có thể mở rộng chức năng theo yêu cầu.
Khả năng mô phỏng và tính toán mạch điện: Hiểu sâu logic tính toán mạch nối tiếp, song song, nắm vững thực hiện cập nhật trạng thái động.
Nơi cần cải thiện:
Đề xuất cho khóa học và bài tập:
Thông qua học tập và tổng kết tập bài tập này, không chỉ nâng cao khả năng thực hiện mã nguồn, mà còn sâu sắc hóa hiểu biết thiết kế hệ thống nhà thông minh, mong đợi tiếp tục nghiên cứu và ứng dụng sâu hơn trong học tập tiếp theo.