Форум программистов, компьютерный форум, киберфорум
JavaScript: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/55: Рейтинг темы: голосов - 55, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 236

Вычислить значение арифметического выражения, введённого в виде строки.

19.07.2018, 20:16. Показов 11139. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно вернуть значения арифметического выражения введённого в виде строки.
Объясните, пожалуйста,
1. Почему при вводе в x1 и x2 cодержится null и как это исправить?
2. Как записать паттерн для арифметического выражения (+,-,*,/)?

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <meta charset="utf-8" />  
</head>
<body>
 
    <input id="inp" />
    <input id="b" type="button" value="Вычислить" onclick="f1()"/>
 
     <script>
 
        function f1() {
     var pattern1 = /\d{1-5}/; 
     var pattern2 = /\d{1-5}/g;
     var patternop = /[+]/;
     var str; 
     var op;
     var x1;
     var x2;
           
    str = document.getElementById("inp").value; // сохранение введённого выражения в str
    x1 = str.match(pattern1); //сохранение первого числа в x1
    x2 = str.match(pattern2); //сохранение второго числа в x2
    op = patternop.exec(str); //сохранение знака операции
            
    if (op == '+')
        alert(x1 + x2);
 
    alert(op);
    alert(x1);
    alert(x2);
    alert(str);
    }
 
    </script>
 
</body>
</html>
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.07.2018, 20:16
Ответы с готовыми решениями:

Вычислить значение арифметического выражения, заданного в виде строки
с клавиатуры вводиться строка типа: &quot;(7+1)*23-1&quot; в одну строку, нужно определить значение арифметического выражения

Вычисление арифметического выражения, введённого в виде символьной строки
Напишите программу, которая вычисляет арифметическое выражение, введённое в виде символьной строки. Выражение содержит только целые числа,...

Калькулятор: вычисление арифметического выражения, введённого в виде символьной строки
Привет,не понимаю в чём смысл задачи) Питон же сам считает) Напишите программу, которая вычисляет арифметическое выражение,...

9
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
19.07.2018, 20:58
Правильно будет так /^\d{1,5}$/
Цитата Сообщение от Ivanjs Посмотреть сообщение
/\d{1-5}/
Анологично /^\d{1,5}$/g
Цитата Сообщение от Ivanjs Посмотреть сообщение
/\d{1-5}/g
Все что касается самого языка надо экранировать Я имею ввиду PCRE - мини язык желательно даже в наборе символов
/[\+]/
Цитата Сообщение от Ivanjs Посмотреть сообщение
/[+]/
Цитата Сообщение от Ivanjs Посмотреть сообщение
2. Как записать паттерн для арифметического выражения (+,-,*,/)?
JavaScript
1
var patternop = /^(([\+])|([\-])|([\*])|([\/])){1}$/;
Добавлено через 6 минут
Только вот я не могу понять что ты хочешь сделать ты получаешь доступ к значению inp, тем более ты фильтруешь его только на цифры от одного до пяти где нет никаких знаков.
После ты создаешь переменную куда указываешь один из вариантов либо + либо - либо * либо /,
Потом ты используешь конструкции где op сравниваешь с +. Так вот откуда у тебя этот + взялся????
Если ты хочешь там видеть + | - | * | / то создаешь в html select либо же инпут и используешь шаблон которую я тебе показал.
var patternop = /^(([\+])|([\-])|([\*])|([\/])){1}$/;

И только потом ты используешь конструкции и желательно switch().

У тебя скрипт не понятный, определись что ты вообще хочешь сделать
1
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 236
19.07.2018, 22:35  [ТС]
Объясните, пожалуйста подробнее что вы имели ввиду
Цитата Сообщение от maxoun Посмотреть сообщение
Я имею ввиду PCRE - мини язык желательно даже в наборе символов
и для чего для чего ^ и {1}
Цитата Сообщение от maxoun Посмотреть сообщение
var patternop = /^(([\+])|([\-])|([\*])|([\/])){1}$/;
Добавлено через 16 минут
программу переписал подробнее, но всё равно не ясно почему в иксах null
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <meta charset="utf-8" />  
</head>
<body>
 
    <input id="inp" />
    <input id="b" type="button" value="Вычислить" onclick="f1()"/>
 
     <script>
 
        function f1() {
     var pattern1 = /\d\+/; //поиск первого совпадения для числа из нескольких цифр
     var pattern2 = /\d\+\$/; //поиск последнего совпадения для числа из нескольких цифр
     var patternop = /^(([\+])|([\-])|([\*])|([\/])){1}$/;
     var str; 
     var op;
     var x1;
     var x2;
           
    str = document.getElementById("inp").value; // сохранение введённого выражения в str
    x1 = str.match(pattern1); //сохранение первого числа в x1
    x2 = str.match(pattern2); //сохранение второго числа в x2
    op = patternop.match(str); //сохранение знака операции
            
    if (op == '+')              //вывод соответствующего выражения
        alert(x1 + x2);
    if (op == '-')
        alert(x1 - x2);
    if (op == '*')
        alert(x1 * x2);
    if (op == '/')
        alert(x1 / x2);
 
    alert(op);
    alert(x1);  //null
    alert(x2);  //null
    alert(str);
    }
 
    </script>
 
</body>
</html>
0
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
19.07.2018, 22:48
Цитата Сообщение от Ivanjs Посмотреть сообщение
и для чего для чего ^ и {1}
^ - это якорь указывает позицию, а именно начало, если она присутствует в в наборе, то отрицает.
{} - квантификатор доступа, определяет количество повторений, это очень удобно когда нужно указывать точное совпадение, нежели чем + ? *
Цитата Сообщение от Ivanjs Посмотреть сообщение
программу переписал подробнее, но всё равно не ясно почему в иксах null
Потому что + * / - берутся с воздуха, JS не понимает откуда они берутся, ты указываешь конструкцию говоришь если op == + то сложить, но откуда ты берешь +??? JS тебя не понимает, поэтому в html пропиши input либо же select и дай им значения + - / * и в js настрой как следует.
1
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 236
19.07.2018, 23:00  [ТС]
Цитата Сообщение от maxoun Посмотреть сообщение
Потому что + * / - берутся с воздуха, JS не понимает откуда они берутся, ты указываешь конструкцию говоришь если op == + то сложить, но откуда ты берешь +??? JS тебя не понимает, поэтому в html пропиши input либо же select и дай им значения + - / * и в js настрой как следует
Цитата Сообщение от maxoun Посмотреть сообщение
но откуда ты берешь +???
'+' из input атрибута value
Цитата Сообщение от Ivanjs Посмотреть сообщение
str = document.getElementById("inp").value;
Добавлено через 5 минут
Цитата Сообщение от Ivanjs Посмотреть сообщение
откуда они берутся
В input выражение нужно ввести
0
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
19.07.2018, 23:35
Лучший ответ Сообщение было отмечено Ivanjs как решение

Решение

Цитата Сообщение от Ivanjs Посмотреть сообщение
'+' из input атрибута value
я не заметил что ты изменил регулярку.
Даже если так то неправильно, посмотри внимательно.
У тебя есть вот регулярка \d\+ но давай измени \d{1,5}[\+]{1} который говорит что там должен быть обязательно число а также символ +
2.Ты получаешь к нему доступ к примеру мы написали там 10+ ты получил 10+ через .value

Потом в конструкции по шаблоны где один выбор +|-|/|* ты его сравниваешь с 10+
это получается + == 10+ и тебе выдадут null

Ты не правильно устроил логику, либо же не правильно построил задачу.

Добавлено через 25 минут
Ivanjs, Вот держи.
HTML5
1
2
3
4
5
6
7
8
9
10
<input id="inp" />
    <select id="sel">
        <option value='+'>+
        <option value='-'>-
        <option value='*'>*
        <option value='/'>/
    </select>
    <input id="b" type="button" value="Вычислить" onclick="f1()"/>
 
     <script>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
function f1() {
            const inp = window.document.getElementById("inp").value.match(/^\d{1,5}$/);
            const sel = window.document.getElementById("sel").value;
            var sum;
 
            switch(sel) {
                case '+':   sum = ((Number(inp) + Number(inp))); window.alert(sum.toFixed(2)); break;
                case '-':   sum = ((Number(inp) - Number(inp))); window.alert(sum.toFixed(2)); break;
                case '*':   sum = ((Number(inp) * Number(inp))); window.alert(sum.toFixed(2)); break;
                case '/':   sum = ((Number(inp) / Number(inp))); window.alert(sum.toFixed(2)); break;
                default: window.alert('Неправильный параметр'); break;
            }
        }
1
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 236
20.07.2018, 09:08  [ТС]
Спасибо.
Немного упростил программу. Теперь достаточно ввести одну цифру и знак операции. В x1 теперь значение, но результат сложения x1+x1 null.
Наверное не в регулярке проблема.

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <meta charset="utf-8" />
</head>
<body>
    <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <meta charset="utf-8" />  
</head>
<body>
 
    <input id="inp" />
    <input id="b" type="button" value="Вычислить" onclick="f1()"/>
 
     <script>
 
        function f1() {
     var pattern1 = /\d/; //поиск первого совпадения для числа из нескольких цифр
    // var pattern2 = /\d/; //поиск последнего совпадения для числа из нескольких цифр
     var patternop = /^(([\+])|([\-])|([\*])|([\/])){1}$/;
     var str; 
     var op;
     var x1;
     var x2;
           
    str = document.getElementById("inp").value; // сохранение введённого выражения в str
    x1 = str.match(pattern1); //сохранение первого числа в x1
   // x2 = str.match(pattern2); //сохранение второго числа в x2
    op = str.match(patternop); //сохранение знака операции
            
    if (op == '+')              //вывод соответствующего выражения
        alert(x1 + x1);
    if (op == '-')
        alert(x1 - x1);
    if (op == '*')
        alert(x1 * x1);
    if (op == '/')
        alert(x1 / x1);
 
    alert(op);
    alert(x1);  //null
   // alert(x2);  //null
    alert(str);
    }
 
    </script>
