Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 27.05.2015
Сообщений: 17

Как связать функцию с NumericUpDown?

22.06.2016, 16:53. Показов 3810. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь написать программу, точнее написать формулу
Название: Безымянный.png
Просмотров: 125

Размер: 4.4 Кб
Помогите, пожалуйста, как то связать эту функцию с NumericUpDown(в коде nud1) и с текст боксом(в коде tb1).
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
61
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Numerics;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        static BigInteger Fact(int n)
        {
            BigInteger Pn = 1;
            BigInteger f = 1;
            BigInteger ff = 1;
            if (n % 2 == 0)
            {
                for (int i = 2; i < n; i += 2)
                {
                    ff *= 2 * i - 5;
                }
            }
            else
            {
                for (int i = 1; i < n; i += 2)
                {
                    ff *= 2 * i - 5;
                }
            }
            for (int i = 1; i < n - 1; i++)
            {
                f *= i - 1;
            }
            Math.Pow(2, n - 2);
            
            return Pn;
        }
 
 
        private void btn1_Click(object sender, EventArgs e)
        {
            
        }
 
        private void btn2_Click(object sender, EventArgs e)
        {
            tb1.Clear();
            nud1.Value = 3;
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2016, 16:53
Ответы с готовыми решениями:

Как ограничить количество вводимых символов в цифровое поле NumericUpDown?
Можно ли как-то в Visual Studio Windows Forms ограничить число вводимых символов в цифровое поле NumericUpDown? В поле textbox можно это...

Как сделать чтоб при умножении двух numericUpDown результат не превышал 255?
При нажатии кнопки происходит переумножение numericUpDown1 на numericUpDown2, результат идет в numericUpDown1, надо чтоб результат был не...

Как связать цвета и NumericUpDown
Вот такая задача: Форма содержит компонент-счетчик NumericUp-Down с заголовком-меткой «Номер цвета» и панель GroupBox с меткой Label. При...

17
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.06.2016, 18:56
У вас ошибка в 44 строчке, а связать можно так

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
   public partial class Form1 : Form
    {
        static int n;
        static BigInteger Pn = 1;
        static BigInteger Fact(int n)
        {
            
            BigInteger f = 1;
            BigInteger ff = 1;
            if (n % 2 == 0)
            {
                for (int i = 2; i < n; i += 2)
                {
                    ff *= 2 * i - 5;
                }
            }
            else
            {
                for (int i = 1; i < n; i += 2)
                {
                    ff *= 2 * i - 5;
                }
            }
            for (int i = 1; i < n - 1; i++)
            {
                f *= i - 1;
            }
            Math.Pow(2, n - 2); 
            return Pn;
        }
        public Form1()
        {
            InitializeComponent();
            numericUpDown1.Value = 3;
            n = Convert.ToInt32(numericUpDown1.Value);
            Pn = Fact(n);
            textBox1.Text = Convert.ToString(Pn);
        }
 
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            n = Convert.ToInt32(numericUpDown1.Value);
            Pn = Fact(n);
            textBox1.Text = Convert.ToString(Pn);
        }
    }
1
1 / 1 / 0
Регистрация: 27.05.2015
Сообщений: 17
23.06.2016, 14:36  [ТС]
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
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        static int n;
        static BigInteger Pn;
        public Form1()
        {
            InitializeComponent();
            BigInteger Pn;
            n = Convert.ToInt32(nud1.Value);
            Pn = Fact(n);           
        }
        static BigInteger Fact(int n)
        {
            double s;
            BigInteger FF;
            BigInteger f = 1;
            BigInteger ff = 1;
            if (n % 2 == 0)
            {
                for (int i = 3; i < n; i+=2)
                {
                    f *= i - 1;
                    ff *= 2 * i - 5;
                }
            }
            else
            {
                for (int i = 3; i < n; i+=2)
                {
                    f *= i - 1;
                    ff *= 2 * i - 5;
                }
            }
            s = Math.Pow(2, n - 2);
            FF = (ff / f) * (BigInteger)s;
            return FF;
        }
 
        private void btn1_Click(object sender, EventArgs e)
        {
            Pn = Fact(n);
            tb1.Text = Convert.ToString(Pn);
        }
 
        private void btn2_Click(object sender, EventArgs e)
        {
            tb1.Clear();
            nud1.Value = 3;
        }
 
        private void nud1_ValueChanged(object sender, EventArgs e)
        {
            n = Convert.ToInt32(nud1.Value);
        }
    }
}
Вот попробовал заново все переписать, тут хоть какой то ответ даёт, но не правильный. Где ОШИБКА???
0
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
23.06.2016, 14:59
Ошибка в том что метод Fact реализован в виде бреда какого-то. Реализуйте метод вычисления факториала числа(!) и потом вычисляйте по формуле. Примеров реализации вычисления факториала вагон и маленькая тележка, например здесь же Существует ли встроенный метод для вычисления факториала
0
1 / 1 / 0
Регистрация: 27.05.2015
Сообщений: 17
23.06.2016, 17:52  [ТС]
Тут ответ, вроде, правильно выводит, но при n = 5, я ответа не дождался(около 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
namespace ConsoleApplication2
{
    class Program
    {
        static double DoubleFact(double n)
        {
            if (n % 2 == 0)
            {
                for (int i = 2; i < n; i+=2)
                {
                    n *= i;
                }
            }
            else
            {
                for (int i = 3; i < n-1; i+=2)
                {
                    n *= i;
                }
            }
            return n;
        }
        static double factorial(double n)
        {
            if (n == 0 || n == 1) return 1;
            return n * factorial(n - 1);
        }
        static void Main(string[] args)
        {
            double n;
            double Pn;
            double fact;
            n = int.Parse(Console.ReadLine());
            fact = DoubleFact(2 * n - 5) / factorial(n - 1);           
            double s = Math.Pow(2, n - 2);
            Pn = fact * s;
            Console.WriteLine(factorial(Pn));
            Console.ReadKey();
        }
    }
}
Добавлено через 7 минут
C#
1
2
3
4
5
6
7
8
9
10
11
static double DoubleFact(double n)
        {
            if (n % 2 == 0)
            {
                for (int i = 2; i < n; i+=2)
                {
                    n *= i;
                }
            }
            return n;
        }
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.06.2016, 18:46
Лучший ответ Сообщение было отмечено Несретдинович как решение

Решение

Несретдинович, то есть если число нечетное, то оно и факториалом является? Неплохо.

реализация в лоб, по идее нужно сокращать и тюнить, но лично у меня нормально сократить не получилось
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
using System;
using System.Numerics;
 
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(F(10));
    }
 
    public static BigInteger F(int n)
    {
        if (n < 2)
            throw new ArithmeticException("Function is not defined for N < 2");
        var x = FacFac(2 * n - 5);
        var y = Fac(n - 1);
        var z = BigInteger.Pow(2, n - 2);
        return x * z / y;
    }
 
    public static BigInteger Fac(int n)
    {
        if (n < 0)
            throw new ArithmeticException("Factorial for negative is not defined");
        BigInteger result = BigInteger.One;
        for (int i = 2; i <= n; i++)
        {
            result *= i;
        }
        return result;
    }
 
    public static BigInteger FacFac(int n)
    {
        if (n < 0)
            throw new ArithmeticException("Double factorial for negative is not defined");
        BigInteger result = BigInteger.One;
        for (int i = 2 - n % 2; i <= n; i += 2)
        {
            result *= i;
        }
        return result;
    }
}
Добавлено через 1 минуту
"Связать с Numeric" тут как нефиг делать, подписываемся на событие TextChanged и считаем
C#
1
2
int n = int.Parse(numericupdown1.Value);
resultBox.Text = F(n).ToString();
1
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
23.06.2016, 19:12
Зачем вам цикл при расчёте двойного факториала?
Для чётного n:
https://www.cyberforum.ru/cgi-bin/latex.cgi?n!!={2}^{\frac{n}{2}}*\left(\frac{n}{2} \right)!

Для нечётного:
https://www.cyberforum.ru/cgi-bin/latex.cgi?n!!=\frac{n!}{{2}^{\frac{n-1}{2}}*\left(\frac{n-1}{2} \right)!}

Эти формулы и надо реализовать в методе DoubleFact

Ко всему прочему у вас при n<3 решения не будет, т.к. факториал вычисляется только от не отрицательного числа.
1
1 / 1 / 0
Регистрация: 27.05.2015
Сообщений: 17
23.06.2016, 19:38  [ТС]
Для этого https://docviewer.yandex.ru/?u... 6c10be63cc мне не нужно меньше 3-х
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.06.2016, 22:01
slashvlz, отлично, как теперь будем считать факториал в правой части выражения? Только теперь нужно еще и 2 возводить в степень, а цикл будет ровно столько же n/2 итераций проходить, что и в случае наивной реализации.

Добавлено через 1 минуту
Хотя о чем это я У нас же всегда нечетное значение, значит нужно вычислять факторил дважды, потом делить, и еще на 2 в степени умножать Операций в разы больше от такого "упрощения".
1
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
23.06.2016, 22:30
Psilon, если я правильно посчитал, то там степень двойки уходит, такая формула (нужно проверить же):
https://www.cyberforum.ru/cgi-bin/latex.cgi?2\cdot\frac{\Pi\limits^{2n-5}_{i=n}i}{(n-5)!}
если N не большие, можно записать множители числителя и знаменателя в массивы. перебрать gcd попарно и делить /умножать по очереди.

Добавлено через 8 минут
Вот, возможно, значения этой функции, можно в массив записать и не вычислять:
Кликните здесь для просмотра всего текста
3, 1
4, 2
5, 5
6, 14
7, 42
8, 132
9, 429
10, 1430
11, 4862
12, 16796
13, 58786
14, 208012
15, 742900
16, 2674440
17, 9694845
18, 35357670
19, 129644790
20, 477638700
21, 1767263190
22, 6564120420
23, 24466267020
24, 91482563640
25, 343059613650
26, 1289904147324
27, 4861946401452
28, 18367353072152
29, 69533550916004
30, 263747951750360
31, 1002242216651368
32, 3814986502092304
33, 14544636039226909
34, 55534064877048198
35, 212336130412243110
36, 812944042149730764
37, 3116285494907301262
38, 11959798385860453492
39, 45950804324621742364
40, 176733862787006701400
41, 680425371729975800390
42, 2622127042276492108820
43, 10113918591637898134020
44, 39044429911904443959240
45, 150853479205085351660700
46, 583300119592996693088040
47, 2257117854077248073253720
48, 8740328711533173390046320
49, 33868773757191046886429490
50, 131327898242169365477991900
51, 509552245179617138054608572
1
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
23.06.2016, 23:22
Всё ещё проще
https://habrahabr.ru/post/165295/
Правильно заданный вопрос - половина решения!
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.06.2016, 23:33
Aael, формулу проще посчитать так, как она есть. Использовать табличку можно в обоих случаях, так что она тут разницы тоже не дает. Хотя конечно смысла в ней нет большого, тем более что нужно определиться, до какого момента эту табличку считаем.

Двойку можно убрать, но тогда останется 2*(2n-5)!/(n-3)!(n-1)!. Получается 3 факториала считать, вместо полутора Возведение двойки в степень быстрая операция.

В результате получаем в 2 раза больше операций. Причем нужно понимать, что скорость работы BigInteger зависит от его размера, и поэтому для него посчитать n!*(n-1)! намного проще, чем (2n)!, хотя количество операций тут одинаково.

Добавлено через 8 минут
slashvlz, весьма занимательная статья, красота абстрактной математики в конкретных примерах Но все же я не вижу, как это можно тут использовать. Ну да, и там и там деление факториалов, только насколько я знаю нормально упростить это выражение нельзя. По крайней мере я истратил на это 2 листа бумаги)) Я конечно тот еще математик, но тривиальную задачу 1-2 курса думаю решил бы.
1
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
23.06.2016, 23:56
Статья к тому что эта последовательность называется числа Каталана, собственно её и надо было получить.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2016, 00:45
slashvlz, эмм, кто сказал, что это эквивалентные формулы? Можете выкладки привести? Что вот это вот выражение P(N) = (2n!)/(n!(n+1)!). Потому что по моим рассчетам этого не получается.

Ну и второе, ДАЖЕ если это число из последовательности Каталана, там ничего не сказано о том, как её получить проще, чем посчитать напрямую.
1
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
24.06.2016, 01:43
Цитата Сообщение от Psilon Посмотреть сообщение
но тогда останется 2*(2n-5)!/(n-3)!(n-1)!
https://www.cyberforum.ru/cgi-bin/latex.cgi?g(n) = \frac{(2n)!}{n!(n+1)!}
https://www.cyberforum.ru/cgi-bin/latex.cgi?g(n-2)=\frac{(2n-4)!}{(n-2)!(n-1)!}=\frac{2n-4}{n-2}\cdot\frac{(2n-5)!}{(n-3)!(n-1)!}=2\cdot\frac{(2n-5)!}{(n-3)!(n-1)!}=P_n

Проверил варианты "в лоб"(с расчетом двух факториалов) и с моими сокращениями через НОД (с одним факториалом), до n=int.MaxValue моя функция в среднем работает на 2% медленнее. Хоть этот показатель и убывает с ростом n, все же думаю, что пока решения быстрее чем "в лоб" нет.

Добавлено через 14 минут
кстати, есть еще одно представление:
https://www.cyberforum.ru/cgi-bin/latex.cgi?P_n = (n-1)\frac{(2n-4)!}{(n-1)!^2}=\left.\frac{k(2k-2)!}{k!^2}\,\,\,\right|_{k=n-1}
2
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
24.06.2016, 01:52
Psilon, Где автор откопал эту формулу лучше у него спросить, но совпадение последовательности чисел на лицо. Я собственно и не говорил, что будет проще вычислить Я имел ввиду, что какие-либо последовательности уже как правило имеют разные известные способы реализации и зная их реализовать алгоритм будет проще и эффективнее.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2016, 11:03
Aael, я думаю это и есть различие в быстродействии BigInteger, т.к. посчитать n!! примерно равно по сложности посчитать (n/2)!, получается в знаменателе n/2 вычислений и в числителе столько же, всего N вычислений и быстрое возведение 2 в степень.

В вашем случае приходится считать полный факториал, это те же n вычислений, но т.к. числа сами по себе больше, то результат вычисляется медленнее.
1
1 / 1 / 0
Регистрация: 27.05.2015
Сообщений: 17
25.06.2016, 12:21  [ТС]
https://docviewer.yandex.ru/?u... 6d260eff94Вот где я откопал эту формулу

Добавлено через 9 минут
slashvlz, https://docviewer.yandex.ru/?u... 6d260eff94

Добавлено через 20 часов 45 минут
Заработала
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
class Program
    {
        static BigInteger DoubleFact(int n)
        {
            BigInteger result = BigInteger.One;
            if (n % 2 == 0)
            {
                for (int i = 2; i <= n; i+=2)
                {
                    result *= i;
                }
            }
            else
            {
                for (int i = 1; i <= n; i+=2)
                {
                    result *= i;
                }
            }
            return result;
        }
        static BigInteger factorial(int n)
        {
            BigInteger result = BigInteger.One;
            for (int i = 1; i <= n; i++)
            {
                result *= i;
            }
            return result;
        }
 
        public static BigInteger P(int n)
        {
            if (n <= 2)
                throw new ArithmeticException("Function is not defined for N <= 2");
            var x = DoubleFact(2 * n - 5);
            var y = factorial(n - 1);
            var z = BigInteger.Pow(2, n - 2);
            return x * z / y;
        }
 
        static void Main(string[] args)
        {
            int n;
            n = int.Parse(Console.ReadLine());         
            Console.WriteLine(P(n));
            Console.ReadKey();
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2016, 12:21
Помогаю со студенческими работами здесь

Как связать функцию VBA с действием кнопки в Access 2007?
Привет всем. У меня такое задание. Дана форма, в ней 4 записи. Нужно создать 4 кнопки с подписями &quot;С&quot;, &quot;Д&quot;,...

Как ограничить numericUpDown?
1) Как ограничить допустимое число в numericUpDown? Мне нужно чтобы максимум пользователь мог ввести 31. А во втором numericUpDown...

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

Kivy, переменные. Связать виджет и функцию
Выдает ошибку Root не имеет атрибут label from kivy.app import App from kivy.uix.boxlayout import BoxLayout from...

Как создать часы с управлением как в NumericUpDown
Здрасте всем. Уже второй день ломаю голову, как создать контрол, как на рисунке. Подскажет кто как?


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru