Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
RudolfKrantz
0 / 0 / 1
Регистрация: 13.02.2014
Сообщений: 6
#1

Проверять строку на баланс скобок - C++

22.01.2015, 20:42. Просмотров 498. Ответов 8
Метки нет (Все метки)

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

Проверте пожалуйста

Добавлено через 29 минут
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
 
 
 
bool IsRight(const char*& text, size_t current)
{
   static const std::string Skobu = "{}[]()<>";
 
   bool isOk = true;
 
   for (; *text && isOk; ++text)
   {
      size_t find = Skobu.find_first_of(*text);
 
      if (find != std::string::npos)
      {
        if ((find % 2) == 0)
         {
            isOk = IsRight(++text, find);
         }
         else
         {
            isOk = ((find - current) == 1);
 
            if (current != std::string::npos)
            {
               return isOk;
            }
         }
      }
   }
 
   if (current != std::string::npos)
   {
      isOk = false;
   }
 
   return isOk;
}
 
bool IsRight(const std::string& text)
{
   const char* txt = text.c_str();
 
   return IsRight(txt, std::string::npos);
   
   std::cout << (IsRight(text) ? "right" : "not right") << std::endl;
   
         system("PAUSE");
 
   return 0;
}
 
int main(int argc, const char* argv[])
{
   setlocale (LC_ALL, "RUS");
   int n=0;
   char text;
   fstream F;
   
   F.open("D:\\accounts.txt");
   
   if (F)
        {
         while (!F.eof())
                        {
                         F>>text;
                         cout<<text<<"\t";
                         n++;
                        }
 
         F.close();
 
         cout<<"n="<<n<<endl;
        }
    else cout<<" Г”Г*éë Г*ГҐ Г±ГіГ№ГҐГ±ГІГўГіГҐГІ";
  
    
}
Работает не правильно помогите исправить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2015, 20:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проверять строку на баланс скобок (C++):

Ввести строку символов и найти баланс открывающихся и закрывающихся скобок
ввести строку символов и найти баланс открывающихся и закрывающихся скобок

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

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

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

Баланс скобок
Люди может укажите мне на ошибку в программе по которой не находит баланс..?...

Баланс скобок
Добавьте плиз условие чтоб )(-говорило что не баланс..я прост незнаю ...

8
KolodeznyDiver
2499 / 1649 / 203
Регистрация: 01.06.2013
Сообщений: 3,338
Записей в блоге: 7
22.01.2015, 20:57 #2
find_first_of Вы используете наоборот. Т.е. она ищет в "своей" строке любой символ из аргумента. Вам нужно input_text.find_first_of("{}[]()<>"), если уж хотите её использовать.
0
RudolfKrantz
0 / 0 / 1
Регистрация: 13.02.2014
Сообщений: 6
23.01.2015, 17:39  [ТС] #3
не помогло
0
Catstail
Модератор
23540 / 11650 / 2036
Регистрация: 12.02.2012
Сообщений: 18,992
23.01.2015, 18:03 #4
Ужасный код... Функция не вызывается из main. А проверить баланс круглых скобок - пара пустых:

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 <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
int main(int argc, char *argv[])
{
   fstream F;
   char    s;
   int     n;
   
   F.open("D:\\accounts.txt");
   n=0;
   
   if (F)
        {
         while (!F.eof())
                        {
                         F>>s;
                         if (s=='(') n++;
                         if (s==')') n--;
                         if (n<0) break;
                        }
         F.close();
         if (n==0)
            cout << "OK!" << endl;
         else
            cout << "Bad structure" << endl;    
        }
    else cout << "Cannot open file" << endl;
      
    system("PAUSE");
    return EXIT_SUCCESS;
 
}
0
Mblp
114 / 13 / 18
Регистрация: 07.12.2013
Сообщений: 58
23.01.2015, 18:08 #5
а не проще просто идти по файлу, и если встретили открывающую скобку {[(< увеличили переменную а на 1
встретили закрывающую скобку увеличили переменную b на 1
типо
C++
1
2
3
for (i=0;i<length;i++){
if (stroka[i]=='{') || (stroka[i]=='[') || (stroka[i]=='(') || (stroka[i]=='<') { a++;}
if (stroka[i]=='}') || (stroka[i]==']') || (stroka[i]==')') || (stroka[i]=='>') { b++;}
после чего в конце программы проверяем
C++
1
2
3
4
5
if (a==b) { 
cout<< "Скобки расставлены верно" << "\n"; 
} else {
cout<< "Скобки расставлены неверно" << "\n"; 
}
1
RudolfKrantz
0 / 0 / 1
Регистрация: 13.02.2014
Сообщений: 6
23.01.2015, 18:16  [ТС] #6
попробую
0
Catstail
Модератор
23540 / 11650 / 2036
Регистрация: 12.02.2012
Сообщений: 18,992
23.01.2015, 18:23 #7
Mblp, а я так и делаю... Но этого недостаточно: вот такая конструкция ")(" неправильна, а твой алгоритм ее пропустит. Смотри мой код внимательно.
1
KolodeznyDiver
2499 / 1649 / 203
Регистрация: 01.06.2013
Сообщений: 3,338
Записей в блоге: 7
23.01.2015, 18:36 #8
Цитата Сообщение от RudolfKrantz Посмотреть сообщение
не помогло
Вы же сами хотите программу написать, а не чтобы за Вас написали?
Возьмите за основу то что Вам Catstail предложил и переделайте для контроля нескольких типов скобок. (Или свой вариант допилите).
Вам понадобится стек (последним вошёл - первым вышел). Обычно используют
C++
1
#include <stack>
Но, если он непонятен, можно хоть обычную строку std::string. Появилась открывающая скобка - её в коней строки. Появилась закрывающая - глянули в конец строки. Если там подходящая - удалили последний символ. В конце строка должна оказаться пустой. Думаю, понятно.

Хотя со <stack> удобнее. http://itblogs.org/struktury-dannyx-stek/
0
RudolfKrantz
0 / 0 / 1
Регистрация: 13.02.2014
Сообщений: 6
23.01.2015, 20:01  [ТС] #9
Огромное вам всем спасибо за вашу помощь

Добавлено через 57 минут
0
23.01.2015, 20:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2015, 20:01
Привет! Вот еще темы с решениями:

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

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

Баланс скобок в файле
#include&lt;fstream.h&gt; #include&lt;iostream.h&gt; #include&lt;string.h&gt;...

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


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

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

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