Алгоритм для чтения формулы на C++.
От: KosinovMV  
Дата: 02.10.03 12:52
Оценка:
Алгоритм для чтения формулы на C++.
Не подскажет ли кто-нибудь алгоритм для чтения формулы из строки.
В формуле должны быть:
скобки
переменные
+,*,-,/
sin,co,tg и тд
Как всё это прочитать, а потом почитать.

08.10.03 20:31: Перенесено модератором из 'C/C++' — ПК
Re: Алгоритм для чтения формулы на C++.
От: Андрей Россия  
Дата: 02.10.03 12:55
Оценка:
Здравствуйте, KosinovMV, Вы писали:

skip

Может boost::spirit тебе поможет?
Re: Алгоритм для чтения формулы на C++.
От: ChiRus  
Дата: 02.10.03 13:03
Оценка:
Здравствуйте, 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;
}

Решение не очень, т.к. воссоздаю по памяти.
Re: Алгоритм для чтения формулы на C++.
От: peterbes Россия  
Дата: 02.10.03 13:09
Оценка:
Здравствуйте, KosinovMV, Вы писали:

KMV>Алгоритм для чтения формулы на C++.


Уже обсуждалось
http://www.rsdn.ru/Forum/Message.aspx?mid=317128
Автор: Jakop
Дата: 07.07.03

http://www.rsdn.ru/Forum/Message.aspx?mid=355049
Автор: Kluev
Дата: 15.08.03
Re: Алгоритм для чтения формулы на C++.
От: Аноним  
Дата: 02.10.03 13:29
Оценка: +1
Здравствуйте, KosinovMV, Вы писали:

KMV>Алгоритм для чтения формулы на C++.

KMV>Не подскажет ли кто-нибудь алгоритм для чтения формулы из строки.
KMV>В формуле должны быть:
KMV>скобки
KMV>переменные
KMV>+,*,-,/
KMV>sin,co,tg и тд
KMV>Как всё это прочитать, а потом почитать.

В двух словах -- можно построить дерево, в узлах которого операции, а в листьях -- операнды. А потом вычислить его, идя от листьев к вершине. Т.е., например, выражение (2+6)*9 будет выглядеть так:


        *
      /  \ 
     +    \
   /  \    \           
  /    \    \
 2      6    9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.