1. 程式人生 > >C++課設案例 學生資訊管理系統

C++課設案例 學生資訊管理系統

#include <iostream>
#include <string>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <vector>
#include <cstdio>


#define FILENAME "stuInfo.bat"

using namespace std;

/* 賬號類
class Account
{
    private:
        string account;  // 賬號
        string pwd; // 密碼
    public:
        Account()
        {
            account = "yc";
            pwd = "123";
        }

        ~Account(); // 解構函式
        Account(string newAccount, string newPwd);
        void show();
        int login(string account, string pwd);  // 函式的宣告
};

Account::Account(string newAccount, string newPwd){
    account = newAccount;
    pwd = newPwd;
}

void inline Account::show() // 顯式宣告的行內函數
{
    cout << account << "\t" << pwd << endl;
}
int Account::login(string account, string pwd)  // 成員函式的實現
{
}
*/

// 學生類
class StuInfo
{
    private:
        string sno;  // 學號
        string sname; // 姓名
        string cname; // 班級
        string sex; // 性別
        int age; // 年齡
        string tel; // 電話號碼

    public:
        /*StuInfo(string sno, string sname, string cname, string sex , int age, string tel)
        {
            this -> sno = sno;
            this -> sname = sname;
            this -> cname = cname;
            this -> sex = sex;
            this -> age = age;
            this -> tel = tel;
        }*/

        StuInfo(string sno, string sname, string cname, string sex , int age, string tel):sno(sno),sname(sname),cname(cname),sex(sex),age(age),tel(tel)
        {

        }

        StuInfo()
        {

        }

        void setSno(string sno) {
            this -> sno = sno;
        }

        void setSname(string sname) {
            this -> sname = sname;
        }

        void setCname(string cname) {
            this -> cname = cname;
        }

        void setSex(string sex) {
            this -> sex =  sex;
        }

        void setAge(int age) {
            this -> age =  age;
        }

        void setTel(string tel) {
            this -> tel = tel;
        }

        string getSno() {
            return sno;
        }

        string getSname() {
            return sname;
        }

        string getCname() {
            return cname;
        }

        string getSex() {
            return sex;
        }

        int getAge() {
            return age;
        }

        string getTel() {
           return tel;
        }

        void show()
        {
            cout << "\n\t" << sno << "\t" << sname << "\t" << cname << "\t" << sex << "\t" << age << "\t" << tel << endl;
        }

        bool save()  // 儲存到資料檔案
        {
            ofstream out(FILENAME, ios::out | ios::app | ios::binary);
            if (out.is_open())
            {
                out << sno << "\t" << sname << "\t" << cname << "\t" << sex << "\t" << age << "\t" << tel << "\r\n";
                out.close();
                return true;
            }
            return false;
        }
};

class Controller
{
    public:
        void showCopy(); // 顯示版權
        bool login(); // 使用者登入
        void menu(); // 主選單
        void initData(); // 初始化資料
        void view(); // 顯示學生資訊
        void addStuInfo(); // 新增學生資訊
        void search(); // 查詢學生資訊
        void update(); // 修改學生資訊
        bool rewrite(); // 重寫資料的方法
        void remove(); // 刪除學生資訊
        void showStuInfo(StuInfo stu); // 顯示單個學生資訊
        void showStuInfos(StuInfo stus[]); // 顯示多個學生資訊
};

//顯示版權資訊
void Controller::showCopy()
{
    cout << "\n\n\t**************************歡迎使用XXXX系統**************************";
    cout << "\n\n\t**************************源辰資訊版權所有**************************";
}

bool Controller::login()  // 成員函式的實現
{
    system("cls");
    int index = 0, count = 0;
    string account;
    char pwd[20];
    char ch;
    showCopy();

    do{
        index = 0;
        count ++;
        cout << "\n\n\t請輸入您的賬號:";
        //獲取使用者輸入的賬號
        cin >> account;

        cout << "\n\t請輸入您的密碼:";

        //獲取使用者輸入的密碼
        while( (ch = getch()) != 13 ){ //回車鍵的鍵值      //密碼只能是數字和字母????
            if( ch == 8){ //Backspace  回退
                if(index<=0){
                    index=0;
                }else{
                    cout << "\b \b";
                    index--;
                }
            }else{
                pwd[index++] = ch;
                cout << '*';
            }
        }

        pwd[index]='\0'; //陣列中資料結束的標誌

        //判斷使用者輸入的賬號和密碼是否正確
        if( account == "yc" && strcmp(pwd,"123") == 0){
           return true;
        }
        if(count==3){
            cout << "\n\n\t對不起,您暫無許可權,系統將自動退出....\n\t";
            exit(0);
        }
        cout << "\n\n\t賬號或密碼錯誤,請確認後重新輸入<您還有 " << (3-count) << " 輸入機會,回車後繼續>!!!" << endl;
    }while(count > 0);

    return false;

}

vector<StuInfo> stuInfos;

