• Как исправить программу (шейкерная сортировка)?

    Matmode
    @Matmode
    PHP/Symfony Developer
    Попробуйте i > left. Иначе у вас при i=0 получается доступ к не существующему элементу a[-1]
    Ответ написан
    2 комментария
  • В какой области IT применение знаний - не самое важное?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Вот идеальный рабочий день - полдня в чем-то разбираться, полдня это простым языком объяснять другим кому интересно.

    Перевожу: Хочу развлекаться за счёт работодателя.

    Работа - это не про развлечение, это продажа своего труда за деньги. И программирование - это не про развлечение. Программист 49% времени пишет скучный код, а иногда и переписывает чужой ужасный код, ещё 49% времени занудно ловит унылые баги. Остаётся радоваться оставшимся двум процентам интересного.
    5cdd8aaeef145978587602.png
    Ответ написан
    2 комментария
  • Как сделать точное вычисление физики гравитации на javascript в canvas методом Верле?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    elleremo, ускорение которое получают планеты пролетая вблизи других планет не является ошибкой!!!

    Этот эффект называется "гравитационный маневр для ускорения объекта" или же "гравитационная праща"

    Swingby_acc_anim.gifГравитационный манёвр для ускорения объекта (гравитационная праща)

    Не стал делать "точную имитацию" гравитации. Пошел по пути:
    1. каждый объект имеет массу равную объему объекта умноженному на плотность объекта
    2. каждый объект влияет на каждый динамический объект
    3. влияние пошагово рассчитывается по формуле (почти) :
    V = сумма(F); // суммарный вектор сил
    F = k*M/D; // сила влияния (расчитывается для каждого объекта оказывающего влияние на текущий)
    M - масса объекта
    D - квадрат расстояния между центрами масс объектов
    k - коэффициент для подгона скоростей (выполняет роль гравитационной постоянной)

    Алгоритм расчета (пошагово):
    1. Для каждого динамического объекта происходит расчет новых координат (сумма текущих координат и вектора скорости, рассчитанного на предыдущей итерации цикла симуляции)
    2. Каждый динамический объект сверяется с каждым объектом на предмет столкновения. Если расстояние между центрами 2х сравниваемых объектов меньше суммы их радиусов то происходит слияние. Если объединяются статичный и динамический объекты, то динамический удаляется а его масса добавляется к статическому с перерасчетом плотности, радиуса и объема. Если объединяются 2 динамических объекта то к первому добавляется масса второго с перерасчетом плотности, радиуса и объема, координаты и вектора скоростей пересчитываются как взвешеная сумма координат и векторов скоростей обоих объектов. После второй объект удаляется.
    3. Для каждого динамического объекта расчитывается сумма векторов силы влияния притяжения всех объектов. Затем данная сумма и вектор скорости текущего объекта суммируются
    4. Переход к новой итерации цикла симуляции.

    Вся реализация расчета тут (в конце скрипта). Все формулы вынесены в класс Calc.

    видеодемонстрация
    демонстрация (масштабируется колесиком мышки, перетаскивается с помощью ЛКМ)

    Добавил слияние планет при столкновении (массы суммируются, вектора скоростей суммируются, позиция переносится в центр масс)
    Добавил источники (автоматически генерируют планеты)
    Добавил отдельные кнопки для пуска и остановки источников

    5bbd21b57da99316097769.png
    Добавил настройки:
    • параметры отображения
      • отображать сетку - вкл/выкл отображение координатной сетки
      • отображать источники - вкл/выкл отображение объектов, генерирующих планеты
      • отображать шлейф - вкл/выкл отображение траектории планет

    • Настройки физических величин - позволяют задаь минимальные и максимальные значения для размеров и плотности статических и динамических объектов
    • Управление симуляцией
      • шаг симуляции - экспериментальная величина регулирующая точность расчетов
      • скорость источников - изменяет скорость, с которой источники генерируют планеты
      • включить источники - вкл/выкл генерацию планет источниками



    Доработал механизм расчета влияния гравитации, теперь у каждого объекта масса считается исходя из объема и плотности.
    Ввел изменение в процесс генерации новых планет, теперь они выставляются на лист с рассчитанной первой космической скоростью относительно центрального статичного объекта.
    Установил статичным объектам повышенную плотность, что существенно увеличило их массу (можно менять на панели настроек)
    Установил динамическим объектам пониженную плотность, что существенно уменьшило их массу и взаимовлияние (можно менять на панели настроек)

    5bbd22bc10be0483291405.png
    Ответ написан
    2 комментария
  • Простой векторный графический редактор?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Ну, если бы на все задачи можно было найти точные инструкции, было бы скучно.
    Пробуйте написать начиная с малого, например:
    1) Создайте холст, просто объект, который будет помещать в себя фигуры. Это будет некий viewport.
    2) Сделайте скролл этого холста мышкой, во все стороны.
    3) Сделайте возможность динамически добавлять объекты на холст, сначала определите базовый объект, например прямоугольник или линию. Легче на этом моменте сразу определить интерфейс IShape, таким образом дальше будет легче унифицировать все объекты при добавлении их на холст, да и холст ничего не должен знать об этих объектах, только об интерфейсе.
    4) Сделайте drag&drop добавленных объектов, чтобы их можно было тащить.
    5) Добавьте зум, это не простой шаг, тут нужно многое учитывать, особенно часто на этой задаче ломается позиционирование drag&drop объектов.
    6) Сделайте трансформатор объектов, который будет изменять их размер (для прямоугольников и.т.д.), менять точки (для линий), вращать и.т.д.
    7) Сделайте редактор свойств, через который будете назначать атрибуты вашим объектам, такие как цвет заливки, цвет рамки, ширина рамки, непрозрачность и.т.д.
    8) Добавляйте потихоньку различные объекты. Можете подглядывать в другие редакторы, например inkscape.
    9) Реализуйте сохранение и загрузку холста. Тут лучше не изобретать свой формат данных, а использовать открытый, например svg.
    10) Буфер обмена. Тут либо свой формат в бинарник, либо тот же самый svg в текстовом виде (что куда лучше, так сделано в фигме).
    11) Отменить/вернуть - важная штука, и на первый взгляд простая. Но простая она только в том случае, если запоминать шаги путем снимка всех текущих объектов, но этот способ плохой. По нормальному нужно при любой операции над объектами на холсте делать снимок изменений. Например подвинули кубик на 10px влево, и записали в память значение
    { id: 'id кубика', x: -10 }
    и потом при нажатии отмена, будете просто делать обратную операцию, добавлять эти 10px. Тут у вас возникнут сложность с операцией "возврат", но думаю, если вы дошли до этого шага, упорство у вас уже есть. Пригодятся паттерны: command и memento
    12) Ну, тут уже по мелочи, различные киллер фичи, новые объекты, свойства, различные меню и.т.д.
    Ответ написан
    1 комментарий
  • Почему я должен писать именно так, а не иначе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему я не могу убрать скобки, или ещё что-нибудь, и написать так, как мне хочется. В общем, где все это определено?

    Это определено спецификацией языка на котором вы пишете. Среди прочего она определяет грамматику языка (т.е. как можно писать) и семантику языковых конструкций (т.е. что написанное так или иначе обозначает).
    Ответ написан
    Комментировать
  • Что с точностью float?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Получается float не надёжен?

    Смотря кому, когда и как. Всё зависит от того, какая точность важна в конкретной задаче. Деньги на нем не считают, но для большого круга задач этой точности вполне хватает, а эффективность кода с double гораздо выше, чем decimal.

    float нужен лишь затем, что этот тип занимает вдвое меньше памяти, чем double. Где-то это может сыграть решающую роль.

    ЗЫ В конкретной ситуации вас спасёт Math.Round
    Ответ написан
    2 комментария
  • Как реализовать проверку TestResult'а в юнит-тестах?

    @Cunctator Автор вопроса
    Начинающий программист.
    Нашел решение с помощью свойства TestContext.CurrentTestOutcome.

    [TestClass]
    public class UnitTest
    {
        private TestContext TestContext { get; set; }
    
        [TestCleanup]
        public void TestCleanup()
        {
            if (TestContext.CurrentTestOutcome == UnitTestOutcome.Passed)
                //do something
        } 
    
        [TestMethod]
        public void TestMethod()
        {
        }
    }
    Ответ написан
    Комментировать
  • Какой тип данных должен быть в выражении условия отбора?

    @Martyr1 Автор вопроса
    OleDbConnection Base3 = new OleDbConnection
                   (@"Provider= Microsoft.JET.OLEDB.4.0;Data Source=C:\Users\MaKsi\Desktop\Диплом\baza.mdb");
                Base3.Open();
                OleDbDataAdapter Adapter3 = new OleDbDataAdapter
                    ("UPDATE Продукты SET Наименование = \"" + textBox4.Text + "\", Количество = \"" + textBox5.Text + "\", Дата = \"" + dateTimePicker2.Value.ToString("dd.MM.yyyy") + "\" WHERE Код = " + textBox3.Text + "", Base3);
                DataTable Table3 = new DataTable();
                Adapter3.Fill(Table3);
                Base3.Close();

    В таком виде все работает
    Ответ написан
    Комментировать
  • Как на все элементы GroupBox назначить общий обработчик события в C# WindowsForms?

    @Hedy
    Создайте 1 функцию обработчик и используйт ее для всех элементов внутри вашего GroupBox.
    public void clickHandler(object sender, System.EventArgs e)  {...}
    
    button1.Click += new EventHandler(clickHandler); 
    button2.Click += new EventHandler(clickHandler); 
    button3.Click += new EventHandler(clickHandler);


    Или вот так, для всех элементов внутри:
    foreach (Control ctrl in myGroupBox.Controls)
    {
          ctrl.Click += new EventHandler(clickHandler); 
    }


    Добавив условие отбора элементов по типу, если нужно.
    Ответ написан
    Комментировать
  • Почему не работает Converter?

    petermzg
    @petermzg
    Самый лучший программист
    <Window.Resources>
          <local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
    </Window.Resources>
    Ответ написан
    2 комментария
  • Где можно почитать/посмотреть про принципы проектирования и написания ПО для стратегически важных объектов?

    Vamp
    @Vamp
    Такие стандарты существуют. Наиболее известные - MISRA C и MISRA C++. Как можно догадаться, для языков С и С++, соответственно. Изначально созданы для автомобильной промышленности, но распространились и на аэрокосмическую отрасль, медицинскую технику, военных и прочие критичные к надёжности области. В том числе и АЭС.

    Из MISRA C выросли SEI CERT C/C++, AUTOSAR General Software Specification, JPL Institutional Coding Standard for the C (стандарт NASA) и ещё куча других.

    Вся суть этих стандартов в том, чтобы максимально ограничить используемые фичи языка - чтобы код был максимально прост (даже скорее примитивен) и доступен для анализа. Как правило, запрещено использовать бесконечные циклы, рекурсию, макросы, аллокации из кучи - вобщем, любые потенциально опасные операции, в которых чаще всего находятся ошибки. Так же накладываются ограничения на размер функции (в строках кода), цикломатическую сложность, покрытие автотестами и т.п.

    Помимо этого, существует ворох стандартов, описывающих подходы к организации процесса разработки и контроля качества. У каждой отрасли свои стандарты. Например, AS9100.

    Если вы интересуетесь вопросом чтобы применять подобные техники в повседневном программировании, то не стоит - никакого удовольствия и конкурентного преимущества вы от этого не получите. Если конечно ваше повседневное программирование не включает в себя разработку панели управления АЭС.

    Update 2019-12-30:
    На хабре появилась интересная статья с кратким обзором MISRA.
    Ответ написан
    Комментировать
  • C# как удвоить символ через отдельную функцию?

    Alexeytur
    @Alexeytur
    string doubleChar(string inStr, char chr)
    {
       StringBuilder sb = new StringBuilder();
       foreach (char c in inStr)
       {
          sb.Append(c);
    
          if (c == chr)
          {
             sb.Append(c);
          }
       }
    
        return sb.toString();
    
    }
    Ответ написан
    Комментировать
  • C# как удвоить символ через отдельную функцию?

    @kttotto
    пофиг на чем писать
    var source = "Test";
    
    // v.1 Заменит первое вхождение этой буквы в слове на удвоенную
    var ch = 's';
    var i = source.IndexOf(ch);
    var result = source.Substring(0, i) + ch + source.Substring(i);
    
    // v.2  Заменит все вхождения этой буквы в слове на удвоенную
    var ch = "s";
    var result = source.Replace(ch, ch + ch);
    Ответ написан
    1 комментарий
  • Почему не отображается картинка в Image WPF?

    cyber_roach
    @cyber_roach
    UX дизайнер INEDIapps
    Гуглите WPF URI
    https://docs.microsoft.com/en-us/dotnet/framework/...

    А, да, .gif файл
    Для него лучше поискать компонент отображения. не умеет gif анимации проигрывать.
    Но в сети много примеров.
    Ответ написан
    2 комментария
  • Почему так медленно работает цикл?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    GetPixel для одиночных пикселей и работает медленно — поэтому для низкоуровеновой работы с изображениями не подходит. Правильное решение выглядит примерно вот так:
    https://stackoverflow.com/questions/24701703/c-sha...
    public class DirectBitmap : IDisposable
    {
        public Bitmap Bitmap { get; private set; }
        public Int32[] Bits { get; private set; }
        public bool Disposed { get; private set; }
        public int Height { get; private set; }
        public int Width { get; private set; }
    
        protected GCHandle BitsHandle { get; private set; }
    
        public DirectBitmap(int width, int height)
        {
            Width = width;
            Height = height;
            Bits = new Int32[width * height];
            BitsHandle = GCHandle.Alloc(Bits, GCHandleType.Pinned);
            Bitmap = new Bitmap(width, height, width * 4, PixelFormat.Format32bppPArgb, BitsHandle.AddrOfPinnedObject());
        }
    
        public void SetPixel(int x, int y, Color colour)
        {
            int index = x + (y * Width);
            int col = colour.ToArgb();
    
            Bits[index] = col;
        }
    
        public Color GetPixel(int x, int y)
        {
            int index = x + (y * Width);
            int col = Bits[index];
            Color result = Color.FromArgb(col);
    
            return result;
        }
    
        public void Dispose()
        {
            if (Disposed) return;
            Disposed = true;
            Bitmap.Dispose();
            BitsHandle.Free();
        }
    }
    Ответ написан
    Комментировать
  • Как научиться понимать английский язык на слух? Это вообще возможно?

    @nrgian
    Практика.
    Хочешь понимать на слух - слушай. Например можно начать с такого примитивного по текстам сериала, как "Друзья".
    Субтитры - зло. Если ты хочешь научиться именно на слух понимать, а не бегло читать английский - то субтитры не нужны.
    Ответ написан
    4 комментария
  • Что можно сделать чтобы сократить код?

    @PavelPikat
    Нет ничего плохого в том, что писать код по-простому и, как говорится, verbose. Это делает его более потнятным и читабельным. С другой стороны, у вас проблемы с читабельностью из-за недостающих пробелов, использования одинарных и двойных кавычек одновременно, == вместо === и т.д. Советую поставить плагин а-ля JSLint/TSLint который бы подсвечивал все косяки в соответсвии с общепринятыми нормами. Так вы научитесь писать более чистый код.

    По структуре я бы отметил чрезмерное использование else/if. Посмотрите где можно заменить на switch. Также, конструкцию
    speechSynthesis.speak(new SpeechSynthesisUtterance(fform + "покрашен на зелёный цвет"));
    можно вынести в отдельную функцию
    function speak(message) {
    speechSynthesis.speak(new SpeechSynthesisUtterance(speak));
    }

    и вызывать speak(fform + "покрашен на зелёный цвет");
    Ответ написан
    Комментировать
  • Как определить правильно пространство имен в C#?

    @J01 Автор вопроса
    Проблема решилась обновлением некоторых пакетов
    Ответ написан
    1 комментарий