【5】C++语法与数据结构之STL_list学生管理系统_链表内排序_函数指针
生活随笔
收集整理的這篇文章主要介紹了
【5】C++语法与数据结构之STL_list学生管理系统_链表内排序_函数指针
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文通過STL類庫的list數據結構來完成學生管理系統,采用鏈表內排序,通過list類庫自帶sort函數進行排序。
- 注意:此時排序規則函數定義為類靜態成員函數,等價于全局函數
- 函數指針定義為
BY_FUNC ps[] = { CStudent::byNumb,CStudent::byName,CStudent::byMath };
C++中定義CStudent類
文件名:Student.h
#pragma once #include <list> typedef struct SUser {int nNumb;char sName[20];float fMath; }DATA;//using namespace std; //頭文件中最好不要usingtypedef bool (*BY_FUNC)(DATA& q, DATA& m);class CStudent {std::list<DATA> m_list;int Menu();int Input();bool Delete();void Modify();void Print();//void Sort(BY_FUNC pFunc);int SortMenu();void Load();void Save();//void PrintPS(POSITION* ps);bool Check(int nNumb);int FindMenu();//void FindByNumb();static bool byNumb(DATA& q, DATA& m) // 靜態成員函數{return q.nNumb < m.nNumb;}static bool byName(DATA& q, DATA& m){return strcmp(q.sName, m.sName) < 0;}static bool byMath(DATA& q, DATA& m){return q.fMath > m.fMath;} public:CStudent();~CStudent();void Start(); };類成員函數實現
文件名:Student.cpp
#define _CRT_SECURE_NO_WARNINGS#include "Student.h" #include <iostream> #include <conio.h> using namespace std;bool CStudent::Check(int nNumb) {list<DATA>::iterator it = m_list.begin();while (it!=m_list.end()){if (it->nNumb == nNumb)return true;++it;}return false; }int CStudent::FindMenu() {return 0; }CStudent::CStudent() { }CStudent::~CStudent() { }void CStudent::Start() {Load();while (Menu()); }int CStudent::SortMenu() {system("cls");puts("1.按學號排序");puts("2.按姓名排序");puts("3.按成績排序");puts("4.不排序");puts("0.返回主菜單");int i = 0;cin >> i;BY_FUNC ps[] = { CStudent::byNumb,CStudent::byName,CStudent::byMath };switch (i){case 1:case 2:case 3:m_list.sort(ps[i - 1]);case 4:Print();default:return i;}return i; }void CStudent::Load() {FILE* pf = fopen("stud.lv", "r");if (!pf){puts("加載文件時失敗!");system("pause");return;}DATA t;while (fread(&t, 1, sizeof(DATA), pf) == sizeof(DATA))m_list.push_back(t);fclose(pf); }void CStudent::Save() {FILE* pf = fopen("stud.lv", "w");if (!pf){puts("保存文件時失敗!");system("pause");return;}list<DATA>::iterator it = m_list.begin();while (it!=m_list.end()){fwrite(&(*it), 1, sizeof(DATA), pf);++it;}fclose(pf); }int CStudent::Menu() {system("cls");//clear screenputs("\n\t\t1、瀏覽所有信息");puts("\t\t2、添加信息");puts("\t\t3、刪除信息");puts("\t\t4、修改信息");puts("\t\t5、查找信息");puts("\t\t0、退出");printf("\t\t請選擇:");int i = 0;cin >> i;switch (i){case 1:while (SortMenu());break;case 2:while (Input());break;case 3:while (Delete());break;case 4:Modify();break;case 5:while (FindMenu());}return i; }int CStudent::Input() {cout << "請輸入學號:";DATA d;while (true){cin >> d.nNumb;if (Check(d.nNumb))cout << "學號已存在,請重新輸入:";elsebreak;}cout << "請輸入姓名和數學成績(空格間隔):";cin >> d.sName >> d.fMath;m_list.push_back(d);Save();Print();cout << "是否繼續添加?[y/n]";rewind(stdin);char c = getchar();return c == 'y' || c == 'Y'; }bool CStudent::Delete() {int nNumb;Print();cout << "請輸入要刪除的學號:";cin >> nNumb;list<DATA>::iterator it = m_list.begin();while (it!=m_list.end()){if (it->nNumb == nNumb){m_list.erase(it);Print();cout << "刪除成功!" << endl;system("pause");Save();return false;}++it;}cout << "你輸入的學號不存在,是否繼續刪除?[y/n]";char c = _getch();putchar(c);puts("");return 'y' == c || 'Y' == c; }void CStudent::Modify() { }void CStudent::Print() {list<DATA>::iterator it = m_list.begin();cout << "學號\t姓名\t成績" << endl;while (it!=m_list.end()){cout << it->nNumb << "\t" << it->sName << "\t" << it->fMath << endl;++it;}system("pause"); }主函數
文件名:main.cpp
#include "Student.h" void main() {CStudent st;st.Start(); }總結
以上是生活随笔為你收集整理的【5】C++语法与数据结构之STL_list学生管理系统_链表内排序_函数指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Peewee 高阶用法
- 下一篇: Android后台耗电分析及优化