注册 登录
编程论坛 VFP论坛

有关中考录取的问题

泛海孤舟 发布于 2021-08-15 13:03, 4007 次点击
各位大神,我今年开始做招生录取相关的工作,我区中招按平行志愿录取,每个考生可填18个学校(在计划库.dbf中)共19个志愿,考生志愿信息及其他信息在志愿表.dbf中,其中3701的学校具有定向生招生政策,志愿代码为003701,具体名额分配到各校(在定向生计划库.dbf中),各校定向生分数线为3701学校分数线下52分,比如3701学校的分数线为652分,则各校定向生分数线为600分,等级线要求4C6D且考生志愿库中dxs为.t.;下面附件里有我这个相关的程序(录取.prg)和三个数据表(志愿库.dbf、计划库.dbf、定向生计划库.dbf),可以运行,但是结果好像不对,不知道哪里出问题了,特别是定向生这块,02年的时候因为二级有接触过一段时间vfp,现在基本忘光,请各位大神指点。
只有本站会员才能查看附件,请 登录
37 回复
#2
xuminxz2021-08-15 14:04
最大的问题是 if Occurs("E",zyk.djf)<=jhk.dje .And. Occurs("D",zyk.djf)<=jhk.djD .And. Occurs("C",zyk.djf)<=jhk.djC   && 等级分线要求
例如要求是4C6D,考生如果是6C4D,应该是合格的,但按你的语句,是不合格的。(C有6个大于计划库中的4)
其它还有些小缺陷。
1、前后有了Evaluate(kszy)<>'003701' else后面就不用Evaluate(kszy)='003701'(当然用了结果不会错。)
2、Do While !Eof("zyk")
            If Empty(zyk.lqdm)&&这个多余。因为开始时,lqdm=''而后面指针一直后移动,不会有!Empty(zyk.lqdm)
3、 if Occurs("E",zyk.djf)<=jhk.dje .And. Occurs("D",zyk.djf)<=jhk.djD .And. Occurs("C",zyk.djf)<=jhk.djC   这里除了判断等级分要求,是否要判断lqjh<lqrs?
4、close all
不少人喜欢用这一语句 (或者是CLOSE DATABASE all)
这不是一个好习惯,将来不便于程序升级。比如,做成项目。
你这里似乎用 close table all 就足够了。
#3
泛海孤舟2021-08-15 14:13
回复 楼主 泛海孤舟
那改成这样呢if Occurs("E",zyk.djf)<=jhk.dje .And. Occurs("D",zyk.djf)<=jhk.djD  && 等级分线要求
#4
sdta2021-08-15 15:03
可以将等级分换算为具体分数,如:
A = 65 (ASC("A"))
B = 66
C = 67
D = 68
E = 69
4C6D = 4 * 67 + 6 * 68 = 676
SCAN FOR TDF >= 600 AND OCCURS("E", djf) = 0 AND djf1 <= 676 && 筛选条件
* 具体代码
ENDSCAN
#5
泛海孤舟2021-08-15 15:28
回复 3楼 泛海孤舟
主要的问题是定向生的问题
#6
sdta2021-08-15 15:36
问题:
1、定向生与计划生录取的先后顺序是如何规定的
2、如果某学校的录取名额为30人,当录取人数满30人后,但后面还有相同分数的人数若干,是否录取
3、说说三个表中相关字段的中文含义:
   如 定向生计划库 中 ZHZF, FSX 是什么意思
4、志愿库中 TDF 与各表的 ZHZF,FSX 是什么关系

解释清楚相关问题,所有问题就不是问题了。
#7
泛海孤舟2021-08-15 15:38
同分一并录取,zhzf是最后一名考生的总分,fsx是分数线
#8
泛海孤舟2021-08-15 15:53
If zyk.tdf == jhk.zhzf
    Replace zyk.lqdm With Evaluate(kszy) In zyk
    Replace jhk.lqrs With jhk.lqrs+1 In jhk
    EXIT
ENDIF
这段就是控制同分录取的。
#9
泛海孤舟2021-08-15 16:03
一直困扰我的是定向生分数线的问题,因为定向生分数线一定要在3701学校录取结束后地分数线减去52分,所以第一志愿zy1就没有003701这个志愿,要从第二个志愿zy2才会产生这个志愿,但是其他学校也是同时在做志愿匹配录取,没办法等3701志愿录满才去查询003701,这个我一直找不到解决的办法。
#10
sdta2021-08-15 16:03
定向生录取要具备那些条件,在 志愿库 表中只有DXS = .T.,DJF <= 4C6D,还需要什么条件
自己要主动把问题说清楚,不要让别人问你
#11
sdta2021-08-15 16:19
以下是引用泛海孤舟在2021-8-15 16:03:05的发言:

一直困扰我的是定向生分数线的问题,因为定向生分数线一定要在3701学校录取结束后地分数线减去52分,所以第一志愿zy1就没有003701这个志愿,要从第二个志愿zy2才会产生这个志愿,但是其他学校也是同时在做志愿匹配录取,没办法等3701志愿录满才去查询003701,这个我一直找不到解决的办法。

如果是定向生,分数从高到底同时按学校排序,按照录取人数录取即可(同分一并录取),这样最低分数线也出来了。

[此贴子已经被作者于2021-8-15 16:21编辑过]

#12
泛海孤舟2021-08-15 16:26
回复 9楼 泛海孤舟
我前面已经说了志愿库.dxs=.t.等级分4C6D以上,还有tdf不低于3701学校的分数线下52分三个条件。
#13
sdta2021-08-15 16:48
以下是引用泛海孤舟在2021-8-15 16:26:49的发言:

我前面已经说了志愿库.dxs=.t.等级分4C6D以上,还有tdf不低于3701学校的分数线下52分三个条件。

请解释4C6D以上是什么意思,都包括那些等级
#14
泛海孤舟2021-08-15 16:54
回复 12楼 泛海孤舟
其实就是控制D和E两个等级,因此我用if Occurs("E",zyk.djf)<=jhk.dje .And. Occurs("D",zyk.djf)<=jhk.djD控制。
#15
泛海孤舟2021-08-15 18:11
回复 11楼 sdta
定向生满足志愿库.dxs=.t.等级分4C6D以上,还有tdf不低于3701学校的分数线下52分三个条件。4C6D其实就是控制D和E两个等级,因此我用if Occurs("E",zyk.djf)<=jhk.dje .And. Occurs("D",zyk.djf)<=jhk.djD控制。
#16
sdta2021-08-15 18:33
以下是引用泛海孤舟在2021-8-15 18:11:15的发言:

定向生满足志愿库.dxs=.t.等级分4C6D以上,还有tdf不低于3701学校的分数线下52分三个条件。4C6D其实就是控制D和E两个等级,因此我用if Occurs("E",zyk.djf)<=jhk.dje .And. Occurs("D",zyk.djf)<=jhk.djD控制。

3701学校分数线是多少?
15层楼了,问题还没说清楚

[此贴子已经被作者于2021-8-15 18:34编辑过]

#17
泛海孤舟2021-08-15 18:47
回复 16楼 sdta
3701也是通过志愿录取的啊,录取满320人分数线就出来了,分数线就在计划库里。我就是这里卡扣了。可能我不善于表达吧。
#18
sdta2021-08-15 19:08
以下是引用泛海孤舟在2021-8-15 18:47:33的发言:

3701也是通过志愿录取的啊,录取满320人分数线就出来了,分数线就在计划库里。我就是这里卡扣了。可能我不善于表达吧。

也就是说先录取计划生,再录取定向生,是这个意思吗
#19
泛海孤舟2021-08-15 19:16
回复 18楼 sdta
嗯,比如这个
只有本站会员才能查看附件,请 登录
如果不考虑定向生的话录取这个3718是对的,但如果考虑定向生的话这个录取结果就是不对的,这个考生应该录取到003701才对
#20
sdta2021-08-15 20:10
定向生录取条件还没说清楚:如果某个考生被录取为计划生,但该考生DXS = .T.,是不是还要录取为定向生?
我的看法是,如果某个考生未被录取为计划生,但该考生DXS = .T.,这时才应该考虑是否应该被录取为定向生。
定向生条件,我的理解是:
1、某一志愿为113701,同时未被录取为计划生
2、DXS = .T.
3、符合录取分数及等级分条件


[此贴子已经被作者于2021-8-15 20:16编辑过]

#21
泛海孤舟2021-08-15 20:24
回复 20楼 sdta

也可以这么理解,计划生不需考虑dxs的问题,只需考虑等级线是否满足条件,只要分数考得足够高,等级线够即使dxs=.F.也录取,但定向生就需要符合您理解的三个条件,所以我在程序里写了一句If Evaluate(kszy)<>'003701'来判断是否有填003701这个志愿,如果有就要转到查询定向生的资格和定向生计划库。
                           
