Форум программистов, компьютерный форум, киберфорум
Наши страницы

Виртуальная функция и возвращаемое значение - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разрешение коллизий методом цепочек http://www.cyberforum.ru/cpp-beginners/thread955243.html
Здравствуйте. Мне нужно сделать хэш-таблицу с хэшированием умножением и разрешением коллизий методом цепочек с наложением пространства записей на пространство ссылок, т.е. чтобы массив содержал сами...
C++ Преобразовать строку, удалив каждый символ * и повторив каждый символ, отличный от * Дана строка. Преобразовать ее, удалив каждый символ * и повторив каждый символ, отличный от *. Помогите решить, писал тоже самое на Паскале в ++ что то не получается) http://www.cyberforum.ru/cpp-beginners/thread955218.html
Ошибка в программе C++
Доброго времени суток. Только недавно начал пробовать что то ваять на С, пока все получалось до этого момента. #include "stdafx.h" #include <iostream> using namespace std; int main() { ...
"вычислить" элементы вектора C++
Есть вектор: std::vector<char> vec; Содержащий , например , vec = 1, vec = +, vec = 2, vec = *, vec = 3. Можно ли элементы вектора собрать в int result = 1 + 2 * 3 и вычислить?
C++ Структуры http://www.cyberforum.ru/cpp-beginners/thread955206.html
в справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пунт назначения, время отбытия и прибытия. Вывести информацию о рейсы которыми...
C++ счетчик цикла for Есть задача из Прата глава 5 № 4. Дафна инвестировала $100 под простые 10%. Другими словами, ежегодно инвестиция должна приносить 10% инвестированной суммы, т.е. $10 каждый год:прибыль = 0,10 х... подробнее

Показать сообщение отдельно
Рики
6 / 6 / 1
Регистрация: 27.02.2013
Сообщений: 23
16.09.2013, 03:44  [ТС]
Переделал.
Кликните здесь для просмотра всего текста
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// parse.cpp
#include <iostream>
#include <cstring>                   //for strlen(), etc
#include <stdlib.h> 
using namespace std;
const int LEN = 80;    //length of expressions, in characters
const int MAX = 40;    //size of stack
////////////////////////////////////////////////////////////////
  class Token                      // Абстрактный базовый класс
    {
    public:
      virtual void showOperNumber()=0; // чистая виртуальная
      virtual char getOperator()=0;             // функция
      virtual float getNumber()=0; 
 
      
    };
////////////////////////////////////////////////////////////////
  class Operator : public Token
    {
    private:
      char oper;             // Операторы +, –, *, /
    public:
      Operator(char c): oper(c)      // конструктор устанавливает значение
        {}
      void showOperNumber()    // получить значение
        {cout<<oper<<endl; }
      virtual float getNumber()
        { return 0.f; }
      char getOperator()
        {return oper;}
     
    };
////////////////////////////////////////////////////////////////
  class Number : public Token
    {
    private:
      float fnum;            // число
    public:
      Number(float f): fnum(f)         // конструктор устанавливает значение
         {}
      void showOperNumber()     // получить значение
        {cout<<fnum<<endl;}
      float getNumber()
        {return fnum;}
      virtual char getOperator()
        { return 0.f; }
    };
////////////////////////////////////////////////////////////////////
class Stack
   {
   private:
      Token* atoken[100];    //содержит типы Operator* и Number*                  
      int top;                       //number of top of stack
   public:
      Stack()                        //constructor
         { top = 0; }
      void push(Token* var)            //put char on stack
         { atoken[++top] = var; }
      Token* pop()                     //take char off stack
         { return atoken[top--]; }
      int gettop()                   //get top of stack
         { return top; }
   };
////////////////////////////////////////////////////////////////
class express
{
    private:
        Stack s;
        char* pStr;
        int len;
    public:
        express (char* ptr)
        {
            pStr=ptr;
            len =strlen(pStr);
        }
        void parse ();     // разбор выражения
        float solve ();      // получение результата
};
//--------------------------------------------------------------
void express::parse()
{
    char chifra [LEN];    //символы из строки
    float lastval;        // последнее значение
    char lastop;          // последний оператор
    Token* atoken[100];
    Number* ptrN;
    Operator* ptrO;
    float n;
    char Ch;  
    int j=0;
    int i=0; 
 
    for(j; j<len; j++)          //для всех символов в строке
    {
        if (pStr[j]>='0' && pStr[j]<='9' || pStr[j]==',')
        {
            while (pStr[j]>='0' && pStr[j]<='9' || pStr[j]==',')  // получаем число 
            {
                chifra [i]=pStr[j];
                j++; i++;
                n = atof(chifra); 
            }
            ptrN = new Number(n);
            s.push(ptrN);                                       // заносим  в стек
        }
        else
        if(pStr[j]=='+' || pStr[j]=='-' || pStr[j]=='*' || pStr[j]=='/')
        {
            Ch = pStr[j];
            if (s.gettop()==1)                                    // если это первый оператор, то помещаем в стек
            {
                ptrO = new Operator(Ch);
                s.push(ptrO);   
            }
            else
            {
                lastval=s.pop()->getNumber();                //получение предыдущего числа
                lastop=s.pop()->getOperator();              //получение предыдущего оператора
                // если это * или / , а предыдущий был + или -, то
                if( (pStr[j]=='*' || pStr[j]=='/') && (lastop=='+' || lastop=='-') )
                {
                    ptrO = new Operator(lastop);   //отменяем последние два взятия из стека
                    s.push(ptrO);   
                    ptrN = new Number(lastval);
                    s.push(ptrN);   
               }
               else                     //помещаем в стек текущий оператор 
               {
               switch(lastop)        
                  {                  
                  case '+': ptrN = new Number(s.pop()->getNumber() + lastval); break;
                  case '-': ptrN = new Number(s.pop()->getNumber() - lastval); break;
                  case '*': ptrN = new Number(s.pop()->getNumber() * lastval); break;
                  case '/': ptrN = new Number(s.pop()->getNumber() / lastval); break;
                  default:  cout << "\nUnknown oper"; exit(1);
                  }  
               }  
            ptrO = new Operator(pStr[j]);
            s.push(ptrO);              //помещаем в стек текущий оператор 
            }  
         }  
   
      else                           //что-то левое
         { cout << "\nUnknown input character"; exit(1); }
   }
}
//-------------------------------------------------------------
float express::solve ()  //убираем данные из стека
{
    float lastval;              
    while(s.gettop() > 1)
      {
      lastval = s.pop()->getNumber();               //предыдущее значение 
      switch( s.pop()->getOperator() )              //получение предыдущего оператора
         {                           //do operation, push answer
         case '+': new Number(s.pop()->getNumber() + lastval); break;
         case '-': new Number(s.pop()->getNumber() - lastval); break;
         case '*': new Number(s.pop()->getNumber() * lastval); break;
         case '/': new Number(s.pop()->getNumber() / lastval); break;
         default:  cout << "\nUnknown operator"; exit(1);
         }  
      }  
   return float (s.pop()->getNumber());//последний оператор в стеке это результат
}
////////////////////////////////////////////////////////////////
 
int main()
   {
   setlocale (LC_ALL, "russian");
   char stroka [LEN]="5,093+5,032";                         
   express* eptr = new express (stroka);
   eptr->parse();
   cout <<"\nРезультат: "
       << eptr->solve();
   delete eptr;
   system("pause");
   return 0;
   }

Результата нет.
Буду благодарен совет.

ps "0.f"- что это значит? как понять эту заглушку?
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.