溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++中怎么使用Map實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

發(fā)布時(shí)間:2022-06-06 09:38:57 來(lái)源:億速云 閱讀:116 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“C++中怎么使用Map實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C++中怎么使用Map實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

1、 作品的功能描述:

實(shí)現(xiàn)一個(gè)學(xué)生信息管理系統(tǒng),通過(guò)對(duì)學(xué)生信息類中的成員進(jìn)行增、刪、改、查從而實(shí)現(xiàn)對(duì)數(shù)據(jù)的操作,除此之外,還可以顯示學(xué)生信息,按分?jǐn)?shù)排序信息,并通過(guò)文件的讀入讀出實(shí)現(xiàn)學(xué)生信息的存儲(chǔ)和讀出。

子函數(shù)操作細(xì)節(jié)說(shuō)明:

(1) 插入學(xué)生信息
通過(guò)map容器中的insert()函數(shù)進(jìn)行學(xué)生信息的插入,使用二元組作為參數(shù),first為學(xué)生姓名索引,second為學(xué)生個(gè)人信息類

(2) 刪除學(xué)生信息
使用map中的erase()函數(shù)對(duì)學(xué)生信息進(jìn)行刪除,如果學(xué)生存在于map中,刪除成功。

(3) 修改學(xué)生信息
通過(guò)map的key值調(diào)用value中的set函數(shù),并調(diào)用information類中打印學(xué)生信息的函數(shù)將學(xué)生信息顯示在程序執(zhí)行窗口中。

(4) 查找學(xué)生信息
通過(guò)map中的find()函數(shù)查找該信息是否存在。

(5) 列表顯示學(xué)生信息
自定義一個(gè)for循環(huán),對(duì)map進(jìn)行遍歷,輸出map中的每個(gè)成員。

(6) 按分?jǐn)?shù)排序信息
自定義一個(gè)按照數(shù)學(xué)成績(jī)由高到低,將map中的每個(gè)成員存入到vector這個(gè)動(dòng)態(tài)數(shù)組中,然后調(diào)用sort()函數(shù)按照自定義的比較順序?qū)W(xué)生信息進(jìn)行排序。

(7) 清空數(shù)據(jù)
調(diào)用map中的clear()函數(shù),清空map容器;

(8) 學(xué)生信息存盤(pán)
將學(xué)生信息寫(xiě)入文件

(9) 讀出信息存盤(pán)
讀入之前寫(xiě)入文件的學(xué)生信息

(10) 關(guān)閉系統(tǒng)
調(diào)用程序后,函數(shù)返回return 0, 程序運(yùn)行結(jié)束。

2、 功能實(shí)現(xiàn)原理:

采用STL庫(kù)中的map容器進(jìn)行信息存儲(chǔ),便于查找和修改信息。

3、代碼:

