链表实现C/C++简单学生学籍管理系统。

实验结果图:




剩下的操作有兴趣的话复制粘贴去试试:

//Main.cpp#include"ManagerStu.h"
int Student::AGE[] = { 0 };
int Student::CLNUM[] = { 0 };
string Student::DEPART[] = { " " };
int Student::departTypes = 0;
int Student::sizes = 0;int main()
{ManagerStu p;p.start();return 0;
}

Student类:

//Student.h#pragma once
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;class Student {public:Student();void setBasic();//录入void changeStu();//修改人员信息Student* delMessage(int nums);//删除人员信息Student* searchStu(int nums);//根据编号查找人员Student* searchStu(string names);//根据姓名查找人员Student* searchStuSex(string sex);//根据性别查找人员Student* searchStuAge(int age);//根据年龄查找人员Student* searchStuClass(int classNum);//根据班号查找人员Student* searchStuDepart(string Depart);//根据系别查找人员void searchAll();//调用上述查找函数//判断输入是否合法bool judgeNums(int num);//学号bool judgeClass(int num);//班号bool judgeSex(string u);//性别bool judgeName(string& inStr);//名字bool judgeAge(int num);//年龄//容错,分别对应(调用)上面函数void judge1(int num);//学号void judge2(int num);//班号void judge3(string u);//性别void judge4(string& inStr);//名字void judge5(int num);//年龄void statisticsSex();//根据性别统计人数void statisticsClass();//根据班号统计人数void statisticsAge();//根据年龄统计人数void statisticsDepart();//根据系别统计人数void statisticsAll();//调用上述统计函数void showMess();//输出学生信息void showBasic();void setBasicFile();//批量录入void writeF(ofstream& ofs);static  int AGE[31];//年龄1-30static  int CLNUM[201];//班号1-200static string DEPART[15];//系别的名称static int departTypes;//系别类型个数static int sizes;//总人数Student* next = NULL;//指针private:int nums;//学号(10位)string name;//名字string sex;//性别int age;//年龄string department;//系别string majoy;//专业int classNum;//班号
};
//Student.cpp#include"Student.h"
Student::Student() {nums = 0;name = " ";sex = " ";age = 0;classNum = 0;majoy = " ";department = " ";
}void Student::setBasic() {//设置基本信息cout << "依次输入学生的学号、姓名、性别、年龄、系、专业、班号:\n";cin >> nums;judge1(nums);cin >> name;judge4(name);cin >> sex;judge3(sex);cin >> age;judge5(age);cin >> department >> majoy;cin>> classNum;judge2(classNum);sizes++;CLNUM[classNum]++;AGE[age]++;int i = 0;while (i < departTypes) {if (DEPART[i] == department) break;i++;}if (i == departTypes) {DEPART[i] = department;departTypes++;}
}Student* Student::delMessage(int nums) {//根据学号nums删除学生Student* p = this;Student* pLast = NULL;while (p != NULL) {if (p->nums != nums) {pLast = p;p = p->next;}else break;}if (p == NULL) {cout << "查无此人!无法进行删除。\n";return NULL;} else {if (p->nums == this->nums) return p->next;//如果是表头,返回表头的nextelse {pLast->next = p->next;AGE[p->age]--;CLNUM[p->classNum]--;delete p;return this;}}
}void Student::changeStu() {//修改信息cout << "输入相应学生的学号,进行修改信息:\n";int u; cin >> u;int times = 3;while (times-- && !judgeNums(u)) cin >> u;Student* p = this;while (p != NULL) {if (p->nums != u) p = p->next;else break;}cout << "输入对应操作数进行修改:\n";cout << "1.学号  2.姓名  3.性别  4.年龄  5.系别  6.专业  7.班号\n";int oper;cin >> oper;switch (oper) {case 1:cout << "输入学号:";cin >> p->nums;p->judge1(p->nums);break;case 2:cout << "输入姓名:";cin >> p->name;p->judge4(p->name);break;case 3:cout << "输入性别:";cin >> p->sex;p->judge3(p->sex);break;case 4:cout << "输入年龄:";cin >> p->age;p->judge5(p->age);break;case 5:cout << "输入系别:";cin >> p->department;break;case 6:cout << "输入专业:";cin >> p->majoy;break;case 7:cout << "输入班号:";cin >> p->classNum;p->judge2(p->classNum);break;default:break;}
}Student* Student::searchStu(int nums) {//根据学号寻找学生//修改后的:Student* p = this;//得到已有的链表Student* u = NULL;//返回的节点while (p != NULL) {if (p->nums != nums) p = p->next;else {u = new Student;//改的地方*u = *p;u->next = NULL;return u;}}return NULL;//原来有bug的:
/*  Student* p = this;Student* u = NULL;while (p != NULL) {if (p->nums != nums) p = p->next;else {u = p;u->next = NULL;//错在这里return u;}}return NULL;*/
}Student* Student::searchStu(string names) {//根据名字寻找学生Student* p = this;Student* u = NULL;while (p != NULL) {if (p->nums != nums) p = p->next;else {u = new Student;*u = *p;u->next = NULL;return u;}}return NULL;/*Student* p = this;Student* u = new Student;while (p != NULL) {if (p->name != names) p = p->next;else {u = p;u->next = NULL;return u;}}return NULL;*/
}Student* Student::searchStuSex(string sex) {//根据性别寻找学生Student* p = this;Student* temp = NULL, * head = NULL;Student* tNext = NULL;while (p != NULL) {if (p->sex == sex) {//找到相同性别,存下来tNext = new Student;*tNext = *p;tNext->next = NULL;if (head == NULL) {//头节点为空temp = tNext;head = temp;}else {//头节点非空temp->next = tNext;temp = temp->next;}if(tNext!=NULL)tNext = tNext->next;}p = p->next;}if (head != NULL)return head;else return NULL;
}Student* Student::searchStuAge(int age) {//根据年龄寻找学生Student* head = NULL;//头节点Student* p = this;Student* temp = NULL;Student* tNext = NULL;while (p != NULL) {if (p->age == age) {//找到相同年龄,存下来tNext = new Student;*tNext = *p;tNext->next = NULL;//只留下此节点if (head == NULL) {//头节点为空temp = tNext;head = temp;}else {//头节点非空temp->next = tNext;temp = temp->next;}if (tNext != NULL)tNext = tNext->next;}p = p->next;}if (head != NULL)return head;else return NULL;
}Student* Student::searchStuClass(int classNum) {//根据班号寻找学生Student* p = this;Student* temp = NULL, * head = NULL;Student* tNext = NULL;while (p != NULL) {if (p->classNum == classNum) {tNext = new Student;*tNext = *p;tNext->next = NULL;if (head == NULL) {temp = tNext;head = temp;}else {temp->next = tNext;temp = temp->next;}if (tNext != NULL)tNext = tNext->next;}p = p->next;}if (head != NULL)return head;else return NULL;
}Student* Student::searchStuDepart(string Depart) {//根据系别寻找学生Student* p = this;Student* temp = NULL, * head = NULL;Student* tNext = NULL;while (p != NULL) {if (p->department == Depart) {tNext = new Student;*tNext = *p;tNext->next = NULL;if (head == NULL) {temp = tNext;head = temp;}else {temp->next = tNext;temp = temp->next;}if (tNext != NULL)tNext = tNext->next;}p = p->next;}if (head != NULL)return head;else return NULL;
}void Student::searchAll() {//控制寻找功能cout << "1.按学号查询单个学生:\n";cout << "2.按姓名查询单个学生\n";cout << "3.按性别查询学生信息\n";cout << "4.按班号查询学生信息\n";cout << "请输入相应操作数:";int u; cin >> u;int numS;//学号string nameS;//姓名string sexX;//性别int numC;//班号Student* p = NULL;switch (u) {case 1:cout << "输入学号:";cin >> numS;judge1(numS);p = searchStu(numS);if (p != NULL)p->showMess();else cout << "查无此人!请重新操作\n";break;case 2:cout << "输入性名:";cin >> nameS;judge4(nameS);p = searchStu(nameS);if (p != NULL)p->showMess();else cout << "查无此人!请重新操作\n";break;case 3:cout << "输入性别:";cin >> sexX;judge3(sexX);p = searchStuSex(sexX);if (p != NULL)p->showMess();else cout << "查无此人!请重新操作\n";break;case 4:cout << "输入班号:";cin >> numC;judge2(numC);p = searchStuClass(numC);if (p != NULL) p->showMess();else cout << "查无此人!请重新操作\n";break;default:break;}
}bool Student::judgeNums(int num) {//学号为10位,除以10九次,余数在1-9范围内for (int i = 1; i <= 9; i++)num /= 10;if (num == 0 || num > 10) return false;else return true;
}bool Student::judgeClass(int num) {//判断班号是否超界if (num >= 1 && num <= 200) return true;else return false;
}bool Student::judgeSex(string u) {//判断性别格式是否符合if (u == "男" || u == "女")return true;else return false;
}bool Student::judgeName(string& inStr) {//判断姓名格式是否符合unsigned char* str = (unsigned char*)inStr.c_str();size_t length = inStr.length();bool t = true;for (size_t i = 0; i < length; ++i){if (str[i] > 160)t = true;if (inStr[i]>=0 && inStr[i]<=127) {t = false;break;}}if (t) return true;elsereturn false;
}bool Student::judgeAge(int num) {if (num <= 30 && num >= 10) return true;else return false;
}void Student::judge1(int num) {//对应judgeNumsint times = 4;while (!judgeNums(nums) && times > 1) {cout << "学号格式错误," << "还剩" << (times - 1) << "次输入机会:"; cin >> nums;times--;}if (times == 1) { cout << "输入学号错误!\n"; system("pause"); exit(0); }else return;
}void Student::judge2(int num) {//对应judgeClassint times = 4;while (!judgeClass(classNum) && times>1) {cout << "班号格式错误," << "还剩" << (times - 1) << "次输入机会:"; cin >> classNum;times--;}if (times == 1) { cout << "输入班号错误!\n"; system("pause"); exit(0); }
}void Student::judge3(string u) {//对应judgeSexint times = 4;while (!judgeSex(sex) && times>1) {cout << "性别格式错误," << "还剩" << (times - 1) << "次输入机会:"; cin >> sex;times--;}if (times == 1) { cout << "输入性别错误!\n"; system("pause"); exit(0); }
}void Student::judge4(string& inStr) {//对应judgeNameint times = 4;while (!judgeName(name) && times > 1) {cout << "姓名格式错误," << "还剩" << (times - 1) << "次输入机会:"; cin >> name;times--;}if (times == 1) { cout << "输入姓名错误!\n"; system("pause"); exit(0); }
}void Student::judge5(int num) {//对应judgeAgeint times = 4;while (!judgeAge(age) && times > 1) {cout << "年龄输入错误," << "还剩" << (times - 1) << "次输入机会:"; cin >> age;times--;}if (times == 1) { cout << "输入年龄错误!\n"; system("pause"); exit(0); }
}void Student::statisticsSex() {//统计性别cout << "按性别统计学生人数:" << '\n';Student* p = searchStuSex("男");int numS=0;while (p != NULL) {p = p->next;numS++;}cout << "男生人数:" << numS << '\n';cout << "女生人数:" << sizes-numS << '\n';
}void Student::statisticsClass() {//统计班号int numC=0;Student* p = NULL;cout << "按班号统计学生人数:" << '\n';for (int i = 1; i <= 200; i++) {numC = 0;if (CLNUM[i] != 0) {p = searchStuClass(i);while (p != NULL) {p = p->next;numC++;}cout << "班号:" << i << '\t' << "人数:" << numC << '\n';}else continue;}}void Student::statisticsAge() {//统计年龄int numA = 0;Student* p = NULL;cout << "按年龄统计学生人数:" << '\n';for (int i = 1; i <= 30; i++) {numA = 0;if (AGE[i] != 0) {Student* p = searchStuAge(i);while (p != NULL) {p = p->next;numA++;}cout << "年龄:" << i << "  \t" << "人数:" << numA << '\n';}else continue;}
}void Student::statisticsDepart() {//统计系别int numD = 0;cout << "按系别统计学生人数:" << '\n';for (int i = 0; i < departTypes; i++) {numD = 0;Student* p = searchStuDepart(DEPART[i]);while (p != NULL) {p = p->next;numD++;}cout << "系别:" << DEPART[i] << '\t' << "人数:" << numD << '\n';}
}void Student::statisticsAll() {//控制统计功能cout << "1.根据性别统计人数:\n";cout << "2.根据班号统计人数\n";cout << "3.根据年龄统计人数\n";cout << "4.根据系别统计人数\n";cout << "请输入相应操作数:";int u; cin >> u;switch (u) {case 1:statisticsSex();break;case 2:statisticsClass();break;case 3:statisticsAge();break;case 4:statisticsDepart();break;default:break;}
}void Student::showMess() {//输出Student* p = this;cout << setiosflags(ios::left) << "学号:" << "\t\t" << "姓名:" << "\t\t" <<"性别:" << "\t\t" << "年龄:" << "\t\t" << "系别:" << "\t\t" << "专业:" << "\t\t" << "班号:" << '\n';while (p != NULL) {p->showBasic();p = p->next;}
}void Student::showBasic() {//特定格式输出基本信息cout << setw(16) << nums;cout << setw(16) << name;cout << setw(16) << sex;cout << setw(16) << age;cout << setw(16) << department;cout << setw(16) << majoy;cout << setw(16) << classNum;cout<< '\n';
}void Student::setBasicFile() {//从文件批量录入Student* p = this;Student* pLast = NULL;//防止最后一个节点的next不为NULLifstream instuf("学生信息.txt", ios::in);instuf.seekg(0, ios::beg);//指针指向文件头instuf.peek();if (instuf.eof())  cout << "文件为空!\n";    else {//cout << "依次读入学生的学号、姓名、性别、年龄、系、专业、班号:\n";while (!instuf.eof()) {//这里不做容错的判断了instuf >> p->nums;if (!judgeNums(p->nums))break;instuf >> p->name;instuf >> p->sex;instuf >> p->age >> p->department >> p->majoy;instuf >> p->classNum;sizes++;CLNUM[p->classNum]++;AGE[p->age]++;int i = 0;while (i < departTypes) {if (DEPART[i] == p->department) break;i++;}if (i == departTypes) {DEPART[i] = p->department;departTypes++;}p->next = new Student;pLast = p;p = p->next;}}if (pLast != NULL)pLast->next = NULL;
}void Student::writeF(ofstream& ofs) {//输出到文件中Student* p = this;if (p == NULL) { cout << "没有数据! 请重新操作\n"; return; }ofs << nums << ' ' << name << ' ' << sex << ' ' << age << ' ' << department << ' ' << majoy << ' ' << classNum << '\n';
}

ManagerStu类:

//ManagerStu.h#pragma once
#include"Student.h"
class ManagerStu {public:void start();//总开关void outScreen();//显示菜单void out();//退出void oper();//操作void writeFile();//保存在文件中Student* readFile();//从文件中读取
private:Student* head = NULL;
};
//ManagerStu.cpp#include"ManagerStu.h"void ManagerStu::start() {this->outScreen();this->oper();
}void ManagerStu::outScreen() {cout << "---------------------------------------------------------\n";cout << "\n\n";cout << "               学校学籍管理系统\n";cout << "               实现功能:\n\n";cout << "         1.录入  2.批量录入\n";cout << "           3.删除  4.修改  5.查询  \n";cout << "         6.所有信息分类统计  \n";cout << "           7.输出所有学生信息\n";cout << "         8.保存在文件中    \n\n";cout << "             0.退出                \n";cout << "\n\n";cout << "---------------------------------------------------------\n";
}void ManagerStu::out() {exit(0);
}void ManagerStu::oper() {cout << "输入数字做相应操作:";char t;//操作数int u;//无固定用处Student* p=NULL;Student* pNext = NULL;//用来防止最后一个节点的next不为NULLhead = p;Student* temp = head;while (cin>>t) {if(!(t <= '9' && t >= '0')){cout << "无此操作数!请重新输入(退出输入0):\n";cin >> t;if (t == '0') out();}else {switch (t) {case '1':pNext = new Student;pNext->setBasic();if (p == NULL) {p = pNext;head = p;}else {p->next = pNext;p = p->next;}pNext = pNext->next;break;case '2':p = readFile();//下面用来接在已经录入的学生的后面temp = head;while (temp != NULL && temp->next != NULL) temp = temp->next;if (temp == NULL) head = p;elsetemp->next = p;cout << "信息录入成功!\n";while (p->next != NULL)p = p->next;break;case '3':head->showMess();cout << "输入要删除成员的学号:";cin >> u;head=head->delMessage(u);head->sizes--;cout << "删除后:\n";head->showMess();break;case '4':head->showMess();head->changeStu();cout << "修改后:\n";head->showMess();break;case '5':head->searchAll();break;case '6':head->statisticsAll();break;case '7':head->showMess();break;case '8':writeFile();cout << "信息保存成功!\n";free(head);head->sizes = 0;head = NULL;break;case '0':exit(0);break;default:break;}}system("pause");system("cls");outScreen();cout << "输入数字做相应操作,输入0则退出\n";}
}void ManagerStu::writeFile() {ofstream ofs;Student* p = head;ofs.open("学生信息.txt", ios::trunc);while (p != NULL) {p->writeF(ofs);p = p->next;}ofs.close();
}Student* ManagerStu::readFile() {Student* p = new Student;p->setBasicFile();return p;
}

在做这玩意时,碰到最大的坑是,在按学号查找学生时原链表丢失了,导致花了好长时间找和改。

大一期末程序课程设计 C/C++实现简单学生学籍管理系统相关推荐

  1. Java课程设计-基于Java Swing的学生信息管理系统-版本二

    Java课程设计-基于Java Swing的学生信息管理系统-版本二 1.介绍 2.相关技术 3. 代码仓库 4.所需环境 5.安装教程 6.运行截图 7.相关博客 1.介绍 设计一个简单学生个人信息 ...

  2. Java课程设计 基于c/s端学生成绩管理系统

    java课设选择了学生成绩管理系统,在此记录一下自己做课设的一些想法和问题. 文件源码放在: https://gitee.com/feeling-cool/java-information-syste ...

  3. 数据库课程设计(上)(学生成绩管理系统)

    文章目录 SQL Server数据库设计 AddC AddS AddSC DelC DelS DelSC UpdateC UpdateS UpdateSC SelC SelS SelSC SQL Se ...

  4. 北京工业大学 大一C语言课程设计--四子棋(Bingo)(连子游戏)in TurboC 3.0

          连子游戏设计报告书                               2009年12月 目录页 目录 1 需求分析... 3 1.1功能与数据需求... 3 1.1.1题目要求的 ...

  5. mysql学籍管理系统的开发背景,学生学籍管理系统的设计与实现(JSP,MySQL)

    学生学籍管理系统的设计与实现(JSP,MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文22000字,程序代码,MySQL数据库) 本课题根据学生学籍管理系统的流程及所需要的相关 ...

  6. 学生学籍管理系统 jsp mysql_学生学籍管理系统的设计与实现(JSP,MySQL)

    学生学籍管理系统的设计与实现(,MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文22000字,程序代码,MySQL数据库) 本课题根据学生学籍管理系统的流程及所需要的相关操作, ...

  7. 我的C程序,学生学籍管理系统

      1. 系统概述 学生学籍管理系统从学生学籍管理的现状出发,以实现学生学籍管理为设计目标 学生学籍管理系统:用数据文件存放学生的学籍,可对学生学籍进行注册,登录,修改,删除,查找,统计,学籍变化等操 ...

  8. 大一c语言程序课程报告,大一C语言课程设计.doc

    大一C语言课程设计 C语言课程设计报告 班 级: 电气1004 学 号: 201009334 姓 名: 雷海燕 指导教师: 王果 2011 年 07 月 18 日 1 基本题目 1.1题目 1.1 题 ...

  9. HTML期末作业课程设计期末大作业——体育排球5页面带注册HTML+CSS+JS(学生网页设计作业源码)

    HTML期末作业课程设计期末大作业--体育排球5页面带注册HTML+CSS+JS(学生网页设计作业源码) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手 ...

