Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.71
barlog
2 / 2 / 1
Регистрация: 03.11.2009
Сообщений: 227
#1

Баланс круглых скобок - C++

10.03.2011, 19:14. Просмотров 6353. Ответов 42
Метки нет (Все метки)

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

Примечание-Обрабатываемый в программе текст должен содержать несколько строк. Но массив строк не формировать, то есть в оперативной памяти хранить одну обрабатываемую строку. Оперативную память резервируем для одной строки. Вводим строку, анализируем её и на её место вводим новую строку.

Помогите люди добрые!!Со строками вообще проблема...не знаю как!!Помогите пожалуйста!!!
http://www.cyberforum.ru/cpp-beginners/thread1686614.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2011, 19:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Баланс круглых скобок (C++):

Вывести все корректные комбинации пар круглых скобок, которые можно сформировать из n скобок
Вывести все корректные комбинации пар круглых скобок, которые можно...

Перегрузка круглых скобок как ravalue
Не могу понять, как перегрузить () для того чтобы можно было использовать a(1,...

Проверить правильность расположения круглых скобок
Пусть задано множество строк. Проверить правильность расположения круглых...

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

Баланс скобок
Доброе утро, мне было задано написать программу о том, соответствует ли каждой...

42
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
10.03.2011, 19:46 #2
еасли я правильно понял задание то:
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
#include<iostream>
#include<string>
using namespace std;
void analize();
static int c=1;
int main() {
    analize();
    analize();
    cin.get();
    return 0;
}
void analize() {
    string str;
     cout<<"Vvedi stroky "<<c<<":";
     short otkr=0,zakr=0;
    getline(cin,str);
    for(int i=0;i<str.size();i++) {
        if(str[i]=='(')
        otkr++;
        else if(str[i]==')')
        zakr++;
    }
    if(otkr==zakr)
    cout<<"est balans";
    else
    cout<<"net balansa";
    cout<<endl;
    c++;
}
1
igorrr37
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
10.03.2011, 20:10 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<algorithm>
 
int main() {
    std::string s;
    int i, dif=0;
    std::cout<<"Kolichestvo strok= ";
    (std::cin>>i).ignore();
    for(; i>0; i--){
        std::cout<<"Input string\n";
        getline(std::cin, s);
        dif+=std::count(s.begin(), s.end(), '(')-std::count(s.begin(), s.end(), ')');
    }
    std::cout<<std::boolalpha<<!dif<<"\n";
}
2
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
10.03.2011, 20:13 #4
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
#include <algorithm>
 
int main(){
  std::string str;
  while( getline(std::cin, str) )
    std::cout << ( std::count(str.begin(), str.end(), '(') == std::count(str.begin(), str.end(), ')')? "YES" : "NO" ) << '\n';
  return 0;
}
1
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
10.03.2011, 21:06 #5
а вот такая комбинация считается "сбалансированной"?
")("
1
Kastaneda
10.03.2011, 21:08
  #6

Не по теме:

igorrr37, я такого еще не видел)

C++
1
(std::cin>>i).ignore();

1
barlog
2 / 2 / 1
Регистрация: 03.11.2009
Сообщений: 227
10.03.2011, 21:24  [ТС] #7
no0ker, нет такая комбинация ")(" не подходит
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
10.03.2011, 21:26 #8
barlog, Тогда ни один вышенаписаной код не катит
1
barlog
2 / 2 / 1
Регистрация: 03.11.2009
Сообщений: 227
10.03.2011, 21:36  [ТС] #9
lavan, static int c=1;
а зачем это?

Добавлено через 3 минуты
в задании же сказано на каждую открывающуюся "(".......а ")(" - здесь сначала закрывающая...впрочем как в обычном тесте....(..)...((......))....(..)
0
ValeryS
Модератор
7126 / 5394 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
10.03.2011, 21:44 #10
может сделать так
переменная =0
если скобка ( +1
если ) -1
после каждого действия проверять переменную
если отрицательно тут же выходить закрывающих больше чем открывающих = непорядок
дошли до конца текста если 0 есть баланс
любое число(положительное отрицательное отработали ранее) нет баланса

Добавлено через 3 минуты
кстати из задания непонятно баланс во всем тексте или в каждой строке??
1
barlog
2 / 2 / 1
Регистрация: 03.11.2009
Сообщений: 227
10.03.2011, 22:28  [ТС] #11
ValeryS, а чем этот алгоритм лучше предыдущих?опть таки , если у нас будет ")(" то в итоге будет 0, а баланса нет.
в задание написано - Проверить, соблюдается ли в тексте баланс круглых скобок.

Добавлено через 3 минуты
хотя из примечания -Вводим строку, анализируем её и на её место вводим новую строку.

