CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Ответить
Аватара пользователя
kelevara

CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Сообщение kelevara »

Добрый день!

При вводе с клавиатуры значения переменной с помощью set /p полученное значение имеет тип Строка, правильно? Можно ли это значение сделать простым числом, чтобы в дальнейшем проводить над ним математические операции?
Аватара пользователя
kelevara

Re: CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Сообщение kelevara »

В bat нету разграничения по типам переменных. Всё зависит от того, как вы с ними работаете. Математические операции над значением переменной можно проводить с помощью Set /A (обратитесь к встроенной справке за подробностями), если одно или все значения - нечисловые - они игнорируются (считаются нулём). Принудительно указать тип числа для Set /A можно добавив перед ним 0x (для шестнадцатеричных) или 0 (для восьмеричных).
Аватара пользователя
kelevara

Re: CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Сообщение kelevara »

Цитата Anonymоus:



В bat нету разграничения по типам переменных. Всё зависит от того, как вы с ними работаете. Математические операции над значением переменной можно проводить с помощью Set /A (обратитесь к встроенной справке за подробностями), если одно или все значения - нечисловые - они игнорируются (считаются нулём). Принудительно указать тип числа для Set /A можно добавив перед ним 0x (для шестнадцатеричных) или 0 (для восьмеричных).
CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT




Ммм, тогда не ясно, как быть в таком случае. Есть задача - определить факториал введенного с клавиатуры числа. В самой программе для этого нужно использовать For /L. Также нужно предусмотреть проверки на ввод отрицательного числа и на ввод значений, превышающих максимально допустимые величины. Я написал вот такой скрипт:





Код:

Код: Выделить всё

::@echo off
set /a c = 1
set /p h = "Vvedite chislo, faktorial kotorogo neobhodimo vichislit: "
::set /a b = -12
if %b% lss 0 goto minus
for /L %%a in (1, 1, %b%) do set /a c = c * %%a
if %c% gtr 2147483647 goto mnogo
echo %c% 
:minus
echo vvedeno otricatelnoe chislo
goto vihod
:mnogo
echo previsheno ogranichenie
goto vihod
:vihod
pause

В таком вариант он не работает. А если раскомментировать строку ::set /a b = -12, а предыдущую наоборот закомментировать, то все прекрасно получается.
Аватара пользователя
Guest

Re: CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Сообщение Guest »

Работающий вариант. Я постарался прокомментировать код, но если что непонятно будет - спрашивайте.



Код:

Код: Выделить всё

@Echo Off
SetLocal EnableDelayedExpansion
:: Запрашиваем данные у юзера
Set /P Value=Enter a number:^> 
:: Проверка введённых данных
Echo %Value%|Findstr /R "[0-9]">Nul||(Echo Only numeric value accepted&Pause&Exit)
If %Value% LSS 0 (Echo Error: negative value&Pause&Exit)
If %Value% GEQ 2147483648 (Echo Error: out of acceptable range&Pause&Exit)
:: Считаем факториал. В связи с ограничениями арифметики в cmd, факториал считается до 16 включительно
Set Result=1
For /L %%A In (1,1,%Value%) Do (
	Set /A Result=!Result!*%%A
	If !Result! GEQ 2147483648 (Echo Error: variable overflow&Pause&Exit)
)
:: Отключаем расширенную обработку для вывода восклицательного знака
SetLocal DisableDelayedExpansion
Echo %Value%! = %Result%
Pause
Аватара пользователя
kelevara

Re: CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Сообщение kelevara »

Цитата Anonymоus:



Echo %Value%|Findstr /R "[0-9]">Nul||
CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT




Огромное спасибо! Все понял кроме этой строки. Тут проверяется на то, число ли это введено?
Аватара пользователя
Guest

Re: CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Сообщение Guest »

Цитата kelevara:



Тут проверяется на то, число ли это введено?
CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT




Скорее на то, есть ли во введённых данных хоть одна цифра. Если цифр нету, выводит ошибку. Но у этого подхода есть и свой недостаток - он отловит во входящих данных строку вида "fgsfds", но пропустит "fgs123fds"

Небольшое исправление, замените



Код:

Код: Выделить всё

Echo %Value%|Findstr /R "[0-9]">Nul||(Echo Only numeric value accepted&Pause&Exit)

на



Код:

Код: Выделить всё

Echo %Value%|Findstr /R "[^0-9]">Nul&&(Echo Only numeric value accepted&Pause&Exit)

Теперь любое не-число вызовет появление ошибки.
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Сообщение Iska »

Цитата Anonymоus:





Код:

Код: Выделить всё

Echo %Value%|Findstr /R "[^0-9]">Nul||(…)
If %Value% LSS 0 (Echo Error: negative value&Pause&Exit)

CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT




А минус дойдёт теперь до проверки «If %Value% LSS 0 …»?
Аватара пользователя
Guest

Re: CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Сообщение Guest »

Iska, вы правы. Стоит поменять очерёдность проверок на



Код:

Код: Выделить всё

:: Проверка введённых данных
If %Value% LSS 0 (Echo Error: negative value&Pause&Exit)
Echo %Value%|Findstr /R "[^0-9]">Nul&&(Echo Only numeric value accepted&Pause&Exit)
If %Value% GEQ 2147483648 (Echo Error: out of acceptable range&Pause&Exit)
Ответить

Вернуться в «Скриптовые языки администрирования Windows»