Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/24: Рейтинг темы: голосов - 24, средняя оценка - 4.54
V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
1

Математический ввод формул в Edit

28.07.2012, 09:56. Просмотров 4391. Ответов 9
Метки нет (Все метки)

Здравствуйте, я раньше использовал этот математический ввод формул в Edit, он он очень хорош, но появилось потребность добавить туда свои обозначения, которые находятся в процессе работы программы, такие как матожидание, дисперсия и т.д.
Как это сделать?
4
Вложения
Тип файла: zip MathParserparser.zip (3.3 Кб, 178 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2012, 09:56
Ответы с готовыми решениями:

Ввод формул с Edit или альтернатива
В общем нужно считать формулу с Edit, или может есть какие-то иные...

От числа в Edit меняется количество формул
Здравствуйте подскажите пожалуйста есть такой код void __fastcall...

Ввод в Edit
Доброго времени суток. Я делаю ограничение ввода в Эдиты. Что бы вводить только...

Ввод литер в Edit
Необходимо, чтобы в Edit можно было ввести минус в начале только один раз. А то...

Ограничение на ввод в Edit
Здравствуйте,задача такая, в элитная вводятся только числа,"backspace" и...

9
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
28.07.2012, 11:47 2
Разбираться с работой парсера...и затем попробывать впихнуть в него свои ф-ции...
У Страдострупа есть в книге код калькулятора тоже с разбором выражений только попроще- возможно поможет понять общий принцип работы подобных вещей.
0
V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
29.07.2012, 10:56  [ТС] 3
Помню когда то начинал делать в builder 2009 была такая ошибка при использовании этого пастера.
Поэтому пришлось работать на builder 6.
C++
1
parser.Compile(Edit1->Text.c_str());
C++
1
2
3
4
5
6
[BCC32 Error] Unit1.cpp(360): E2034 Cannot convert 'wchar_t *' to 'char *'
  Full parser context
    Unit1.cpp(221): parsing: void _fastcall TForm1::DoIt()
[BCC32 Error] Unit1.cpp(360): E2342 Type mismatch in parameter '_expr' (wanted 'char *', got 'wchar_t *')
  Full parser context
    Unit1.cpp(221): parsing: void _fastcall TForm1::DoIt()
Как помню он не может понять Какой тип содержит Edit....может другие есть c_str()) функции?

Добавлено через 34 минуты
Правильный ответ! Верно.
C++
1
parser.Compile(Edit1->Text.t_str());
А всё потому что
в 6 билдере AnsiString.c_str() приводил к char, а в билдере 2009 к wchar_t.
0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
29.07.2012, 11:34 4
Правильно
C++
1
parser.Compile(AnsiString(Edit1->Text).c_str() );
t_str(), w_str(),c_str() в новых билдерах могут приводить к wchar_t*, а не к char*.

Причем c_str(), в Builder2009 работает опасно, потому как приводит не правильно, а ошибки не выдает (ошибка появляется когда встречается юникодный символ )
1
V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
29.07.2012, 12:27  [ТС] 5
Делаю так:
1. Найденное значение мода хранится в Form1->StringGrid3->Cells[10][1]
2. Закидываю файлы в проект MathParserparser.h и MathParserparser.cpp
3. В MathParserparser.cpp прописываю #include "Unit1.h"
4. В нём же делаю
C++
1
2
3
4
else if(!strcmp(curToken, "ln"))     { typToken = PARSER_LN; return true; }
      else if(!strcmp(curToken, "sqrt"))   { typToken = PARSER_SQRT; return true; }
       else if(!strcmp(curToken, "moda"))  { typToken = PARSER_MODA; return true; }
      else SendError(0);
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
TParserNode *T_Parser::Expr5(void)
{
   TParserNode *temp;
   //double moda = StrToFloat(Form1->StringGrid3->Cells[10][1]);
   switch(typToken)
   {
      case PARSER_NUMBER:
         temp = CreateNode((double)atof(curToken));
         GetToken();
         break;
 
      case PARSER_PI:
         temp = CreateNode((double)M_PI);
         GetToken();
         break;
 
      case PARSER_E:
         temp = CreateNode((double)exp(1));
         GetToken();
         break;
 
      case PARSER_L_BRACKET:
         GetToken();
         temp = Expr();
         if(typToken!=PARSER_R_BRACKET) SendError(5);
         GetToken();
         break;
 
      case PARSER_MODA:
         temp = CreateNode((double)StrToFloat(Form1->StringGrid3->Cells[10][1]));
         GetToken();
         break;
      default:
         SendError(6);
   }
 
   return temp;
}
5. В MathParserparser.h
C++
1
2
3
enum { PARSER_PLUS, PARSER_MINUS, PARSER_MULTIPLY, PARSER_DIVIDE, PARSER_PERCENT, PARSER_POWER,
          PARSER_SIN, PARSER_COS, PARSER_TG, PARSER_CTG, PARSER_ARCSIN, PARSER_ARCCOS, PARSER_ARCTG, PARSER_ARCCTG, PARSER_SH, PARSER_CH, PARSER_TH, PARSER_CTH,
          PARSER_EXP, PARSER_LG, PARSER_LN, PARSER_SQRT, PARSER_X, PARSER_L_BRACKET, PARSER_R_BRACKET, PARSER_E, [B]PARSER_MODA[/B], PARSER_PI, PARSER_NUMBER, PARSER_END } typToken;
В итоге получаю
0
Миниатюры
Математический ввод формул в Edit  
V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
29.07.2012, 13:20  [ТС] 6
Добавлено через 19 минут
Вроде совсем разобрался, как код будет готов выложу.
0
V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
05.08.2012, 08:33  [ТС] 7
Лучший ответ Сообщение было отмечено как решение

Решение

Оказалось очень всё просто, главное иметь в основном cpp глобальные переменные которые нужны нам в расчёте.
4
Вложения
Тип файла: zip Projects.zip (3.8 Кб, 206 просмотров)
aloekalanhoe
0 / 0 / 0
Регистрация: 20.07.2013
Сообщений: 1
23.07.2013, 16:36 8
а можно сделать так чтобы функция считывалась с Edit и затем можно было ее снова "вытащить",но в понятной машине форме?
Задача в том, что для оптимизации функции различными способами нужно ,собственно, ввести функцию нескольких перменных и выбрать метод оптимизации. В алгоритмах используется функция double f(double *x).
Раньше как раз в теле этой функции и задавалось выражение,теперь нужно сделать с пользовательским вводом. Можно ли считанную с Edit записать в double f(double *x)?
0
V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
29.07.2013, 08:20  [ТС] 9
а можно сделать так чтобы функция считывалась с Edit и затем можно было ее снова "вытащить",но в понятной машине форме?
Данный транслятор на такое не рассчитан, придется многое добавлять. Если конечно я правильно понял вас.
0
Evginious
0 / 0 / 0
Регистрация: 14.03.2016
Сообщений: 1
14.03.2016, 21:39 10
Подскажите пожалуйста, а как вообще пользоваться этим парсером??
Я имею ввиду, вот у меня есть прога, я в Edit вбиваю формулу, затем, затем присваиваю переменным численные значения и хочу получить численный ответ. Вот каким образом я должен обратиться к парсеру??
0
14.03.2016, 21:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2016, 21:39

Проверка на ввод в edit
метод прямоугольников для интегралов, не суть. После того, как ввожу проверку...

Ввод всех данных с Edit
Если Edit-ы не введены выводит сообщение " Заполните все поля" помогите решить...

Edit - ограничение на ввод чисел
Есть поле edit надо сделать так чтобы сначала можно было ввести только число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru