注册 登录
编程论坛 VFP论坛

求助按科目成绩等级录取学生

chychychy 发布于 2019-06-19 11:53, 8919 次点击
只有本站会员才能查看附件,请 登录

有学生考试成绩库,物理(wl)、化学(hx)、思想品德(zz)、历史(ls)、地理(dl)、生物(sw)、体育(ty)科目成绩用等级大写字母ABCDE表示,对应字段分别为wldj、hxdj、zzdj、lisdj、dldj、swdj、tydj
录取要求如图,要将符合成绩等级要求的学生在指标生字段(zbs)分别写入“31”“32”“34”
在统招生字段(tzs)分别写入“31”“32”“34”
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2019-6-20 08:41编辑过]

91 回复
#2
chychychy2019-06-19 11:57
个人不成熟想法,感觉太啰嗦,不简洁,怕有落漏,请简化高效
REPL ALL ZBS WITH ''&&&情况所有指标生(zbs)字段记录
Repl all bj WITH ''for zy2=='31'&&&清空A学校的标记字段(bj),此字段为我新增加,原始数据是没有的。
repl all bj with 'f' for wldj='E' OR hxdj='E' or zzdj='E' or lsdj='E' or dldj='E' or swdj='E' or tydj='E' 排除1.所有为E的
Repl all bj WITH 'f' FOR wldj='D' or hxdj='D' &&& 排除2.物理或化学为D
Repl all bj WITH 'f' FOR wldj='C' and hxdj='C' &&&&排除2.物理、化学同为c
repl all bj with 'f' for zzdj='D' or lsdj='D' or dldj='D' or swdj='D' &&&排除3.政史地生中任何一个为d
repl all bj with 'f' for zzdj='C' and lsdj='C' and dldj='C' and swdj='C' &&&排除3.政史地生中同为c,4个C的

Repl all zbs with '31' FOR(bj!='f') and zy2=='31' and 科目合计=7 &&&将志愿为A学校且标记不为f的替换


[此贴子已经被作者于2019-6-19 16:22编辑过]

#3
xuminxz2019-06-19 13:22
建议按考生个人能否录取考虑。还应该提供各学校录取人数表。这样根据不同的录入方式调整起来比较简单,程序通用性更好。
另外,给的条件不足;学生排名的首要条件是什么?次要条件是些?如果排名完全相同的统招生,是超额录取,还是随机录取,费用平均?如果指标生排名相同如何处理?
规则定了,以你的水平不难写出代码。录取方式不外两种,一是投档法——学生进学校;另一个是招人法。
#4
xuminxz2019-06-19 14:10
以前做过一个2年级分专业方向的程序,每个学生4个志愿,每个方向有人数限制。按学生成绩排名(已经排好),由高到低尽可能满足前面的专业。很好写。但后来加了一个条件,女生只要报了造价专业,只要她前面的志愿没满足,就要把最后一个进入该专业的男生顶替下来。
程序代码:
Close Tables All
Use zydmb
Use fbb In 0
iblrs=0 &&造价员方向(专业代码E)为女生保留的人数。
lgoon=.T. &&造价员方向保留人数不足,重新计算
ijscs=0 &&计算次数
Do While lgoon
    SELECT zydmb
    Replace kxrs With  zrs All
    REPLACE kxrs WITH  kxrs-iblrs  FOR zydm='E' &&预留造价员人数
    Select fbb
    Replace zydm With '',sm With '',jxbj With '',zyxh With '' All
    irs=Reccount()
    For i=1 To irs
        Select fbb
        Go i
        cxh=Alltrim(xh)
        cxb=ALLTRIM(xb)
        Select * From bmb Where Alltrim(xh)==cxh Into Cursor mpmp
        Select mpmp
        If Reccount()=0
            Select fbb
            Replace sm With "未填报志愿"
            Exit
        Endif
        For j=1 To 6
            Select mpmp
            czdmc="ZY"+Str(j,1)
            czydm=Allt(&czdmc)
            Select zydmb
            Locate FOR Alltrim(zydm)==czydm
            If Found()
               IF  kxrs>=1 OR ( cxb='女' AND czydm='E')
                Replace kxrs With kxrs-1
                Select fbb
                Replace zydm With czydm,zyxh With Str(j,1)
                EXIT
            endif
            Endif
        Endfor
        Select fbb
        If Empty(zydm) And Empty(sm)
            Replace zydm With "X",sm With "所报专业名额已满"
        Endif
    ENDFOR
    SELECT zydmb
    REPLACE kxrs WITH  kxrs+iblrs  FOR zydm='E' &&减去造价员保留人数

    LOCATE FOR zydm='E' AND kxrs>=0
    IF FOUND()
        lgoon=.f.  &&造价员方向为女生保留人数合适结束
    ELSE
        iblrs=iblrs+1 &&造价员方向为女生保留人数不足,增加保留人数。
    ENDIF
        ijscs=ijscs+1
        cjscs=ALLTRIM(STR(ijscs))

ENDDO
SELECT zydmb
REPLACE xkrs WITH zrs-kxrs all
=MESSAGEBOX("共计算"+cjscs+"次")

 
#5
chychychy2019-06-19 14:28
回复 3楼 xuminxz
可能是说的不够明白,学生志愿已填报完毕,录取分两步 第一步看物理、化学、政治、历史、地理、生物、体育是否符合等级要求,要筛选出合格和不合格的来。第二步等级符合要求的看语文+数学+英语总分,由高到低录取。关键第一步等级筛选比较复杂,如何简洁高效,需求助。
比如C学校指标生要求,排除的选项较多,第一要求3C1D和2C1D;需排除除所有为e,物理、化学、生物、地理2个d,排除政治历史体育2个D,以
我的方法交笨不简洁,如
&&&repl all bj1 with '' for zy2='34'
&&&repl all bj1 with 'f' for e>=1 and  zy2='34'
&&&repl all bj1 with 'f' for (wldj='D' and hxdj='D') or (wldj='D' and swdj='D') or (wldj='D' and dldj='D') or (hxdj='D' and swdj='D') or (hxdj='D' and dldj='D') or (swdj='D' and dldj='D')
&&&太长了不简洁还没写上排除政治历史体育2个D的代码呢,A学校指标生2B2C2D就更复杂了,有无简洁高效的方法和代码


[此贴子已经被作者于2019-6-19 14:35编辑过]

#6
xuminxz2019-06-19 15:44
可以按正向要求写,即:
if wldj<='C'and hxdj <='C'
  if wldj<'C'or hxdj <='C'
………………

没有什么特别简单的代码,你的并不繁杂呀,这样不错 。这类程序不要追求代码的简单,不要追求高效,应该以可靠为主。因为,这类程序的错误往往是逻辑上的,用一条语句写出了错都发现不了。
#7
chychychy2019-06-19 15:49
回复 6楼 xuminxz
统招生的2B2C2D太复杂了,这样排除怕有落漏,if语句的用的不是很好,能否写一段完整的参考一下,谢谢
#8
wangzhiyi2019-06-19 17:02
zy2和zy3两个字段是不是学生填报的志愿?有什么区别?建议你用DO CASE多分支语句写。
或者用12345代表ABCDE,然后找一位数学高人,把你的录取规则换算一个数值就好办了。
套用你写的命令,写了一个简单的程序。
SET TALK OFF
CLOSE DATABASES
USE 录取资格库
REPL ALL ZBS WITH ' '
GO TOP
SCAN
   DO case
      CASE zy2='31'
      DO CASE
         CASE  wldj='E' OR hxdj='E' or zzdj='E' or lsdj='E' or dldj='E' or swdj='E' or tydj='E' &&排除1.所有为E的
               repl bj with 'f'
         CASE wldj='D' or hxdj='D'
               repl bj with 'f'
         CASE wldj='C' and hxdj='C'         
               repl bj with 'f'
         CASE zzdj='D' or lsdj='D' or dldj='D' or swdj='D'         
               repl bj with 'f'
         CASE zzdj='C' and lsdj='C' and dldj='C' and swdj='C'         
               repl bj with 'f'
      ENDCASE
      Repl zbs with '31' FOR(bj!='f')         
      CASE zy2='32'
      .
      .
      .
      .
      .
      .
   ENDCASE
ENDSCAN
希望对你有所帮助。   


[此贴子已经被作者于2019-6-19 17:17编辑过]

#9
schtg2019-06-19 17:51
做了一个简单测试,不知理解对否?请检验。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2019-6-20 06:21编辑过]

#10
chychychy2019-06-19 20:32
回复 8楼 wangzhiyi
谢谢关注,数学和逻辑的确重要,学生报名分为指标生和统招生两类,zy2为指标生,zy3 为统招生。
我测试了一下你写的代码(精简了还算错误,如下),只执行了第一分支,没有写入所有的符合条件的‘f’。关键是C学校的指标生和A学校的统招生排除法也不好解决。
REPL ALL ZBS WITH ' '
GO TOP
SCAN
   
      DO CASE
         CASE  wldj='E' OR hxdj='E' or zzdj='E' or lsdj='E' or dldj='E' or swdj='E' or tydj='E' &&排除1.所有为E的
               repl bj with 'f'
         CASE wldj='D' or hxdj='D'
               repl bj with 'f'
         CASE wldj='C' and hxdj='C'         
               repl bj with 'f'
         CASE zzdj='D' or lsdj='D' or dldj='D' or swdj='D'         
               repl bj with 'f'
         CASE zzdj='C' and lsdj='C' and dldj='C' and swdj='C'         
               repl bj with 'f'
      ENDCASE
      Repl zbs with '31' FOR(bj!='f')         
      
   
ENDSCAN

[此贴子已经被作者于2019-6-19 20:40编辑过]

#11
sdta2019-06-19 21:27
程序代码:
* VFP9 代码
SELECT PADL(RECNO(), 4, "0" ) Xh, zy2, wldj, hxdj, zzdj, lsdj, dldj, swdj, tydj, zbs, tzs FROM 录取资格库 INTO CURSOR tj READWRITE
SCAN
    * 等级中是否包含 E
    cdj1 = ALLTRIM(wldj - hxdj - zzdj - lsdj - dldj - swdj - tydj)
    IF "E" $ cdj1
        LOOP
    ENDIF
    * A学校指标生
    STORE 0 TO ok1, ok2, ok3 && 如果为 1,表示符合条件
    * 1 物理、化学,最低条件:BC
    cdjA_1 = ALLTRIM(wldj - hxdj)
    IF "D" $ cdjA_1
    ELSE
        IF djpx(cdjA_1) <= "BC"
            ok1 = 1
        ENDIF
    ENDIF
    * 2 思想品德、历史、地理、生物,最低条件:BCCC
    cdjA_2 = ALLTRIM(zzdj - lsdj - dldj - swdj)
    IF "D" $ cdjA_2
    ELSE
        IF djpx(cdjA_2) <= "BCCC"
            ok2 = 1
        ENDIF
    ENDIF
    ok3 = 1
    IF ok1 = 1 AND ok2 = 1 AND ok3 = 1
        REPLACE zbs WITH "31"
    ENDIF
    * A学校统招生
    cdjA_3 = ALLTRIM(wldj - hxdj - zzdj - lsdj - dldj - swdj)
    IF djpx(cdjA_3) <= "BBCCDD"
        REPLACE tzs WITH "31"
    ENDIF
ENDSCAN
GO TOP
BROWSE
RETURN
*
* 等级排序
*
FUNCTION djpx(cStr)
LOCAL px[LEN(cStr)]
FOR i = 1 TO LEN(cStr)
    px[i] = SUBSTR(cStr, i, 1)
ENDFOR
=ASORT(px)

cStr1 = ""
FOR i = 1 TO ALEN(px,1)
    cStr1 = cStr1 + px[i]
ENDFOR
RETURN cStr1

ZBS、TZS 字段中的数据只是符合 A 学校的条件


[此贴子已经被作者于2019-6-19 21:40编辑过]

#12
schtg2019-06-20 06:43
我再看、再验,发现:
1.C学校的指标生字段zy2的值是否应为"34"?否则BC两校一样的。
2.按sdta的统计结果看来,序号为0002、0003的,应该理解为:没有填报指标生志愿吧?所以,其指标生资格字段zbs中应该没有合格值"31",对吗?
只有本站会员才能查看附件,请 登录

#13
schtg2019-06-20 06:52
我测试了一下,结果如下,不知对否?
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
#14
chychychy2019-06-20 08:03
回复 12楼 schtg
怎么说呢,意思就是就是将分别报三个学校指标生(zy2)符合等级要求的学生,在zbs字段打上标记。
#15
wangzhiyi2019-06-20 08:25
以下是引用chychychy在2019-6-19 20:32:34的发言:

