标题: 【练习-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如示例二。
示例一:- 姓名 工资 日期
- 辛 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-25
复制代码
示例二:
作者: batman 时间: 2009-3-6 14:35
大家是不是又觉得难了点啊,其实我看这题也就是中等难度,大家拿出点信心来啊。。。
作者: batman 时间: 2009-3-6 17:29
下面是第一题的参考答案(请将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
- )
复制代码
[ 本帖最后由 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楼的代码完全不合题意啊,
你的结果全是每月的最后一天,不能算是随机
并且结果中很多同一人同一天领多次工资的情况。
解题代码
- @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 :eof
复制代码
::生成汇总表 略作界面美化
- @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.txt
复制代码
作者: batman 时间: 2009-3-8 13:45
是在改代码时将%%e错写成%%d了,已改正,谢谢指出。
作者: netbenton 时间: 2009-4-30 19:32 标题: 我也来练练手,(第一题)
- @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!!
- pause
复制代码
作者: netbenton 时间: 2009-5-1 17:58 标题: 小提速(第一题)
- @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
- )
复制代码
[ 本帖最后由 netbenton 于 2009-5-1 18:00 编辑 ]
作者: netbenton 时间: 2009-5-1 19:03 标题: 第二题
- @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.xls
复制代码
可以再少一个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.xls
复制代码
[ 本帖最后由 netbenton 于 2009-5-1 19:20 编辑 ]
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |