Ответы пользователя по тегу Программирование
  • Как оптимизировать алгоритм подсчёта суммы чётных чисел Фибоначчи?

    @Oxoron
    Шарпер
    Навскидку, числа Фибоначчи идут в периоде (нечет-нечет-чет).
    При этом четный член равен сумме предыдущих нечетных.
    3+5 = 8
    13 + 21 = 34
    55 + 89 = 144

    То есть, четное число - это полусумма своей тройки.
    Так что берем искомую последовательность, добавляем при необходимости один-два члена (чтоб получить полную тройку). Сумма первых 2k+1 чисел равна 2*F_{2k+1}. Сумма первых 2k чисел равна F_{2k+2}.

    Так что ищем сумму, отнимаем 1 и 2, отнимаем добавленные слагаемые, делим на два, получаем ответ.

    Формулу быстрого поиска энного числа Фибоначчи ищем на википедии.
    В результате при любых больших n поиск будет занимать почти одинаковое время.
    Ответ написан
    Комментировать
  • Как догнать однокурсников?

    @Oxoron
    Шарпер
    Проблема: недостаток времени.
    Проблема: ухудшение здоровья. Напрямую вытекает из первой (в данном случае).

    Цель: взять знаний по математике по максимуму. (ИТ потом сам догонишь, раз для тебя это проще. Даже полгода это не проблема). Вывод: забиваешь на ИТ-предметы. Изучаешь ровно настолько, чтоб пропустили в следующий семестр. Матан грызешь дальше, в освободившееся от ИТ время спишь. Побольше спрашиваешь у однокурсников, у всех. Один-два смогут обеспечить тебе прорыв, относительный.
    На лекции ходить обязательно, но через раз. Наблюдай, что эффективнее. Через месяц будешь знать, ходить или не ходить.
    Обязательно высыпаться. Обязательны прогулки. Или велосипед. Или плавание. Упражнения для глаз, раз в час.
    То, что не понимаешь половины - это нормально. Большинство не понимает, просто привыкают. Рекомендую почитать книги Дмитрия Письменного. Минимум доказательств, много примеров. Думаю, на контрасте Письменного и классических учебников сможешь что-нибудь понять.
    Еще вариант: пытайся понять, зачем доказывают теоремы. Трать на это час в день. Выбираешь лемму\теорему и задаешь себе вопрос: для чего её доказывают? Для какого док-ва она нужна? Для какой задачи?
    Еще вариант: готовься не к прошедшим лекциям, а к будущим. То есть, если идешь на лекцию - прочитай её материал предварительно. На лекции ты возможно не успеваешь что-то понять, и буксуешь из-за этого. При предварительной подготовке некоторые вещи будут уже понятны, и сможешь поинтересоваться у лектора о действительно непонятных деталях. Готовься к такому скачку. В пятницу хорошо выспись, в выходные сосредоточься на изучаемом предмете.

    Стоит математика усилий, или нет, каждый решает сам. Я не стал математиком, но до сих пор иногда что-нибудь решаю, для души. Год учебы догонишь впахивая в таком же темпе, как описал сейчас (только на пару часов больше отдыхая). Уйти в ИТ можно, но это популярный путь. Я бы посоветовал потерпеть год (учебный).
    Удачи.

    P.S. Стать профи за год в ИТ - это тоже нелегко.
    Ответ написан
    7 комментариев
  • Как податься в науку?

    @Oxoron
    Шарпер
    Смотри, для нормальных занятий наукой нужны несколько вещей.
    1. Горящие глаза. Это есть у многих неофитов.
    2. Усидчивость, настойчивость, упорство. Важно понять: многие вещи наскоком не решаются, а наука полна рутины. Написать статью в научный журнал, диссертацию (без диссертации вращаться в этом котле КРАЙНЕ неудобно), описание нового робота\датчика\алгоритма - после непосредственно размышлений\экспериментов этим заниматься скучно.
    3. Минимальная пригодность к бумажной работе. Бумаг, не связанных с наукой напрямую, будет много.
    4. Время\деньги.
    5. Коллектив. Если в твоем ВУЗе нет нормальной кафедры - науку двигать будет тяжело. Желательно наличие одного профессора "в теме", и кого-нибудь из "молодежи", кто серьезно работает по спецухе. С этими людьми еще нужно будет отыскать контакт - сложности маловероятны, но, все-таки, возможны.

    Как это все развивать-тренировать.
    1. Никак. Либо есть, либо нет.
    2. Изучай гуманитарные дисциплины по лекциям. Хотя бы одну-две. Тщательно записывай все лекции, дополнительно изучай их дома, делай доклады. В идеале выбирай ту дисциплину, которая не нравится. Во-первых, разберешься в теме (в это трудно поверить, но среди всех моих гуманитарных дисциплин, в итоге не нашлось ни одной бесполезной), во-вторых, привыкнешь делать неинтересную работу.
    3. Стань старостой, активной участвуй в профкоме на какой-либо секции, работай секретарем на кафедре\лаборатории\деканате. Староста - самый простой вариант: меньше будут донимать с учебой, напряг минимальный. Профком - идеальный вариант: много знакомств, начнешь понимать, что такое бумаги, зачем их пишут, когда их нужно писать, когда можно не писать, кому нужно сдавать и зачем. Приличный опыт общения. Секретарь - вариант, пожалуй, худший. Бумаг много, да, на времени и нервов отнимает слишком много.
    4. Время. Оно же деньги. Если нет возможности устроиться по специальности на минимально-необходимые деньги (квартира\питание\стандартные_расходы) - даже не дергайся. Работать на несвязанной работе и двигать науку тяжело. С появлением семьи\подружки\друга - крайне тяжело. В принципе, если есть пассивный доход - все проще.
    5. Коллектив придется искать самостоятельно.

    Удачи.
    Ответ написан
    1 комментарий
  • Где хранятся примитивные типы и как программа получает к ним доступ?

    @Oxoron
    Шарпер
    Базовый ответ: значение переменной хранится в стеке. Есть программа, ей при запуска ОС выдает кусок памяти. В этом куске есть стек переменных, там и хранится эта глобалка.

    Любая переменная скрывает собой указатель. Грубо говоря, ты пишешь int a=2, что во время выполнения трансформируется в mov 00ff00aa, 2. Прога во время работы попросит у ОС кусок памяти, и в нем жестко выделит место под примитив. Везде, где в исходниках стоит переменная 'a', в бинарниках будет выделенный адрес (компилятор постарается).

    Плюс, есть сильная зависимость от языка. Если используется Java, примитив может оказаться в куче (сам не джавист, но в .NET подобные ситуации возможны). Там, по идее, точное расположение в памяти зависит от реализации сборщика. Но тут нужен джавист-спец.
    Ответ написан
    Комментировать
  • С чего начать изучение написания TDD - тестов?

    @Oxoron
    Шарпер
    Тут рецензия хорошей книги "Art of Unit Testing", плюс, несколько ссылок на доп-материалы. Книга не только расписывает плюсы-минусы тестов, но и объясняет, как лучше внедрять TDD в команды\проекты.
    Ответ написан
    Комментировать
  • Где мониторить IT-мероприятия Москвы?

    @Oxoron
    Шарпер
    Ответ написан
    Комментировать
  • Автозаполнение полей программ?

    @Oxoron
    Шарпер
    Программа твоя? Язык какой?
    Сделай обработку входящих параметров, и все.
    Ответ написан
    Комментировать
  • Возможно ли написать универсальный парсер xsd/xml файлов?

    @Oxoron
    Шарпер
    Как вы планируете брать информацию о типах? Ограничения на длину строк, например. Nullable поля, значения по умолчанию?
    Если xml содержит подобную информацию в отдельном блоке (назовем его "заголовочным"), все относительно просто. Парсим заголовок, формируем запрос на наличие БД\таблицы, если нет - создаем, если есть - сравниваем структуры. Потом парсим записи, сооружая банальный Insert. Можно учитывать наличие файлов с такими ключами, тогда сооружаем конструкцию if exists then insert else update.
    Возможно, подойдет что-то вроде CodeFirst у EF. Как минимум извращенский способ должен быть.
    Ответ написан
  • Что не так в игре "Жизнь"?

    @Oxoron
    Шарпер
    Не совсем понял Ваш набор методов (функций).
    По факту, вся игра на поле nxn состоит из следующих этапов
    1. Создаем матрицу (n+2, n+2), все элементы нулевые.
    2. Заполняем некоторые клетки (не крайние) единицами, создавая начальную популяцию.
    3. Делаем ходы по следующему алгоритму:
    3.1 Сначала для каждой не крайней клетки считаем кол-во соседей (результаты сохраняем в отдельную матрицу).
    3.2 В зависимости от числа соседей обращаем клетку в ноль или единицу.

    То есть, Вам нужны методы:
    1. Заполнить всё поле нулями.
    2. Проверка поля на "крайность".
    3. Метод создания начальной популяции.
    4. Метод подсчета числа соседей.
    5. Метод изменения значения клетки в зависимости от числа соседей.
    Методы 2, 3, 4, 5 покрываем модульными тестами (Unit-tests)

    Самая частая ошибка в реализации заключается в том, что клетку изменяют сразу после подсчета её соседей. Если не ошибаюсь, она у Вас есть.
    Плюс, в методе find_matrix вы max_col присваиваете 0, а min_col присваиваете размер массива. Наверное, стоило сделать наоборот.
    Непонятно, чего Вы пытаетесь добиться строкой res[i][j] = matrix[i-1][j-1] в Add_zero_frame.
    Ответ написан
    5 комментариев
  • Есть ли какие-нибудь курсы по написанию технических заданий?

    @Oxoron
    Шарпер
    Посмотри "Совершенный код" Макконнелла. В 3 или 4 разделе есть краткое описание разных доков. Самое ценное - список контрольных вопросов.
    Ответ написан
    Комментировать
  • Как запустить программу на удаленном ПК?

    @Oxoron
    Шарпер
    Можете юзать PsExec от Руссиновича. Про аналог на Питоне недавно что-то проскакивало на хабре.
    Можно использовать PowerShell Remoting, тынц, тунц.
    В любом случае, управление идет не через Питон, а через готовые механизмы Микрософт. Плюс, потребуется определенная подготовка удаленного компьютера.
    Ответ написан
    Комментировать
  • Как разбить строку на блоки длинной k бит, чтобы после цикла шиврофания/расшифрования получить исходную строку(RSA)?

    @Oxoron
    Шарпер
    Не очень понимаю, зачем добиваться битов. Делайте длину ключа кратной 256, это стандартная практика.
    Про биты есть BitArray, см тут (вообще, хороший сайт, рекомендую).

    Собственно, BitArray позволяет создать массив любой длины. Если у вас маловато символов - добиваете нулями.
    Ответ написан
  • Литература для изучения C# с нуля?

    @Oxoron
    Шарпер
    Был подобный вопрос про книги на Тостере. Здесь мой развернутый ответ.
    Если вкратце: ты выбрал правильные книги и правильный порядок. Разве что, Шилдта стоит поискать 5 издание, а Троелсена читать на английском - перевод ругают.
    Кроме того, для работы вполне достаточно первой части Шилдта (до потоков).
    Так же обрати внимание, что в этих книгах рассматривается, в основном, сам язык, его синтаксис. Помимо этого программист частенько занимается тестированием (как минимум модульным), проектированием, работой с системами контроля версий, работой с БД. В случае с .NET (C#) БД скорее всего лежит на MS SQL Server.

    Так что после первой половины Шилдта рекомендую написать Unit-tests (модульные тесты) на один из своих проектов (в качестве литературы гугли Art of Unit Testing, для начала хватит первых нескольких глав), написать несколько модульных тестов с MS Fakes (Shims, Stubs), почитать про рефакторинг, например, тут, завести профиль на Гитхабе, закинуть туда один из своих проектов, сделать несколько коммитов. Для работы с БД используются либо родные классы .NET (C#), либо EntityFramework, NHibernate, etc.
    Важно все перечисленное в этом абзаце выполнять после освоения первой части Шилдта. До этого у тебя скорее всего не будет проектов, для которых нужны подобные навыки.

    .NET и C# в названиях подобных книг почти равнозначны. Если проводить (очень грубую) аналогию, платформа .NET - это ассемблер, в нем все кодируется байтами (ну, или ноликами и единичками). Так программировать неудобно. Поэтому есть несколько ЯП (C#, VB6, в некотором роде PowerShell), которые свой код переводят в байты .NET кода. Для начала можешь считать, что .NET и C# это одно и тоже, понимание разницы придет со временем (либо прочтением Троелсена).

    Удачи.
    Ответ написан
    1 комментарий
  • Какую книгу/учебник Вы бы предложили для изучения C# от уровня новичка до профессионала?

    @Oxoron
    Шарпер
    С каких книг начать изучение C#!?
    В ответах мой (относительно) подробный разбор, плюс обсуждение от других участников, плюс ссылка на блог Теплякова с подробной статьей.
    Кстати, советую после первой книги вторую читать на английском. Смысл будет понятен, чувство языка придет. Для простых задач язык не важен, для сложных ответа на русском может и не быть.
    Ответ написан
    1 комментарий
  • Как остановить выполнение кода и продолжить его после определенных условий?

    @Oxoron
    Шарпер
    Сделайте в форме2 событие OnConcreteButtonPressed. В первой настройте обработчик (в Вашем случае doSomething), создайте вторую форму, подпишитесь на событие, откройте вторую форму.
    В форме1 будет код вроде
    Form2 f = new Form2();
    f.OnConcreteButtonPressed += doSomething;
    f.Show(); // лучше f.ShowDialog();

    MessageBox() внесите в doSomething().
    Во второй форме при нажатии на кнопку генерируйте событие OnConcreteButtonPressed.
    Ответ написан
    3 комментария