Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465

Баланс скобок

25.02.2012, 06:21. Показов 4371. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро, мне было задано написать программу о том, соответствует ли каждой открывающей скобке, каждая закрывающая, среди символов строки могут встречаться и другие символы... вот он код. Программа не работает при входных данных
ывп()
()вапрвапоаопр()(
()()()()()()()(
в чем проблема? помогите исправить, спасибо большое
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
#include "cstring"
#include "fstream"
 
int main(){
    std::ifstream fin("in.txt", std::ios::in);
    std::ofstream fout("out.txt", std::ios::out);
 
    char str[255];
    char* itr;
 
    fin >> str;
 
    if (strchr(str, ')') == str){
        fout << "Error";
        return 0;
    }
 
 
    for (char* char1 = str; char1; char1 = strchr(char1, '(')){
        
        if (strchr(char1, ')') > char1)
        {
 
            *strchr(char1, ')') = ' ';
 
            *char1 = ' ';
            continue;
        }
    }
 
    if (strchr(str, ')')){
        fout << "Error";
        return 0;
    }
        
 
    fout << "Will be OK";
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2012, 06:21
Ответы с готовыми решениями:

Баланс скобок
Добавьте плиз условие чтоб )(-говорило что не баланс..я прост незнаю #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include...

Баланс скобок
Люди может укажите мне на ошибку в программе по которой не находит баланс..? #include&lt;iostream.h&gt; #include&lt;string.h&gt; ...

Баланс скобок
Помогите пожалуйста!!! Собственно задание: Текст в файле содержит многократно вложенные круглые скобки. Если баланс скобок соблюден,...

38
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.02.2012, 06:40
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    int opn = 0;
    
    for( int i = 0; str[ i ] != '\0'; i++ ) {
    if ( str[ i ] == '(' ) {
        opn++;
    } else if ( str[ i ] == ')' ) {
        opn--;
    }
    
    if ( opn != 0 )
        std::cout << "No." << sdt::endl;
    else
        std::cout << "Yes." << sdt::endl;
    }
Примерно как то так...
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 06:41  [ТС]
Ах да, забыла, нельзя использовать индексацию, как у массива, только функции строк
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.02.2012, 07:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    char *chPtr;
    int opn = 0;
 
    chPtr = std::strchr( str, '(');
 
    while ( chPtr != NULL ) {
    chPtr = std::strchr( chPtr + 1, '(');
    opn++;
    }
 
    chPtr = std::strchr( str, ')');
 
    while ( chPtr != NULL ) {
    chPtr = std::strchr( chPtr + 1, ')');
    opn--;
    }
 
    if ( opn != 0 )
    std::cout << "No." << std::endl;
    else
    std::cout << "Yes." << std::endl;
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 08:24
Toshkarik, Неправильно.
Контр-пример - )(

Цитата Сообщение от kristi1 Посмотреть сообщение
Ах да, забыла, нельзя использовать индексацию, как у массива, только функции строк
Какое-то глупое условие. С функциями строк тут ничего особо и не сделаешь.

Так как-то (писал на коленке):
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
#include <iostream>
#include <stack>
#include <string>
#include <locale>
 
const int MAX_SIZE = 100;
 
bool is_correct( const std::wstring & );
 
int main()
{
    std::locale::global( std::locale("") );
    
    std::wstring str;
    
    std::getline( std::wcin, str );
    
    std::cout << std::boolalpha << is_correct(str) << std::endl;
}
 
bool is_correct( const std::wstring& str )
{
    std::stack< char > stack;
    
    for (std::wstring::const_iterator it = str.begin(); it != str.end(); ++it)
    {   
        if ( *it == L'(' )
            stack.push(L'(');
        else if ( *it == L')' )
        {
            if ( stack.empty() )
                return false;
            stack.pop();
        }
        
    }
    
    return stack.empty();
}
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.02.2012, 08:58
diagon, я ведь привел лишь часть кода, так как видел у нее на этот случай проверку, поэтому не стал писать. Правда оно не совсем полное, нужно проверять не является ли последняя скобка закрывающей. Да и вообще если придраться к заданию то там сказано для каждой открывающей нужна закрывающая, но ничего не сказано про открывающую для каждой закрывающей. Если так, то можно вот тут чуть переписать
C++
1
2
3
4
5
while ( chPtr != NULL ) {
        chPtr = std::strchr( chPtr + 1, ')');
        if ( opn > 0 )
            opn--;
    }
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 15:02  [ТС]
Toshkarik, Эм, я в чужом коде плохо разбираюсь... вы не могли бы тогда вставить готовый код?

Добавлено через 3 минуты
diagon, На вашу программу у меня выдается ошибка
Unhandled exception at 0x7724017E (ntdll.dll) in Project3.exe: 0x00000000: Операция успешно завершена.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.02.2012, 15:07
diagon,
Цитата Сообщение от diagon Посмотреть сообщение
std::stack< char > stack;
C++
1
std::stack< wchar_t > stack;

Не по теме:

в чем профит от wstring? под линем и так все тип-топ, а на винде все равно проблемма с кодировками

1
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 15:11  [ТС]
Jupiter, Не-а, еще ошибочка где-то есть(( Я уже не могу, в понедельник сдавать, а ничего не готово... Я заплатить готова уже, только решили бы
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 15:21
Цитата Сообщение от Jupiter Посмотреть сообщение
в чем профит от wstring? под линем и так все тип-топ, а на винде все равно проблемма с кодировками
Ну я сначала сделал через обычный string, потом посмотрел, что в примере кириллица есть, и сменил на wstring. А стек изменить забыл =\
P.S. Под MinGW у меня кириллица кривовато, но работала.
В чем ошибка - не знаю, возможно строка не считывается.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 15:22  [ТС]
diagon, Эм, а программку-то подправить можете? либо свой вариант, либо мой, а то в понедельник сдаваться, а я не готова, я заплатить могу, если хотите
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
25.02.2012, 15:48
Скобки могут быть и такими: (())

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
#include <cstring>
#include <iostream>
#include <fstream>
 
int main()
{
    std::ifstream fin("in.txt", std::ios::in);
    std::ofstream fout("out.txt", std::ios::out);
 
    char str[255], *pstr = str;
    int opening = 0, closing = 0;
    
    fin >> str;
 
    while( *pstr )
    {
        if( *pstr == '(' )
        {
            opening++;
        }
        else
        {
            if( *pstr == ')' )
            {
                closing++;
            }
        }
        pstr++;
    }
 
    if( opening != closing )
    {
        std::cout << "Error" << std::endl;
        }
    else
    {
        std::cout << "OK" << std::endl;
    }
 
    system( "pause" );
 
    return 0;
}
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 15:54  [ТС]
Том Ардер, попробуйте )(
не раотает на этом
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 15:56
Цитата Сообщение от kristi1 Посмотреть сообщение
diagon, Эм, а программку-то подправить можете? либо свой вариант, либо мой, а то в понедельник сдаваться, а я не готова, я заплатить могу, если хотите
У себя ошибки не вижу. Скорее всего, проблемы с кодировкой.
К тому же у меня не используются функции из <string.h> (а они вроде как вам нужны). Как сделать с функциями - не представляю.
Два момента меня в задаче интересуют - обязательно ли учитывать кириллицу(без нее намного проще), и обязательно ли использовать функции из <string.h>.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 15:57  [ТС]
diagon, функции только стринг, кодровку русскую не надо
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:04
что-то как-то хитро сделано.
алгоритм проверки вроде как простой. баланс открывающих и закрыающих скобок должен быть равен нулю.

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
// Переделать на не использование строк, а использование сишных массивов достаточно просто.
bool IsCorrect(const std::string& str)
{
  const char openBracket = '(';
  const char closeBracket = ')';
  int balance = 0;
  for (size_t i = 0, length = str.length(); i < length; ++i)
  {
    const char ch = str[i];
    if (ch == openBracket)
    {
      ++balance;
    }
    else if (ch == closeBracket)
    {
      --balance;
    }
 
    if (balance < 0)
    {
      // встретилась закрывающая скобка. перед ней не было открывающей.
      // тут сразу понятно, что скобки не правильно расставлены. 
      // поэтому выходим из цикла.
      break;
    }
  }
 
  return balance == 0;
}

ну или более полноая версия для тестиков

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
#include <iostream>
#include <string>
 
bool IsCorrect(const std::string& str)
{
  const char openBracket = '(';
  const char closeBracket = ')';
  int balance = 0;
  for (size_t i = 0, length = str.length(); i < length; ++i)
  {
    const char ch = str[i];
    if (ch == openBracket)
    {
      ++balance;
    }
    else if (ch == closeBracket)
    {
      --balance;
    }
 
    if (balance < 0)
    {
      // встретилась закрывающая скобка. перед ней не было открывающей.
      // тут сразу понятно, что скобки не правильно расставлены. 
      // поэтому выходим из цикла.
      break;
    }
  }
 
  return balance == 0;
}
 
void Check(bool isCorrect, const std::string& str)
{
  if (isCorrect == IsCorrect(str))
  {
    std::cout << "Good work for '" << str << "'" << std::endl;
  }
  else
  {
    std::cout << "Bad work for '" << str << "'" << std::endl;
  }
}
 
int main()
{
  Check(false, "()123456()(");
  Check(false, "()()()()()()()(");
  Check(false, ")()()()()()()");
  Check(true, "((()()))");
  return 0;
}
Версия от Том Ардер неверно будет работать для строки ')('. количество открывающих равно количеству закрывающих. но идут в неправильном порядке.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:05  [ТС]
DU, А саму программу дописать можете? вроде пока все адекватно
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 16:06
Без функций <string.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
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
 
const int MAX_SIZE = 1e3;
 
bool is_correct( const char * );
 
int main()
{
    char str[ MAX_SIZE ];
    fgets( str, MAX_SIZE, stdin ); // или нужный FILE вместо stdin
    printf("%s\n", is_correct(str) ? "Yes" : "No"); 
}
 
bool is_correct( const char * str )
{
    unsigned counter = 0;
    
    while ( *str )
    {
        if ( *str == '(' )
            ++counter;
        else if ( *str == ')' )
        {
            if ( counter == 0 )
                return false;
                
            --counter;
        }
        ++str;
    }
    
    return counter == 0;
}
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:12  [ТС]
stdbool.h нет в Visual Studio 2011
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 16:14
Цитата Сообщение от kristi1 Посмотреть сообщение
stdbool.h нет в Visual Studio 2011
Можете убрать его, в с++ bool и так есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2012, 16:14
Помогаю со студенческими работами здесь

Баланс скобок
проверить правильность расстановки скобок, используя контейнерные типы(стек)

Баланс круглых скобок
Проверить, соблюдается ли в тексте баланс круглых скобок. Для каждой открывающей скобки ‘(‘ должна быть найдена соответствующая закрывающая...

Проверить баланс скобок
:)Здравствуйте. Помогите пожалуйста с задачей. Проверить имеется ли в заданном тексте баланс открывающихся и закрывающихся скобок,...

Баланс скобок в файле
#include&lt;fstream.h&gt; #include&lt;iostream.h&gt; #include&lt;string.h&gt; #include&lt;conio.h&gt; #include&lt;stdio.h&gt; int...

Баланс фигурных скобок в файле
Вообщем нужно прочитать текст (любая программа, в файле name.txt) из файла и проверить баланс фигурных скобок. Всё проходит нормально, но...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru