前几天去过一次面试,遇到这样一道题目:本公司有N个大的部门,每个部门下设有不同数目的科组,每个科组还会分更小的科组。每个部门和科组都有自己可用的经费,但每个科组的经费由上一级科组或部门管理。现在需要开发一个程序可以自动查询每一科组的可用经费及它管理的下级科组的所有可用经费。要求:需要自行设计方案和表结构。公式:本科组的下级可用费用=下级科组本组可用费用 +下级科组的下级科组费用。
插一段题外话,本来我是去面试系统分析员的,结果面试官安排我先做一套题目。一开始我很想跟他说不想做。但考虑到现时找工作难想珍惜此次机会,同时我也想了解下当今的面试题与以往相比是否难度更大。于是我还是一个一个题目做了。前面都是一些基础题,由于我应聘系统分析员,所以加了一道上面的设计题目。此题虽然说是一个设计题目,但也需要自己写代码实现你的方案或构想。所以我也没有二话可说,接着上题的编程。
很显然,这道题一看就是一个树型结构。还算比较复杂的树,没有办法定义层次和深度。学过数据结构知道有树的遍历方法,但似乎那些方法都用不上。因为此题需要计算每一科组的下级科组的可用费用,是倒过来计算的。需要先知道每一个叶子科组的费用(叶子没有下级科组费用)然后逐渐往上加至查询的科组。计算出每一科组的下级科组费用后就更新表中相应的科组。
首先插入一段XML给大家参考吧,有了这个XML,设计表结构也就简单了,请看代码段2
View Code
1 <?xml version="1.0" encoding="utf-8" ?>
2 <Company>
3 <Departments>
4 <department>
5 <departmentname> name1</departmentname>
6 <availablecost>可用费用</availablecost>
7 <subLevelCost>下级可用费用</subLevelCost>
8 <sections>
9 <section>
10 <sectionName> sectionName</sectionName>
11 <availablecost></availablecost>
12 <subLevelCost></subLevelCost>
13 <groups>
14 <group>
15 <groupName></groupName>
16 <availablecost></availablecost>
17 <subLevelCost></subLevelCost>
18 </group>
19 <group>
20
21 </group>
22 </groups>
23 </section>
24 <section>
25
26 </section>
27 </sections>
28 </department>
29 <department>
30
31
32 </department>
33 </Departments>
34 </Company>
以下是我设计的表结构:
View Code
Create table Organizations( Item varchar(10), up_item varchar(10), cost int , SubLevelCost int ,level int)
以下就是怎么计算下级科组费用方法了,我用的是存储过程,我写完了后考官问我能用.Net实现吗?其实一开始也想过用.Net来实现。但想了很久都没有想出来,我曾经想过组合设计模式的应用,但不知是我对此模式的了解不太深入,没有想出来怎么用它来实现此题。如果各位有此方法,还请不吝赐教,当然也欢迎其它方法的实现。在此谢谢了!
下面我贴上我的方法给大家参考,以下只是一个示例,介绍方法而用。如果有任何问题表请批评指正,谢谢!
--插入样例数据:
insert Ogranizations(level ,item,up_item,cost)
costs(0,'a', '0',100)
insert Ogranizations(level ,item,up_item,cost)
costs(1,'b','a',50)
insert Ogranizations(level ,item,up_item,cost)
costs(1,'c','a',50)
insert Ogranizations(level ,item,up_item,cost)
costs(1,'d','a',50)
insert Ogranizations(level ,item,up_item,cost)
costs(2,'e','b',40)
insert Ogranizations(level ,item,up_item,cost)
costs(2,'f','b',40)
insert Ogranizations(level ,item,up_item,cost)
costs(2,'g','c',40)
insert Ogranizations(level ,item,up_item,cost)
costs(2,'h','c',40)
insert Ogranizations(level ,item,up_item,cost)
costs(3,'i','e',30)
insert Ogranizations(level ,item,up_item,cost)
costs(3,'j','h',30)
insert Ogranizations(level ,item,up_item,cost)
costs(3,'k','h',30)
递归计算每一科组的下级科组费用:
select * into #t2 from Ogranizations order by level desc
select * ,identity(int,1,1) as sn into #t3 from #t2
declare @minValue int ,
@maxValue int,
@midValue int
SELECT @minValue =min(sn),@maxValue=max(sn) FROM #t3
select @midValue= @minValue
while @midValue <=@maxValue
begin
update a
set a.sublevelcost= isnull((select sum(cost+sublevelcost) from #t3 b where b.up_item= a.item),0)
from #t3 a where sn=@midcost
select @midValue= @midValue+1
end
SELECT * FROM #t3 order by level asc

浙公网安备 33010602011771号