Задать вопрос
Ответы пользователя по тегу C++
  • Что значит эта ошибка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Судя по всему, когда вы проект создавали, вы его не сделали консольным. Пересоздайте проект (кода у вас немного, его можно скопировать). Внимательно выбирайте new console application.
    Ответ написан
    4 комментария
  • Как решить задачу по C++ на алгоритмы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Видимо, надо вывести все пары n и k, таких что k^2+n^2=n!/(k!(n-k)!), a <= k <= n <= b.
    Ответ написан
    Комментировать
  • В чём ошибка кода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (!((ceil(y)) % 2 && ...

    Поставьте скобки вокруг ... % 2

    Приоритет операций такой, что сначала вычислится 2 && ... и потом вы на этот bool попытаетесь поделить с остатком.

    И вообще, ваш код невозможно читать. Слишком много скобок. Во-первых, введите 4 переменные и посчитайте в них floor/ceil от x/y. Удалите очевидно лишние скобки.

    Потом вместо !(a%2) лучше писать (a % 2 == 0), а то с вашим количеством скобок вообще непонятно, к чему ! относится.
    Ответ написан
    5 комментариев
  • Как найти принадлежность точки к закрашенной области на плоскости?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Отдельно проверьте, что точка в первой четверти.

    Далее, фигура повторяется блоками 2x2, т.е. вам не важны сами координаты, а только их положение в блоке.

    Для высчитывания координаты в блоке можно или вычитать 2, пока координата больше 2, или вычесть из x (floor(x) - floor(x)%2). floor(x) даст целые числа. Потом надо это число сделать четным, возможно вычесть 1. floor(x)%2 - как раз и даст нам, что надо вычесть.

    А дальше - набор if-ов. вам надо лишь описать, что точка принадлежит одной из двух четвретринок круга в левом нижнем углу.
    Ответ написан
    Комментировать
  • Как найти принадлежность точки к такому графику?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Разбейте область на простые фигуры (квадраты, окружности, полуплоскости) и опишите логически. Вроде точка в области, если она в фигуре А, но не фигуре Б; или в фигурах В и Г, или в фигурах Д и Е.

    Далее перевести это в код - это один if с кучей условий объедененных логическими или (||) или логическими И (&&).
    Ответ написан
    Комментировать
  • Ошибка сегментирования (стек памяти сброшен на диск) c++. Как исправить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ваша программа бесконечно уходит в рекурсию, у нее кончаетсся память и она падает. func(1, v) в цикле при i=0 вызовет func(1,v1), которая опять же вызовет func(1,v1), которая опять же... И так пока программе не поплохеет.
    Ответ написан
    Комментировать
  • Как решить эту задачу на C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Немного порешав разные суммы руками можно понять, что тут работает жадное решение - можно брать самую большую купюру, помещающуюся в оставшуюся сумму.

    Это также можно доказать. Брать более одной 100 нет смысла, их можно было бы заменть на 200. Также более двух 200 брать смысла нет - три можно разменять на 500+100, что меньше купюр. Аналогично для всех оставшихся купюр.

    Ну вот вам осталось для каждой купюры проверить, что оставшаяся сумма не меньше купюры, потом выдать сколько влезает купюр и заменить сумму на остаток от деления.
    Ответ написан
    2 комментария
  • Как отправить файл на почту?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    желательно используя средства только голого c++, без библиотек?


    Если вы в линуксе, то введите в терминале "man sendmail". Разберитесь с командой и вызывайте ее из C++ программы через system.

    Иначе - разбирайтесь с сокетами, протокалами SMTP, TCP. Простенький клиент строчек на 3000 сможете написать через пару месяцев, наверное. Ну, или, все-таки, пересмотрите ваши условия и используйте библиотеки или более удобный для этого язык. Так в питоне это делается буквально в 2 строчки.
    Ответ написан
    Комментировать
  • Где ошибка в решении?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас number в int не помещается. А вы цикл гоните от 2 до number. У вас условие i < number в цикле будет всегда выполнятся - потому что ну не может int i быть больше number.

    edit: И вообще логика проверки на простоту у вас сломана. del = i выполнится для любого j, такого что i на него не делится. Т.е. если i=6, то при j=5 вы dеl перезапишите. Вам надо в цикле устанавливать bool flag. И, после цикла на него смотреть.
    Ответ написан
    9 комментариев
  • Почему максимальный размер объекта std::string равен 4611686018427387897?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну вот просто создатели библиотеки захардкодили именно это число.
    Эта конструкция возвращает разные значения, в зависимости от компилятора, разрядности, опреационной системы.

    Это 2^62-7. Почему 2^62? Может, в силу каких-то причин в вашей системе нельзя адресовать больше 62 бит. Может, система 2 бита для чего-то использует. Почему -7? Надо еще где-то хранить длину, надо оставить место для нулевого символа в конце и надо оставить нетронутым индекс std::string::npos - это значение используется для обозначения "несуществующего индекса". Конкретное значение зависит от того, что там программисты стандартной библиотеки сделали.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Запустите и посмотрите: https://www.onlinegdb.com/online_c++_compiler. Попробуйте поменять по одному символу и смотреть, что происходит с выводом. Так вы поймете, что именно выводится, а потом чуть чуть знания C и вы поймете, почему так происходит.
    Ответ написан
    4 комментария
  • Не работает алгоритм std find для строки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы вызываете std::find, который призван искать элемент в коллекции. А пытаетесь искать там строку. Это все почти компилируется, потому что строка - это коллекция символов, по ней можно было бы искать один символ. Но вы передаете туда указатель (ваша строковая константа). Компилятор не может преобразовать его в символ и на это ругается.

    Для того, что вам надо - есть std::string::find. Т.е. вам надо вызвать str.find(" ").

    Или же ищите один символ. Только не забудьте algorithm включить, а то непонятные ошибки с итераторами полезут.
    Ответ написан
    1 комментарий
  • Не понимаю, как правильно реализовать программу?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Во-первых, можно отлично читать из файла сразу число. Вы как с консоли числа вводите? Вот точно также, только из файла. Вы как строку-то читаете? Вот передавайте там не строку, а int условный. Ну, еще, если scanf-ом читаете, то надо туда %d вместо %s передавать. А так есть еще функции преобразования числа в строку. Читайте справки по atoi, sscanf, stringstream.
    Ответ написан
    3 комментария
  • Алгоритм для нахождения количества пересечений отрезков в последовательности(списке)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Заведите массив из нулей. Для каждого отрезка сделайте +1 в координату его левого конца и -1 в координату, следующую за правым концом.

    Потом пройдитесь по массиву слева-направо, поддерживая счетчик. Прибавляйте к счетчику значение массива и выводите значение счетчика.

    Это если вам надо весь массив, как в примере, выводить. Не знаю специфику вашей задачи, может эффективнее будет класть в массив пары {координата, +-1} и сортировать. Потом точно также обойти слева направо поддерживая счетчик.
    Ответ написан
    4 комментария
  • Инициализирование класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас в примере вообще классы без данных, поэтому разницы никакой нет между первым и вторым вариантом. Третий выделят память под объект не на стеке, а в куче - поэтому и выделение и работа с объектом, обычно, будет дольше.

    Если бы в объекте были данные, то первый вариант был бы быстрее всего, потому что он ничего бы не инициализировал, в отличии от остальных.

    Если бы в объекте был еще и конструктор, то первый и второй варинт были бы идентичными.

    Третий вариант всегда инициализирует объект и выделяет память, поэтому он будет медленнее.
    Ответ написан
    Комментировать
  • Как передать в функцию указатель если она принимает ссылку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Никак. Заставьте вашу функцию принимать указатель:

    template <typename type>
      static void readMemory(uintptr_t offset, unsigned int length, type* var) {
        ReadProcessMemory(targetHandle, (LPVOID)offset, var, length * sizeof(type), 0);
      }
    
    uint8_t arr[100500];
    readMemory<uint8_t>(0x00, 10, arr);
    Ответ написан
    2 комментария
  • Почему у временного объекта можно вызывать non-const метод?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    По поводу вызова неконстантных методов - а с чего вы взяли, что они не дожны быть возможны? Временные объекты не имеют const квалификаторов. Иначе нельзя было бы делать вещи типа SomethingBuilder().WithA().WithB().Finalize().

    //! f6() = X(1);

    Оператор присвоения требует Lvalue слева. Временный объект же - Rvalue. Eго можно ставить только справа от =. А не потому что у него const квалификатор.

    Это сделано скорее всего потому, что, ну, нет же смысла перезаписывать временный объект. Он временный, к нему потом никак не обратиться.

    //! f6().modify();

    Вот тут попытка вызова неконстантного метода у константного (и временного - но это не важно) объекта.

    //! f7(f5());

    Видимо, это чтобы исключить некоторый класс ошибок. Если вы передаете в качестве неконстантной ссылки что либо, значит оно должно внутри менятся и снаружи эти изменения должны быть видны. Иначе можно было бы передавать по константной ссылке или по значению. Но вы передаете туда временный объект - его никак снаружи видно не будет. Он существует только в этой строчке. Поэтому в C++ нельзя инициализировать неконстантные lvalue ссылки через rvalue (временные объекты).
    Ответ написан
    1 комментарий
  • Как прочитать масив данных динамической длинны?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам придется переписать функцию readMemory, чтобы она принималаlength и читала length*sizeof(type). Или вызывайте прямо ReadProcessMemory в вашей функции.

    Текущая реализация для вашей цели не подходит вообще. Тип шаблона должен быть известен на этапе компиляции. А вы хотите как-то в нем передать динамическую длину.
    Ответ написан
    4 комментария
  • Как исправить ошибку сборки проекта, при подключении sdl?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы, похоже, создали обычный оконный проект, а надо было создавать консольное приложение. Легче всего будет пересоздать проект. Внимательно смотрите, что вы там выбираете.
    Ответ написан
  • Как сымитировать правильную скорость выполнения различных сортировок путём usleep?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы наткнулись на важное свойство ассимптотического анализа. O(n^2) -означает, что на достаточно больших n, время работы будет примерно n^2 с точностью до константы. Эта самая константа может быть хоть 0.5, хоть 10000000.

    Сравните 2 алгоритма:
    // n(n-1)/2 инкремента.
    for(i = 0; i < n; ++i){
      for (j = i+1; j < n; j++) {
        cnt1++;
      }
    }
    // n^2 инкремента.
    for(i = 0; i < n; ++i){
      for (j =0; j < n; j++) {
        cnt2++;
      }
    }


    Оба алгоритма имеют O(n^2) сложность, но один делает примерно в 2 раза меньше операций.

    Суть в том, что хоть алгоритмы и работают с одинаковой ассимптотикой, они могут работать разное время! Особые странности могут быть при маленьких n. O(n log n) алгоритм часто может быть медленнее O(n^2) алгоритма. Поэтому все настоящие реализации сортировок для маленьких массивов запускают более тупые квадратичные алгоритмы.

    Если же вы хотите показать только ассимптотику, то возьмите n побольше, и тогда эти 30% будут незаметны по сравнению с десятикратным замедлением O(n^2) относительно O(n log n). Или нормируйте ваши сортировки. Искуственно ускорьте одни алгоритмы и замедлите другие, чтобы получить именно тот результат, который вы хотите. Но это как-то нечестно что ли. Если же вы все-таки хотите именно этого, назначьте каждой сортировке время C\*n^2 или С\*n\*log n миллисекунд. Прогоните алгоритмы сортировки без визуализации, подсчитайте, сколько операций замедления вы бы сделали (тот же самый код, что у вас, только вместо usleep() делайте sleep_count++). В конце подсчитайте коэффициент замедления - сколько каждый usleep должен спать, чтобы суммарно sleep_count их спал заданное время. И запускайте каждую сортировку уже с подсчитанными параметрами для usleep.
    Ответ написан
    Комментировать