Board logo

标题: 【练习-060】批处理实现学生成绩评估(续59题) [打印本页]

作者: batman    时间: 2010-6-29 11:39     标题: 【练习-060】批处理实现学生成绩评估(续59题)

出题目的:
  1、继续强化大家对random随机数的使用
  2、加强对变量的运用
解题要求:
  代码简洁、高效、通用、无临时文件
  因题较容易,请先留给新人思考
加分原则:
  满分10分,视情况加分
题目如下:
  一个学期后学校对新招收的400名学生进行了综合考试,并按考试成绩对学生的优、高、中、差等进行重新评
估,同时对学生的进步和退步情况进行跟踪,现要求用代码模拟此次综合考试和评估过程,并随机输出各生编号、
得分、及退步、稳定、进步三种情况,中间用:格开表示如:A-35: 92:稳定 C-78:98:进步 ,最后统计出现在的优
、高、中、差生各有多少名。
随题提示:
  1、学生进校时优、高、中、差等分别用A、B、C、D表示,各等级分别有100名,表示如A-35 C-78 D-100
  2、假设考试时学生成绩最高为100分,最低为55分,且全为整数分值
  3、其中90<得分<=100为优等,80<=得分<=90为高等,70<=得分<80为中等,55<=得分<70为差等
作者: sgaizxt001    时间: 2010-6-30 00:25

感觉比上一题简单,整两个随机数,一个乱序排列学生,一个代表学生的分数,努力写代码,顺便顶上去。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (A B C D) do (
  4.   for /l %%b in (1,1,100) do (
  5.    set /a soc=!random!%%46+55
  6.    set #%%a-!random~-2!-%%a-%%b-!soc!=0
  7. )
  8. )
  9. for /l %%a in (1,1,10) do (
  10. for /f "tokens=2,3,4 delims=-=" %%b in ('set #') do (
  11.     for %%i in (%%b-%%c:%%d) do (
  12.       set str=%%i
  13.       set /a n+=1
  14.       set /a m=n%%10+1
  15.       if "!str:~0,1!"=="A" if %%d gtr 90 (set "str=!str!:稳定") else (set "str=!str!:退步")
  16.       if "!str:~0,1!"=="B" if %%d lss 80 (set "str=!str!:退步") else (if %%d gtr 90 (set "str=!str!:进步") else (set "str=!str!:稳定"))
  17.       if "!str:~0,1!"=="C" if %%d lss 70 (set "str=!str!:退步") else (if %%d gtr 80 (set "str=!str!:进步") else (set "str=!str!:稳定"))
  18.       if "!str:~0,1!"=="D" if %%d gtr 70 (set "str=!str!:进步") else (set "str=!str!:稳定")
  19.       if !m! equ %%a call set x%%a=!str! !x%%a!
  20. )
  21. )
  22. )
  23. for /l %%j in (1,1,10) do (
  24.   echo 第%%j班:
  25.   echo !x%%j!
  26. )
  27. pause
复制代码
效率出奇的慢,把x%%a=!str! !x%%a!中间的空格改为tab
当然我还有个疑问,是先分好班,输出每个班的学生,然后再分配给每个学生的一个随机的考试分数,然后再按先分好的班输出最后的结果吗?

[ 本帖最后由 sgaizxt001 于 2010-6-30 02:07 编辑 ]
作者: 随风    时间: 2010-6-30 01:50

3、其中90<得分<=100为优等,80<=得分<=90为高等,70<=得分<80为中等,55<=得分<70为差等
这句话好难理解
作者: sgaizxt001    时间: 2010-6-30 02:28

加入统计
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (A B C D) do (
  4.   for /l %%b in (1,1,100) do (
  5.    set /a soc=!random!%%46+55
  6.    set #%%a-!random~-2!-%%a-%%b-!soc!=0
  7. )
  8. )
  9. for /l %%a in (1,1,10) do (
  10. for /f "tokens=2,3,4 delims=-=" %%b in ('set #') do (
  11.     for %%i in (%%b-%%c:%%d) do (
  12.       set str=%%i
  13.       set /a n+=1
  14.       set /a m=n%%10+1
  15.       if "!str:~0,1!"=="A" if %%d gtr 90 (set "str=!str!:稳定") else (set "str=!str!:退步")
  16.       if "!str:~0,1!"=="B" if %%d lss 80 (set "str=!str!:退步") else (if %%d gtr 90 (set "str=!str!:进步") else (set "str=!str!:稳定"))
  17.       if "!str:~0,1!"=="C" if %%d lss 70 (set "str=!str!:退步") else (if %%d gtr 80 (set "str=!str!:进步") else (set "str=!str!:稳定"))
  18.       if "!str:~0,1!"=="D" if %%d gtr 70 (set "str=!str!:进步") else (set "str=!str!:稳定")
  19.       if !m! equ %%a  set x%%a=!str!        !x%%a!
  20.       if %%d gtr 90 set /a a=!a!+1
  21.       if %%d geq 80 if %%d leq 90 set /a b=!b!+1
  22.       if %%d geq 70 if %%d lss 80 set /a c=!c!+1
  23.       if %%d lss 70 set /a d=!d!+1
  24. )
  25. )
  26. )
  27. set /a a=!a!/10
  28. set /a b=!b!/10
  29. set /a c=!c!/10
  30. set /a d=!d!/10
  31. for /l %%j in (1,1,10) do (
  32.   echo 第%%j班:
  33.   echo !x%%j!
  34. )
  35. echo.
  36. echo 这个学期结束后优等生有!a!个
  37. echo 这个学期结束后高等生有!b!个
  38. echo 这个学期结束后中等生有!c!个
  39. echo 这个学期结束后差等生有!d!个
  40. pause
复制代码
因为在开始计算的时候,代码循环了10次,所以数目多算了10次,最后就让他们除以10得出最后的结果
比较有意思的是我运行20来次,发现差等生总是多余100个,优等生多余100个的只有1次,中间的有多有少

[ 本帖最后由 sgaizxt001 于 2010-6-30 02:33 编辑 ]
作者: batman    时间: 2010-6-30 08:45

可能在题目中没有说清楚,不要考虑班次的问题,大家想一想怎么高效率地判断学生的现在等级啊,本人建议使用设置变量法。
作者: neorobin    时间: 2010-6-30 11:00

  1. @echo off & setlocal enableDelayedExpansion
  2. for %%a in (A B C D) do for %%b in (A B C D) do (
  3.   (set %%a%%a=稳定)&if %%a lss %%b (set %%a%%b=退步&set %%b%%a=进步)
  4. )
  5. for /l %%s in (55 1 100) do (
  6.   set "#%%s=D"
  7.   if %%s geq 70 set "#%%s=C"
  8.   if %%s geq 80 set "#%%s=B"
  9.   if %%s gtr 90 set "#%%s=A"
  10. )
  11. for %%c in (A B C D) do (
  12.   for /l %%i in (1 1 100) do (
  13.     set /a score=!random! %% 46+55
  14.     for %%s in (!score!) do for %%t in (!#%%s!) do (
  15.       set /a %%t+=1
  16.       set /p=%%c-%%i:%%s:!%%c%%t! <nul
  17.     )
  18.   )
  19.   echo.
  20. )
  21. for %%c in (A B C D) do set /p=%%c: !%%c!   <nul
  22. pause
复制代码


[ 本帖最后由 neorobin 于 2010-6-30 11:19 编辑 ]
作者: neorobin    时间: 2010-6-30 13:00

  1. @echo off & setlocal enableDelayedExpansion
  2. for %%a in (A B C D) do for %%b in (A B C D) do (
  3.   (set %%a%%a=稳定)&if %%a lss %%b (set %%a%%b=退步&set %%b%%a=进步)
  4. )
  5. for /l %%s in (55 1 100) do (
  6.   set "#%%s=D"
  7.   if %%s geq 70 set "#%%s=C"
  8.   if %%s geq 80 set "#%%s=B"
  9.   if %%s gtr 90 set "#%%s=A"
  10. )
  11. for %%c in (A B C D) do for /l %%i in (1 1 100) do (
  12.     set /a score=!random! %% 46 + 55
  13.     for %%s in (!score!) do for %%t in (!#%%s!) do (
  14.       set /a %%t+=1
  15.       set $!random!%%c-%%i=%%c-%%i:%%s:!%%c%%t!
  16.     )
  17.   )
  18. for /f "tokens=2 delims==" %%i in ('set $') do set /p=%%i <nul
  19. echo. & for %%c in (A B C D) do set /p=%%c: !%%c!   <nul
  20. pause
复制代码

作者: netbenton    时间: 2010-6-30 22:03

  1. @echo off&setlocal enabledelayedexpansion
  2. set/a n=55,m=100-n
  3. set s=差D中C高B优A
  4. for %%a in (70 80 90 100) do (
  5.    for /l %%b in (!n!,1,%%a) do set #%%b=!s:~,1!
  6.    set n=%%a
  7.    set ##!s:~,1!=!s:~1,1!
  8.    set s=!s:~2!
  9. )
  10. for %%a in (A B C D) do (
  11.   for /l %%b in (1,1,100) do (
  12.     set/a ran=!random!%%m+55
  13.     set $!random:~-2!$%%a$%%b$!ran!=1
  14.   )
  15. set r=进步退步
  16. for %%c in (优 高 中 差) do (
  17.   set #%%a%%c=!r:~,2!
  18.   if !##%%c! equ %%a set #%%a%%c=稳定&set r=!r:~2!!r:~,2!
  19. ))
  20. for /f "tokens=2,3,4 delims=$=" %%a in ('set $') do (
  21.   for %%d in (%%a!#%%c!) do (
  22.     echo %%a-%%b;%%c;!#%%d!
  23.   )
  24.   set/a @!#%%c!等+=1
  25. )
  26. set @
  27. pause
复制代码


[ 本帖最后由 netbenton 于 2010-6-30 22:10 编辑 ]
作者: sgaizxt001    时间: 2010-7-1 00:46

效率提高了,但是代码还是比别人的长
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (A B C D) do (
  4.   for /l %%b in (1,1,100) do (
  5.    set /a soc=!random!%%46+55
  6.    set #!random:~-2!-%%a-%%b-!soc!=0
  7. )
  8. )
  9. for /f "tokens=2,3,4 delims=-=" %%a in ('set #') do (
  10.   set str=%%a-%%b:%%c
  11.   if "!str:~0,1!"=="A" if %%c gtr 90 (set "str=!str!:稳定") else (set "str=!str!:退步")
  12.   if "!str:~0,1!"=="B" if %%c lss 80 (set "str=!str!:退步") else (if %%c gtr 90 (set "str=!str!:进步") else (set "str=!str!:稳定"))
  13.   if "!str:~0,1!"=="C" if %%c lss 70 (set "str=!str!:退步") else (if %%c gtr 80 (set "str=!str!:进步") else (set "str=!str!:稳定"))
  14.   if "!str:~0,1!"=="D" if %%c gtr 70 (set "str=!str!:进步") else (set "str=!str!:稳定")
  15.   if %%c gtr 90 set /a a=!a!+1
  16.   if %%c geq 80 if %%c leq 90 set /a b=!b!+1
  17.   if %%c geq 70 if %%c lss 80 set /a c=!c!+1
  18.   if %%c lss 70 set /a d=!d!+1
  19.   echo !str!
  20. )
  21. echo.
  22. echo 这个学期结束后优等生有!a!个
  23. echo 这个学期结束后高等生有!b!个
  24. echo 这个学期结束后中等生有!c!个
  25. echo 这个学期结束后差等生有!d!个
  26. pause
复制代码

作者: batman    时间: 2010-7-1 08:47     标题: 我在出题前的解:

請将复制粘贴后将代码中的tab变量值替换成实际的tab:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (55,1,100) do (
  3.     set /a j_%%a=1
  4.    if %%a geq 70 set /a j_%%a+=1
  5.     if %%a geq 80 set /a j_%%a+=1
  6.     if %%a gtr 90 set /a j_%%a+=1
  7. )
  8. for %%a in (D C B A) do set /a n+=1&set "_%%a=!n!"&set "pd_!n!=%%a"&set ".!n!=进步"&set ".-!n!=退步"
  9. set ".0=稳定"&set "tab=        "
  10. for %%a in (A B C D) do for /l %%b in (1,1,100) do set "#!random!-%%a-%%b=%%a-%%b"
  11. for /f "tokens=4,5 delims==-" %%a in ('set #') do (
  12.     set /a a=!random!%%46+55
  13.     for %%c in (!a!) do (
  14.         set /a b=j_%%c-_%%a
  15.         for %%c in (!j_%%c!) do set /a pd_%%c+=1
  16.     )
  17.     for %%c in (!b!) do (
  18.         set "str=!str!%tab%%%a-%%b:!a!:!.%%c!"
  19.     )
  20. )
  21. echo !str:~1!&set /a n=5
  22. for %%a in (优 高 中 差) do (
  23.     set /a n-=1
  24.     for %%b in (!n!) do echo %%a等生:!pd_%%b!名
  25. )
  26. pause>nul
复制代码

[ 本帖最后由 batman 于 2010-7-1 08:52 编辑 ]
作者: batman    时间: 2010-7-1 09:24

我们从出第一题到这一题(已经60题了),最初的目的是让更多的人来关注批处理研究批处理技术,但现在看来

情况越来越不容乐观了。每次都基本是管理层或技术层的在解题和讨论,鲜见新人(当然不是指刚入门的)参与其

中,要知道,这个论坛是专为批处理的爱好者和学习者所开设的免费论坛,论坛所做出每一份努力(包括出题),也

都是为了大家能够更全面地接触批处理知识和技术,从而能学有所得,学有所成。这样一方面起到推广批处理的目

的;另一方面也能充分发展批处理技术,使其确实起到方便我们生活和工作的作用。

一时有感而发,说了些与题无关的话,还望大家谅解。。。
作者: terse    时间: 2010-7-2 10:28

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1001,1,1100) do set s=%%i&set var=!var!#!s:~-3!&set str=!str!ABCD
  3.     for %%i in (A B C D) do set %%i=!var!&set _%%i=100
  4.     for /l %%i in (1,1,55) do set ce=!ce!0
  5.         set ce=!ce!DDDDDDDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBAAAAAAAAAA
  6.         for %%i in (A B C D) do set l=&for %%j in (A B C D) do (
  7.            if "%%i" equ "%%j" (set _%%i_%%j=稳定) else (
  8.         if "%%i" lss "%%j" (set _%%i_%%j=退步) else set _%%i_%%j=进步
  9.   ))
  10.    set #A=优&set #B=高&set #C=中&set #D=差
  11.    for /l %%i in (400,-1,1) do (
  12.        set /a n=!random!%%%%i,_n=n+1
  13.        for %%a in ("!n!") do (
  14.        for %%b in ("!str:~%%~a,1!") do (
  15.        set /a m=!random!%%_%%~b*4,_%%~b-=1,i=!random!%%46+55
  16.        for %%c in ("!m!") do (
  17.        for %%d in ("!%%~b:~%%~c,4!") do (
  18.        for /f "tokens=* delims=#0" %%e in ("%%~d") do (
  19.        for %%f in ("!_n!") do set str=!str:~,%%~a!!str:~%%~f!
  20.        set %%~b=!%%~b:%%~d=!
  21.        for %%f in ("!i!") do for %%g in ("!ce:~%%~f,1!") do (
  22.        echo %%~b-%%e: %%~f !_%%~b_%%~g!&set/a !#%%~g!+=1
  23.        )))))))
  24.        for %%a in (优 高 中 差) do echo %%a等生:!%%a!名
  25. pause
复制代码

作者: zqz0012005    时间: 2010-7-4 00:10     标题: 回复 11楼 的帖子

所以这类练习题我都不会很早就下手,就是想等新人来表现。
另外,对版主、技术组、熟人等的回复不应该加分,免得给新手太大压力。

这题我就放过吧~




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2