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

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

Войти
Регистрация
Восстановить пароль
 
Vlad708
4 / 4 / 0
Регистрация: 04.11.2012
Сообщений: 72
#1

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

04.11.2012, 12:11. Просмотров 743. Ответов 10
Метки нет (Все метки)

Дана задача:

Дан текст. Проверить, правильно ли в нем расставлены круглые скобки ( т.е. находится ли справа от каждой открывающей скобки соответствующая ей закрывающая скобка, а слева от каждой закрывающей - соответствующая открывающая.) Предполагается, что внутри каждой пары скобок нет других скобок.
Если скобки расставлены верно, то программа выдаст сообщение "Верно". Если же скобки отсутствуют или неправильно расставлены, программа должна выдать сообщение об ошибки.

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++
Задача: Проверить правильность расстановки в тексте круглых скобок. #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace...

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

Проверить правильность расстановки в тексте круглых скобок. Текст заканчивается точкой - C++
Работает,но неправильно. Сделала конечным автоматом. Помогите, пожалуйста! #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cmath&gt; ...

Дана строка символов проверить правильность расстановки круглых и квадратных скобок в выражениях - C++
дана строка символов проверить правильность расстановки круглых и квадратных скобок в выражениях

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

Использование стека. Дана строка символов. Проверьте правильность расстановки в ней круглых скобок. - C++
Использую пример программы от сюда: http://www.intuit.ru/department/algorithms/staldata/30/1.html Пример 1. Дана строка символов....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
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
Сообщений: 543
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
Сообщений: 543
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
Сообщений: 192
Завершенные тесты: 1
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
Сообщений: 192
Завершенные тесты: 1
04.11.2012, 13:29 #10
Vlad708, у меня подругому написано, мой код не только сравнивает
zitxbit
Master C/C++
88 / 740 / 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
Миниатюры
Проверить правильнсть расстановки круглых скобкок  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 14:49
Привет! Вот еще темы с ответами:

Проверить правильность расположения круглых скобок - C++
Пусть задано множество строк. Проверить правильность расположения круглых скобок. Если скобки расположыне правильно, то последовательно...

Проверить правильность расстановки скобок - C++
Помогите написать программу на c++. Дана строка, содержащая латинские буквы и скобки трех видов: «()», «», «{}». Если скобки расставлены...

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

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


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

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

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