首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 書店銷售資料程式編譯錯誤修正:建構子、運算子多載與輸入輸出重載完整修正版

     編輯:程式設計綜合問答

原始碼主要問題

  1. 建構子語法錯誤:`Sales_data(){ default; }` → 應為 `= default;` 或 `{}`。
  2. 拼字錯誤:`Salea_data` (多處) → `Sales_data`;`comparaIsbn` / `compareIsbn` 混用。
  3. 輸入運算子參數型別錯誤:`sales_data` (小寫) → `Sales_data`。
  4. 輸出運算子空字串:`<< ""` 應為 `<< " "` 或 `<< '\t'`。
  5. main 函式拼字:`std:; cin` → `std::cin`;`trans1 == trans2;` 無作用 (應為 `trans1 = trans2;`)。
  6. 缺少標頭檔:``、``、``、``。

修正後完整程式碼 (可直接編譯)


#include 
#include 

class Sales_data {
    friend std::istream& operator>>(std::istream&, Sales_data&);
    friend std::ostream& operator<<(std::ostream&, const Sales_data&);
    friend bool operator<(const Sales_data&, const Sales_data&);
    friend bool operator==(const Sales_data&, const Sales_data&);

public:
    Sales_data() = default;
    Sales_data(const std::string& book) : bookNo(book) {}
    Sales_data(std::istream& is) { is >> *this; }

    Sales_data& operator+=(const Sales_data&);
    std::string isbn() const { return bookNo; }

private:
    std::string bookNo;
    unsigned units_sold = 0;
    double sellingprice = 0.0;
    double saleprice = 0.0;
    double discount = 0.0;
};

inline bool compareIsbn(const Sales_data& lhs, const Sales_data& rhs) {
    return lhs.isbn() == rhs.isbn();
}

Sales_data operator+(const Sales_data&, const Sales_data&);

inline bool operator==(const Sales_data& lhs, const Sales_data& rhs) {
    return lhs.units_sold == rhs.units_sold &&
           lhs.sellingprice == rhs.sellingprice &&
           lhs.saleprice == rhs.saleprice &&
           lhs.isbn() == rhs.isbn();
}

inline bool operator!=(const Sales_data& lhs, const Sales_data& rhs) {
    return !(lhs == rhs);
}

Sales_data& Sales_data::operator+=(const Sales_data& rhs) {
    units_sold += rhs.units_sold;
    saleprice = (rhs.saleprice * rhs.units_sold + saleprice * units_sold)
                / (rhs.units_sold + units_sold);
    if (sellingprice != 0)
        discount = saleprice / sellingprice;
    return *this;
}

Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs) {
    Sales_data ret(lhs);
    ret += rhs;
    return ret;
}

std::istream& operator>>(std::istream& in, Sales_data& s) {
    in >> s.bookNo >> s.units_sold >> s.sellingprice >> s.saleprice;
    if (in && s.sellingprice != 0)
        s.discount = s.saleprice / s.sellingprice;
    else
        s = Sales_data();
    return in;
}

std::ostream& operator<<(std::ostream& out, const Sales_data& s) {
    out << s.isbn() << " " << s.units_sold << " "
        << s.sellingprice << " " << s.saleprice << " " << s.discount;
    return out;
}

int main() {
    Sales_data book;
    std::cout << "請輸入銷售記錄:" << std::endl;
    while (std::cin >> book) {
        std::cout << "ISBN、售出本數、原始價格、實售價格、折扣為 " << book << std::endl;
    }

    Sales_data trans1, trans2;
    std::cout << "請輸入兩條 ISBN 相同的銷售記錄:" << std::endl;
    std::cin >> trans1 >> trans2;
    if (compareIsbn(trans1, trans2))
        std::cout << "匯總信息:ISBN、售出本數、原始價格、實售價格、折扣為 "
                  << trans1 + trans2 << std::endl;
    else
        std::cout << "兩條銷售記錄的 ISBN 不同" << std::endl;

    Sales_data total, trans;
    std::cout << "請輸入幾條 ISBN 相同的銷售記錄:" << std::endl;
    if (std::cin >> total) {
        while (std::cin >> trans) {
            if (compareIsbn(total, trans))
                total += trans;
            else {
                std::cout << "當前書籍 ISBN 不同" << std::endl;
                break;
            }
        }
        std::cout << "有效匯總信息:ISBN、售出本數、原始價格、實售價格、折扣為 "
                  << total << std::endl;
    } else {
        std::cout << "沒有數據" << std::endl;
        return -1;
    }

    int num = 1;
    std::cout << "請輸入若干銷售記錄:" << std::endl;
    if (std::cin >> trans1) {
        while (std::cin >> trans2) {
            if (compareIsbn(trans1, trans2))
                num++;
            else {
                std::cout << trans1.isbn() << " 共有 " << num << " 條銷售記錄" << std::endl;
                trans1 = trans2; // 修正:原為 trans1 == trans2;
                num = 1;
            }
        }
        std::cout << trans1.isbn() << " 共有 " << num << " 條銷售記錄" << std::endl;
    } else {
        std::cout << "沒有數據" << std::endl;
        return -1;
    }
    return 0;
}

編譯器建議

原問使用 VC6 (1998 年),**強烈建議升級至 VS2022 / GCC 11+ / Clang 14+**,支援 C++17/20 標準,能捕捉上述所有錯誤並給出清晰提示。VC6 甚至不支援 `= default`、`= delete`、範圍 for、智慧指標等現代 C++ 必備特性。

關鍵修正對照表

原始錯誤修正後說明
`Sales_data(){ default; }``Sales_data() = default;`C++11 預設建構子語法
`Salea_data``Sales_data`類別名稱拼字統一
`comparaIsbn` / `compareIsbn``compareIsbn`函式名稱統一
`sales_data&` (小寫)`Sales_data&`參數型別大小寫正確
`<< ""``<< " "`輸出分隔符號
`trans1 == trans2;``trans1 = trans2;`指派而非比較
`std:; cin``std::cin`命名空間語法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved