Выполнить арифметические действия в порядке следования - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нашел на форуме задачу, вычисляющую значение выражения в порядке следования действий, но не понимаю, как она работает. Необходимо добавить в код комментарии, либо написать более простой код. Задача: Подсчитать результат, выполняя арифметические операции в порядке их следования. (Выражение вводить с консоли) Например: Входные данные 5*3-9/3 Выходные данные 2 Код:
#include <stdio.h>
#include <ctype.h>
 
unsigned digits(int number) {
    return number ? (1 + digits(number / 10)) : 0;
}
 
float expr(const char str[]) {
    float res;
    int num;
    char cmd;
 
    if (sscanf(str, "%d", &num) != 1) {
        return 0;
    }
 
    str += digits(num);
    res = num;
 
    while (sscanf(str, "%c%d", &cmd, &num) == 2) {
        switch (cmd) {
            case '+':
                res += num;
                break;
            case '-':
                res -= num;
                break;
            case '*':
                res *= num;
                break;
            case '/':
                res /= num;
                break;
        }
        str += digits(num) + 1;
    }
 
    return res;
}
 
int main() {
    printf("%.2f", expr("5*3-9/3"));
 
    return 0;
}

Решение задачи: «Выполнить арифметические действия в порядке следования»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <locale.h>
 
int main(int argc, char * argv[])
{
    int i,res;
    char y;
            setlocale(LC_ALL,"");
    if ( argc==1 )
    {
        printf("Вы ничего не ввели");
        return 0;
    }
        y=argv[1][0];
        res=atoi(&y);
        printf("\nres = %d",res);
    for (i=1; i<strlen(argv[1])-1; ++i)
    {
        y=argv[1][i+1]; // в y записываем цифру, стоящую после знака
        switch (argv[1][i])
        {
            case '+':
                res += atoi(&y); // atoi переводит строку в число
                break;
            case '-':
                res -= atoi(&y);
                break;
            case '*':
                res *= atoi(&y);
                break;
            case '/':
                res /= atoi(&y);
                break;
        }
        printf("\nres = %d",res);
    }
printf("\n%s = %d",argv[1],res);
}

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

  1. Включаются необходимые заголовочные файлы
  2. Определяются переменные: i, res, y
  3. Устанавливается локальная настройка языка на русскую
  4. Проверяется, были ли введены аргументы командной строки. Если нет, выводится сообщение об ошибке и программа завершается.
  5. В переменную y записывается первый символ второго аргумента командной строки.
  6. Переменная res инициализируется значением переменной y.
  7. Выводится значение переменной res.
  8. Начинается цикл for, который проходит по всем символам второго аргумента командной строки, начиная со второго символа и заканчивая предпоследним.
  9. В каждой итерации цикла в переменную y записывается следующий символ.
  10. С помощью оператора switch выполняется проверка на какой оператор (‘+', '-', '*', '/') указывает текущий символ.
  11. В зависимости от результата проверки выполняется соответствующая арифметическая операция над переменной res.
  12. После каждой операции выводится значение переменной res.
  13. По завершении цикла выводится значение переменной res.
  14. Выводится значение первого аргумента командной строки и значение переменной res.

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


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

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

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