[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-059】批处理解实现自动新生分班

出题目的:
    让大家熟练掌握随机数概念和用法
解题要求:
    1、代码简洁、高效、通用并不生成临时文件
    2、请版主级会员暂缓解题,但可跟贴为新人做指导
加分规则:
    本题满分15分,视情况加分
题目如下:
    某学校要新招收400名学生,其中有100名优等生、100名高等生、100名中等生、100名差等生,现在学校校长要求将这400名
学生随机安排到新开的10个班,同时要求每个班有10名优等生、10名高等生、10名中等生、10名差等生,并且要在学生报到的时候
就分好班次,并且他要为两个学生开后门,一个是将教育局局长的儿子分到第3班,一个是将文化局局长的女儿分到第8班。这下可
难坏了招生办的老师,一时都不知道怎么办,正好这时教务处长来了,他马上想到一个好办法,终于招生办解决了校长交给的难题,
受到校长的表扬。现在假设你是教务处长,你能想到什么好办法吗?请注意,我不是要你们写文字,要看你们的代码,请最后将每个
班的学生显示出来(最好是分屏显示)
随题提示:
    1、优等生用A-1至A-100表示,高等生用B-1至B-100表示,中等生用C-1至C-100表示,差等生用D-1至D-100表示
    2、教育局局长的儿子用B-60表示,文化局局长的女儿用C-49表示
    3、班级用X-1至X-10表示
    4、假设学生报到的顺序不是随机的,是按A-D、1-100的顺序来进行,即先按1-00的顺序招收优等生,再按1-100的顺序招收高等
生,依此类推直到招收D-100,所以才要求在报到时就随机分好班

要睡觉了,看来本题确实有难度,先给出本人的参考答案吧,不过大家还是争取不要看答案哦:


  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (A B C D) do (
  3.     for /l %%b in (1,1,100) do set ".!random!_%%a-%%b=%%a-%%b"
  4.     for /f "tokens=2 delims==" %%b in ('set .') do (
  5.         if not defined code set "code=123456789a"&set /a n=10
  6.         set /a a=!random!%%n
  7.         for %%c in (!a!) do (
  8.             set "a=!code:~%%c,1!"
  9.             for %%c in (!a!) do (
  10.                 set "code=!code:%%c=!"&set "X-%%c=!X-%%c! %%b"&set /a n-=1
  11.                 for %%d in (B-3 C-8) do (
  12.                     for /f "tokens=1,2 delims=-" %%e in ("%%d") do (
  13.                         if %%e equ %%a if %%f equ %%c if not defined _%%e%%f set "_%%e%%f=%%b"
  14.                     )
  15.                 )
  16.                 for %%d in (B-60 C-49) do if "%%d" equ "%%b" set ".%%d=X-%%c"
  17.             )  
  18.         )
  19.     )
  20.     for /f "delims==" %%b in ('set .') do set "%%b="
  21. )
  22. set "X-10=%X-a%"
  23. if "%X-3:B-60=%" equ "%X-3%" set "X-3=!X-3:%_B3%=B-60!"&call,set "!.B-60!=%%!.B-60:B-60=%_B3%!%%"
  24. if "%X-8:C-49=%" equ "%X-8%" set "X-8=!X-8:%_C8%=C-49!"&call,set "!.C-49!=%%!.C-49:C-40=%_C8%!%%"
  25. for /l %%a in (1,1,10) do cls&echo X-%%a班:&echo.&echo !X-%%a:~1!&pause>nul
复制代码

-------------------------------------------------------------------------------------------------------------------------------------------
此代码重复随机,不可取,请大家看后面的代码。

[ 本帖最后由 batman 于 2010-6-29 09:22 编辑 ]
***共同提高***

回复 2楼 的帖子

所谓的办法在每个人的心中,呵呵。。。

如觉得有难度,先可不开后门(本来就反对开后门

[ 本帖最后由 batman 于 2010-6-27 20:44 编辑 ]
***共同提高***

TOP

开后门也不难,思路打开点,试试交换法,嘿嘿。。。
***共同提高***

TOP

开窍了,哈哈,是的,任何问题从多个角度上来想,总能找到解决的好办法的。
***共同提高***

TOP

救命!!!

下面这段代码很简洁,但不知为什么总是1班不对,其他没什么问题,眼睛看红了脑袋想破了,也没找到原因,大家
都来帮帮忙吧!
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (A B C D) do (
  3.     set /a m=1
  4.     for /l %%b in (1,1,100) do if "%%a-%%b" neq "B-60" if "%%a-%%b" neq "C-49" set "%%a#!random!_%%b=%%a-%%b"
  5.     for /f "tokens=2 delims==" %%b in ('set %%a#') do (
  6.         set /a n+=1
  7.         for %%c in (!m!) do (
  8.             set "X-%%c=!X-%%c! %%b"&set /a v=10
  9.             for %%d in (B3 C8) do if "%%a%%c" equ "%%d" set /a v=9
  10.             if !n! equ !v! set /a n=0,m+=1
  11.         )
  12.     )
  13. )
  14. set "X-3=%X-3% B-60"&set "X-8=%X-8% C-49"
  15. for /l %%a in (1,1,10) do cls&echo X-%%a班:&echo.&echo !X-%%a:~1!&pause>nul
复制代码
思路:
  依次将四组学生(除去后门生)按乱序后平分的方法分到10个班,每组分配到每班的学生是10名(当后门生所在
组遇到3、8班时则只分配9名学生),最后将后门生加到所要到的班次中就是的。在实际上校方制作398个四组十类
标签,其中3班高等生组标签和8班中等生组标签各9个,其余各班各组标签各10个,让学生在报到时按组抽签,最后
将后门生直接安排到要到的班级就可以了。
----------------------------------------------------------------------------------------------------------------------------------------------
哈哈,解决了!晕,原来是错将C8写成了D8,真的是太粗心了。

[ 本帖最后由 batman 于 2010-6-28 11:30 编辑 ]
1

评分人数

    • 随风: 好,更简洁。技术 + 1
***共同提高***

TOP

不知道你们运行了我22楼的代码不,要说简洁已经相当简洁了,效率也还行(要搞速就需要在乱序上下功夫了,用set *确实有点慢)。

期望大家能想出更好的方法来。
***共同提高***

TOP

返回列表