Форум программистов, компьютерный форум CyberForum.ru

Парсер для математических выражений - C++

Восстановить пароль Регистрация
Другие темы раздела
SFML Ввод текста в переменную (sfml) http://www.cyberforum.ru/cpp-beginners/thread1493472.html
Всем привет!Как в sfml осуществить ввод текста в переменную?Заранее спасибо!
C++ Убрать/скрыть окно консоли Всем привет!Я пишу на notepad++,компилирую через командную строку.Как мне убрать консольное окно?Заранее благодарен! http://www.cyberforum.ru/cpp-beginners/thread1493471.html
C++ ReadProcessMemory медленно читает значение адреса
while (true) { if (isRun) { try { ReadProcessMemory(ProcessHandle, (void*)TimeAddress, &Time, sizeof(osuTime), NULL); std::cout << Time << std::endl; } catch (const std::exception&) {} }
ReadProcessMemory медленно читает значение адреса C++
while (true) { if (isRun) { try { ReadProcessMemory(ProcessHandle, (void*)TimeAddress, &Time, sizeof(osuTime), NULL); std::cout << Time << std::endl; } catch (const std::exception&) {} }
C++ Вычислить значения функции на заданном интервале http://www.cyberforum.ru/cpp-beginners/thread1493454.html
Написать программу вычисления функции y на заданном промежутке с шагом 0.2 и построить график функции y, причем y={e}^{-(x+0.8)} при х>3.61 y=1 при x\in \left y=0.5x при x<0
C++ Заполнить квадратную матрицу натуральными числами по спирали Составить программу, которая заполняет квадратную матрицу порядка n натуральными числами 1, 2, 3, …, n2, записывая их в нее «по спирали» против часовой стрелки. подробнее

Показать сообщение отдельно
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
05.07.2015, 21:32     Парсер для математических выражений
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
AnsiString DeleteUnusableBarsets(AnsiString Function) {
    AnsiString Temp = Function;
    do {
        if (Temp[1] != '(' || Temp[Temp.Length()] != ')')
            return Temp;
        int BarsetCount = 0;
        bool BarsetExist = false;
        for (int i = 1; i < Temp.Length() - 1; i++)
            if (Temp[i] == '(') {
                BarsetCount++;
                BarsetExist = true;
            }
            else if (Temp[i] == ')') {
                BarsetCount--;
                if (!BarsetCount && BarsetExist)
                    return Temp;
            }
        Temp = Temp.SubString(2, Temp.Length() - 2);
    }
    while (1);
}
 
TDelimeterType __fastcall FindDelimeter(AnsiString Function, int *OperationType,
    int *Start, int *End) {
    *OperationType = otNone;
    for (int i = 0; i < 12; i++) {
        int BarsetCount = 0;
        for (int j = 1; j <= Function.Length(); j++)
            if (Function[j] == '(')
                BarsetCount++;
            else if (Function[j] == ')')
                BarsetCount--;
            else if (Function[j] == Delimeters[i] && !BarsetCount) {
                *Start = j - 1;
                *OperationType = i + 1;
                *End = j + 1;
                return dtBinarOperation;
            }
    }
    for (int i = 0; i < 10; i++)
        if (Function.AnsiPos(FunctionNames[i] + "(") == 1) {
            *Start = 1;
            *OperationType = i + otSin;
            *End = FunctionNames[i].Length();
            return dtUnarOperation;
        }
    return dtNone;
}
 
TTreeElement* __fastcall CreateTree(AnsiString aFunction, double **Variables) {
    if (!aFunction.Length())
        return NULL;
    AnsiString Function = aFunction.UpperCase();
    Function = DeleteUnusableBarsets(Function);
    int Start, End, Temp;
    int OperationType;
    TTreeElement *ret;
    switch (FindDelimeter(Function, &OperationType, &Start, &End)) {
    case dtNone:
        if ((Temp = CheckVariable(Function)) > -1)
            return new TVariable(Variables, Temp);
        else if ((Temp = CheckConstant(Function)) > -1)
            return new TConstant(Constants[Temp]);
        else {
            return new TConstant(StrToFloat(Function));
        }
    case dtBinarOperation: {
            AnsiString t1 = Function.SubString(1, Start);
            AnsiString t2 =
                Function.SubString(End, Function.Length() - End + 2);
            switch (OperationType) {
            case otLet:
                if ((Temp = CheckVariable(t1)) > -1) {
                    ret = new TLet(Variables, Temp);
                    ret->LeftNode = CreateTree(t2, Variables);
                    ret->RightNode = NULL;
                    return ret;
                }
                else
                    throw Exception("Unknown identifier '" + t1 + "'");
            case otOr:
                ret = new TOr();
                break;
            case otAnd:
                ret = new TAnd();
                break;
            case otAbove:
                ret = new TAbove();
                break;
            case otBelow:
                ret = new TBelow();
                break;
            case otEqual:
                ret = new TEqual();
                break;
            case otAdd:
                ret = new TAddition();
                break;
            case otSub:
                ret = new TSubstraction();
                break;
            case otMul:
                ret = new TMultiplection();
                break;
            case otDiv:
                ret = new TDivision();
                break;
            case otPow:
                ret = new TPow();
                break;
            case otRoot:
                ret = new TRoot();
                break;
            }
            ret->LeftNode = CreateTree(t1, Variables);
            ret->RightNode = CreateTree(t2, Variables);
            return ret;
        }
    case dtUnarOperation: {
            TFunction *ret1 = new TFunction();
            AnsiString t1 = Function.SubString(End + 1,
                Function.Length() - End);
            switch (OperationType) {
            case otSin:
                ret1->OnCalc = sin;
                break;
            case otCos:
                ret1->OnCalc = cos;
                break;
            case otTg:
                ret1->OnCalc = tan;
                break;
            case otCtg:
                ret1->OnCalc = ctg;
                break;
            case otArcsin:
                ret1->OnCalc = asin;
                break;
            case otArccos:
                ret1->OnCalc = acos;
                break;
            case otArctg:
                ret1->OnCalc = atan;
                break;
            case otArcctg:
                ret1->OnCalc = actg;
                break;
            case otLn:
                ret1->OnCalc = log;
                break;
            case otLog:
                ret1->OnCalc = log10;
                break;
            }
            ret1->LeftNode = CreateTree(t1, Variables);
            ret1->RightNode = NULL;
            return ret1;
        }
    }
 
    return NULL;
}
Примерно вот так. Делалось когда то давно на скорую руку не заботясь о скорости функции FindDelimiter/
 
Текущее время: 11:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru