将学生分配到答辩组答辩。详细要求如下:
(1)每一组有若干教师组成;
(2)学生不能在毕设指导老师所在组答辩;
(3)各组人数大致相同;
(4)随机分配。
求大家指点。我之前的想法是:
(1)从用一个容器S_List装待分配的学生,
(2)每次通过过滤条件找出可选项Optional_List,
(3)再从可选项中随机选出Group_Count个,将这些项从S_List中删除
(4)根据组数,重复(2)、(3)。指导每组都有分配
(5)分配剩余人数
这个想法用代码实现后有问题,问题就出在算法上,这个算法不能保证每一组在任何时候都能有分配。求高手指点,越详细越好。谢谢!
(1)每一组有若干教师组成;
(2)学生不能在毕设指导老师所在组答辩;
(3)各组人数大致相同;
(4)随机分配。
求大家指点。我之前的想法是:
(1)从用一个容器S_List装待分配的学生,
(2)每次通过过滤条件找出可选项Optional_List,
(3)再从可选项中随机选出Group_Count个,将这些项从S_List中删除
(4)根据组数,重复(2)、(3)。指导每组都有分配
(5)分配剩余人数
这个想法用代码实现后有问题,问题就出在算法上,这个算法不能保证每一组在任何时候都能有分配。求高手指点,越详细越好。谢谢!
解决方案 »
- WINFORM 有些类好像不能在"服务"当中运行
- Control.Invoke 必须用于与在独立线程上创建的控件交互
- C# DataRow的Tostring为何多个零,如何解决?
- 【初学者求教】这个是时间戳么?
- 大家调试程序时都用哪些中间输出数据的方法查看一下中间结果?
- 支付宝接口集成问题,做过的请支援下~
- 帮忙解决一下,正则表达式。
- FreeTextBox3.1.6在.Net2.0中怎么使用??
- WPF编程
- 日期增加问题
- Winform中的contextMenuStrip中的菜单项"编辑"怎么样根据listview中的结点来生成其子项呢?
- winform中如何把第二个界面的值传回给第一个界面?
USE [test]
go/*
1.学生表中每名学生都对应一位指导教师
2.该学生被分配到的答辩组不能包含该学生的指导教师
*/
--待分配学生表
declare @S_List table
(
s_id varchar(10), --学生id
guide_id varchar(10) --指导老师id
)
INSERT INTO @S_List --存在5个学生进行答辩
select 's1','g1'
union
select 's2','g2'
union
select 's3','g3'
union
select 's4','g4'
union
select 's5','g5'
--待分配教师表
declare @T_List table
(
teacher_id varchar(10)
);
INSERT INTO @T_List
select 'g1'
union
select 'g2'
union
select 'g3'
union
select 'g4'
union
select 'g5'
union
select 'g6'
union
select 'g7'
union
select 'g8'
union
select 'g9'
union
select 'g10'declare @Answer_Group table
(
group_id varchar(10),
teacher_id varchar(10)
)DECLARE @Group_Member int = 2; --每个答辩组老师人数
DECLARE @Group_Sum int = (SELECT COUNT(teacher_id) FROM @T_List) / @Group_Member --答辩总组数WHILE(1=1)
BEGIN
DECLARE @Max_Group_Number int = (SELECT MAX(CAST(group_id AS int)) FROM @Answer_Group)
IF (@Max_Group_Number = @Group_Sum) --组编号等于总答辩组数时退出
BREAK;
IF @Max_Group_Number IS NULL
SET @Max_Group_Number= ISNULL(@Max_Group_Number, 1) --组数为空时的处理
ELSE
SET @Max_Group_Number=@Max_Group_Number+1; --将组数自增
--随机抽选2名老师分配到答辩组中
INSERT INTO @Answer_Group
SELECT TOP(@Group_Member) @Max_Group_Number, t.teacher_id
FROM
( SELECT teacher_id FROM @T_List
EXCEPT SELECT teacher_id FROM @Answer_Group) t
ORDER BY NEWID()
END;WITH c_Group AS
(
SELECT DISTINCT group_id,
STUFF((SELECT ';'+LTRIM(teacher_id)
FROM @Answer_Group tempC
WHERE group_id= a.group_id
FOR XML PATH('')),1,1,'') Member
FROM @Answer_Group a
)
,c2 AS
(
SELECT c.*, s.s_id --s_id列为学生编号,c.GroupID为随机组,Member列为该组分配的老师
FROM c_Group c
JOIN @S_List s ON CHARINDEX(s.guide_id, c.Member)=0
)
SELECT * FROM c2--从c2视图中任意抽选s_id 为(s1,s2,s3,s4,s5)的5条数据即表示分组成功,试试看能否满足要求
Student_Info(S_ID,S_Name,S_Gender,S_Class)学生信息表。(学号,姓名,性别,专业班级)
Teacher_Info(T_ID,T_Name,T_Post)教师信息表。(教师编号,姓名,职称)
GraduationDesign(ID,S_ID,T_ID)毕业设计导师分配表(ID,学号,教师编号)
TeacherDefenseGroup(ID,T_ID,G_Num)教师答辩分组表(ID,教师编号,组号)
TeacherDefenseGroup(ID,S_ID,G_Num)学生答辩分组表(ID,学号,组号)