• Как повернуть матрицу на одну позицию по часовой стрелке?

    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)
    {
    
    }
    Ответ написан
  • При 3d визуализации сливаются грани и рёбра меша. Как исправить?

    tsarevfs
    @tsarevfs
    C++ developer
    Нужно добавить освещение. Тогда поверхности под разным углом к свету будут визуально отличаться.

    https://myogre.wordpress.com/2011/10/17/man2/
    Посмотрите секцию "Создание источников света".
    Ответ написан
    4 комментария
  • Как правильно писать на с++?

    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 комментария
  • Как присвоить диапазон значений переменной в Python?

    tsarevfs
    @tsarevfs
    C++ developer
    Насколько я знаю, какого-то специального способа нет. Используйте пару переменных или кортеж.
    min_val, max_val = 1, 10
    
    if min_val <= x <= max_val:
        print("...")


    Либо писать свой класс:
    def BoundsChecker:
        __init__(self, min_val, max_val):
            self.min_val = min_val
            self.max_val = max_val
            
        def isBounded(self, val):
            return self.min_val <= val <= self.max_val
        
    checker = BoundsChecker(1, 10)
    
    if (checker.isBounded(x))
        print("...")
    Ответ написан
    1 комментарий
  • Как узнать, что тело сообщения начинается с точки?

    tsarevfs
    @tsarevfs
    C++ developer
    Можно встроеную функцию использовать. Плюс пробелы в начале вычистить.

    body = response['items'][0]['body']
    startsWithDot = body.strip().startswith('.')
    Ответ написан
  • Как в 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, и не сгенерируем нужные версии методов.
    Ответ написан
    Комментировать
  • Как прикрутить GUI к скрипту Python?

    tsarevfs
    @tsarevfs
    C++ developer
    Смотрите примеры тут www.rkblog.rk.edu.pl/w/p/simple-text-editor-pyqt4
    Вам достаточно первых двух по ссылке.
    # here we connect signals with our slots
    		QtCore.QObject.connect(self.ui.button_open,QtCore.SIGNAL("clicked()"), self.file_dialog)
    .
    Благодаря этой строчке в примере при нажатии на кнопку вызывается функция file_dialog.
    Ответ написан
    Комментировать
  • Какую тему выбрать для курсового проекта?

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

    tsarevfs
    @tsarevfs
    C++ developer
    Объем стенок имеется в виду? Тогда, если вкладываем без зазоров, получаем большой шар со стенкой 12 * 5 мм и двркой как у маленького -- 10см.
    Получаем внешний диаметр 22см (10 дырка + 2 * 6 стенки).
    Объем = объем целиком - объем дырки.
    Ну и не забываем что литр = 1дм^3. Единицы измерений надо аккуратно привести.
    Ответ написан
    Комментировать
  • Как сделать обход в глубину на основе файловой системы?

    tsarevfs
    @tsarevfs
    C++ developer
    Для реальной задачи используйте os.walk.
    Пробел после запятой -- зло!

    def filegraph(current, last):
        
        if current in visited:
            print( visited, ' visited')
            print(node)
            for key in node:
                    print('%s -> %s' % (key, node[key]), end = ' \n')
            print(current, ' Посещено')
            return #*Сразу выходим, чтобы уменьшить вложенность кода*
    
        #spisok.clear()
        current_dir_items = [] #*это список файлов в текущей директории, то что он был глобальным создавало проблемы ниже*
    
        names = os.listdir(current)
        visited.append(current)
        
        print(current, ' Текущая директория')
        print(last, ' Последняя директория')
        
        for name in names:
            directory = os.path.join(current, name)            
            if os.path.isdir(directory) == True:
                current_dir_items.append(directory)
                print(directory, 'директория')
        print( current_dir_items,  ' список')
        
        print(last)
        node[current] = last, current_dir_items #Добавляем в словарь !!!список не копируется, мы помещаем в словарь ссылку на него!!!
        
        if (last in node) #*логика на исключениях -- плохая идея*
            print(node[last], ' last' )
        else
            print(' Ключа нет')
    
        print(node[current], ' current')
        if len(current_dir_items) != 0:
            #for a in range(0, len(current_dir_items)):
            #    if node[current][1][a] not in visited:
            for next_item in current_dir_items: #*по возможности не используйте for in range(len)*
                if next_item not in visited: 
                    time.sleep(3) 
                    os.chdir(next_item) #*код становится проще*
                    for key in node:
                        print('%s -> %s' % (key, node[key]), end = ' \n')
                    print(next_item, ' current ', '-' * 10 )
                    return filegraph(next_item, current) #тут происходил spisok.clear() и портил вам данные в словаре. 
                
        else:
            time.sleep(3)
            print(' Возвращение ' )
            print(node[current][0], ' current  0' )
            for key in node:
                print('%s -> %s' % (key, node[key]), end = ' \n')
    
            return filegraph(node[current][0], '')
    Ответ написан
  • Изучение математики через программирование, глупое решение?

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

    tsarevfs
    @tsarevfs
    C++ developer
    Если окно это прямоугольник со сторонами паралельными осям координат (вертикальными и горизонтальными), то стоит этим пользоваться, это сильно упростит жизнь.
    Какие есть варианты:
    1 многоугольник попал в окно целиком
    2 многоугольник пересекает окно
    3 окно лежит внутри прямоугольника
    В первом случае все вершины многоугольника лежат внутри, пересечений по сторонам нет.
    Во втором, есть пересечения по сторонам. Вершины могут быть распределены по-разному(!)
    В третьем нет пересечений сторон, все вершины снаружи.

    Получается надо уметь проверять 2 факта:
    1 вершина внутри окна -- элементарно, x_min<=x<=x_max && y_min<=y<=y_max
    2 сторона многоугольника пересекается со стороной квадрата. Чуть сложнее, но учитывая что стороны квадрата паралельны осям, код будет несложный.
    Ответ написан
    2 комментария