[C++プログラミング]STL標準テンプレートクラスライブラリ学習エッセイ

16209 ワード

この間は主にC++におけるSTLクラスライブラリの紹介と使用方法について述べた.以前はvector、マッピング、反復器の使用などの簡単なSTLクラスライブラリの方法について少し理解していましたが、前学期にjavaの集合クラスプログラムをいくつか書いたことがありますが、1つのプロジェクトを実現する上で一部の困難を感じています.
この方面の内容について完成しなければならない宿題は簡単な図書館のバックエンド管理プログラムを書くことです.当時、宿題をしていたとき、この任務は実現しにくいかもしれないと思っていたが、自主的に実現する過程で多くの問題が発生した.
一つは、実現が面倒すぎる内容があることです.たとえば日付の加減は、一日一日判断を1サイクル書くというのが本来の方法です.この方法は確かに考えやすいですが、実際の応用では、後で日数を加えて日付を調整する方法よりも効率が低いです.およびmapの検索での使用について.過去に考えられた方法は、1冊の本や1人の読者を名前や番号で検索するには、図書や読者ベクトル全体を巡り、文字列ごとに比較する必要がある.データ規模が大きいと、機械がデータを処理する効率が低くなります.しかしmapという構造があれば、この操作をより効率的にし、対応するmapで文字列に対応するベクトルの下付き文字を検索してからベクトルの下付き文字に対応する要素を出力すればよい.プログラム設計のある具体的な関数を習得することは比較的容易であるが,実際の操作過程で必要に応じて実現される機能を適切な特性を選択してプログラムの実行効率を最大化することは容易ではない.
二つ目は膨大なプロジェクトに対する心理的な恐怖である.これまであまりシステム設計に触れたことがなく、接触したばかりの頃はこのようなコード量の大きい項目に対しても確かに恐れていた.しかし、これも乗り越えなければならない壁で、今のところはまだ骨が折れるが、時間が長くなると道がわかるはずだ.システム設計の構造は比較的明確で、明確な構想と対応するツールを加えて実現するのは想像していたほど難しくないことが多い.以前は書類を書いてデータを読み書きするのが難しかったが、書類の読み書きの特性を知らなかったためか、当時はたくさんの行を書いていたが、明確なようなものはなかった.しかし、その後の説明を経て、考え方が明確になり、実現も容易になった.現在のあいまいなクエリーなど、いくつかのクエリー方式は依然として明確な考え方がなく、これと少し関係があるかもしれません.
この時間の宿題は実はいい加減で、比較的に急いで、心の中はやはり少しせっかちです.収穫もあり、学んだ新しいものをたくさん使うのもいい体験ですが、もっといいはずです.以前清華自動化大学1年のC++大宿題を見て、心の中で名門校の学生の学習効率の高さを感服すると同時に、自分の知識のレベルがまだ十分ではないことを深く感じて、学習の上で少し怠っています.次は前の知識を整理して振り返り、基礎を築くべきだ.
添付:今回の作業コード及び要求
図書管理システム(バックグラウンド管理者)
データクラス:
基礎類:読者の最大借書量、最長借書時間(日単位).この2つはクラスメンバーです.
日付類:年月日を含み、演算子を再ロードする場合、データの合法性検査を行う.出力演算子を再ロードする場合は、年/月/日の形式で出力します.リロード+演算子;
貸し出し記録類:日付、書番号、読者学号、タイプ(貸し出し/返却/継続)、図書タイプ(基礎/文学レジャー/専門);
読者類:学号(常メンバー)、氏名、専門、クラス、借りた図書の数、借りた記録ベクトル;
図書類:書号(常メンバー)、書名、著者、出版社、出版日、図書タイプ(基礎/文学レジャー/専門)、館蔵総量、在館数、借読記録ベクトル;
操作クラス:
データ・メンバー:図書/学生/貸し出し記録ベクトル
メンバー関数:図書に対してファイルの読み書きを行い、図書ベクトル内で図書の基本情報の添削・修正を完成する.
学生に対して書類の読み書きを行い、学生ベクトル内で学生の基本情報に対する削除・修正を完成する.
貸し出し記録の管理と統計機能の後続追加;
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

class Base {
  private:
    static int maxNum;
    static int maxTime;

  public:
    static void setMaxNum(int input) { maxNum = input; }
    static void setMaxTime(int input) { maxTime = input; }
    static int getMaxNum() { return maxNum; }
    static int getMaxTime() { return maxTime; }
    static void display() { cout << maxNum << " " << maxTime << endl; }
};
int Base::maxNum = 10;
int Base::maxTime = 90;
class Date {
  public:
    int m[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    Date() {}
    Date(int year, int mon, int day) {
        this->year = year;
        this->mon = mon;
        this->day = day;
    }
    Date(Date *date) {
        this->year = date->year;
        this->mon = date->mon;
        this->day = date->day;
    }
    Date(const Date &x) {
        this->year = x.year;
        this->mon = x.mon;
        this->day = x.day;
    }
    bool isRun(int year) {
        return ((year % 4 == 0 && year % 100 != 0) ||
                (year % 4 == 0 && year % 400 == 0));
    }
    int getYear() { return year; }
    int getMon() { return mon; }
    int getDay() { return day; }

    friend istream &operator>>(istream &is, Date &x) {
        while (1) {
            is >> x.year >> x.mon >> x.day;
            if (x.year > 2018 && x.year < 2025 && x.mon <= 12 && x.mon > 0 &&
                x.day <= x.m[x.getMon() - 1] && x.day > 0) {
                break;
            }
        }
        return is;
    }
    friend ostream &operator< m[mon - 1]) {
            i = mon - 1;
            while (da > m[i]) {
                da -= m[i];
                mo++;
                ++i %= 12;
            }
            mon += mo;
            if (mon > 12) {
                year++;
                mon %= 12;
            }
        }
        day = da;
        return *this;
    }

  private:
    int year, mon, day;
};
// class PDate {
//   public:
//     PDate() {
//         year = 2020;
//         mon = 1;
//         day = 1;
//     }
//     PDate(int year, int mon, int day) : year(year), mon(mon), day(day) {}
//     PDate(PDate *date) {
//         this->year = date->year;
//         this->mon = date->mon;
//         this->day = date->day;
//     }
//     PDate(const PDate &date) {
//         this->year = date.year;
//         this->mon = date.mon;
//         this->day = date.day;
//     }
//     friend istream &operator>>(istream &is, PDate &x) {
//         int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//         char r;
//         while (1) {
//             is >> x.year >> r >> x.mon >> r >> x.day;
//             if (x.year >= 2000 && x.year < 2020 && x.mon >= 1 && x.mon <= 12)
//             {
//                 if ((x.year % 4 == 0 && x.year % 100 != 0) ||
//                     (x.year % 4 == 0 && x.year % 400 == 0)) {
//                     if (x.mon == 2) {
//                         if (x.day >= 1 && x.day <= 29)
//                             return is;
//                     } else if (x.day >= 1 && x.day <= a[x.mon])
//                         return is;
//                 } else if (x.day >= 1 && x.day <= a[x.mon])
//                     return is;
//             }
//         }
//         return is;
//     }
//     friend ostream &operator< 29) {
//                     day -= 29;
//                     mon++;
//                 }
//             } else if (day > a[mon]) {
//                 day -= a[mon];
//                 mon++;
//             }
//             if (mon > 12) {
//                 mon -= 12;
//                 year++;
//             }
//         }
//         return PDate(year, mon, day);
//     }

