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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Функция getc() и удаление из файла всего, что было считано http://www.cyberforum.ru/cpp-beginners/thread1503901.html
Функция getc() она считывает по символьно, как сохранить этот считанный текст в переменную ? И как считанный текст удалить из файла? FILE * pFile; int c; int n = 0; pFile = fopen("1.txt", "r"); for (c = getc(pFile); n <= '10'; n++){ /// Нужно удалить 10 считанных букв-символов из файла 1.txt и вывести то что мы по символьно считывали.
C++ Как считывать только одно число типа double за один проход Теперь измените тело цикла так, чтобы он считывал только одно число типа double за один проход. Определите две переменные, чтобы определить, какое из них имеет меньшее значение, а какое — большее среди всех ранее введенных значений. За каждый проход цикла выводите на экран одно введенное число. Если оно окажется наименьшим среди ранее введенных, выведите на экран строку "Наименьшее... http://www.cyberforum.ru/cpp-beginners/thread1503898.html
Операция new для другого класса C++
Здравствуйте. Есть вопрос. ... class X { public: virtual void pr() { cout<<"A";
C++ Создать шаблонный класс библиотека на основе односвязного списка
мне нужно создать класс библиотека на основе односвязного списка, но список должен быть шаблонным, дело в том, что по заданию нужно реализовывать методы сортировки по фамилиям авторов и по годам издания, получается, что эти методы уже заточены под поля определенной структуры и значит они не могут быть шаблонными. я прав или всё же их можно оформить шаблонно?
C++ Сокеты, функция send http://www.cyberforum.ru/cpp-beginners/thread1503857.html
для того чтобы отправить сообщение , могу ли я считать символы сроки таким образом: gets(buff); send(my_sock,&buff,nsize,0); Или же мне нужно: fgets(&buff,sizeof(buff)1,stdin); send(my_sock,&buff,nsize,0); Как я понимаю мне нужны самые байты сообщения, а не символы, правильно??
C++ Найти максимальный элемент массива: неправильный результат, почему? Почему выдает такой макс?? #include <iostream> #include <windows.h> #include <ctime> #include <iomanip> using namespace std; void input(int& a,int& b){ int arr; for(int i=0;i<a;i++){ arr=1+rand()%9; подробнее

Показать сообщение отдельно
jgotka
1 / 1 / 0
Регистрация: 11.03.2012
Сообщений: 56

Калькулятор: рекурсивная функция разбора строки - 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 минуту
а думала создать новую переменную, такого же типа, но он не разрешает приравнивать без указателя на гл. строчку. И получается по истечении всех изменений в цикле, эта переменная тоже изменяется, так же как и самая гл.строка. А если просто тупо приравнять он ругается на ошибку что нельзя так приравнивать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru