大一期末作业 c/c++实现简单学校人员管理系统

c/c++实现简单学校人员管理系统

动手前列的框架:

在这里插入图片描述

成品是这样子的:

在这里插入图片描述
在这里插入图片描述

剩下的操作有兴趣的话复制粘贴去试试:
另一篇C++课设传送门

代码如下:

//Main.cpp
#include"US.h"
int People::sizes = 0;
int main()
{
	US s;
	s.start();
	s.out();
	return 0;
}

以上的Main函数中的US类是用来管理人员以及实现操作的(即开头的框架图的右边部分)。
US类:
//US.h

#pragma once
#include"Student.h"
#include"Staff.h"
class US :virtual public Student ,virtual public Staff {
public:
	void start();//总开关
	void outScreen();//显示菜单
	void out();//退出
	void Oper();//操作
	void writeFile();//保存在文件中
	void readFile();//从文件中读取
	void deleFile();//删除保存的数据
protected:
	People* P = NULL, * head = P,*temp=NULL;
};

//US.cpp

#include"US.h"
void US::start() {
	this->outScreen();
	this->Oper();
}

void US::outScreen() {
	cout << "---------------------------------------------------------\n";
	cout << "\n\n";
	cout << "	    学校人员管理系统\n";
	cout << "		实现功能:\n";
	cout << "    1.增  2.删  3.查  4.改  5.按编号排序\n";
	cout << "    6.查看所有信息  7.保存在 人员.txt 中  8.从文件中读取\n";
	cout << "    9.删除 人员.txt中的数据\n";
	cout << "\n\n";
	cout << "---------------------------------------------------------\n";
}

void US::Oper() {
	cout << "输入数字做相应操作,输入0则退出\n";
	int t; 
	int u;			
	People* p = NULL;
	Student* p1 = NULL;
	Staff* p2 = NULL;
	while (true) {
		cin >> t;
		if (t == 0) out();
		else {
			switch (t){
			case 1:
				cout << "新增学生输入1,新增教职工输入2:\n";
				cin >> u;
				if (u == 1) {
					p1 = new Student;
					p1->addMessage();
					if (P == NULL) P = p1;
					else P->next = p1;
				}
				else {
					p2 = new Staff;
					p2->addMessage();
					if (P == NULL) P = p2;
					else P->next = p2;
				}
				if (head == NULL) {
					head = P;
					temp = head;
				}
				else {
					temp->next = P;
					temp = temp->next;
				}
				P = P->next;
				break;
			case 2:
				cout << "输入删除第几个成员:"; cin >> u;
				head=head->delMessage(u);
				break;
			case 3:
				cout << "输入查看第几个成员:"; cin >> u;
				p = (head->searchPeople(u));
					if(p!=NULL) p->showMess();
				break;
			case 4:
				head->changePeople();
				break;
			case 5:
				head->sortPeople();
				break;
			case 6:
				p = head;
				while (p != NULL) {
					p->showMess();
					p = p->next;
				}
				break;
			case 7:
				writeFile();
				break;
			case 8:
				readFile();
				break;
			case 9:
				deleFile();
				break;
			default:
				break;
			}
		}
		system("pause");
		system("cls");
		outScreen();
		cout << "输入数字做相应操作,输入0则退出\n";
	}
}
void US::out() {
	exit(0);
}

void US::writeFile() {
	ofstream ofs;
	People* p = head;
	ofs.open("人员.txt", ios::out | ios::app);
	while (p != NULL) {
		p->writeF(ofs);
		p = p->next;
	}
	ofs.close();
}

void US::readFile() {
	ifstream ifs("人员.txt", ios::in);
	char s[80];
	while (!ifs.eof()) {
		ifs.getline(s, 80);
		cout << s;
		cout << '\n';
	}
	
	ifs.close();
}

void US::deleFile() {
	ofstream ofs("人员.txt", ios::trunc);
	ofs.close();
}

以上是框架图中右边的部分,以下则是左边的部分:

People类:
//People.h

#pragma once
#include<iostream>
#include<fstream>
using namespace std;
class People {

public:
	People() { num = 0;  sizes = 0; sex = ' '; name = " "; };

	virtual void setBasic();//设置信息
	virtual void showMess();//显示信息
	virtual void addMessage();//增加人员信息
	virtual void outPeople();//普通输出人员信息
	virtual void outOne();//输出一个人员信息
	virtual void changePeople();//修改人员信息
	virtual void writeF(ofstream& ofs);//写入文件

	People* delMessage(int nums);//删除人员信息
	People* searchPeople(int num);//查找人员信息
	People* sortPeople();根据某样数据来排序

