📄 主程序.prg
字号:
WAIT CLEA
IF nj=1
DO CASE
CASE jdmcbh=1
REPL ALL 入学zmc WITH zmcz
CASE jdmcbh=2
REPL ALL 一上期中zm WITH zmcz
CASE jdmcbh=3
REPL ALL 一上期末zm WITH zmcz
CASE jdmcbh=4
REPL ALL 一下期中zm WITH zmcz
CASE jdmcbh=5
REPL ALL 一下期末zm WITH zmcz
ENDCASE
ENDIF
IF nj=2
DO CASE
CASE jdmcbh=2
REPL ALL 二上期中zm WITH zmcz
CASE jdmcbh=3
REPL ALL 二上期末zm WITH zmcz
CASE jdmcbh=4
REPL ALL 二下期中zm WITH zmcz
CASE jdmcbh=5
REPL ALL 二下期末zm WITH zmcz
ENDCASE
ENDIF
IF nj=3
DO CASE
CASE jdmcbh=2
REPL ALL 三上期中zm WITH zmcz
CASE jdmcbh=3
REPL ALL 三上期末zm WITH zmcz
CASE jdmcbh=4
REPL ALL 三下期中zm WITH zmcz
CASE jdmcbh=6
REPL ALL 三下适应zm WITH zmcz
CASE jdmcbh=7
REPL ALL 中考zmc WITH zmcz
ENDCASE
ENDIF
ENDPROC
PROC sanbmc()&&算班名次
PRIV N,i,i1,i2,i3
SELE cjk
* 统计各班各科目名次
FOR i=1 TO bjs
SET FILT TO 班级=i
@ 15,15 SAY ' ' FONT "宋体",15 STYL "B"
FOR N=1 TO kms
zdm=SUBS(sy_km,N*4-3,4)
bmcm=SUBS(tj_bmc,N*4-3,4)
IF (zdm $ lk_km .AND. SUBS(sy_bj,i*2-1,2) $ lk_bj ) .OR.(zdm $ wk_km .AND. SUBS(sy_bj,i*2-1,2) $ wk_bj )
BLANK ALL FIELDS &bmcm.
@ 15,15 SAY "正在统计"+LEFT(njmc,2)++"【"+SUBS(bjmc_all,i*2-1,2)+"班】的〖"+zdm;
+"〗科目名次 " FONT "宋体",15 STYL "B"
SET SAFE OFF
INDE ON - &zdm. TO cjkidx
SET SAFE ON
GO TOP
i3=1
i1=-1
DO WHIL .NOT. EOF()
IF &zdm. <> i1
REPL &bmcm. WITH i3
IF 删除="*"
BLANK FIEL &bmcm
ENDIF
IF .NOT. DELE()
i1=&zdm.
i2=&bmcm.
ENDIF
ELSE
REPL &bmcm. WITH i2
IF 删除="*"
BLANK FIEL &bmcm
ENDIF
ENDIF
IF .NOT. DELE()
i3=i3+1
ENDIF
SKIP
ENDDO
ENDIF
ENDF
ENDF
SET FILT TO
@ 15,15 SAY ' ' FONT "宋体",15 STYL "B"
IF nj=1 .AND. jdmcbh=1
REPL ALL 入学bmc WITH bmcz
ENDIF
IF nj=3 .AND. jdmcbh=7
REPL ALL 中考bmc WITH bmcz
ENDIF
ENDPROC
PROC phgbrs &&平衡各班人数————以人数最低的班为准,从低分往高分去人,让各班人数相等
LOCAL x,i,m,j,z,T
SELE cjk
SET SAFE OFF
INDE ON 总分 TO cjkidx
SET SAFE ON
RECALL FOR 去尾
IF sftjzbs
RECALL FOR 删除="#"
ELSE
DELE FOR 删除="#"
ENDIF
REPL ALL 去尾 WITH .F.
DIME rs_b(bjs)
FOR m=1 TO sffwlk
T=STR(m,1)
IF IIF(m=1,lbjs,wbjs)=0
EXIT
ENDI
********各班去掉人,以便平均
FOR i=1 TO IIF(m=1,lbjs,wbjs)
COUNT TO rs_b(i) FOR SUBS(sy_bj,班级*2-1,2)=SUBS(IIF(m=1,lk_bj,wk_bj),i*2-1,2) .AND. .NOT. DELE()
ENDF
min_brs=rs_b(1)&&暂认为人数最少的班为1
FOR j=2 TO IIF(m=1,lbjs,wbjs)
IF min_brs>rs_b(j)
min_brs=rs_b(j)
ENDIF
ENDF
z=min_brs &&实际最少班人数
IF m=1
x= MESSAGEBOX("是否按人数最少班的90%为齐来去人,选择【是】将取90%,选择[否]则以最少班人数"+CHR(13)+"为齐,选择[取消]则不去人,以实际人数为准",;
547,"使各班人数相等,从总分的最低分开始去人,这些人在算积分时被忽略掉!")
ENDIF
IF x=6
min_brs=ROUND(min_brs*0.9,0) &&取最少人数的班的人数90%算积分
ENDIF
IF x=2
RECALL FOR 去尾
BLAN ALL FIELDS 去尾
IF sftjzbs
RECALL FOR 删除="#"
ELSE
DELE FOR 删除="#"
ENDIF
DO tcbjrs
RETU
ENDIF
=MESSAGEBOX(IIF(m=1,IIF(sffwlk=1,"该年级","理科班"),"文科班")+"最少班的人数为:"+STR(z,3)+"人"+CHR(13);
+"注意计算积分人数为为"+STR(min_brs,3)+"人",0,"提示最少人数!!")
FOR i=1 TO IIF(m=1,lbjs,wbjs)
GO TOP
DO WHIL rs_b(i)>min_brs
IF SUBS(sy_bj,班级*2-1,2)=SUBS(IIF(m=1,lk_bj,wk_bj),i*2-1,2) .AND. .NOT. DELE()
REPL 去尾 WITH .T.
DELE
SKIP
rs_b(i)=rs_b(i)-1
ELSE
SKIP
ENDIF
ENDDO
ENDF
ENDF
DO tcbjrs
SET DELE OFF
*************
ENDPROC
PROC zdcl() &&自动处理成绩(全套功能)
IF mima<>'z'+STRT(ALLT(STRT(STR(COS(SIN(VAL(SYS(2020))*2)),12,10),'.','')),'-','')
DO xinjian1
ELSE
DO dakai1
ENDIF
IF ALLT(DBF(2))==''
RETU
ENDI
DO phgbrs
DO sanzf
DO sanzmc
DO sanbmc
DO FORM 积分项目设定
DO sanjf
DO FORM 打印报表
*!* IF MESSAGEBOX("是否打印各项积分第一",292,"打印积分")=6
*!* DO 打印各项第一名.prg
*!* ENDIF
*!* IF MESSAGEBOX("是否打印表彰名单",292,"打印表彰")=6
*!* DO 打印表彰名单.prg
*!* ENDIF
ENDPROC
****************************************************************************************************************************************************
PROC bpkc_print &&编排考场
PRIV i,j,k1,z1,i_kl,qskc
qskc=1
**排理考场
PUBLIC s2,s3,s4,s5,s51,s7,s6,s8,s9,zrs
SELE cjk
SET DELE OFF
BLANK ALL FIELDS 考室
SET SAFE OFF
INDE ON 班级*1000-总分 TO cjkidx
SET SAFE ON
FOR i_kl=1 TO sffwlk
DELE ALL
RECALL ALL FOR ALLT(删除)<>"*"
DELE FOR kl<>STR(i_kl,1)
SET DELE ON
COUNT TO zrs FOR VAL(kl)=i_kl
************* 请修改以下参数
s8=qskc &&起始考场
s6=35 &&每考室想安排的人数
s3=CEIL(zrs/s6) && 表示安排考室的个数(至少),每考场35人
s9=s8+s3-1&&结束考场
s51=FLOOR(zrs/s3)&& 表示每考室的考生数(取人数最少的一个班)
s5=CEIL(zrs/s3)&& 表示每考室的考生数(取人数最多的一个班)
IF s51>32
s2=5 && 表示每排S2个考生
ELSE
s2=4
ENDIF
s4=CEIL(s51/s2) && 表示每考室的排数(至少)
DO FORM 考场参数设置.scx
pkcbjs=IIF(i_kl=1,lbjs,wbjs)&& 表示排考场的班级数为PKCBJS
pkcbjmc=IIF(i_kl=1,lk_bj,wk_bj)
PUBLIC rs_b(pkcbjs) &&各班考生数
************ 以下请勿修改
PUBLIC rs_max,bj_max
rs_max=0
bj_max=0
FOR i=1 TO pkcbjs
COUNT TO x1 FOR SUBS(pkcbjmc,i*2-1,2)=SUBS(sy_bj,班级*2-1,2) .AND. 删除<>'*'
STOR x1 TO rs_b(i),sjbjrs(i)
ENDF
s7=MOD(zrs,s3) &&人数多的考室的个数
*********************************************************************
IF i_kl=1
SET SAFE OFF
CREA CURS kck (排号 c(6),列1 c(14),列2 c(14),列3 c(14),列4 c(14),列5 c(14),列6 c(14),列7 c(14),列8 c(14),列9 c(14),;
列10 c(14),列11 c(14),列12 c(14),列13 c(14),列14 c(14),列15 c(14),列16 c(14),列17 c(14),列18 c(14),列19 c(14),列20 c(14))
SET SAFE ON
ELSE
SELE kck
ENDIF
********************************************************************
SELE cjk
PUBL zw(s4+2,s2+2) &&s2 一排几人,s4 一教室几排 存的是姓名+考号
PUBL zwb(s4+2,s2+2) &&存的是班名
hsrs=zrs &&还剩人数(未排的)
FOR z1=1+qskc-1 TO s3+qskc-1 && 表示安排考室的个数
STOR "_" TO zw
STOR "_" TO zwb
IF z1>s7+qskc-1
s5=s51
ENDIF
i=0 &&该考室排了几人了
IF sfzxpl
FOR k1=1 TO s2 && 表示每考室的列数
FOR j=1 TO s4 && 表示每列S4个考生
zw(j+1,1)="_"+ALLT(STR(z1))+"_"+ALLT(STR(j))
i=i+1
IF i>s5 .OR. hsrs<=0 && S5表示每考室的考生数 x 未排完的人数
IF hsrs<=0
k1=1000
j1=1000
ENDIF
j=s4+2
ELSE
DO gspkc &&开始排考场
ENDIF
ENDF
ENDF
ELSE
FOR j=1 TO s4 && 表示每考室的排数
zw(j+1,1)="_"+ALLT(STR(z1))+"_"+ALLT(STR(j))
FOR k1=1 TO s2 && 表示每排S2个考生
i=i+1
IF i>s5 .OR. hsrs<=0 && S5表示每考室的考生数 x 未排完的人数
IF hsrs<=0
k1=1000
j1=1000
ENDIF
j=s4+2
ELSE
DO gspkc &&开始排考场
ENDIF
ENDF
ENDF
ENDI
SELE kck
APPEN FROM ARRAY zw FOR .NOT. ALLT(排号)=='_'
SELE cjk
ENDF
qskc=z1
SELE cjk
* DO sub3
SELE kck
FOR i=1 TO FCOUNT()
z=FIELDS(i)
BLANK ALL FIELDS &z FOR ALLT(&z)=='_'
ENDF
ENDF
SELE kck
zdm=FIEL(1)
FOR i=2 TO FCOU()
GO TOP
zd=FIEL(i)
IF .NOT. isblank(&zd)
zdm= zdm +','+ zd
ENDI
ENDF
BROW NODE NOAPP FIEL &zdm
SET SAFE OFF
filea=PUTF("输出到",pathkc+ksqc+'座位表','XLS')
IF filea==''
=MESSAGEBOX("文件不存在!",0,"敬告")
ELSE
COPY TO ( filea) TYPE XL5 FIELDS &zdm
ENDIF
SET SAFE ON
SELE cjk
SET DELE OFF
RECALL ALL
DELE FOR 备注="删除"
PACK
DELE FOR 删除="*"
DO ksfb_print
SELE kck
USE
SET SAFE OFF
SET SAFE ON
SET DELE OFF
SELE cjk
IF sftjzbs
RECALL FOR 删除="#"
ELSE
DELE FOR 删除="#"
ENDIF
DELE FOR 去尾
DO tcbjrs
ENDPROC
*********************************************************************************
PROC gspkc && 开始排考场
* 统计可排的各班人数
*****第一排硬规定
GO TOP
IF .NOT. pkcck
STOR ALLT(SUBS(考号,1,6))+ IIF(LEN(ALLT(姓名))=4,LEFT(姓名,2)+"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -