• 注意:此时排序规则函数定义为全局函数

C++中定义CStudent类

文件名:Student.h

#pragma once
#include <afxtempl.h>
typedef struct SUser
{int nNumb;char sName[20];float fMath;
}DATA;typedef bool(*BY_FUNC)(DATA& q,DATA& m);class CStudent
{CList<DATA> m_list;int Menu();int Input();void Delete();void Modify();void Print();void Sort(BY_FUNC pFunc);int SortMenu();void Load();void Save();void PrintPS(POSITION* ps); // 与上篇博客不同之处public:CStudent();~CStudent();void Start();
};

类成员函数实现

文件名:Student.cpp

#define _CRT_SECURE_NO_WARNINGS #include <iostream>
#include "Student.h"using namespace std;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:Delete();case 4:Modify();}return i;
}int CStudent::Input()
{cout << "请输入学号:";DATA d;cin >> d.nNumb;cout << "请输入姓名和数学成绩(空格间隔):";cin >> d.sName >> d.fMath;m_list.AddTail(d);Print();Save();cout << "是否继续添加?";rewind(stdin);char c = getchar();return c == 'y' || c == 'Y';return 0;
}void CStudent::Delete()
{int nNumb;Print();cout << "\n请输入要删除的学号:";cin >> nNumb;POSITION pos = m_list.GetHeadPosition();while (pos){if (m_list.GetAt(pos).nNumb == nNumb){m_list.RemoveAt(pos);Print();cout << "删除成功!" << endl;system("pause");Save();return false;}m_list.GetNext(pos);}cout << "你输入的学号不存在,是否继续删除?[y/n]" ;char c = _getch();putchar(c);puts("");return 'y' == c || 'Y' == c;
}void CStudent::Modify()
{}void CStudent::Print()
{POSITION pos = m_list.GetHeadPosition();cout << "学号\t姓名\t成绩" << endl;while (pos){DATA d = m_list.GetAt(pos);cout << d.nNumb << "\t" << d.sName << "\t" << d.fMath << endl;m_list.GetNext(pos);}system("pause");
}bool byNumb(DATA& q,DATA& m)
{return q.nNumb < m.nNumb;
}bool byName(DATA& q, DATA& m)
{return strcmp(q.sName, m.sName) < 0;
}bool byMath(DATA& q, DATA& m)
{return q.fMath > m.fMath;
}void CStudent::Sort(BY_FUNC pFunc)
{int n = m_list.GetCount();POSITION* ps = new POSITION[n + 1];POSITION pos = m_list.GetHeadPosition();int i = 0, m = 0, j = 0;while (ps[i++] = pos)m_list.GetNext(pos);pos = m_list.GetHeadPosition();i = 0;while (i < n - 1){m = i;j = i + 1;while (j < n){if (pFunc(m_list.GetAt(ps[j]), m_list.GetAt(ps[m]))) //ps[j]的类型是POSITIONm = j;++j;}if (m != i){POSITION t = ps[i];ps[i] = ps[m];ps[m] = t;}++i;}PrintPS(ps);delete[] ps;
}void CStudent::PrintPS(POSITION* ps)
{int i = 0;cout << "学号\t姓名\t成绩" << endl;while (ps[i]){DATA d = m_list.GetAt(ps[i]);cout << d.nNumb << "\t" << d.sName << "\t" << d.fMath << endl;++i;}system("pause");
}int CStudent::SortMenu()
{system("cls");puts("1.按学号排序");puts("2.按姓名排序");puts("3.按成绩排序");puts("4.不排序");puts("0.返回主菜单");int i = 0;cin >> i;BY_FUNC ps[] = { byNumb,byName,byMath };switch (i){case 1:case 2:case 3:Sort(ps[i-1]);break;case 4:Print();default:return i;}return i;return 0;
}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.AddTail(t);fclose(pf);
}void CStudent::Save()
{FILE* pf = fopen("stud.lv", "w");if (!pf){puts("保存文件时失败!");system("pause");return;}POSITION pos = m_list.GetHeadPosition();while (pos){fwrite(pos, 1, sizeof(DATA), pf);m_list.GetNext(pos);}
}CStudent::CStudent()
{}CStudent::~CStudent()
{}void CStudent::Start()
{Load();while (Menu());
}

主函数

文件名:main.cpp

#include <iostream>
#include "Student.h"
int main()
{CStudent st;st.Start();return 0;
}

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

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

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

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

    本文通过STL类库的list数据结构来完成学生管理系统,采用链表外排序,通过函数指针实现. 注意:此时排序规则函数定义为类静态成员函数,等价于全局函数 函数指针定义为 BY_FUNC ps[] = { ...

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

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

  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. 一. python面向对象基础
  2. 将frm,myi,myd文件打包成sql文件
  3. SAP Spartacus MyCompany菜单里Org unit的Add按钮Accessibility问题初始分析
  4. HDUOJ 1428
  5. python中常见的15中面试题
  6. net 架构师-数据库-sql server-002-工具
  7. 答网友问:一个abs函数引发的问题
  8. 【Android 异常】 Parcelable encountered IOException writing serializable object
  9. 巨头的联盟链选择 | 直播实录
  10. 【车间调度】基于遗传算法求解车间调度matlab源码
  11. Kaggle:入门赛Tatanic(泰坦尼克号)84.21%带你冲进前2%
  12. 算法特训营第2周刷题题目
  13. 一瑞士法郎是多少人民币
  14. SCI、EI、ISTP国际三大检索分别指的是什么?
  15. 一页纸商业计划书模板(转载)
  16. Python中的len()函数
  17. java根据word模板导出_java根据模板生成,导出word和pdf(aspose.words实现word转换pdf)...
  18. BP神经网络学习笔记
  19. 实测windows 7兼容软件
  20. DR、BDR 和 Master、Slave

热门文章

  1. Spring:自动接线或不自动接线
  2. 电力系统潮流计算matlab程序,大神们,求个电力系统潮流计算的matlab程序。
  3. SVN更新数据和提交数据的几个疑问
  4. IntelliJ IDEA for Mac工件包(artifact)中 Web facet resources 的模块名称有误,如何修改?
  5. shell脚本--使用for循环逐行访问txt文件
  6. python字符串split_python字符串之split
  7. C++ 11 深度学习(八)重定义override
  8. linux 查看日志_干货 | 名企高频考点之谈谈Linux日志查看方式都有哪些
  9. 属性面板 脚本_3.1 创建和使用脚本
  10. 合肥工业大学机器人技术期末_机器人技术第三次作业(HFUT)