学校管理系统
1 条题解
-
0
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