Сложение, вычитание и умножение

Рассмотрим следующий упрощенный пример. Пусть в исходном выражении допустимы числа, знаки сложения, вычитания и умножения.

Прибегнем к следующему обобщению: любое одиночное число можно считать произведением из одного множителя.

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

Одним из основных элементов алгоритма станет функция calc_mult(), которая будет вычислять такие элементарные произведения и передавать их для обработки в функцию eveluate_expression()

int calc_mult() { // пусть до вызова этой функции текущей позицией в исходном выражении // является "до первого числа произведения" get_next_lexem(); // получим число int z = current_lexem_value; // в переменной z будем накапливать произведение, пока она равна первому числу get_next_lexem(); // получим знак, который следует за числом // если это не будет знак умножения, то нужно вернуть z в качестве ответа // если знаки умножения все-таки есть, то нужно их все обработать while (current_lexem_type == LT_MULT) { get_next_lexem(); z = z * current_lexem_value; get_next_lexem(); } return (z); }

Само собой разумеется, что до этого внесены изменения в функцию get_next_lexem(), чтобы она могла распознавать тип LT_MULT.

Содержание функции eveluate_expression() при этом сильно упростится.

int evaluate_expression() { int current_result = calc_mult(); // корректное выражение сразу начинается с числа или произведения, // поэтому для вычисления первого слагаемого можно сразу использовать calc_mult() // обратите внимание, что calc_mult() завершается, оставляя текущую лексему // равной знаку, который находится после вычисленного произведения // поэтому цикл сразу будет проверять знак while (current_lexem_type != LT_END) { // если текущая лексема не конец строки, значит это знак плюс или минус // знака умножения тут быть не может, все знаки умножения "проглатывает" // функция calc_mult() if (current_lexem_type == LT_PLUS) { current_result = current_result + calc_mult(); } else { current_result = current_result - calc_mult(); } } return (current_result); }
Последнее изменение: Суббота, 15 Август 2020, 02:35