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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2011, 18:30   #1
Ksy
Пользователь
 
Регистрация: 07.06.2009
Сообщений: 64
Вопрос Проблема с проверкой строки :(

Подскажите, пожалуйста, как решить проблему, связанную с проверкой правильности написания функции, подобной f(x,y)=2.3*x+1.5*y+9.3 (линейная функция с 2-мя переменными х и у, к. являются вещественными числами).
На основе построенной синтаксической таблицы разработать программное обеспечение синтаксического анализатора заданной конструкции.

Было всё хорошо, пока не потребовали, что х и у можно поставить в другом порядке или вообще отсутствие одной из них. На самом деле лучше посмотреть эту ошибку, чем объяснять. Посмотрите, пожалуйста.
Вложения
Тип файла: rar KPO_3.rar (152.7 Кб, 8 просмотров)
Ksy вне форума Ответить с цитированием
Старый 15.05.2011, 18:39   #2
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Брр...
Таблица должны быть именно та, что в проекте или сами составляли таблицу и можно смело вносить изменения?
Было дело, помогал знакомому писать синтаксический анализатор для компилятора, самое трудное, что пришлось исправлять во время отладки - как раз таки ошибки в таблице, в идеале её бы сначала корректно составить, если всё-таки сами делали.
Spawn™Production® вне форума Ответить с цитированием
Старый 15.05.2011, 19:08   #3
Ksy
Пользователь
 
Регистрация: 07.06.2009
Сообщений: 64
По умолчанию

Вообще, ЭТУ таблицу уже составлял преподаватель, но теперь она у меня не работает так как раньше. Так что я согласна, если вы можете внести изменения, то смело можно попробовать.
Ksy вне форума Ответить с цитированием
Старый 15.05.2011, 19:13   #4
Ksy
Пользователь
 
Регистрация: 07.06.2009
Сообщений: 64
По умолчанию

Функция может быть такой:
f(x,y)=4.3*y+6.6*x+4.1
f(x,y)=4.3*x+7.77*y-47.1
f(x,y)=44.8*x-1.56*x+3.2
f(x,y)=6.3*y+97.6*y+1.1
f(x,y)=55.3
и т.д.

Но на текущий момент подходит только
f(x,y)=6.3*y+97.6*y
или
f(x,y)=6.3*y+97.6*y+1.1*y

Последний раз редактировалось Ksy; 15.05.2011 в 19:16. Причина: Недописала
Ksy вне форума Ответить с цитированием
Старый 15.05.2011, 22:58   #5
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Общий принцип, думаю, должен быть ясен. Таблицу просто свёл к массивам разрешённых символов. В общем-то не трудно будет разложить в обратную сторону, если это принципиально, а так писанины меньше.
Код:
        private void Form1_Load(object sender, EventArgs e)
        {
            // Инициализация таблицы для анализа функции
            Init();
        }

        /// <summary>
        /// Коллекция элементов, которые могут быть в функции
        /// </summary>
        List<Element> elems = new List<Element>();
        /// <summary>
        /// Текущий и предпоследний типы символов
        /// </summary>
        ElementTypes lastSymbolType;
        private void Init()
        {
            // Коллекция элементов с типом "Цифра"
            Element digits = new Element();
            digits.Chars = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
            digits.type = ElementTypes.Digit;
            digits.LastAllowed = ElementTypes.None | ElementTypes.DotComma | ElementTypes.Digit | ElementTypes.Sign;

            elems.Add(digits);

            // Коллекция "Операторов"
            Element signs = new Element();
            signs.Chars = new[] { '+', '-', '*', '/' };
            signs.LastAllowed = ElementTypes.Digit | ElementTypes.Variable;
            signs.type = ElementTypes.Sign;

            elems.Add(signs);

            // Коллекция "Переменных"
            Element vars = new Element();
            vars.Chars = new[] { 'x', 'y' };
            vars.type = ElementTypes.Variable;
            vars.LastAllowed = ElementTypes.Sign | ElementTypes.None;

            elems.Add(vars);

            // Коллекция "Разделителей"
            Element dots = new Element();
            dots.Chars = new[] { ',', '.' };
            dots.type = ElementTypes.DotComma;
            dots.LastAllowed = ElementTypes.Digit;

            elems.Add(dots);
        }

        /// <summary>Функция проверки символа</summary>
        /// <param name="ch">Символ</param>
        /// <returns>Результат проверки. True - удовлетворяет требованиям. False - не удовлетворяет.</returns>
        public bool Check(char ch)
        {
            // Определяем тип текущего символа
            var curElem = elems.SingleOrDefault(el => el.Chars.Contains(ch));
            // Если удалось определить тип
            if (curElem != null)
            {
                // Проверяем, может ли текущий тип символа следовать за предыдущим
                bool result = (curElem.LastAllowed & lastSymbolType) != 0;
                // Запоминаем тип текущего символа
                lastSymbolType = curElem.type;
                // Вовзвращаем результат проверки
                return result;
            }
            else // если символ не совпал ни с одним из типов, значит выводим сообщение об ошибке
            {
                MessageBox.Show("Символ отсутствует в наборе разрешённых для ввода символов");
                return false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Устанавливаем предыдщий символ как символ начала функции
            lastSymbolType = ElementTypes.None;
            // Позиция проверяемого символа в строке
            int i = 0;
            // Результат проверки функции
            bool error = false;
            // Проходим циклом по всем символам в строке
            for (i = 0; i < textBox1.Text.Length; i++)
                if (!Check(textBox1.Text[i]))
                {
                    // Символ не прошёл проверку
                    error = true;
                    break;
                }
            // В случае ошибки выводим сообщение с указанием позиции, где произошла ошибка
            if (error)
                MessageBox.Show(String.Format("Ошибка.\nПозиция: {0}", i + 1));
            else
                MessageBox.Show("Проверка прошла успешно");
        }
    }

    /// <summary>
    /// Коллекция типов составляющих функции
    /// </summary>
    [Flags]
    public enum ElementTypes
    {
        Digit = 1,
        Sign = 2,
        Variable = 4,
        DotComma = 8,
        None = 16,
    }

    /// <summary>
    /// Элемент функции
    /// </summary>
    public class Element
    {
        /// <summary>
        /// Символы, входящие в данный тип
        /// </summary>
        public char[] Chars;
        /// <summary>
        /// Тип элемента
        /// </summary>
        public ElementTypes type;
        /// <summary>
        /// Коллекция типов, которые могут предшествовать данному
        /// </summary>
        public ElementTypes LastAllowed;
    }
На форме соответственно кнопочка и текстовое поле.
Spawn™Production® вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массивы, проблема с проверкой значения элемента drago3-28 Паскаль, Turbo Pascal, PascalABC.NET 1 28.04.2011 20:42
Проблема с проверкой по списку, который зависит от условия jlobster Microsoft Office Excel 2 24.12.2009 21:41
C++/не могу разобраться с проверкой kolashik Помощь студентам 5 12.10.2009 18:00
Проблема с проверкой <input type="file"> Ang3r PHP 4 07.08.2009 20:13
Помогите с проверкой в паскале neomaximus Помощь студентам 2 10.07.2008 09:41