本文通过STL类库的list数据结构来完成学生管理系统,采用链表外排序,通过函数指针实现。

  • 注意:此时排序规则函数定义为类静态成员函数,等价于全局函数
  • 函数指针定义为
    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(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();
};

类成员函数实现

文件名: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);elsecout << "没有找到符合的学号" << 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 strstrif (strstr(it->sName,sName)) //模糊查找cl.push_back(*it);++it;}if (cl.size())PrintFind(cl);elsecout << "没有找到符合条件的姓名" << 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 strstrif (it->fMath>nMin && it->fMath<=nMax) //模糊查找cl.push_back(*it);++it;}if (cl.size())PrintFind(cl);elsecout << "没有找到符合条件分数" << 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 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");
}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]是什么类型? DATAwhile (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.cpp

#include "Student.h"
void main()
{CStudent st;st.Start();
}

【6】C++语法与数据结构之STL_list学生管理系统_链表外排序_函数指针相关推荐

  1. 【5】C++语法与数据结构之STL_list学生管理系统_链表内排序_函数指针

    本文通过STL类库的list数据结构来完成学生管理系统,采用链表内排序,通过list类库自带sort函数进行排序. 注意:此时排序规则函数定义为类静态成员函数,等价于全局函数 函数指针定义为 BY_F ...

  2. 【3】C++语法与数据结构之MFC_CList学生管理系统_链表外排序_函数指针

    注意:此时排序规则函数定义为全局函数 C++中定义CStudent类 文件名:Student.h #pragma once #include <afxtempl.h> typedef st ...

  3. 【2】C++语法与数据结构之MFC_CList学生管理系统_链表内排序_函数指针

    MFC中CList类库的遍历 #include <iostream> #include "List.h" using namespace std; void main( ...

  4. 学生管理系统(链表)

    文章目录 前言 一.具体过程 1.引入头文件contact.h 2.创建test.c 3.创建contact.c 二.写在最后 前言 链表的学生管理系统相比之前更高效,同样有内存的扩充,也补充了文件操 ...

  5. 学生管理系统(C++语言_顺序表)

    该程序是基于C++语言实现的学生管理系统.其中运用到了STL里的容容器,算法和迭代器,以及C++11的仿函数等.主要实现了学生信息的增删改查等.有不足之处还请各路朋友们指正. 测试环境为Windows ...

  6. 学生管理系统——用链表实现

    前言 该程序是大一上学期的课设,在上学期的基础上对此程序进行了细节上的优化,以及将程序分成多个文件,第一次对多文件开发有了了解(再也不要将几千行代码放在一个文件内了) 一. 软件功能描述 假设学生成绩 ...

  7. 学生管理系统(链表+数据库)学习小结

    //学生管理系统的小结(另一个版本http://blog.csdn.net/ytz_linuxer/archive/2009/07/18/4358937.aspx) 作者:刘晓兵 语言:C语言,主要是 ...

  8. 数据结构课程实验——学生管理系统——源代码

    源代码 screen类(用来与用户交互) import java.util.*;class screen {void maindan(){student1 pg1=new student1();pg1 ...

  9. 学生管理系统 java 开题报告_基于JAVA的学籍管理系统开题报告.doc

    毕业设计(论文)选题申请表 基本情况学生姓名 学 号 专 业 年 级题 目基于JAVA的学生学籍管理系统的设计与实现选题来源指导教师推荐( 学生自拟( 其它(选择本题目原因 选择基于JAVA的学生学籍 ...

最新文章

  1. 谈 三层结构与MVC模式的区别
  2. 微信为什么打不开html,微信打不开怎么回事 微信打不开解决方法
  3. Java将中文姓名转换为拼音
  4. mysql 按指定值排序
  5. 【小程序开发】微信小程序开发中遇到的那些坑...
  6. [转]Linux下的虚拟光驱和虚拟软驱
  7. 我的世界风格字体 艺术字生成 Textcraft的介绍及使用
  8. 独秀日记:童道自然大夫山徒步
  9. html页面悬浮提示框,js实现页面悬浮框
  10. 方法finalize()的应用
  11. 如何准备机器学习数据集_机器学习演练第一部分:准备数据
  12. 卑鄙与高尚,理想与现实
  13. 1.3(1) 框架——内嵌框架
  14. 渲染多层材料的综合框架
  15. Android 刘海屏适配全攻略
  16. 假如腾讯跟360之战是一场阴谋联想到的
  17. 滴滴为什么选择与章鱼哥APP合作?
  18. 计算机主板测评,评测部分及总结
  19. SUSE12 SP2配置静态ip
  20. 加拿大访问学者家属如何办理探亲签证?

热门文章

  1. JPA 2 | 动态查询与命名查询
  2. 不要仅仅依靠单元测试
  3. Spring系列合并
  4. JSF – PrimeFaces和休眠集成项目
  5. 将Spring集成到旧版应用程序中
  6. Linux 命令之 set -- 显示或设置 shell 特性及 shell 变量
  7. 使用 ssh 命令来访问(登录/连接)远程服务器主机
  8. 四川大学金融转计算机,[请教]川大和西财哪个金融系好?!
  9. oracle同步恢复目录,Oracle创建恢复目录(catalog)
  10. java netty swap高_Netty 超时机制及心跳程序实现