Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2010, 05:48   #1
Alex_sim
Форумчанин
 
Аватар для Alex_sim
 
Регистрация: 18.02.2010
Сообщений: 164
Восклицание

Не получается сделать генератор скобочных варажений содержащее по 5 правых 5 левых скобок пример:

Верно:
()()()()()
(()()()())
()(()()())

Не верно:
)(()()())(

Самый не хитрый способ, полный перебор. А потом смотреть что скобки стоят верно.
Т.е. понадобится две вещи:
1. Генератор последовательностей скобок.
2. Проверяющий эти последовательности на уникальность и правильность.
2 я сделеал только при условии что пользователь вводит, а мне нужно сделать генератор этих выражений подскажите буду благодарен..

с генерацией вроде все ясно вот код
Код:
public partial class Form1 : Form
    {
        string ch = "((((((0000))))))";
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Random r = new Random();            
            string s="";            
            int n=0;
            int l = s.Length;

            for (int j = 0; j < 5; j++)//генерирование ();
            {
                n = r.Next(0,14);


                for (int i = 0; i < 5; i++)
                {
                    s += ch[n];

                }
            }
            textBox1.Text = s;
но почему то не могу проверит правильность выражения((
подскажите как ??

Последний раз редактировалось Stilet; 17.05.2010 в 08:41.
Alex_sim вне форума Ответить с цитированием
Старый 17.05.2010, 08:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Не верно:
)(()()())(
красиво смотрится... Слово ХОООХ ))))

По теме: когда-то кто-то мне говорил что лучший механизм такого парсинга - через конечные автоматы... Не проверял, но думаю на твоем месте именно в эту сторону бы и порыл...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.05.2010, 09:45   #3
Alex_sim
Форумчанин
 
Аватар для Alex_sim
 
Регистрация: 18.02.2010
Сообщений: 164
По умолчанию

Хм, интересно , но что то разобратся не могу , может поможешь приведи пример если не сложно ?
Alex_sim вне форума Ответить с цитированием
Старый 17.05.2010, 10:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Увы сложно
Я никогда не утруждал себя разборами такого рода да и КА в универе не любил...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.05.2010, 12:01   #5
Alex_sim
Форумчанин
 
Аватар для Alex_sim
 
Регистрация: 18.02.2010
Сообщений: 164
По умолчанию

Не ужели проще нельзя ?
Alex_sim вне форума Ответить с цитированием
Старый 17.05.2010, 12:13   #6
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

Цитата:
но почему то не могу проверит правильность выражения((
Писал подобную программу, только там были кроме круглых еще фигурные и квадратные скобки. НА экзамене минут за 15 написал. А сейчас чего-то не могу сообразить.
Вобщем наводка: надо использовать для проверки правильности выражения стек. Подумай пока в этом направлении.
Короче, до конца дня наверное соображу что к чему. А то в условиях расслабона голова не так работает, как в экстримальных)))
bullvinkle вне форума Ответить с цитированием
Старый 17.05.2010, 12:15   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Для проверки правильности расстановки скобок может проще поступить следующим образом:
Создаём счетчик скобок. Изначально он равен нулю. Потом при появлении открывающейся скобки, мы этот счетчик увеличиваем на единицу. Ну и уменьшаем на единицу в случае закрывающейся скобки. Если в какой-то момент времени счетчик стал отрицательным, значит лишняя закрывающаяся скобка. Если строка кончилась, а счетчик не равен нулю, значит не закрыта одна или несколько открывающихся скобок (по счетчику легко узнать их количество).
pu4koff вне форума Ответить с цитированием
Старый 17.05.2010, 12:28   #8
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

Аа, действительно, какой стек? Тут же не надо проверять соответствие скобок между собой.
bullvinkle вне форума Ответить с цитированием
Старый 17.05.2010, 14:52   #9
Alex_sim
Форумчанин
 
Аватар для Alex_sim
 
Регистрация: 18.02.2010
Сообщений: 164
По умолчанию

Эх что то я сглупил , спасибо за подробное описание

Еще не большой вопросу как можно грамотнее сделать генератор нужных мне выражений ?

Последний раз редактировалось Stilet; 18.05.2010 в 13:41.
Alex_sim вне форума Ответить с цитированием
Старый 17.05.2010, 17:57   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
class Program
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="input">Входная строка для накопления скобок. Изначально передаем ""</param>
        /// <param name="summary">"Сумма" скобок. 1 - одна незакрытая скобка, -1 - одна лишняя закрывающаяся скобка, 0 - все скобки закрыты корректно</param>
        /// <param name="count_on">Количество открывающихся скобок. Изначально передаем 0</param>
        /// <param name="count_off">Количество закрывающихся скобок. Изначально передаем 0</param>
        /// <param name="count">Требуемое количество скобок. 5 - В результате получим строку с 5 открывающимися и 5 закрывающимися скобками</param>
        static void Generate(string input, int summary, int count_on, int count_off, int count)
        {
            if (summary < 0)
            {
                Console.WriteLine("\tError:\t{0}", input);
                return;
            }

            if (summary == 0) // баланс скобок соблюден
            {
                if (count_on == count) // Нужно число скобок уже записано
                {
                    Console.WriteLine("Done:\t{0}", input);
                    return;
                }

                Generate(input + '(', 1, count_on + 1, count_off, count);
            }
            else
            {
                if (count_on == count) // Можно добавить только закрывающуюся скобку
                {
                    Generate(input + ')', summary - 1, count_on, count_off + 1, count);
                }
                else if (count_off == count) // Можно добавить только открывающуюся скобку
                {
                    Console.WriteLine("\tError:\t{0}", input);
                    return;
                }
                else
                {
                    Generate(input + '(', summary + 1, count_on + 1, count_off, count);
                    Generate(input + ')', summary - 1, count_on, count_off + 1, count);
                }
            }
        }

        static void Main(string[] args)
        {
            Generate("", 0, 0, 0, 3);

            Console.ReadKey();
        }
    }
Далеко не самый лучший вариант, но зато написание заняло 10 минут. Хотя стиль реализации ближе к прологу или лиспу, т.е. функциональный стиль какой-то получился у меня
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразование выражений alexander-57n Помощь студентам 0 16.05.2010 14:33
вычисление арифметических выражений на с++ Euforia_PZAS09_1 Помощь студентам 1 09.03.2010 17:40
Парсер математических выражений Granus Общие вопросы Delphi 3 24.06.2009 15:19
условие в построителе выражений! SKIF_SPB Microsoft Office Access 3 25.12.2008 14:07
Решение простых выражений MStorm Помощь студентам 5 10.03.2008 14:34