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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 653
#1

Проверка правильности расстановки скобок - C++

20.12.2010, 14:15. Просмотров 1948. Ответов 0
Метки нет (Все метки)

Доброго время суток товарищи программисты. Дано задание:
Требуется проверить правильность расстановки скобок в некотором выражении. Если каждой открывающей скобке соответствует закрывающая, то скобки в выражении сбалансированы.
Например:

* (2+4)*(3+5)*(x-2) - правильно
* (x+y-2)*(2+5)+(16-x)) - лишняя закрывающая скобка
* ((((4+5)*5)-5+4)/2 - пропущена закрывающая скобка

Код разделён на 3 модуля: модуль стека (MyStack), модуль анализатора (StrAnalizer) и головная программа (BracketsBalance.cpp). Код, относящийся к стеку, находится в пространстве имён mystack. Функции анализатора находятся в пространстве имён string_analizer.

Модуль MyStack: MyStack.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __MYSTACK_H__
#define __MYSTACK_H__
 
namespace mystack {
 
    void push(char);
 
    char pop();
 
    bool is_empty();
 
}   // namespace mystack
 
#endif
MyStack.сpp
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
#include "stdafx.h"
#include "MyStack.h"
 
namespace mystack {
 
int stack_head = 0;
const int stack_max_length = 128;
char stack_holder[stack_max_length];
 
void error(char *message) {
    printf("Error: %s", message);
    abort();
}
 
void push(char ch) {
    if (stack_head < stack_max_length)
        stack_holder[stack_head++] = ch;
    else
        error("Stack holder is full");
}
 
 
char pop() {
    if (stack_head > 0)
        return stack_holder[--stack_head];
    else
        error("Stack is empty");
    assert(false);
    return 0;
}
 
bool is_empty() {
    return stack_head == 0;
}
 
}
Модуль StrAnalizer

StrAnalizer.h:
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
#ifndef __STRANALIZER_H__
#define __STRANALIZER_H__
 
namespace string_analizer {
 
    void analize(const char *str);
 
}   // namespace string_analizer
 
#endif
 
 
StrAnalizer.cpp
 
#include "StdAfx.h"
#include "StrAnalizer.h"
#include "MyStack.h"
 
namespace string_analizer {
 
    void error(const char *message) {
        printf("Analizer error: %s", message);
        abort();
    }
 
    bool is_open_bracket(char ch) {
        return ch == '(' || ch == '{' || ch == '[';
    }
 
    char get_pair(char bracket) {
        switch(bracket) {
            case '(' : return ')';
            case '{' : return '}';
            case '[' : return ']';
            default  : error("Unknown bracket");
        }
        assert(false);
        return 0;
    }
 
    bool is_close_bracket(char ch) {
        return ch == get_pair('(') || ch == get_pair('{') || ch == get_pair('[');
    }
 
    void analize(const char *str) {
        for(int i=0; str[i]!=0; i++) {
            if (is_open_bracket(str[i]))
                mystack::push(str[i]);
            if (is_close_bracket(str[i])) {
                if (mystack::is_empty()) 
                    error("Invalid balance (close bracket without open bracket)");
                char ch = mystack::pop();
                if (get_pair(ch) != str[i]) error("Invalid pair");
            }
        }
        if (!mystack::is_empty()) 
            error("Invalid balance (open bracket without close bracket)");
    }
 
}
Головная программа:
BracketsBalance.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "StrAnalizer.h"
 
namespace sa = string_analizer;
 
int main(int argc, char* argv[])
{
    char buf[128];
    printf("Enter expression to analize: ");
    scanf("%s", buf);
    sa::analize(buf);
    return 0;
}
Компилятор выдает ошибки:
Warning 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\users\администратор\documents\visual studio 2008\projects\c++\console\p1073\bracketsbalance\bracketsbalance\bracketsbalance.cpp 11 BracketsBalance
Error 2 error C3861: 'abort': identifier not found c:\users\администратор\documents\visual studio 2008\projects\c++\console\p1073\bracketsbalance\bracketsbalance\stranalizer.cpp 9 BracketsBalance
Error 3 error C3861: 'assert': identifier not found c:\users\администратор\documents\visual studio 2008\projects\c++\console\p1073\bracketsbalance\bracketsbalance\stranalizer.cpp 23 BracketsBalance
Error 4 error C3861: 'abort': identifier not found c:\users\администратор\documents\visual studio 2008\projects\c++\console\p1073\bracketsbalance\bracketsbalance\mystack.cpp 12 BracketsBalance
Error 5 error C3861: 'assert': identifier not found c:\users\администратор\documents\visual studio 2008\projects\c++\console\p1073\bracketsbalance\bracketsbalance\mystack.cpp 28 BracketsBalance
Warning 6 warning C6031: Return value ignored: 'scanf' c:\users\администратор\documents\visual studio 2008\projects\c++\console\p1073\bracketsbalance\bracketsbalance\bracketsbalance.cpp 11 BracketsBalance

Как-будто компилятор не "видит" или "не понимает" функции: 'abort' и 'assert' . Прошу меня простить если не правильно выразился, но как сделать, так чтобы компилятор понимал функции: 'abort' и 'assert' . У меня у вы пока не хватает мозгов. Подскажите пожалуйста, что нужно исправить. Использую среду разработки Visual Studio 2008. Всем заранее огромное спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2010, 14:15     Проверка правильности расстановки скобок
Посмотрите здесь:

Проверить правильность расстановки и вложенности скобок в тексте (абстрактный стек) C++
Проверка правильности расстоновки скобок C++
Программа проверки правильности скобок C++
C++ Верность расстановки скобок
C++ Проверить правильность расстановки скобок
Проверка правильности расстановки скобок в строке (рекурсия) C++
Проверить правильность расстановки в тексте круглых скобок C++
Написать рекурсивную функцию, проверяющую правильность расстановки круглых скобок в строке C++
C++ В символьной строке проверить правильность расстановки скобок
C++ Проверить в тексте файла правильность расстановки открывающих и закрывающих скобок
C++ Проверить правильность расстановки в тексте круглых скобок (конечный автомат)
C++ Проверить правильность расстановки в тексте круглых скобок. Текст заканчивается точкой

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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