Board logo

标题: 【练习-038】批处理随机生成工资流水帐目并汇总 [打印本页]

作者: batman    时间: 2009-3-6 02:06     标题: 【练习-038】批处理随机生成工资流水帐目并汇总

出题目的:
    掌握随机取值及其应用
    了解excel函数与批处理的灵活运用
加分规则:
    满分30分,每题15分,视情形加分,能将excel函数联合运用的再加5分
解题限制:
    管理层和技术层请暂做观看,但可跟贴做解题提示
题目如下:
    1、假设有甲、乙、丙、丁、戊、己、庚、辛、壬、癸十个人,他们的日工资为-100到100元之间(工资均为整
数,负数表示扣罚),请大家编写批处理随机生成1000笔此十人的日工资流水帐a.xls如示例一,请注意是每天随机
出现一人,但同一人不可在同一天出现两次(即同一人不能一天领两次工资),并且工资出现正负数的比例为9:
1,同时每笔中的日期是随机和合理的。
    2、根据生成的a.xls,按月对十人的工资进行计算汇总生成汇总表b.xls如示例二。
示例一:
  1. 姓名        工资        日期               
  2. 辛        26        2009-1-1
  3. 戊        77        2009-1-2
  4. 丁        32        2009-11-29
  5. 壬        15        2009-3-6
  6. 戊        44        2009-1-9
  7. 壬        100        2009-5-30
  8. 庚        -62        2009-3-25
  9. 戊        50        2009-3-18
  10. 丁        33        2009-7-25
复制代码
示例二:

作者: batman    时间: 2009-3-6 14:35

大家是不是又觉得难了点啊,其实我看这题也就是中等难度,大家拿出点信心来啊。。。
作者: batman    时间: 2009-3-6 17:29

下面是第一题的参考答案(请将echo 后的长空格换为tab):
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 姓名        工资        日期>a.xls
  3. for %%a in (甲 乙 丙 丁 戊 己 庚 辛 壬 癸) do (
  4.     for %%b in (1-31 2-28 3-31 4-30 5-31 6-30 7-31 8-31 9-30 10-31 11-30 12-31) do (
  5.         for /f "tokens=1,2 delims=-" %%c in ("%%b") do (
  6.             for /l %%e in (1,1,%%d) do set "_!random!!random!!random!=%%a-%%c-%%e"
  7.         )
  8.     )
  9. )
  10. for /f "tokens=2,3,4 delims=-=" %%a in ('set _') do (
  11.     set "+="
  12.     set /a n+=1,a=!random!%%10,b=!random!%%101
  13.     if !a! equ 0 set "+=-"
  14.     if !b! equ 0 set "+="
  15.     echo %%a !+!!b! 2009-%%b-%%c>>a.xls
  16.     if !n! equ 1000 start a.xls&goto :eof
  17. )     
复制代码


[ 本帖最后由 batman 于 2009-3-8 13:44 编辑 ]
作者: 随风    时间: 2009-3-6 19:44

batman 的这个题不太好作啊。
excel 我是一窍不通,只能考虑用p来作。
对题意理解有点模糊。
题中要求:每天随机出现一人
也是说每天只给一个人发工资,如:2009-01-01给甲发了工资就不能给乙发工资了?
看楼主本意应该不是这个意思吧?
否则就要在1000个日期里随机选一个了,那样岂不是还要考虑闰年情况?
如果是这样的话只要解决闰年情况,此题的难度反而减小了。
下面的解题思路是在同一天可以给不同的多个人发工资的情况。
思路:
先假定日期规定是在2009年,即:不用考虑闰二月的情况。
(题中虽说要求随机日期,但闰月问题似乎不是重点。)
1、首先要考虑9:1
  也就是要记录每个人领工资的次数,当领了9次以后,下一次就必须是负数。
  这点并不难,只要以人名为变量名,每领一次就加一并%%9 当为0时就是负数即可。
2、同一人不能一天领两次工资:
   也就是要记录每个人领工资的日期,每个人每个日期只能用一次。
   可以考虑先将365个日期随机乱序,然后每个人领工资的日期都是从第一个开始依次选择,
   这样就不会有重复日期了。
作者: batman    时间: 2009-3-6 20:07

随风兄对本题的理解确实是有点出入,看来是本人没有将题意充分讲清楚,真的是不好意思了,现将题意整理如下:
第一题:
1、所有的日期格式都是2009-*-*,不用考虑闰年的情况;
2、每天中随机出现一人有误,应是每笔记录中随机出现一人,同时同一个人在同一天内不能领两次工资,也就是要
考虑随机生成的数中“表示人的随机数+表示日期的随机数”不能有重复;
3、正负数比例为9:1有误,准确描述应是概率之比为9:1(不一定要求是9:1);
4、随机生成的日期为合理日期,如2009-2-29就不是合理日期,因为2009年2月只有28天。
第二题:
1、最后的汇总结果并不是要和我附件中所示的一样,上面只是为了示例b.xls的格式;
2、并不一定要求结合excel的公式来汇总计算,这只是让大家了解批处理可以和excel函数结合来使用(主要用来对
cmd下生成的xls文件进行操作);
3、如普通会员们感觉此题很有难度,管理层和技术层可以贴出自己的代码(但请用白色字体)。

[ 本帖最后由 batman 于 2009-3-6 20:10 编辑 ]
作者: 523066680    时间: 2009-3-7 16:52

是回帖的兴趣问题。这个题目我看着没感觉~
我出一道逻辑的: 滚shai子
    比如 一个色子4朝上的时候, 各面数字分布如下

              1
          3  4  5  
              2             底面为 6

        要求做一个批处理  显示色子对应的面,当用户输入w时 色子往上滚,各个面的数字也对应地变化。

    如果可以 着能发展成一个小游戏。想不通,这题就难,小想通了,不过如此。

[ 本帖最后由 523066680 于 2009-3-7 16:53 编辑 ]
作者: 随风    时间: 2009-3-8 13:17

此题关键要考虑两种情况
1、当某人领工资的次数超过365次时,该人就不能再继续领工资。
2、当某人某月领工资次数超过该月的最大天数时,比如2月就不能超过28次,
   否则不是代码死循环就是出现同一人同一天领多次工资。
   这是最容易忽略的一点。
楼主3楼的代码完全不合题意啊,
你的结果全是每月的最后一天,不能算是随机
并且结果中很多同一人同一天领多次工资的情况。
解题代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set "tab= "
  3. set "wjm=b.txt"
  4. set "rm=甲乙丙丁戊己庚辛壬癸"&set /a c=10,n=0
  5. for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do (
  6.    set /a n+=1
  7.    for %%i in (甲 乙 丙 丁 戊 己 庚 辛 壬 癸)do set /a %%i!n!=%%a,.%%i!n!=0
  8. )
  9. (echo 姓名%tab%工资%tab%日期
  10. for /l %%a in (1 1 1000) do (
  11.    set /a zf=!random!%%10,w=!random!%%!c!,gz=!random!%%100
  12.    if !zf! equ 0 (set f=) else set "f=-"
  13.    call :yue
  14. ))>%wjm%
  15. start %wjm%&exit
  16. :yue
  17.   set "r=!rm:~%w%,1!"
  18.   set /a yue=!random!%%12+1
  19.   if !.%r%%yue%! geq !%r%%yue%! goto yue
  20.   set /a .%r%%yue%+=1,riqi=!%r%%yue%!,!r!+=1,rz=!r!
  21.   if !rz! geq 365 set /a c-=1&set rm=!rm:%r%=!
  22. :ri
  23.   set /a ri=!random!%%!riqi!+1,gz="~!f!gz+1"
  24.   if defined !r!2009-!yue!-!ri! goto ri
  25.   set !r!2009-!yue!-!ri!=a
  26.   echo !r!%tab%!gz!%tab%2009-!yue!-!ri!
  27. goto :eof
复制代码

::生成汇总表 略作界面美化
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "skip=1 tokens=1-3 delims= " %%a in (b.txt) do (
  3.    for /f "tokens=2 delims=-" %%i in ("%%c") do set /a %%a%%i+=%%b,.%%i+=%%b
  4. )
  5. for %%a in (一 二 三 四 五 六 七 八 九 十 十一) do (
  6.    set "str=%%a      "&set "str2=!str2! !str:~0,5!"
  7. )
  8. (echo.     !str2!十二
  9. for %%a in (甲 乙 丙 丁 戊 己 庚 辛 壬 癸) do (
  10.    set "var="
  11.    for /l %%i in (1 1 12) do (
  12.       set "num=!%%a%%i!                "
  13.       set "var=!var! !num:~0,6!"
  14.    )
  15.    echo %%a   !var!
  16. )
  17. for /f "tokens=2 delims==" %%a in ('set .') do (
  18.    set "num=%%a              "
  19.    set hj=!hj! !num:~0,6!
  20. )
  21. echo.&echo 合计 !hj!)>c.txt
  22. start c.txt
复制代码

作者: batman    时间: 2009-3-8 13:45

是在改代码时将%%e错写成%%d了,已改正,谢谢指出。
作者: netbenton    时间: 2009-4-30 19:32     标题: 我也来练练手,(第一题)

  1. @echo off&setlocal enabledelayedexpansion
  2. set mon=31 28 31 30 31 30 31 31 30 31 30 31
  3. set ren=甲 乙 丙 丁 戊 己 庚 辛 壬 癸
  4. echo 正在准备。。。
  5. for %%a in (%mon%) do (
  6.         set/a m+=1
  7.         for /l %%b in (1,1,%%a) do (
  8.                 set/a n+=1
  9.                 for %%c in (%ren%) do (
  10.                         set #!random!#%%c#!n!=2009-!m!-%%b
  11.                 )
  12.         )
  13. )
  14. echo 正在生成。。。
  15. (echo 姓名        工资        日期
  16. for /f "skip=2650 tokens=2,4 delims==#" %%a in ('set #') do (
  17.         set/a r=!random!%%100+1,$=!random!%%10
  18.         if !$! equ 0 (set $=-) else (set $=)
  19.         echo %%a        !$!!r!        %%b
  20. ))>a.xls
  21. :end
  22. echo ok!!
  23. pause
复制代码

作者: netbenton    时间: 2009-5-1 17:58     标题: 小提速(第一题)

  1. @echo off
  2. if "%1"=="#批处理#" goto :sub
  3. setlocal enabledelayedexpansion
  4. set mon=31 28 31 30 31 30 31 31 30 31 30 31
  5. set men=甲 乙 丙 丁 戊 己 庚 辛 壬 癸
  6. for %%a in (%mon%) do (
  7.         set/a m+=1
  8.         for /l %%b in (1,1,%%a) do (
  9.                 set/a n+=1
  10.                 set #!n!=!m!-%%b
  11.         )
  12. )
  13. set 0=-&set l=1000
  14. (echo 姓名        工资        日期
  15. for /f "tokens=2,3 delims==" %%a in ('%~n0 #批处理#^|sort') do (
  16.         set/a $=!random!%%10,r=!random!%%100+1
  17.         for %%c in (!$!) do (
  18.                 echo %%a        !%%c!!r!        2009-%%b
  19.         )
  20.         set /a l-=1,1/l||goto :ok
  21. ))>a.xls
  22. :ok
  23. start a.xls
  24. goto :eof
  25. :sub
  26. set/a k=n
  27. for %%a in (%men%) do (
  28.         setlocal enabledelayedexpansion
  29.         set/a r=!random!%%20+100
  30.         for /l %%b in (1,1,!r!) do (
  31.                 set/a r=!random! %% k + 1
  32.                 for /f "tokens=1,2" %%b in ("!r! !k!") do (
  33.                         echo !random!=%%a=!#%%b!
  34.                         set #%%b=!#%%c!
  35.                         set/a k-=1
  36.                 )
  37.         )        
  38.         endlocal
  39. )
复制代码

[ 本帖最后由 netbenton 于 2009-5-1 18:00 编辑 ]
作者: netbenton    时间: 2009-5-1 19:03     标题: 第二题

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2,3" %%a in (a.xls) do (
  3.         for /f "tokens=2 delims=-" %%d in ("%%c") do (set/a #%%a#%%d+=%%b)
  4. )
  5. set men=甲 乙 丙 丁 戊 己 庚 辛 壬 癸
  6. set mon=一 二 三 四 五 六 七 八 九 十 十一 十二
  7. (echo 月份        %mon: =        %        小计
  8. for %%a in (%men%) do (set line=%%a&set coun=
  9.         for /l %%b in (1,1,12) do (
  10.                 set line=!line!        !#%%a#%%b!
  11.                 set/a coun+=#%%a#%%b,##%%b+=#%%a#%%b
  12.         )
  13.         echo !line!        !coun!
  14. )
  15. set line=合计&set coun=
  16. for /l %%a in (1,1,12) do (set line=!line!        !##%%a!&set/a coun+=##%%a)
  17. echo !line!        !coun!
  18. )>b.xls
  19. start b.xls
复制代码


可以再少一个for:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2,3" %%a in (a.xls) do (
  3. for /f "tokens=2 delims=-" %%d in ("%%c") do (set/a #%%a#%%d+=%%b,#合计#%%d+=%%b)
  4. )
  5. set men=甲 乙 丙 丁 戊 己 庚 辛 壬 癸
  6. set mon=一 二 三 四 五 六 七 八 九 十 十一 十二
  7. (echo 月份 %mon: = % 小计
  8. for %%a in (%men% 合计) do (set line=%%a&set coun=
  9. for /l %%b in (1,1,12) do (
  10.   set line=!line! !#%%a#%%b!
  11.   set/a coun+=#%%a#%%b
  12. )
  13. echo !line! !coun!
  14. )
  15. )>b.xls
  16. start b.xls
复制代码

[ 本帖最后由 netbenton 于 2009-5-1 19:20 编辑 ]




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