Написать функцию, вычисляющую значение арифметического выражения, заданного стро-кой вида «<цифра>±<цифра>± - 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;
}

Объяснение кода листинга программы

В данном коде реализована функция вычисления значения арифметического выражения, заданного строкой. Список действий:

  1. В функции main():
    • Вводится строка 4+7-2-8
    • Вызывается функция calc()
    • Результат вычисления (в данном случае 17) выводится на экран
    • Программа ожидает ввода с клавиатуры
    • Завершается выполнение программы
  2. В функции calc():
    • Инициализируются переменные:
      • v (для хранения текущего числа),
      • num (для хранения промежуточного результата),
      • c (для хранения текущего символа).
    • Строка s передается в функцию get_num() для получения первого числа и обновления значения s.
    • Пока s не станет NULL (т.е. не закончится строка), выполняются следующие действия:
      • c присваивается текущий символ s.
      • Если s не является концом строки (т.е. s != NULL), то вызывается функция get_num() для получения следующего числа и обновления значения s.
      • Если s стал NULL (т.е. закончилась строка), то выполнение цикла прекращается.
      • В зависимости от значения c (плюс или минус) к num прибавляется или вычитается значение v.
    • Возвращается значение num.
  3. В функции get_num():
    • Инициализируются переменные:
      • v (для хранения числа),
      • n (для хранения количества прочитанных символов).
    • С помощью функции sscanf() из стандартной библиотеки происходит попытка чтения числа из строки.
    • Если чтение числа прошло успешно (т.е. sscanf() вернул 1), то значение v присваивается переменной val, а p увеличивается на n (что позволяет пропустить прочитанное число при следующем чтении).
    • Если чтение числа не прошло успешно (т.е. sscanf() вернул 0), то p становится NULL (что означает конец строки).
    • Возвращается значение p. Таким образом, данный код позволяет вычислить значение арифметического выражения, заданного строкой.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы