This article uses the list data structure of the STL library to complete the student management system, using 链表外
sorting, and implementing it through function pointers.
- Note: At this time, the collation function is defined as a class static member function, which is equivalent to a global function
- The function pointer is defined as
BY_FUNC ps[] = { CStudent::byNumb,CStudent::byName,CStudent::byMath };
Define the CStudent class in C++
file name:Student.h
#pragma once
#include <list>
typedef struct SUser
{
int nNumb;
char sName[20];
float fMath;
}DATA;
//using namespace std; //头文件中最好不要using
typedef 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(std::list<DATA>::iterator* ps);
bool Check(int nNumb);
int FindMenu();
void FindbyNumb();
void FindbyName();
void FindbyMath();
void PrintFind(std::list<DATA>& cl);
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();
};
Class member function implementation
file name:Student.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "Student.h"
#include <iostream>
#include <conio.h>
using namespace std;
CStudent::CStudent()
{
}
CStudent::~CStudent()
{
}
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;
}
typedef void(*FIND_FUNC)();
int CStudent::FindMenu()
{
system("cls");
puts("1、按学号查找:");
puts("2、按姓名查找:");
puts("3、按数学分数段查找:");
puts("0、返回主菜单:");
//FIND_FUNC ps[] = { FindbyNumb,FindbyName };
int i;
cin >> i;
switch (i)
{
case 1:
FindbyNumb();
break;
case 2:
FindbyName();
break;
case 3:
FindbyMath();
break;
}
return i;
}
void CStudent::FindbyNumb()
{
cout << "请输入要查找的学号:";
int nNumb;
cin >> nNumb;
list<DATA>::iterator it = m_list.begin();
list<DATA> cl;
while (it != m_list.end())
{
if (it->nNumb == nNumb)
{
cl.push_back(*it);
break;
}
++it;
}
if (cl.size())
PrintFind(cl);
else
cout << "没有找到符合的学号" << endl;
system("pause");
}
void CStudent::FindbyName()
{
cout << "请输入要查找的姓名:";
char sName[20];
cin >> sName;
list<DATA>::iterator it = m_list.begin();
list<DATA> cl;
while (it != m_list.end())
{
//strchr strpbrk strstr
if (strstr(it->sName,sName)) //模糊查找
cl.push_back(*it);
++it;
}
if (cl.size())
PrintFind(cl);
else
cout << "没有找到符合条件的姓名" << endl;
system("pause");
}
void CStudent::FindbyMath()
{
cout << "请输入要查找的分数段(2个数):";
float nMin, nMax;
cin >> nMin >> nMax;
if (nMin > nMax)
swap(nMin, nMax);
list<DATA>::iterator it = m_list.begin();
list<DATA> cl;
while (it != m_list.end())
{
//strchr strpbrk strstr
if (it->fMath>nMin && it->fMath<=nMax) //模糊查找
cl.push_back(*it);
++it;
}
if (cl.size())
PrintFind(cl);
else
cout << "没有找到符合条件分数" << endl;
system("pause");
}
void CStudent::PrintFind(std::list<DATA>& cl)
{
cout << "学号\t姓名\t成绩" << endl;
list<DATA>::iterator it = cl.begin();
while (it != cl.end())
{
cout << it->nNumb << "\t" << it->sName << "\t" << it->fMath << endl;
++it;
}
}
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]);
Sort(ps[i-1]);
break;
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);
}
void CStudent::PrintPS(list<DATA>::iterator* ps)
{
int i = 0;
cout << "学号\t姓名\t成绩\t" << endl;
while (ps[i] != m_list.end())
{
cout << ps[i]->nNumb << "\t" << ps[i]->sName << "\t" << ps[i]->fMath << endl;
++i;
}
system("pause");
}
int CStudent::Menu()
{
system("cls");//clear screen
puts("\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 << "学号已存在,请重新输入:";
else
break;
}
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");
}
void CStudent::Sort(BY_FUNC pFunc)
{
int n = m_list.size(), i = 0;
list<DATA>::iterator* ps = new list<DATA>::iterator[n + 1];
list<DATA>::iterator it = m_list.begin();
//方法一
//while (i<n+1)
// ps[i++] = it++;
//方法二
while ((ps[i] = it) != m_list.end())
++i,++it;
i = 0;
while (i < n - 1)
{
int j = i + 1;
int m = i;
//*ps[m] *ps[j]是什么类型? DATA
while (j < n) //ps[m] ps[j]是什么类型? list<DATA>::iterator
{
if (pFunc(*ps[j], *ps[m]))
m = j;
++j;
}
if (m != i)
{
list<DATA>::iterator t = ps[m];
ps[m] = ps[i];
ps[i] = t;
}
++i;
}
PrintPS(ps);
delete []ps;
}
Main function
file name:main.cpp
#include "Student.h"
void main()
{
CStudent st;
st.Start();
}