返回列表 发帖

【练习-038】批处理随机生成工资流水帐目并汇总

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

大家是不是又觉得难了点啊,其实我看这题也就是中等难度,大家拿出点信心来啊。。。
***共同提高***

TOP

下面是第一题的参考答案(请将echo 后的长空格换为tab):
@echo off&setlocal enabledelayedexpansion
echo 姓名        工资        日期>a.xls
for %%a in (甲 乙 丙 丁 戊 己 庚 辛 壬 癸) do (
    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 (
        for /f "tokens=1,2 delims=-" %%c in ("%%b") do (
            for /l %%e in (1,1,%%d) do set "_!random!!random!!random!=%%a-%%c-%%e"
        )
    )
)
for /f "tokens=2,3,4 delims=-=" %%a in ('set _') do (
    set "+="
    set /a n+=1,a=!random!%%10,b=!random!%%101
    if !a! equ 0 set "+=-"
    if !b! equ 0 set "+="
    echo %%a !+!!b! 2009-%%b-%%c>>a.xls
    if !n! equ 1000 start a.xls&goto :eof
)     COPY


[ 本帖最后由 batman 于 2009-3-8 13:44 编辑 ]
***共同提高***

TOP

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

TOP

随风兄对本题的理解确实是有点出入,看来是本人没有将题意充分讲清楚,真的是不好意思了,现将题意整理如下:
第一题:
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 编辑 ]
***共同提高***

TOP

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

              1
          3  4  5  
              2             底面为 6

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

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

[ 本帖最后由 523066680 于 2009-3-7 16:53 编辑 ]
[url=][/url]

TOP

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

::生成汇总表 略作界面美化
@echo off&setlocal enabledelayedexpansion
for /f "skip=1 tokens=1-3 delims= " %%a in (b.txt) do (
   for /f "tokens=2 delims=-" %%i in ("%%c") do set /a %%a%%i+=%%b,.%%i+=%%b
)
for %%a in (一 二 三 四 五 六 七 八 九 十 十一) do (
   set "str=%%a      "&set "str2=!str2! !str:~0,5!"
)
(echo.     !str2!十二
for %%a in (甲 乙 丙 丁 戊 己 庚 辛 壬 癸) do (
   set "var="
   for /l %%i in (1 1 12) do (
      set "num=!%%a%%i!                "
      set "var=!var! !num:~0,6!"
   )
   echo %%a   !var!
)
for /f "tokens=2 delims==" %%a in ('set .') do (
   set "num=%%a              "
   set hj=!hj! !num:~0,6!
)
echo.&echo 合计 !hj!)>c.txt
start c.txtCOPY
技术问题请到论坛发帖求助!

TOP

是在改代码时将%%e错写成%%d了,已改正,谢谢指出。
***共同提高***

TOP

我也来练练手,(第一题)

@echo off&setlocal enabledelayedexpansion
set mon=31 28 31 30 31 30 31 31 30 31 30 31
set ren=甲 乙 丙 丁 戊 己 庚 辛 壬 癸
echo 正在准备。。。
for %%a in (%mon%) do (
        set/a m+=1
        for /l %%b in (1,1,%%a) do (
                set/a n+=1
                for %%c in (%ren%) do (
                        set #!random!#%%c#!n!=2009-!m!-%%b
                )
        )
)
echo 正在生成。。。
(echo 姓名        工资        日期
for /f "skip=2650 tokens=2,4 delims==#" %%a in ('set #') do (
        set/a r=!random!%%100+1,$=!random!%%10
        if !$! equ 0 (set $=-) else (set $=)
        echo %%a        !$!!r!        %%b
))>a.xls
:end
echo ok!!
pauseCOPY

TOP

小提速(第一题)

@echo off
if "%1"=="#批处理#" goto :sub
setlocal enabledelayedexpansion
set mon=31 28 31 30 31 30 31 31 30 31 30 31
set men=甲 乙 丙 丁 戊 己 庚 辛 壬 癸
for %%a in (%mon%) do (
        set/a m+=1
        for /l %%b in (1,1,%%a) do (
                set/a n+=1
                set #!n!=!m!-%%b
        )
)
set 0=-&set l=1000
(echo 姓名        工资        日期
for /f "tokens=2,3 delims==" %%a in ('%~n0 #批处理#^|sort') do (
        set/a $=!random!%%10,r=!random!%%100+1
        for %%c in (!$!) do (
                echo %%a        !%%c!!r!        2009-%%b
        )
        set /a l-=1,1/l||goto :ok
))>a.xls
:ok
start a.xls
goto :eof
:sub
set/a k=n
for %%a in (%men%) do (
        setlocal enabledelayedexpansion
        set/a r=!random!%%20+100
        for /l %%b in (1,1,!r!) do (
                set/a r=!random! %% k + 1
                for /f "tokens=1,2" %%b in ("!r! !k!") do (
                        echo !random!=%%a=!#%%b!
                        set #%%b=!#%%c!
                        set/a k-=1
                )
        )        
        endlocal
)COPY

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

TOP

第二题

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2,3" %%a in (a.xls) do (
        for /f "tokens=2 delims=-" %%d in ("%%c") do (set/a #%%a#%%d+=%%b)
)
set men=甲 乙 丙 丁 戊 己 庚 辛 壬 癸
set mon=一 二 三 四 五 六 七 八 九 十 十一 十二
(echo 月份        %mon: =        %        小计
for %%a in (%men%) do (set line=%%a&set coun=
        for /l %%b in (1,1,12) do (
                set line=!line!        !#%%a#%%b!
                set/a coun+=#%%a#%%b,##%%b+=#%%a#%%b
        )
        echo !line!        !coun!
)
set line=合计&set coun=
for /l %%a in (1,1,12) do (set line=!line!        !##%%a!&set/a coun+=##%%a)
echo !line!        !coun!
)>b.xls
start b.xlsCOPY


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

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

TOP

返回列表