Board logo

标题: [ 新手习题 1 ] 批处理数值型变量的交换 [打印本页]

作者: wxcute    时间: 2008-11-26 12:10     标题: [ 新手习题 1 ] 批处理数值型变量的交换

我们假设值为数字的变量为数值型变量。
那么如何交换两个不确定的数值型变量呢?
如:
set a=2
set b=3
因为 a 不一定等于 2,b 不一定等于 3,所以不能用 set a=3 与 set b=2 这种方式来交换。

目的:掌握对数值型变量的交换设置方法。

要求:交换并显示变量 a、b,方法不限。

评分:代码可读性 1 分;
   首个新方法 5 分,第二个 4 分,依次类推,最少 2 分;
   一人多种方法,新方法追加 3 分,已经出现过的方法追加 1 分。
作者: qq641255849    时间: 2008-11-26 13:16

set /a 行不?

───────────────── 版主回复 ─────────────────
执行:wxcute
回复:[2008-11-26] 可以试一下,答错也没有关系的。
───────────────── 版主回复 ─────────────────


作者: hxf0759    时间: 2008-11-26 16:27     标题: 看我这个行不行

  1. @echo off
  2. echo 请输第一个数字
  3. set/p a=
  4. echo a=%a%
  5. echo 请输第二个数字
  6. set/p b=
  7. echo b=%b%
  8. echo 开始转换 pause
  9. set /a c=%a%
  10. set /a a=%b%
  11. set /a b=%c%
  12. echo 转换结束
  13. echo a=%a%
  14. echo b=%b%
复制代码

[ 本帖最后由 hxf0759 于 2008-11-27 09:21 编辑 ]
作者: pusofalse    时间: 2008-11-26 17:59

只要明白set /a的特性就能简洁明了的解答此题了。
  1. If you use any of the logical or modulus operators, you will need to
  2. enclose the expression string in quotes.  Any non-numeric strings in the
  3. expression are treated as environment variable names whose values are
  4. converted to numbers before using them.  If an environment variable name
  5. is specified but is not defined in the current environment, then a value
  6. of zero is used.  This allows you to do arithmetic with environment
  7. variable values without having to type all those % signs to get their
  8. values.
复制代码

作者: BBCC    时间: 2008-11-26 19:33

原帖由 qq641255849 于 2008-11-26 13:16 发表
set /a 行不?

───────────────── 版主回复 ─────────────────
执行:wxcute
回复:[2008-11-26] 可以试一下,答错也没有关系的。
───────────────── 版 ...


原因是没在windows下,没法测试...
作者: pusofalse    时间: 2008-11-28 21:38

  1. @echo off
  2. Set "a=%random%" & set "b=%random%"
  3. echo %a% %b%
  4. set /a b=%a%,a=%b%
  5. echo %a% %b%
  6. pause
  7. Set "a=%random%" & set "b=%random%"
  8. echo %a% %b%
  9. set /a b=a,a=b
  10. echo %a% %b%
  11. pause
复制代码
希望可以通过如上代码了解到set /a的特性。
作者: Batcher    时间: 2008-11-29 18:34

  1. @echo off
  2. set a=2
  3. set b=3
  4. set /a a=b+(b=a)*0
  5. echo %a%
  6. echo %b%
  7. pause
复制代码

作者: nomyself    时间: 2008-12-4 18:28

通过变量交换比较常见,交换的方法很多,加减,乘除,异或.......
  1. ::加减交换
  2. @echo off
  3. set a=2
  4. set b=4
  5. set /a a+=%b%
  6. set /a b=%a%-%b%
  7. set /a a-=%b%
  8. echo %a%   %b%
  9. pause<nul
复制代码
  1. ::乘除交换
  2. @echo off
  3. set a=2
  4. set b=4
  5. set /a a*=%b%
  6. set /a b=%a%/%b%
  7. set /a a/=%b%
  8. echo %a%   %b%
  9. pause<nul
复制代码

作者: jsj30651    时间: 2008-12-4 18:40

  1. @echo off
  2. set a=%random% & set b=%random%
  3. echo a=%a%
  4. echo b=%b%
  5. echo.
  6. set a=%b% & set b=%a%
  7. echo a=%a%
  8. echo b=%b%
  9. pause
复制代码
利用批处理执行命令时候的预处理来交换变量

[ 本帖最后由 jsj30651 于 2008-12-4 18:50 编辑 ]
作者: rat    时间: 2008-12-4 18:51

