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

本文通过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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建一个坚固的备份系统

在Foreach&#xff0c;我们拥有Synology RS815 来存储所有备份。 这些备份来自我们网络中的不同来源&#xff0c;例如路由器&#xff0c;交换机&#xff0c;数据库服务器&#xff0c;Web服务器&#xff0c;应用程序日志文件&#xff0c;邮件服务器等等。 Synology NAS使配置这…

班级网站-前端网页技术精美完整源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;班级网站 获取完整源码&#xff08;打开即可用&#xff09; 效果图①首页主页 效果图②关于页面 效果图③联系方式及留言 效果图④我们的画廊展示 其余及源码详见微信公众号下载&#xff01; <!DOCTYPE html> <html…

医药协会网站-前端网页技术设计HTML+CSS精美完整网页网站源码

微信公众号&#xff1a;创享日记 发送&#xff1a;医药协会网站 获取完整源码 效果图预览①主页首页 效果图预览②资源下载中心 效果图预览③登录/注册 效果图预览④文章资讯详情 效果图预览⑤文章资讯列表 效果图预览⑥留言板 效果图预览⑦图文列表 效果图预览⑧图文详情 源码…

数字通信系统仿真的MATLAB实现(QPSK)

关注公号【逆向通信猿】更精彩!!! 仿真结果 本文以QPSK为调制体制进行仿真,以下结果为比特信噪比Eb/N0=10dB(此时符号信噪比Es/N0=13dB,SNR信噪比=3.98dB,换算关系在代码中为第44行)时的各步骤结果图

动漫网站-前端网页技术精美网站源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;动漫网站 获取完整源码&#xff08;打开即可用&#xff09; 效果图①主页首页 效果图②作品列表展示页 效果图③作品详情展示页 效果图④联系我们 效果图⑤博客列表 效果图⑥博客详情 效果图⑦其它 其它及源码详见微信公众号下…

java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

java设计模式迭代器模式迭代器模式是一种行为模式&#xff0c;它用于提供遍历一组对象的标准方式。 Iterator模式在Java Collection Framework中得到了广泛使用&#xff0c;其中Iterator接口提供了遍历集合的方法。 根据GoF&#xff0c;迭代器设计模式的意图是&#xff1a; 提…

【2021.02.09更新】数学常用基本公式

泰勒级数 条件不多说了&#xff0c;函数f(x)f(x)f(x)在点xx0x {x_0}xx0​出展开为 f(x0)f′(x0)(x−x0)f′′(x0)2!(x−x0)2⋯f(n)(x0)n!(x−x0)n⋯f({x_0}) f({x_0})(x - {x_0}) \frac{{f({x_0})}}{{2!}}{(x - {x_0})^2} \cdots \frac{{{f^{(n)}}({x_0})}}{{n!}}{(x - {…

服装商城电商-前端网页技术精美完整源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;服装电商 获取完整源码&#xff08;打开即可用&#xff09; 效果①主页首页 效果②登录页 效果③注册页 效果④结算结账页 效果⑤联系页 效果⑥找不到资源页 效果⑦商品列表页 效果⑧商品详情页 效果⑨心愿清单页 其余及源码详…

REST:使用Controller端点?

在一般的REST架构中&#xff0c;基本概念是资源。 在资源之后&#xff0c;下一步是为这些资源开发一个统一接口&#xff0c;这在HTTP领域通常意味着&#xff1a; 创建为POST 阅读就是GET 更新为PUT&#xff08;或部分更新为PATCH&#xff09; 删除已删除 在现实世界中&…

【2021.02.09更新】数字信号处理公式推导

卷积 h(t)⊗x(t)∫−∞∞h(τ)x(t−τ)dτh(t) \otimes x(t) \int_{ - \infty }^{ \infty } {h(\tau )x(t - \tau )d\tau }h(t)⊗x(t)∫−∞∞​h(τ)x(t−τ)dτ 令τut2\tau u \frac{t}{2}τu2t​&#xff0c;则 h(t)⊗x(t)∫−∞∞h(ut2)x(−ut2)duh(t) \otimes x(t) …

旅游展示网站-前端网页设计技术完整精美源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;旅游网站 获取完整源码&#xff08;打开即可用&#xff09; 效果①首页主页 效果②关于我们页 效果③提供的服务页 效果④我们的能力页 /*页面重置*/ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote…

【2021.01.01】人生中很重要的一个十年,差强人意

回顾整个2020年&#xff0c;是疯狂的一年&#xff0c;也是令人难忘的一年&#xff0c;对于我也是比较励志的一年&#xff0c;绝对是自己人生中的一个里程碑。完成了人生中最重要的一件大事&#xff0c;感谢有你一直陪着我&#xff0c;愿天下有情人终成眷属&#xff0c;最终走到…

数字信号处理实验一 系统响应及系统稳定性

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;响应及稳定…

BPSK调制下(2,1,3)、(2,1,6)卷积码与QC-LDPC码译码性能和抑制突发噪声性能对比(MATLAB实现)

欢迎同步关注公众号【逆向通信猿】 QC-LDPC码的原理及构造 通过准循环码方式构造低密度校验矩阵 H ⁡ \operatorname{H} H,基础校验矩阵采用 H b = [ 0 1

数字信号处理实验二 IIR数字滤波器设计及软件实现

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;iir滤波器 …

高级java开发_适用于高级Java开发人员的十大书籍

高级java开发Java是当今最流行的编程语言之一。 有很多适合初学者的书籍。 但是对于那些使用Java进行过一段时间编程的人来说&#xff0c;其中有些人看起来有些简单和多余。 初学者的书没有带来新鲜有趣的想法。 但是&#xff0c;高级Java书籍并不总是就在眼前&#xff0c;并非…

数字信号处理实验三 FIR数字滤波器设计与软件实现

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;fir滤波器 …

一种伪随机交织器的生成方法

欢迎同步关注公众号【逆向通信猿】 线性同余交织+m序列寄存器状态→伪随机交织 线性同余交织 A n + 1 ≡ a A n + c   m

[JDK 11] jcmd中的类加载器层次结构详细信息

自从在JavaOne 2012上听说 jcmd以来&#xff0c;我就一直是命令行诊断工具jcmd的 粉丝 。 从那时起&#xff0c;我已广泛使用此工具&#xff0c;并多次在此博客中发布过此工具&#xff1a; jcmd&#xff1a;一个可以全部统治的JDK命令行工具 确定活动的热点垃圾收集器 程序化…

无线定位技术实验一 TDOA-FDOA联合定位

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;联合定位 获…