С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.71
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
#1

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

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

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

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

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

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

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

Перегрузка круглых скобок как ravalue - C++
Не могу понять, как перегрузить () для того чтобы можно было использовать a(1, 2)=2; вместо a=3; ошибся, наверное не rvalue, а...

Баланс скобок - C++
Добавьте плиз условие чтоб )(-говорило что не баланс..я прост незнаю #include <stdio.h> #include <stdlib.h> #include <conio.h> ...

Баланс скобок - C++
Люди может укажите мне на ошибку в программе по которой не находит баланс..? #include<iostream.h> #include<string.h> ...

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

42
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
10.03.2011, 22:44 #16
barlog,ну можно и без static
1
asics
Freelance
Эксперт С++
2850 / 1785 / 144
Регистрация: 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 / 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++;
1
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 минуту
Помогите исправить пожалуйста!!!..эта задача уже достала...все понятно...но почему не так работает!!!(((
0
asics
Freelance
Эксперт С++
2850 / 1785 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
17.03.2011, 20:45 #20
barlog, Я же написал, смотри выше.
0
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 20:52  [ТС] #21
такое чувство что тут ваще ничего не работает....он не доходит почему-то что если ) то нет баланса...там же контролБ0...а он почему это не считывает((((

Добавлено через 33 секунды
asics, ваш код для меня сложный..не могу разобраться((

Добавлено через 1 минуту
я не понимаю std::cin и всё std::!!!

Добавлено через 1 минуту
#include <algorithm>и надо без этой библиотеки
0
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 21:56 #22
все работает.
1)bz-был заход в блок он нужен для
C++
1
2
3
4
5
6
if(otkr==zakr &&bz==0)
cout<<"est balans";
else if(bz>0)
 cout<<"net balansa";
else if(otkr!=zakr)
cout<<"net balansa";
2)было сказанно что такая ситуация )( дисбаланс.я воспринял это как окончание парсинга,поэтому
C++
1
2
3
4
if(zakr>otkr) {
 bz++;
break;
    }
в тот момент когда закрывающихся скобок больше открывающихся break.если не важно в каком порядке появляются скобки,то ничего не остается как просто посчитать кол-во откр и закр скобок
1
asics
Freelance
Эксперт С++
2850 / 1785 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
17.03.2011, 21:58 #23
Цитата Сообщение от barlog Посмотреть сообщение
#include <algorithm>и надо без этой библиотеки
Ааа ну да, религия, все дела...
1
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 22:02 #24
asics человек сказал,что не разбирается в строках,а вы ему STL библиотеку предлагаете
1
asics
Freelance
Эксперт С++
2850 / 1785 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
17.03.2011, 22:05 #25
Цитата Сообщение от lavan Посмотреть сообщение
asics человек сказал,что не разбирается в строках,а вы ему STL библиотеку предлагаете
Не вижу здесь ничего противозаконного, пусть учиться, ведь за этим он сюда пришол..

Добавлено через 1 минуту
Да и суть алгоритма не в использованию STL, а просто чтобы уменшить размеры кода.
1
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 22:08 #26
Согласен,но если у него задание по строкам,то до STL еще далековато
1
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 22:56  [ТС] #27
всё!!!я переделала!!теперь работает!)))

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 <vcl.h>
#pragma hdrstop
#include<conio.h>
#include<iostream.h>
#include<string.h>
//---------------------------------------------------------------------------
 
#pragma argsused
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" ;
                          return;}    
 
    }
 
        if(kontrol==0)
        cout<<"est balans";
        else
        cout<<"net balansa";
        cout<<endl;
        c++;
Добавлено через 3 минуты
только теперь маленькая проблема...мне нельзя использовать
C++
1
cin.get();getline(cin,str);
и using namespace std;....вместо них gets(), <stdio> , <string>
я прочитала...вроде сделала как в книге написано....а он взял - да и перестал работать!!может кто-нибудь глянет,пожалуйста!много времени не займет..)

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
#include <vcl.h>
#pragma hdrstop
#include<conio.h>
#include<iostream.h>
#include<string.h>
#include<stdio>
//---------------------------------------------------------------------------
 
#pragma argsused
 
using namespace std;
const size=80;
int c=1;
void analize();
 
 
int main()
 {
int kol ;
cout<<" Vvedite kol-vo strok: " ;
cin>>kol ;
for (int w=0 ; w<kol ; w++ )
   analize();
 
  return 0;
}
 
 
void analize()
 {
        char str[size];
         cout<<"Vvedite stroky "<<c<<":";
    int kontrol=0;
        gets(str);
        for(int i=0;i<size;i++)
         {
                if(str[i]=='(')
                kontrol++;
                else
                 if(str[i]==')')
              kontrol--;
 
                 if(kontrol<0)
                 { cout<<"net balansa"<<endl ;
                    c++;
               return;}
 
 
 
        }
        if(kontrol==0)
        cout<<"est balans";
        else
        cout<<"net balansa";
            c++;
}
Добавлено через 12 минут
AAA,всё!!!я разобралась...ошибка не из-за смены функций...он психует из-за цикла!если его убрать и написать например 4 раза analize() в main - то считает все верно...а с этим циклом не верно..почему?...не могу понять(

C++
1
2
3
4
5
6
7
8
9
10
int main()
 {
int kol ;
cout<<" Vvedite kol-vo strok: " ;
cin>>kol ;
for (int w=0 ; w<kol ; w++ )
   analize();
 
  return 0;
}
Добавлено через 1 минуту
просто хочется использовать функцию столько раз сколько хочет пользователь.....не пойму...и чего в цикле эта функция не так работает!!!

Добавлено через 2 минуты
без цикла все хорошо....странно..разницы ведь никакой!
0
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:03 #28
не правильные условия цикла.если введется 1 то ваш цикл не выполнится ни разу,а должен
1
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:10  [ТС] #29
lavan, спасибо...только как это исправить?ноль идей...((...помогите пожалуйста.

Добавлено через 1 минуту
C++
1
w<=kol
тогда выполниться для 1 раза

Добавлено через 30 секунд
а 2 ошибку...я не знаю..помогите пожалуйста!

Добавлено через 3 минуты
он почему -то на самую первую строку ,без ее ввода ,пишет нет баланса!!!
а без цикла нормально...
но от цикла тут ничего не зависит.просто n-раз применяем функцию и все.что не так?((
0
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:10 #30
самое простое
C++
1
2
cin>>kol;
kol--;
1
17.03.2011, 23:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 23:10
Привет! Вот еще темы с ответами:

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

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

Строки. Проверить правильность задания круглых скобок - C++
Проверить, правильно ли в заданном тексте расставлены круглые скобки (т. е. находится ли справа от каждой открывающей скобки...

Проверить правильность расстановки в тексте круглых скобок - C++
Задача: Проверить правильность расстановки в тексте круглых скобок. #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace...


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

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

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