标题:求助按科目成绩等级录取学生
只看楼主
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
结帖率:100%
已结贴  问题点数:20 回复次数:91 
求助按科目成绩等级录取学生
录取资格库.rar (161.73 KB)

有学生考试成绩库,物理(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编辑过]

搜索更多相关主题的帖子: 目录 成绩 等级 学生 字段 
2019-06-19 11:53
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
得分:0 
个人不成熟想法,感觉太啰嗦,不简洁,怕有落漏,请简化高效
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编辑过]

2019-06-19 11:57
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:40
帖 子:749
专家分:2475
注 册:2011-5-8
得分:0 
建议按考生个人能否录取考虑。还应该提供各学校录取人数表。这样根据不同的录入方式调整起来比较简单,程序通用性更好。
另外,给的条件不足;学生排名的首要条件是什么?次要条件是些?如果排名完全相同的统招生,是超额录取,还是随机录取,费用平均?如果指标生排名相同如何处理?
规则定了,以你的水平不难写出代码。录取方式不外两种,一是投档法——学生进学校;另一个是招人法。

dBase有人接盘了。
2019-06-19 13:22
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:40
帖 子:749
专家分:2475
注 册:2011-5-8
得分:0 
以前做过一个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+"次")

 

dBase有人接盘了。
2019-06-19 14:10
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
得分:0 
回复 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编辑过]

2019-06-19 14:28
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:40
帖 子:749
专家分:2475
注 册:2011-5-8
得分:0 
可以按正向要求写,即:
if wldj<='C'and hxdj <='C'
  if wldj<'C'or hxdj <='C'
………………

没有什么特别简单的代码,你的并不繁杂呀,这样不错 。这类程序不要追求代码的简单,不要追求高效,应该以可靠为主。因为,这类程序的错误往往是逻辑上的,用一条语句写出了错都发现不了。

dBase有人接盘了。
2019-06-19 15:44
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
得分:0 
回复 6楼 xuminxz
统招生的2B2C2D太复杂了,这样排除怕有落漏,if语句的用的不是很好,能否写一段完整的参考一下,谢谢
2019-06-19 15:49
wangzhiyi
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:366
专家分:684
注 册:2014-4-9
得分:0 
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编辑过]

2019-06-19 17:02
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
做了一个简单测试,不知理解对否?请检验。
新_录取资格库.rar (173.91 KB)


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

2019-06-19 17:51
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
得分:0 
回复 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编辑过]

2019-06-19 20:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-495360-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.101476 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved