Написать функцию, вычисляющую значение арифметического выражения, заданного стро-кой вида «<цифра>±<цифра>± - 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. Таким образом, данный код позволяет вычислить значение арифметического выражения, заданного строкой.
- Инициализируются переменные:
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д