Xây dựng Công cụ Tạo Bài tập Toán Tiểu học bằng C++

Bảng Kế hoạch Phát triển Phần mềm

Giai đoạn PSP2.1Hoạt độngThời gian dự kiến (phút)Thời gian thực (phút)
Lập kế hoạchƯớc lượng thời gian3530
Phát triểnPhân tích yêu cầu4050
Thiết kế tài liệu3540
Kiểm tra thiết kế2520
Viết mã7085
Kiểm thử3038
Báo cáoKiểm thử báo cáo3546
Tổng kết dự án2025

Thiết kế Hệ thống

Cấu trúc Lớp

Thành phầnChức năng
PhanSoXử lý phân số và tính toán
BieuThucQuản lý biểu thức toán học
BoTaoCauHoiTạo đề bài tự động
KiemTraDapAnĐối chiếu kết quả
TienIchCung cấp hàm tiện ích

Triển khai Mã nguồn

Lớp PhanSo (Xử lý phân số)

// Rút gọn phân số
void PhanSo::rutGon() {
    if (tuSo == 0) {
        mauSo = 1;
        return;
    }
    
    int ucln = timUCLN(tuSo, mauSo);
    tuSo /= ucln;
    mauSo /= ucln;
    
    if (mauSo < 0) {
        tuSo = -tuSo;
        mauSo = -mauSo;
    }
}

// Chuyển phân số thành chuỗi
string PhanSo::chuyenChuoi() const {
    if (mauSo == 1) return to_string(tuSo);
    if (abs(tuSo) < mauSo) return to_string(tuSo) + "/" + to_string(mauSo);
    
    int phanNguyen = tuSo / mauSo;
    int phanDu = abs(tuSo % mauSo);
    return to_string(phanNguyen) + "'" + to_string(phanDu) + "/" + to_string(mauSo);
}

Tạo Biểu thức Ngẫu nhiên

void BieuThuc::taoNgauNhien(int gioiHan, int maxToanTu) {
    vector<char> toanTu = {'+', '-', '*', '/'};
    int soToanTu = TienIch::soNgauNhien(maxToanTu) + 1;
    int soToanHang = soToanTu + 1;
    
    vector<PhanSo> toanHang;
    vector<char> danhSachToanTu;
    
    for (int i = 0; i < soToanHang; i++) {
        if (TienIch::soNgauNhien(2) == 0) {
            int giaTri;
            do {
                giaTri = TienIch::soNgauNhien(gioiHan);
            } while (giaTri == 0 && i > 0);
            toanHang.push_back(PhanSo(giaTri, 1));
        } else {
            int mau = TienIch::soNgauNhien(gioiHan - 2) + 2;
            int tu = TienIch::soNgauNhien(mau - 1) + 1;
            toanHang.push_back(PhanSo(tu, mau));
        }
    }
    
    for (int i = 0; i < soToanTu; i++) {
        danhSachToanTu.push_back(toanTu[TienIch::soNgauNhien(toanTu.size())]);
    }
    
    // ... (Phần còn lại của quy trình tạo biểu thức)
}

Kiểm tra Đáp án

bool soSanhDapAn(const string& traLoi, const string& dapAnChuan) {
    string traLoiChuan = traLoi;
    string dapAn = dapAnChuan;
    xoaKhoangTrang(traLoiChuan);
    xoaKhoangTrang(dapAn);
    
    if (traLoiChuan == dapAn) return true;
    
    try {
        PhanSo phanSoTraLoi = phanTichChuoi(traLoiChuan);
        PhanSo phanSoDapAn = phanTichChuoi(dapAn);
        phanSoTraLoi.rutGon();
        phanSoDapAn.rutGon();
        return (phanSoTraLoi.layTu() == phanSoDapAn.layTu()) 
            && (phanSoTraLoi.layMau() == phanSoDapAn.layMau());
    } catch (...) {
        return false;
    }
}

Kiểm thử Hệ thống

Kiểm thử Hiệu năng

Hàm tinhToan() chiếm 75% thời gian xử lý khi tạo 10,000 câu hỏi. Tối ưu thuật toán đánh giá biểu thức giúp cải thiện 40% hiệu suất.

Thẻ: C++ Fraction Expression-evaluation command-line-tool unit-testing

Đăng vào ngày 4 tháng 6 lúc 22:05