学校管理系统
1 条题解
-
0
P4631 学校管理系统(基础)
解题思路
这道题考察结构体的定义与使用,还要根据身份不同分别读入不同类型的数据。分五步来做。
第一步,把系统想成一张人员登记表。 学校管理系统就像老师手里的一张人员登记表,表头有四列:姓名、年龄、身份、班级或部门。学生最后一列填班级号(一个整数),老师最后一列填部门名称(一个字符串)。题目用字符 s 和 t 区分:s 是 student 学生,t 是 teacher 老师。
第二步,用结构体存放信息。 每个人需要同时保存姓名(char 数组)、年龄(int)、职责(char)、班级号(int)和部门(char 数组),类型各不相同,所以用结构体最合适。班级号和部门分开放:对一个人来说只使用其中一项,另一项闲置,输出时再根据职责判断显示哪一列。
第三步,按职责分别读入。 先读公共的三项:姓名、年龄、职责。然后看职责:是 s 说明是学生,再读入一个整数班级号;是 t 说明是老师,再读入一个字符串部门名称。注意班级号读整数、部门读字符串,读法不同。
第四步,注意输出格式。 第一行先输出表头 name\tage\tjob\tclass/office,其中 \t 是制表符,作用是让各列对齐,就像按 Tab 键跳到下一格。之后每行输出一个人的数据:前三列固定输出姓名、年龄、职责,最后一列按职责输出班级号或部门名称,输出顺序和读入顺序一致。
第五步,边界情况。 题目保证 n 在 15 到 35 之间,姓名长度不超过 6,年龄在 6 到 110,班级号在 1 到 5,所以结构体数组开到 40 个就足够,不会越界。
**回顾总结。**这道题的精髓是"一个结构体,两种用法":班级号和部门字段并存,靠职责字段决定读入和输出哪一个。读入按职责分流、输出按职责分流,两条路径对称清晰。记住制表符 \t 的作用,输出表格就整齐了。
参考代码
// 用结构体保存并输出学校管理系统中的人员信息。 #include <iostream> using namespace std; // 人员结构体,学生保存班级号,老师保存部门名称。 struct person { char name[20]; // 姓名 int age; // 年龄 char role; // 职责,s表示学生,t表示老师 int classId; // 学生的班级号 char office[100]; // 老师所在的部门 }; int main() { int n; // 人员数量 person people[40]; // 保存所有人员的信息 cin >> n; // 读入人员数量 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\n"; // 输出表头 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 << '\n'; // 输出完一行后换行 } return 0; // 程序正常结束 }复杂度分析
时间上,读入 n 个人的信息和输出 n 行数据各需要一层循环,总共执行的次数和 n 成正比,所以时间复杂度是 O(n)。空间上,我们用了一个大小固定的结构体数组来保存 n 个人的信息,数组大小根据题目最大数据量 35 来确定,所以空间复杂度是 O(n)。本题 n 最大只有 35,即使再大一些,这样的算法也能在极短时间内跑完。
- 1