2016-11-05 6 views
4

私はcollat​​z推測テスターをバッチでコード化しようとしています(数学のものです)。ファイルのポイントは、数値が偶数であるかどうか、および2で除算されているかどうかをテストすることです。数字が奇数の場合は、3を掛けて1を加算すると仮定します。これは何度も繰り返す必要があります。このファイルを試して実行するたびに、数字を入力できるようになり、「+今のところ予期しなかった」と表示されます。ここで私のエラーは何ですか?バッチ「予期しない」エラー

@echo off 
color f0 
title Collatz Conjecture Tester 
echo/ 
echo Enter the number you want to test. 
echo/ 
echo/ 
set /p number= 
:start 
set /a test=%number% %% 2 
if %test% EQU 0 ( 
    set /a number=%number% * 1/2 
) else (
    set /a number=(%number% * 3) + 1 
) 
echo/ 
echo Result: %number% 
timeout /t 1 >nul 
goto start 
+1

バッチ内のすべての数値は符号付き32ビット整数であることに注意してください。したがって、コードの最大入力は2147483647であり、コードの3n + 1部分でも整数オーバーフローが発生します。結果はマイナスになります。 – SomethingDark

答えて

2

SomethingDarkはすでに問題の根本的な原因を発見し、their answerで適切な解決策を示しました。

括弧とのトラブルを避けるために別の方法もなど&|^<<>>、のようないくつかの演算子は、引用符のペア内set /Aの式全体を囲むことである。

if %test% EQU 0 ( 
    set /A "number=%number% * 1/2" 
) else (
    set /A "number=(%number% * 3) + 1" 
) 

これを実行すると、適切なエスケープについて考える必要はありません。

オペレータ%は常にバッチファイルで%%のようにエスケープする必要があることに注意してください。
case delayed expansionでは、式が""の場合は^!、そうでない場合は^^!になるように、!演算子をエスケープする必要があります。

3

あなたがif文、forループ、または他のコードブロックの内部に括弧がある場合、それはバッチ通訳は、あなたがまだ行われていません知っているように、あなたが他のインナー閉じる括弧をエスケープすることが重要です。

else (
    set /a number=(%number% * 3 
) 
+ 1 

をそしてそれはあなたが早くelseを終了し、いくつかの理由のためにそこに+ 1を投げていると考えて:

は今、バッチは次のようにあなたのif文を読んでいます。これを回避するには、内側の閉じ括弧を^でエスケープします。

if %test% EQU 0 ( 
    set /a number=%number% * 1/2 
) else (
    set /a number=(%number% * 3^) + 1 
) 
関連する問題