最新文章

  1. Eclipse一直building workspace问题解决
  2. 平滑线反锯齿工具_PS大神常用选框类工具有哪些?其实很简单,小白认真学也能懂...
  3. python中列表的sort方法_python中列表的sort方法使用详解
  4. SAP 开发陷阱一箩筐(02)——无法创建客户增强的包含程序
  5. 进程的五种状态和线程的六种状态
  6. python gui button回调函数运行完成后弹出窗口_嵌入式设备GUI开发之GTK+入门(一)...
  7. 简单易用的开源ORM框架SqlSugar v5.0.0.19源码
  8. python3档案管理程序源码_php人事档案管理系统,源码免费分享
  9. jquery ajax 向spring MVC controller中传值并接受及解析返回值
  10. 自动驾驶 6-4 高级转向控制 - MPC Advanced Steering Control - MPC
  11. Bootstrap---dateTimePicker时间控件配置与应用
  12. 基于Spring MVC + Spring + MyBatis的【网上购物系统】
  13. cmos逻辑门传输延迟时间_芯片设计进阶之路——从CMOS到建立时间和保持时间
  14. Asp.net +jQuery +ajax 传参问题
  15. ESP32|基于ESP32制作的低成本、可拓展性高的NES游戏机(1)(开源ESP32 NES模拟器)-效果演示及介绍
  16. ETC技术之DSRC协议笔记
  17. 京东云618年中大促开始啦!
  18. MySQL Online DDL学习笔记
  19. 解决sql update 1292 - Truncated incorrect DOUBLE value:
  20. 巨亏超10亿!“汽车金融第一股”易鑫业绩腰斩,上半年却傍上腾讯

热门文章

  1. 科技型中小企业的申报流程及材料?
  2. PHP 连接sql server
  3. jsliang 求职系列 - 40 - CSS 移动端
  4. DSPE-PEG-SP2-AA,二硬脂酰基磷脂酰乙醇胺-聚乙二醇-SP2-AA,具有较好的生物相容性和被动靶向性,可应用于药物输送系统
  5. linux -- 嵌入式linux下wifi无线网卡驱动
  6. HTML04-form表单
  7. 2020年河南高考--各高校在河南录取分数线预测(本科二批——文科)
  8. 待解决问题-流体力学
  9. USB接口测试器--USB2.0/USB3.0信号检测器
  10. 一位全加器 VHDL设计与实现