Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Ответить
Настройки темы
CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:07, 26-04-2013

 

Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:53, 26-04-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Anonymоus:
В bat нету разграничения по типам переменных. Всё зависит от того, как вы с ними работаете. Математические операции над значением переменной можно проводить с помощью Set /A (обратитесь к встроенной справке за подробностями), если одно или все значения - нечисловые - они игнорируются (считаются нулём). Принудительно указать тип числа для Set /A можно добавив перед ним 0x (для шестнадцатеричных) или 0 (для восьмеричных). »
Ммм, тогда не ясно, как быть в таком случае. Есть задача - определить факториал введенного с клавиатуры числа. В самой программе для этого нужно использовать 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, а предыдущую наоборот закомментировать, то все прекрасно получается.

Отправлено: 16:02, 26-04-2013 | #3


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


Работающий вариант. Я постарался прокомментировать код, но если что непонятно будет - спрашивайте.
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:40, 26-04-2013 | #4


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Anonymоus:
Echo %Value%|Findstr /R "[0-9]">Nul|| »
Огромное спасибо! Все понял кроме этой строки. Тут проверяется на то, число ли это введено?

Отправлено: 16:46, 26-04-2013 | #5


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


Цитата kelevara:
Тут проверяется на то, число ли это введено? »
Скорее на то, есть ли во введённых данных хоть одна цифра. Если цифр нету, выводит ошибку. Но у этого подхода есть и свой недостаток - он отловит во входящих данных строку вида "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)
Теперь любое не-число вызовет появление ошибки.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:51, 26-04-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Anonymоus:
Код: Выделить весь код
Echo %Value%|Findstr /R "[^0-9]">Nul||(…)
If %Value% LSS 0 (Echo Error: negative value&Pause&Exit)
»
А минус дойдёт теперь до проверки «If %Value% LSS 0 …»?
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:52, 26-04-2013 | #7


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


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)
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:55, 26-04-2013 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Преобразование строки в простое число CMD/BAT

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] CMD/BAT - С помощью bat-ника найти и удалить текст в файле InVariable Скриптовые языки администрирования Windows 4 22-05-2015 20:06
CMD/BAT - [решено] Batch файл (.bat, .cmd) - как сгенерировать произвольное число от 1 до 10? ANR Скриптовые языки администрирования Windows 9 26-03-2013 10:02
Delphi - [решено] Pascal, разделение строки на число и символ paul_8 Программирование и базы данных 8 29-01-2013 13:41
CMD/BAT - [решено] Пакетное преобразование данных с помощью cmd Tosyk Скриптовые языки администрирования Windows 22 26-11-2010 14:13
VB.NET | Превращение строки в число и конверсия типов mrcnn Программирование и базы данных 3 16-03-2007 11:40




 
Переход