Board logo

标题: 一个按顺序转换字符串的批处理[原创] [打印本页]

作者: willsort     时间: 2004-1-29 00:00    标题: 一个按顺序转换字符串的批处理[原创]

To All:

  Quote:
::此程序为批处理中字符串值的顺序转换而编写, 一般作为子程序被其他程序调用, 也可以将此程序稍做修改, 添加入特定批处理程序中作为子模块调用.
@echo off
if [%1]==[$] goto %2
if [%1]==[] goto nullargu

:main 主模块: count, match 句参数列表可以根据需要重新设定和增减
set factor=%1
call %0 $ count 1 2 3 4 5 7 8 9
call %0 $ match c d e f g h i j
goto display

:count 计数模块: 根据指定参数 factor 设置变量值 #a1, #a2
if [%3]==[] goto overflow
set #a1=%#a1%-
if not [%#a1%]==[----------] goto count_2
set #a1=
set #a2=%#a2%+
if [%#a2%]==[++++++++++] goto overflow
:count_2
if [%3]==[%factor%] goto end
shift
goto count

:match 匹配模块: 循环递增变量 #b1, #b2, 若分别与 #a1, #a2 相等, 则指定结果值为当前循环的参数 3.
if [%3]==[] goto overflow
set #b1=%#b1%-
if not [%#b1%]==[----------] goto match_2
set #b1=
set #b2=%#b2%+
if [%#b2%]==[++++++++++] goto overflow
:match_2
if [%#a1%]==[%#b1%] if [%#a2%]==[%#b2%] set result=%3
if not [%result%]==[] goto end
shift
goto match

:display 显示模块: 显示赋值结果
if [%error%]==[] echo %factor% convert %result%
set result=
set factor=
set error=
set #a1=
set #a2=
set #b1=
set #b2=
goto end

:nullargu
echo.
echo Error: argument 1 not specified.
echo.
goto end

verflow
echo.
echo Error: number is overflow.
set error=overflow
echo.
goto end

:end


作者: Kinglion     时间: 2004-1-30 00:00
受益非浅,谢谢了。
作者: gotomsdos     时间: 2004-2-3 00:00
有很多疑问,能不能每一句详细解释一下,让更多的人学会?

作者: xiaojun     时间: 2004-2-3 00:00
有很多疑问,能不能每一句详细解释一下,让更多的人学会?

if [%1]==[] 与if "%1"==""是等同的吧? ; 这里的 if [%1]==[$]这个$代表什么呢?(票子?
作者: willsort     时间: 2004-2-3 00:00
Re xiaojun:

  Quote:
    if [%1]==[] 与if "%1"==""是等同的吧?

是等同的,只是编程习惯不同而已。我想将变量值与常量串的表示分离,但是很多人认为无此必要,我也无法强求。

[此贴子已经被作者于2004-2-3 20:37:45编辑过]



作者: willsort     时间: 2004-2-3 00:00
Re xiaojun:

  Quote:
    这里的 if [%1]==[$]这个$代表什么呢?(票子?

$与票子没有关系,你到真有想象力。这只是表示当前的运行状态是在子程序中运行,$是SUBROUTINE的首字母缩写的变形,这同样是习惯问题。




作者: willsort     时间: 2004-2-3 00:00
Re xiaojun:

    真要句句详解,工作量太大了,本来我的时间便不充裕。

    目前,此类程序仅供达者互相切磋,不宜普及。
作者: SagInvoker     时间: 2004-5-24 00:00
看了之后觉得思路不错,但是有个问题,你的#a2和#b2拿来干什么???
如果SHIFT用了8次都没找到[%3]变成了[],
[#a1]根本就没办法累加到[----------]
所以
set #a1=
set #a2=%#a2%+
if [%#a2%]==[++++++++++] goto overflow
根本就没机会执行,除非你一开始就给#a1赋值,但是不太可能吧??
#b2也是如此
所以我实在想不通你设定#a2和#b2有什么目的
不知道你是不是还有什么没说完的话,说来听听~~~~~~
作者: chenall     时间: 2004-5-26 00:00
看不太懂
作者: willsort     时间: 2004-6-2 00:00    标题: 关于按序列转换串的讨论-1

Re SagInvoker:

  感谢SagInvoker兄对此问题的关注,并提出自己的宝贵意见。

  首先需要声明,1楼提供的只是一个样例程序,而非一个通用程序,所以它无法缺省地处理用户的各种需求,而是需要用户根据自己的需求修改源代码。

  程序中的主模块中已经注明转换序列可以重新设定和调整,言外之意是若将它应用在自己的项目中,需要根据自己的需求调整转换序列,大多数时候这项工作是必须的。我在文中使用的12345678和cdefghij只是一个带有很大局限性的示例而已。

  但是,作为程序本身,应该要尽可能的考虑到各种经常会发生的情况,以增强它的适应性。比如实际情况中的转换序列很可能超过10个字符的长度(例如字母表向ASCII码表的转换)。而我在程序中使用到的环境变量#a2和#b2,正是为了解决长序列转换的问题。因为系统的环境空间是有限的,我们如果完全将转换序列计数为相应长度的环境变量,将造成环境空间的用度紧张,所以我将#a2和#b2设计为序列索引的十位数,而#a1和#b1则为个位数。那段你有疑问的代码,实现的是由#a1到#a2的进位运算,它在很多情形下都是需要的。

  所以说,程序中的那段代码虽然在演示的过程中不会执行,但不代表他在所有的情况下都不会执行,即使这些另外的情况需要修改原来的代码。

  当然,程序本身应该可以有进一步的改善,比如说他可以自我处理用户自定义的转换序列,而不需要用户去更改源代码。但是,作为一个带有示意性的项目来说,这些界面问题不属于我们关注的焦点,我们首先需要完成的是核心功能的实现,其次才能考虑界面和框架问题。

  欢迎SagInvoker兄能对此程序进行完善,简化代码或者增加功能,都是可以的。


[此贴子已经被作者于2004-6-2 上午 10:30:24编辑过]