Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 20:52  [ТС]     Баланс круглых скобок #21
такое чувство что тут ваще ничего не работает....он не доходит почему-то что если ) то нет баланса...там же контролБ0...а он почему это не считывает((((

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

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

Добавлено через 1 минуту
#include <algorithm>и надо без этой библиотеки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lavan
51 / 51 / 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.если не важно в каком порядке появляются скобки,то ничего не остается как просто посчитать кол-во откр и закр скобок
asics
Freelance
Эксперт C++
 Аватар для asics
2839 / 1776 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
17.03.2011, 21:58     Баланс круглых скобок #23
Цитата Сообщение от barlog Посмотреть сообщение
#include <algorithm>и надо без этой библиотеки
Ааа ну да, религия, все дела...
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 22:02     Баланс круглых скобок #24
asics человек сказал,что не разбирается в строках,а вы ему STL библиотеку предлагаете
asics
Freelance
Эксперт C++
 Аватар для asics
2839 / 1776 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
17.03.2011, 22:05     Баланс круглых скобок #25
Цитата Сообщение от lavan Посмотреть сообщение
asics человек сказал,что не разбирается в строках,а вы ему STL библиотеку предлагаете
Не вижу здесь ничего противозаконного, пусть учиться, ведь за этим он сюда пришол..

Добавлено через 1 минуту
Да и суть алгоритма не в использованию STL, а просто чтобы уменшить размеры кода.
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 22:08     Баланс круглых скобок #26
Согласен,но если у него задание по строкам,то до STL еще далековато
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 минуты
без цикла все хорошо....странно..разницы ведь никакой!
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:03     Баланс круглых скобок #28
не правильные условия цикла.если введется 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-раз применяем функцию и все.что не так?((
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:10     Баланс круглых скобок #30
самое простое
C++
1
2
cin>>kol;
kol--;
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:12  [ТС]     Баланс круглых скобок #31
lavan, это как?извините,не очень понятно и куда это писать?
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:15     Баланс круглых скобок #32
учитываем возможность пустого ввода
C++
1
2
3
//был ввод теперь проверяем
int size=string.size();
if(size==0)cout<<"сторка пуста";
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:16  [ТС]     Баланс круглых скобок #33
ВСЁ!!Я ИСПРАВИЛА !!вот так...
C++
1
2
3
4
5
6
7
8
9
10
int main()
 {
int k ;
cout<<" Vvedite kol-vo strok: " ;
cin>>k ;
for ( ; k>0 ;k-- )
   analize();
 
  return 0;
}
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:16     Баланс круглых скобок #34
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
 {
int kol ;
cout<<" Vvedite kol-vo strok: " ;
cin>>kol ;
kol--;
for (int w=0 ; w<kol ; w++ )
   analize();
 
  return 0;
}
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:17  [ТС]     Баланс круглых скобок #35
так работает...вроде)
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:18     Баланс круглых скобок #36
а теперь в ваш "иправленный код " введите 1
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:23  [ТС]     Баланс круглых скобок #37
аа...нее...не работает...

Добавлено через 42 секунды
да оно вообще не работает!!!во всех строках ни смотря ни на что пишет -нет баланса!

Добавлено через 1 минуту
пробейте в билдере...он сразу пишет на первую строку без ее ввода - нет баланса..и потом на остальные тоже!

Добавлено через 1 минуту
lavan, вы в своем коде ничего не сделали ..только чтобы джля 1 строки...но как он у вас вообще работает!если для одной строки он сразу выдает(БЕЗ ЕЕ ВВОДА!!!) -нет баланса!
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:36     Баланс круглых скобок #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
41
42
43
44
#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;
        int bz;
         cout<<"Vvedi stroky "<<c<<":";
         short otkr=0,zakr=0;
        getline(cin,str);
        if(!str.size()) {
            cout<<"stroka pysta\n";
            return;
        }
        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";
                else if(otkr==0 && zakr==0)
                cout<<"skobok net";
                cout<<endl;
 
        c++;
}
просто забейте это в компилятор
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:39  [ТС]     Баланс круглых скобок #39
lavan, спасибо большое!но у мення это и так работает.)
вот видите у вас в main только 2 раза функция вызывается,а я хочу чтобы ее можно было вызвать столько сколько душе захочется.ну и вот-тогда все и не работает(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 23:49     Баланс круглых скобок
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:49     Баланс круглых скобок #40
C++
1
2
3
4
5
6
7
short r;
cout<<"Vvedi kol strok:";
cin>>r;
r--;
cin.get();//poimali '\n'
for(int i=0;i<r;i++)
    analize();
Yandex
Объявления
17.03.2011, 23:49     Баланс круглых скобок
Ответ Создать тему
Опции темы

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