	static int sizes;//人数

	People* next = NULL;

protected:
	int num;//编号
	char sex;//性别
	string name;//姓名
};
//People.cpp

#include"People.h"
People* People::sortPeople() {//根据编号排序,后面回看发现这部分链表的排序有误

	People* p = this, * t = this, * head = this;
	for (int i = 0; i < sizes; i++) {
		p = t = this;
		while (p->next != NULL) {
			if (p->num > p->next->num) {
				p = p->next;
				t->next = p->next;
				p->next = t;
				head = p;
			}
			else {
				p = p->next;
				t = t->next;
			}
		}
	}
	return head;
}

bool People::judge(People* l, People* r) {
	if (l->num > r->num) return true;
	else return false;
}

void People::addMessage() {
	if (this == NULL) {
		this->next = new People;
		People* p = this->next;
		p->setBasic();
	}
	else {
		this->setBasic();
	}
}

People* People::delMessage(int nums) {
	People* head=this;
	People* p = this, * t = this;
	int i;
	for (i = 1; i < nums; i++)
		p = p->next;
	if (i == 1) { delete p; return NULL; }
	else {
		t = p;
		p = p->next;
		t->next = p->next;
		delete p;
		return head;
	}
}

People* People::searchPeople(int num) {
	People* p = this;
	if (p != NULL) {
		for (int i = 1; i < num; i++)
			p = p->next;
		return p;
	}
	else {
		cout << "查无此人!\n"; return NULL;
	}

}

void People::outOne() {
	cout << num << ' ' << sex << ' ' << name << '\n';
}

void People::outPeople() {
	People* p = this;
	while (p != NULL) {
		cout << num << ' ' << sex << ' ' << name << '\n';
		p = p->next;
	}

}

void People::changePeople() {
	People* t = this;
	cout << "输入要修改第几个成员信息:";
	int u1; cin >> u1;
	for (int i = 1; i <= u1; i++)
		t = t->next;
	if (t == NULL) { cout << "查无此人\n"; }
	else {
		int u;
		cout << "输入操作符: \n";
		cout << "1.改姓名,2.改性别,3.改编号\n";
		cin >> u;
		string nName; char x; int nums;
		switch (u) {
		case 1://改姓名
			
			cout << "输入新名字:"; cin >> nName;
			t->name = nName;
			break;
		case 2://改性别
			
			cout << "输入新性别:"; cin >> x;
			t->sex = x;
			break;
		case 3://改编号
			
			cout << "输入新编号:"; cin >> nums;
			t->num = nums;
			break;
		default:
			break;
		}
	}
}

void People::setBasic() {
	cout << "输入新成员的编号、性别(m/w)、名字:\n";
	cin >> num >> sex >> name;
	sizes++;
}

void People::showMess() {
	if(this!=NULL)
	cout << "编号:" << num << '\t';
	cout << "性别:" << sex << '\t';
	cout << "名字:" << name << '\n';
}

void People::writeF(ofstream& ofs) {
	People* p = this;
	if (p == NULL) { cout << "没有数据! 请重新操作\n"; return; }
	ofs << this->num<<' ' << this->sex<<' ' << this->name << '\n';
}

上面的People是基类,接下来的Staff和Student是派生类:

Staff类:
//Staff.h

#pragma once
#include"People.h"
class Staff : protected People {
public:
	Staff() { money = 0; workTime = 0; }
	void setBasic();
	void showMess();
	void addMessage();
	Staff* delMessage(int nums);
	//Staff* searchPeople();
	Staff* sortPeople(int value);//根据value排序
	void changePeople();
	void writeF(ofstream& ofs);
	Staff* next = NULL;

protected:
	int money;
	int workTime;
	string type;
};
#include"Staff.h"

void Staff::setBasic() {
	cout << "输入新成员的编号、性别、名字:\n";
	cin >> num >> sex >> name;
	cout << "输入员工的工资、工作时间:\n";
	cin >> this->money >> this->workTime;
	cout << "输入职位(教师、职工):\n";
	cin >> type;
	sizes++;
}

void Staff::showMess() {
	cout << "编号:" << num << '\t';
	cout << "性别:" << sex << '\t';
	cout << "名字:" << name << '\t';
	cout << "职位:" << type << '\t';
	cout << "工资:" << money << '\t';
	cout << "工作时长:" << workTime << '\n';
}
void Staff::addMessage() {
	if (this == NULL) {
		this->next = new Staff;
		Staff* p = this->next;
		p->setBasic();
	}
	else {
		this->setBasic();
	}
}

