• Важен ли для программиста язык?

    @Mercury13
    Программист на «си с крестами» и не только
    Профессионализм — это, с одной стороны, понимание программирования как такового, независимо от языка. С другой — это чувство библиотеки, понимание рисунка кода на том или ином языке, понимание того, что под капотом.

    Это значит: программист на C# будет слегка плавать в том, на каких библиотеках выполнить JS-задачу, и как эти библиотеки работают. Будет говорить на JS как на C# — будет получаться что-то вроде «feel myself», что, по легенде, значит «онанировать». Но это всё, надо признать, дело опыта. Нужно быть знакомым, но не нужно углубляться.
    Ответ написан
    Комментировать
  • Какая сложность алгоритма (относительно n)?

    @Mercury13
    Программист на «си с крестами» и не только
    O(n²), разумеется.
    Первый цикл выполняется O(n) раз, и второй O(n). Так что O(n²).
    Если быть точнее, те итерации, которые выполнятся,— это трапеция на квадрате n×n, никакого тебе O(n), O(n log n) и подобного не будет.
    Кстати, запись O(n/2) и O(n²/2) не имеет особого смысла — само определение символов Ландау говорит, что разница в константу не играет роли. По той же причине пишут O(n log n), не указывая, по какому основанию логарифм.

    UPD2. Запись O(n²) означает: «не превышает cn² при стремлении n→∞». Так что всё, что O(n), одновременно и O(n²). И «никакого тебе O(n)» означает, что оценку n² мы улучшить не можем.
    Ответ написан
    Комментировать
  • Исключение. Что это значит?

    @Mercury13
    Программист на «си с крестами» и не только
    Это значит: вы «сломали» память. Как правило, разыменованием «висячего» указателя или вылетом за пределы массива.
    Ответ написан
    Комментировать
  • Как договорится с художником и какие есть лицензии у изображений?

    @Mercury13
    Программист на «си с крестами» и не только
    На вопрос 2 — из некоммерческих годятся общественное достояние (Public domain = PD = CC0) и «укажи автора» (Creative Commons Attribution = CC-BY). Никакие другие лицензии CC для коммерческой игры не годятся!

    Если игра открытая — подумай, под какой лицензией она будет выпущена и совместимы ли требования с этой лицензией. Например, с GPL совместимы PD = CC0, CC-BY, CC-BY-SA.

    Разумеется, возможна ситуация, что одни части игры под одной лицензией, другие — под другой. Например, движок GPL-ный, а изображения под более строгой или более мягкой лицензией. Так, Doom (1993) имеет GPL-ный движок и коммерческое всё остальное.

    Каждую полукоммерческую лицензию приходится рассматривать по отдельности.

    Если лицензий несколько (например, CC-BY + GPL2 + GPL3) — если среди них есть хоть одна, которая тебя устраивает, порядок!
    Ответ написан
    Комментировать
  • Как вычислить интеграл с помощью формулы Симпсона?

    @Mercury13
    Программист на «си с крестами» и не только
    Перед нами типичная студенческая работа.

    Первое, что нужно сделать,— вынести расчёт интеграла в отдельную функцию. Помимо прочего, она должна принимать параметром n — количество точек разбиения. И проверьте, разумеется, работоспособность.

    Затем поднимаемся на более высокий уровень — налаживаем алгоритм выдерживания точности. Я бы написал так.
    n := 10
    yНовое := расчёт(n)
    повтор
      n := n·2
      yСтарое := yНовое
      yНовое := расчёт(n)
    пока |yСтарое - yНовое| > эпсилон
    вывести/вернуть yНовое

    Сможешь перевести на Си?
    Ответ написан
    Комментировать
  • Чем отличается NAT от обычного "роутинга"?

    @Mercury13
    Программист на «си с крестами» и не только
    Это две совершенно разные технологии. Они идут рука об руку, но никаких проблем использовать их порознь.
    DHCP без NAT — любая домосеть с «белыми» адресами, которая автоматически раздаёт их.
    NAT без DHCP — никаких проблем его сделать на обычном домашнем роутере.

    Как действует NAT. Берём и корректируем в исходящем пакете какие-нибудь параметры вроде исходящего порта (чтобы узнать, чей пакет). Заодно меняем исходящий адрес на внешний адрес сети. Когда приходит ответ, восстанавливаем исходного абонента, меняем входящий адрес на адрес этого абонента и ретранслируем его во внутреннюю сеть.

    Задача простого роутинга (который не NAT) — просто передать пакет дальше по цепочке, уменьшив TTL и определив по таблице маршрутизации, на какое из соединений надо его передавать.
    Ответ написан
  • Как убрать раскладку физической клавиатуры (Android 9, EMUI, Gboard)?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Пока самая удачная прога, которую я нашёл,— External Keyboard Helper Demo и Pro. Она сама управляет своими раскладками. Недостаток — при подключении железной клавы нужно переключать метод ввода.
    Ответ написан
    Комментировать
  • Почему Segmentation fault?

    @Mercury13
    Программист на «си с крестами» и не только
    Переменная run ничему не присвоена.
    Ответ написан
    Комментировать
  • Как к четырем элементам массива добавить ещё два?

    @Mercury13
    Программист на «си с крестами» и не только
    Нужен или массив с запасом (например, на 6 мест), или динамический (например, std::vector).
    Си++ — язык достаточно низкого уровня, и сам программист видит, где там память динамически выделяется, а где выделена заранее.
    Ответ написан
    2 комментария
  • Какова цель ddos атак, и зачем они нужны?

    @Mercury13
    Программист на «си с крестами» и не только
    Пока DDoS’ят, восстановить в исходном виде нельзя. Потому что ничего не сломалось, просто не выдерживает нагрузку. Даже если мы перезагрузим все сервера, они снова упадут под натиском запросов.
    Только спрятаться за анти-DDoS’ными службами.

    Цель — временно остановить работу сервера, понятное дело. И без меня это написали, зачем.
    Ответ написан
    Комментировать
  • Hash талица это асоциативный массив индексов и адрессов в памяти?

    @Mercury13
    Программист на «си с крестами» и не только
    Производительность хэш-таблиц — O(1) в среднем. Усреднённое по всем возможным наборам данных, если хэш-функция хорошо перемешивает.

    Хэш-таблица действует так. Допустим, у нас выпало значение хэш-функции 1234 и у нас в хэш-таблице 100 гнёзд. Тогда наш элемент где-то в гнезде 34. Когда расширим таблицу до 200 гнёзд, элемент останется в гнезде 34, а когда расширим до 1000 — он переедет в гнездо 234.

    Как разрешаются коллизии (два элемента в одном гнезде) — зависит от реализации: например, в гнезде могут быть связанные списки элементов.

    Для словарей, если тот строится раз и до конца своей (не)долгой жизни, можно применить и другой способ, совершенно неубиенный и дешёвый по памяти. Взять массив, построить и отсортировать. Бинарный поиск — O(log n).
    Ответ написан
    2 комментария
  • Объясните разбор файла mainwindow.h в QT по шагам?

    @Mercury13
    Программист на «си с крестами» и не только
    // Защита от повторного включения
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    // Пара include’ов
    #include <QWidget>
    #include <QMainWindow>
    
    // Определение UI-класса наперёд, чтобы визуальное редактирование не приводило
    // к крупным перекомпиляциям
    namespace Ui {
    class MainWindow;
    }
    
    // Собственно класс формы
    class MainWindow : public QMainWindow
    {
        // Макрос, который добавляет файл в компиляцию MOC’ом,
        // а также реализует пару функций
        Q_OBJECT
    
    public:
        // Конструктор-деструктор.
        // Форма семантически не эквивалентна parent’у,
        // потому конструктор explicit
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    // Слоты — фишка Qt, которая обрабатывается MOC’ом
    private slots:
    
    
    private:
        // Указатель на UI (для него в Qt есть ещё одна программа, UIC)
        Ui::MainWindow *ui;
    };
    
    // Защита от повторного включения
    #endif // MAINWINDOW_H


    Что ещё написать?

    Определение класса наперёд не мешает писать указатели и ссылки.

    Конструктор explicit запрещает неявное преобразование. Explicit имеет смысл, если возможен вызов конструктора с одним параметром. Правило таково: ставь explicit, если твой объект по смыслу не эквивалентен единственному параметру конструктора. Например, Ratio(int x);, но explicit Array(int x);: при построении рационального числа из целого будет полный эквивалент, но при построении массива — нет.
    Ответ написан
    Комментировать
  • Почему пробел заменяется на W?

    @Mercury13
    Программист на «си с крестами» и не только
    Пробел не isupper.

    Расчёт тут идёт в знаковом типе, потому *i + key - 97 < 0

    Существует два метода деления с остатком, в x86 встроен тот, где знак остатка равняется знаку делимого (а неполное частное — результат округления к нулю). Именно его впоследствии кодифицировали в Си99. Значит, (*i + key - 97) % 26 < 0

    Это значит, что результат преобразования будет меньше 97 = 'a'. Например, 'W'.

    Ах да. В Си можно написать (*i + key - 'a') % 26 + 'a'.
    Ответ написан
    Комментировать
  • Что значит сокрытие?

    @Mercury13
    Программист на «си с крестами» и не только
    Это значит: должно быть сложно или невозможно вывести объект из «адекватного» состояния (которое называется инвариант класса). Все чувствительные поля при этом прячутся от посторонних глаз. (Разумеется, могут быть «небезопасные» методы, но тогда пользователь сам себе злобный буратино).

    PHP управляет памятью сам (что-то мне кажется, что метод управления памятью там «бросай объект и шут с ним»). Но давайте представим себе, что надо вызывать команду «уничтожить объект», и дальнейшее обращение к освобождённому указателю некорректно. Попробуем сделать объект «указатель множественного владения».

    В каждом из управляемых объектов налаживаем счётчик; при переприсваивании на счётчике будет такая цифра, сколько указателей «смотрят» на объект. Счётчик упадёт до нуля — объект уничтожается. Соответственно, поле управляемого объекта «счётчик» и поле указателя «указатель на объект» скрываются. «Адекватное состояние» я уже описал: «на счётчике будет такая цифра, сколько указателей «смотрят» на объект. Счётчик упадёт до нуля — объект уничтожается».
    Ответ написан
    Комментировать
  • Как быстро выбирать подстроку у строки?

    @Mercury13
    Программист на «си с крестами» и не только
    Использовать кольцевой буфер. Придётся пописать немного, но на что это нужно и какова будет сложность остальных работ?
    Ответ написан
    2 комментария
  • Как грамотно осуществить декомпозицию?

    @Mercury13
    Программист на «си с крестами» и не только
    typedef struct ttime {
    Си, на ++ не нужен typedef.
    И используй наконец тэги для кода.

    int hours; int minute; int sec;
    Странное именование, обычно пишут hour.

    struct date {
    ttime time;

    которая в свою очередь входит в состав структуры Date.
    Странно, ведь это не дата, а скорее Clock — часы.

    Методы позволяют изменять текущее время

    Ну и где тут измерение?

    Моя архитектура.
    1. Время. Получение времени из системы, сравнение, вывод в консоль.
    2. Часы. Хранят последнее время. Команда «tick» — получить время, сравнить с последним, при неравенстве — сохранить новое и вывести его в консоль.
    3. Внешний цикл (может быть как в часах, так и снаружи). Часы тикают, делают небольшую задержку и проверяют на нажатие клавиши.
    Пять объектов никак не будет, да и Date нужно только в том случае, если вы реально работаете с датой. Я бы, чтобы докинуть количество объектов до нужного, сделал бы дату (date), время (time) и дату-время (stamp).

    Для турнира единоборств (для простоты — без весовых категорий).
    • Fighter: имя, всякая информация про него вроде города, клуба и титулов.
    • Stub: указатель на Fight + enum (Winner/Loser) — откуда берётся участник. Указателя на Fight нет — тогда TBD (то есть не определился).
    • Participant: указатель на Fighter + структура stub.
    • Fight: номер, два Participant, дата/время, кто победил (0/1), причина победы (ещё не проводился, KO, TKO, по очкам, неявка…)
    • Tournament: содержит список боёв и таблицу результатов.

    Можно также разорвать кольцо зависимостей, наладив интерфейс FightInfo, сделав в Stub FightInfo*, а не Fight*, и чтобы Fight реализовывал FightInfo.
    Ответ написан
  • Что такое «распределение Нэша» (Nash distribution)?

    @Mercury13
    Программист на «си с крестами» и не только
    Известная теорема теории игр (теорема Нэша).
    Любая матричная игра имеет равновесие Нэша в смешанных стратегиях.
    А смешанная стратегия — это распределение, с какой вероятностью брать ту или эту стратегию.

    Таким образом, распределение Нэша — это та «случайная смесь» стратегий, которая уныла и надёжна, как и полагается равновесию Нэша. Например, для игры «камень-ножницы-бумага» распределение Нэша — все три фигуры по ⅓.
    Ответ написан
    Комментировать
  • Как разобраться, что происходит в этом заголовочном файле?

    @Mercury13
    Программист на «си с крестами» и не только
    Учи понятие «единица компиляции». Тут, к сожалению, есть и вещи, которые должны быть в CPP-файле, и вещи, которые должны быть в H-файле.

    #pragma pack(1)
    Структуры данных нам нужны «один в один», без байтов заполнения.

    struct FileHeader 
    struct MAPINFO

    Формат BMP. Не забывай, что формат BMP записывается с нижней строки!

    Функция Open читает картинку «один в один», Save пишет «один в один», GetMapInfo и GetFH выдают какие-то заголовки нашего BMP.

    Остаётся GetMap(), который, по идее, должен выдавать матрицу цветов, но реально действует только для 32-битного BMP и никак не инкапсулирует ни ширину-высоту матрицы, ни тот факт, что формат BMP пишется с нижней строки.

    За этот код — тройка с минусом.

    А теперь чего ваш код НЕ поддерживает, но, по идее, должен, чтобы выполнить вашу задачу.
    1. Создание BMP нужного размера с нуля, а не загрузка из файла.
    2. Инкапсулировать матрицу пикселей. Желательно так, чтобы был быстрый доступ к строкам как к буферам в памяти, для простоты переноса информации из старого BMP в новый, на 30×30 пикселей больший.
    3. Если вы ограниченно поддерживаете формат BMP — вылетать с ошибкой, если версия неподдерживаемая (например, не то количество цветов).

    Задача именно своими силами наладить поддержку BMP? А то в Builder’е есть TBitmap.
    Ответ написан
    6 комментариев
  • Как организовать указатели в си?

    @Mercury13
    Программист на «си с крестами» и не только
    Дело тут в очерёдности операций.
    Сначала вычисляются правые одноместные, потом левые.

    Надо (**h)[1] = 0;.
    Ответ написан
    Комментировать
  • Qt checkbox this combobox?

    @Mercury13
    Программист на «си с крестами» и не только
    Через сигналы-слоты способа не вижу.
    Унаследоваться от QStandardItemModel, присосаться на setModelData.
    А ещё лучше унаследоваться от QAbstractTableModel и переопределить все эти data(), flags()…
    Ответ написан
    Комментировать