返回列表 发帖
本帖最后由 qixiaobin0715 于 2024-8-21 09:13 编辑

回复 6# ppll2030
看到你第2个代码,使用findstr一般表达式,头都晕了,感觉太繁琐了。高手!!
自己设想是不是用判断语句思路更清晰些,也很简单。谁知眼高手低,写起来也是很费劲,也一样繁琐。还是发出来让需要的人作为参考,即使不需要 ,也可作为判断语句学习时的参考:
@echo off
:o
set/p "_md=Please Input the Date (MM/DD):"
for /f "tokens=1* delims=/" %%i in ("%_md%") do (
    if not "%%j"=="" (
        if "%%i" geq "01" if "%%i" leq "12" if "%%j" geq "01" if "%%j" leq "31" set n=1
        if defined n (
            if "%%i" equ "02" (
                if "%%j" geq "30"    set n=
            ) else (
                for %%k in (04 06 09 11) do if "%%i" equ "%%k" if "%%j" equ "31" set n=
            )
        )
    )
)
if not defined n echo,Input Error&goto :o
echo,Input Correct
pauseCOPY
总是感觉哪里不对。1/1也是合法的。

TOP

本帖最后由 ppll2030 于 2024-8-21 09:20 编辑

回复 16# qixiaobin0715


    哈哈。不是高手,因为我看你的这段也是头大
我对if嵌套很不喜,套多了就脑子不够用,逻辑跟不上。;P
我是能不用就不用。

至于这个findstr,其实很简单的啊,就是正向匹配而已。用表达式把符合的情况都列出来即可。
这不,半夜里费脑子,还是被大佬揪出瑕疵了。

TOP

回复 16# qixiaobin0715


    大概看到问题了。你这个if只是对数值的大小比较啊,所以 1 geq 01 是成立的。01在数值比较里就是1啊

TOP

本帖最后由 qixiaobin0715 于 2024-8-21 10:13 编辑

回复 18# ppll2030
加了一段代码,这样应当可以了,保留上面代码,可以对比参考:
@echo off
:o
set/p "_md=Please Input the Date (MM/DD):"
for /f "tokens=1* delims=/" %%i in ("%_md%") do (
    if not "%%j"=="" (
        if "%%i" geq "01" if "%%i" leq "12" if "%%j" geq "01" if "%%j" leq "31" set n=1
        for /l %%k in (1,1,3) do (
            if "%%k" equ "%%i" set n=
            if "%%k" equ "%%j" set n=
        )
        if defined n (
            if "%%i" equ "02" (
                if "%%j" geq "30"    set n=
            ) else (
                for %%k in (04 06 09 11) do if "%%i" equ "%%k" if "%%j" equ "31" set n=
            )
        )
    )
)
if not defined n echo,Input Error&goto :o
echo,Input Correct
pauseCOPY

TOP

回复 18# ppll2030
非数值比较,加了引号就是字符串比较。

TOP

回复 18# ppll2030
if 1 equ 01 echo,good
if "1" equ "01" echo,good
if "3" gtr "111" echo,goodCOPY

TOP

回复 21# qixiaobin0715


    好吧。理解错了。字符串比较大小基本没用过。除了那个两字符串是否相符的“==” 回头补习一下。

TOP

回复 19# qixiaobin0715

大佬,我试了一下,非数字也正确
  
Please Input the Date (MM/DD):11/1qqqq
Input CorrectCOPY
bat小白,请多指教!谢谢!

TOP

回复 19# qixiaobin0715


    估计还要修改一下下

Please Input the Date (MM/DD):12-12
Input Error
Please Input the Date (MM/DD):12/12
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):0/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):10/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):6/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):4/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):5/31
Input Correct
请按任意键继续. . .

TOP

本帖最后由 qixiaobin0715 于 2024-8-21 12:21 编辑

回复 24# ppll2030
你的测试方法不对。是否是在代码最后加上一个goto循环?这样会有变量残值存在,有些结果会不一样。不信你可以试试。但确实存在非数字也能通过的问题。
你想用这种方法测试的话,在本次循环后,代码再次运行前,必须消减掉上一次运行时的变量残值,在你后加的goto循环前一行,也即是倒数第2行加上这段代码:
set _md=
set n=COPY

TOP

回复 23# 77七
看样子用判断语句也是挺繁琐的,set /p下加一行:
for /f "tokens=1* delims=0123456789" %%i in ("%_md%") do if not "%%i%%j"=="/" goto :pCOPY
第19、20行之间加上循环标签:p
不知还有何bug

TOP

回复 19# qixiaobin0715

用纯P一贯到底,还是应该先解决 ‘卡位和定界’,即检查输入长度是否=5,检查第三位是否为 /,检查定界符之外是否均为数字,其后再完成月值与日值的关联处理,否则会使处理逻辑复杂化...

另说》纯P内部数据处理也许只有字符串一种数据类型,因此以下三式返回值相同
   if 09 lss 1 (@echo,1) else @echo,0
   if "09" lss "1" (@echo,1) else @echo,0
   if 0q lss 1 (@echo,1) else @echo,0
1

评分人数

TOP

回复 27# aloha20200628
确实还有bug:0101/11
思路有问题,需要重写。

TOP

重写代码,部分参考或者说借鉴27楼的思路,先按正确的格式定义月份日期,再进行判断:
@echo off
for /l %%i in (1,1,31) do (
    if %%i lss 10 (
        set @0%%i=1
        set #0%%i=1
    ) else (
        set @%%i=1
        if %%i leq 12 set #%%i=1
    )
)
:o
set/p "md=Please Input the Date (MM/DD):"
if not "%md://=%"=="%md%" goto :p
for /f "tokens=1* delims=/" %%i in ("%md%") do (
    if defined #%%i if defined @%%j set n=1
    if defined n (
        if "%%i" equ "02" (
            if "%%j" geq "30"    set n=
        ) else (
            for %%k in (04 06 09 11) do if "%%i" equ "%%k" if "%%j" equ "31" set n=
        )
    )
)
:p
if not defined n echo,Input Error&goto :o
echo,Input Correct
pauseCOPY

TOP

本帖最后由 qixiaobin0715 于 2024-8-21 16:22 编辑

代码第13行是为了过滤类似这样的输入合法通过:01//01
如果觉得无所谓,去掉也行。
越搞越复杂。
就当练手吧。

TOP

返回列表