程序代码:
If zyk.dxsjhk=.T. And Occurs("E",zyk.djf)<=0 .And.Occurs("C",zyk.djf)<=4   && 定向生等级分线要求4C6D
                                    If zyk.tdf>=dxsjhk.fsx
                                        If dxsjhk.lqrs<dxsjhk.lqjh
                                            Replace zyk.lqdm With '003701' In zyk
                                            Replace dxsjhk.lqrs With dxsjhk.lqrs+1 In dxsjhk
                                            Replace dxsjhk.zhzf With zyk.tdf In dxsjhk
                                            Exit
                                        Else
                                            If zyk.tdf==dxsjhk.zhzf
                                                Replace zyk.lqdm With '003701' In zyk
                                                Replace dxsjhk.lqrs With dxsjhk.lqrs+1 In dxsjhk
                                                Exit
                                            Endif
                                        Endif
                                    Endif
                                Endif

我想用Replace all dxsjhk.fsx with jhk.fsx-52 for jhk.lqdm='3701'来控制定向生计划库中的fsx,但运行后都是-52分,而不是我所需要的jhk.fsx-52。
#22
sdta2021-08-15 21:09
程序代码:
CLOSE DATABASES ALL
SET COLLATE TO "MACHINE"
USE 计划库 ALIAS jhk
SET ORDER TO lqdm
BLANK FIELDS lqrs, zhzf, fsx ALL
USE 定向生计划库 ALIAS dxs IN 0
SELECT dxs
SET ORDER TO xxdm
BLANK FIELDS lqrs, zhzf, fsx ALL

 
* 计划生录取开始 [color=#808080]*[/color]
USE 志愿库 ALIAS zyk IN 0
SELECT zyk
BLANK FIELDS lqdm ALL
SET ORDER TO tdf
SCAN
    FOR lnj = 2 TO 20
        lcfld = EVALUATE(FIELD(lnj))
        IF SEEK(lcFld, "jhk", "lqdm") = .T.
            IF OCCURS("C", zyk.djf) <= jhk.djc AND OCCURS("D", zyk.djf) <= jhk.djd AND OCCURS("E", zyk.djf) <= jhk.dje
                 IF  jhk.lqrs <= jhk.lqjh OR zyk.tdf = jhk.fsx
                    REPLACE lqrs WITH lqrs + 1, fsx WITH zyk.tdf IN jhk
                    REPLACE lqdm WITH lcfld IN zyk
                    EXIT
                ENDIF
            ENDIF
        ENDIF
    ENDFOR
ENDSCAN
BROWSE
SELECT jhk
GO TOP
lndxfsx = fsx - 52 && 定向生分数线
BROWSE
* 计划生录取结束 [color=#808080]*[/color]

* 定向生录取开始 [color=#808080]*[/color]
SELECT zyk
SCAN FOR EMPTY(lqdm) AND dxs = .T. AND tdf >= lndxfsx
    FOR lnj = 2 TO 20
        lcfld = EVALUATE(FIELD(lnj))
        IF lcfld == "113701" AND SEEK(zyk.xxdm, "dxs", "xxdm") = .T.
            IF (zyk.djf <= dxs.djf AND dxs.lqrs <= dxs.lqjh) OR zyk.tdf = dxs.fsx
                REPLACE lqrs WITH lqrs + 1, fsx WITH zyk.tdf IN dxs
                REPLACE lqdm WITH lcfld IN zyk
                EXIT
            ENDIF
        ENDIF
    ENDFOR
ENDSCAN
BROWSE
SELECT dxs
BROWSE
* 定向生录取结束 [color=#808080]*[/color]


[此贴子已经被作者于2021-8-15 23:00编辑过]

#23
泛海孤舟2021-08-15 22:51
回复 22楼 sdta
学习了,不过结果好像不是我要的,像这些,红色前面都是准确的,但是红色后面那些就错了
只有本站会员才能查看附件,请 登录
红色圈起来的这些应该的lqdm应该为003701。
#24
sdta2021-08-15 22:55
应该是你的志愿代码问题,到现在你也没说清楚 定向生 录取规则是什么,让别人明白了 定向生 录取规则,你的问题才能够得到圆满解决。难道说清楚这个问题就这么难吗?我都替你着急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

[此贴子已经被作者于2021-8-15 22:56编辑过]

#25
sdta2021-08-15 23:02
* 定向生录取开始
SELECT zyk
SCAN FOR EMPTY(lqdm) AND dxs = .T. AND tdf >= lndxfsx
    FOR lnj = 2 TO 20
        lcfld = EVALUATE(FIELD(lnj))
        IF lcfld == "113701" AND SEEK(zyk.xxdm, "dxs", "xxdm") = .T.
            IF (zyk.djf <= dxs.djf AND dxs.lqrs <= dxs.lqjh) OR zyk.tdf = dxs.fsx
                REPLACE lqrs WITH lqrs + 1, fsx WITH zyk.tdf IN jhk && 此处的jhk 应该改为 dxs
                REPLACE lqdm WITH lcfld IN zyk
                EXIT
            ENDIF
        ENDIF
    ENDFOR
ENDSCAN
BROWSE
SELECT dxs
BROWSE
* 定向生录取结束
#26
泛海孤舟2021-08-15 23:36
定向生其实是为了照顾乡下学校考生能进入优质学校3701,避免有的乡下学校都没有考生考入优质高中而采取的一种措施,按学校学籍数百分比得出各校的定向生计划数,定向生志愿003701都是在志愿3701统招生之后出现的,通常的分数线是3701统招生录取到的最后一个考生分数基础上减去52分,考生按照zy1-zy19志愿采用平行志愿规则进行投档,其中志愿3701-3718都是依据计划库中的计划进行投档,一旦出现有003701志愿的时候就需要检索定向生计划数,直到计划数满为止,因此不能分成两部分编写程序,统招生和定向生是同步在进行的。不知道这样说是否明白。
#27
泛海孤舟2021-08-15 23:48
您就看tdf677在以下的吧,因为3701在677已经录满了它所需要的的320的计划数,所以定向生的分数线应该就是677-52分得到622分,所以定向生的分数线就是622分以上,满足4C6D的等级线和dxs=.t.三个条件,所以第579条记录前面的因为3701的统招生已经录满,后面的一旦出现113701志愿的就会先检索以下定向生计划库看看是否满足,满足就录取,像第585条记录第二志愿为113701满足录取条件所以lqdm应该为113701而不是3718.
只有本站会员才能查看附件,请 登录
#28
xuminxz2021-08-16 14:07
回复 14楼 泛海孤舟
其实就是控制D和E两个等级,因此我用if Occurs("E",zyk.djf)<=jhk.dje .And. Occurs("D",zyk.djf)<=jhk.djD控制。


已经说了你这个语句是错误的,如果你要求E不超过2个,D不超过4个;考生成绩是1个E,5个D应该满足要求吧,可按你的语句是不满足!!

[此贴子已经被作者于2021-8-16 14:08编辑过]

#29
xuminxz2021-08-16 14:15
回复 楼主 泛海孤舟
3701计划数为320,总的定向计划为320,是不是它录取总数是640?
考生排序要不要考虑等级分?
bmh            tdf    djf
2137930027    732    AAAAAAAAAB
2137030068    732    AAAAAAAAAA
2137050289    732    AAAAAAABBB
2137060011    732    AAAAAAAAAC
2137170101    732    AAAAAAAAAC
2137170118    732    AAAAAAAAAA
2137170812    732    AAAAAAAAAB
2137170881    732    AAAAAAAAAB
如果不考虑,是否有问题?如果考虑,如何排?例如,
2137050289    732    AAAAAAABBB
2137060011    732    AAAAAAAAAC
谁在前面?


[此贴子已经被作者于2021-8-16 14:41编辑过]

#30
泛海孤舟2021-08-16 15:00
回复 29楼 xuminxz
对,3701学校计划数320,定向生计划数是330,总的录取650名,志愿库中我排序了tdf,等级线只要符合计划库中的等级线要求就行,只要计划未录满,就录取,比如3701的等级线是4C6D,4C6D是他的最低等级线。主要是要控制D等级的科数和不要出现E等级就行(E级属于不及格的),因此我用OCCURS("E",Zyk.djf)<=jhk.dje AND OCCURS("D",Zyk.djf)<=jhk.djD这句来控制。通常能考上这所学校的基本上都是A和B。
#31
xuminxz2021-08-16 16:10
回复 30楼 泛海孤舟
2个问题
1、定向生可以突破计划吗?(同分)
2、多余的定向计划还需要处理吗?(有的学校降分后,定向计划用不完,怎么办?)
#32
xuminxz2021-08-16 16:51
程序代码:
**志愿库\计划库各增加一个字符字段,DJ
Set Default To "..\试录取"

Close Tables All  &&关闭表就可以了
Use 志愿库 Alias zyk Exclusive In 0
Select zyk
Blank Fields lqdm All
Replace dj With djf All
For i=65 To 69
    Replace dj With Strtran(dj,Chr(i),Str(72-i,1)) All && A-7,B-6 E-3
Endfor
INDEX on STR(tdf)+dj TAG tdf DESCENDING
Use 计划库 Alias jhk Exclusive In 0
Select jhk
Set Order To lqdm
Blank Fields lqrs,zhzf,fsx All
Goto Top In jhk
Replace dj With djf All
For i=67 To 69
    Replace dj With Strtran(dj,Chr(i),Str(70-i,1)) All&& C-3,D-2 E-1
Endfor
idxyq=3333222222  &&定向等级要求


Use 定向生计划库 Alias dxsjhk Exclusive In 0
Set Order To xxdm In dxsjhk
Blank Fields lqrs,zhzf,fsx All In dxsjhk
Goto Top In dxsjhk
Local kszy As Character    && 考生志愿变量
Local zyxh As Integer      && 考生志愿序号变量
Goto Top In zyk
Set Order To tdf In zyk                                                        && 从考生高分到低分处理
SELECT zyk
GO top
Do While !Eof("zyk")
    For zyxh = 1 To 19                                                    && 考生19个普高志愿
        kszy = "zyk.zy" + Transform(zyxh)
        If !Empty(Evaluate(kszy))
            If Evaluate(kszy)<>'113701'                                      &&志愿表中没有 003701!!为3701学校的定向生志愿,定向生条件为3701分数线降52分,zyk.dxs=.t.,等级线为4C6D,计划库参照定向生计划库
                Seek Evaluate(kszy) Order lqdm In jhk
                bjstr=TRANSFORM(VAL(zyk.dj)-VAL(jhk.dj))
                If AT('0',bjstr)+AT('1',bjstr) =0   && 等级分线要求
                    If zyk.tdf >= jhk.fsx
                        If jhk.lqrs < jhk.lqjh
                            Replace zyk.lqdm With Evaluate(kszy) In zyk
                            Replace jhk.lqrs With jhk.lqrs+1 In jhk
                            Replace jhk.zhzf With zyk.tdf In jhk
                            Exit
                        Else
                            If zyk.tdf = jhk.zhzf
                                Replace zyk.lqdm With Evaluate(kszy) In zyk
                                Replace jhk.lqrs With jhk.lqrs+1 In jhk
                                Exit
                            Endif
                        Endif
                    Endif
                Endif

            ELSE
                GO TOP IN jhk  &&偷懒了,定位到3701。如果它的代码不是最小的可以用Seek
                idxfs=jhk.zhzf-52   &&定向分数
                Seek zyk.xxdm Order xxdm In dxsjhk
                bjstr=TRANSFORM(VAL(zyk.dj)-idxyq)
                If zyk.dxs=.T. And  AT('0',bjstr)+AT('1',bjstr) =0 AND zyk.tdf>=idxfs  && 等级分线要求zyk.dxs=.T.这个条件还需要吗?考生志愿已经有113701了啊。
                    If dxsjhk.lqrs<dxsjhk.lqjh
                            Replace zyk.lqdm With '113701' In zyk
                            Replace dxsjhk.lqrs With dxsjhk.lqrs+1 In dxsjhk
                            Replace dxsjhk.zhzf With zyk.tdf In dxsjhk
                            Exit
                        Else
                            If zyk.tdf=dxsjhk.zhzf   &&数值表达式不用===即可。
                                Replace zyk.lqdm With '113701' In zyk
                                Replace dxsjhk.lqrs With dxsjhk.lqrs+1 In dxsjhk
                                Exit
                            Endif
                    Endif
                Endif
            Endif
        Endif
    Next
    Skip In zyk
Enddo
Replace All jhk.fsx With jhk.zhzf In jhk
Replace  dxsjhk.fsx With jhk.fsx-52 For jhk.lqdm='3701' && 各校定向生分数线为3701学校分数线下52分,比如3701学校的分数线为652分,则各校定向生分数线为600分.
Close TABLES All
#33
sdta2021-08-16 19:59
把问题说清楚了,别人能理解了,就会有人帮你解决问题了
#34
泛海孤舟2021-08-16 23:20
回复 31楼 xuminxz
同分同录,如果某个学校计划数用不完就不再补录,几个就是几个,名额取消。
#35
泛海孤舟2021-08-17 10:37
回复 32楼 xuminxz
完全准确,谢谢您。
#36
sych2021-08-17 14:46
看来还找到同行了,都是教育系统的
#37
my23182021-08-17 17:20
主要是流程与规则要搞清,程序问题就容易解决了
#38
wengjl2021-08-18 16:30
录取代码能否简洁,与表及表字段名称的设置,是有直接关系的。设置前如果N多个表之间的逻辑关系明了,才能设置出合理的表......
1