1. 程式人生 > 實用技巧 >第二個小專案--職工管理系統

第二個小專案--職工管理系統

只完成一半

先記錄一下,我覺的C++ 很多時間,很多程式碼就是操作記憶體。

答題和通訊錄管理系統差不多,不同的是使用到 了類的多型,使用檔案儲存。還有一些技巧性,規範性的東西。

根據職責不同,不同職責的人繼承一個抽象類。這個反而不重要。

定義一個Manage類,實現核心功能,增刪改查等。重要。

由於涉及到了資料的儲存,所以讓我長了一個很大的見識就是將 判斷檔案是否存在,檔案是否為空,檔案中有多少個人的資料(int get_num),讀取檔案的資料到記憶體(void init) 這些功能(當然這些功能需要細化到幾個函式來實現) 全都放在了類的建構函式中,然後使用幾個變數或布林值記錄一下狀態,很6。這可能就是好的架構吧。

有一個變數是 Worker ** p = new Worker*[size],指向指標陣列的指標,用這個指向指標陣列的指標來管理 每一個人。陣列中為每一個人例項化的指標,通過對p的操作,通過多型,就可以將操作精細到每個人,目前小白的角度,覺的很6。比如說

void System::ShowPeople() {
    if (!this->FileisExit && this->FileisEmpty) {
        cout << "資料庫不存在!!!" << endl;

    }
    else {
        if (this
->FileisExit && this->FileisEmpty) { cout << "資料庫為空" << endl; } else { for (int i = 0; i < this->DbFileNum; i++) { this->m_person[i]->ShowJob(); } } } }

增,刪,改,查 都會與這個 p指標 打交道。

總結下坑

1 switch 我踩了兩個坑。

    switch (x)
    {
    cout << "xyz" << endl;
    case 1:
        break;
    case 2:
        break;
    default:
        break;
    }

  一個是xyz不會列印, 根據x直接跳到 符合的case中,執行相應的邏輯

  二是 case一定要帶break,不帶break,會繼續往下執行,!!

2 判斷 檔案為空

  讀取一個字元,看到沒到結尾。

        char ch;
        ifs >> ch;
        if (ifs.eof())
        {
            this->FileisExit = true;
            this->FileisEmpty = true;
            this->DbFileNum = 0;
            this->m_person = NULL;
        }

3 知道每一行的固定格式,讀取全部內容

int System::GetDbNum()
{
    ifstream ifs(filename, ios::in);
    int id;
    int did;
    string name;
    int num = 0;
    while (ifs>>id && ifs >> did && ifs>>name) {
        num++;
    }
    ifs.close();
    return num;

}

4 init 從檔案中 初始化 記憶體中,變數儲存。這就是前面我說的在建構函式中實現的一個功能。666

void System::init()
{
    int id;
    int did;
    string name;
    ifstream ifs(filename, ios::in);
    int index = 0;

    while (ifs >> id && ifs >> did && ifs>>name)
    {
        Person* p = NULL;
        switch (did)
        {
        case 1:
        {
            p = new Boss(id, did, name);
            this->m_person[index] = p;
            index++;
            break;
        }
        case 2: {
            p = new Employee(id, did, name);
            this->m_person[index] = p;
            index++;
            break;
        }
        }
    }
    ifs.close();
}

建構函式中實現的另一個功能,獲取檔案中有多少個人。

int System::GetDbNum()
{
    ifstream ifs(filename, ios::in);
    int id;
    int did;
    string name;
    int num = 0;
    while (ifs>>id && ifs >> did && ifs>>name) {
        num++;
    }
    ifs.close();
    return num;

}

5 解構函式

  對手動開闢的空間釋放分三步

  判斷指標p是不是空。

  如果不為空,delete 指標p

  指標p = NULL。賦值

System::~System() {
    cout << "解構函式 " << endl;
    if (this->m_person != NULL)
    {
        for (int i = 0; i < this->DbFileNum; i++)
            if (this->m_person[i] != NULL) {
                delete this->m_person[i];
            }
        delete[] this->m_person;
        this->m_person = NULL;
    }
}

  

 6 建構函式

System::System() {
    ifstream ifs(filename, ios::in);
    if (!ifs.is_open())
    {
        this->FileisExit = false;
        this->FileisEmpty = true;
        this->DbFileNum = 0;
        this->m_person = NULL;
    }
    else {
        char ch;
        ifs >> ch;
        if (ifs.eof())
        {
            this->FileisExit = true;
            this->FileisEmpty = true;
            this->DbFileNum = 0;
            this->m_person = NULL;
        }
        else {
            this->FileisExit = true;
            this->FileisEmpty = false;
            this->DbFileNum = this->GetDbNum();
            this->m_person = new Person * [this->DbFileNum];
            this->init();
        }
    }
    ifs.close();
}

7 新增人員

void System::AddPeople() {
    

    int newsize = this->DbFileNum + 1;
    cout << "newsize: " << newsize << endl;
    Person** newspace = new Person * [newsize];
    for (int i = 0; i < this->DbFileNum; i++)
    {
        newspace[i] = this->m_person[i];
    }
    int cho;
    cout << "請選擇建立的人員 1 : boss  2 : employerr " << endl;
    cin >> cho;
    int id;
    cout << "請輸入 id : " << endl;
    cin >> id;
    int did;
    cout << "請輸入職業 1 :boss 2 :employee " << endl;
    cin >> did;
    string name;
    cout << "請輸入姓名 : " << endl;
    cin >> name;
    cout << "DbFileNum: " << this->DbFileNum << endl;
    
    switch (cho)
    {
        
    case 1:
    {
        Person* p  = new Boss(id, did, name);
        cout << "1" << endl;
         p->ShowJob();
        newspace[newsize - 1] = p;
        break;
    }
    case 2:
    {    
        Person* p = new Employee(id, did, name);
        cout << " this->DbFileNum: "<< this->DbFileNum << "newsize:  " << newsize << endl;
        p->ShowJob();
        newspace[newsize-1] = p;
        cout << "33" << endl;
        break;
    }
    }

    this->DbFileNum = newsize;
    delete[] this->m_person;
    this->m_person = newspace;
    this->FileisExit = false;

    this->save();
}