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