Выполнить арифметические действия в порядке следования - 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); }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяются переменные: i, res, y
- Устанавливается локальная настройка языка на русскую
- Проверяется, были ли введены аргументы командной строки. Если нет, выводится сообщение об ошибке и программа завершается.
- В переменную y записывается первый символ второго аргумента командной строки.
- Переменная res инициализируется значением переменной y.
- Выводится значение переменной res.
- Начинается цикл for, который проходит по всем символам второго аргумента командной строки, начиная со второго символа и заканчивая предпоследним.
- В каждой итерации цикла в переменную y записывается следующий символ.
- С помощью оператора switch выполняется проверка на какой оператор (‘+', '-', '*', '/') указывает текущий символ.
- В зависимости от результата проверки выполняется соответствующая арифметическая операция над переменной res.
- После каждой операции выводится значение переменной res.
- По завершении цикла выводится значение переменной res.
- Выводится значение первого аргумента командной строки и значение переменной res.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д