/*
    為了實(shí)現(xiàn)高效的學(xué)生管理系統(tǒng),主要采用了STL庫(kù)中的 map容器來(lái)進(jìn)行信息存儲(chǔ)。
    
    面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì)---實(shí)訓(xùn)課程序設(shè)計(jì) 
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map> 
#include <string>
#include <vector>
#include <cstdio> 
#include <windows.h>
using namespace std;

void color(int a)
{
// 更改命令行窗口的顏色
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}

class information{ //個(gè)人信息類 
    private:
        string name; //姓名 
        string id;   //學(xué)號(hào)  
        string sex;//性別
        string classname; //課程名
        string classnumber;//課程號(hào)
        double score; //課程分?jǐn)?shù) 
    public:
        information() {}; //無(wú)參構(gòu)造函數(shù) 
        information(string s, string s1, string s2, string s3, string s4, double s5) : name(s), id(s1), sex(s2), classname(s3), classnumber(s4), score(s5) {}; //構(gòu)造函數(shù)     
        
        void printinf() {
            //將字符串對(duì)象轉(zhuǎn)化為字符數(shù)組格式化輸出
            printf("%-15s%-15s%-15s%-15s%-15s%-15lf\n", name.c_str(), id.c_str(), sex.c_str(), classname.c_str(), classnumber.c_str(), score);
        }
        //get() set()方法 
        string getname() const{return name;}
        string getid() const{return id;}
        string getsex() const{return sex;}
        string getclassname() const{return classname;}
        string getclassnumber() const{return classnumber;}
        double getscore() const {return score;}
        
        void setname(string str) {name = str;}
        void setid(string str) {id = str;}
        void setsex(string str) {sex = str;}
        void setclassname(string str) {classname = str;}
        void setclassnumber(string str) {classnumber = str;}
        void setscore(double str) {score = str;}
        
};

int cmp(information a, information b)
{
    return a.getscore() > b.getscore();
}


//操作類 
class Do{
    private:
    //創(chuàng)建學(xué)生列表 以姓名作為鍵   information作為值   構(gòu)成一組鍵值對(duì)進(jìn)行存儲(chǔ)。 
        map<string, information> List;
    public:
        void append();         // 添加
        void delet();          // 刪除
        void change();         // 修改
        void search();         // 查找
        void Sort(); // 排序
        void printList();     // 顯示列表
        void clear();         // 清空數(shù)據(jù)
        void save();         // 保存數(shù)據(jù)
        void read();         // 讀取信息
        void close();         // 關(guān)閉信息
};

void Do :: Sort()
{
    vector<information> vec;
    for (auto x : List)
    {
        vec.push_back(x.second);
    }

    sort(vec.begin(), vec.end(), cmp);

    for (auto x : vec)
    {
        cout << "姓名      " << x.getname() << " " <<  "學(xué)號(hào)      " << x.getid() << " " <<  "學(xué)生性別      " << x.getsex() << "  " << "課程名      " << x.getclassname() << "課程號(hào)      "<< x.getclassnumber() << "分?jǐn)?shù)      " << x.getscore() << endl;
    }

}

void Do::append(){
    string str, str1, str2, str3, str4;
    double str5;
    cout << "請(qǐng)輸入學(xué)生姓名: ";
    cin >> str;    
    cout << "請(qǐng)輸入學(xué)生學(xué)號(hào):";
    cin >> str1;
    cout << "請(qǐng)輸入學(xué)生性別:";
    cin >> str2;
    cout << "請(qǐng)輸入課程名: ";
    cin >> str3;
    cout << "請(qǐng)輸入課程號(hào):";
    cin >> str4;
    cout << "請(qǐng)輸入分?jǐn)?shù):";
    cin >> str5;
    
    information people = information(str, str1, str2, str3, str4, str5);
    List.insert(pair<string, information>(str, people)); //利用insert進(jìn)行插入
    cout << "添加成功\n"; 
} 

void Do::delet(){
    string str;
    cout << "請(qǐng)輸入要?jiǎng)h除的同學(xué)的姓名:";
    cin >> str;
    List.erase(str) ? printf("刪除成功\n") : printf ("刪除失敗,未找到該同學(xué)\n"); 
}

void Do::change(){
    string str0, str, str1, str2, str3, str4;
    double str5;
    cout<<"請(qǐng)輸入要修改的學(xué)生姓名:\n";
    cin>>str0;
    cout<<"請(qǐng)輸入修改后的學(xué)生信息:\n";
    cout<<"姓名:";
    cin>>str;
    cout<<"學(xué)號(hào):";
    cin>>str1;
    cout<<"性別: ";
    cin>>str2;
    cout<<"課程名: ";
    cin >> str3;
    cout << "課程號(hào): ";
    cin >> str4;
    cout << "分?jǐn)?shù): ";
    cin >> str5;
    
    List[str0].setname(str);
    List[str0].setid(str1);
    List[str0].setsex(str2);
    List[str0].setclassname(str3);
    List[str0].setclassnumber(str4);
    List[str0].setscore(str5);    
    cout<<"修改后該學(xué)生信息為: \n";
    printf("%-15s%-15s%-15s%-15s\n","name","id","math","chinese");
    List[str0].printinf(); 
}

void Do::search(){
    string str;
    cout << "請(qǐng)輸入要查找的學(xué)生姓名: ";
    cin >> str;
    if(List.find(str) != List.end()){
        cout << "該學(xué)生信息為:\n";
        List[str].printinf(); 
    }
    else cout << "該學(xué)生不在列表中!\n";
}

void Do::printList() 
{
    if(List.size() <= 0)
    {
         cout << "當(dāng)前列表內(nèi)無(wú)任何學(xué)生,請(qǐng)讀取文件內(nèi)信息或添加聯(lián)系人!\n";
         return ;
    }
    cout << "學(xué)生列表:\n";
    cout<<"---------------------------------------------------------\n";
    printf("%-15s%-15s%-15s%-15s%-15s%-15s\n","name","id","sex","classname", "classnumber", "score");
    for(map<string, information>::iterator it = List.begin(); it!=List.end(); it++) {
        it->second.printinf();
    }
    cout<<"---------------------------------------------------------\n";
}

void Do::clear(){
    List.clear();
    cout << "清空完成!\n";
}

void Do::save(){
    if(this->List.size() > 0){ 
        char fname[50];
        cout<<"請(qǐng)輸入文件名:\n";
        cin>>fname; 
        freopen(fname, "w", stdout); //輸出重定向到Contacts.txt
        for(map<string, information>::iterator it = List.begin(); it != List.end(); it++) {
            it->second.printinf(); //輸出到文件中 
        }
        freopen("CON","w",stdout); //  輸出重定向到控制臺(tái) 
        cout<<"保存完畢\n";
    }
    else
        cout<<"當(dāng)前信息內(nèi)無(wú)學(xué)生信息, 存盤(pán)失?。n"; 
}

void Do::read()
{
    char fname[50];
    cout<<"請(qǐng)輸入讀取文件名:\n";
    cin>>fname; 
    freopen(fname, "r", stdin); // 輸入重定向到Contacts.txt" 
    string name, id, sex, classname, classnumber;
    double score; 
    int flag = 0; // 標(biāo)志是否成功讀取文件
    cout<<"文件內(nèi)容:\n"; 
    cout<<"---------------------------------------------------------\n";
    while(cin>>name>>id>>sex>>classname>>classnumber>>score) {
        List.insert(pair<string, information>(name,information(name,id,sex,classname, classnumber, score))); // 將文件中的學(xué)生存儲(chǔ)到學(xué)生列表中 
        cout<<name<<" "<<id<<" "<<sex<<" "<<classname << " " << classnumber << " " << score <<endl;
        flag = 1; 
    }    
    cout<<"---------------------------------------------------------\n";
    flag ? cout<<"讀取完畢\n" : cout<<"文件為空,讀取失敗!\n"; 
    freopen("CON","r",stdin);  // 輸入重定向到控制臺(tái) 
}
void Do::close() {
    cout<<"程序已關(guān)閉\n";
}

int main()
{
    Do arr;//創(chuàng)建學(xué)生類對(duì)象命名為arr
    
    while(1)
    {
        color(4);//紅色
        cout << "*歡迎使用學(xué)生信息管理系統(tǒng)*\n\n";
        color(3);//紅色
        
        cout<<"                     —————學(xué)生信息管理系統(tǒng)—————\n";
        cout<<"                    | 1.        插入學(xué)生信息           |\n";
        cout<<"                    | 2.        刪除學(xué)生信息        |\n";
        cout<<"                    | 3.        修改學(xué)生信息        |\n";
        cout<<"                    | 4.        查詢學(xué)生信息        |\n";    
        cout<<"                    | 5.        列表顯示學(xué)生信息    |\n";
        cout<<"                    | 6.        按分?jǐn)?shù)排序信息        |\n";      
        cout<<"                    | 7.        清空數(shù)據(jù)               |\n";
        cout<<"                    | 8.        學(xué)生信息存盤(pán)        |\n";
        cout<<"                    | 9.        讀出存盤(pán)信息        |\n";
        cout<<"                    | 10.        關(guān)閉系統(tǒng)            |\n";
        cout<<"                     ——————————————————\n";
        color(7); 
        cout<<"請(qǐng)輸入您要使用的功能的對(duì)應(yīng)序號(hào)(數(shù)字鍵1~9):\n";
        int n;
        cin.clear();
        cin>>n;
        switch(n) {//功能選擇 
            case 1:
                arr.append();
                break;
            case 2:
                arr.delet();
                break;
            case 3:
                arr.change();
                break;
            case 4:
                arr.search();
                break;
            case 5:
                arr.printList();
                break;
            case 6:
                arr.Sort();
                break;    
            case 7:
                arr.clear();
                break;
            case 8:
                arr.save();
                break;
            case 9:
                arr.read();
                break;
            case 10:
                arr.close();
                return 0;
                break;
            default:
                cout<<"輸入錯(cuò)誤!請(qǐng)重新輸入!\n";
                break;
        }    
    } 
    system("pause");
    return 0; 
}

讀到這里,這篇“C++中怎么使用Map實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI