专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VFP

求编排考号有关问题

发布时间:2010-05-24 22:04:32 文章来源:www.iduyao.cn 采编人员:星星草
求编排考号问题
需求是这样的,如1年级有8个班,那么考号编排规则是:第1个班的第一个学生考号为1号,第2个班的第一个学生考号为2号,以此类推。
我现在的办法是导出到excel里面用公式算出考号后,在保存为dbf。确点是 数据库结构 要丢失。
求解决vfp 具体算法。

------解决方案--------------------
这是哪个没事做,坐办公室里捧着茶杯想出来的“方案”?是不是每个班级的人数都一样多?不一样多的话出现空缺怎么办?

不管了,就这样理解了:1-8班依次从1-8号开头,一个班里每个学生的考号相差8,空缺不管

for i=1 to 8
repl all 考号 with i+(学号-1)*8
endf

------解决方案--------------------
可能应当将上面的学号换成班里的顺序号
------解决方案--------------------
VFP的功能真的很强大!就这简单的三行语句就将排考号的问题给解决了。。。

如果将班级号也放在表里,一行语句就解决了。。。
------解决方案--------------------
这其实是一个算法的问题了
无论用啥办法,只要达到:
1)同班的不连
2)同班在同试场的人数尽可能少,座位尽可能远
我给你写一段代码,你参考参考,数据表就用你提供的那个表,只是把表名改成了SCB.dbf
SQL code

Set Safety Off
Close Databases
*定义试场坐位号次序串
zwh_cx='010711152127030917250513192329021016222604081418243006122028'
*设置标准满试场人数
scbzrs=30
*记录各年级总人数
Use scb Alias scb In 0
Select scb
Count For nj='1' To r1
Count For nj='2' To r2
Count For nj='3' To r3
*计算各年级共需要的试场总数,不同年级不混排
scs1=Ceiling(r1/scbzrs)
scs2=Ceiling(r2/scbzrs)
scs3=Ceiling(r3/scbzrs)
*计算各年级尾数试场人数
wscrs1=r1-Int(r1/scbzrs)*scbzrs
wscrs2=r2-Int(r2/scbzrs)*scbzrs
wscrs3=r3-Int(r3/scbzrs)*scbzrs
*建立一个中间表,并利用这个中间表进行编排
Create Dbf lsscb (sch c(3),zwh c(2),xxh c(4))
**************************************************
*            lsscb字段说明
*sch:三位字符,第一位代表年级,后两位代表试场号 *
*zwh:两位字符代表座位号                         *
*xxh:第一位代表年级,第二位代表单双号,1单2双   *
*     最后两位表示按照坐位号次序串重新生成的顺序 *
**************************************************
Select lsscb
If r1>0
    s=1
    z=1
    For i=1 To r1
        Append Blank
        If Mod(z,2)=1
            Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '11'+Substr(zwh_cx,2*z-1,2)
        Else
            Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '12'+Substr(zwh_cx,2*z-1,2)
        Endif
        If z<scbzrs
            z=z+1
        Else
            z=1
            s=s+1
        Endif
    Endfor
Endif
If r2>0
    s=1
    z=1
    For i=1 To r2
        Append Blank
        If Mod(z,2)=1
            Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '21'+Substr(zwh_cx,2*z-1,2)
        Else
            Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '22'+Substr(zwh_cx,2*z-1,2)
        Endif
        If z<scbzrs
            z=z+1
        Else
            z=1
            s=s+1
        Endif
    Endfor
Endif
If r3>0
    s=1
    z=1
    For i=1 To r3
        Append Blank
        If Mod(z,2)=1
            Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '31'+Substr(zwh_cx,2*z-1,2)
        Else
            Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '32'+Substr(zwh_cx,2*z-1,2)
        Endif
        If z<scbzrs
            z=z+1
        Else
            z=1
            s=s+1
        Endif
    Endfor
Endif
Index On xxh To lsscb
Copy To ls
Zap
Append From ls
Select scb
Index On nj+bj To scb
Copy To ls
Zap
Append From ls
*给scb.dbf增加两个字段
If Type("scb.sch")='U'
    Alter Table scb Add Column sch c(3)
Endif
If Type("scb.zwh")='U'
    Alter Table scb Add Column zwh c(2)
ENDIF
*将编排的结果更新到scb新增的两个字段中
Select lsscb
Scan
    jlh=Recno()
    sc=sch
    zw=zwh
    Select scb
    Go jlh
    Replace sch With sc,zwh With zw
    Select lsscb
ENDSCAN
SELECT lsscb
USE
DELETE FILE lsscb.*
SELECT scb
INDEX on sch+zwh TO scb
COPY TO ls
ZAP
APPEND FROM ls
Delete File ls.Dbf
*******************************************
*生成考号的代码就省略,毕竟考号的规则很多 *
*******************************************
CLOSE DATABASES
Set Safety On
Return

------解决方案--------------------
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: