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

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

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

Подскажите, что делает программа - C++

28.11.2012, 20:34. Просмотров 431. Ответов 3
Метки нет (Все метки)

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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
// BrackStack.cpp - автомат с магазинной памятью,
// распознающий вложенность круглых скобок.
// Построен на основе таблицы переходов,
// созданной по следующей q-грамматике:
// 1. S -> (B)B
// 2. B -> (B)B
// 3. B -> empty
 
#include <iostream>
#include <string>
#include <vector>
#include <stack>
 
using namespace std;
 
// Магазинными символами автомата являются:
// S, B, маркер дна (bottom).
 
// Их значение должно быть за пределами видимых символов.
enum stackSymb {S = 256, B, bottom}; 
 
// Строка с входной цепочкой, имитирующая входную ленту
string str;
int i; // Текущее положение входной головки
stack <int, vector<int> > stck; // Стек для магазинных символов
 
 
 
// Функция, реализующая чтение символов в буфер из входного потока.
// Используется для ввода с клавиатуры распознаваемой строки.
// Ввод осуществляется до нажатия на клавишу Enter.
// Символ '\n' яляется концевым маркером входной строки.
 
void GetOneLine(istream &is, string &str) {
  char ch;
  str = "";
  for(;;) {
    is.get(ch);
    if(is.fail() || ch == '\n') break;
    str += ch;
  }
  str += '\n'; // Добавляется концевой маркер
}
 
 
 
// Инициализация устройств АМП
 
void Init() {
  // Инициализация стека
  while(!stck.empty())  stck.pop();
  stck.push(bottom);
  stck.push(S);
 
  // Инициализация входной головки
  i = 0;
}
 
 
 
// Устройство управления АМП, анализирующего вложенность скобок.
// Имитирует таблицу переходов АМП.
 
bool Parser() {
 
  // Инициализация устройств АМП
  Init();
  int step = 0;
 
  // Цикл анализа состояний
  for(;;) {
    // Тестовый вывод информации о текущем шаге, 
    // текущем символе, вершине стека
    cout <<"step " << step++ << ": str[" << i << "] = "<< str[i] 
         << " Top = "<< stck.top() << "\n";
 
    // Проверка содержимого на вершине стека
    switch(stck.top()) {
    // Анализ первой строки таблицы переходов
    case S:
        switch(str[i]) {
        case '(': // [S, (]
            stck.top() = B; // эквивалентно stck.pop(); stck.push(B);
            stck.push(')');
            stck.push(B);
            i++; // следующий входной символ
            break;
        case ')': // [S, )] - ) не может стоять в начале
            cout << "Position " << i << ", " 
                 << "Error 1: \')\' can not is in begin!\n";
            return false;
        case '\n': // [S, концевой маркер]
            cout << "Position " << i << ", " 
                 << "Error 2: Empty string!\n";
            return false;
        default: // Ошибка, такой символ не допустим
            cout << "Position " << i << ", " 
                 << "Incorrect symbol! " << str[i] << "\n";
            return false;
        }
        break;
    // Анализ второй строки таблицы переходов
    case B:
        switch(str[i]) {
        case '(': // [B, (]
            stck.top() = B; // эквивалентно stck.pop(); stck.push(B);
            stck.push(')');
            stck.push(B);
            i++; // следующий входной символ
            break;
        case ')': // [B, )] - вытолкнуть без сдвига 
            stck.pop();
            break;
        case '\n': // [B, концевой маркер] - вытолкнуть без сдвига
            stck.pop();
            break;
        default: // Ошибка, такой символ не допустим
            cout << "Position " << i << ", " 
                 << "Incorrect symbol! " << str[i] << "\n";
            return false;
        }
        break;
    // Анализ третьей строки таблицы переходов
    case ')':
        switch(str[i]) {
        case '(': // [), (] - в принципе недостижимо
            cout << "Position " << i << ", " 
                 << "Error 3: I want \')\'!\n";
            return false;
        case ')': // [), )] - вытолкнуть со сдвигом 
            stck.pop(); // вытолкнуть
            i++;  // сдвиг
            break;
        case '\n': // [), концевой маркер]
            cout << "Position " << i 
                 << ", Error 4: I want \')\'!\n";
            return false;
        default: // Ошибка, такой символ не допустим
            cout << "Position " << i << ", " 
                 << "Incorrect symbol! " << str[i] << "\n";
            return false;
        }
        break;
    // Анализ четвертой строки таблицы переходов
    case bottom:
        switch(str[i]) {
        case '(': // [bottom, (] - невозможно при пустом магазине
            cout << "Position " << i << ", "
                 << "Error 4: Impossible situation [bottom, \'(\']!\n";
            return false;
        case ')': // [bottom, )] - лишняя )
            cout << "Position " << i << ", "
                 << "Error 5: unnecessary \')\'!\n";
            return false;
        case '\n': // [bottom, концевой маркер] - допустить!
            return true;
        default: // Ошибка, такой символ не допустим
            cout << "Position " << i << ", " 
                 << "Incorrect symbol! " << str[i] << "\n";
            return false;
        }
        break;
    }
  }
}
 
 
 
