Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как прочитать функцию из textBox? 
:(
    Опции темы
oleeg
Дата 18.7.2008, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006

Репутация: нет
Всего: нет




Все привет!
Я пишу программу, строящую график функции. В целях самообучения. Как можно сделать так, чтобы читать из текстбокса информацию o функции, которую ввел пользователь? Скажем, при нажатии кнопки. Пробовал так:

Код

// наша функция
        private int Function(int x)
        {
            int y = Convert.ToInt32(textBox1.Text);
            return y;
        }


Выводит 
Код

Input string was not in a correct format
.
Почему так?
Так все нормально строиться
Код

   // наша функция
        private int Function(int x)
        {
            int y;
            return y = x;
        }


Т е как распознать функцию, грубо говоря?

Это сообщение отредактировал(а) oleeg - 18.7.2008, 01:18
PM MAIL   Вверх
SKrivosein
Дата 18.7.2008, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: нет
Всего: 8



Не понял чо делает твой код(первый и второй) ,ну ладно, может так...
Код

 private int Function(int x)
        {
            string user_y = string.Format("{0}", textBox1.Text);
            int y = int.Patse(user_y);
            return y;
        }

Хотя этот делает тоже.
Код

 private int Function(int x)
        {
            int y = Convert.ToInt32(textBox1.Text);
            return y;
        }


Это сообщение отредактировал(а) SKrivosein - 18.7.2008, 02:49


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
nikitao
Дата 18.7.2008, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



а зачем нужен x ? smile 


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Partizan
Дата 18.7.2008, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



вопрос просто шедевральный  smile 


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
oleeg
Дата 18.7.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



какой есть smile
смысл в том, что пользователь вводит функцию в текстбокс, а мне нужно ее прочитать.
как это можно реализовать?
PM MAIL   Вверх
Partizan
Дата 18.7.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



oleeg, что значит прочитать функцию?))))

я так подозреваю, что пользователь вводит например "x*2+21" а вы хотите чтобы текстбокс вам всё почситал и выдал результат - так?)))


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
oleeg
Дата 18.7.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



))
не, не так. Пользователь вводит "x*2+21", из текстбокса извлекаеться text, распознаеться, так сказать, преобразовываеться и по этому строиться график ))

Добавлено через 1 минуту и 28 секунд
я не знаю, как это лучше объяснить. типа разбор строки из текстбокса.
PM MAIL   Вверх
Partizan
Дата 18.7.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



oleeg, )))
1. текст из текстбокса выдрать не проблема...
2. кем распознаётся? что должно быть результатом распознавания?
3. опять же кем преобразовывается? во что преобразовывается?

вы хотите чтобы вам Convert.ToInt32("x*2+21"); выдал массив точек для построения графика?  smile 


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
oleeg
Дата 18.7.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



Цитата(Partizan @ 18.7.2008,  16:30)
вы хотите чтобы вам Convert.ToInt32("x*2+21"); выдал массив точек для построения графика?  smile

Понятно, что так не получиться ) пробовал я ))
а как еще можно распознать? есть какой-нибудь алгоритм?
PM MAIL   Вверх
Rififi
Дата 18.7.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: нет
Всего: 36



oleeg
если бы нужно было сделать быстро, я бы сделал так
- подключил бы к проекту Microsoft <что-то там> Script Control (выполнение скрпитов)
- полученную из TextBox строку преобразовал к виду "function f(x) { return x*2 + 21; }"
- в цикле вызвал ScriptControl для всех x из заданного диапазона
- полученные от ScriptControl значения собрал бы в массив List<int>

кривовато, зато выражение самому парсить не придётся (а оно может быть и посложнее...)
PM MAIL   Вверх
Partizan
Дата 18.7.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Rififi, зато для мозга полезнее )

з.ы. oleeg, если всё-таки захочешь парсить руками, то ищи алгоритм "Обратная польская нотация".

В своё время писал разбор сложных выражений на основе ОПН...не раз пригодилось в жизни


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
oleeg
Дата 19.7.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



RififiPartizan
Спасибо. Думаю, буду руками парсить все-таки.
PM MAIL   Вверх
mihryak
Дата 20.7.2008, 01:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 2
Всего: 36



можно сборку скомпилить, содержащую функцию

для функции одной переменной (на досуге для себя написал)
Код

    class AssemblyGenerator
    {
        public delegate float FunctionDelegate(float x);

        private const string ClassName = "Evaluator";
        private const string MethodName = "GetValue";

        private readonly string functionString;
        private MethodInfo methodInfo;

        public AssemblyGenerator(string functionString)
        {
            if (String.IsNullOrEmpty(functionString))
            {
                throw new ArgumentNullException("functionString");
            }
            this.functionString = functionString;
        }

        public FunctionDelegate Function
        {
            get
            {
                return Eval;
            }
        }

        private float Eval(float x)
        {
            return (float) EvalMethod.Invoke(null, new object[] {x});
        }


        private MethodInfo EvalMethod
        {
            get
            {
                if (methodInfo == null)
                {
                    methodInfo = BuildAssembly(functionString).GetType(ClassName).GetMethod(MethodName);
                }
                return methodInfo;
            }
        }

        private static Assembly BuildAssembly(string functionString)
        {
            CodeDomProvider provider = new CSharpCodeProvider();
            CompilerParameters compilerParameters = new CompilerParameters();
            compilerParameters.GenerateInMemory = true;

            CompilerResults compilerResults = provider.CompileAssemblyFromSource(compilerParameters, GetAssemblyCode(functionString));
            if (compilerResults.Errors.HasErrors)
            {
                StringBuilder errorStringBuilder = new StringBuilder("Unable to compile assembly.\r\n");
                foreach (CompilerError compilerError in compilerResults.Errors)
                {
                    errorStringBuilder.AppendLine(compilerError.ErrorText);
                }
                throw new ArgumentException(errorStringBuilder.ToString());
            }

            return compilerResults.CompiledAssembly;
        }

        private static string[] GetAssemblyCode(string functionString)
        {
            StringBuilder codeStringBuilder = new StringBuilder();
            codeStringBuilder.Append("using System;");
            codeStringBuilder.AppendFormat("public static class {0}", ClassName);
            codeStringBuilder.Append("{");
            codeStringBuilder.AppendFormat("public static float {0}(float x)", MethodName);
            codeStringBuilder.Append("{");
            codeStringBuilder.AppendFormat("return (float) ({0});", functionString);
            codeStringBuilder.Append("}");
            codeStringBuilder.Append("}");

            return new string[] { codeStringBuilder.ToString() };
        }
    }

использование:
Код

AssemblyGenerator.FunctionDelegate function = new AssemblyGenerator(functionTextBox.Text).Function;
float value = function(5.73);

имя переменной - x, в TextBox'е текст должен быть в правильном c# формате (для вычисления синусов, например, надо писать Math.Sin(x))

user posted image

Это сообщение отредактировал(а) mihryak - 20.7.2008, 01:38
PM MAIL ICQ   Вверх
oleeg
Дата 20.7.2008, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



mihryak
Благодарю. Буду разбираться. Я все-таки решил использовать ZedGraph, а в нем введу все стандартные функции в таком виде 
a*Sin(b*x+c) + d, вручную задаються кооэфициэнты. Так, думаю, будет проще.
PM MAIL   Вверх
oleeg
Дата 20.7.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



mihryak Вы это приложение для себя писали, на досуге? Если не трудно, не могли бы Вы выложить исходники. Будет с чем сравнить) 
А то я че-то такого намутил в своей программе, строящей график функции, там можно аж настроить 3 цвета и угол заливки символа ( это точка на графике). smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1011 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.