谢谢关注,数学和逻辑的确重要,学生报名分为指标生和统招生两类,zy2为指标生,zy3 为统招生。
我测试了一下你写的代码(精简了还算错误,如下),只执行了第一分支,没有写入所有的符合条件的‘f’。关键是C学校的指标生和A学校的统招生排除法也不好解决。
REPL ALL ZBS WITH ' '
GO TOP
SCAN
   
      DO CASE
         CASE  wldj='E' OR hxdj='E' or zzdj='E' or lsdj='E' or dldj='E' or swdj='E' or tydj='E' &&排除1.所有为E的
               repl bj with 'f'
         CASE wldj='D' or hxdj='D'
               repl bj with 'f'
         CASE wldj='C' and hxdj='C'         
               repl bj with 'f'
         CASE zzdj='D' or lsdj='D' or dldj='D' or swdj='D'         
               repl bj with 'f'
         CASE zzdj='C' and lsdj='C' and dldj='C' and swdj='C'         
               repl bj with 'f'
      ENDCASE
      Repl zbs with '31' FOR(bj!='f')         
      
   
ENDSCAN

不好意思,楼主,由于我没有写其他两所学校的条件,所以贴上去的程序没进行测试。现经过测试,发现错误在于      Repl zbs with '31' FOR(bj!='f')  这条命令。你把他放到endscan 后面去,改为      Repl zbs with '31' FOR(bj!='f') and zy2='31'         
      
#16
chychychy2019-06-20 08:28
回复 12楼 schtg
贴错图了,你说的是对的
#17
chychychy2019-06-20 09:22
回复 11楼 sdta
谢谢,学习了,判断部分准确不会落漏,等级排序部分高明,排了序就能比较大小(但此处没大看明白,也是今后可能更改的,请注释一下,教会如何导出需要的组合并排序,新手,见笑了)。有几处不合适(A学校指标生4348合适,A学校统招是4133),是我造成的。A指标生要看zy2字段为31的,将符合等级要求在zbs字段的打上标记,A学校统招生要看zy3字段为31的将符合等级要求的在tzs字段打上标记,新上传完整数据。
只有本站会员才能查看附件,请 登录
,比如如何实现下图结果,谢谢指教。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2019-6-20 14:54编辑过]

#18
chychychy2019-06-20 09:54
回复 9楼 schtg
谢谢,没一行行看代码,你的这个结果和我的不很对应,正确的结果A学校指标生4348,统招生4133。我上传了新的数据库,请查看一下。

[此贴子已经被作者于2019-6-20 09:55编辑过]

#19
chychychy2019-06-20 09:57
回复 15楼 wangzhiyi
du case 语句应该是执行完第一case若符合条件就跳出了,剩下的case没有执行,好像是。
#20
xuminxz2019-06-20 10:16
是不是达到A学校录取标准了,就不考虑B及以后的学校了?也就是说学校有优先级.
#21
chychychy2019-06-20 10:24
回复 20楼 xuminxz
差不多吧,这一步意思就是分别将报指标生和统招生符合等级条件的挑出来,比如报A学校指标生5403人(coun for zy2=='31')将符合等级条件的人挑出来,完成后结果是4348人(coun for zbs='31' and zy2=='31')
#22
chychychy2019-06-20 15:22
回复 11楼 sdta
如何实现将ALLTRIM(wldj - hxdj -swdj - zzdj - lsdj - dldj)提取到的两个或者更多个排序并保存?CCCCDC变成CCCCCD,BABBCB变成ABBBBC
#23
wangzhiyi2019-06-20 15:41
回复 19楼 chychychy
是因为REPL 命令带了FOR条件,记录指针就会移动到DBF文件尾部,第一条记录执行完多条件分支后,再执行这条命令,记录指针就会移动到DBF尾部,不会再处理其他记录了。
#24
sdta2019-06-20 19:05
以下是引用chychychy在2019-6-20 15:22:41的发言:

如何实现将ALLTRIM(wldj - hxdj -swdj - zzdj - lsdj - dldj)提取到的两个或者更多个排序并保存?CCCCDC变成CCCCCD,BABBCB变成ABBBBC

11楼的代码楼主没有细看吧
* 等级排序
*
FUNCTION djpx(cStr)
LOCAL px[LEN(cStr)]
FOR i = 1 TO LEN(cStr)
    px[i] = SUBSTR(cStr, i, 1)
ENDFOR
=ASORT(px)

cStr1 = ""
FOR i = 1 TO ALEN(px,1)
    cStr1 = cStr1 + px[i]
ENDFOR
上面的代码是自定义函数,有两个功能:
1 将上层程序传递过来的字符串按照升序进行排序
FOR i = 1 TO LEN(cStr)
    px[i] = SUBSTR(cStr, i, 1)
ENDFOR
=ASORT(px)
2 将排序后的字符,重新生成新的字符串,并返回上层程序
cStr1 = ""
FOR i = 1 TO ALEN(px,1)
    cStr1 = cStr1 + px[i]
ENDFOR
#25
chychychy2019-06-20 20:43
回复 24楼 sdta
看是真看了,代码中前面基本看懂了,平时从没用过这样的函数和命令,没看懂等级排序这一关键部分
#26
sdta2019-06-20 20:51
以下是引用chychychy在2019-6-20 20:43:11的发言:

看是真看了,代码中前面基本看懂了,平时从没用过这样的函数和命令,没看懂等级排序这一关键部分

明白了代码中的思路,就可以完成17楼截图中的需求了
#27
chychychy2019-06-20 21:21
回复 26楼 sdta
如果能将科目等级组合提取后并排序存放,就可以用它直接和要求比较小于等于为真,大于为否。可是苦于只会简单用alltrim提取,不会排序。所以就绕路用的排除法(具体如下,),提前将各种等级提取出来,为此并且增加了许多辅助字段。虽能解决但觉得有点绕,尤其统招生2B2C2D(BBCCDD)的排除怕有落漏,最好的方法还是你的提取排序后比较大小,我们的想法总感觉不够数学和逻辑,想学习你的等级排序,可是象你11行就解决的,处于知识所限,平时没用也没看懂(FUNCTION \LOCAL \ASORT\ ALEN意思作用没看懂,见笑了,请指教,能否帮编辑实现先将提取的等级组合排序后存放,然后我直接比较大小用repl替换即可)

&&&排除法指标生
repl all zbs with ''
&&提取A指标生(物理、化学1B1C以上;思想品德、历史、地理、生物1B3C以上;体育与健康D以上)
repl  zbs with '31' for zy2=='31' and 科目合计=7 and (OCCURS('D',理化)=0 and OCCURS('E',理化)=0 and OCCURS('C',理化)<=1) and (OCCURS('D',政史地生)=0 and OCCURS('E',政史地生)=0 and OCCURS('C',政史地生)<=3) and OCCURS('E',tydj)=0

&&提取B指标生,5C2D以上
repl  zbs with '32' for E=0 and D<=2  and zy2=='32' and 科目合计=7

&&提取C指标生,5C2D以上
repl  zbs with '33' for E=0 and D<=2 and zy2=='33' and 科目合计=7

&&提D指标生,物理、化学、生物、地理3C1D以上,政史体2C1D以上
repl zbs with '34' for OCCURS('E',理化生地)=0 and OCCURS('D',理化生地)<=1 and OCCURS('D',政史体)<=1 and OCCURS('E',政史体)=0 and zy2=='34' and 科目合计=7

&&排除法统招生把不符合条件的考生作出标记40
repl all tzs with ''
*repl  tzs with '40' for zy3=='31' and ((OCCURS('E',六科)<>0 or OCCURS('D',六科)>2) or (OCCURS('C',六科)=4 and OCCURS('D',六科)=2)  or (OCCURS('C',六科)=3 and OCCURS('D',六科)=2) or (OCCURS('C',六科)=4 and OCCURS('D',六科)=1) or (OCCURS('C',六科)=5 and OCCURS('D',六科)=1) or  (OCCURS('C',六科)>=5 and OCCURS('D',六科)=0))
repl  tzs with '40' for zy3=='31' and ((OCCURS('E',六科)<>0 or OCCURS('D',六科)>2) or (OCCURS('C',六科)=3 and OCCURS('D',六科)=2) or (OCCURS('C',六科)=4 and OCCURS('D',六科)=2) or (OCCURS('C',六科)=4 and OCCURS('D',六科)=1) or  (OCCURS('C',六科)>=5 and OCCURS('D',六科)<=1))

&&剩余的就是符合等级要求的用31标记
repl tzs with '31' for zy3=='31' and tzs<>'40'
repl tzs with '32' for e<=1 and zy3=='32'
repl tzs with '33' for e<=1 and zy3=='33'
repl tzs with '34' for e<=1 and zy3=='34'
#28
chychychy2019-06-20 21:42
回复 26楼 sdta
请勿见笑,没系统学习过计算机,就是早年接触过foxbase,比较喜欢数据库,但基础比较薄弱,平时用的命令也比较简单,向你等级排序中的第一次见。这样想过用数学的办法比较最为准确,可是不会,终于找着你这个高手了,请多指教。
#29
sdta2019-06-20 21:55
不会就看帮助文件
完整代码也给你了,后边就看你的了
#30
chychychy2019-06-20 21:58
回复 29楼 sdta
还是想麻烦你,我想有这个目的的一段程序,第一将各种组合的等级提取出来,第二将提取出来等级排序后写入记录,方便查看和比较。谢谢
对你来讲不难,对我来讲真的困扰好长时间了,请指教。

[此贴子已经被作者于2019-6-20 22:04编辑过]

#31
sdta2019-06-20 22:13
程序代码:
* VFP9 代码
SELECT PADL(RECNO(), 4, "0" ) Xh, zy2, zy3, wldj, hxdj, zzdj, lsdj, dldj, swdj, tydj, SPACE(2) 理化, SPACE(4) 政史地生, SPACE(6) 六科, SPACE(7) 七科, zbs, tzs FROM 录取资格库 INTO CURSOR tj READWRITE
SCAN
    * 等级中是否包含 E
    cdj1 = ALLTRIM(wldj - hxdj - zzdj - lsdj - dldj - swdj - tydj)
    IF "E" $ cdj1
        LOOP
    ENDIF
    REPLACE 七科 WITH djpx(ALLTRIM(wldj - hxdj - zzdj - lsdj - dldj - swdj - tydj))
    REPLACE 六科 WITH djpx(ALLTRIM(wldj - hxdj - zzdj - lsdj - dldj - swdj))
   
    * A学校指标生
    STORE 0 TO ok1, ok2, ok3 && 如果为 1,表示符合条件
    * 1 物理、化学,最低条件:BC
    cdjA_1 = ALLTRIM(wldj - hxdj)
    REPLACE 理化 WITH djpx(cdjA_1)
    IF "D" $ cdjA_1
    ELSE
        IF djpx(cdjA_1) <= "BC"
            ok1 = 1
        ENDIF
    ENDIF
    * 2 思想品德、历史、地理、生物,最低条件:BCCC
    cdjA_2 = ALLTRIM(zzdj - lsdj - dldj - swdj)
    REPLACE 政史地生 WITH djpx(cdjA_2)
    IF "D" $ cdjA_2
    ELSE
        IF djpx(cdjA_2) <= "BCCC"
            ok2 = 1
        ENDIF
    ENDIF
    ok3 = 1
    IF ok1 = 1 AND ok2 = 1 AND ok3 = 1
        REPLACE zbs WITH "31"
    ENDIF
    * A学校统招生
    cdjA_3 = ALLTRIM(wldj - hxdj - zzdj - lsdj - dldj - swdj)
    IF djpx(cdjA_3) <= "BBCCDD"
        REPLACE tzs WITH "31"
    ENDIF
ENDSCAN
GO TOP
BROWSE
RETURN
*
* 等级排序
*
FUNCTION djpx(cStr)
LOCAL px[LEN(cStr)]
FOR i = 1 TO LEN(cStr)
    px[i] = SUBSTR(cStr, i, 1)
ENDFOR
=ASORT(px)

cStr1 = ""
FOR i = 1 TO ALEN(px,1)
    cStr1 = cStr1 + px[i]
ENDFOR
RETURN cStr1


结果
只有本站会员才能查看附件,请 登录
#32
chychychy2019-06-20 22:34
回复 31楼 sdta
非常感谢,刚刚测试完全实现目的,谢谢指教!
#33
chychychy2019-06-21 11:30
回复 31楼 sdta
又有新的问题,因为A<B<C<D<E,所以导致ACCCCD\ACDDDD等不符合2B2C2D(BBCCDD)的情况也被计算为合格了
只有本站会员才能查看附件,请 登录
#34
sdta2019-06-21 12:10
2B2C2D 应该如何理解才是关键
* A学校统招生
cdjA_3 = ALLTRIM(wldj - hxdj - zzdj - lsdj - dldj - swdj)
IF djpx(cdjA_3) <= "BBCCDD" AND OCCURS("D", cdjA_3) <= 2  AND OCCURS("C", cdjA_3) <= 2 && D 最多只能有2个,C 最多只能有2个
   REPLACE tzs WITH "31"
ENDIF

[此贴子已经被作者于2019-6-21 13:23编辑过]

#35
sdta2019-06-21 13:39
可以通过下面的方法来理解2B2C2D

CREATE CURSOR TT (X1 C(1))
FOR I = 65 TO 68
    INSERT INTO TT VALUES(CHR(I))
ENDFOR
SELECT AA.X1 + BB.X1 + CC.X1 + DD.X1 + EE.X1 + FF.X1 A1, SPACE(6) A2  FROM TT AA, TT BB, TT CC, TT DD, TT EE, TT FF INTO CURSOR TT1 READWRITE
REPLACE A2 WITH DJPX(A1) ALL
SELECT DISTINCT A2 FROM TT1 WHERE OCCURS("D", A2) <= 2 AND OCCURS("C", A2) <= 2
* 等级排序
*
FUNCTION djpx(cStr)
LOCAL px[LEN(cStr)]
FOR i = 1 TO LEN(cStr)
    px[i] = SUBSTR(cStr, i, 1)
ENDFOR
=ASORT(px)

cStr1 = ""
FOR i = 1 TO ALEN(px,1)
    cStr1 = cStr1 + px[i]
ENDFOR
RETURN cStr1
#36
chychychy2019-06-21 14:38
回复 34楼 sdta
我觉得2B2C2D组合(BBCCDD)是底线,D最多有两个,但不能说C最多有两个,因为(BBCCCC)组合虽有4个C,但是底线符合要求,排序之后再逐个对位比较才是最安全的比如说六个位置分别为A1\A2\A3\A4\A5\A6,需要A1<=B,A2<=B,A3<=C,A4<=C,A5<=D,A6<=D,才可以
我这样试了一下,逐个位置进行比较再替换,就是有点长。
REPLACE ALL tzs1 WITH '31' FOR substr(六科,1,1)<='B' AND substr(六科,2,1)<='B' AND substr(六科,3,1)<='C' AND substr(六科,4,1)<='C'AND substr(六科,5,1)<='D'AND substr(六科,6,1)<='D' AND ZY3='31'

再请教如何将临时表tj中的字段没有的六科、七科、和已经有的,写会原数据表

[此贴子已经被作者于2019-6-21 16:06编辑过]

#37
sdta2019-06-21 19:17
以下是引用chychychy在2019-6-21 14:38:57的发言:

我觉得2B2C2D组合(BBCCDD)是底线,D最多有两个,但不能说C最多有两个,因为(BBCCCC)组合虽有4个C,但是底线符合要求,排序之后再逐个对位比较才是最安全的比如说六个位置分别为A1\A2\A3\A4\A5\A6,需要A1<=B,A2<=B,A3<=C,A4<=C,A5<=D,A6<=D,才可以
我这样试了一下,逐个位置进行比较再替换,就是有点长。
REPLACE ALL tzs1 WITH '31' FOR substr(六科,1,1)<='B' AND substr(六科,2,1)<='B' AND substr(六科,3,1)<='C' AND substr(六科,4,1)<='C'AND substr(六科,5,1)<='D'AND substr(六科,6,1)<='D' AND ZY3='31'

再请教如何将临时表tj中的字段没有的六科、七科、和已经有的,写会原数据表

有这个必要吗
#38
schtg2019-06-21 20:09
我再次研究了一下这个志愿中合格问题,而且做了一个统计,不知与你的数据是否吻合?
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
#39
sdta2019-06-22 12:28
    关于 BBCCDD 问题很有必要探讨一下,ABCD四个字母可以组合成从小到大排列的任意6个字符的字符串,共有84种组合,内容如下:
  
  AAAAAA     
  AAAAAB     
  AAAAAC     
  AAAAAD     
  AAAABB     
  AAAABC     
  AAAABD     
  AAAACC     
  AAAACD     
  AAAADD     
  AAABBB     
  AAABBC     
  AAABBD     
  AAABCC     
  AAABCD     
  AAABDD     
  AAACCC     
  AAACCD     
  AAACDD     
  AAADDD     
  AABBBB     
  AABBBC     
  AABBBD     
  AABBCC     
  AABBCD     
  AABBDD     
  AABCCC     
  AABCCD     
  AABCDD     
  AABDDD     
  AACCCC     
  AACCCD     
  AACCDD     
  AACDDD     
  AADDDD
   
  ABBBBB     
  ABBBBC     
  ABBBBD     
  ABBBCC     
  ABBBCD     
  ABBBDD     
  ABBCCC     
  ABBCCD     
  ABBCDD     
  ABBDDD     
  ABCCCC     
  ABCCCD     
  ABCCDD     
  ABCDDD     
  ABDDDD
     
  ACCCCC     
  ACCCCD     
  ACCCDD     
  ACCDDD     
  ACDDDD     
  ADDDDD
   
  BBBBBB     
  BBBBBC     
  BBBBBD     
  BBBBCC     
  BBBBCD     
  BBBBDD     
  BBBCCC     
  BBBCCD     
  BBBCDD     
  BBBDDD    
  BBCCCC     
  BBCCCD     
  BBCCDD     
  BBCDDD     
  BBDDDD     
  BCCCCC     
  BCCCCD     
  BCCCDD     
  BCCDDD     
  BCDDDD     
  BDDDDD     
  CCCCCC     
  CCCCCD     
  CCCCDD     
  CCCDDD     
  CCDDDD     
  CDDDDD     
  DDDDDD   

但是能符合BBCCDD条件的组合,本人认为有 58 种(黑色字的内容),在中考的录取中,这些组合是否包含在条件表达式中,决定了一个学生是否能由初中升入高中。作为程序人员在处理这些条件时,一定要慎之又慎。

[此贴子已经被作者于2019-6-22 12:29编辑过]

#40
chychychy2019-06-24 10:13
回复 37楼 sdta
我觉得,逐个对位比较很重要,写回数据上为了下发是方便查看数据
#41
chychychy2019-06-24 10:21
回复 39楼 sdta
你说的太对了(我说的不很清楚,但你将要求解读的基本完整了),程序严谨或者说正确程度直接决定了一个学生是否能由初中升入高中。作为程序人员在处理这些条件时,一定要慎之又慎。所以才想多种方法比较,当时因为不会排序,所以用排除法,将各种组合要求都提取出来(用OCCURS('D',理化)=0的方法)将不可能合格的组合排除,但是担心可能太多排除法不完整会出现落漏等错误。你的等级排序法没学过没大看懂但给了我们很大启示。但经核对发现不能直接比较大小,因为A<B<C<D<E导致出现一些错误,你统计的结果大多是这个原因导致的,请看比较图
需要逐个对位比较(REPLACE ALL tzs1 WITH '31' FOR substr(六科,1,1)<='B' AND substr(六科,2,1)<='B' AND substr(六科,3,1)<='C' AND substr(六科,4,1)<='C'AND substr(六科,5,1)<='D'AND substr(六科,6,1)<='D' AND ZY3='31')才可以,但是这句太长了不够简洁,水平所限,想的往往是笨办法,语句的简洁性总是不够,请再指教

只有本站会员才能查看附件,请 登录


只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2019-6-24 11:40编辑过]

#42
sdta2019-06-24 11:51
回复 41楼 chychychy
ACCCCC、ACCCCD、ACCCDD 应该符合 BBCCDD 标准
#43
sdta2019-06-24 11:56
符合 BBCCDD 条件的表达式,我认为应该是:
OCCURS("D",字符串) <= 2 AND 字符串 <= "BBCCDD"
最后符合条件的字符串应该有58个
#44
sdta2019-06-24 12:02
6D应该看6门课程,怎么会看7门课程
#45
sdta2019-06-24 12:13
第一步:课程等级划分要有具体标准,这样才能做到等级的准确性
第二步:每种组合(如 5C2D)要生成各种组合的排序表
第三步:生成条件表达式要准确简单
如5C2D的条件表达式
OCCURS("D", 字符串) <= 2 AND 字符串 <= "CCCCCDD"
OCCURS("D", 字符串) <= 2 控制不能超过2个D
其它如6、5、4、3、2 门课程的条件表达式与上面的表达式类似。
#46
sdta2019-06-24 12:25
ABCD组合后(排除E)
7门课程有120种组合
6门课程有 84种组合
5门课程有 56种组合
4门课程有 35种组合
3门课程有 20种组合
2门课程有 10种组合
#47
sdta2019-06-24 12:29
条件变了,最后的结果也会变的
#48
sdta2019-06-24 12:41
BCCC(1B3C)条件
OCCURS("D", 字符串) = 0 AND OCCURS("C", 字符串) <= 3 AND 字符串 <= "BCCC"
#49
sdta2019-06-24 12:42
对位比较也不准确
#50
sdta2019-06-24 12:51
作为教育主管部门应该列出符合2B2C2D条件的所有组合,而不是由具体操作人员去解决这个问题。防止个人背黑锅。
#51
chychychy2019-06-24 14:28
回复 42楼 sdta

上次说错了,修改一下:
这个是不符合条件的,要求2B2C2D,虽然有A,也是两个D,但是少个B,要求最少两个B的。

[此贴子已经被作者于2019-6-24 15:33编辑过]

12