本科生导师制 问题

①问题描述

在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带n个学生,如果该老师还带研究生,那么研究生也可直接带本科生。本科生导师制问题中的数据元素具有如下形式:

  • 导师带研究生
    (老师,((研究生1,(本科生1,…,本科生m1)),(研究生2,(本科生1,…,本科生m2))…))

  • 导师不带研究生
    (老师,(本科生1,…,本科生m))

导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级;本科生的自然情况只包括姓名、班级。

②基本要求

要求完成以下功能:

  • 建立:建立导师广义表。

  • 插入:将某位本科生或研究生插入到广义表的相应位置。

  • 删除:将某本科生或研究生从广义表中删除。

  • 查询:查询导师、本科生(研究生)的情况。

  • 统计:某导师带了多少个研究生和本科生。

  • 输出:将某导师所带学生情况输出。

  • 退出:程序结束。

③设计提示

本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。

定义教师、学生结点结构体如下:

typedef struct GLNode

{

char name[100]; /*教师或学生的姓名*/

char prof[100]; /*教师结点表示职称,学生结点表示班级*/

int type; /*结点类型:0-教师,1-研究生,2-本科生*/

struct {struct GLNode *hp, *tp;} ptr;

/*hp指向同级的下一结点,tp指向下级的首结点*/

}GList;

人员信息的表示形式为:高老师-教授-0、李刚-二班-1、李明-二班-2.

人员信息中的姓名、职称、班级、人员类型用“-”隔开,如高老师-教授-0,“高老师”表示姓名,“教师”表示职称,“0”表示人员的类型是教师;李刚-二班-1,“李刚”表示姓名,“二班”表示班级,“1”表示人员的类型是研究生;李明-二班-2,“李明”表示姓名,“二班”表示班级,“2”表示人员的类型是本科生。

