Вычисление выражения, заданного в виде строки - C (СИ)
Формулировка задачи:
Добрый день. Нужна помощь с задачкой:
Дано строку типа "X + Y", где X и Y - некоторые числа, + - операция, которую нужно над ними выполнить. Необходимо выделить из строки эти числа, знак операции и вывести результат суммирования. Перед и после "+" может стоять пробел.
Туплю на считывании:
хочу считать значение до +, получаю же "+7" вместо "1" (ввожу "1+7"), причем когда встречается в строке пробел - программа не работает. Помогите пожалуйста Вот что пробовал писать:char ryad[10]; char roz[]="+ -"; char*p1,*pr; for (p1=ryad;*p1!='+';p1++) gets(p1); puts(p1);
Решение задачи: «Вычисление выражения, заданного в виде строки»
textual
Листинг программы
#include <stdio.h> #include <string.h> int CalcStr(char *Str) { int i,l,a,a1,a2; char c,z; l=strlen(Str); a=0; for (i=0; i<l; i++) { c=Str[i]; if ((c <= '9') && (c >= '0')) a=10*a+(c-'0'); else if ((c=='+') || (c=='-') || (c=='*') || (c=='/')) { z=c; a1=a; a=0; } else if (c /= ' ') { printf("Bad symbol!\n"); return 0; } } a2=a; switch(z) { case '+': return a1+a2; case '-': return a1-a2; case '*': return a1*a2; case '/': return a1/a2; } } int main(int argc, char* argv[]) { char *Op="12-7"; printf("%s = %d\n",Op,CalcStr(Op)); return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы для работы с памятью и строками.
- Определяется функция
CalcStr
, которая принимает в качестве аргумента строку и выполняет вычисления, используя порядок операций. - В функции
CalcStr
объявляются переменные:i
- цикл для прохода по всем символам строки;l
- длина строки;a
- переменная для хранения промежуточных результатов вычислений;a1
иa2
- для сохранения первого и второго промежуточных результатов;c
- текущий символ строки;z
- символ операции.
- Вычисляется длина строки с помощью функции
strlen
. - Инициализируется переменная
a
равной 0. - Происходит проход по всем символам строки:
- В каждой итерации значение
c
присваивается текущему символу строки. - Если
c
является цифрой, то он добавляется кa
. - Если
c
является операцией, то сохраняется предыдущий результат вa1
,a
сбрасывается в 0 и сохраняется текущая операция вz
. - Если
c
не является операцией или цифрой, то проверяется, является ли он пробелом. Если это так, выводится сообщение об ошибке и возвращается 0.
- В каждой итерации значение
- После цикла
a2
присваивается значениеa
, и происходит проверкаz
с помощью оператораswitch
:- Если
z
равно '+', то возвращается суммаa1
иa2
. - Если
z
равно '-', то возвращается разностьa1
иa2
. - Если
z
равно '*', то возвращается произведениеa1
иa2
. - Если
z
равно '/', то возвращается частноеa1
иa2
.
- Если
- В функции
main
определяется строкаOp
со значением12-7
. - Вызывается функция
CalcStr
с аргументомOp
. - Результат вычислений выводится на экран с помощью функции
printf
. - Функция
main
возвращает 0, завершая работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д