/*
    初始化資料
*/
void Controller::initData()
{
    fstream file(FILENAME, ios::in | ios::binary);
    if (file.is_open()) { // 開啟成功
        string line;
        string arr[6]; // 定義字串陣列,長度為6
        int index = -1, count = 0, num = 0;
        while(getline(file, line)) // 每次讀取一行
        {
            num = 0;
            count = 0;
            index = line.find("\t",count);
            while( index > 0) {
                arr[num++] = line.substr(count,index-count);
                count = index + 1;
                index = line.find("\t",count);
            }
            arr[num] = line.substr(count);

            //atoi 將字串轉換成整形。ASCII to Integer的縮寫
            stuInfos.push_back(StuInfo(arr[0], arr[1], arr[2], arr[3], atoi(arr[4].c_str()), arr[5]));
        }
        file.close();
    }
}

void Controller::view()
{
    system("cls");
    showCopy();
    cout << "\n\n\t**************************  瀏覽學生資訊  **************************" << endl;

    if (stuInfos.size() <= 0)
    {
        cout << "\n\t暫無學生資訊...";
        return;
    }

    cout << "\n\n\t************************** 共有 " << stuInfos.size() << " 個學生 **************************" << endl;
    cout << "\n\n\t學號" << "\t 姓名" << "\t   班級" << "\t        性別" << "\t年齡" << "\t  電話" << endl;
    for(int i=0,len=stuInfos.size(); i<len; i++)
    {
        stuInfos[i].show();
    }

    cout << "\n\n\t<請按回車返回>" << endl;
    getch();
}

void Controller::showStuInfo(StuInfo stu)
{
    cout << "\n\n\t學號" << "\t 姓名" << "\t   班級" << "\t        性別" << "\t年齡" << "\t  電話" << endl;
    stu.show();
}

// 查詢
void Controller::search()
{
    system("cls");

    showCopy();
    cout << "\n\n\t**************************  查詢學生資訊  **************************";
    if (stuInfos.size() <= 0)
    {
        cout << "\n\t暫無學生資訊...";
        return;
    }

    string sname; //存放使用者要查詢的商品編號
    cout << "\n\n\t請輸入您要查詢的學生姓名:";
    cin >> sname;
    cout << "\n\n\t學號" << "\t 姓名" << "\t   班級" << "\t        性別" << "\t年齡" << "\t  電話" << endl;

    int count = 0; // 記錄滿足條件的學生個數
    int temp = 0, j=0;
    char arr[20];

    for(int i=0,len=stuInfos.size(); i<len; i++)  // 迴圈所有學生資訊
    {
        if (sname == stuInfos[i].getSname()) {
            count++;
            stuInfos[i].show();
        }
    }

    if (count>0)
    {
        cout << "\n\n\t************************ 共有 " << count << " 個基本滿足條件 ************************" << endl;
    }
    else
    {
        cout << "\n\t沒有您要查詢的學生資訊...";
    }
    cout << "\n\n\t<請按回車返回>" << endl;
    getch();
}

bool Controller::rewrite()
{
    int len=stuInfos.size();
    if (len <=0) // 說明沒有學生資訊,則清空檔案中的內容
    {
        ofstream file(FILENAME, ios::out | ios::trunc | ios::binary);
        file.close();
    }
    else
    {
        ofstream out(FILENAME, ios::out | ios::binary);
        if (out.is_open())
        {
            for(int i=0,len=stuInfos.size(); i<len; i++)
            {
                out << stuInfos[i].getSno() << "\t" << stuInfos[i].getSname() << "\t" << stuInfos[i].getCname() << "\t" << stuInfos[i].getSex() << "\t" << stuInfos[i].getAge() << "\t" << stuInfos[i].getTel() << "\r\n";
            }
            out.close();
            return true;
        }

    }
    return false;
}


void Controller::remove()
{
    system("cls");

    showCopy();
    cout << "\n\n\t**************************  刪除學生資訊  **************************";

    if (stuInfos.empty())
    {
        cout << "\n\t暫無學生資訊...";
        return;
    }

    string sno; //存放使用者要查詢的商品編號
    cout << "\n\n\t請輸入您要刪除的學生學號:";
    cin >> sno;

    int i, len = stuInfos.size();

    for(i=0; i<len; i++)
    {
        if (sno==stuInfos[i].getSno())
        {
            showStuInfo(stuInfos[i]);
            break;
        }
    }

    if (i>=len)
    {
        cout << "\n\t對不起!沒有您要刪除的學生資訊...";
        return;
    }

    int result=MessageBox(NULL,"您確定要刪除此學生資訊嗎?","確認提示",MB_YESNO|MB_ICONWARNING);
    if(result==6) // 說明確定
    {
        stuInfos.erase(stuInfos.begin()+i);
        // 重寫資料檔案
        if(rewrite())
        {
           cout << "\n\n\t學生資訊刪除成功..." << endl;
        }
        else
        {
            cout << "\n\n\t學生資訊刪除失敗..." << endl;
        }
    }
    cout << "\n\n\t<請按回車返回>" << endl;
    getch();
}

void Controller::update()
{
    system("cls");

    showCopy();
    cout << "\n\n\t**************************  修改學生資訊  **************************";
    if (stuInfos.empty())
    {
        cout << "\n\t暫無學生資訊...";
        return;
    }

    string sno;  // 學號
    cout << "\n\n\t請輸入您要修改的學生學號:";
    cin >> sno;

    int i, len = stuInfos.size();

    for(i=0; i<len; i++)
    {
        if (sno==stuInfos[i].getSno())
        {
            cout << "\n\t您要修改的學生資訊如下:";
            showStuInfo(stuInfos[i]);
            break;
        }
    }

    if ( i >= len )
    {
        cout << "\n\t對不起!沒有您要刪除的學生資訊...";
        return;
    }

    string sname; // 姓名
    string cname; // 班級
    string sex; // 性別
    int age; // 年齡
    string tel; // 電話號碼

    cout << "\n\t請輸入學生姓名:";
    cin >> sname;

    cout << "\n\t請輸入所在班級:";
    cin >> cname;

    cout << "\n\t請輸入學生性別:";
    cin >> sex;

    cout << "\n\t請輸入學生年齡:";
    cin >> age;

    cout << "\n\t請輸入聯絡方式:";
    cin >> tel;

    int result=MessageBox(NULL,"您確定要修改此學生資訊嗎?","確認提示",MB_YESNO|MB_ICONWARNING);
    if(result==6) // 說明確定
    {
        stuInfos[i].setSname(sname);
        stuInfos[i].setCname(cname);
        stuInfos[i].setSex(sex);
        stuInfos[i].setAge(age);
        stuInfos[i].setTel(tel);

        // 重寫資料檔案
        if(rewrite())
        {
           cout << "\n\n\t學生資訊修改成功..." << endl;
        }
        else
        {
            cout << "\n\n\t學生資訊修改失敗..." << endl;
        }
    }
    cout << "\n\n\t<請按回車返回>" << endl;
    getch();
}

void Controller::menu()
{
    int option=0, count=0;

again1:system("cls"); //清屏
    count=0;
    showCopy();
    cout << "\n\n\t**************************     主選單     **************************\n";
    cout << "\n\t************************** 1.瀏覽學生資訊 **************************";
    cout << "\n\t************************** 2.查詢學生資訊 **************************";
    cout << "\n\t************************** 3.新增學生資訊 **************************";
    cout << "\n\t************************** 4.修改學生資訊 **************************";
    cout << "\n\t************************** 5.刪除學生資訊 **************************";
    cout << "\n\t************************** 6.退出系統     **************************";

    do{
        if(count!=0){ //說明使用者不是第一次輸入,則提醒使用者
            cout << "\n\n\t對不起,沒有該選項,請重新選擇(1-6):";
        }else{
            cout << "\n\n\t請選擇您的操作(1-6):";
        }

        //獲取使用者的選擇
        cin >> option;
        count++;
    }while(option<=0 || option>6);

    //如果使用者輸入了正確的值
    switch(option){
        case 1:view();break;
        case 2:search();break;
        case 3:addStuInfo();break;
        case 4:update();break;
        case 5:remove();break;
        case 6:exit(0);break;
    }
    goto again1;
}

void Controller::addStuInfo()
{
    system("cls");
    int result, age;
    string sno, sname, cname, sex, tel;

    cout << "\n\n\t**************************  新增學生資訊  **************************";
    cout << "\n\n\t*************************請輸入以下學生資訊**************************\n";
    cout << "\n\t請輸入學生學號:";
    cin >> sno;

    cout << "\n\t請輸入學生姓名:";
    cin >> sname;

    cout << "\n\t請輸入所在班級:";
    cin >> cname;

    cout << "\n\t請輸入學生性別:";
    cin >> sex;

    cout << "\n\t請輸入學生年齡:";
    cin >> age;

    cout << "\n\t請輸入聯絡方式:";
    cin >> tel;

    StuInfo stu = StuInfo(sno, sname, cname, sex, age, tel);
    cout << "\n\t您要新增的學生資訊如下,請確認:" << endl;

    showStuInfo(stu);

    result=MessageBox(NULL,"您確定要新增此資料嗎?","確認提示",MB_YESNO|MB_ICONWARNING);
    if(result==6)
    {
        if ( stu.save() ) {
             stuInfos.push_back(stu);
            cout << "\n\t學生資訊新增成功..." << endl;
        } else {
            cout << "\n\t學生資訊新增失敗..." << endl;
        }
    }
    cout << "\n\n\t<請按回車返回>" << endl;
    getch();
}

int main()
{

    Controller controll;
    if (controll.login() )
    {
        controll.initData(); // 初始化資料
        controll.menu();
    }
    return 0;
}