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

链表实现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-30
	static  int CLNUM[201];//班号1-200
	static 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;//如果是表头,返回表头的next
		else {
			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;