2016-03-16 2 views
0

Я в настоящее время застрял в задании для своего класса ОС, посвященного пакетному сценарию. Основная проблема, которую я испытываю, - написать функционал для цикла в программе, который точно проходит диапазон от 1 до 100 и вычисляет сумму через арифметическое выражение. %% переменная mod 5 + 3.Написание цикла в пакетном сценарии

Текущие результаты I «ве получать диапазоны от любого получения всего 0 в качестве ответа при запуске, или числа, которые увеличиваются на 3, например, 3, то 6, то 9 и т.д.

Здесь вы соответствующий раздел моего кода:

for /l %%i in (1, 1, 100) do (
set /a result = %%i %% 5 
set /a calctotal = %result% + 3 
) 
set /a average = %calctotal%/100 
echo %average% 
pause 
+2

Возможный дубликат [Windows Пакетная обработка файлов - Loops] (http://stackoverflow.com/questions/21183602/windows-batch-file- обрабатывающие петли) – SomethingDark

+0

@SomethingDark: Я видел эту проблему раньше - несколько дней назад - с тем же плохо выраженным расчетом. К сожалению, ваш номинантный «дубликат» - это ИМХО, слишком сложный для новичков - например, ';' нет необходимости, и вам не требуется delayedexpansion (в этом случае.) – Magoo

+0

@Magoo - '% calctotal%' инициализируется внутри кодового блока; как вам не нужно замедленное расширение? – SomethingDark

ответ

1
SET /a calctotal=0 
for /l %%i in (1, 1, 100) do (
set /a result = %%i %% 5 
set /a calctotal += result + 3 
) 
set /a average = %calctotal%/100 
echo %average% 

Проблема для меня - это интерпретация иона "рассчитать сумму через арифметическое выражение %% переменная mod 5 + 3"

Это значит the sum of (%%variable mod 5 + 3) или (the sum of (%%variable) mod 5 + 3 ??

Во всяком случае, есть некоторые проблемы с вашим кодом (ну, если бы не было, вы бы не спросить, не так ли?)

Во-первых, в «блок» (серия в скобки линий) любой %var% заменяется значением var во время обнаружения блока и не изменяется при выполнении блока. Классический способ справиться с этим - вызвать delayedexpansion.

Таким образом, в вашем коде, вы не выполнявших set /a calctotal = + 3 100 раз, а %result% был бы заменен его значением в начале цикла (предположительно неопределенном, следовательно, ничего)

Следующая проблема в том, что вам пытаются установить calctotal на последнее значение result - вы не , аккумулируя значения.

однако в этом случае, вы можете использовать set /a синтаксис, который работает на current значения переменных - если вы не ссылаться на них в качестве %var%.

set /a calctotal += result + 3 использует += для накопления значений. Вы также можете использовать set /a calctotal = calctotal + result + 3, что может быть более очевидным.

Я установил calctotal в ноль перед запуском на всякий случай, когда он установлен.

И без сомнения, вы могли бы устранить необходимость в result с помощью set /a calctotal += %%i %% 5 + 3

Смежные вопросы