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

Проверить правильнсть расстановки круглых скобкок - C++

Восстановить пароль Регистрация
 
Vlad708
4 / 4 / 0
Регистрация: 04.11.2012
Сообщений: 72
04.11.2012, 12:11     Проверить правильнсть расстановки круглых скобкок #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
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main ()
{
   clrscr ();
   char txt[256];
   printf("Введите произвольный текст имеющий скобки\n");
   gets(txt);
   /*Объявляю флажки, для определения скобок*/
   int f_o=0; //Флажок, открывающей скобки
   int f_z=0; //Флажок, закрывающей скобки
   int f_e=0; //Флажок ошибки
   for (int i=0; i<strlen(txt); i++) // Запускаю цикл проверки
   {
      if (txt[i]!='(' || txt[i]!=')') continue;
     if (txt[i]=='(') /* Проверка, если найдена открывающая скобка,
     флажок открытия включаю*/
     {
        f_o=1;
        continue; //Перехожу на следующию итерацию
     }
 
      if (txt[i]==')' && f_o==1) /* Проверка. если найдена закрывающая скобка
      и включен флажок открывающей скобки... значит флажок закрытия включаю*/
     {
         f_z=1;
     }
      if ( f_o && f_z ) /** Если оба флажка включены значит скобки
      раставлены верно и я их выключаю*/
      {
     f_o=f_z=0;
     continue; // Перехожу на следующую итерацию
      }
      else
      {
    /* Проверка, если хотя один из флажков выключен, значит скобки раставлены
    неверно... следовательно флажок ошибки я подключаю*/
    if ( ( f_o==1 && !f_z) || ( f_o!=1 && f_z==1 ) )
       {
         f_e=1;
         break; // Затем, если ошибка найдена, цикл останавливается
       }
      }
   }
   /* Делаю проверку на значения флажка ошибки */
   if (f_e) {
   printf("Ошибка");
   }
   else {
   printf("Верно");
   }
   getch ();
 
}
Во время проверки программы задаю такие варианты:

1) (Hello Пишет верно, хотя на самом деле должно быть "Неверно"
2) Hello ) Пишет верно, хотя на самом деле должно быть "Неверно"
3) Hello Пишет верно, хотя на самом деле должно быть "Неверно", так как скобок вообще нет
4) (Hello) Ну и здесь отвечает "Верно"

Не могу понять в чем проблема, может где с флажками намудрил?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 12:11     Проверить правильнсть расстановки круглых скобкок
Посмотрите здесь:

C++ Проверить правильность расстановки символов “/*” и “*/” для комментариев
C++ Дана строка символов проверить правильность расстановки круглых и квадратных скобок в выражениях
C++ Использование стека. Дана строка символов. Проверьте правильность расстановки в ней круглых скобок.
C++ Строки. Проверить правильность задания круглых скобок
C++ Проверить программу на соответствие числа открывающихся и закрывающихся круглых и фигурных скобок
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
04.11.2012, 12:40     Проверить правильнсть расстановки круглых скобкок #2
Я переделал - работает.
Посмотрите мой пример и, думаю, найдете ошибки в своем.

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
#include <list>
#include <iostream>
 
using namespace std;
typedef list<char> _List;
 
bool isCorrected(char m_symbol)
{
    if ((m_symbol != '(') && (m_symbol != ')'))
        return false;
    else
        return true;
}
 
