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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2022, 16:06   #1
nnnsk
Новичок
Джуниор
 
Регистрация: 16.11.2022
Сообщений: 1
По умолчанию Помогите доработать код

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        public delegate double Func(double x);
        static void Main(string[] args)
        {
            Func value = function;

            const double e = 0.001;
            double a, b;
            a = 0.5;
            b = 1.5;
            while (Math.Abs(b - a) > 2*e)
            {
                double c = (a + b) / 2;
                if (value(b) * value(c) < 0)
                {
                    a = c;
                }
                else
                {
                    b = c;
                }
            }
            Console.WriteLine((a + b) / 2);
            Console.ReadLine();
        }
        static double function(double x)
        {
            double tmp = Math.Pow(2, 0.5);
            return 4 * Math.Sin(3 * x - 1) - Math.Pow(x, tmp) + 1;
        }
    }
}
Как можно оптимизировать код и расчет который я сделал в Main, необходимо выделить в отдельную функцию и в нее передать делегат как параметр,помогите с этим пожалуйста
nnnsk вне форума Ответить с цитированием
Старый 17.11.2022, 11:16   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Хорошо бы указывась язык - только мощным усилием телетяп-лятора я понял, что это - С#
digitalis вне форума Ответить с цитированием
Старый 18.11.2022, 01:11   #3
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

nnnsk,
1. Вы на каждой итерации цикла вызываете функцию два раза, а можно только один раз.
2. Деление на 2 можно заменить на умножение на 0.5.
3. Вместо «Math.Pow(value, 0.5)» лучше писать «Math.Sqrt(value)». А здесь ещё и value константа (2), поэтому можно посчитать только один раз.

Переделываем так:
Код:
using System;

namespace ConsoleApplication1
{
    class Program
    {
        public delegate double Func(double x);

        static void Main()
        {
            Console.WriteLine(calc_root(function, min: 0.5, max: 1.5));
            Console.ReadLine();
        }

        static readonly double _squ_root_2 = Math.Sqrt(2);

        static double function(double x)
        {
            return 4 * Math.Sin(3 * x - 1) - Math.Pow(x, _squ_root_2) + 1;
        }

        static double calc_root(Func func, double min, double max)
        {
            const double e = 0.001;
            double a = min;
            double b = max;
            double fb = func(b);
            while (Math.Abs(b - a) > 2 * e)
            {
                double c = (a + b) * 0.5;
                double fc = func(c);
                if (fb * fc < 0)
                {
                    a = c;
                }
                else
                {
                    b = c;
                    fb = fc;
                }
            }
            return (a + b) * 0.5;
        }
    }
}
Результат такой же.
Пётр Седов вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите доработать код Adelinka Помощь студентам 1 16.11.2020 18:24
Помогите доработать код C++ max.sokol Помощь студентам 5 18.12.2015 19:18
Помогите доработать код со строками Оксана33 Общие вопросы по Java, Java SE, Kotlin 4 24.09.2015 13:06
Помогите доработать программу. WolfMan96 Помощь студентам 0 26.02.2015 17:46
Помогите доработать чат BakX Работа с сетью в Delphi 8 06.10.2008 19:30