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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.78
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
#1

Баланс скобок - C++

25.02.2012, 06:21. Просмотров 2333. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2012, 06:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Баланс скобок (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:04 #16
что-то как-то хитро сделано.
алгоритм проверки вроде как простой. баланс открывающих и закрыающих скобок должен быть равен нулю.

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;
}
Версия от Том Ардер неверно будет работать для строки ')('. количество открывающих равно количеству закрывающих. но идут в неправильном порядке.
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:05  [ТС] #17
DU, А саму программу дописать можете? вроде пока все адекватно
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 16:06 #18
Без функций <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;
}
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:12  [ТС] #19
stdbool.h нет в Visual Studio 2011
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 16:14 #20
Цитата Сообщение от kristi1 Посмотреть сообщение
stdbool.h нет в Visual Studio 2011
Можете убрать его, в с++ bool и так есть.
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:15  [ТС] #21
diagon, Ок, а открытие вход/выход файлов?
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:20 #22
ну вот наверно вот так:
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
#include <iostream>
#include <fstream>
#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;
}
 
int main()
{
  std::ifstream fin("in.txt", std::ios::in);
  std::ofstream fout("out.txt", std::ios::out);
 
  std::string str;
  fin >> str;
  const bool isCorrect = IsCorrect(str);
 
  if (isCorrect)
  {
    fout << "Ok" << std::endl;
  }
  else
  {
    fout << "Error" << std::endl;
  }
 
  return 0;
}
Проверял только компилябельность.
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:23  [ТС] #23
Спасибо, пока тестирую, только со стрингами оно надо в идеале, не сможете написать? а пока тестирую
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 16:23 #24
Цитата Сообщение от kristi1 Посмотреть сообщение
diagon, Ок, а открытие вход/выход файлов?
Что-ж так тяжко то...
В условии про файлы ничего сказано не было, между прочим.
Переделал ваш код:
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
#include "cstring"
#include "fstream"
 
bool is_correct( const char * );
 
int main(){
        std::ifstream fin("in.txt", std::ios::in);
        std::ofstream fout("out.txt", std::ios::out);
 
        char str[255];
 
        fin >> str;
 
        fout << ( is_correct(str) ? "Will be OK" : "Error" ) << std::endl;
 
        return 0;
}
 
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;
}
со стрингами
С какими именно стрингами? Шаблонный класс из STL, массив char'ов, <string.h>, нижнее белье?
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:29 #25
Если бы я принимал работу, то предпочел бы четвертый вариант стрингов
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:30  [ТС] #26
DU, Последний самый?)
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:30 #27
ну да. последний. я уже поправился
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:31  [ТС] #28
DU, Ок, пока тестирую) если сдам, поцеловать готова автора в щечку и сказать огромное спасибо
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:36 #29
могу сказать, что вариант чтения строки из файла может все испортить.

C++
1
2
3
4
5
fin >> str;
// Вот это считает данные из файла в строку до первого разделителя
// (пробел, табы, прочие isspace(ср)).
// т.е. если в файле будет "(      )", то в строку считается только первая скобка ну и программа
// посчитает, что в файле неверная строка.
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:37  [ТС] #30
DU, Ээээм, другую лабу делала, та же проблема была, ну, вроде через getline можно, но оно с файлами не работает - я не смогла во всяком случае
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2012, 16:37
Привет! Вот еще темы с ответами:

Баланс скобок в файле - C++
#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...

Проверять строку на баланс скобок - C++
Драствуйте. Условие такое - написать програмку которая будет проверять строку на баланс скобок (закрытые, открытые) и чтобы текст читало с...

Проверить баланс скобок в текстовом файле - C++
1. из файла f1 выводится текст (текст со скобками) 2. проверяется соответствие скобок 3. если не соответствуют, то в фаил f2 вводиться...

Проверить баланс скобок в тексте программы - C++
Задача: Создать файл в котором есть программа бейсик. Проверить на соответствие открытые и закрытые скобки. Как отрыть файл и считать с...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.02.2012, 16:37
Ответ Создать тему
Опции темы

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