广义表((高老师-教授-0,(李明-一班-2,王平-二班-2)),(李老师-副教授-0,(白梅-二班-1,(李刚-一班-2)))可以用图3表示。

图3
导师制用广义表实现示例

④思考

可以考虑对程序做如下完善:

  • 可以将学生从一个导师组转到另一个导师组。

  • 可以在同一个导师组内修改本科生的研究生负责人。

  • 当研究生带本科生时,如果要删除该研究生,可根据情况,将本科生平均分配给该导师的其他研究生,如果没有其他研究生,则由导师直接负责。

  • 增加删除导师的功能。

  • 查询时,如果待查人员是导师,除了输出本人信息外,还输出他所指导的学生信息;如果待查人员是研究生,除了输出其导师和本人信息外,还输出他所负责的本科生信息。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

#include<iostream>

#include<string.h>

using
namespace std;

class
LS

{

private:

    struct
Node//建立结点

    {

        string name;

        string prof;

        int
type;

        Node * right,*down;//每个节点有向右和向下的指针

        Node():right(NULL),down(NULL) {}

        Node(string name1 , string prof1 , int
a)

        {

            name = name1;

            prof = prof1;

            type = a;

            right = NULL;

            down = NULL;

        }

    };

    Node * head;

    Node * cur;

public:

    int
number0 = 0 ,number1 = 0,number2 = 0;//教授人数、导师人数、学生人数

    int
nameflag = 0;//名字标记

    LS()

    {

        Node * p = new
Node();//建立头节点

        head = p;

    }

    void
dfs(Node * cur)//dfs

    {

            if(cur->type==0)

            {

            number0++;

            cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

            }

            if(cur->type==1)

            {

            number1++;

            cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

            }

            if(cur->type==2)

            {

            number2++;

            cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

            }

            if(cur->right)dfs(cur->right);

            if(cur->down)dfs(cur->down);

    }

    Node *findname(Node * cur,string name)//查询姓名

    {

        if(cur->name==name){cout<<"find"<<endl;

        cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

        nameflag = 1;

        return
cur;}

        if(cur->right)findname(cur->right,name);

        if(cur->down)findname(cur->down,name);

        if(nameflag == 0)return
0;

    }

    void
all_function()

    {

        cout<<"please input boss‘s name prof type"<<endl;

        string Name,Prof;

        int
Type;

        cin>>Name>>Prof>>Type;

        Node * p = new
Node(Name,Prof,Type);//输入第一个节点

        head -> down = p;

        cur = p;

        while(1)

        {

            cout<<"please input:"<<endl;

            cout<<"1 show now node"<<endl;//打印当前节点信息

            cout<<"2 insert right"<<endl;//在当前节点往右插入

            cout<<"3 insert down"<<endl;//在当前节点往下插入

            cout<<"4 return boss"<<endl;//返回头节点

            cout<<"5 moveright"<<endl;//当前节点往右移动

            cout<<"6 movedown"<<endl;//当前节点往下移动

            cout<<"7 delete now Node"<<endl;//删除当前节点

            cout<<"8 tongji now node renshu"<<endl;//统计所有结点

            cout<<"9 chaxun xingming"<<endl;//查询姓名

            cout<<"10 print all student"<<endl;//打印当前节点的所有学生

            cout<<"0 break"<<endl;//结束循环

            int
n;

            cin>>n;

            if(n==0)break;

            string Name,Prof;

            int
Type;

            switch
(n)

            {

            case
1://打印当前节点信息

            {

                cout<<"now Node is:"<<endl;

                cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

                break;

            }

            case
2://在当前节点往右插入

            {

                cout<<"now Node is:"<<endl;

                cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

                cout<<"please input right numbers"<<endl;//插入几个

                int
insertright;

                cin>>insertright;

                for(int
i = 0 ; i < insertright ; i++)

                {

                    cout<<"please input Node name prof type"<<endl;

                    cin>>Name>>Prof>>Type;

                    Node * p = new
Node(Name,Prof,Type);

                    cur->right = p;

                    cur = cur -> right;

                }

                cur = head -> down;

                break;

            }

            case
3://在当前节点往下插入

            {

                cout<<"now Node is:"<<endl;

                cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

                cout<<"please input down numbers"<<endl;//插入几个

                int
insertdown;

                cin>>insertdown;

                for(int
i = 0 ; i < insertdown ; i++)

                {

                    cout<<"please input Node name prof type"<<endl;

                    cin>>Name>>Prof>>Type;

                    Node * p = new
Node(Name,Prof,Type);

                    cur->down = p;

                    cur = cur -> down;

                }

                cur = head -> down;

                break;

            }

            case
4://返回头节点

            {

                cur = head->down;

                break;

            }

            case
5://当前节点往右移动

            {

                cout<<"now Node is:"<<endl;

                cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

                cout<<"after movedown Node is:"<<endl;

                cur = cur -> right;

                cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

                break;

            }

            case
6://当前节点往下移动

            {

                cout<<"now Node is:"<<endl;

                cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

                cout<<"after movedown Node is:"<<endl;

                cur = cur -> down;

                cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

                break;

            }

            case
7://删除当前节点

            {

                cout<<"the Node will be delete is:"<<endl;

                cout<<cur->name<<" "<<cur->prof<<" "<<cur->type<<endl;

                int
flag1 = 0,flag2 = 0;

                Node * p1;

                Node * p2;

                if(cur -> right !=NULL)

                {

                    p1 = cur -> right;

                    flag1 = 1;

                }

                if(cur -> down != NULL)

                {

                    p2 = cur ->down;

                    flag2 = 1;

                }

                if(flag1&&flag2)//右边和下边都有元素的话,把右边的节点赋值给当前要删除的节点,并且把下面的元素连接到当前节点

                {

                    cur -> name = p1 -> name;

                    cur -> prof = p1 -> prof;

                    cur -> type = p1 -> type;

                    delete
p1;

                    cur ->down = p2;

                }

                else
if(flag1)//只有右边有元素,把右边的节点赋值给当前要删除的节点

                {

                    cur -> name = p1 -> name;

                    cur -> prof = p1 -> prof;

                    cur -> type = p1 -> type;

                    delete
p1;

                }

                else
if(flag2)//只有下边有元素,把下边的节点赋值给当前要删除的节点

                {

                    cur -> name = p2 -> name;

                    cur -> prof = p2 -> prof;

                    cur -> type = p2 -> type;

                    delete
p2;

                }

                break;

            }

            case
8://统计所有结点

            {   number0 = 0;number1 = 0;number2 = 0;

                dfs(cur);

                cout<<"jiaoshou yanjiusheng xuesheng number:"<<number0<<" "<<number1<<" "<<number2<<endl;

                break;

            }

            case
9://查询姓名(dfs)

            {

                string name;

                cout<<"please chaxun name"<<endl;

                cin>>name;

                if(!findname(cur,name))

                {

                   cout<<"can not find"<<endl;

                }

                nameflag = 0;

                break;

            }

            case
10://打印当前节点的所有学生

            {

                dfs(cur);

                break;

            }

            }

        }

    }

};

int
main()

{

    LS dusk;

    dusk.all_function();

}

  

本科生导师制 问题,布布扣,bubuko.com

时间: 2024-08-09 21:49:56

本科生导师制 问题的相关文章

导师制

提到导师制,感觉这是一个伟大的创举.和传统的学校教学模式相比,比知道要好多少(自我感觉).在学校,我们所学到的不外乎就是一些脱离社会时代的基础,学之不能说完全无用,但是毕业后真正能用得到的会有多少,5%?10%?还是多少? 还有一点就是,上了大学的学习完全变了一个味,老师除了教学在上课中能够见到,其余时间一个星期见不到几次面.很大程度上收到了限制. 当然,世事无绝对,来到提高班发现一个非常好的制度:"导师制".其基本原理就是:由上一届或者两届的师哥带你学习,就像是大学毕业生刚刚毕业找到

[转载]从春招到秋招,一个本科生的求职之路。

原文:从春招到秋招,一个本科生的求职之路. 自报家门,北理工软件学院本科生. 主要部分: 1.毕业去向选择 2.春招过程 3.暑期实习 4.秋招辛酸路程 5.一点感悟 1.毕业去向选择问题 从大一开始,就决定毕业找工作,方向是有了,但是三年多过去了,到现在才发现,大学期间并没有为这个方向做出太大的努力,这也成为我一个本科生找工作的很大障碍,实践能力严重不足.我的情况是:我决定工作,但是由于高中的思维,太看重学习成绩,成绩搞的很好,虽然有保研资格,但是又不读研,找工作的时候,好的互联网公司不看成绩

本科生怎样发表论文?

[专訪三九论文网]问:本科生怎样发论文 答:这个得看学校是否有这样的氛围了.一般学校都没有考虑本科生发文章的事情.但有些课题组就有,例如说中科大南开等. 这个楼主最好跟相关导师表达下意愿吧. 答:和老师交流确定方向,查文献,写出设计的方案,若老师觉得能够,就进行实验,若终于实验成功,自己写好文章,让老师帮你改动并投出去,等待结果!!! 牛掰回答:别太当真 .给钱就发. [专訪三九论文网] 本科生怎样发表论文?,布布扣,bubuko.com

【转】本科生如何发表论文

1.本科生有论文重不重要? 对于本科生而言,一直以来的公认说法是GPA是王道,这句话确实不错.但是这句被奉做神明的话对大多数人并不成立,因为第一名就那一个人,对于广大的GPA不是那么高的人怎么办呢?我认为论文是唯一能弥补GPA(个别竞赛的超级大奖除外),甚至能带来比高GPA还给力好处的东西.比如我的gpa实属非常一般,但是在论文的帮助能得以有一个相对不错的申请结果.相信我如果没有论文,申请结果一定是惨不忍睹.我在面试和在各种老师的沟通过程中,几乎所有老师都只是对我的科研经历感兴趣,对我的其他经历

你的陪伴,我的成长--致导师制

每年都有年总结,暑假总结,但一直以来都忽视了另一个事物带给我们的的成长--导师制. 仔细想想这两年来,我们每次的收获都离不开导师制.这两年里,我们遇到了很多尽职尽责的师傅,我们也都从他们身上学到了很多. 从第一年到提高班遇到邢金聪师哥,从他身上学到了如何管理时间控制自己,每次开会都会有充分的先准备,准确的时间规划.这也算是为我的时间打下了基础,也让我切实感受到了自律和自控. 到作品展重新分配师傅,我们小组很荣幸的遇到了康丽贤师姐和周响师哥,他们两位不仅仅是技术上的大牛,对徒弟那也是无微不至.还记

南开大学数学院本科生课程信息汇总表(2013.11.19)

      数学院本科生课程信息汇总表         课程代码 课程名称 英文课程名称 课程组成员 学分 先导课程 参考教材 作者 出版社 1010011090 概率论 江一鸣 4 数学分析 概率论基础 李贤平 高等教育出版社 1010011690 金融信用风险 江一鸣 3 概率论 金融衍生品定价模型---数理金融引论 孙健 中国经济出版社 1010010120 抽象函数与Banach代数 Abstract Functions and Banach Algebras 刘锐 3 实变函数(实分析

一位在校本科生有关IT学习的疑问及答复

[来信] 周学长,你好.我现在是南京邮电大学的一名本科生,可以问你一个问题吗?其实我对it这一行业很感兴趣,但我的本专业不是学这个的.我自学完了C++,程度大概是可以写一个很初级的类似学生管理系统这样.然而我不知道之后应该干嘛了.你可以给我一些指点吗?谢谢. [答复] 同学,你好! 你能在大学里面找到自己感兴趣的东西,作为学长,我也为你感到高兴.很多人在大学里面浑浑噩噩地度过了四年,最后发现所学的专业不是自己感兴趣的,找的工作也不是本专业的.希望你能够将你这个兴趣的火花延续下去. 你所学的专业不

导师制双选系统

综合应用算法训练 一任务说明 设计一个用于软件工程系本科导师制双选的系统. 设计要求: (1) 实现学生信息管理,支持信息更新: (2) 实现教师信息管理,支持信息更新: (3) 实现学生填写导师志愿的过程,并提供当前导师的选择情况: (4) 实现基于规则的志愿调整过程: (5) 实现导师的学生筛选过程: (6) 实现各种信息的多类查询. 二实验环境及实验准备 C#编程语言 三系统分析与设计 此部分包括软件程序的需求分析与软件设计部分,最好图文并茂. (1)需求分析 参照实验要求,实现调用数据库

写给软件学院的本科生(转)

本人今年北软研究生毕业,本科是35所示范性软院之一,在毕业之际,回顾软院的7年学习生活,很感慨,写点东西给软件学院的师弟师妹们. 今年软件工程被提升至一级学科,没有挂在计算机科学之下了,而且软件学院开始招收工程博士生了,真是可喜可贺. 我读软件学院本科的时候,软院才刚成立不久,35所示范性软院之一,那个时候想找个师兄问一问大学该怎么度过,软院第一届的师兄们都还没毕业呢,也很懵懂,咋给我经验呢.只好自己摸索着学习了.现在我都软院研究生毕业了,就让我来给大家讲讲在软件学院的本科该如何学习吧. 大学本