::乘除交换
@echo off
set a=2
set b=4
set /a a*=%b%
set /a b=%a%/%b%
set /a a/=%b%
echo %a%   %b%
pause<nul


如果a和b中至少有一个为0,怎么办?
作者: nomyself    时间: 2008-12-5 16:21     标题: 回复 11楼 的帖子

恩,当时没有想那么多,多谢提醒。
作者: yan    时间: 2008-12-5 19:44     标题: 这个有问题吗?

echo 输入a=
set/p a=
echo 输入 b=
set/p b=
set c=%a%
set a=%b%
set b=%c%
pause
作者: firewolf85    时间: 2008-12-7 15:20

set c=%a%
set a=%b%
set b=%c%
echo %a%
echo %b%
作者: myzwd    时间: 2009-3-2 17:12     标题: 回复 1楼 的帖子

  1. @echo off
  2. set a=2
  3. set b=3
  4. echo.------------
  5. set tt=a
  6. set a=b
  7. set b=tt
  8. echo.ok
复制代码

作者: wild84    时间: 2009-3-4 00:28     标题: 回复 3楼 的帖子

这个代码运行不了。。
作者: pzspdl    时间: 2009-3-4 21:33

@echo off
set/p a=请输入a的数值 & set/p b=请输入b的数值
echo a是%a%
echo b是%b%
goto x
set/p a=%b% & set/p b=%a%
:x
echo ab交换后a是%b%
echo ab交换后b是%a%
pause
作者: rat    时间: 2009-3-4 22:44     标题: xchg指令

  1. @echo off
  2. set a=2
  3. set b=3
  4. (echo a100&echo mov ax,%a%&echo mov bx,%b%&more /e +5 "%~f0")|debug|find /v ""
  5. pause&exit/b
  6. xchg ax,bx
  7. t=100 3
  8. q
复制代码

作者: qxhonker    时间: 2009-3-5 16:03

  1. @echo off
  2. set /a a=5
  3. set /a b=3
  4. set /a a=%a%+%b%
  5. set /a b=%a%-%b%
  6. set /a a=%a%-%b%
  7. echo %a%
  8. echo %b%
  9. pause
复制代码

作者: qxhonker    时间: 2009-3-5 16:08

刚发现我跟9楼的一样  
同时佩服8楼  这个代码最好
作者: qxhonker    时间: 2009-3-5 16:14

根据8楼的启发   发现这样也行
  1. @echo off
  2. set /a a=5
  3. set /a b=3
  4. for /l %%i in (1,1,1) do set a=%b%&set b=%a%
  5. echo %a%
  6. echo %b%
  7. pause
复制代码
跟变量延迟一个道理  吼吼  能不能给我点分呀
作者: yycup1111    时间: 2009-3-5 18:10     标题: %E5%9B%9E%E5%A4%8D 21楼 %E7%9A%84%E5%B8%96%E5%AD%90

学习中…………………
作者: sjzong    时间: 2009-5-8 22:39

很好!!有的真的有意思!
作者: Taurus    时间: 2009-7-7 07:58

数值交换
@echo off&set/a A=2,B=3
set/a A=B,B=%A%
echo A=%A% , B=%B%&pause>nul


任何变量
@echo off&set A=上 &set B=下
set A=%B% &set B=%A%
echo A=%A% , B=%B% &pause>nul

作者: eneir    时间: 2009-7-9 04:00     标题: 巧解

@echo off
set /p a=请输入a:
set /p b=请输入b:
set a=%b% & set b=%a%
echo a=%a% b=%b%
pause>nul
里面涉及到变量延迟,我就不过多解释了,有兴趣有多找些相关资料学习
作者: eneir    时间: 2009-7-9 04:11     标题: 一般解

@echo off
set /p a=请输入a:
set /p b=请输入b:
set /a a+=%b%
set /a b=%a%-%b%
set /a a-=%b%
echo a=%a% b=%b%
pause>nul
此程序只能a,b是数值时可行,有字母就不行,上面的程序却无论a,b是数值还是字母,甚至两者混合都可行
作者: 风行者    时间: 2009-7-13 00:17

  1. @echo off
  2. set a=2
  3. set b=3
  4. set a=%b% & set b=%a%
  5. echo a变为%a% b变为%b%
  6. pause
复制代码
噢,24,25楼的用了
作者: loop3231262    时间: 2009-7-16 12:12

@echo off
set a=2
set b=3
set a=%b% & set b=%a%
echo %a% & echo %b%
pause

只要用上管道,由于预处理  好象就可以了……
作者: wxcute    时间: 2009-7-16 20:06     标题: 回复 28楼 loop3231262 的帖子

管道在哪里? 不是连接符吗?
作者: tvsdlxy    时间: 2009-7-25 15:58

@echo off
set/p a=请输入a:
set/p b=请输入b:
set c=0
set /a c=%a%
set /a a=%b%
set /a b=%c%

echo %a% %b%
pause
作者: nopr    时间: 2009-8-6 20:47     标题: 回复 7楼 的帖子

  1. Set "a=%random%" & set "b=%random%"
  2. echo %a% %b%
  3. set /a b=a,a=b
  4. echo %a% %b%
复制代码
好像应该是set/a b=%a%,a=%b%吧,,好像少了%%号
作者: nopr    时间: 2009-8-6 20:56

  1. Set "a=%random%" & set "b=%random%"
  2. echo %a% %b%
  3. set b=%a%&set a=%b%
  4. echo %a% %b%
  5. pause
复制代码
我怎么只用set 也可以呢,不用set/a啊
作者: hs4814    时间: 2009-8-9 22:01

  1. @echo  off
  2. set /p a=请输入第一个数:
  3. set /p b=请输入第二个数:
  4. echo 交换前a的值是:%a%
  5. echo 交换前b的值是:%b%
  6. set c=%a%
  7. set a=%b%
  8. set b=%c%
  9. setlocal enabledelayedexpansion
  10. echo 交换后a的值是: %a%
  11. echo 交换后b的值是:%b%
  12. pause>nul
复制代码

作者: Lumiere    时间: 2009-8-9 22:12

题目的意思没看懂……
作者: wayaoqiang    时间: 2009-8-12 16:51

  1. @echo off
  2. set a=2
  3. set b=3
  4. echo a=%a%
  5. echo b=%b%
  6. set /a a=a+b
  7. set /a b=a-b
  8. set /a a=a-b
  9. echo a=%a%
  10. echo b=%b%
  11. pause
复制代码

[ 本帖最后由 wayaoqiang 于 2009-8-17 21:06 编辑 ]
作者: wxcute    时间: 2009-8-15 21:42     标题: 回复 34楼 Lumiere 的帖子

测试一下其他回复的代码就能了解意思了。
作者: 基拉freedom    时间: 2009-8-15 22:13

不用变量延迟 直接换就可以了....
作者: Hysteria    时间: 2009-8-18 13:15

[code]
@echo off
set /p numa=a=
set /p numb=b=
cls
echo a=%numa% b=%numb%
pause
goto exchange

:exchange
cls
echo 交换后如下:
echo a=%numb% b=%numa%
pause
[code/]
作者: atsivsucks    时间: 2009-8-18 21:45

  1. @echo off
  2. set a=23
  3. set b=32
  4. set t=%a%
  5. set a=%b%
  6. set b=%t%
  7. echo a:%a%, b:%b%
  8. pause
复制代码

[ 本帖最后由 atsivsucks 于 2009-8-19 08:55 编辑 ]
作者: couth    时间: 2009-8-19 12:32

@echo off
set a=2
set b=3
echo 原来的值:a=%a% b=%b%

set b=%a% & set a=%b%
echo 交换后的值:a=%a% b=%b%

pause

这个测试可以。
作者: poxi    时间: 2010-7-19 22:33

答:
  1. @echo off
  2. set a=2
  3. set b=3
  4. echo 替换前: a=%a% b=%b%
  5. set zs=%a%
  6. call set a=%%a:%a%=%b%%%
  7. call set b=%%a:%b%=%zs%%%
  8. echo 替换后: a=%a% b=%b%
  9. pause>nul
复制代码


====可以吧......
end;
作者: 慕夜蓝化    时间: 2014-12-24 19:54

本帖最后由 慕夜蓝化 于 2014-12-24 19:56 编辑

在for语句中使用变量延迟可以很好的解决问题。
@echo off
set /a a=2,b=3
for /l %%i in (1 1 1) do (
    set b=%a%&set a=%b%
    call echo,%%a%% %%b%%
)
pause
不,只要是在复合语句中,都能达到题目的要求
@echo off
set /a a=2,b=3
set b=%a%&set a=%b%
echo,%a% %b%
pause
作者: dengyuli    时间: 2015-1-3 11:01

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p a=请输入变量a的值:
  4. set /p b=请输入变量b的值:
  5. for /f "delims=# tokens=1-3 eol=" %%a in ('echo !b!#!a!') do (
  6. set a=%%a
  7. set b=%%b
  8. goto:end
  9. )
  10. :end
  11. echo a=!a!
  12. echo b=!b!
  13. pause>nul
