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

Стандартная библиотека шаблонов (STL) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
Giggs131
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 19
16.09.2010, 19:32     Стандартная библиотека шаблонов (STL) #1
Пожалуйста,помогите решить..


Написать программу, которая использует класс string для анализа строки, содержащей математическое выражение, например, вида - (2+3)*4+1. Строка вводится с клавиатуры. Программа выдает результат вычисления выражения.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rubic
8 / 8 / 1
Регистрация: 29.09.2009
Сообщений: 28
16.09.2010, 20:01     Стандартная библиотека шаблонов (STL) #2
Используй обратную польскую запись и пиши
Giggs131
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 19
16.09.2010, 20:15  [ТС]     Стандартная библиотека шаблонов (STL) #3
Цитата Сообщение от rubic Посмотреть сообщение
Используй обратную польскую запись и пиши

Мне это ничего не сказало...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2010, 20:18     Стандартная библиотека шаблонов (STL) #4
Giggs131,
Вам не кажется, что вам указали путь к решению? Алгоритм обратной польской записи с подробным разбором шагов не так тривиален, чтобы расписывать его здесь, однако, зная эти три слова, первая же ссылка в гугле приведёт вас к решению.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
16.09.2010, 20:19     Стандартная библиотека шаблонов (STL) #5
http://ru.wikipedia.org/wiki/%D0%9F%...86%D0%B8%D1%8F
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2010, 20:21     Стандартная библиотека шаблонов (STL) #6
niXman,
Если уж на то пошло, то здесь указан подробный алгоритм перевода выражения из инфиксной в префиксную нотацию и вычисления полученного выражения
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
16.09.2010, 20:24     Стандартная библиотека шаблонов (STL) #7
silent_1991, я хз. только глаза раззул
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2010, 21:34     Стандартная библиотека шаблонов (STL)
Еще ссылки по теме:

C++ Стандартная библиотека шаблонов
Библиотека шаблонов STL C++
Библиотека стандартных шаблонов STL C++

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

Или воспользуйтесь поиском по форуму:
Demon-red
138 / 138 / 19
Регистрация: 25.01.2010
Сообщений: 181
16.09.2010, 21:34     Стандартная библиотека шаблонов (STL) #8
Пример был взят из книги
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
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <cstring>
using namespace std;
const int LEN = 80;
const int MAX = 40;
char buf[256];
char* rus(const char* text)
{
 CharToOem(text,buf);
 return buf;
}
 
class Stack
{
 private :
   char st [MAX];
   int top;
 public :
   Stack ()
     {top = 0; }
  void push (char var)
   {st[++top] = var; }
  char pop ()
   {return st[top--]; }
  int gettop ()
   {return top;}
};
 
class express
{
  private :
    Stack s;
    char* pStr;
    int Len;
  public :
    express (char* ptr)
     {
      pStr = ptr;
      Len = strlen( pStr );
     }
    void parse ();
    int solve ();
};
 
 
void express :: parse ()
{
 char ch;
 char lastval;
 char lastop;
 
 for (int j = 0; j < Len; j++)
 {
  ch = pStr[j];
  if (ch >= '0' && ch <= '9')
    s.push(ch - '0');
   else
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
    {
     if (s.gettop() == 1)
     s.push(ch);
    else
    {
      lastval = s.pop();
      lastop = s.pop();
      if ( ( ch == '*' || ch == '/') && (lastop == '+'  || lastop == '-' ) )
       {
         s.push(lastop);
         s.push(lastval);
       }
      else
       {
       switch (lastop)
       {
         case '+' : s.push(s.pop() + lastval); break;
         case '-' : s.push(s.pop() - lastval); break;
         case '*' : s.push(s.pop() * lastval); break;
         case '/' : s.push(s.pop() / lastval); break;
       }
    }
   s.push(ch);
   }
  }
  else
  {
   exit(1);
  }
 }
 }
 
int express::solve( )
{
 char lastval;
 
 while (s.gettop () > 1)
  {
   lastval = s.pop();
   switch (s.pop())
    {
      case '+' : s.push(s.pop() + lastval); break;
      case '-' : s.push(s.pop() - lastval); break;
      case '*' : s.push(s.pop() * lastval); break;
      case '/' : s.push(s.pop() / lastval); break;
      default : exit(1);
    }
  }
  return int (s.pop());
}
 
int main()
{
  char ans;
  char string [ LEN ];
  cout << rus("\nВведите аримметическое выражение в виде 2+3*7/2"
               "\nЧисла должны из одной цифры"
               "\nНе используя пробелы и скрбки");
 do
 {
   cout << rus("\nВыражение : ");
   cin >> string;
   express* eptr = new express (string);
   eptr->parse();
   cout << rus("\nРезультат : ") << eptr->solve();
   delete eptr;
   cout << rus("\nЕще одно выражение (d/n)? ");
   cin >> ans;
 } while (ans == 'd');
 getch();
        return 0;
}
//---------------------------------------------------------------------------
Yandex
Объявления
16.09.2010, 21:34     Стандартная библиотека шаблонов (STL)
Ответ Создать тему
Опции темы

Текущее время: 06:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru