Ответы пользователя по тегу Программирование
  • Почему лучше передавать данные через параметры функции, а не работать с ними глобально?

    arusef
    @arusef
    Novice .NET dev
    Потому что использование параметров обеспечивает чистоту функций, а значит и повышает модульность программы, переиспользуемость, и в некоторых случаях даже распараллеливание.
    Ответ написан
    Комментировать
  • Возможно ли функциональное программирование в C# без LINQ?

    arusef
    @arusef
    Novice .NET dev
    Вполне возможно. Смотрите:
    static IEnumerable<TResult> Map<TIn, TResult>(this IEnumerable<TIn> seq, Func<TIn, TResult> mapper){
        foreach(TIn item in seq) yield return mapper(item);
    }
    enum Parity { Even, Odd }
    static void Test(){
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
        Func<int, Parity> parity = (num) => num % 2 == 0 ? Parity.Even : Parity.Odd ;
        foreach(var parity in numbers.Map(parity)) 
            Console.Write(parity.ToString() + ", ");
    }

    Это выведет на экран "Odd, Even, Odd, Even, Odd, Even, ".
    Чем вам не функциональный подход? И LINQ здесь нет (разве что самодельный).
    Ответ написан
    Комментировать
  • Симуляция и непрерывное считывание нажатия клавиш в c#?

    arusef
    @arusef
    Novice .NET dev
    Можете воспользоваться фреймворком SlimDX.
    Ответ написан
    Комментировать
  • Как доказать отсутствие алгоритма для решения задачи?

    arusef
    @arusef
    Novice .NET dev
    В общем случае, задачи такого рода сводятся к, наоборот, доказательству существования алгоритма.
    Есть несколько универсальных базовых методов доказательств: от противного, индукция, инвариант, и т.д.

    Для решения такой задачи, вам нужно выделить несколько основных тезисов, касающихся вашей проблемы:
    1. Исходные данные
    2. Варианты возможных действий с ними
    3. То, как изменяются данные в процессе
    4. Что должно получиться на выходе
    Основываясь на этом можно применить вышеуказанные методы, например, предположить, что такой алгоритм существует, или, например, составить шаги индукции и определить, для всех ли случаев выполняются условия. В таком контексте, ваши исходные условия - это аксиомы, они нерушимы и не требуют доказательств. На основе аксиом можно строить некоторые леммы - такие себе "частичные доказательства" - какие-то более сложные положения, которые выводятся из аксиом, и помогают позже в конечном доказательстве. Следует также помнить, что условие доказательства можно искусственно усилить, для того, чтобы легче было доказать всю вашу теорему.
    Больше об этом можно послушать в лекциях от MIT.
    Ответ написан
    Комментировать
  • MPI: Как оповестить процесс о новых сообщениях?

    arusef
    @arusef
    Novice .NET dev
    Можно просто захватывать мьютекс на время выполнения приёма данных. Однако, исходя из здравого смысла, ваша "многопоточность" будет сводиться к тому, что потоки станут работать поочерёдно. Можно использовать только один поток, т.к. MPI в принципе подразумевает выделение процессов под количество вычисляющих ядер в системе и наличие второго потока будет лишь притормаживать работу. В таком случае, ваш процесс может принимать данные о задаче в неблокирующей манере в какой-нибудь буфер, где после выполнения задачи будет проводиться проверка на наличие новых задач.
    Ответ написан
    Комментировать
  • Как хранить массу электрона?

    arusef
    @arusef
    Novice .NET dev
    В принципе, точности double должно хватить для обычных вычислений каких-нибудь школьно-академических задач по физике. Однако, если этого мало, лучше использовать какие-то альтернативные единицы. Пользователь выше предложил всё мерить относительно масс электрона, что в принципе неплохо, однако трудновато для понимания и выражения масс других частиц. Есть возможность использовать электронвольты (эВ) для выражения массы покоя. (Ну в данном случае лучше МэВ, т.к. 1 эВ - слишком маленькая велична). К тому же, массы элементарных частиц часто приводятся именно в таком виде и эта информация доступна.
    Me = 0,510 998 9461 МэВ
    Mp = 938,272 0813 МэВ
    Mn = 939,565 4133 МэВ
    1 МэВ = 1,782 661 907е−30 кг (для перевода в килограммы, если требуется)
    Ответ написан
    Комментировать
  • Стоит ли в программировании учитывать возможность экстренного обрыва выполнения сценария (например выключение электричества, поломки компьютера)?

    arusef
    @arusef
    Novice .NET dev
    Проблема в том, что выход железа из строя невозможно определить программно. Не запишется какой-то код в errno и не будет никаких исключений, поэтому так запросто свой код не обезопасить.
    К программному обеспечению должны быть установлены какие-то требования, которые описывают его безопасность и отказоустойчивость. Вполне возможно не вся программа должна обладать такими характеристиками, а только её какая-то критическая часть. В таком случае, необходимо обеспечивать критически важные модули/участки дополнительными средствами, сохранением состояния, выполнением запросов в транзакциях и т.д.
    В твоём случае добиться этого не так-то просто, потому что отказ во время создания бекапа всё равно приведёт к полному, тотальному и бесповоротному...
    Ответ написан
    Комментировать
  • Как для List.ForEach() определить текущий элемент?

    arusef
    @arusef
    Novice .NET dev
    Метод List<TElement>.ForEach(Action<TElement>) принимает в качестве параметра делегат (то есть, по сути, указатель на функцию), который обрабатывает каждый элемент списка.
    Запись такого вида:
    var list = new List<int>() { 1, 2, 3 };
    list.ForEach(element => { Console.Write(element * element + " "); } );

    Выведет на экран следующее: 1 4 9

    Этот кусок кода полностью эквивалентен такому:
    void Method(){
       var list = new List<int>() { 1, 2, 3 };
       list.ForEach(Square);
    }
    void Square(int element){
       Console.Write(element*element + " ");
    }


    Таким образом, и в первом и во втором случае, переменная element является текущим обрабатываемым значением из списка.
    Ответ написан
    Комментировать