</body>
</html>
0
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
20.07.2018, 09:19
Цитата Сообщение от Ivanjs Посмотреть сообщение
Наверное не в регулярке проблема.
Опять ты за свое старое.
Я же тебе уже третий раз говорю.
1.Ты получаешь доступ к inp , куда ставляешь шаблон только цифры.
2.ты создаешь переменную op и присваиваешь ей шаблон , но ты это присваиваешь пустой переменной.
3.Самое интересное ты хочешь ее сравнить с '+' откуда ты берешь +???
Даже если у тебя будет такой шаблон \d[\+]{1}
то op == '+' ничего не даст , потому что op берется из воздуха.

Ты не правильно мыслишь в этой положении, я тебе дал рабочий скрипт, твоя задача разобрать ее как следует.
1
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 236
20.07.2018, 10:11  [ТС]
Цитата Сообщение от maxoun Посмотреть сообщение
ты хочешь ее сравнить с '+' откуда ты берешь +???
например при вводе 1+
в x1 значение 1, но
1. Это строчное значение, т.к. результат alert(x1+x1) -> 11 => нужно использовать другой способ перевода из строки в число
2. Не реагирует на if(patternon=='+') => нужно изменить паттерн


Готово
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <meta charset="utf-8" />  
</head>
<body>
 
    <input id="inp" />
    <input id="b" type="button" value="Вычислить" onclick="f1()"/>
 
     <script>
 
        function f1() {
     var pattern1 = /\d+/; //поиск первого совпадения для числа из нескольких цифр
     var pattern2 = /[\d]+$/; //поиск последнего совпадения для числа из нескольких цифр
     var patternop = /[+-/*\/]/
     var str; 
     var op;
     var x1;
     var x2;       
     str = document.getElementById("inp").value; // сохранение введённого выражения в str
     x1 = Number(str.match(pattern1));
     x2 = Number(str.match(pattern2));
     op = str.match(patternop);                  //сохранение знака операции
            
    if (op == "+")                              //вывод соответствующего выражения
        alert(x1 + x2);
    if (op == '-')
        alert(x1 - x2);
    if (op == '*')
        alert(x1 * x2);
    if (op == '/')
        alert(x1 / x2);
 
    alert(op);
    alert(x1);  //null
    alert(x2);  //null
    alert(str);
    }
 
    </script>
</body>
</html>
0
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
20.07.2018, 11:02
Цитата Сообщение от Ivanjs Посмотреть сообщение
например при вводе 1+
Нет, как ты не понимаешь блин.
Ты получаешь доступ к inp, где проверяешь его по шаблону \d{1,3}\+{1} к примеру сюда подойдет 10+
Потом ты создаешь переменную op, и присваиваешь туда шаблон, темболее неправильно написанный шаблон, этот шаблон ты берешь с воздуха.
и в конце ты пытаешься сравнить op == '+' не получится это эквиваленто 10+ == '+' даже если ты будешь использовать indexOf() сравнить ты не сможешь, потому что не правильно построена схема задачи.
Простыми словами это тупость. потому что чтобы получить доступ + / * - нужно его где то определить и только тогда присвоить шаблон и сравнивать.

Для преоброзования используется Number то есть строки в целый тип.
Тем более в alert чтобы сложить используется внутренняя скобка alert((x1 + x2)).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.07.2018, 11:02
Помогаю со студенческими работами здесь

Найти значение арифметического выражения, заданного в виде строки
Помогите пожалуйста! Ввести с клавиатуры строку, которая содержит арифметическое выражение вида a+b+c.(например 10+2+1). Найти значение...

Вычислить значение выражения, заданного в виде строки
Здравствуйте, есть строка которая в себе содержит данные вот пример str=&quot;/254+523-42323/65425*75323*&quot; мне собственно нужно получить...

Рекурсия: вычислить значение логического выражения, заданного в виде строки
Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим образом («T» — True, «F» — False): ...

Вычисление арифметического выражения заданного в виде строки
Собственно вопрос в названии: возможно ли преобразовать строку с оператором в оператор? string s = '+';

Вывести результат вычисления арифметического выражения, представленного в виде строки.
1. Дана строка, изображающая арифметическое выражение вида «&lt;цифра&gt;±&lt;цифра&gt;±… ±&lt;цифра&gt;», где на месте знака операции «±» находится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru