批处理之家's Archiver

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 行不?

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

hxf0759 发表于 2008-11-26 16:27

看我这个行不行

[code]@echo off
echo 请输第一个数字
set/p a=
echo a=%a%

echo 请输第二个数字
set/p b=
echo b=%b%

echo 开始转换 pause

set /a c=%a%
set /a a=%b%
set /a b=%c%

echo 转换结束
echo a=%a%
echo b=%b%[/code]

[[i] 本帖最后由 hxf0759 于 2008-11-27 09:21 编辑 [/i]]

pusofalse 发表于 2008-11-26 17:59

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

BBCC 发表于 2008-11-26 19:33

[quote]原帖由 [i]qq641255849[/i] 于 2008-11-26 13:16 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=15962&ptid=2637][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
set /a 行不?

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

原因是没在windows下,没法测试...

pusofalse 发表于 2008-11-28 21:38

[code]@echo off
Set "a=%random%" & set "b=%random%"
echo %a% %b%
set /a b=%a%,a=%b%
echo %a% %b%
pause
Set "a=%random%" & set "b=%random%"
echo %a% %b%
set /a b=a,a=b
echo %a% %b%
pause[/code]希望可以通过如上代码了解到set /a的特性。

Batcher 发表于 2008-11-29 18:34

[code]@echo off
set a=2
set b=3
set /a a=b+(b=a)*0
echo %a%
echo %b%
pause[/code]

nomyself 发表于 2008-12-4 18:28

通过变量交换比较常见,交换的方法很多,加减,乘除,异或.......[code]::加减交换
@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[/code][code]::乘除交换
@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[/code]

jsj30651 发表于 2008-12-4 18:40

[code]@echo off
set a=%random% & set b=%random%
echo a=%a%
echo b=%b%
echo.
set a=%b% & set b=%a%
echo a=%a%
echo b=%b%
pause[/code]利用批处理执行命令时候的预处理来交换变量

[[i] 本帖最后由 jsj30651 于 2008-12-4 18:50 编辑 [/i]]

rat 发表于 2008-12-4 18:51

[quote]::乘除交换
@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[/quote]

如果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楼 的帖子

[code]@echo off
set a=2
set b=3
echo.------------
set tt=a
set a=b
set b=tt
echo.ok[/code]

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指令

[code]@echo off
set a=2
set b=3
(echo a100&echo mov ax,%a%&echo mov bx,%b%&more /e +5 "%~f0")|debug|find /v ""
pause&exit/b
xchg ax,bx

t=100 3
q[/code]

qxhonker 发表于 2009-3-5 16:03

[code]
@echo off
set /a a=5
set /a b=3
set /a a=%a%+%b%
set /a b=%a%-%b%
set /a a=%a%-%b%
echo %a%
echo %b%
pause
[/code]

qxhonker 发表于 2009-3-5 16:08

刚发现我跟9楼的一样  
同时佩服8楼  这个代码最好

qxhonker 发表于 2009-3-5 16:14

根据8楼的启发   发现这样也行[code]@echo off
set /a a=5
set /a b=3
for /l %%i in (1,1,1) do set a=%b%&set b=%a%
echo %a%
echo %b%
pause[/code]跟变量延迟一个道理  吼吼  能不能给我点分呀

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

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

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

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

[code]@echo off
set a=2
set b=3
set a=%b% & set b=%a%
echo a变为%a% b变为%b%
pause[/code]噢,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楼 的帖子

[code]Set "a=%random%" & set "b=%random%"
echo %a% %b%
set /a b=a,a=b
echo %a% %b%[/code]好像应该是set/a b=%a%,a=%b%吧,,好像少了%%号

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.