Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/47: Рейтинг темы: голосов - 47, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 21
1

Проверить баланс скобок () [] {} в строке

18.04.2016, 20:43. Показов 8434. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, помогите написать программа на Си.
Программа должна проверять баланс скобок.
Например, пользователь вводит: ([hello]) программа выводит: Баланс соблюден
Если пользователь вводит: ([hello) программа выводит: Баланс не соблюден.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2016, 20:43
Ответы с готовыми решениями:

Проверить в файле баланс скобок всех видов
посмотрите плз в чем ошибка #include <stdio.h> using namespace std; char s, str; int r;...

Программа, проверяющая баланс скобок. Проверить корректность работы
вот программа. прошу проверить правильно ли написана... в принципе все последовательности, которые...

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

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

14
Вездепух
Эксперт CЭксперт С++
11697 / 6376 / 1724
Регистрация: 18.10.2014
Сообщений: 16,080
18.04.2016, 20:48 2
Цитата Сообщение от Keril Посмотреть сообщение
([hello) программа выводит: Баланс не соблюден.
А ([hello)] - это соблюден или не соблюден?
0
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
18.04.2016, 21:37 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <stdio.h>
#include <string.h>
 
int is_balance(const char* s){
    int   i, ds[3];
    const char* p;
    const char beg[] = "({[";
    const char end[] = ")}]";
    
    memset(ds, 0, sizeof(ds));
    for(; *s; ++s){
        if((p = strchr(beg, *s)) != NULL)
            ++ds[p - beg];
        else if((p = strchr(end, *s)) != NULL){
            if(--ds[p - end] < 0)
                return 0;
        }
    }
 
    for(i = 0; i < 3; ++i){
        if(ds[i] > 0)
            return 0;
    }
    return 1;
}
 
int main(void){
    puts( is_balance("([hello])") ? "yes" : "error" );
    puts( is_balance("([hello)")  ? "yes" : "error" );
    return 0;
}
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
18.04.2016, 21:56 4
Геомеханик, Но мне показалось, что на "([..)]" ваш код ответит "Yes"

Добавлено через 6 минут
Программа, проверяющая баланс скобок. Проверить корректность работы
Нет уверенности в правильности, но стоит посмотреть...
(Взято снизу этой страницы)
1
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 21
18.04.2016, 21:57  [ТС] 5
на ([...)] программа должна ответить : Баланс не соблюден.
и спасибо за ваши ответы
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
18.04.2016, 22:00 6
Вот еще.
Проверка баланса скобок
На первый взгляд - грамотно.
0
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 21
18.04.2016, 22:02  [ТС] 7
и по идее программа должна запрашивать у пользователя строку, которую придумает пользователь.
и было бы не плохо чтобы программа работала еще с: " ", ' ',< >,` `.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
18.04.2016, 22:11 8
Цитата Сообщение от Keril Посмотреть сообщение
и по идее программа должна запрашивать у пользователя строку, которую придумает пользователь.
Ну, это уж сам как-нибудь.
Цитата Сообщение от Keril Посмотреть сообщение
и было бы не плохо чтобы программа работала еще с: " ", ' ',< >,` `.
< > - аналогично. А другие... Просто надо суммировать вхождение по модулю 2.
0
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 21
18.04.2016, 22:34  [ТС] 9
да я доделал, но программа не доработана ,она выводит ,что баланс соблюден ,например ,для ([...)] ,а это не так

Добавлено через 4 минуты
кто знает как это исправить
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
18.04.2016, 22:46 10
есть такое предложение
когда встречаются (< { [ кладем их в стек
когда встречаются ) > } ] достаем из стека
если символы непарные то выставляем флаг "Баланс не соблюден"

Добавлено через 1 минуту
Цитата Сообщение от Байт Посмотреть сообщение
Вот еще.
опередил
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
18.04.2016, 22:54 11
Keril, посмотрите внимательно на ссылку в посте 6. Там открывающие скобки записываются в стек (можно его смоделировать массивом). И очередная закрывающая должна соответствовать последней скобке в стеке.

Добавлено через 3 минуты
А с "кавычными" парами, да, там интересно. По идее (по синтаксису современных ЯП) внутри кавычек символы скобок вообще должны терять свой скобочный смысл. То есть этот момент нужно отдельно оговаривать.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
опередил
Дык, сказал бы, что торопишься...

0
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 21
18.04.2016, 23:12  [ТС] 12
мне не совсем понятно как это сделать, что нужно добавить к выше предложенному коду чтобы все работало как надо
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
18.04.2016, 23:47 13
Цитата Сообщение от Keril Посмотреть сообщение
мне не совсем понятно как это сделать
Судя по времени постов, ты потратил на попытку это понять 1 час 12 минут. Ничего удивительного, что за этот небольшой срок что-то не совсем удалось понять.
0
349 / 299 / 166
Регистрация: 15.03.2012
Сообщений: 653
Записей в блоге: 1
19.04.2016, 00:04 14
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 <stdio.h>
#define N 100
 
int is_balance (char *);
 
int main(void) {
    char str[N];
 
    fgets(str, N, stdin);
    puts(is_balance(str)?"no":"yes");
 
    return 0;
}
 
int is_balance (char *str) {
    char stack[100];
    int i = 0;
    for (;*str && i<100; str++)
        switch (*str) {
            case '[':
            case '(':
            case '{':
            case '<':
                stack[++i] = *str;
                break;
            case ']':
                stack[i] == '[' && i--;
                break;
            case ')':
                stack[i] == '(' && i--;
                break;
            case '}':
                stack[i] == '{' && i--;
                break;
            case '>':
                stack[i] == '<' && i--;
                break;
        }
    return i;
}
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
19.04.2016, 00:11 15
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <stdio.h>
 
char * brackets_check(const char * s) {
    switch ( *s ) {
        case '\0' :
        case ')' :
        case '}' :
        case ']' :
            return (char*)s;
        case '(' : {
            char * ret = brackets_check(s + 1);
            return ( *ret == ')' ) ? brackets_check(ret + 1) : (char*)s;
        }
        case '{' : {
            char * ret = brackets_check(s + 1);
            return ( *ret == '}' ) ? brackets_check(ret + 1) : (char*)s;
        }
        case '[' : {
            char * ret = brackets_check(s + 1);
            return ( *ret == ']' ) ? brackets_check(ret + 1) : (char*)s;
        }
        default :
            return brackets_check(s + 1);
    }
}
 
int main(void) {
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
        printf("%s\n", ( *brackets_check(buf) ) ? "FAIL" : "OK");
    
    return 0;
}
1
19.04.2016, 00:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2016, 00:11
Помогаю со студенческими работами здесь

Проверить правильность расстановки скобок в строке
прошу помочь доделать задачу:Задан текст, в котором присутствующие скобки. Проанализировать его с...

Проверить правильность расстановки скобок во введенной строке
Проверить правильность расстановки скобок в введенное строке, учитывая круглые, квадратные и...

Проверить правильность расстановки скобок
Не знаю в чем ошибка, программа не работает. Подскажите пожалуйста)) /* Проверить правильность...

Проверить правильность расстановки скобок и выражений
Дано скобочное выражение, оканчивающееся точкой с запятой. Проверить правильность расстановки ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru