Алгоритм для чтения формулы на C++.
Не подскажет ли кто-нибудь алгоритм для чтения формулы из строки.
В формуле должны быть:
скобки
переменные
+,*,-,/
sin,co,tg и тд
Как всё это прочитать, а потом почитать.
08.10.03 20:31: Перенесено модератором из 'C/C++' — ПК
Здравствуйте, KosinovMV, Вы писали:
skip
Может
boost::spirit тебе поможет?
Здравствуйте, KosinovMV, Вы писали:
KMV>Алгоритм для чтения формулы на C++.
KMV>Не подскажет ли кто-нибудь алгоритм для чтения формулы из строки.
KMV>В формуле должны быть:
KMV>скобки
KMV>переменные
KMV>+,*,-,/
KMV>sin,co,tg и тд
KMV>Как всё это прочитать, а потом почитать.
У меня была примерно такая же задача в университете.
Надо было проверить 2 выражения на равенство, при этом
могли встречаться любые арифметические выражения, а
также sin, cos, tg, ctg и т.д. и переменные X и Y.
Т.к. препод не слишком разбирался в программировании,
то он принял такое решение :
#include <iostream.h>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cmath>
using namespace std;
/////////////////////////////////////////
/////////////////////////////////////////
int main(int argc, char *argv[]){
int QWER[20];
char str1[255] = {0};
char *const pstr1 = str1;
char str2[255];
char *const pstr2 = str2;
int i = 0;
int j = 0;
int k = 0;
cin >> pstr1;
cin >> pstr2;
int len1 = strlen(str1);
int len2 = strlen(str2);
int iDES;
srand(rand());
FILE *fifo;
int a, b;
for (i = 0; i < 20; i++){
ofstream fo1("C:\\windows\\run1.vbs", ios::out);
ofstream fo2("C:\\windows\\run2.vbs", ios::out);
fo1 << "Dim fso, f\nSet fso = CreateObject(\"Scripting.FileSystemObject\")\nSet f = fso.OpenTextFile(\"C:\\windows\\out.txt\", 2, True)\n";
fo2 << "Dim fso, f\nSet fso = CreateObject(\"Scripting.FileSystemObject\")\nSet f = fso.OpenTextFile(\"C:\\windows\\out.txt\", 2, True)\n";
fo1 << "f.write ";
fo2 << "f.write ";
iDES = rand()/10;
for (j = 0; j <= len1; j++){
if (str1[j] == 'x'){
fo1 << iDES;
}
else {
fo1 << str1[j];
}
}
for (j = 0; j < len2; j++){
if (str2[j] == 'x'){
fo2 << iDES;
}
else {
fo2 << str2[j];
}
}
fo1 << "\nf.close" << endl;
fo2 << "\nf.close" << endl;
fo1.close();
fo2.close();
system("run1.vbs");
fifo = fopen("C:\\windows\\out.txt", "rt");
fscanf(fifo, "%d", &a);
fclose(fifo);
system("run2.vbs");
fifo = fopen("C:\\windows\\out.txt", "rt");
fscanf(fifo, "%d", &b);
fclose(fifo);
if (a == b) {
QWER[i] = 1;
}
else {
QWER[i] = 0;
}
}
remove("C:\\windows\\run1.vbs");
remove("C:\\windows\\run2.vbs");
remove("C:\\windows\\out.txt");
int z;
for (i = 0; i < 20; i++){
z += QWER[i];
}
cout << ((z == 20) ? "YES\n" : "NO\n") << endl;
printf("END PROGRAM");
getchar();
return 0;
}
Решение не очень, т.к. воссоздаю по памяти.
Здравствуйте, KosinovMV, Вы писали:
KMV>Алгоритм для чтения формулы на C++.
KMV>Не подскажет ли кто-нибудь алгоритм для чтения формулы из строки.
KMV>В формуле должны быть:
KMV>скобки
KMV>переменные
KMV>+,*,-,/
KMV>sin,co,tg и тд
KMV>Как всё это прочитать, а потом почитать.
В двух словах -- можно построить дерево, в узлах которого операции, а в листьях -- операнды. А потом вычислить его, идя от листьев к вершине. Т.е., например, выражение (2+6)*9 будет выглядеть так:
*
/ \
+ \
/ \ \
/ \ \
2 6 9