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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
jgotka
1 / 1 / 0
Регистрация: 11.03.2012
Сообщений: 56
#1

Калькулятор: рекурсивная функция разбора строки - C++

23.07.2015, 17:05. Просмотров 283. Ответов 0
Метки нет (Все метки)

Здравствуйте! пишу калькулятор, не могу дописать рекурсивную функцию считающая выражение. В функцию поступает разобранная строка, а она уже подсчитывает все. и остановилась на том моменте, когда алгоритм прогоняет все позиции, и если находит открывающую скобку то начинает от со сл.элемента, но у него уже будет свой массив (передаю указатель на строку). там все хорошо, считает, все нормально.НО КАК теперь полученный результат вставить на позицию самой главной строки, на место открывающейся скобки???? я пыталась что-то делать, но дошло только до того, что стираются элементы до скобки, и остается только полученное число в позиции 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
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
double MainWindow :: proba(QVector<QPair<LexemeType, QString> > *lux)
{   
                type = ltExp;
 
            if (lux->isEmpty())  
                {
                return -999999;
                    }
            
            int i = 0;
            int p = 0 ;
         QVector<QPair<LexemeType, QString> > l;
        l.append(lux);
                for (int i = 0; i < lux->count(); ++i)
                    {
                        
                            if(lux->at(i).first == ltBracketOpen)
                                {
                                     p=i;
 
                                     *lux = lux->mid(i+1);
                                     proba (lux);  //передать заново в функцию со слд.элемента
                                     ++i;  
                                        
                                    double d = lux->at(0).second.toDouble();
                                    //i = 0;
                                        int s =  0;
                                    while ( s < (lux->count() - 1))
                                        {
                                        int isSolved = 0;    
                                        switch (lux->at(s).first) 
                                            {
                                            case ltMilt:    
                                                d = lux->at(s-1).second.toDouble() * lux->at(s+1).second.toDouble();
                                                isSolved = 2;
                                                break;
                                            case ltDiv: 
                                                d = lux->at(s-1).second.toDouble() / lux->at(s+1).second.toDouble();
                                                isSolved = 2;
                                                break;
                                            case ltSin:
                                                d = sin(lux->at(s+1).second.toDouble());
                                                isSolved = 1;
                                                break;
                                            case ltCos:
                                                d = cos(lux->at(s+1).second.toDouble());
                                                isSolved = 1;
                                            }
                                        if(isSolved)
                                            {
                                            QPair<LexemeType, QString> para;
                                            para.first = ltNumber;
                                            para.second = QString::number(d);
                                            lux->replace(s-isSolved+1, para);
                                            for(int j = s; j < lux->count()-2; j++)
                                                {
                                                lux->replace(j, lux->at(j+isSolved));
                                                }
                                            *lux = lux->mid(0, lux->count()-isSolved);
                                            }
                                        else
                                        s++;
                                        isSolved = 0;
                                  }
                                    d = lux->at(0).second.toDouble();
                                    for (int s = 0; s < (lux->count() - 1);  ++s)
                                  {
                                          switch (lux->at(s).first) 
                                                      {
                                              case ltMinus:
                                                  if(s)
                                                      d = d - lux->at(s+1).second.toDouble();
                                                  else
                                                      d = - d - lux->at(s+1).second.toDouble();
                                                  break;
                                                  case 
                                                        ltPlus: 
                                                      d = d + lux->at(s+1).second.toDouble();  
                                                      break;
                                                        }
 
                                         }
                                        
 
                                if (lux->at(s).first == ltBracketClose)
                                        {           //вставить полученный результат в позицию скобки открывающейся и отправить снова на рекурсию                                                
 
                                            QPair<LexemeType, QString> par;
                                            par.first = ltNumber;
                                            par.second = QString::number(d);
                                            lux->replace(0, par);
                                            for(int j = s; j < lux->count(); j++)
                                                {
                                                   lux->remove(1,s);
                                                }
                                                
                                            *lux = lux->mid(0, lux->count()-s);//правильно
                                        //здесь нужно передать полученное число на позицию где была скобка открывающаяся.
                                            //   передача массива в гл. строку с измененными данными?
                                        }   
                            
                                        // *lux = lux; 
                                return lt(d);   ///подставить 8
 
                               }     //скобка от "("
                                
                    }//скобка оснвного цикла
 
}
Добавлено через 1 минуту
а думала создать новую переменную, такого же типа, но он не разрешает приравнивать без указателя на гл. строчку. И получается по истечении всех изменений в цикле, эта переменная тоже изменяется, так же как и самая гл.строка. А если просто тупо приравнять он ругается на ошибку что нельзя так приравнивать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2015, 17:05     Калькулятор: рекурсивная функция разбора строки
Посмотрите здесь:

C++ Рекурсивная функция вычисления длины строки
Рекурсивная функция, не возвращающая значения, которая удаляет из заданной строки все точки C++
Рекурсивная функция, не возвращающая значения, которая удаляет из заданной строки все точки C++
C++ Рекурсивная функция определения палиндрома строки.
C++ Рекурсивная функция
Рекурсивная функция C++
Рекурсивная функция C++
Что вернет стековая функция разбора пар скобок? C++
Что вернет стековая функция разбора пар скобок? C++
Рекурсивная функция C++
C++ Рекурсивная функция: все возможные перестановки символов строки
Получить переменные из строки путём её разбора C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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