复制代码
变量a和b中不能含有#号,其他都可以。
作者: Colin3    时间: 2015-1-7 18:56

  1. @echo off
  2. rem 交换前的赋值
  3. set a=%random%
  4. set b=%random%
  5. echo 交换前:a=%a%,b=%b%
  6. echo.
  7. rem 交换后的结果
  8. set temp=%a%
  9. set a=%b%
  10. set b=%temp%
  11. echo 交换后:a=%a%,b=%b%
  12. pause
复制代码

作者: 终_焉    时间: 2015-2-25 15:43

  1. @echo off
  2. ::交换变量a,b的值
  3. set /p a=请输入a=
  4. set /p b=请输入b=
  5. set a=%b%&set b=%a%
  6. echo 交换数值后,a=%a%,b=%b%
  7. pause
复制代码

作者: lqdhg    时间: 2015-3-5 10:37

@echo off
set /p x=请输入a的值
set /p y=请输入b的值
echo 您输入的a的信息是%x%
echo 您输入的b的信息是%y%
echo 开始转换
set a=%y%
set b=%x%
echo 转换之后a的信息是%a%
echo 转换之后b的信息是%b%
pause

简化的
@echo off
set /p x=请输入a的值
set /p y=请输入y的值
echo 您输入的a的值是%x%
echo 您输入的b的值是%y%
echo 转换之后您输入的a的值是%y%
echo 转换之后您输入的b的值是%x%
pause
作者: zzw8822    时间: 2015-4-21 07:50

学习了。。。。。
作者: 尘丶    时间: 2015-5-1 09:33

  1. @echo off
  2. set /a a=%random%%%10
  3. echo %a%
  4. set /a b=%random%%%9
  5. echo %b%
  6. set c=%a%
  7. set d=%b%
  8. set b=%c%
  9. set a=%d%
  10. echo %a%
  11. echo %b%
  12. pause
复制代码

作者: 当个IT不容易啊    时间: 2015-5-22 10:15

谢谢!   第一个批处理诞生
作者: Lornan    时间: 2015-5-26 21:41

本帖最后由 Lornan 于 2015-5-26 21:43 编辑
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. ::CODER BY Lornan POWERD BY iBAT 1.6
  4. set /p a=请输入第一个数字:
  5. set /p b=请输入第二个数字:
  6. echo.请按任意键继续&pause>nul
  7. cls
  8. echo.
  9. echo.你输入的a是%a%
  10. echo.你输入的b是%b%
  11. echo.按任意键开始交换a与b的值。
  12. echo.&pause>nul
  13. set c=%a%
  14. set a=%b%
  15. set b=%c%
  16. echo.交换完毕。按任意键查看。
  17. echo.&pause>nul
  18. cls
  19. echo.现在a的值是%a%,b的值是%b%.
  20. pause
复制代码
感觉应该没问题吧。最近C语言老师逼的。总是把C语言的东西用在批处理上来。。。
作者: 437153    时间: 2015-6-8 11:36

  1. set a=2
  2. set b=3
  3. echo a=%a% b=%b%
  4. echo 交换后
  5. set/a c=%a%*%b%
  6. set a=%b%
  7. set/a b=%c%/%a%
  8. echo a=%a% b=%b%
复制代码

作者: 437153    时间: 2015-6-8 11:40

回复 7# Batcher


    这是什么啊?完全看不懂啊!!
作者: impk    时间: 2019-8-26 15:23

  1. @echo off
  2. set a=2 && set b=3
  3. set /a b=%a% && set /a a=%b%
  4. echo %a% %b%
  5. pause
复制代码

作者: 唯尘    时间: 2022-10-27 10:50

@echo off
set a=2
set b=3
echo %a% %b%
set c=%a%
set a=%b%
set b=%c%
echo %a% %b%
pause>nul
作者: 772074834    时间: 2023-5-4 17:59

@echo off
set /P "a=输入变量a="
set /p "b=输入变量b="
set /a c=%a%
set /a a=%b%
set /a b=%c%
echo a=%a%
echo b=%b%
pause
作者: LTSC1809    时间: 2023-5-4 19:13

回复 1# wxcute
  1. set a=2
  2. set b=3
  3. set bf=b
  4. set af=a
  5. set a=bf
  6. set b=af
复制代码





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