Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465

Баланс скобок

25.02.2012, 06:21. Показов 4383. Ответов 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;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2012, 06:21
Ответы с готовыми решениями:

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

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

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

38
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:15  [ТС]
Студворк — интернет-сервис помощи студентам
diagon, Ок, а открытие вход/выход файлов?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:20
ну вот наверно вот так:
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;
}
Проверял только компилябельность.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:23  [ТС]
Спасибо, пока тестирую, только со стрингами оно надо в идеале, не сможете написать? а пока тестирую
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 16:23
Цитата Сообщение от 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>, нижнее белье?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:29
Если бы я принимал работу, то предпочел бы четвертый вариант стрингов
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:30  [ТС]
DU, Последний самый?)
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:30
ну да. последний. я уже поправился
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:31  [ТС]
DU, Ок, пока тестирую) если сдам, поцеловать готова автора в щечку и сказать огромное спасибо
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:36
могу сказать, что вариант чтения строки из файла может все испортить.

C++
1
2
3
4
5
fin >> str;
// Вот это считает данные из файла в строку до первого разделителя
// (пробел, табы, прочие isspace(ср)).
// т.е. если в файле будет "(      )", то в строку считается только первая скобка ну и программа
// посчитает, что в файле неверная строка.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:37  [ТС]
DU, Ээээм, другую лабу делала, та же проблема была, ну, вроде через getline можно, но оно с файлами не работает - я не смогла во всяком случае
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:40
вот такая запись загрузит все содержимое файла в строку

C++
1
2
std::string str((std::istreambuf_iterator<char>(fin)), std::istreambuf_iterator<char>());
// это инициалицация строки интервалом итераторов.
если нужно построчно читать, то это уже другие способы. getline вроде должен работать.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:42  [ТС]
DU, Не, построчно оно не надо, эту строку и до и после ставила - не хочет кушать ее, потом ошибка в чтении из файла и переменная str подсвечивается
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:58
ошибка компиляции или что?
чтобы компилилось, нужно указывать все нужные инклуды.
#include <string> // для std::string
#include <iterator> // для std::istreambuf_iterator<char>

если что-то другое при компиляции, то нужно смотреть на код и на ошибку, которая выдается.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 16:59  [ТС]
DU,
1 IntelliSense: no operator ">>" matches these operands
operand types are: std::ifstream >> std::string
2 IntelliSense: no suitable conversion function from "std::string" to "const char *" exists
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 17:04
полный с++ код сюда еще. без него не понятно что вы там написали и почему ругается. и строчку, на которую ругается.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 17:05  [ТС]
DU,
Code
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
#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);
std::string str((std::istreambuf_iterator<char>(fin)), std::istreambuf_iterator<char>());
        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;
}
ругается на
Code
1
2
3
        fin >> str;
 
        fout << ( is_correct(str) ? "Will be OK" : "Error" ) << std::endl;
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 17:09
нет нужных инклудов. я уже написал какие нужно.
строки 11 и 14 не нужны. в 11 строке появляется переменная массив с именем str, хотя строкой выше уже заведена переменная типа std::string с таким же именем. эта же строка инициализируется содержимым файла. поэтому не нужна строка 14

C++
1
fout << ( is_correct(str.c_str()) ? "Will be OK" : "Error" ) << std::endl;
тут к str нужно приписать вызов функции c_str()
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
25.02.2012, 17:18
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
#include <cstring>
#include <iostream>
#include <fstream>
 
int main()
{
    std::ifstream fin("in.txt", std::ios::in);
    std::ofstream fout("out.txt", std::ios::out);
 
    char str[255], *pstr = str;
    int opening = 0, closing = 0;
    int openpos = 0, closepos = 0;
    
    fin >> str;
 
    while( *pstr )
    {
        if( *pstr == '(' )
        {
            opening++;
            openpos = pstr - str;
        }
        else
        {
            if( *pstr == ')' )
            {
                closing++;
                closepos = pstr - str;
            }
        }
        pstr++;
    }
 
    if( (opening != closing) || (closepos < openpos) )
    {
        std::cout << "Error" << std::endl;
    }
    else
    {
        std::cout << "OK" << std::endl;
    }
 
    system( "pause" );
 
    return 0;
}
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
25.02.2012, 21:30  [ТС]
Все отлично, всем огромнейшее спасибо, кто откликнулся, в понедельник сдаваться пойду, а пока другую прогу писать буду, спасибо, мальчики, большое Вам!

Добавлено через 2 часа 39 минут
Ребята, подкажте, в чем проблема в чтении файла? спасибо
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "fstream"
#include "string"
using namespace std;
int main ()
{
 ifstream fin("in.txt", std::ios::in);
 ofstream fout("out.txt", std::ios::out);
 char Str[255];int i = 0;
 while (1)
 {
 char ch = fin.get();
 if (fin.eof())
 break;
 Str[i]= ch;
 i++;
 }
 Str[i] = '\0';
 fout << Str;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2012, 21:30
Помогаю со студенческими работами здесь

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

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

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

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

Баланс фигурных скобок в файле
Вообщем нужно прочитать текст (любая программа, в файле name.txt) из файла и проверить баланс фигурных скобок. Всё проходит нормально, но...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru