Board logo

标题: [文本处理] 批处理怎样根据输入日期显示星座? [打印本页]

作者: 随风    时间: 2011-5-26 13:34     标题: 批处理怎样根据输入日期显示星座?

输入日期显示星座
如:输入 05-26
则显示 05-26 双子座 05-21至06-21
星座
  1. 白羊座 3月21日-4月19日
  2. 金牛座 4月20日-5月20日
  3. 双子座 5月21日-6月21日
  4. 巨蟹座 6月22日-7月22日
  5. 狮子座 7月23日-8月22日
  6. 处女座 8月23日-9月22日
  7. 天枰座 9月23日-10月23日
  8. 天蝎座 10月24日-11月22日
  9. 射手座 11月23日-12月21日
  10. 摩羯座 12月22日-1月19日
  11. 水瓶座 1月20日-2月18日
  12. 双鱼座 2月19日-3月20日
复制代码

作者: batman    时间: 2011-5-26 13:47

随风,不至于吧,你这要求助?
作者: 随风    时间: 2011-5-26 14:50

2# batman
简单而繁琐的代码,正好可以给论坛闲得慌的会员练手,这类代码也适合新手学习,一举多得,何乐而不为。
当然,其实最主要的原因是自己懒得写 ^_^
作者: CrLf    时间: 2011-5-26 15:50

本帖最后由 zm900612 于 2011-5-26 19:22 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p input=请输入年月
  3. for /f "skip=12 tokens=1-3* delims=月日- " %%a in ('type %~s0^&echo test %input%') do (
  4. set /a m=%%b+100,d=%%c+100
  5. if defined #!m:~-2!!d:~-2! set c=#
  6. set #!m:~-2!!d:~-2!!c!=%%a %%b月%%c日-%%d
  7. )
  8. for /f "tokens=1,2* delims== " %%a in ('set #') do (
  9. if %%b==test echo !xz!
  10. set xz=%%b %%c
  11. )
  12. pause&exit
  13. 摩羯座 1月1日-1月19日
  14. 水瓶座 1月20日-2月18日
  15. 双鱼座 2月19日-3月20日
  16. 白羊座 3月21日-4月19日
  17. 金牛座 4月20日-5月20日
  18. 双子座 5月21日-6月21日
  19. 巨蟹座 6月22日-7月22日
  20. 狮子座 7月23日-8月22日
  21. 处女座 8月23日-9月22日
  22. 天枰座 9月23日-10月23日
  23. 天蝎座 10月24日-11月22日
  24. 射手座 11月23日-12月21日
  25. 摩羯座 12月22日-12月31日
复制代码
以上第二次修改
作者: batman    时间: 2011-5-26 16:51

3# 随风
那是,那是,言之有理,你懒我也懒,我就不写了哈。。。
作者: 随风    时间: 2011-5-26 17:29

4# zm900612
输入 01-01 错误
输入 列表中的第一个日期全错.
作者: 随风    时间: 2011-5-26 17:41

5# batman
别偷懒啊,写个吧...
作者: CrLf    时间: 2011-5-26 17:53

本帖最后由 zm900612 于 2011-5-26 19:24 编辑

6# 随风


原先忽略了变量重名致错的可能,已修改

10# 随风


确实,这回测试无误了,顺便把输出改成了楼主要求的格式
另外说一句,plp的思路确实够简明
作者: plp626    时间: 2011-5-26 17:59

本帖最后由 plp626 于 2011-5-26 18:06 编辑

3# 随风


要考虑全面还不简单,是否要判断输入 的日期正确?
=================
用if判断插空,也许容易些:
  1. 白羊座 03月21日
  2. 金牛座 04月20日
  3. 双子座 05月21日
  4. 巨蟹座 06月22日
  5. 狮子座 07月23日
  6. 处女座 08月23日
  7. 天枰座 09月23日
  8. 天蝎座 10月24日
  9. 射手座 11月23日
  10. 摩羯座 12月22日
  11. 水瓶座 13月20日
  12. 双鱼座 14月19日
复制代码

作者: 随风    时间: 2011-5-26 18:03

8# zm900612
修改后没测试吧.....
作者: caruko    时间: 2011-5-26 18:18

本帖最后由 caruko 于 2011-5-27 00:24 编辑

绝对值法,即用输入日期(数)减去每个星座的2个日期,取绝对值最小的一组。
开始以为只要几句代码,写起来才发现很多的判断。

修改了一下,找了不少二进制资料,使用set /a 位运算,直接得到整数的绝对值。 减少了if 判断。
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p input=输入日期:&set/p=!input! 为 <nul
  3. for /f "tokens=1,2 delims=-" %%a in ("-!input:-0=-!") do set /a dt=%%a*100+%%b,ofset=40
  4. for /f "skip=11 tokens=1-5 delims=月日- " %%1 in (%~snx0) do (
  5.     set /a ofset1=dt-%%2*100-%%3,tp=ofset1,tp=tp">>"31,ofset1=ofset1"^"tp,ofset1=ofset1-tp
  6.     set /a ofset2=dt-%%4*100-%%5,tp=ofset2,tp=tp">>"31,ofset2=ofset2"^"tp,ofset2=ofset2-tp
  7.     if !ofset1! lss !ofset2! (set /a ost=ofset1) else set /a ost=ofset2
  8.     if !ost! lss !ofset! (set /a ofset=ost&set ecode=%%1 %%2月%%3日-%%4月%%5日)
  9. )
  10. echo,!ecode!
  11. pause>nul&goto :eof
  12. 白羊座 3月21日-4月19日
  13. 金牛座 4月20日-5月20日
  14. 双子座 5月21日-6月21日
  15. 巨蟹座 6月22日-7月22日
  16. 狮子座 7月23日-8月22日
  17. 处女座 8月23日-9月22日
  18. 天枰座 9月23日-10月23日
  19. 天蝎座 10月24日-11月22日
  20. 射手座 11月23日-12月21日
  21. 摩羯座 12月22日-1月19日
  22. 水瓶座 1月20日-2月18日
  23. 双鱼座 2月19日-3月20日
复制代码

作者: 随风    时间: 2011-5-26 18:20

还有个问题,4楼的星座列表和我顶楼给的不一样,到底谁是对的??
作者: plp626    时间: 2011-5-26 18:20

本帖最后由 plp626 于 2011-5-26 20:41 编辑

没判断非法日期:
  1. @echo off&setlocal EnableDelayedExpansion
  2. Set/p xx=请输入日期【格式如如“05-26”】:
  3. for %%a in ("01=13";"02=14";"-=月")do Set xx=!xx:%%~a!
  4. set tp=双鱼座 14月19日-03月20日
  5. for /f "tokens=1-2 delims= " %%a in (
  6. '"(more +12 %0&ECHO 哈哈哈 %xx%日)|sort /+4"'
  7. )do (
  8.     if %%a==哈哈哈 Set tp=!tp:13=01!&ECHO !tp:14=02!&pause&exit
  9.     Set tp=%%a %%b
  10. )
  11. 白羊座 03月21日-04月19日
  12. 金牛座 04月20日-05月20日
  13. 双子座 05月21日-06月21日
  14. 巨蟹座 06月22日-07月22日
  15. 狮子座 07月23日-08月22日
  16. 处女座 08月23日-09月22日
  17. 天枰座 09月23日-10月23日
  18. 天蝎座 10月24日-11月22日
  19. 射手座 11月23日-12月21日
  20. 摩羯座 12月22日-01月19日
  21. 水瓶座 13月20日-02月18日
  22. 双鱼座 14月19日-03月20日
复制代码
忘了随风最开始的要求,还要显示日期的范围,已更新。
作者: CrLf    时间: 2011-5-26 18:39

12# 随风


一样的,只是我把跨年的魔蝎座分为两部分,这样可以很简单地降低工作量...
作者: applba    时间: 2011-5-26 18:40

本帖最后由 applba 于 2011-5-26 19:32 编辑

我说一下我的思路:
要求格式化输入:全部为0101-1231的形式。
之后只需要判断这些四位数字的范围即可……
  1. @echo off
  2. :input
  3. cls
  4. set /p day=请输入日期,格式为0101-1231:
  5. cls
  6. set w=
  7. if %day% lss 0101 set w=f
  8. if %day% gtr 1231 set w=f
  9. if "%day:~2,2%"=="00" set w=f
  10. if "%w%"=="f" echo 日期输入错误,请重新输入&goto done
  11. ::白羊座 3月21日-4月19日
  12. if %day% geq 0321 ( if %day% leq 0419 echo %day:~0,2%-%day:~2,2% 白羊座 3月21日-4月19日 &goto done)
  13. ::重复的,懒得写了……
  14. ::摩羯座 12月22日-1月19日
  15. set w=
  16. if %day% leq 0119 set w=f
  17. if %day% geq 1222 set w=f
  18. if "%w%"=="f" echo %day:~0,2%-%day:~2,2% 摩羯座 12月22日-1月19日 &goto done
  19. :done
  20. pause>nul
  21. goto input
复制代码
全部用if语句解决啊,用不到for
作者: 随风    时间: 2011-5-26 19:15

本帖最后由 随风 于 2011-5-26 19:18 编辑

13# plp626
输入 03-12 错误
哈哈,看起容易做起来难啊,目前只有11楼的正确。。 ^_^
作者: CrLf    时间: 2011-5-26 19:19

本帖最后由 zm900612 于 2011-5-28 12:20 编辑

findstr版:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p input=请输入年月
  3. for /f "tokens=1,2 delims=-" %%a in ("%input%") do (
  4. for /f "tokens=1-3* delims=月日 " %%c in ('
  5. findstr /rc:"[^'-Z].*[ \-]%%a月" %~s0') do (
  6. if defined next set xz=%%c %%d月%%e日%%f
  7. if not defined xz (
  8. if %%b lss %%e (
  9. set next=.
  10. ) else set xz=%%c %%d月%%e日-%%f
  11. )
  12. )
  13. )
  14. echo %xz%
  15. pause&exit
  16. 水瓶座 1月20日-2月18日
  17. 摩羯座 12月22日-1月19日
  18. 射手座 11月23日-12月21日
  19. 天蝎座 10月24日-11月22日
  20. 天枰座 9月23日-10月23日
  21. 处女座 8月23日-9月22日
  22. 狮子座 7月23日-8月22日
  23. 巨蟹座 6月22日-7月22日
  24. 双子座 5月21日-6月21日
  25. 金牛座 4月20日-5月20日
  26. 白羊座 3月21日-4月19日
  27. 双鱼座 2月19日-3月20日
  28. 水瓶座 1月20日-2月18日
复制代码
其实是前天晚上写好的,结果昨天忘了发
作者: plp626    时间: 2011-5-26 20:44

16# 随风


给for /f 前加“set tp=双鱼座 14月19日-03月20日”
即可;

已更新代码;
作者: caruko    时间: 2011-5-27 00:32

我也更新了一下...
应用了一个不用 if 的取绝对值的方法。
作者: cjiabing    时间: 2011-5-27 00:43

随风和我一样,有时候也偷懒一下,这就是所谓的“借脑”
作者: BS0小陈    时间: 2011-5-30 11:45

新人好晕啊!!




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