标题: [文本处理] 批处理怎样根据输入日期显示星座? [打印本页]
作者: 随风 时间: 2011-5-26 13:34 标题: 批处理怎样根据输入日期显示星座?
输入日期显示星座
如:输入 05-26
则显示 05-26 双子座 05-21至06-21
星座- 白羊座 3月21日-4月19日
- 金牛座 4月20日-5月20日
- 双子座 5月21日-6月21日
- 巨蟹座 6月22日-7月22日
- 狮子座 7月23日-8月22日
- 处女座 8月23日-9月22日
- 天枰座 9月23日-10月23日
- 天蝎座 10月24日-11月22日
- 射手座 11月23日-12月21日
- 摩羯座 12月22日-1月19日
- 水瓶座 1月20日-2月18日
- 双鱼座 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 编辑
- @echo off&setlocal enabledelayedexpansion
- set /p input=请输入年月
- for /f "skip=12 tokens=1-3* delims=月日- " %%a in ('type %~s0^&echo test %input%') do (
- set /a m=%%b+100,d=%%c+100
- if defined #!m:~-2!!d:~-2! set c=#
- set #!m:~-2!!d:~-2!!c!=%%a %%b月%%c日-%%d
- )
- for /f "tokens=1,2* delims== " %%a in ('set #') do (
- if %%b==test echo !xz!
- set xz=%%b %%c
- )
- pause&exit
- 摩羯座 1月1日-1月19日
- 水瓶座 1月20日-2月18日
- 双鱼座 2月19日-3月20日
- 白羊座 3月21日-4月19日
- 金牛座 4月20日-5月20日
- 双子座 5月21日-6月21日
- 巨蟹座 6月22日-7月22日
- 狮子座 7月23日-8月22日
- 处女座 8月23日-9月22日
- 天枰座 9月23日-10月23日
- 天蝎座 10月24日-11月22日
- 射手座 11月23日-12月21日
- 摩羯座 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判断插空,也许容易些:- 白羊座 03月21日
- 金牛座 04月20日
- 双子座 05月21日
- 巨蟹座 06月22日
- 狮子座 07月23日
- 处女座 08月23日
- 天枰座 09月23日
- 天蝎座 10月24日
- 射手座 11月23日
- 摩羯座 12月22日
- 水瓶座 13月20日
- 双鱼座 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 判断。- @echo off&setlocal enabledelayedexpansion
- set /p input=输入日期:&set/p=!input! 为 <nul
- for /f "tokens=1,2 delims=-" %%a in ("-!input:-0=-!") do set /a dt=%%a*100+%%b,ofset=40
- for /f "skip=11 tokens=1-5 delims=月日- " %%1 in (%~snx0) do (
- set /a ofset1=dt-%%2*100-%%3,tp=ofset1,tp=tp">>"31,ofset1=ofset1"^"tp,ofset1=ofset1-tp
- set /a ofset2=dt-%%4*100-%%5,tp=ofset2,tp=tp">>"31,ofset2=ofset2"^"tp,ofset2=ofset2-tp
- if !ofset1! lss !ofset2! (set /a ost=ofset1) else set /a ost=ofset2
- if !ost! lss !ofset! (set /a ofset=ost&set ecode=%%1 %%2月%%3日-%%4月%%5日)
- )
- echo,!ecode!
- pause>nul&goto :eof
- 白羊座 3月21日-4月19日
- 金牛座 4月20日-5月20日
- 双子座 5月21日-6月21日
- 巨蟹座 6月22日-7月22日
- 狮子座 7月23日-8月22日
- 处女座 8月23日-9月22日
- 天枰座 9月23日-10月23日
- 天蝎座 10月24日-11月22日
- 射手座 11月23日-12月21日
- 摩羯座 12月22日-1月19日
- 水瓶座 1月20日-2月18日
- 双鱼座 2月19日-3月20日
复制代码
作者: 随风 时间: 2011-5-26 18:20
还有个问题,4楼的星座列表和我顶楼给的不一样,到底谁是对的??
作者: plp626 时间: 2011-5-26 18:20
本帖最后由 plp626 于 2011-5-26 20:41 编辑
没判断非法日期:- @echo off&setlocal EnableDelayedExpansion
- Set/p xx=请输入日期【格式如如“05-26”】:
- for %%a in ("01=13";"02=14";"-=月")do Set xx=!xx:%%~a!
-
- set tp=双鱼座 14月19日-03月20日
- for /f "tokens=1-2 delims= " %%a in (
- '"(more +12 %0&ECHO 哈哈哈 %xx%日)|sort /+4"'
- )do (
- if %%a==哈哈哈 Set tp=!tp:13=01!&ECHO !tp:14=02!&pause&exit
- Set tp=%%a %%b
- )
-
- 白羊座 03月21日-04月19日
- 金牛座 04月20日-05月20日
- 双子座 05月21日-06月21日
- 巨蟹座 06月22日-07月22日
- 狮子座 07月23日-08月22日
- 处女座 08月23日-09月22日
- 天枰座 09月23日-10月23日
- 天蝎座 10月24日-11月22日
- 射手座 11月23日-12月21日
- 摩羯座 12月22日-01月19日
- 水瓶座 13月20日-02月18日
- 双鱼座 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的形式。
之后只需要判断这些四位数字的范围即可……- @echo off
-
- :input
- cls
- set /p day=请输入日期,格式为0101-1231:
- cls
- set w=
- if %day% lss 0101 set w=f
- if %day% gtr 1231 set w=f
- if "%day:~2,2%"=="00" set w=f
- if "%w%"=="f" echo 日期输入错误,请重新输入&goto done
-
- ::白羊座 3月21日-4月19日
- if %day% geq 0321 ( if %day% leq 0419 echo %day:~0,2%-%day:~2,2% 白羊座 3月21日-4月19日 &goto done)
- ::重复的,懒得写了……
-
- ::摩羯座 12月22日-1月19日
- set w=
- if %day% leq 0119 set w=f
- if %day% geq 1222 set w=f
- if "%w%"=="f" echo %day:~0,2%-%day:~2,2% 摩羯座 12月22日-1月19日 &goto done
-
- :done
- pause>nul
- 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版:- @echo off&setlocal enabledelayedexpansion
- set /p input=请输入年月
- for /f "tokens=1,2 delims=-" %%a in ("%input%") do (
- for /f "tokens=1-3* delims=月日 " %%c in ('
- findstr /rc:"[^'-Z].*[ \-]%%a月" %~s0') do (
- if defined next set xz=%%c %%d月%%e日%%f
- if not defined xz (
- if %%b lss %%e (
- set next=.
- ) else set xz=%%c %%d月%%e日-%%f
- )
- )
- )
- echo %xz%
- pause&exit
- 水瓶座 1月20日-2月18日
- 摩羯座 12月22日-1月19日
- 射手座 11月23日-12月21日
- 天蝎座 10月24日-11月22日
- 天枰座 9月23日-10月23日
- 处女座 8月23日-9月22日
- 狮子座 7月23日-8月22日
- 巨蟹座 6月22日-7月22日
- 双子座 5月21日-6月21日
- 金牛座 4月20日-5月20日
- 白羊座 3月21日-4月19日
- 双鱼座 2月19日-3月20日
- 水瓶座 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://www.bathome.net/) |
Powered by Discuz! 7.2 |