int main(void)
{
    setlocale(LC_ALL, "Russian");
 
    char symbol;
    bool err = false;
    bool f_z = false;
    bool f_o = false;
    _List SymbolsList;
 
    cout << "Введите произвольный текст имеющий скобки.\n";
    do
    {
        cin.get(symbol);
 
        SymbolsList.push_back(symbol);
    }
    while (symbol != '\n');
    system("cls"); 
 
    for(_List::iterator i = SymbolsList.begin(); i != SymbolsList.end(); i++)
    {
        if (!SymbolsList.empty())
        {
            if (!isCorrected(*i))
                continue;
 
            if ((*i) == '(')
                f_o = true;
 
            if ((*i) == ')')
                f_z = true;
        }
    }
 
    if (!f_o || !f_z)
        err = true;
 
    if (!err)
        cout << "Верно" << endl;
    else 
        cout << "Неверно" << endl;
 
    system("pause >> NULL");
    return 0;
}
Vlad708
4 / 4 / 0
Регистрация: 04.11.2012
Сообщений: 72
04.11.2012, 12:50  [ТС]     Проверить правильнсть расстановки круглых скобкок #3
Все равно не могу понять в чем проблема(
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
04.11.2012, 13:02     Проверить правильнсть расстановки круглых скобкок #4
вынесите проверку if ( ( f_o==1 && !f_z) || ( f_o!=1 && f_z==1 ) )
из тела цикла и упростите ее. Для удобства переведите целочисленные переменные флагов в булевые переменные, вы сами себя ими запутали.

Добавлено через 8 минут
Тоже работающий вариант, сделанный по типу вашего
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
void main ()
{
    char txt[256];
    printf("Введите произвольный текст имеющий скобки\n");
    gets(txt);
 
    int f_o=0; //Флажок, открывающей скобки
    int f_z=0; //Флажок, закрывающей скобки
    int f_e=0; //Флажок ошибки
    for (int i=0; i<strlen(txt); i++) // Запускаю цикл проверки
    {
        if (txt[i]=='(')
            f_o=1;
 
        if (txt[i]==')')
            f_z=1;
    }
 
    if ( f_o == 0 || f_z == 0 )
        f_e = 1;
 
    if (f_e == 1)
        printf("Ошибка");
    else
        printf("Верно");
 
    getch ();
}
Vlad708
4 / 4 / 0
Регистрация: 04.11.2012
Сообщений: 72
04.11.2012, 13:09  [ТС]     Проверить правильнсть расстановки круглых скобкок #5
Цитата Сообщение от Afflicted Посмотреть сообщение
Тоже работающий вариант
Ну а вот например я ввел:
)Hello(
Пишет: Верно
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
04.11.2012, 13:11     Проверить правильнсть расстановки круглых скобкок #6
поставьте проверочку

C++
1
        if ((txt[i]==')') && f_o == 1)
Vlad708
4 / 4 / 0
Регистрация: 04.11.2012
Сообщений: 72
04.11.2012, 13:18  [ТС]     Проверить правильнсть расстановки круглых скобкок #7
Цитата Сообщение от Afflicted Посмотреть сообщение
поставьте проверочку

C++
1
        if ((txt[i]==')') && f_o == 1)
угу, добавил
Но! Если задать такое :
(Hello))
Пишет "Верно", но ведь есть поставленная неправильная скобка((
rinat_w
89 / 85 / 4
Регистрация: 13.11.2011
Сообщений: 183
04.11.2012, 13:23     Проверить правильнсть расстановки круглых скобкок #8
Vlad708, можно вот так в 18 строчек:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
bool fn(std::string str){
     int bracket=0, exist=0;
     for (int i=0; i<str.size(); i++){
         if (str[i]=='(') bracket++;
         if (str[i]==')') bracket--;
         if (bracket<0) return false;
         if (bracket>0) exist=1;
     }
     return exist && !bracket;
}
int main(){
    std::string str;
    getline(std::cin, str);
    std::cout<< (fn(str) ? "true" : "false") << std::endl;
    system("pause");
    return 0;
}
Vlad708
4 / 4 / 0
Регистрация: 04.11.2012
Сообщений: 72
04.11.2012, 13:26  [ТС]     Проверить правильнсть расстановки круглых скобкок #9
Цитата Сообщение от rinat_w Посмотреть сообщение
вот так
Такой способ я делал, препод сказал верно, но типо в задаче не было сказано методом: сравнения кол-ва открывающихся скобок и закрывающихся проверять ((
rinat_w
89 / 85 / 4
Регистрация: 13.11.2011
Сообщений: 183
04.11.2012, 13:29     Проверить правильнсть расстановки круглых скобкок #10
Vlad708, у меня подругому написано, мой код не только сравнивает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 14:49     Проверить правильнсть расстановки круглых скобкок
Еще ссылки по теме:

C++ Проверить правильность расстановки скобок
Проверить правильность расстановки в тексте круглых скобок C++
Написать рекурсивную функцию, проверяющую правильность расстановки круглых скобок в строке C++

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

Или воспользуйтесь поиском по форуму:
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
04.11.2012, 14:49     Проверить правильнсть расстановки круглых скобкок #11
Vlad708, исходный код парсера скобок на С++. посмотрите вы еще такого не видели
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
int main()
{
    static char str[256] = "c+(+ i)s o(bjec)t-ori(ente)d pr((ogramm)ing la(ngu)age";
 
    printf("%s\n",str);
 
    char pchars[] = "()"; bool error = false;
    for (int t = 0; pchars[t] != '\0'; t++)
    {
        for (int i = 0; str[i] != '\0' && !error; i++)
        {
            int k = (t > 0) ? i-1 : i+1;
            while (((t > 0) ? (k >= 0) : 
                (str[k] != '\0')) && str[i] == pchars[t])
                if (strchr(pchars,str[(t > 0) ? k-- : k++])) break;
            if ( (str[(t > 0) ? k+1 : k-1] == pchars[t] || 
                ((t < 1) ? (str[k] == '\0') : 0)) && 
                k != ((t > 0) ? i-1 : i+1)) error = true;
            else if (str[(t > 0) ? k+1 : k-1] == 
                (t > 0) ? '(' : ')') i = ((t > 0) ? i : k-1); 
        }
    }
 
    printf("error = %s\n",!error ? "false" : "true");
 
    _getch();
 
    return 0;
}
http://liveworkspace.org/code/c934bf...3e6747fcbc19fb
Миниатюры
Проверить правильнсть расстановки круглых скобкок  
Yandex
Объявления
04.11.2012, 14:49     Проверить правильнсть расстановки круглых скобкок
Ответ Создать тему
Опции темы

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