выходит анализируем строку....но в задание именно текст
0
ValeryS
Модератор
7126 / 5394 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
10.03.2011, 22:29 #12
Цитата Сообщение от ValeryS Посмотреть сообщение
после каждого действия проверять переменную
если отрицательно тут же выходить закрывающих больше чем открывающих = непорядок
т.е если у тебя первая (
перем =1
потом )
перем=0
продолжаем проверку
другая ситуация
)
перем=-1
тут же выходим явный дисбаланс
1
barlog
2 / 2 / 1
Регистрация: 03.11.2009
Сообщений: 227
10.03.2011, 22:32  [ТС] #13
ValeryS, ага действительно,все ясно,логично..)
0
ValeryS
Модератор
7126 / 5394 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
10.03.2011, 22:34 #14
Цитата Сообщение от barlog Посмотреть сообщение
отя из примечания -Вводим строку, анализируем её и на её место вводим новую строку.
выходит анализируем строку....но в задание именно текст
вот это я и спрашивал!
если ( на первой стороке
а ) на 20
это сбалансированный текст или нет?
1
barlog
2 / 2 / 1
Регистрация: 03.11.2009
Сообщений: 227
10.03.2011, 22:43  [ТС] #15
ValeryS, по идеи да,да сбалансированный
0
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
10.03.2011, 22:44 #16
barlog,ну можно и без static
1
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
10.03.2011, 22:57 #17
Пробуй эту
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
#include <iostream>
#include <string>
#include <algorithm>
 
int get_idx_close_bracket(std::string &str, int x0){
  for(int i = x0 + 1; i < str.length(); ++i){
    if(str[i] == ')')
      return i;
  }
  return -1;
}
 
int main(){
  std::string str;
  while( getline(std::cin, str) ){
    size_t cnt = 0, _cnt = 0;
    _cnt = std::count(str.begin(), str.end(), '(') + std::count(str.begin(), str.end(), ')');
    while( get_idx_close_bracket(str, str.find_last_of('(')) != -1 && str.find_last_of('(') != std::string::npos ){
      cnt += 2;
      str.erase(str.find_last_of('('), 1);
      str.erase(get_idx_close_bracket(str, str.find_last_of('(')), 1);
    }
    std::cout << ( _cnt == cnt? "YES" : "NO" ) << '\n';
  }
  return 0;
}
1
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
10.03.2011, 23:07 #18
если я все правильно понял,то надо обработать 2 строки и ввод с клавиатуры.
а чтобы избежать )( можно что то типа этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(int i=0;i<str.size();i++) {
                if(str[i]=='(')
                otkr++;
                else if(str[i]==')')
                zakr++;
                if(zakr>otkr) {
                 bz++;
                 break;
                }
        }
        if(otkr==zakr &&bz==0)
        cout<<"est balans";
        else if(bz>0)
         cout<<"net balansa";
        else if(otkr!=zakr)
        cout<<"net balansa";
        cout<<endl;
        c++;
1
barlog
2 / 2 / 1
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 20:41  [ТС] #19
lavan, а не могли бы вы пояснить суть вашего алгоритма,пожалуйста.не очень ясно за что отвечает bz...и как это спасает от случая )(?

Добавлено через 1 час 33 минуты
использую выше предложенный алгоритм -
первая (
перем =1
потом )
перем=0
продолжаем проверку
другая ситуация
)
перем=-1
тут же выходим явный дисбаланс


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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include<conio.h>
#include<iostream.h>
#include<string.h>
//---------------------------------------------------------------------------
 
#pragma argsused
 
using namespace std;
void analize();
int c=1;
int main() {
        analize();
        analize();
        cin.get();
        return 0;
}
void analize() {
        string str;
         cout<<"Vvedistroky "<<c<<":";
    int kontrol=0;
        getline(cin,str);
        for(int i=0;i<str.size();i++)
         {
                if(str[i]=='(')
                kontrol++;
                else if(str[i]==')')
               {kontrol--;
                 if(kontrol<0)
                  cout<<endl<<"net balansa" ;
 
                }
         break;
        }
        if(kontrol==0)
        cout<<"est balans";
        else
        cout<<"net balansa";
        cout<<endl;
        c++;
}
Добавлено через 27 секунд
И ПОЧЕМУ ОН НЕПРАВИЛЬНО РАБОТАЕТ!!!НЕ РЕАГИРУЕТ НА )(!!!

Добавлено через 1 минуту
Помогите исправить пожалуйста!!!..эта задача уже достала...все понятно...но почему не так работает!!!(((
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
17.03.2011, 20:45 #20
barlog, Я же написал, смотри выше.
0
17.03.2011, 20:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 20:45
Привет! Вот еще темы с решениями:

Баланс скобок
Добавьте плиз условие чтоб )(-говорило что не баланс..я прост незнаю ...

Баланс скобок
Люди может укажите мне на ошибку в программе по которой не находит баланс..?...

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

Строки. Проверить правильность задания круглых скобок
Проверить, правильно ли в заданном тексте расставлены круглые скобки (т. е....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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