Сложение, вычитание и умножение
Рассмотрим следующий упрощенный пример. Пусть в исходном выражении допустимы числа, знаки сложения, вычитания и умножения.
Прибегнем к следующему обобщению: любое одиночное число можно считать произведением из одного множителя.
Таким образом исходное выражение можно рассматривать как сумму или разность произведений, независимо от того, сколько чисел входят в такие произведения.
Одним из основных элементов алгоритма станет функция 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