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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.71
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
10.03.2011, 19:14     Баланс круглых скобок #1
Проверить, соблюдается ли в тексте баланс круглых скобок. Для каждой открывающей скобки ‘(‘ должна быть найдена соответствующая закрывающая ‘)’.

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

Помогите люди добрые!!Со строками вообще проблема...не знаю как!!Помогите пожалуйста!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2011, 19:14     Баланс круглых скобок
Посмотрите здесь:

C++ Баланс скобок
Баланс скобок C++
C++ Баланс скобок
Баланс скобок C++
Баланс скобок C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lavan
51 / 51 / 1
Регистрация: 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++;
}
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
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";
}
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
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;
}
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
10.03.2011, 21:06     Баланс круглых скобок #5
а вот такая комбинация считается "сбалансированной"?
")("
Kastaneda
10.03.2011, 21:08
  #6

Не по теме:

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

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

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

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

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

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

выходит анализируем строку....но в задание именно текст
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
10.03.2011, 22:29     Баланс круглых скобок #12
Цитата Сообщение от ValeryS Посмотреть сообщение
после каждого действия проверять переменную
если отрицательно тут же выходить закрывающих больше чем открывающих = непорядок
т.е если у тебя первая (
перем =1
потом )
перем=0
продолжаем проверку
другая ситуация
)
перем=-1
тут же выходим явный дисбаланс
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
10.03.2011, 22:32  [ТС]     Баланс круглых скобок #13
ValeryS, ага действительно,все ясно,логично..)
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
10.03.2011, 22:34     Баланс круглых скобок #14
Цитата Сообщение от barlog Посмотреть сообщение
отя из примечания -Вводим строку, анализируем её и на её место вводим новую строку.
выходит анализируем строку....но в задание именно текст
вот это я и спрашивал!
если ( на первой стороке
а ) на 20
это сбалансированный текст или нет?
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
10.03.2011, 22:43  [ТС]     Баланс круглых скобок #15
ValeryS, по идеи да,да сбалансированный
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
10.03.2011, 22:44     Баланс круглых скобок #16
barlog,ну можно и без static
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
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;
}
lavan
51 / 51 / 1
Регистрация: 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++;
barlog
2 / 2 / 0
Регистрация: 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 минуту
Помогите исправить пожалуйста!!!..эта задача уже достала...все понятно...но почему не так работает!!!(((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 20:45     Баланс круглых скобок
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
17.03.2011, 20:45     Баланс круглых скобок #20
barlog, Я же написал, смотри выше.
Yandex
Объявления
17.03.2011, 20:45     Баланс круглых скобок
Ответ Создать тему
Опции темы

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