Другие языки программирования и технологии

У меня есть char temp[100] = "2^2+3*2"; Теперь, мне нужно увидеть на экране результат этого уравнения (2^2+3*2).

Маrat Kyrishbai
Маrat Kyrishbai
72
При отсутствии скобок и операторов деления это выглядит так:

#include <stdio.h>
#include <stdlib.h>
int powq(int a,int k)
{
int b=1; while(k) { if(k%2) b*=a; k/=2,a*=a; } return b;
}
void main()
{
char temp[100]="2^2+3*2";
char *y,t[100],d[100];
int j,k,n,*c,*p;
for(k=j=0;temp[j];j++) if(temp[j]!=32) temp[k++]=temp[j]; temp[k]=0;
for(n=k=j=0;temp[j];j++) if(unsigned(temp[j]-48)<10) t[j]=temp[j],d[j]=32; else t[j]=32,d[j]=temp[j],n++; d[j]=t[j]=0;
for(k=j=0;d[j];j++) if(d[j]!=32) d[k++]=d[j]; d[k]=0;
c=(int*)malloc(++n*sizeof(int));
for(y=&t[0],j=0;j-n;) for(c[j++]=atoi(y++);*y!=32;y++);
p=(int*)malloc(--n*sizeof(int));
do { for(k=j=0;j-n;j++) if(d[j] & 16) { k=1,c[j]=powq(c[j],c[j+1]); break; } for(;j++-n;)d[j-1]=d[j],c[j]=c[j+1]; } while(k);
do { for(k=j=0;j-n;j++) if((d[j] & 33)==32) { k=1,c[j]=c[j]*c[j+1]; break; } for(;j++-n;)d[j-1]=d[j],c[j]=c[j+1]; } while(k);
do { for(k=j=0;j-n;j++) if(d[j] & 1) { k=1,c[j]=c[j]+((d[j] & 2)-1)*c[j+1]; break; } for(;j++-n;)d[j-1]=d[j],c[j]=c[j+1]; } while(k);
printf("%s=%d\n",temp,c[0]);
delete [] c,p;
return;
}
ВС
Валерий Сазонов
76 473
Лучший ответ
Придется писать анализатор выражения и вычислять его. Никакой "стандартной" функции для разбора таких строковых выражений нет.

Анализатор пишется сравнительно легко: ищется самый последний оператор (+ в данном случае) , разбирается всё, что слева, потом всё, что справа, таким же образом. Если оператора нет, есть просто число, и оно возвращается. В упрощенном случае 1*2+3:
1*2+3 -> + (1*2), (3)
1*2 -> * (1), (2)
1 -> 1
2 -> 2
3 -> 3

1*2 -> 2
1*2+3 -> 5

UPD: Да, и это не уравнение, а выражение.
А так:

double result = temp[100]
cout << result << endl;

Похожие вопросы