Выполнить арифметические действия в порядке следования - 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.