Вычисление выражения, заданного в виде строки - 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, завершая работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д