Написать функцию, вычисляющую значение арифметического выражения, заданного стро-кой вида «<цифра>±<цифра>± - C (СИ)
Формулировка задачи:
Написать функцию, вычисляющую значение арифметического выражения, заданного строкой вида «<цифра>±<цифра>±...±<цифра>», где на месте знака операции «±» находится символ «+» или «−» (например, «4+7−2−8»). Функция возвращает значение данного выражения (целое число).
Решение задачи: «Написать функцию, вычисляющую значение арифметического выражения, заданного стро-кой вида «<цифра>±<цифра>±»
textual
Листинг программы
#include <stdio.h>
static const char* get_num(const char* p, int* val);
int calc(const char* s);
int main(void){
char s[] = "4+7-2-8";
printf("res: %d\n", calc(s));
getchar();
return 0;
}
int calc(const char* s){
int v, num;
char c;
s = get_num(s, &num);
while(s != NULL){
c = *s;
if((s = get_num(s + 1, &v)) == NULL)
break;
switch(c){
case '+':
num += v;
break;
case '-':
num -= v;
break;
}
}
return num;
}
static const char* get_num(const char* p, int* val){
int v, n = 0;
if(sscanf(p, "%d%n", &v, &n) == 1){
*val = v;
p += n;
} else
p = NULL;
return p;
}
Объяснение кода листинга программы
В данном коде реализована функция вычисления значения арифметического выражения, заданного строкой. Список действий:
- В функции main():
- Вводится строка
4+7-2-8 - Вызывается функция calc()
- Результат вычисления (в данном случае 17) выводится на экран
- Программа ожидает ввода с клавиатуры
- Завершается выполнение программы
- Вводится строка
- В функции calc():
- Инициализируются переменные:
- v (для хранения текущего числа),
- num (для хранения промежуточного результата),
- c (для хранения текущего символа).
- Строка s передается в функцию get_num() для получения первого числа и обновления значения s.
- Пока s не станет NULL (т.е. не закончится строка), выполняются следующие действия:
- c присваивается текущий символ s.
- Если s не является концом строки (т.е. s != NULL), то вызывается функция get_num() для получения следующего числа и обновления значения s.
- Если s стал NULL (т.е. закончилась строка), то выполнение цикла прекращается.
- В зависимости от значения c (плюс или минус) к num прибавляется или вычитается значение v.
- Возвращается значение num.
- Инициализируются переменные:
- В функции get_num():
- Инициализируются переменные:
- v (для хранения числа),
- n (для хранения количества прочитанных символов).
- С помощью функции sscanf() из стандартной библиотеки происходит попытка чтения числа из строки.
- Если чтение числа прошло успешно (т.е. sscanf() вернул 1), то значение v присваивается переменной val, а p увеличивается на n (что позволяет пропустить прочитанное число при следующем чтении).
- Если чтение числа не прошло успешно (т.е. sscanf() вернул 0), то p становится NULL (что означает конец строки).
- Возвращается значение p. Таким образом, данный код позволяет вычислить значение арифметического выражения, заданного строкой.
- Инициализируются переменные: