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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
#1

Технологии синтаксического анализа и интерпретации команд - C++

01.03.2011, 13:40. Просмотров 1056. Ответов 18
Метки нет (Все метки)

Составить программу, которая проверяет корректность арифметических выражений, в которых могуть быть скобки трех типов "()", "[]", "{}" и действия "+-*/".

очень нужно срочно. курсач горит у бедного студента

 Комментарий модератора 
Не дублируйте темы - это нарушает правила форума.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2011, 13:40     Технологии синтаксического анализа и интерпретации команд
Посмотрите здесь:

прога для интерпретации #define - C++
надо реализовать простой препроцессор языка С, способный выполнять замены в тексте, заданные с помощью директивы #define (в том числе...

Неверная реализация синтаксического анализатора LR(1)-грамматики - C++
Здравствуйте. Есть реализация синтаксического анализатора LR(1)-грамматики. Программа должна получить строку p$ или ivtpe$ и сообщить,...

технологии программирования - C++
помогите разобраться в сути вопроса вопрос по технологиям программирования: общая структура памяти не понятно о какой памяти идет...

Облачные технологии на С++ - C++
В последнее время побывал на нескольких конференциях, на которых говорилось, что будущее программирования за облачными технологиями. ...

GUI, технологии - C++
Здравствуйте. Подскажите мне пожалуйста какую-нибудь хорошую IDE для с++. Либо хорошую визуальную библиотеку. Просто нужно писать быстрые...

Выбор инструмента/технологии - C++
Доброго времени суток! Есть следующая задача. На входе файл в dbf формате(с досовским набором символов). В файле нужно произвести...

Методы анализа данных - C++
Исследование алгоритмов проверки гипотезы о равенстве математических ожиданий и гипотезы о выявлении аномальных измерений.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dxdy
97 / 97 / 5
Регистрация: 14.06.2010
Сообщений: 283
01.03.2011, 14:11     Технологии синтаксического анализа и интерпретации команд #2
и в чем же проблема?
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 14:13  [ТС]     Технологии синтаксического анализа и интерпретации команд #3
какой?

Добавлено через 58 секунд
не знаю язык си... совсем не получаеться в нем разобраться и выучиь! а прога надо тоьок на языке СИ!
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.03.2011, 15:13     Технологии синтаксического анализа и интерпретации команд #4
А какой знаете? Можете написать хоть на чём-то или хотя-бы предложить алгоритм (для этого нужен только русский язык, или в нём тоже совсем не получается разобраться и выучить)?
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 15:17  [ТС]     Технологии синтаксического анализа и интерпретации команд #5
ну а смысл от того что я напишу прогу на джава? тебе то что от неё?
мне на сишке надо! и только си. хотя можно и С++
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.03.2011, 15:23     Технологии синтаксического анализа и интерпретации команд #6
kest_wolf, пишите. И выкладывайте.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
01.03.2011, 15:34     Технологии синтаксического анализа и интерпретации команд #7
Цитата Сообщение от kest_wolf Посмотреть сообщение
ну а смысл от того что я напишу прогу на джава?
Смысл в том, чтобы хотябы алгоритм самому составить. Логика работы программы в общем случае не должна зависеть от языка программирования, скорее даже наоборот. А логика в этом задании не то, чтобы сложная, но требует некоторой кропотливости (проверка открывающих/закрывающих скобок, наличие посторонних символов, etc...) Сделайте хоть на JavaScript, главное, чтобы работало, а на С переделать особой сложности не составит. Даже при условии, что Вы не знаете С, вероятность того, что Вам помогут переделать программу, написанную на другом языке, гораздо выше, чем вероятность, что кто-то будет долго и нудно за Вас парсер строки на С писать.


Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
(для этого нужен только русский язык, или в нём тоже совсем не получается разобраться и выучить)?
Цитата Сообщение от dxdy Посмотреть сообщение
и в чем же проблема?
Цитата Сообщение от kest_wolf Посмотреть сообщение
какой?

kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 16:17  [ТС]     Технологии синтаксического анализа и интерпретации команд #8
у меня курсач на завтра. сегодня отчет хоть бы успеть сделать!
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.03.2011, 16:31     Технологии синтаксического анализа и интерпретации команд #9
kest_wolf, всё с вами понятно. Сегодня за вас надо написать курсовой проект, завтра диплом. Потом и работать за вас?
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 16:35  [ТС]     Технологии синтаксического анализа и интерпретации команд #10
диплом я сам делаю. и отчет сам делаю! но прога нужна!
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.03.2011, 16:40     Технологии синтаксического анализа и интерпретации команд #11
Цитата Сообщение от kest_wolf Посмотреть сообщение
отчет сам делаю
[сарказм]Похвально![/сарказм]
asics
Freelance
Эксперт C++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
01.03.2011, 16:40     Технологии синтаксического анализа и интерпретации команд #12
Цитата Сообщение от kest_wolf Посмотреть сообщение
но прога нужна!
Давайте разберемся: Вы хотите что бы зав Вас написали всю програму ? Если да - вам сюда, иначе - Ваши наброски, идеи по созданию програмы.
silent_1991
01.03.2011, 16:44
  #13

Не по теме:

asics, понимаете, человек знает яву, но так вышло, что он из принципа не хочет писать на ней, а хочет, чтобы мы немного растрясли мозги (а то ведь только и можем что сидеть на форумах и ехидничать) и написали программу с нуля. Ну что тут поделать?

asics
01.03.2011, 16:49
  #14

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Ну что тут поделать?
Предлагаю забить на это

silent_1991
01.03.2011, 16:53
  #15

Не по теме:

asics, мудро!

easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
01.03.2011, 16:55     Технологии синтаксического анализа и интерпретации команд #16
Цитата Сообщение от asics Посмотреть сообщение
Предлагаю забить на это
Ну во всяком случае давайте флудить перестанем. Найдутся альтруисты - повезло студенту. Не найдутся - не повезло...

kest_wolf, тему пока не закрываю, но всё-таки настоятельно рекомендую хотябы попытаться что-то сделать.
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 17:21  [ТС]     Технологии синтаксического анализа и интерпретации команд #17
неужели нет таких кто знает как делать эту програму?? блин. люди! помогите!
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
01.03.2011, 17:56     Технологии синтаксического анализа и интерпретации команд #18
Цитата Сообщение от kest_wolf Посмотреть сообщение
неужели нет таких кто знает как делать эту програму?
Из троих последних в этой теме отписавшихся нет ниодного, кто не знает, как её делать. Вы просто разницу между "помочь" и "сделать за кого-то" не улавливаете.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2011, 11:41     Технологии синтаксического анализа и интерпретации команд
Еще ссылки по теме:

Программа анализа текста - C++
Имеется код. #include <iostream> #include <string> #include <map> #include <fstream> using namespace std; int main() ...

Информационные технологии проделать в экселе - C++
Показать, что выражения x=sin(a) и y=cos(a) описывают окружность при изменении а от 0 до 6.28 радиан.

Ошибка анализа текстовой строки - C++
char stroka; int D; char alf={'a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t'}; int...

Программа анализа графика отпусков - C++
Осн. требования: Информация о желаемых сроках предоставления отпусков сотрудникам(ФИО,кол-во положенных дней отпуска,даты начала и...

программка для анализа чисел - C++
Нужна небольшая программка для анализа чисел. Поле ввода чисел через пробел. При нажатии на Enter каждому числу присваивается...


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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
02.03.2011, 11:41     Технологии синтаксического анализа и интерпретации команд #19
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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/////////////////////////////////////////////////////////////////////////////////////////
//Составить программу, которая проверяет корректность арифметических выражений, 
//в которых могуть быть скобки трех типов "()", "[]", "{}" и действия "+-*/".
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <iostream>
#include <sstream>
#include <stack>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string       T_expr;
typedef std::stack<char>  T_brackets_stack;
typedef int               T_num;
/////////////////////////////////////////////////////////////////////////////////////////
enum
{
    OPEN_ROUND_BRACKET      = '(',    
    CLOSING_ROUND_BRACKET   = ')',    
 
    OPEN_SQUARE_BRACKET     = '[',    
    CLOSING_SQUARE_BRACKET  = ']',    
 
    OPEN_BRACE              = '{',    
    CLOSING_BRACE           = '}'
};
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_num(T_expr&  e)
{
    std::istringstream  e_stream(e);
    T_num               num = 0;
    if(!(e_stream >> num)) return  false;
    e.clear();
    e_stream >> e;
    return  true;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  is_open_bracket(char  c)
{ 
    return    c == OPEN_ROUND_BRACKET
           || c == OPEN_SQUARE_BRACKET
           || c == OPEN_BRACE;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  is_closing_bracket(char  c)
{ 
    return    c == CLOSING_ROUND_BRACKET
           || c == CLOSING_SQUARE_BRACKET
           || c == CLOSING_BRACE;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  open_bracket_is_correct
    (
        char               open_bracket_symb, 
        T_brackets_stack&  brackets_stack
    )
{    
    switch(open_bracket_symb)
    {
    case OPEN_ROUND_BRACKET:
        if(   brackets_stack.empty()
           || brackets_stack.top() == OPEN_SQUARE_BRACKET
           || brackets_stack.top() == OPEN_BRACE)
        {
            brackets_stack.push(open_bracket_symb);            
            return  true;        
        }
        return  false;
               
    case OPEN_SQUARE_BRACKET:
        if(   brackets_stack.empty()           
           || brackets_stack.top() == OPEN_BRACE)
        {
            brackets_stack.push(open_bracket_symb);            
            return  true;        
        }
        return  false;
 
    case OPEN_BRACE: 
        if( brackets_stack.empty() )
        {
            brackets_stack.push(open_bracket_symb);            
            return  true;        
        }
        return  false;
 
    default:
        return  false;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  closing_bracket_is_correct
    (
        char               closing_bracket_symb, 
        T_brackets_stack&  brackets_stack
    )
{    
    switch(closing_bracket_symb)
    {
    case CLOSING_ROUND_BRACKET:
        if( brackets_stack.top() == OPEN_ROUND_BRACKET )
        {
            brackets_stack.pop();            
            return  true;        
        }
        return  false;
               
    case CLOSING_SQUARE_BRACKET:
        if( brackets_stack.top() == OPEN_SQUARE_BRACKET )
        {
            brackets_stack.pop();            
            return  true;        
        }
        return  false;
 
    case CLOSING_BRACE: 
        if( brackets_stack.top() == OPEN_BRACE )
        {
            brackets_stack.pop();            
            return  true;        
        }
        return  false;
 
    default:
        return  false;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_open_brackets_arr_or_nothing
    (
        T_expr&            e, 
        T_brackets_stack&  brackets_stack
    )
{
    while(   !e.empty()
          && is_open_bracket(e[0]))
    {
        if(!open_bracket_is_correct(e[0], brackets_stack)) return  false;
        e.erase(0, 1);
    }
    return  true;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_closing_brackets_arr_or_nothing
    (
        T_expr&            e, 
        T_brackets_stack&  brackets_stack
    )
{    
    while(   !e.empty()
          && is_closing_bracket(e[0]))
    {
        if(!closing_bracket_is_correct(e[0], brackets_stack)) return  false;
        e.erase(0, 1);
    }
    return  true;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_num_with_brackets_arr
    (
        T_expr&            e, 
        T_brackets_stack&  brackets_stack
    )
{
    return    parse_open_brackets_arr_or_nothing     (e, brackets_stack)
           && parse_num(e)
           && parse_closing_brackets_arr_or_nothing  (e, brackets_stack);
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_op(T_expr&  e)
{
    if(e.empty())  return  false;    
    switch(e[0])
    {
    case '+':
    case '-':
    case '*':
    case '/':
        e.erase(0, 1);
        return  true; 
 
    default:
        return  false;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  expr_is_correct(const T_expr&  expr)
{
    T_expr  e;    
    std::remove_copy_if(expr.begin(), expr.end(), 
                        std::back_inserter(e), isspace);
 
    T_brackets_stack  brackets_stack;
    if(!parse_num_with_brackets_arr(e, brackets_stack))  return  false;
    while(!e.empty())
    {
        if(   !parse_op                     (e)
           || !parse_num_with_brackets_arr  (e, brackets_stack))  return  false;        
    }
 
    return  brackets_stack.empty();
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите арифметическое выражение, содержащее целые числа,"
              << std::endl
              << "скобки трех типов \"()\", \"[]\", \"{}\" и действия \"+-*/\":"
              << std::endl;
 
    T_expr  expr;
    getline(std::cin, expr);
    std::cout << "Выражение "
              << (expr_is_correct(expr) ? "" : "НЕ ")
              << "корректно."
              << std::endl;
}
Yandex
Объявления
02.03.2011, 11:41     Технологии синтаксического анализа и интерпретации команд
Ответ Создать тему
Опции темы

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