//   private:
//     int year, mon, day;
// };
// class BorrowMemo {
//   public:
//     BorrowMemo(Date borrowDate, string stuNum, string ISBN, string type,
//                string bookType) {
//         this->borrowDate = new Date(borrowDate);
//         this->stuNum = stuNum;
//         this->ISBN = ISBN;
//         this->type = type;
//         this->bookType = bookType;
//     }
//     Date *getBorrowDate() { return borrowDate; }
//     string getISBN() { return ISBN; }
//     string getType() { return type; }
//     string getBookType() { return bookType; }
//     friend ostream &operator<name = name; }
    void setMajor(string major) { this->major = major; }
    void setGrade(string grade) { this->grade = grade; }
    void setBorrowedCnt(int borrowedCnt) { this->borrowedCnt = borrowedCnt; }
    Stu operator=(const Stu &Stu) {
        string *tmp = const_cast(&stuNum);
        *tmp = Stu.stuNum;
        this->name = Stu.name;
        this->major = Stu.major;
        this->grade = Stu.grade;
        this->borrowedCnt = Stu.borrowedCnt;
        return *this;
    }
    friend istream &operator>>(istream &is, Stu &stu) {
        string *temp = const_cast(&stu.stuNum);
        string input;
        is >> input;
        *temp = input;
        is >> stu.name >> stu.major >> stu.grade;
        return is;
    }
    friend ostream &operator< bm;
};
class Book {
  public:
    Book() {
        sum = 0;
        cnt = 0;
    }
    Book(string ISBN, string bookName, string author, string press,
         string pDate, string type, int sum)
        : ISBN(ISBN) {
        this->bookName = bookName;
        this->author = author;
        this->press = press;
        this->pDate = pDate;
        this->type = type;
        this->sum = sum;
        cnt = sum;
    }
    Book(string ISBN, string bookName, string author, string press,
         string pDate, string type, int sum, int cnt)
        : ISBN(ISBN) {
        this->bookName = bookName;
        this->author = author;
        this->press = press;
        this->pDate = pDate;
        this->type = type;
        this->sum = sum;
        this->cnt = cnt;
    }
    Book operator=(const Book &book) {
        string *tmp = const_cast(&ISBN);
        *tmp = book.ISBN;
        this->bookName = book.bookName;
        this->author = book.author;
        this->press = book.press;
        this->pDate = book.pDate;
        this->type = book.type;
        this->cnt = book.cnt;
        this->sum = book.sum;
        return *this;
    }
    string getISBN() { return ISBN; }
    string getBookName() { return bookName; }
    string getAuthor() { return author; }
    string getPress() { return press; }
    string getType() { return type; }
    int getSum() { return sum; }
    int getCnt() { return cnt; }
    void setBookName(string bookName) { this->bookName = bookName; }
    void setAuthor(string author) { this->author = author; }
    void setPress(string press) { this->press = press; }
    void setType(string type) { this->type = type; }
    void setSum(int sum) { this->sum = sum; }
    void setCnt(int cnt) { this->cnt = cnt; }

    friend ostream &operator<>(istream &is, Book &book) {
        string *temp = const_cast(&book.ISBN);
        string input;
        is >> input;
        *temp = input;
        is >> book.bookName >> book.author >> book.press >> book.pDate >>
            book.type >> book.sum;
        return is;
    }

  private:
    const string ISBN;
    string bookName;
    string author;
    string press;
    string pDate;
    string type;
    int sum;
    int cnt;
    // vector bm;
};
class Operate {
  public:
    Operate() {
        loadBook();
        lodaReader();
    }
    ~Operate() {
        saveBook();
        saveReader();
    }

    void loadBook() {
        Book a;
        ifstream in("E:\\inbook.txt");
        if (!in) {
            return;
        }
        while (!in.eof()) {
            in >> a;
            int temp1, temp2;
            in >> temp1 >> temp2;
            a.setSum(temp1);
            a.setCnt(temp2);
            bk.push_back(a);
            bookname.insert(make_pair(a.getBookName(), bk.size() - 1));
            bookid.insert(make_pair(a.getISBN(), bk.size() - 1));
        }
        in.close();
    }

    void lodaReader() {
        Stu a;
        ifstream in("E:\\inreader.txt");
        if (!in) {
            return;
        }
        while (!in.eof()) {
            in >> a;
            st.push_back(a);
            readername.insert(make_pair(a.getName(), st.size() - 1));
            readerid.insert(make_pair(a.getStuNum(), st.size() - 1));
        }
        in.close();
    }

    void saveBook() {
        ofstream out("E:\\outbook.txt");
        vector::iterator i;
        for (i = bk.begin(); i < bk.end(); ++i) {
            out << *i << endl;
        }
        out.close();
    }

    void saveReader() {
        ofstream out("E:\\outreader.txt");
        vector::iterator i;
        for (i = st.begin(); i < st.end(); ++i) {
            out << *i << endl;
        }
        out.close();
    }

    void addBook() {
        Book b;
        cin >> b;
        multimap::iterator i;
        i = bookid.find(b.getISBN());
        if (i == bookid.end()) {
            b.setSum(b.getSum() + 1);
            b.setCnt(b.getCnt() + 1);
            bk.push_back(b);
            bookname.insert(make_pair(b.getBookName(), bk.size() - 1));
            bookid.insert(make_pair(b.getISBN(), bk.size() - 1));
        } else {
            b.setSum(bk[i->second].getSum() + 1);
            b.setCnt(bk[i->second].getCnt() + 1);
            bk[i->second] = b;
        }
    }
    void deleteBook(string ISBN) {
        multimap::iterator i;
        vector::iterator p = bk.begin();
        i = bookid.find(ISBN);
        if (i != bookid.end()) {
            int index = i->second;
            bk.erase(p + index);
        } else
            return;
    }
    void searchBookByName(string n) {
        multimap::iterator i, p1, p2, p;
        i = bookname.find(n);
        if (i == bookname.end()) {
            return;
        } else {
            p1 = bookname.lower_bound(n);
            p2 = bookname.upper_bound(n);
            for (p = p1; p != p2; ++p) {
                cout << bk[p->second] << endl;
            }
        }
    }
    void searchBookByISBN(string ISBN) {
        multimap::iterator i;
        i = bookid.find(ISBN);
        if (i == bookid.end()) {
            return;
        } else {
            cout << bk[i->second];
        }
    }
    void modifyBook(string id) {
        multimap::iterator i;
        i = bookid.find(id);
        if (i == bookid.end()) {
            return;
        } else {
            cin >> bk[i->second];
            cout << bk[i->second];
        }
    }
    // void addMemo() {
    //     string ISBN, stuNum, type, bookType;
    //     Date date;
    //     cin >> date >> stuNum >> ISBN >> type >> bookType;
    //     bm.push_back(BorrowMemo(date, stuNum, ISBN, type, bookType));
    // }

    void addStu() {
        Stu r;
        cin >> r;
        st.push_back(r);
        readername.insert(make_pair(r.getName(), st.size() - 1));
        readerid.insert(make_pair(r.getStuNum(), st.size() - 1));
    }
    void deleteStu(string stuNum) {
        multimap::iterator i;
        vector::iterator p = st.begin();
        i = readerid.find(stuNum);
        if (i != readerid.end()) {
            int index = i->second;
            st.erase(p + index);
        } else
            return;
    }
    void searchStuByName(string n) {
        multimap::iterator i, p1, p2, p;
        i = readername.find(n);
        if (i == readername.end())
            return;
        else {
            p1 = readername.lower_bound(n);
            p2 = readername.upper_bound(n);
            for (p = p1; p != p2; ++p) {
                cout << st[p->second] << endl;
            }
        }
    }
    void searchStuByID(string n) {
        multimap::iterator i;
        i = readerid.find(n);
        if (i == readerid.end()) {
            return;
        } else {
            cout << st[i->second] << endl;
        }
    }
    void modifyReader(string id) {
        multimap::iterator i;
        i = readerid.find(id);
        if (i == readerid.end()) {
            return;
        } else {
            cin >> st[i->second];
            cout << st[i->second];
        }
    }

  private:
    vector bk;
    vector st;
    multimap bookname;
    multimap readername;
    multimap bookid;
    multimap readerid;
    // vector bm;
};
int main() {
    Operate op;
    string s;
    op.addBook();
    op.addBook();
    op.addBook();
    op.addBook();
    op.addStu();
    op.addStu();
    op.addStu();
    op.addStu();
    op.searchBookByName("       ");
    op.searchBookByISBN("9787564097165");
    op.searchStuByName("   ");
    op.searchStuByID("2018215852");
    op.deleteBook("9787513591218");
    op.deleteStu("2018216018");
    op.modifyBook("9787302423287");
    op.modifyReader("2018215906");
    return 0;
}