标题: 【练习-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
感觉比上一题简单,整两个随机数,一个乱序排列学生,一个代表学生的分数,努力写代码,顺便顶上去。
- @echo off
- setlocal enabledelayedexpansion
- for %%a in (A B C D) do (
- for /l %%b in (1,1,100) do (
- set /a soc=!random!%%46+55
- set #%%a-!random~-2!-%%a-%%b-!soc!=0
- )
- )
- for /l %%a in (1,1,10) do (
- for /f "tokens=2,3,4 delims=-=" %%b in ('set #') do (
- for %%i in (%%b-%%c:%%d) do (
- set str=%%i
- set /a n+=1
- set /a m=n%%10+1
- if "!str:~0,1!"=="A" if %%d gtr 90 (set "str=!str!:稳定") else (set "str=!str!:退步")
- if "!str:~0,1!"=="B" if %%d lss 80 (set "str=!str!:退步") else (if %%d gtr 90 (set "str=!str!:进步") else (set "str=!str!:稳定"))
- if "!str:~0,1!"=="C" if %%d lss 70 (set "str=!str!:退步") else (if %%d gtr 80 (set "str=!str!:进步") else (set "str=!str!:稳定"))
- if "!str:~0,1!"=="D" if %%d gtr 70 (set "str=!str!:进步") else (set "str=!str!:稳定")
- if !m! equ %%a call set x%%a=!str! !x%%a!
- )
- )
- )
- for /l %%j in (1,1,10) do (
- echo 第%%j班:
- echo !x%%j!
- )
- 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
加入统计- @echo off
- setlocal enabledelayedexpansion
- for %%a in (A B C D) do (
- for /l %%b in (1,1,100) do (
- set /a soc=!random!%%46+55
- set #%%a-!random~-2!-%%a-%%b-!soc!=0
- )
- )
-
- for /l %%a in (1,1,10) do (
- for /f "tokens=2,3,4 delims=-=" %%b in ('set #') do (
- for %%i in (%%b-%%c:%%d) do (
- set str=%%i
- set /a n+=1
- set /a m=n%%10+1
- if "!str:~0,1!"=="A" if %%d gtr 90 (set "str=!str!:稳定") else (set "str=!str!:退步")
- if "!str:~0,1!"=="B" if %%d lss 80 (set "str=!str!:退步") else (if %%d gtr 90 (set "str=!str!:进步") else (set "str=!str!:稳定"))
- if "!str:~0,1!"=="C" if %%d lss 70 (set "str=!str!:退步") else (if %%d gtr 80 (set "str=!str!:进步") else (set "str=!str!:稳定"))
- if "!str:~0,1!"=="D" if %%d gtr 70 (set "str=!str!:进步") else (set "str=!str!:稳定")
- if !m! equ %%a set x%%a=!str! !x%%a!
- if %%d gtr 90 set /a a=!a!+1
- if %%d geq 80 if %%d leq 90 set /a b=!b!+1
- if %%d geq 70 if %%d lss 80 set /a c=!c!+1
- if %%d lss 70 set /a d=!d!+1
- )
- )
- )
- set /a a=!a!/10
- set /a b=!b!/10
- set /a c=!c!/10
- set /a d=!d!/10
- for /l %%j in (1,1,10) do (
- echo 第%%j班:
- echo !x%%j!
- )
- echo.
- echo 这个学期结束后优等生有!a!个
- echo 这个学期结束后高等生有!b!个
- echo 这个学期结束后中等生有!c!个
- echo 这个学期结束后差等生有!d!个
- 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
- @echo off & setlocal enableDelayedExpansion
- for %%a in (A B C D) do for %%b in (A B C D) do (
- (set %%a%%a=稳定)&if %%a lss %%b (set %%a%%b=退步&set %%b%%a=进步)
- )
- for /l %%s in (55 1 100) do (
- set "#%%s=D"
- if %%s geq 70 set "#%%s=C"
- if %%s geq 80 set "#%%s=B"
- if %%s gtr 90 set "#%%s=A"
- )
- for %%c in (A B C D) do (
- for /l %%i in (1 1 100) do (
- set /a score=!random! %% 46+55
- for %%s in (!score!) do for %%t in (!#%%s!) do (
- set /a %%t+=1
- set /p=%%c-%%i:%%s:!%%c%%t! <nul
- )
- )
- echo.
- )
- for %%c in (A B C D) do set /p=%%c: !%%c! <nul
- pause
复制代码
[ 本帖最后由 neorobin 于 2010-6-30 11:19 编辑 ]
作者: neorobin 时间: 2010-6-30 13:00
- @echo off & setlocal enableDelayedExpansion
- for %%a in (A B C D) do for %%b in (A B C D) do (
- (set %%a%%a=稳定)&if %%a lss %%b (set %%a%%b=退步&set %%b%%a=进步)
- )
- for /l %%s in (55 1 100) do (
- set "#%%s=D"
- if %%s geq 70 set "#%%s=C"
- if %%s geq 80 set "#%%s=B"
- if %%s gtr 90 set "#%%s=A"
- )
- for %%c in (A B C D) do for /l %%i in (1 1 100) do (
- set /a score=!random! %% 46 + 55
- for %%s in (!score!) do for %%t in (!#%%s!) do (
- set /a %%t+=1
- set $!random!%%c-%%i=%%c-%%i:%%s:!%%c%%t!
- )
- )
- for /f "tokens=2 delims==" %%i in ('set $') do set /p=%%i <nul
- echo. & for %%c in (A B C D) do set /p=%%c: !%%c! <nul
- pause
复制代码
作者: netbenton 时间: 2010-6-30 22:03
- @echo off&setlocal enabledelayedexpansion
- set/a n=55,m=100-n
- set s=差D中C高B优A
- for %%a in (70 80 90 100) do (
- for /l %%b in (!n!,1,%%a) do set #%%b=!s:~,1!
- set n=%%a
- set ##!s:~,1!=!s:~1,1!
- set s=!s:~2!
- )
-
- for %%a in (A B C D) do (
- for /l %%b in (1,1,100) do (
- set/a ran=!random!%%m+55
- set $!random:~-2!$%%a$%%b$!ran!=1
- )
- set r=进步退步
- for %%c in (优 高 中 差) do (
- set #%%a%%c=!r:~,2!
- if !##%%c! equ %%a set #%%a%%c=稳定&set r=!r:~2!!r:~,2!
- ))
-
- for /f "tokens=2,3,4 delims=$=" %%a in ('set $') do (
- for %%d in (%%a!#%%c!) do (
- echo %%a-%%b;%%c;!#%%d!
- )
- set/a @!#%%c!等+=1
- )
- set @
- pause
复制代码
[ 本帖最后由 netbenton 于 2010-6-30 22:10 编辑 ]
作者: sgaizxt001 时间: 2010-7-1 00:46
效率提高了,但是代码还是比别人的长- @echo off
- setlocal enabledelayedexpansion
- for %%a in (A B C D) do (
- for /l %%b in (1,1,100) do (
- set /a soc=!random!%%46+55
- set #!random:~-2!-%%a-%%b-!soc!=0
- )
- )
- for /f "tokens=2,3,4 delims=-=" %%a in ('set #') do (
- set str=%%a-%%b:%%c
- if "!str:~0,1!"=="A" if %%c gtr 90 (set "str=!str!:稳定") else (set "str=!str!:退步")
- if "!str:~0,1!"=="B" if %%c lss 80 (set "str=!str!:退步") else (if %%c gtr 90 (set "str=!str!:进步") else (set "str=!str!:稳定"))
- if "!str:~0,1!"=="C" if %%c lss 70 (set "str=!str!:退步") else (if %%c gtr 80 (set "str=!str!:进步") else (set "str=!str!:稳定"))
- if "!str:~0,1!"=="D" if %%c gtr 70 (set "str=!str!:进步") else (set "str=!str!:稳定")
- if %%c gtr 90 set /a a=!a!+1
- if %%c geq 80 if %%c leq 90 set /a b=!b!+1
- if %%c geq 70 if %%c lss 80 set /a c=!c!+1
- if %%c lss 70 set /a d=!d!+1
- echo !str!
- )
- echo.
- echo 这个学期结束后优等生有!a!个
- echo 这个学期结束后高等生有!b!个
- echo 这个学期结束后中等生有!c!个
- echo 这个学期结束后差等生有!d!个
- pause
复制代码
作者: batman 时间: 2010-7-1 08:47 标题: 我在出题前的解:
請将复制粘贴后将代码中的tab变量值替换成实际的tab:
- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (55,1,100) do (
- set /a j_%%a=1
- if %%a geq 70 set /a j_%%a+=1
- if %%a geq 80 set /a j_%%a+=1
- if %%a gtr 90 set /a j_%%a+=1
- )
- for %%a in (D C B A) do set /a n+=1&set "_%%a=!n!"&set "pd_!n!=%%a"&set ".!n!=进步"&set ".-!n!=退步"
- set ".0=稳定"&set "tab= "
- for %%a in (A B C D) do for /l %%b in (1,1,100) do set "#!random!-%%a-%%b=%%a-%%b"
- for /f "tokens=4,5 delims==-" %%a in ('set #') do (
- set /a a=!random!%%46+55
- for %%c in (!a!) do (
- set /a b=j_%%c-_%%a
- for %%c in (!j_%%c!) do set /a pd_%%c+=1
- )
- for %%c in (!b!) do (
- set "str=!str!%tab%%%a-%%b:!a!:!.%%c!"
- )
- )
- echo !str:~1!&set /a n=5
- for %%a in (优 高 中 差) do (
- set /a n-=1
- for %%b in (!n!) do echo %%a等生:!pd_%%b!名
- )
- pause>nul
复制代码
[ 本帖最后由 batman 于 2010-7-1 08:52 编辑 ]
作者: batman 时间: 2010-7-1 09:24
我们从出第一题到这一题(已经60题了),最初的目的是让更多的人来关注批处理研究批处理技术,但现在看来
情况越来越不容乐观了。每次都基本是管理层或技术层的在解题和讨论,鲜见新人(当然不是指刚入门的)参与其
中,要知道,这个论坛是专为批处理的爱好者和学习者所开设的免费论坛,论坛所做出每一份努力(包括出题),也
都是为了大家能够更全面地接触批处理知识和技术,从而能学有所得,学有所成。这样一方面起到推广批处理的目
的;另一方面也能充分发展批处理技术,使其确实起到方便我们生活和工作的作用。
一时有感而发,说了些与题无关的话,还望大家谅解。。。
作者: terse 时间: 2010-7-2 10:28
- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1001,1,1100) do set s=%%i&set var=!var!#!s:~-3!&set str=!str!ABCD
- for %%i in (A B C D) do set %%i=!var!&set _%%i=100
- for /l %%i in (1,1,55) do set ce=!ce!0
- set ce=!ce!DDDDDDDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBAAAAAAAAAA
- for %%i in (A B C D) do set l=&for %%j in (A B C D) do (
- if "%%i" equ "%%j" (set _%%i_%%j=稳定) else (
- if "%%i" lss "%%j" (set _%%i_%%j=退步) else set _%%i_%%j=进步
- ))
- set #A=优&set #B=高&set #C=中&set #D=差
- for /l %%i in (400,-1,1) do (
- set /a n=!random!%%%%i,_n=n+1
- for %%a in ("!n!") do (
- for %%b in ("!str:~%%~a,1!") do (
- set /a m=!random!%%_%%~b*4,_%%~b-=1,i=!random!%%46+55
- for %%c in ("!m!") do (
- for %%d in ("!%%~b:~%%~c,4!") do (
- for /f "tokens=* delims=#0" %%e in ("%%~d") do (
- for %%f in ("!_n!") do set str=!str:~,%%~a!!str:~%%~f!
- set %%~b=!%%~b:%%~d=!
- for %%f in ("!i!") do for %%g in ("!ce:~%%~f,1!") do (
- echo %%~b-%%e: %%~f !_%%~b_%%~g!&set/a !#%%~g!+=1
- )))))))
- for %%a in (优 高 中 差) do echo %%a等生:!%%a!名
- pause
复制代码
作者: zqz0012005 时间: 2010-7-4 00:10 标题: 回复 11楼 的帖子
所以这类练习题我都不会很早就下手,就是想等新人来表现。
另外,对版主、技术组、熟人等的回复不应该加分,免得给新手太大压力。
这题我就放过吧~
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |