①问题描述
在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带n个学生,如果该老师还带研究生,那么研究生也可直接带本科生。本科生导师制问题中的数据元素具有如下形式:
导师带研究生(老师,((研究生1,(本科生1,…,本科生m1)),(研究生2,(本科生1,…,本科生m2))…))
导师不带研究生(老师,(本科生1,…,本科生m))
导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级;本科生的自然情况只包括姓名、班级。
②基本要求
要求完成以下功能:
建立:建立导师广义表。
插入:将某位本科生或研究生插入到广义表的相应位置。
删除:将某本科生或研究生从广义表中删除。
查询:查询导师、本科生(研究生)的情况。
统计:某导师带了多少个研究生和本科生。
输出:将某导师所带学生情况输出。
退出:程序结束。
可以将学生从一个导师组转到另一个导师组。
可以在同一个导师组内修改本科生的研究生负责人。
当研究生带本科生时,如果要删除该研究生,可根据情况,将本科生平均分配给该导师的其他研究生,如果没有其他研究生,则由导师直接负责。
增加删除导师的功能。
查询时,如果待查人员是导师,除了输出本人信息外,还输出他所指导的学生信息;如果待查人员是研究生,除了输出其导师和本人信息外,还输出他所负责的本科生信息。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<list>
#include<string.h>
#include<string>
using namespace std;
#define N 777
#define clr(a) memset(a, 0, sizeof(a))
#define F(i, a, n) for(int i=a; i <= n; i++)
struct node{
string name;
string prof;
int ty,cn,fg;
}tea[N], p, stu[N], bac[N];
list<node >lao[N];
list<node>yan[N];
list<node>xue[N];
list<node>::iterator it, it2;
int x, y, n, m, k;
int a, b, c;
void init(){
y=0; x=0;
F(i, 1, n){
xue[i].clear();
lao[i].clear();
yan[i].clear();
}
}
void scan(){
printf("输入类型; \n");
int tt;
scanf("%d", &tt);
if(tt==0){
n++;
printf("输入老师的姓名,职称,类型:\n");
cin >> tea[n].name >> tea[n].prof >> tea[n].ty;
tea[n].cn=n; tea[n].fg=1;
printf("输入m,表示有这个老师有m个学生:\n");
scanf("%d",&m);
printf("输入学生的姓名,班级,类型:\n");
while(m--){
cin >> p.name >> p.prof >> p.ty;
if(p.ty == 1) {
++y, p.cn=y;p.fg=1;
bac[y]=p;
yan[y].push_back(tea[n]);
}
else{
++x, p.cn=x; p.fg=1;
stu[x]=p;
xue[x].push_back(tea[n]);
}
lao[n].push_back(p);
}