求助C#考场编排

jhhgchenlu 2009-04-22 11:20:44
有两个表,班级表(tb_class)和教室表(tb_room),
班级表字段:班级号,班级名,人数;
教室表字段:教室编号,教室名,容纳人数
要编排每个班对应的考试教室,只要班级人数和教室人数最佳匹配就可以编排进去,不用考虑班级每个考生的座位编排。用C#怎么实现啊?我的想法是从班级表和教室表中各取一条记录,将班级人数和教室容纳人数做一个比较,符合就编排进去,可是不知道用c#代码怎么来实现,请大家帮帮我!急!
对了, SqlDataAdapter da = new SqlDataAdapter("select * from tb_class", conn);
DataSet ds = new DataSet();
da.Fill(ds);
string[] aa=new string[ds.Tables[0].Rows.Count];
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
aa[i] = ds.Tables[0].Rows[i].ToString();
}
以上代码是将表里的记录信息一条一条的存入数组中吗?
...全文
234 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhhgchenlu 2009-04-24
  • 打赏
  • 举报
回复
高手进来看看啊!
jhhgchenlu 2009-04-24
  • 打赏
  • 举报
回复
哪位高手帮我看看,在线等!
Jock.Chen 2009-04-24
  • 打赏
  • 举报
回复
思路:将每个教室的容纳人数跟每个班级人数比较,排除负数的记录,再从中选择差值最小(最优)的排班,由于可能出现同一教室对2个班以上是最优的,所以只选择满足条件的第一个,执行重复操作,到所有班级排完.
下面代码测试通过.

declare @tb_class table(classNo nvarchar(3),className nvarchar(15),quantity int)
declare @tb_room table(roomNo nvarchar(3),roomName nvarchar(15),quantity int)

insert into @tb_class(classNo,className,quantity)
select '001','1班',50
union
select '002','2班',55
union
select '003','3班',65
union
select '004','4班',45
union
select '005','5班',35
union
select '006','6班',35

insert into @tb_room(roomNo,roomName,quantity)
select '001','1教室',60
union
select '002','2教室',50
union
select '003','3教室',70
union
select '004','4教室',30
union
select '005','5教室',80
union
select '006','6教室',60
union
select '007','7教室',65
union
select '008','8教室',62


declare @temp table(classNo nvarchar(3),className nvarchar(15),roomNo nvarchar(3),roomName nvarchar(15),quantity int)
-- 笛卡尔积
-- 每个教室对应一个班
insert into @temp(classNo,className,roomNo,roomName,quantity)
select classNo,className,roomNo,roomName,(b.quantity-a.quantity) as quantity
from @tb_class a,@tb_room b


-- 删除教室不能容纳班级的记录
delete from @temp where quantity <0
-- 保存排班结果
declare @tb_Result table(classNo nvarchar(3),className nvarchar(15),roomNo nvarchar(3),roomName nvarchar(15),quantity int)

select * from @temp
while(@@ROWCOUNT <>0)
begin
insert into @tb_Result
select top 1 a.classNo,a.className,a.roomNo,a.roomName,a.quantity
from @temp a where not exists
(select 1 from (select * from @temp b where
not exists (select 1 From @tb_Result where classNo=b.classNo or roomNo=b.roomNo)) b where quantity<a.quantity )
and not exists (select 1 From @tb_Result where classNo=a.classNo or roomNo=a.roomNo)
end
select * from @tb_Result
Garnett_KG 2009-04-24
  • 打赏
  • 举报
回复

DECLARE @ClassID VARCHAR(10),@Qty INT
DECLARE cur CURSOR FOR
SELECT 班级号,人数
FROM tb_class
OPEN cur
FETCH NEXT FROM cur INTO @ClassID,@Qty
WHILE @@FETCH_STATUS=0
BEGIN
INSERT INTO tb_classroom(班级号,教室编号)
SELECT @ClassID,(
SELECT TOP 1 教室编号 FROM tb_room a
WHERE 容纳人数>=@Qty
AND NOT EXISTS
(
SELECT * FROM tb_ClassRoom WHERE 教室编号=a.教室编号
)
ORDER BY 容纳人数
)
FETCH NEXT FROM cur INTO @ClassID,@Qty
END
CLOSE cur
DEALLOCATE cur


jhhgchenlu 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Garnett_KG 的回复:]
最佳匹配是什么意思?
上点样例数据及想要得到的结果来看看
[/Quote]

就是班级人数小于等于教室人数,又不会造成太多空间浪费,可以说教室容纳人数和班级人数差值最小
结果就是想得到一个班级对应一个教室,将数据保存到表tb_classroom中(序号,班级号,教室编号),实现考场编排

SqlConnection conn = _.BaseClass.DBconn.CyCon();//连接数据库
string[] aa = new string[12];//存放班级号
string[] bb = new string[12];//存放教室编号

private void button1_Click(object sender, EventArgs e)
{
conn.Open();
SqlCommand cmd1 = new SqlCommand("select 班级号 from tb_class", conn);
SqlDataReader da1 = cmd1.ExecuteReader();
while (da1.Read())
{
for (int i = 0; i < aa.Length; i++)
{
aa[i] = Convert.ToString(da1["班级号"]);
}
}
da1.Close();
SqlCommand cmd2 = new SqlCommand("select 教室编号 from tb_room", conn);
SqlDataReader da2 = cmd2.ExecuteReader();
while (da2.Read())
{
for (int i = 0; i < bb.Length; i++)
{
bb[i] = Convert.ToString(da2["教室编号"]);
}
}
da2.Close();
for(int i=0;i<aa.Length;i++)
for(int j=0;j<bb.Length;j++)
{
SqlCommand cmd3 = new SqlCommand("select 人数 from tb_class where 班级号=" + aa[i] + "", conn);
SqlDataReader da3 = cmd3.ExecuteReader();
da3.Read();
int aa1 = (int)da3["人数"];
da3.Close();
SqlCommand cmd4 = new SqlCommand("select 容纳人数 from tb_room where 教室编号=" + bb[j] + "", conn);
SqlDataReader da4 = cmd4.ExecuteReader();
da4.Read();
int bb1 = (int)da4["容纳人数"];
da4.Close();
if (aa1 <= bb1)
{
SqlCommand cmd = new SqlCommand("insert into tb_classroom(班级号,教室编号) select 班级号,教室编号 from tb_class,tb_room where 班级号=" + aa[i] + " and 教室编号=" + bb[j] + "", conn);
cmd.ExecuteNonQuery();
}
break;
}

conn.Close();
}
上述代码实现不了预期结果,帮忙看看哪里错了?多谢了!还可以加分哦!
jerrylyj 2009-04-23
  • 打赏
  • 举报
回复
循环嵌套判断
teerhu 2009-04-23
  • 打赏
  • 举报
回复
保存的是行的对象
itcrazyman 2009-04-23
  • 打赏
  • 举报
回复
mark up 帮顶 保存的是行的对象
itcrazyman 2009-04-23
  • 打赏
  • 举报
回复
mark up 帮顶 将循环将行保存到了数据,但保存的是行的对像
Garnett_KG 2009-04-23
  • 打赏
  • 举报
回复
最佳匹配是什么意思?
上点样例数据及想要得到的结果来看看
jhhgchenlu 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wjf8882300 的回复:]
用循环嵌套效率也太低了吧,用二分查找,找出班级最大和最小,教室最大和最小,求二者中间量,对比,容满足则放进去并划分高低区域,递归至最后
[/Quote]

有没有缘代码示例一下,多谢了!
wjf8882300 2009-04-23
  • 打赏
  • 举报
回复
用循环嵌套效率也太低了吧,用二分查找,找出班级最大和最小,教室最大和最小,求二者中间量,对比,容满足则放进去并划分高低区域,递归至最后

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