Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP математическое выражение в строке / 9 сообщений из 9, страница 1 из 1
31.07.2016, 22:17
    #39283544
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
Вариант с eval() есть, хотелось бы разобрать с помощью циклов и массивов и др.
например:
$n = '12*36+5/8-20';
...
Рейтинг: 0 / 0
31.07.2016, 23:06
    #39283557
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
Маша и,

пишите лексический и синтаксический анализатор
...
Рейтинг: 0 / 0
31.07.2016, 23:12
    #39283560
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
Маша и,

Поищите парсер математических выражений. Для PHP не припоминаю, но для си и дотнета попадались вроде. Алгоритм оттуда возьмёте, а уж код написать не сложно.
...
Рейтинг: 0 / 0
01.08.2016, 01:17
    #39283584
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
vkle, два дня и три ночи в поисках, ничего похожего даже близко. Поэтому я тут.
Вот сначала все загоняю в массив.
Как этот массив пересчитать, ума не приложу. Может вообще по-другому начать?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
// error_reporting(E_ALL);
$str = "12*36+5/8-20";

$array = null;

//цикл разбирает строку на числа и символы, и формирует в виде массива
for ($i=0; $i <= strlen($str); $i++)
{
    if ($str[$i] == '+' 
    or $str[$i] == '-' 
    or $str[$i] == '*' 
    or $str[$i] == '/'){
	  $array[] = substr($str, 0, $i);
	  $array[] = $str[$i];
	  $str = substr($str, $i+1);
	  $i = 0;
	} elseif ($i == strlen($str)) {                 //последнее число в выражении
	     $array[] = substr($str, 0, $i);
	}
}

echo '<pre>';
print_r($array);
...
Рейтинг: 0 / 0
01.08.2016, 01:43
    #39283585
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
Маша иvkle, два дня и три ночи в поисках, ничего похожего даже близко. Поэтому я тут.
Вот сначала все загоняю в массив.
Как этот массив пересчитать, ума не приложу. Может вообще по-другому начать?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
// error_reporting(E_ALL);
$str = "12*36+5/8-20";

$array = null;

//цикл разбирает строку на числа и символы, и формирует в виде массива
for ($i=0; $i <= strlen($str); $i++)
{
    if ($str[$i] == '+' 
    or $str[$i] == '-' 
    or $str[$i] == '*' 
    or $str[$i] == '/'){
	  $array[] = substr($str, 0, $i);
	  $array[] = $str[$i];
	  $str = substr($str, $i+1);
	  $i = 0;
	} elseif ($i == strlen($str)) {                 //последнее число в выражении
	     $array[] = substr($str, 0, $i);
	}
}

echo '<pre>';
print_r($array);


далее выполняю деление, но почему-то вот это не срабатывает,
не могу понять почему.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
for($i = 0; $i <= count($array); $i++) {
    if($array[$i] == '/') {
        $first = prev($array);
        $temp = next($array);
        $second = next($array);
        $res = $first/$second;
        echo $res;
    }
}



и почему вот так срабатывает, а в цикле нет?

Код: php
1.
2.
3.
4.
5.
$first = current($array);
$temp = next($array);
$second = next($array);
$res = $first*$second;
echo $res;
...
Рейтинг: 0 / 0
01.08.2016, 02:21
    #39283586
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
c последним понятно, а вот тут опять не работает, почему-то $res1 не попадает в цикл
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
for($i = 0; $i <= count($array); $i++) {
    if($temp == '/') {
        $first = prev($array);
        $temp = next($array);
        $second = next($array);
        $res1= $first/$second;
    } 
    $temp = next($array);
}

echo $res1;

for($i = 0; $i <= count($array); $i++) {
    if($temp == '*') {
        $first = prev($array);
        $res2 = $first*$res1;
    }
    $temp = next($array);
    var_dump($res2);

}
echo $res2;
...
Рейтинг: 0 / 0
01.08.2016, 02:31
    #39283587
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
Ну вот, вроде что-то считает, но теперь результат не пляшет :)

Код: php
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.
$str = "6*76+4/6-16"; // result 440.66

$array = null;

for ($i=0; $i <= strlen($str); $i++)
{
	if ($str[$i] == '+' 
    or $str[$i] == '-' 
    or $str[$i] == '*' 
    or $str[$i] == '/'){
		$array[] = substr($str, 0, $i);
		$array[] = $str[$i];
		$str = substr($str, $i+1);
		$i = 0;
	} elseif ($i == strlen($str)) { //нужно для последнего числа в выражении
			$array[] = substr($str, 0, $i);
	}
}
for($i = 0; $i <= count($array); $i++) {
    if($temp == '/') {
        $first = prev($array);
        $temp = next($array);
        $second = next($array);
        $res1= $first/$second;
    } 
    $temp = next($array);
}
reset($array);
for($i = 0; $i <= count($array); $i++) {
    if($temp == '*') {
        $first = prev($array);
        $res2 = $first*$res1;
    }
    $temp = next($array);
}
reset($array);
for($i = 0; $i <= count($array); $i++) {
    if($temp == '-') {
        $first = prev($array);
        $res3 = $first+$res2;
    }
    $temp = next($array);
}
reset($array);
for($i = 0; $i <= count($array); $i++) {
    if($temp == '+') {
        $first = prev($array);
        $res4 = $first-$res3;
    }
    $temp = next($array);
}
echo $res4;


получается 66, а должно быть 440.66
...
Рейтинг: 0 / 0
01.08.2016, 02:45
    #39283588
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
понятно что в данном примере не правильно приоритеты расставлены,
нужно как-то привести к виду (6 * 76) + (4 / 6) - 16
...
Рейтинг: 0 / 0
01.08.2016, 04:57
    #39283593
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP математическое выражение в строке
Маша и,
про приоритет операций рассказывают в начальных класса школы)
ну в чем проблема? анализируйте выражение. сначала вычисляйте то что в скобках, при этом, вначале умножение, потом деление, сложение и вычитание.

гуглить про Польскую нотацию. прямую и обратную. алгоритм там расписан на пальцах. реализаций куча.
все уже придумано.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP математическое выражение в строке / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]