Ответы пользователя по тегу C++
  • Алгоритм выполнения следующей задачи?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Если нужны идеи, то это частный случай задачи о рюкзаке или задачи о сумме подмножеств.
    Ответ написан
    Комментировать
  • Как повернуть матрицу на одну позицию по часовой стрелке?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Функции очень помогут вам разбить задачу на более простые части.
    ///Повернуть рамку на 1 позицию
    ///\param top номер строки левого верхнего угла рамки в исходной матрице
    ///\param left номер колонки левого верхнего угла рамки в исходной матрице
    ///\param width ширина рамки (количество колонок)
    ///\param width height высота рамки (количество строк)
    ///         left
    ///          | w
    ///       ************
    ///  top--***abcdef***
    ///      h***n****g***
    ///       ***mlkjih***
    ///       ************
    ///
    /// rotateFrame(matrix, 1, 3, 6, 3)
    void rotateFrame(int **matrix, int top, int left, int width, int height)
    {
        if (width == 1)
        {
            int copyOfLast = shiftColumn(matrix, top, left, height, true);
            matrix[top][left] = copyOfLast
            return;
        }
    
        if (height == 1)
        {
            int copyOfLast = shiftRow(matrix, top, left, width, true);
            matrix[top][left] = copyOfLast
            return;
        }
    
        //верхняя строка
        int copyOfLast = shiftRow(matrix, top, left, width, true);
        
        //левый столбец
        shiftColumn(matrix, top, left, height, false);
    
        //нижняя строка
        shiftRow(matrix, top + height  - 1, left, width, false);
    
        //правый столбец
        shiftColumn(matrix, top, left + width - 1, height, true);
    
        //восстанавливаем элемент из правого верхнего угла
        matrix[top + 1][left + width - 1] = copyOfLast;
    }
    
    ///Сдвинуть участок строки длинной length на одну позицию в лево или право в зависимости от shiftLeft.
    ///Первый элемент не изменяется, последний пропадает.
    ///Возвращает элемент, который будет утрачен.
    
    ///   **abcd** -> **aabc** (shiftLeft == true), возвращаем d
    ///   **abcd** -> **bcdd** (shiftLeft == false), возвращаем a
    int shiftRow(int **matrix, int top, int left, int length, bool shiftLeft)
    {
    
    }
    
    ///Аналогично shiftRow, но для столбца
    int shiftColumn(int **matrix, int top, int left, int length, bool shiftDown)
    {
    
    }
    Ответ написан
  • Как правильно писать на с++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    По организации кода: 1 класс (MyClass) = MyClass.h + MyClass.cpp. friend классы и функции лучше не использовать.
    Наследованием не увлекаться. Если у вашего класса ровно 1 наследник, то наследование скорее всего не нужно. Шаблонные классы тоже скорее всего не пригодятся.
    Основной профит от класов -- инкапсуляция. Например вы создаете класс который должен качать что-то из интернета PackageUploader. Начинайте с его интерфейса (набор его public методов). Это то, что вам нужно от этого класса. Например он может скачать программу по имени и номеру версии:
    /// Скачать программу по имени с заданной версией.
    /// Возвращает путь до скачанного файла в локальном
    std::filesystem::path downloadPackage(const std::string &name, const std::string &versionString);


    Для того чтобы это сделать, ему потребуется информация о том, где нужно брать программу. Например можно в конструктор PackageUploader передать класс, который хранит такую информацию на диске или в реестре.
    /// Конструктор PackageUploader.
    /// Принимает PackageRegistry, который хранит информацию об адресах
    ///  на которых можно скачать различные программы.
    PackageUploader(const PackageRegistry &packageRegistry);


    Напишите несколько классов, которые вы бы хотели выделить и их интерфейсы без реализации. И я, или кто-то еще сможем что-то посоветовать.
    Ответ написан
    Комментировать
  • Описание класса в .cpp?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Все правильно. Class.h подключается к Class.cpp.
    И да, это, в своем роде, костыль. Дело в том, что #include работает как текстовая подстановка (просто копипастит содержимое файла вместо себя).
    Если несколько cpp файлов будут в себя включать определение одного и того же класса, или функции, то на этапе линковки(отдельно скомпилированные cpp склеиваются вместе) возникнет ошибка про повторное определение.
    Ответ написан
    Комментировать
  • Как реализовать запрет на повторный запуск приложения?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Файл создают временный. Тут есть проблема, с падением приложения, в следствии чего этот файл не удаляется. Но можно например PID в этот файл написать и проверять наличие процесса.
    Ответ написан
    Комментировать
  • Олимпиадное программирование. c++ или python?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Python может работать в 10 раз медленнее. В некоторых олимпиадах для него увеличенные таймауты, но не везде. C++ пока более предпочтителен. Java тоже хороший выбор.
    Пишите на C++ а не на C. Пользуйтесь новыми возможностями C++ 11/14. Забудьте про явное выделение памяти через new (вместо этого используйте vector, unique_ptr, shared_ptr). Изучите stl, в нем много полезного для олимпиад. Пользуйтесь лямбдами. Тогда писать на C++ будет достаточно приятно.
    Ответ написан
    4 комментария
  • Как создать визуальный кодогенератор?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Можно на https://www.jetbrains.com/mps/ посмотреть. На нем можно относительно легко простой язык написать.
    Ну а так, если сделать python api, то с ним непрограммисты тоже справляются.
    Ответ написан
    1 комментарий
  • Как проранжировать числовой массив?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    std::vector indices(data.size());
    for (size_t i = 0; i < data.size(); ++i)
    {
        indices[i] = i;
    }
    
    std::sort(indices.begin(), indices.end(), [&data](int a, int b) {
            return data[a] < data[b];   
        });
    Ответ написан
    7 комментариев
  • Почему возникает ошибка при наследование классов С++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Добавьте #pragma once в начале каждого .hpp файла. Препроцессор копипастит текст файла вместо соответствующей #include директивы. У вас получится, что файл содержащий Klass3 подставляется 2 раза. #pragma once выкидывает повторы.
    Ответ написан
    4 комментария
  • Как в c++ сделать вывод звездочек вместо пароля?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Вы пишете на С а не С++.
    Предлагается читать посимвольно с помощью getch https://stackoverflow.com/a/6175522
    Ответ написан
    Комментировать
  • Можно ли вынести реализацию шаблонного класса в отдельный cpp файл?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Если кратко, то нельзя.

    Шаблонны в С++ генерируют свою версию кода для каждого варианта параметров, с которыми их используют. Если у вас есть класс A, и вы используете A и A, то будет создано 2 набора методов этого класса, для каждого типа.
    Вспоминаем, что cpp файлы компилируются отдельно.
    Мы можем собирать a.cpp -> a.obj, потом main.cpp -> main.obj, а потом слинковать их (a.obj, main.obj) -> main.exe.
    include же просто копипастит текст файла вместо строчки #include "..."
    Теперь представим, что мы определили класс A в a.cpp а используем main.cpp. Но в этом случае мы просто не узнаем о том что класс используют в main.cpp при компиляции a.cpp, и не сгенерируем нужные версии методов.
    Ответ написан
    Комментировать
  • Какую тему выбрать для курсового проекта?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Можно взять какую-нибудь фишку из новых стандартов.
    Например рефлексию https://www.youtube.com/watch?v=ihpfu0TV3Q8, для которой есть эксперементальные реализации в clang.
    И запилить систему для конфигов, в виде структур, для которых работает автоматическая сериализация (загрузка и сохранение в json), и автоматическое создание ui для редактирования.
    Ответ написан
    Комментировать
  • Как проверить запущен ли дочерний процесс?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Похоже вы получили зомби-процесс. Родительский процесс должен считать код возврата с помощью wait/waitpid.
    https://ru.stackoverflow.com/a/484142/221454
    Ответ написан
    Комментировать
  • Какой движок совместим с Visual Studio?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    SFML достаточно простой для старта.
    Ответ написан
    Комментировать
  • Совместим ли CLion и RadStudio?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    CLion использует CMake. По нему можно сгенерировать проект для студии. Но лучше проверять что все работает перед тем как идти сдавать лабу. Поставьте дома community версию студии, той же версии что и в универе. Можно в виртуалку, если не винда.
    Ответ написан
    Комментировать
  • Как подключить либу к своему проекту?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    https://stackoverflow.com/a/15570165/1762922
    Нужно явно указать бинарную директорию вторым параметром add_subdirectory (относительно бинарной директории проекта) для библиотеки, если она не лежит в папке с основным проектом.
    Ответ написан
    1 комментарий
  • Поиск слов в векторе c++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    strcmp нужен для сравнения С-style строк. std::string можно и нужно сравнивать оператором ==.
    Потом размер вектора firstvect.size(). sizeof дает именно размер структуры в байтах, а не число элементов.
    Ну вероятно придется написать цикл в цикле, чтобы найти элемент во втором векторе.
    Ответ написан
    Комментировать
  • Триангуляция point cloud на С++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    https://github.com/greenm01/poly2tri
    www.cs.cmu.edu/~quake/triangle.html
    Ну и можно искать дальше по запросу delaunay triangulation c++ library
    Ответ написан
  • Где найти интересные задачи для изучения C++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    acmp.ru
    Ответ написан
    Комментировать
  • DirectX 9 | Как рендерить текст разными цветами?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Нарисовать первую часть, потом вторую со смещением.
    Ответ написан
    Комментировать