求编排考号问题

zhoujin96 2011-12-29 08:47:24
需求是这样的,如1年级有8个班,那么考号编排规则是:第1个班的第一个学生考号为1号,第2个班的第一个学生考号为2号,以此类推。
我现在的办法是导出到excel里面用公式算出考号后,在保存为dbf。确点是 数据库结构 要丢失。
求解决vfp 具体算法。
...全文
383 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujin96 2012-01-07
  • 打赏
  • 举报
回复
非常强大,谢谢大家的帮助。[Quote=引用 8 楼 lc_apple 的回复:]

上边的代码有点错误,改一下
SQL code

Set Safety Off
Close Databases
*定义试场坐位号次序串
zwh_cx='010711152127030917250513192329021016222604081418243006122028'
*设置标准满试场人数
scbzrs=30
*记录各年级总人数
Use scb Alias scb In 0
Select……
[/Quote]
lc_apple 2012-01-04
  • 打赏
  • 举报
回复
上边的代码有点错误,改一下

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('2'+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('2'+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('3'+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('3'+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
lc_apple 2012-01-04
  • 打赏
  • 举报
回复
这其实是一个算法的问题了
无论用啥办法,只要达到:
1)同班的不连
2)同班在同试场的人数尽可能少,座位尽可能远
我给你写一段代码,你参考参考,数据表就用你提供的那个表,只是把表名改成了SCB.dbf

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

zhoujin96 2011-12-30
  • 打赏
  • 举报
回复
如何解决?
遇到班级人数不一样怎么处理?[Quote=引用 3 楼 dfwxj 的回复:]

VFP的功能真的很强大!就这简单的三行语句就将排考号的问题给解决了。。。

如果将班级号也放在表里,一行语句就解决了。。。
[/Quote]
zhoujin96 2011-12-30
  • 打赏
  • 举报
回复
我把我的表放上来你看看
dfwxj 2011-12-29
  • 打赏
  • 举报
回复
VFP的功能真的很强大!就这简单的三行语句就将排考号的问题给解决了。。。

如果将班级号也放在表里,一行语句就解决了。。。
dfwxj 2011-12-29
  • 打赏
  • 举报
回复
可能应当将上面的学号换成班里的顺序号
dfwxj 2011-12-29
  • 打赏
  • 举报
回复
这是哪个没事做,坐办公室里捧着茶杯想出来的“方案”?是不是每个班级的人数都一样多?不一样多的话出现空缺怎么办?

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

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

2,722

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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