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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Здесь медленным является скорее всего вычисление функции S.

    int S(int p, int q) {
        if (p == q) {
            return F(p);
        } else {
            return F(p) + S(p + 1, q);
        }
    }


    Вот для входных параметров p = 0 и q = 0xFFFF_FFFF например нам придется
    вращать пустой цикл 4 миллиарда раз (или 4 млр раз проваливаться в рекурсию)
    и все просто для того чтобы посчитать сумму

    F(p) + F(q)

    Можно убрать эти холостые вычисления и таким образом ускорить прохождение тестов.
    Ответ написан
  • Фреймворки для кросс-платформенной разработки. Практикуют ли переписывание под разные платформы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сам UI не делал. Но слышал мнение от опытных UI-щиков что кросс-платформенная разработка
    на практике проваливается. В мелочах. Где-то какие-то фичи кросс-платформ не может одинаково воспроизвести.

    Обычно конторы побогаче для разработки своего мобильного приложения под Android / iOS нанимают 2
    команды и каждая делает UI на нативных фреймворках. Конторы победнее - страдают от нехватки фич.
    Ответ написан
    Комментировать
  • Что можно разработать на C++ кроме нативных GUI-приложений и серверной части веб-приложений?

    mayton2019
    @mayton2019
    Bigdata Engineer
    По поводу разработки ОС. Кажется BeOS и HaikuOS были созданы с использованием языка С++.

    Все остальные не используют С++ для разработки СОБСТВЕННО ядра. При этом С++ может
    быть использован для разработки графической части (KDE например). Но твой вопрос скорее
    всего не в этом.
    Ответ написан
    2 комментария
  • Как получить случайные числа в C++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Получение по настоящему случайных чисел - это криптографическая задача и ее делают через всякие
    библиотеки типа OpenSSL
    и прочие. Там есть API для криптостойких ГПСЧ. Вы можете вызывать их
    без сидирования между вызовами поскольку там эта проблема уже решена.

    Если вы уже добрались до работы с системными часами
    system_clock::now()
    то означает что у вас есть какие-то мысли по поводу ГПСЧ или вы видите недостатки просто
    вызова rand() - то расскажите какие именно. Или где вы внутри rand увидели дефект.
    Обычно 99% пользователей довольны rand и име ничего другого не надо.

    В вашем коде srand(..) нужно вызвать 1 единственный раз и потом просто брать значения из rand(..)
    Ответ написан
    Комментировать
  • Что стоит учить с или c++ или c#?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Добрый вечер! Столкнулся с такой проблемой: Мне очень нравятся семейство языков Си, у меня есть выбор учить C++ либо C#, хочу разрабатывать ПО для ПК. Подумал начать с C++ и говорят что сначала поучить чистый СИ, а после переходить на C++, так что же из этого правильно? Надо ли учить Си? Или может лучше начать с C#, а дальше уже выучу C++?

    Тема сравнения С/C++/C# в публичном пространстве - опасная тема. Она обычно заканчивается
    топиком в 1000 страниц и великой войной всех против всех. Я видел много таких войн.
    Они ничем не заканчиваются. Специалисты остаются при своих мнениях. А зритель просто развлекается.

    Сам по себе выбор языка ставят только новички. Професиионалу безразличен язык (почти). Его может больше интересует отрасль, стек технологий, стандарты и протоколы. С моей точки зрения сегодня
    таким стандартом может быть выбор облака (AWS, Azure, GCP).

    Чистый СИ учить смысла нет. Учи сразу С++. Но даже его создатель Бьорн Страуструп считает что С++ это
    сложный язык и он настаивает чтобы новички не брались учить все фичи сразу. Исключение по языку
    СИ может быть в том случае, если ты собрался быть инженером по разработке микро-контроллеров
    и у тебя скорее всего будет только СИ как основной (на 80-90%) инструмент взаимодействия с таким железом. Выйти на мидловый или синьорный уровень в С++ очень тяжело. Тяжелее чем в других языках.
    Поэтому будь готов терпеть. Вот когда виски станут седые - тогда и будешь господин-синьор.

    C# - это очень сильно корпоративный стандарт от Microsoft. Никакой связи с С++ он не имеет. Он конечно
    внешне похож но это сходство обманчиво. Да изучать его тоже можно. Он учится легко. Существуют книги
    вроде ".... C# за 14 дней". Разработка бизнес-приложений на шарпах идет гораздо быстрее чем на С++
    например. И завалить систему в синий экран в этом языке гораздо труднее. В нем реализованы методы
    защиты памяти и нельзя грязно трюкачить с указателями как это любят в С или С++. Производительность
    шарпов в численных методах будет слабее чем в С++ но обычно бизнес не ставит таких задач и чаще
    надо будет писать веб-хендлеры или хендлеры MQ-систем. Кач уровней синьорити идет быстрее в шарпах.
    Ответ написан
    2 комментария
  • В чем проблема в коде работы с графом?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Зачем делать безсмысленный makeStep? Пускай он возвращает булево значение.

    boolean makeStep(Graph &graph, ValuesTable &table) { .... }


    Не было отрицательных свойств среди вершин - значит пускай вернет true.
    Тогда будет стоп алгоритма. И не надо будет
    делать дополнительных пере-расчетов.
    Ответ написан
    7 комментариев
  • Как найти точки пересечения двух многоугольников?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я обычно договаривался сам с собой что прямоугольник будет включать в себя левую и верхнюю сторону
    а правая и нижняя при этом будут считаться не входящей в его площать. На языке математики это как-то так:

    ( x1 >= x > x2, y1 >= y > y2 )

    Это дает возможновть в любых координатах в int, double e.t.c. считать плотно рядышком стоящие
    прямоугольники не пересекающимися вообще.
    Ответ написан
    Комментировать
  • Как написать данный код на с++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если этот код компилируется С++ компиллятором - то тогда нет причин для беспокойства.
    А если твой препод такой нудный - то спроси до какой степени он хочет переписывать?
    Самое простое что приходит на ум - заменть ASCIIZ строки на std::string. Попробуй везде
    сделай такое. Вот это

    void output_res(char* mas_str, int* arr, char character, int occurrences)


    заменить на

    void output_res(string mas_str, int* arr, char character, int occurrences)


    Потом strtok, strlen, printf заменить на методы string или cout.operator<< соотвественно.

    Это будет просто первая итерация рефакторинга, которая двигает этот ужас по направлению
    к красоте и феньшую. Если твой душный ментор все еще будет недоволен - то приходи назад
    будем внедрять лямбды и прочее аж до 20х плюсов.
    Ответ написан
    Комментировать
  • Через какой алгоритм решать эту задачу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Стоя на 12 этаже можно за 1 ход попасть на 23 этах (Вверх) или на 6 этаж (Вниз).
    Стоя на 6 этаже можно за 1 ход попасть на 11 этаж (ВВ) или на 3 этах.
    (и так далее)

    Вот такой граф получается. Немного напоминает Гипотезу Коллатца. За счет минус единички
    адрес меняется четность и есть надежда что мы не зациклимся а все таки куда-то двигаемся.
    Значит можно упорным баловством с кнопками куда-то приехать.

    Вобщем нужен орграф с 70 вершинами и опционально с 2 ребрами для каждой вершины.
    Недостижимые вершины - это этажи куда нельзя будет попасть соотвественно.
    Ответ написан
    4 комментария
  • Как оформить сортировку по алфавиту?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужна функция предикат или перегруженный оператор сравнения. Вот посмотри как тут пишут
    https://stackoverflow.com/questions/2758080/how-to...
    Ответ написан
    3 комментария
  • Как хранится c++ struct в памяти и как определить размер вручную?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего такого алгоритма нет. Размер структуры будет зависеть
    от разрядности платформы и от типа компиллятора и возможно от всяких
    опций типа #pragrma pack. Тоесть получается нехилый квест.

    Технически, тебе достаточно sizeof для решения твоих прикладных задач.
    Ответ написан
    1 комментарий
  • Как реализовать побитовый сдвиг чисел, которые записаны как строки ( длинные числа хранятся в строках)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сдвиг на 2^64 это я так понимаю что сдвиг влево на 64 бита. Иначе смысла бы не было. Получили бы ноль.

    Сдвиг влево - это умножение на 2 в степени числа сдвигов. Тоесть

    2^32 * 2^64 = 2^96

    (при умножении степеней показатели складываются)
    Ответ написан
    5 комментариев
  • Как хранятся многомерные массивы в памяти?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Да. Ты правильно рассуждаешь. Многомерные зубчатые массивы имеют накладные расходы в виде служебных указателей которые должны предварять вход в каждое измерение. И не просто в измерение а там получается
    дерево массивов массивов массивов указателей на данные.

    Но для такого твоего кейса матрицу можно линеаризовать. И разложить последовательно.

    int arr[6] = { 1,2,3,1,2,3};

    Формула доступа будет простая. Надо будет к базовому указателю прибавить дистанцию от начала
    до нужного элемента помня о том что LINE_WIDTH у нас уже известен и это длина строки в элементах.

    *(basePointer + i * LINE_WIDTH + j)

    Таким-же образом можно вывести формулу для 3х, 4х и более измерений. И массив можно отобразить
    на гиперкуб.
    Ответ написан
    Комментировать
  • В чем преимущества использования С++ в embedded?

    mayton2019
    @mayton2019
    Bigdata Engineer
    ООП и метапрограммирование.
    Ответ написан
    Комментировать
  • Как переделать код под ООП?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Программирование в ООП предполагает что мир состоит из "объектов".
    Например твоя программ (процесс) калькулятор это уже объект. Даже не имея декларации
    она уже является объектом с точки зрения ОС.

    Но если твой преподаватель - такой душный, то сделай

    class Calculator {
       ...
    }

    Можно сделать объектом число и операцию над ним (унарная или бинарная) но это уже немотивированное
    (или слабо мотивированное) действие. Теоретики ООП всегда пишут что введение объекта должно иметь смысл. Иначе так можно
    дойти до абсурда и объявлять объектом любую чепуху, что только усложнит написание кода
    и создаст бюрократию на пустом месте.

    Поясни это преподавателю если он будет сильно настаивать на том что мало объектов.
    Ответ написан
    Комментировать
  • Как правильно подключить #include?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если буквально переводить ошибку
    In included file: unknown type name 'c_image'clang(unknown_typename)
    window.hpp(24, 25): Error occurred here

    То будет - во включаемом файле неизвестное имя типа c_image
    и ошибка находится здесь window.hpp(24, 25)
    Ответ написан
    Комментировать
  • Откуда взялся const?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Попробуй так.

    void printMessage(const char str[]);

    Чем новее становится версия стандарта С++ - тем строже проверки.
    Ответ написан
    Комментировать
  • Тонкости Компиляторов. Почему в классах с++ не требуется объявление функции до вызова?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Конвейер компилляции С++ точно не прост. На хай-левеле это 3 шага. Препроцессор, компилляция и линкер.
    А сама компилляция в свою очередь тоже сложна. Там полюбому будет работа с шаблонным процессором
    и еще будет обязательно проход оптимизации. Это когда из кода можно выкинуть недостижимые ветки или
    размотать циклы. И это тоже шаг.
    Ответ написан
    Комментировать
  • Нейросеть без библиотек. Как можно реализовать?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если сфокусироваться на решении задач про созданию простой двухслойной нейросети то тебе
    нужна матрица и вектор и операции над ними. И активационная функция. И функция обучения.

    Вот это все
    neuron
    layer
    network

    я-бы на твоем месте не делал. Это уже архитектура и интеграция. Если развивать проект дальше.

    И ты должен сам себе ответить на вопрос - что ты хочешь изучать. ООП или нейросети.
    Нейросети это тяжелая тема. Там много экспериметов. Много разочарований. Много работ
    дата-инжениринга по сбору и фильтрации входных данных. И этого всего настолько много
    что для ООП там уже сил не остается. Тоесть твоя декомпозиция задачи на 3 класса на старте
    тебе ничего пока не дает. Но обязывает тебя очень многому.

    Я-бы предложил делать прототип в олипиадном стиле.

    По поводу примерв. На гитхабе я находил много туториалов и пробных нейросетей на сях
    созданных в рамках обучения
    . Я искать их не будут. Я думаю ты сам найдешь.
    Ответ написан
    2 комментария
  • Почему в С++ не работают 2 цикла for?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ты наверное новичек?

    Переменную не рекомендуется дважды использовать в разных ролях в одном блоке кода.
    Ты-же не в ассемблере пишешь? Верно? Зачем тебе эта экономия. Создание новой переменной -
    безопаснее и надежнее. Хороший компиллятор уже сам разебертся где оптимизировать а ты
    - просто напиши чортов правильный код.

    И не забывай инициализировать. И не забывай про scopes.

    for(int i = 0; i < n; i++) {...}

    Иногда профессионалы могут использовать переменную дважды для достижения какой-то другой
    цели. Тут надо смотреть use-case.

    Но Quod licet Iovi, non licet bovi. Тебе пока не позволено. Научись сначала просто
    писать код без ошибок а потом уже делай трюки.
    Ответ написан
    2 комментария