// Главная функция используется для инициализации устройств
// АМП перед каждым новым прогоном и тестирования до тех пор,
// пока не будет прочитана пустая строка.
int main () {
  string strCursor;
  str = "";
 
  // Цикл распознавания различных входных цепочек
  do {
    // Чтение очередной входной цепочки в буфер
    cout << "Input bracket\'s expression!: ";
 
    // Формируем очередную строку скобок для распознавания.
    GetOneLine(cin, str);
 
    // Здесь начинается разбор принятой строки.
    if(Parser())
        cout << "+++++ OK! +++++\n";
    else
        cout << "--- Fatal error (look upper error message)! ---\n";
 
    // Вывод разобранной строки и значения позиции входой головки.
    cout << "Line: " << str;
    strCursor = " Pos: " + string(i, '-');
    strCursor +='^';
    cout << strCursor << " i = " << i << "\n\n";
  } while(str != "\n");
 
  cout << "Goodbye!\n";
  return 1;
}
Я не понимаю, что надо вводить >< Подскажите, пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 20:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подскажите, что делает программа (C++):

Подскажите, что делает программа - C++
Собрался поступать в универ. проходил тест пробный, там с++, дали код. Я немного учил с++ и увидел что код не полный. дополнил его и он...

Пожалуйста подскажите, что делает программа? - C++
public: A(); A(const A &amp;); ~A(); friend A operator+(A a, B b); friend void display(A a); }; class B { int *arr;

Подскажите, что делает функция cudaMalloc - C++
Начал читать книгу по CUDA.В ней встретился вот такой код.В этом коде не очень понятна строка функции cudaMalloc. Перед ней определяется...

Пожалуйста подскажите что делает данная функция? - C++
Пожалуйста подскажите что делает данная функция? fflush(stdin);

Что делает программа - C++
Объясните пожалуйста пошагово что делает эта программа #include &lt;stdio.h&gt; #include &lt;fstream&gt; #include &lt;iostream&gt; using...

Что делает программа? - C++
не могу понять что делает программа? #include &lt;iostream&gt; using namespace std; bool mystery(unsigned bits); int main() { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
29.11.2012, 15:40 #2
автомат с магазинной памятью, распознающий вложенность круглых скобок.
нужно вводить строку, содержащую круглые скобки. Программа определяет баланс скобок.
Например
((ааа))() - правильно
((ааа)))( - неправильно
systemofadown
0 / 0 / 0
Регистрация: 02.05.2011
Сообщений: 16
29.11.2012, 17:44  [ТС] #3
Это я понимаю, спасибо, но что за цифры еще выводятся (257,256,41)??
Миниатюры
Подскажите, что делает программа  
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
29.11.2012, 17:56 #4
Это либо код символа, либо одно из этих значений
C++
1
enum stackSymb {S = 256, B, bottom};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2012, 17:56
Привет! Вот еще темы с ответами:

что делает эта программа? - C++
здравствуйте! подскажите пожалуйста что делает данная программа...я так думаю он должен выводить 1,2 3,4 ? #include...

Что делает эта программа - C++
Не понимаю что делает программа,начиная с getline #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;algorithm&gt; #include &lt;sstream&gt; ...

что делает эта программа на С++? - C++
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; void main() { char g; int j,i; printf(&quot;vvesti frazu\n&quot;); j=0; ...

Обьяснить что делает программа - C++
Уважаемым товарищи программисты объясните пожалуйста что делает эта программа. Что происходит в цикле ? #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.11.2012, 17:56
Ответ Создать тему
Опции темы

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