Board logo

标题: 批处理编程时候的映射思想 [打印本页]

作者: novaa    时间: 2008-1-8 13:15     标题: 批处理编程时候的映射思想

  1. 转载注明
  2. 最初见这种思想是在小楼写的文本编辑器中。当时我刚刚开始写一些运用型的批处
  3. 理。我当时采用的方法是新建很多文件夹累保存各个类。然后在文件夹中新建文本
  4. 文件存储类中的信息。这样的缺点就是临时文件太多。能不能够把所有的东西放到
  5. 一个文件中呢?答案是肯定的。
  6. 映射就是一对一的关系。你要映射,总得有个对象吧。就好像找东西。要有一个地
  7. 址。因此。我们的第一步应该是建立一个保存信息的变量空间。然后才是对这个的
  8. 引用。
  9. 下面是3个例子。从这3个例子中我将阐述这种思想。
  10. 例子一:
  11. 你要建立一个管理班级的档案批处理工具。档案中要包括每个同学的姓名。年龄。
  12. 联系方式。这个批处理工具需要支持添加学生。添加班级。修改资料等操作。你将
  13. 如何入手。我这里给出利用映射思想的解决方案。
  14. 1.)建立映射(总体是先创建一个地址。然后为地址代表一个变量。)
  15. 我们先确定我们配置文件的格式。这里我直接给出我的。如下:
  16. _班级
  17. 姓名:novaa;年龄:100;联系方式:hi.baidu.com/novaa
  18. 姓名:TheOne;年龄:99;联系方式:无
  19. _班级
  20. 姓名:novaa;年龄:100;联系方式:无
  21. 也就是班级以_开头。
  22. 跟着班级的是学生资料,格式是
  23. 姓名: ;年龄: ;联系方式:
  24. 以;做分隔符
  25. 好了。配置文件的格式已经确定。接下来就是建立映射关系了。我这里以读取配置
  26. 文件中的映射关系为例子。我先给出代码
  27. @echo off&setlocal enabledelayedexpansion
  28. for /f "delims=" %%i in (Peizhi.ini) do (
  29. set Get=%%i&set /a Student_Number+=1
  30. if "!Get:~0,1!"=="_" (
  31. set /a Class_Number+=1
  32. set !Class_Number!=!Get:~1!
  33. set Class=!Get:~1!&set !Class!=!Get:~1!
  34. set Student_Number=0
  35. ) else (set !Class!!Student_Number!=%%i)
  36. )
  37. 位了便于大家理解,我先说一下变量代表的意义。
  38. Get :是从for中得到的变量
  39. Class_Number: 是班级的编号
  40. Class:是班级的名称
  41. !Class!:变量名是班级名称,变量所代表的还是班级名称。
  42. 好了。现在已经建立好了一一映射的关系。
  43. 我们假设配置文件中的内容为:
  44. _电气0604
  45. 姓名:novaa;年龄:100;联系方式:hi.baidu.com/novaa
  46. _电气0603
  47. 姓名:未知;年龄:未知;联系方式:未知
  48. 好了。我们看看经过上诉的代码一一映射后的各个变量代表的意义吧。
  49. 第一次循环:
  50. 1:电气0604 (这里1是Class_Number的数值;1所代表的变量是电气0604)
  51. 电气0604:电气0604(这里电气0604是Class所代表的数值。电气0604代表的是电
  52. 气0604)
  53. 之所以要
  54. set Class=!Get:~1!&set !Class!=!Get:~1!
  55. 是因为等下一次循环到下一个班级的时候,Class变量就会变换位其他的。所以要
  56. 先将变量的变量定义(感觉有点象指针)
  57. 第二次循环
  58. 电气06041=姓名:novaa;年龄:100;联系方式:hi.baidu.com/novaa
  59. (电气06041是!Class!!Student_Number!的值。)
  60. 下面的就重复了。这样。就建立了班级。学生。与变量的一一映射关系。
  61. 我们以后可以用!1!来表示电气0601了。而且1我们可以轻松的用for /l %%i in (1
  62. 1 10) 这样的来得到。从而可以在全局使用。(呵呵。类似全局变量)
  63. 例子二:
  64. 产生一个 000到999的随机数
  65. 由于是以0开头。因此循环数的嵌套不能使用。(上次小怪驴发的字典就有这个缺
  66. 点)
  67. 这个怎么解决呢?我是这样想的。我们利用1000到1999来。利用变量截取得到000
  68. 到999之间的数字。 然后为000到999分配地址(哈哈)。我们就可以通过地址来一
  69. 一映射。看看代码。
  70. @echo off&setlocal enabledelayedexpansion
  71. set weizhi=1
  72. for /l %%i in (1000 1 1999) do (
  73. set var=%%i
  74. set weizhi=!var:~0,1!
  75. set /a weizhi+=1
  76. )
  77. 这样我们就建立了000到999的存储地址了。我们可以利用!1!来引用。
  78. 要产生随机的000到999只需要利用random取一个1到999自建的数字。然后!数字!
  79. 就可以引用了。
  80. 例子三:
  81. 冒泡法排序。
  82. 假设有
  83. 1 5 65 145 236 852
  84. 我们先建立映射关系
  85. @echo off&setlocal enabledelayedexpansion
  86. for %%i in (1 5 65 145 236 852) do (
  87. set /a a+=1
  88. set array!a!=%%i
  89. )
  90. OK。我下面给出一个非常批处理里面的冒泡排序的例子:大家自己研究吧。
  91. http://bbs.verybat.cn/viewthread.php?tid=6700&highlight=%C5%C5%D0%F2
  92. 假设1.txt的内容如下:
  93. 8
  94. 5
  95. 7
  96. 9
  97. 45
  98. 34
  99. 2
  100. 32
  101. 3
  102. 12
  103. 3
  104. 12
  105. 12
  106. 45
  107. 345
  108. 6
  109. 8
  110. 89
  111. 下面的bat是对里面的数字进行排序:
  112. @echo off
  113. setlocal enabledelayedexpansion
  114. set a=0
  115. ::初始化"数组"
  116. for /f %%i in (1.txt) do (
  117. set /a a+=1
  118. set num!a!=%%i
  119. )
  120. ::排序
  121. set /a b=%a%-1
  122. for /l %%i in (1,1,%b%) do (
  123. set /a var=%%i+1
  124. for /l %%j in (!var!,1,%a%) do (
  125. call set var1=%%num%%i%%
  126. call set var2=%%num%%j%%
  127. if !var1! lss !var2! (set tmp=!var1!&set num%%i=!var2!&set num%%j=!
  128. tmp!)
  129. )
  130. )
  131. for /l %%i in (1,1,%a%) do call echo %%num%%i%%
  132. pause
复制代码

作者: tgwg001    时间: 2010-2-12 12:49

映射思想有点复杂
作者: batman    时间: 2010-2-12 13:13     标题: 回复 2楼 的帖子

我来简化下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,8) do set ".%%a=映射%%a-1"&set "_%%a=映射%%a-2"&set "#%%a=映射%%a-3"
  3. :begin
  4. cls&echo.
  5. for /l %%a in (1,1,8) do set /p=%%a <nul
  6. echo.&echo.&set "n="&set /p n=请选择项:
  7. echo.&echo 你选择的是第%n%项:!.%n%! !_%n%! !#%n%!
  8. pause>nul&goto begin
复制代码
可以看出当你选择了1-8中任一数字时,程序就会分别输出以. _ #字符与之组合后的变量的值,这就是映射。




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