Skip to content

14083: 【原4083】学生成绩管理系统

题目

题目描述

author: 程序设计思想与方法助教组 Te Qi 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4083

问题描述

此题与实验指导书原题不同。由于OJ系统不能输入多个cpp文件,本题不必进行模块划分。

设计一个学生成绩管理程序,实现对n个学生的成绩的记录与统计工作。学生信息包括:学号、姓名、成绩。 程序基本功能要求如下:

  • 能够新增学生信息
  • 能够分别根据学号和姓名查询该学生的基本信息
  • 能够显示所有学生的成绩信息
  • 能够分别按照学号和成绩进行排序

要求实现如下功能(注意以下编号与实验指导书中不同):

1-添加学生信息
2-显示全部学生信息
3-按学号查询学生信息
4-按姓名查询学生信息
5-按学号升序排序
6-按成绩降序排序
7-退出

本题中不要输出该菜单,而要按照其识别输入编号,并输出相应信息。

输入输出

输入

输入信息为多行(1<=N<=10000),每一行是一条指令。对于每一条指令,第一个数字为“指令编号”,后续数据为指令所需的信息(例如“添加学生信息”需要学生的学号、姓名、成绩),这些数据以空格分隔,格式如下:

指令编号 信息1 信息2 信息3 ...

对于每一种指令,输入格式分别具体如下:

添加学生信息
1 学号 姓名 成绩

其中“1”为“添加学生信息”的指令编号,以下其他指令类同。

学号为9位数字;姓名为英文,长度不超过19个字符(1<=len(name)<=19),不包含空格,不存在学生重名情况;成绩为0或正整数并且不超过100(0<=s<=100)

注意:若输入的学号与先前已添加的学生学号重复,丢弃该数据,不要将该数据录入。

显示全部学生信息
2
按学号查询学生信息
3 学号

查询的学号一定存在。

按姓名查询学生信息
4 姓名

查询的姓名一定存在。

按学号升序排序
5
按成绩降序排序
6
退出
7

输出

添加学生信息

如果当前学生未添加过(也即当前学号不在先前已添加学号列表中):

SUCCESS

否则(当前学号已在列表中):

FAILED

此时直接丢弃该数据,不要录入。

显示全部学生信息

按照数据添加顺序输出(最先添加的学生在第一行)

学号1 姓名1 成绩1
学号2 姓名2 成绩2
...
学号n 姓名n 成绩n

注意:无数据时不输出任何字符,不要产生空行

按学号查询学生信息
学号 姓名 成绩
按姓名查询学生信息
学号 姓名 成绩
按学号升序排序

排序后按以下格式输出

学号1 姓名1 成绩1
学号2 姓名2 成绩2
...
学号n 姓名n 成绩n

注意:无数据时不输出任何字符,不要产生空行

按成绩降序排序

排序后按以下格式输出

学号1 姓名1 成绩1
学号2 姓名2 成绩2
...
学号n 姓名n 成绩n

注意:无数据时不输出任何字符,不要产生空行;成绩相同时,按照添加先后顺序输出。

退出
END

示例

输入:

2
1 100000001 Mike 98
1 100000003 Will 100
1 100000002 Eleven 98
1 100000003 Will 100
3 100000003
4 Eleven
2
6
5
7

程序应该按如下步骤运行:

  1. 输出全部学生信息,由于无数据,不输出
  2. 成功添加学生“Mike”信息,输出一行“SUCCESS”
  3. 成功添加学生“Will”信息,输出一行“SUCCESS”
  4. 成功添加学生“Eleven”信息,输出一行“SUCCESS”
  5. 尝试添加学生“Will”信息,但学号"100000003"已在列表中,因此丢弃该数据并输出一行“FAILED”
  6. 查询学号“100000003”信息,输出一行“100000003 Will 100”
  7. 查询学生“Eleven”信息,输出一行"100000002 Eleven 98"
  8. 输出全部学生信息,示例输出第7-9行
  9. 按成绩降序排序并输出,示例输出第10-12行
  10. 按学号升序排序并输出,示例输出第13-15行
  11. 程序结束,结束前输出一行“END”

所以全部输出为:

SUCCESS
SUCCESS
SUCCESS
FAILED
100000003 Will 100
100000002 Eleven 98
100000001 Mike 98
100000003 Will 100
100000002 Eleven 98
100000003 Will 100
100000001 Mike 98
100000002 Eleven 98
100000001 Mike 98
100000002 Eleven 98
100000003 Will 100
END

ligongzzz's solution

#include "iostream"
#include "cstring"

using namespace std;

//交换
template <class T>
constexpr void mySwap(T&a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

//冒泡排序
//(bool为真表示需要交换)
template <class T>
constexpr void bubbleSort(T *destination, T *source, int num, bool(*f)(T a, T b)) {
    //复制
    if (destination != source)
        for (int i = 0; i < num; i++)
            destination[i] = source[i];

    for (int i = num - 2; i >= 0; i--)
        for (int j = 0; j <= i; j++)
            if (f(destination[j], destination[j + 1]))
                mySwap(destination[j], destination[j + 1]);
}

class student {
public:
    char name[100];
    int xuehao=0, chengji = 0;
};

int main() {
    student stu[10000];
    int num = 0;
    while (true) {
        int n=0;
        cin >> n;
        if (n == 7) {
            cout << "END";
            break;
        }

        switch (n) {
        case 1: {
            int temp;
            bool flag = false;
            cin >> temp;
            for (int i = 0; i < num; i++) {
                if (stu[i].xuehao == temp) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                cout << "FAILED" << endl;
                cin.clear();
                cin.ignore(100, '\n');
                break;
            }
            stu[num].xuehao = temp;
            cin >> stu[num].name;
            cin >> stu[num].chengji;
            num++;
            cout << "SUCCESS" << endl;
            break;
        }
        case 2: {
            for (int i = 0; i < num; i++)
                cout << stu[i].xuehao << " " << stu[i].name << " " << stu[i].chengji << endl;
            break;
        }
        case 3: {
            int temp;
            cin >> temp;
            for (int i = 0; i < num; i++) {
                if (stu[i].xuehao == temp) {
                    cout << stu[i].xuehao << " " << stu[i].name << " " << stu[i].chengji << endl;
                    break;
                }
            }
            break;
        }
        case 4: {
            char temp[100];
            cin >> temp;
            for (int i = 0; i < num; i++) {
                if (strcmp(temp,stu[i].name)==0) {
                    cout << stu[i].xuehao << " " << stu[i].name << " " << stu[i].chengji << endl;
                    break;
                }
            }
            break;
        }
        case 5: {
            student temp[10000];
            bubbleSort<student>(temp, stu, num, [](student stu1, student stu2) {return stu1.xuehao > stu2.xuehao ? true : false; });
            for (int i = 0; i < num; i++)
                cout << temp[i].xuehao << " " << temp[i].name << " " << temp[i].chengji << endl;
            break;
        }
        case 6: {
            student temp[10000];
            bubbleSort<student>(temp, stu, num, [](student stu1, student stu2) {return stu1.chengji < stu2.chengji ? true : false; });
            for (int i = 0; i < num; i++)
                cout << temp[i].xuehao << " " << temp[i].name << " " << temp[i].chengji << endl;
            break;
        }
        }
    }
    return 0;
}