学生综合测评管理系统
用单链表来管理信息。代码如下。
/*
作者:兔子
目的:学生综测管理系统
时间:2021.6.29
*/
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
using namespace std;
//学生节点类
class StudentData {
public:
string name; //姓名
string sex; //性别
string classname; //班级
string id; //学号
string tel; //联系电话
double avescore = -1; //考试平均成绩(语数英三门)
double comprehensive_test_score = -1; //综合测评评分
int c_score; //语文成绩
int m_score; //数学成绩
int e_score; //英语成绩
int No = -1; //考试名次
int student_Each_score; //同学互评分
int morality_score; //品德成绩
int teacher_score; //任课教师评分
int comprehensive_No = -1; //综合测评名次
StudentData* next;
StudentData(); //默认初始化
StudentData(string name,string sex,string classname,string id,string tel,int c,int m,int e,int each,int tea,int mo);
int judge(); //判断输入的数据是否合法
void show(); //打印输出学生所有信息
void show1(); //显示基本信息
void show_No(); //显示考试名次
void show_comprehensive_No(); //显示综测名次
void alter(); //修改学生信息
};
StudentData::StudentData() {
name = "null";
sex = "null";
classname = "null";
id = "null";
tel = "null";
avescore = -1;
comprehensive_test_score = -1;
c_score = -1;
m_score = -1;
e_score = -1;
No = -1;
student_Each_score = -1;
morality_score = -1;
teacher_score = -1;
comprehensive_No = -1;
next = NULL;
}
StudentData::StudentData(string name, string sex, string classname, string id, string tel, int c, int m, int e, int each, int tea, int mo) {
this->name = name;
this->sex = sex;
this->classname = classname;
this->id = id;
this->tel = tel;
this->c_score = c;
this->m_score = m;
this->e_score = e;
this->morality_score = mo;
this->student_Each_score = each;
this->teacher_score = tea;
this->avescore = (c + m + e) / 3;
this->comprehensive_test_score = 0.6 * this->avescore + 0.1 * each + 0.1 * mo + 0.2 * tea;
}
int StudentData::judge() {
int count = 0;
if (name.length() > 20) {
cout << right << setw(24) << "---" << setw(8) << "名字过长" << left << setw(24) << "---" << endl;
count++;
}
if (sex.length() > 2) {
cout << right << setw(22) << "---" << setw(12) << "性别输入错误" << left << setw(22) << "---" << endl;
count++;
}
if (id.length() != 11) {
cout << right << setw(22) << "---" << setw(12) << "学号输入错误" << left << setw(22) << "---" << endl;
count++;
}
if (tel.length() != 11) {
cout << right << setw(20) << "---" << setw(16) << "电话号码输入错误" << left << setw(20) << "---" << endl;
count++;
}
if (c_score > 100 || c_score < 0) {
cout << right << setw(20) << "---" << setw(16) << "语文成绩输入错误" << left << setw(20) << "---" << endl;
count++;
}
if (m_score > 100 || m_score < 0) {
cout << right << setw(20) << "---" << setw(16) << "数学成绩输入错误" << left << setw(20) << "---" << endl;
count++;
}
if (e_score > 100 || e_score < 0) {
cout << right << setw(20) << "---" << setw(16) << "英语成绩输入错误" << left << setw(20) << "---" << endl;
count++;
}
if (student_Each_score > 100 || student_Each_score < 0) {
cout << right << setw(19) << "---" << setw(18) << "同学互评分输入错误" << left << setw(19) << "---" << endl;
count++;
}
if (morality_score > 100 || morality_score < 0) {
cout << right << setw(20) << "---" << setw(16) << "品德成绩输入错误" << left << setw(20) << "---" << endl;
count++;
}
if (teacher_score > 100 || teacher_score < 0) {
cout << right << setw(19) << "---" << setw(18) << "任课教师评分输入错误" << left << setw(19) << "---" << endl;
count++;
}
if (count == 0)
return 1;
else
{
cout << "输入有" << count << "处错误" << endl;
return 0;
}
}
void StudentData::alter() {
cout << "请输入学生信息:" << endl;
cout << "姓名:";
cin >> this->name;
cout << "性别:";
cin >> this->sex;
cout << "学号:";
cin >> this->id;
cout << "班级:";
cin >> this->classname;
cout << "联系电话:";
cin >> this->tel;
cout << "语文成绩:";
cin >> this->c_score;
cout << "数学成绩:";
cin >> this->m_score;
cout << "英语成绩:";
cin >> this->e_score;
cout << "同学互评分:";
cin >> this->student_Each_score;
cout << "品德成绩:";
cin >> this->morality_score;
cout << "任课教师评分:";
cin >> teacher_score;
this->avescore = (c_score + m_score + e_score) / 3;
this->comprehensive_test_score = 0.6 * avescore + 0.1 * student_Each_score + 0.1 * morality_score + 0.2 * teacher_score;
}
void StudentData::show() {
cout << "---学生信息---" << endl;
cout << "姓名:" << name << endl;
cout << "性别:" << sex << endl;
cout << "学号:" << id << endl;
cout << "班级:" << classname << endl;
cout << "联系电话:" << tel << endl;
cout << "语文成绩:" << c_score << endl;
cout << "数学成绩:" << m_score << endl;
cout << "英语成绩:" << e_score << endl;
cout << "考试名次:" << No << endl;
cout << "品德成绩:" << morality_score << endl;
cout << "同学互评分:" << student_Each_score << endl;
cout << "考试平均成绩:" << avescore << endl;
cout << "任课教师评分:" << teacher_score << endl;
cout << "综合测评评分:" << comprehensive_test_score << endl;
cout << "综合测评名次:" << comprehensive_No << endl;
}
void StudentData::show1() {
cout << left << setw(12) << this->name;
cout << left << setw(6) << this->sex;
cout << left << setw(10) << this->classname;
cout << left << setw(13) << this->id;
cout << left << setw(13) << this->tel;
cout << left << setw(13) << this->No;
cout << left << setw(13) << this->avescore;
cout << left << setw(13) << this->comprehensive_No;
cout << left << setw(13) << this->comprehensive_test_score << endl << endl;
}
void StudentData::show_comprehensive_No() {
cout << left << setw(12) << this->name;
cout << left << setw(13) << this->comprehensive_No;
cout << left << setw(13) << this->comprehensive_test_score << endl << endl;
}
void StudentData::show_No() {
cout << left << setw(12) << this->name;
cout << left << setw(13) << this->No;
cout << left << setw(13) << this->avescore << endl << endl;
}
//学生类,用链表管理学生节点
class Student {
public:
int size = 0;
StudentData *head =new StudentData();
StudentData* searchByid(string id); //以学号查找
void add(); //手动添加
void add(StudentData* stu); //以节点的形式添加
void show(); //遍历链表
void show_avescore_rangking();
void show_comprehensive_rangking();
bool change_information_Byid(); //以学号查找修改信息
void change_menu(); //修改信息的菜单
bool delete_information_Byid(); //以学号查找删除信息
bool search(); //按学号查询一个学生全部信息
void writeffile(); //写文件
void sortByid(); //按学号排序
void sort(); //排序总函数
void compute_avescore_rangking(); //计算考试名次
void compute_comprehensive_rangking(); //计算综测名次
};
StudentData* Student::searchByid(string id) {
StudentData* p = this->head; //定义临时指针指向头指针
while (p != NULL)
{ //只要指针不为空指针就执行循环
if (p->id == id)
{
cout << right << setw(24) << "---" << setw(8) << "查询成功" << left << setw(24) << "---" << endl;
break;
}
p = p->next; //将指针后移
}
if (p == NULL) { //说明遍历单链表后都没有查询到输入的学号
cout << right << setw(24) << "---" << setw(8) << "查询失败" << left << setw(24) << "---" << endl;
p = new StudentData();
}
return p;
}
void Student::show()
{
cout << left << setw(12) << "姓名";
cout << left << setw(6) << "性别";
cout << left << setw(10) << "班级";
cout << left << setw(13) << "学号";
cout << left << setw(13) << "联系电话";
cout << left << setw(13) << "考试名次";
cout << left << setw(13) << "平均成绩";
cout << left << setw(13) << "综测名次";
cout << left << setw(13) << "综测成绩" << endl;
StudentData* p = head->next;
while (p != NULL) {
p->show1();
p = p->next;
}
}
void Student::show_comprehensive_rangking() {
Student::compute_comprehensive_rangking();
cout << left << setw(12) << "姓名";
cout << left << setw(13) << "综测名次";
cout << left << setw(13) << "综测成绩" << endl;
StudentData* p = head->next;
while (p != NULL) {
p->show_comprehensive_No();
p = p->next;
}
}
void Student::show_avescore_rangking() {
Student::compute_avescore_rangking();
cout << left << setw(12) << "姓名";
cout << left << setw(13) << "考试名次";
cout << left << setw(13) << "平均成绩" << endl;
StudentData* p = head->next;
while (p != NULL) {
p->show_No();
p = p->next;
}
}
void Student::compute_comprehensive_rangking() {
StudentData* p, * q, * tail;
int num;
int No = 1;
for (int i = 0; i < size - 1; i++)
{
num = size - i - 1;
q = head->next;
p = q->next;
tail = head;
while (num--)
{
if (q->comprehensive_test_score < p->comprehensive_test_score)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->next;
}
}
p = head->next;
while (p != NULL)
{
p->comprehensive_No = No;
p = p->next;
No++;
}
}
void Student::compute_avescore_rangking() {
StudentData* p, * q, * tail;
int num;
int No = 1;
for (int i = 0; i < size - 1; i++)
{
num = size - i - 1;
q = head->next;
p = q->next;
tail = head;
while (num--)
{
if (q->avescore < p->avescore)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->next;
}
}
p = head->next;
while (p != NULL)
{
p->No = No;
p = p->next;
No++;
}
}
void Student::sort() {
StudentData* p, * q, * tail;
int num;
int choice;
cout << endl << setw(20) << "--------------------" << setw(16) << "学生综合测频系统" << setw(20) << "--------------------" << endl << endl;
cout << right << setw(24) << "---" << setw(8) << "排序方式" << left << setw(24) << "---" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "1.按学号";
cout << left << setw(20) << "2.按综合测评评分" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "3.按考试平均成绩";
cout << left << setw(20) << "0.返回菜单" << endl << endl;
cout << "请输入你的选择:";
cin >> choice;
switch (choice)
{
case 1:
for (int i = 0; i < size - 1; i++)
{
num = size - i - 1;
q = head->next;
p = q->next;
tail = head;
while (num--)
{
if (q->id > p->id)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->next;
}
}
break;
case 2:
for (int i = 0; i < size - 1; i++)
{
num = size - i - 1;
q = head->next;
p = q->next;
tail = head;
while (num--)
{
if (q->comprehensive_test_score > p->comprehensive_test_score)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->next;
}
}
break;
case 3:
for (int i = 0; i < size - 1; i++)
{
num = size - i - 1;
q = head->next;
p = q->next;
tail = head;
while (num--)
{
if (q->avescore > p->avescore)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->next;
}
}
break;
case 0:
system("cls");
break;
default :
cout << "输入非法!" << endl << endl;
}
}
void Student::sortByid() {
StudentData* p,* q,*tail;
int num;
for (int i = 0; i < size - 1; i++)
{
num = size - i - 1;
q = head->next;
p = q->next;
tail = head;
while (num--)
{
if (q->id > p->id)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->next;
}
}
}
void Student::writeffile() {
Student::sortByid();
ofstream ofs;
StudentData* p = head->next;
ofs.open("test.txt", ios::out | ios::trunc);
while (p != NULL) {
ofs <<"姓名:"<< p->name << endl;
ofs <<"性别:"<< p->sex << endl;
ofs <<"班级:"<< p->classname << endl;
ofs <<"学号:"<< p->id << endl;
ofs <<"电话:"<< p->tel << endl <<endl;
p = p->next;
}
ofs.close();
}
bool Student::search() {
string id;
cout << "请输入查询学生的学号:";
cin >> id;
StudentData* p = Student::searchByid(id);
if (p->id == "null")
{
return false;
}
else {
p->show();
return true;
}
}
void Student::add() {
int right;
StudentData* p = head;
StudentData* r = new StudentData();
while (true) //外层循环控制是否重复操作
{
r->alter();
right = r->judge(); //判断输入是否合理
if (right == 1) //合理则执行头插入操作
{
while (true)
{
if (p->next != NULL)
p = p->next;
else break;//找到链表尾跳出循环
}
r->next = p->next;
p->next = r;
this->size++;
cout << "添加成功!" << endl;
break;
}
else
{
int choice;
cout << "是否重新输入?" << endl;
cout << "0---No,1---Yes" << endl;
cout << "请输入的你选择:";
cin >> choice;
if (choice == 0)
{
system("cls");
break;
}
else if (choice == 1) {
system("cls");
}
else if (choice != 1 && choice != 0)
{
cout << "非法输入!退出操作。" << endl;
system("cls");
break;
}
}
}
this->compute_avescore_rangking();
this->compute_comprehensive_rangking();
}
void Student::add(StudentData* stu)
{
StudentData* p = head;
stu->next = p->next;
p->next = stu;
this->size++;
Student::compute_avescore_rangking();
Student::compute_comprehensive_rangking();
}
void Student::change_menu() {
cout << right << setw(24) << "---" << setw(8) << "修改方式" << left << setw(24) << "---" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "1.修改学生基本信息";
cout << left << setw(20) << "2.修改学生考试成绩" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "3.修改学生综测信息";
cout << left << setw(20) << "4.修改学生全部信息" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "0.返回菜单" << endl << endl;
}
bool Student::delete_information_Byid() {
int choice;
string id;
cout << "请输入你要删除学生的学号:";
cin >> id;
StudentData* q = head;
StudentData *p = Student::searchByid(id);
if (p->id == "null") {
return false;
}
while (q->next->id != id) {
q = q->next;
}
cout << "是否删除该学生信息?" << endl;;
cout << "No---0,Yes---1" << endl;
cout << "请输入你的选择:";
cin >> choice;
if (choice == 0)
return false;
//删除节点
q->next = p->next;
cout << "删除成功!" << endl << endl;
return true;
}
bool Student::change_information_Byid()
{
int choice;
string Id;
string name;
string sex;
string classname;
string id;
string tel;
int c, m, e;
int pin, each, tea;
cout << "请输入你的选择:";
cin >> choice;
if (choice == 0) {
system("cls");
return false;
}
cout << "请输入你查找学生的学号:";
cin >> Id;
StudentData* p = Student::searchByid(Id);
//查找失败返回false
if (p->id == "null") {
return false;
}
switch (choice) {
case 1:while (true)
{
cout << "姓名:";
cin >> name;
cout << "性别:";
cin >> sex;
cout << "班级:";
cin >> classname;
cout << "学号:";
cin >> id;
cout << "联系电话:";
cin >> tel;
if (id.length() != 11 || tel.length() != 11) {
cout << "学号或电话输入错误!请重新输入" << endl;
}
else {
p->name = name;
p->sex = sex;
p->classname = classname;
p->id = id;
p->tel = tel;
cout << "修改成功!" << endl << endl;
break;
}
}
break;
case 2:while (true)
{
cout << "语文:";
cin >> c;
cout << "数学:";
cin >> m;
cout << "英语:";
cin >> e;
if (c < 0 || c>100 || m < 0 || m>100 || e < 0 || e>100) {
cout << "成绩输入有错误!请重新输入!"<<endl;
}
else {
p->e_score = e;
p->m_score = m;
p->c_score = c;
cout << "修改成功!" << endl << endl;
break;
}
}
break;
case 3:while (true) {
cout << "品德成绩:";
cin >> pin;
cout << "同学互评分:";
cin >> each;
cout << "任课教师评分:";
cin >> tea;
if (pin < 0 || pin>100 || each < 0 || each>100 || tea < 0 || tea>100)
{
cout << "成绩输入有错误!请重新输入!" << endl;
}
else
{
p->morality_score = pin;
p->student_Each_score = each;
p->teacher_score = tea;
cout << "修改成功!";
break;
}
}
break;
case 4:while (true)
{
p->alter();
if (p->judge() != 1) {
;
}
else {
break;
}
}
break;
default :
cout << "输入不合法!" << endl;
break;
}
return true;
}
//系统类
class System {
public:
StudentData* s1 = new StudentData("李泽龙", "男", "计科2002", "20408030220", "18066513115", 75, 89, 80, 85, 84, 89);
StudentData* s2 = new StudentData("王西免", "男", "计科2002", "20408030216", "18066513114", 86, 95, 84, 80, 83, 80);
StudentData* s3 = new StudentData("张旺祯", "男", "计科2002", "20408030221", "18066513116", 82, 89, 80, 81, 86, 84);
StudentData* s4 = new StudentData("张少文", "女", "计科2002", "20408030227", "18066513118", 83, 80, 82, 80, 87, 94);
Student stu;
void MenuShow();
void Menu();
void title();
void user_guide();
};
void System::title()
{
cout << endl <<setw(20)<<"--------------------"<<setw(16)<< "学生综合测频系统"<<setw(20)<<"--------------------" << endl << endl;
}
void System::MenuShow()
{
System::title();
cout << setw(10) << " " << left << setw(22) << "1.录入学生信息" ;
cout << left << setw(20) << "2.修改学生信息" << endl << endl;
cout << setw(10) << " " << left<< setw(22) << "3.删除学生信息" ;
cout << left << setw(20) << "4.查询学生信息" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "5.查询综测成绩表";
cout << left << setw(20) << "6.查询考试成绩表" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "7.显示所有学生信息";
cout << left << setw(20) << "8.排序" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "9.将所有信息写入文件";
cout << left << setw(20) << "10.使用指南" << endl << endl;
cout << setw(10) << " " << left << setw(22) << "0.退出系统" << endl << endl;
}
void System::user_guide()
{
cout << "1.在录入学生信息时学号是11位,名字默认最长5个字,输入之后会对输入的信息进行检测。"<<endl;
cout << "2.修改信息时提供4种修改方式,都是以学号查询位基础。" << endl;
cout << "3.删除信息时,按学号查询删除,查询成功后再次确认。" << endl;
cout << "4.查询学生信息时,提供两种方式,查询基本信息,全部信息,按学号查询" << endl;
cout << "5.查询综测成绩表时,显示姓名,名次,综测成绩。" << endl;
cout << "6.查询考试成绩表时,显示姓名,名次,考试成绩。" << endl;
cout << "7.显示所有信息可以显示基本信息和全部信息" << endl;
cout <<"8.排序操作提供按学号,考试成绩,综测成绩3种排序" << endl;
cout << "9.写入文件是会自动先进行按学号排序,使得写入的学号从小到大。" << endl;
}
void System::Menu() {
stu.add(s1);
stu.add(s2);
stu.add(s3);
stu.add(s4);
int choice;
while (true) {
System::MenuShow();
cout << "请输入你的选择:";
cin >> choice;
switch (choice)
{
case 0:
//退出系统
system("cls");
cout << "你已经安全退出系统,欢迎下次使用。" << endl;
exit(0);
case 1:
//录入学生信息
system("cls");
stu.add();
break;
case 2:
//修改学生信息
system("cls");
stu.change_menu();
stu.change_information_Byid();
break;
case 3:
//删除学生信息
system("cls");
stu.delete_information_Byid();
break;
case 4:
//查询学生信息
system("cls");
int i;
while (true)
{
system("cls");
System::title();
stu.search();
cout << endl << "是否继续?(No---0,Yes---1)" << endl;
cout << "请输入选择:";
cin >> i;
if (i == 1);
else
break;
}
break;
case 5:
//查询综测成绩表
system("cls");
stu.show_comprehensive_rangking();
break;
case 6:
//查询考试成绩表
system("cls");
stu.show_avescore_rangking();
break;
case 7:
//显示所有学生信息
system("cls");
stu.show();
break;
case 8:
//排序
system("cls");
stu.sort();
break;
case 9 :
//写文件保存
system("cls");
stu.writeffile();
break;
case 10:
system("cls");
System::user_guide();
default:
break;
}
}
}
int main() {
System menu;
menu.Menu();
return 0;
}