Staff* Staff::delMessage(int nums) {
	Staff* head=this;
	Staff* p = this, * t = this;
	int i;
	for (i = 1; i < nums; i++)
		p = p->next;
	if (i == 1) { delete p; return NULL;  }
	else {
		t = p;
		p = p->next;
		t->next = p->next;
		delete p;
		return head;
	}
}

Staff* Staff::sortPeople(int value) {
	Staff* p = this, * t = this, * head = this;
	if (value == 1) {
		for (int i = 0; i < sizes; i++) {
			p = t = this;
			while (p->next != NULL) {
				if (p->money > p->next->money) {
					p = p->next;
					t->next = p->next;
					p->next = t;
					head = p;
				}
				else {
					p = p->next;
					t = t->next;
				}
			}
		}
	}
	else {
		for (int i = 0; i < sizes; i++) {
			p = t = this;
			while (p->next != NULL) {
				if (p->workTime > p->next->workTime) {
					p = p->next;
					t->next = p->next;
					p->next = t;
					head = p;
				}
				else {
					p = p->next;
					t = t->next;
				}
			}
		}
	}
	return head;
}

void Staff::changePeople() {
	Staff* t = this;
	cout << "输入要修改第几个成员信息:";
	int u1; cin >> u1;
	for (int i = 1; i <= u1; i++) 
		t = t->next;

	int u2;
	cout << "输入操作符,选择改变某个数据:\n";
	cout << " 1.改姓名,2.改性别(m/w),3.改编号,4.改工资,5.改工作时间\n";
	cin >> u2;
	string nName; char x; int nums;
	switch (u2) {
	case 1://改姓名
		cout << "输入新名字:"; cin >> nName;
		t->name = nName;
		break;
	case 2://改性别
		cout << "输入新性别:"; cin >> x;
		t->sex = x;
		break;
	case 3://改编号
		cout << "输入新编号:"; cin >> nums;
		t->num = nums;
		break;
	case 4://改工资
		cout << "输入新工资:"; cin >> nums;
		t->money = nums;
		break;
	case 5://改工作时间
		cout<< "输入新工作时间:"; cin >> nums;
		t->workTime = nums;
		break;
	default:
		break;
	}
}

void Staff::writeF(ofstream& ofs) {
	Staff* p = this;
	if (p == NULL) { cout << "没有数据! 请重新操作\n"; return; }
	ofs << this->num <<' '<< this->sex<<' ' << this->name<<' ' <<this->type<<' '<< this->money<<' ' << this->workTime<<'\n';
}
Student类:
//Student.h

#pragma once
#include"People.h"
class Student : protected People {
public:
	Student() { averGrade = 0; eduCa = " "; }
	void addMessage();
	void setBasic();
	void showMess();
	Student* delMessage(int nums);
	//People* searchPeople();
	Student* sortPeople(int value);
	void changePeople();
	void writeF(ofstream& ofs);
	Student* next = NULL;

protected:
	int averGrade;
	string eduCa;
};
//Student.cpp

#include"Student.h"
void Student::addMessage() {
	if (this == NULL) {
		this->next = new Student;
		Student* p = this->next;
		p->setBasic();
	}
	else {
		this->setBasic();
	}
}
Student* Student::delMessage(int nums) {
	Student* head=this;
	Student* p = this, * t = this;
	int i;
	for (i = 1; i < nums; i++)
		p = p->next;
	if (i == 1) { delete p; return NULL; }
	else {
		t = p;
		p = p->next;
		t->next = p->next;
		delete p;
		return head;
	}
}

void Student::setBasic() {
	cout << "输入新成员的编号、性别(m/w)、名字:\n";
	cin >> num >> sex >> name;
	cout << "输入平均绩点:\n";
	cin >> this->averGrade;
	cout << "输入学历(本科生、研究生、博士生):\n";
	cin >> eduCa;
	sizes++;
}

void Student::showMess() {
	cout << "编号:" << num << '\t';
	cout << "性别:" << sex << '\t';
	cout << "名字:" << name << '\t';
	cout << "学历:" << eduCa << '\t';
	cout << "平均绩点" << averGrade << '\n';
}
Student* Student::sortPeople(int value) {
	Student* p = this, * t = this, * head = this;
	if (value == 1) {
		for (int i = 0; i < sizes; i++) {
			p = t = this;
			while (p->next != NULL) {
				if (p->averGrade > p->next->averGrade) {
					p = p->next;
					t->next = p->next;
					p->next = t;
					head = p;
				}
				else {
					p = p->next;
					t = t->next;
				}
			}
		}
	}
	return head;
}

void Student::changePeople() {
	Student* t = this;
	cout << "输入要修改第几个成员信息:";
	int u1; cin >> u1;
	for (int i = 1; i < u1; i++)
		t = t->next;

	int u2;
	cout << "输入操作符,选择改变某个数据:\n";
	cout << " 1.改姓名,2.改性别,3.改编号,4.改工资,5.改工作时间\n";
	cin >> u2;
	string nName; char x; int nums;
	switch (u2) {
	case 1://改姓名
		cout << "输入新名字:"; cin >> nName;
		t->name = nName;
		break;
	case 2://改性别
		cout << "输入新性别(m/w):"; cin >> x;
		t->sex = x;
		break;
	case 3://改编号
		cout << "输入新编号:"; cin >> nums;
		t->num = nums;
		break;
	case 4://改平均绩点
		cout << "输入新平均绩点:"; cin >> nums;
		t->averGrade = nums;
		break;
	default:
		break;
	}
}

void Student::writeF(ofstream& ofs) {
	Student* p = this;
	if (p == NULL) { cout << "没有数据! 请重新操作。\n"; return; }
	ofs << this->num<<' ' << this->sex<<' ' << this->name<<' ' << this->averGrade<<' ' << this->eduCa << '\n';
}

本来还想用上更多的数据结构方面的知识,比如用二叉树来排序,但是因为不熟悉,毕竟刚学完离散数学还没有具体实现过那些数据结构,,
而又临近deadLine。。。
只好删除一些操作,以后再找机会实现那些了。


最新博文:
2020.12.23
大二上学期临近期末总结
2021.1.14
大二数据结构课程设计-随机数流中取中位数


这些年来收藏的14个可以写上简历的C++项目-附新手路线

1、问题描述 某高校有四类员工教师、实验员、行政人员教师兼行政人员共有的信息包括编号、姓名、性别、年龄等。其中教师还包含的信息有所在系部、专业、职称实验员还包含的信息由所在实验室、职务行政人员还包含的信息有政治面貌、职称等。 2、功能要求 (1)添加功能程序能够任意添加上述四类人员的记录可提供选择界面供用户选择所要添加的人员类别要求员工的编号要唯一如果添加了重复编号的记录时则提示数据添加重复并取消添加。 (2)查询功能可根据编号、姓名等信息对已添加的记录进行查询如果未找到给出相应的提示信息如果找到则显示相应的记录信息。 (3)显示功能可显示当前系统中所有记录每条记录占据一行。 (4)编辑功能可根据查询结果对相应的记录进行修改修改时注意编号的唯一性。 (5)删除功能主要实现对已添加的人员记录进行删除。如果当前系统中没有相应的人员记录则提示“记录为空”并返回操作否则输入要删除的人员的编号或姓名根据所输入的信息删除该人员记录如果没有找到该人员信息则提示相应的记录不存。 (6)统计功能能根据多种参数进行人员的统计。能统计四类人员数量以及总数,统计男、女员工的数量。 (7)保存功能可将当前系统中各类人员记录存入文件中存入方式任意。 (8)读取功能可将保存在文件中的人员信息读入到当前系统中供用户进行使用。
目标: 设计一个小型的学生管理系统的几个功能。 第一步要求: 1、 对于一个学生类,作为整个系统的核心,我们希望这个类能包括学生共有的基本信息:学号(id),出生岁月(birthday),专业(speciality),年级grade。要求在构建学生对象的时候提供最少姓名。 2、 作为学生类的实例,我们希望能通过设置器或访问器(set get方法)来修改这些学生的不同信息。 3、 通过对toString()方法的重写实现信息打印。 4、 通过对equals()方法的重写实现对象比较逻辑。 第二步要求: 5、 在构建学生对象的时候可以只提供姓名信息,要求在学生类内部对学号,自行处理。 -----------------------------------------------------------------------------第三步要求: 6、 设计一个人Person类。学生必须继承人的这个类。姓名name,性别sex,年龄age ---------------------------------------------------------------------------- 第四步要求: 7、设计一个课程类,在学生类中可以定义一个方法设置课程,注意学生类需要调用课程类,而课程类需要学生类中的学生信息,所以建议使用内部类处理。 ---------------------------------------------------------------------------- 第五步要求: 8、做一个信息过滤,要求能存储所有信息,但也可以对所有学生信息根据某个条件进行过滤,把所有女生信息提取出来打印或把某个年龄段的学生打出来等。 ---------------------------------------------------------------------------- 第六步要求: 9、对过滤的条件采用接口回调的方式重构。 ---------------------------------------------------------------------------- 第七步要求: 10、对过滤的条件采用内部类的方式重构。
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值