top1编程
← 返回题目
题解

学校管理系统

1 条题解

  • 0
    @ 2026-8-5 23:54:04

    P4628 学校管理系统(基础)

    解题思路

    这道题要求按表格格式输出学校人员信息,学生和老师要读入的最后一列不一样。分四步做。

    第一步,把表格想成一张登记表。 学校管理系统就像老师手里的一张人员登记表,表头有四列:姓名、年龄、身份、班级或部门。学生最后一列填班级号(整数),老师最后一列填部门名称(字符串)。题目用字符 s 和 t 区分:s 是 student 学生,t 是 teacher 老师。

    第二步,用结构体存放不同信息。 每个人要同时保存姓名(字符数组)、年龄(int)、职责(char)、班级号(int)和部门(字符数组)。班级号和部门放在同一个结构体里,但每个人只用其中一个,输出时再根据职责判断该显示哪一列。

    第三步,按职责分别读入。 先读公共的三项:姓名、年龄、职责。然后看职责:是 s 就再读入一个整数班级号;是 t 就再读入一个字符串部门名称。班级号读的是整数,部门读的是字符串,读法不一样。比如样例:lily 10 s 后面读班级号 9;judy 35 t 后面读部门 english。

    第四步,注意输出格式。 表头和每行数据之间都用制表符 \t 分隔,不是空格,这是本题输出的关键。前三列固定输出姓名、年龄、职责,最后一列按职责输出班级号或部门名称,顺序和读入顺序保持一致。年龄范围是 6 到 110,姓名长度不超过 6,班级号在 1 到 5,结构体的字符数组大小足够存放这些数据。

    **回顾总结。**这道题的结构体就像一个"两用文件夹":学生填班级号,老师填部门,两个字段只用一个。读入时靠职责决定多读一个什么,输出时靠职责决定打印哪一列。记住输出用制表符对齐,这是和普通输出最大的不同。

    参考代码

    // 用途:读入学校人员信息(学生或老师),并按表格格式输出。
    #include <iostream>
    using namespace std;
    
    struct Person {
        char name[10];      // 人员姓名
        int age;            // 人员年龄
        char role;          // 职责,s表示学生,t表示老师
        int classId;        // 学生的班级号
        char office[20];    // 老师所在的部门
    };
    
    int main() {
        int n;                                      // 人员数量
        cin >> n;                                   // 读入人员数量
        Person people[40];                          // 保存人员信息
    
        for (int i = 0; i < n; i++) {               // 依次读入每个人
            cin >> people[i].name >> people[i].age >> people[i].role;  // 读入姓名、年龄和职责
            if (people[i].role == 's') cin >> people[i].classId;       // 学生读入班级号
            else cin >> people[i].office;                              // 老师读入部门名称
        }
    
        cout << "name\tage\tjob\tclass/office" << endl;  // 输出表头
        for (int i = 0; i < n; i++) {               // 依次输出每个人
            cout << people[i].name << '\t' << people[i].age << '\t' << people[i].role << '\t';
            if (people[i].role == 's') cout << people[i].classId;      // 学生输出班级号
            else cout << people[i].office;                             // 老师输出部门名称
            cout << endl;
        }
        return 0;                                   // 程序结束
    }
    

    复杂度分析

    读入一遍、输出一遍,时间复杂度 O(n),n 在 15 到 35 之间,规模很小。程序用结构体数组保存全部信息,空间 O(n)。结构体里 classId 和 office 两个字段同时存在,但每个数据只用其中一个;输出时用 if 判断 role 是 's' 还是 't',来选择打印班级号还是部门名称,这样同一个结构体既能表示学生也能表示老师。制表符在输出里起对齐作用,让表格看起来整齐,cout 输出反斜杠加字母 t 就代表一个制表符。

    • 1