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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Если нет пауз между буквами, то задача однозначно не решается:
    Например, "vz" и "3d" одинаково кодируются "...---.." ("...-- -.." и "...- --..").
    В худшем случае, неправильная интерпретация первых символов может сделать расшифровку в самом конце невозможной.

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

    Тогда надо разбить строку на отдельные "слова" - группы тире и точек, разделенные пробелами и каждую группу перевести в букву по таблице. Таблицу в идеале надо хранить в trie ("бор" по русски), но эта структура не реализована в стандартной библиотеке C++, поэтому можно воспользоваться просто std::map<std::string, char>

    Edit: Разумеется, таблица для обратного перевода должна быть отдельной переменной. Не получится смешать в одну кучу переводы и туда и обратно.
    Ответ написан
    Комментировать
  • Как скопировать строку в строку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что такое Im? Судя по "->" - это указатель. Вы кладете в вектор указатель. И у вас получается вектор из кучи указателей, которые все указывают на одну и ту же область памяти. И вот в эту область памяти вы в цикле постоянно записываете path. В итоге там останется только последняя запись.

    Вам надо в векторе хранить не указатели на ваш класс/структуру, а сами объекты.
    Ответ написан
    1 комментарий
  • Как правильно сортировать файл?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Все правильно. Работа с файлом - на несколько порядков медленнее работы с памятью. Особенно медленен случайный доступ на hdd. Поэтому читать и писать по одному числу по разным адресам, как в сортировке, совсем медленно.

    На практике, когда стоит задача сортировать файл, файл большой и в память целиком не помещается. Поэтому его читают кусками и как-то хитрят. Но чтение всегда делают большими кусками.
    Ответ написан
    2 комментария
  • В чем причина проблемы? По какой то причине возникает ошибка о создании экземляра класса?

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

    Что такое "абстрактный класс" знаете?

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

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

    Ошибка C2989 "класс шаблон уже объявлен как не класс шаблон" означает, внезапно, что класс-шаблон уже объявлен где-то как не шаблон. Имя класса в ошибке тоже присутствует: "Машинный::Интерфейсы::ИСистемаОбменаСообщениями"

    Итак, вы заводите шаблон ИСистемаОбменаСообщениями. Но где-то еще в этом же модуле трансляции (смотрите всякие включенные хедеры тоже) уже есть ИСистемаОбменаСообщениями - только объявленная как класс.

    Ищите по исходникам все места, где ИСистемаОбменаСообщениями встречается и смотрите. Может у вас где-то forward declaration есть неправильное (вроде class ИСистемаОбменаСообщениями; вместо template <...> class ИСистемаОбменаСообщениями;). Или класс с таким же названием.

    Еще очень помогает читать, что компилятор вам пишет, а не пытаться угадывать, что же не так с классом, на который он ругается. Можно гуглить код ошибки - тогда можно найти кучу примеров и объяснений.
    Ответ написан
    Комментировать
  • Падает тест сложения двух чисел в столбик? Почему?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Или дебаггером пройдитесь, или добавьте вывод в тест. Ошибка может быть как в сложении, так и в сравнении в вашем SimpleVector.
    Ответ написан
  • Как в c++ сделать проверку на число и чтоб например если несколько точек в числе или минус в середине была ошибка и возвращало обратно к вводу?

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

    Так "123-32" распарсит 123 и вернет как число, но idx укажет на -, а не на конец строки.
    Ответ написан
    Комментировать
  • Как исправить ошибку error: invalid type argument of unary ‘*’?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если вы разыменовываете указатель, то там должна быть точка вместо стрелочки (и скобки вокруг *s). Если вы хотите использовать ->, то вам не надо разыменовывать указатель.
    Ответ написан
    Комментировать
  • Как избавиться от лишнего куска фона текста, который торчит непонятно зачем, хотя я ничего лишнего не рисовал?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Выведите куда-нибудь в файл аргументы у функции outtextxy перед каждыймы вызовом.

    Я подозреваю, что черный фон - это следы кучи отрисовок текста с постеппенным сдвигов вправо.

    Но тут, я думаю, вы баг не исправите без рефакторинга кода. Его надо разбить на функции, исправиль логику, упрастить.
    Ответ написан
  • Почему здесь мемори лик, а здесь нет?

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

    Но у вас и в SimpleVector(const SimpleVector &other) ошибка - оно просто копирует указатель. После чего два экземпляра SimpleVector будут указывать на одни и те же данные. И оба попытаются удалить их в конце. Так что там у вас и доступ к удаленной памяти и двойное удалиение.
    Ответ написан
  • Как убрать залипание клавиш graphics.h?

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

    Вам надо избавиться от getch и вместо этого опрашивать систему, а не зажата ли какая-то клавиша.

    Способы сделать это платформозависимы. Например, в винде можно воспользоваться GetKeyState.
    Ответ написан
    1 комментарий
  • Как сделать словарь с кириллицей?

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

    Строка в C++ - это просто набор байт. Что они означают уже определяется кодировкой.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
  • При множественной декларации вызов через шаблон типа?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы бы хоть ошибку-то привели. У меня возникает:
    error: ISO C++ forbids declaration of 'call_func' with no type [-fpermissive]


    И чтобы ее иcправить, надо лишь дописать тип возвращаемого значения. Например:
    template<typename T>
    void call_func(T param) {sin(param);}
    Ответ написан
  • Как исправить ошибку компилятора?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Нет. Ошибка оператора. С++ компилирутется g++, а не gcc
    Ответ написан
    2 комментария
  • Равенство всех элементов в упорядоченном ассоциативном контейнере/динамическом массиве?

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

    Тут все опрерации будут выполнятся за константое время. Быстрее никак. И расход памяти минимальный - один счетчик. Но придется много операторов методов реализовывать, если вы хотите эту вашу коллекцию использовать как обычные stl коллекции (итератор свой, всякие begin/end/size/operator[] etc).
    Ответ написан
    5 комментариев
  • Вывод в файл c++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Используйте std::vector. Если будет ругаться на отсутствие каких-то конструкторов, держите в векторе не сами ofstream, а указатели на них. Потом руками через new создайте классы.
    Ответ написан
    3 комментария
  • Как нарисовать ломаную линию по кликам мыши C++ WinAPI?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас каждый раз выполняется MoveToEx() в начало координат. Надо вам куда-то сохранить координаты последней точки и делать MoveToEx туда, потом LineTo в новые координаты и запомнить их.
    Ответ написан
    4 комментария
  • Как работает этот рекурсивный алгоритм разложения на слагаемые?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Функция генерирует все разбиения числа n на слагаемые не больше maxx. Ддя этого ыункуия перебирает, а какое же максимальное число будет в разбиении (цикл по i), берет это число и рекурсивно разбивает оставшуюся часть. Обратите внимание, в качестве maxx в рекурсии передается i. Ведь именно это было максимальное число в перебираемом разбиении. Значит следующее не может его превышать.

    Вся эта сложность с максимальным числом сделана, что бы не перебирать перестановки слагаемых. Ведь 4=1+2+1 можно по идее получить тремя способами, меняя порядок. Генерируя слагаемые в не возрастающем прядке, мы избавляемся от таких дубликатов.
    Ответ написан
    Комментировать
  • Почему не получается вывести из файла данные с помощью переопределенного оператора вывода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Внимательно читайте свой код:
    std::ofstream out("/home/artem/Рабочий стол/EntryFile/NewFile");
    std::ifstream  in("/home/artem/Рабочий стол/EntryFilee/NewFile");


    Я пробелы расставил, чтобы строки выравнились. Найдите одно отличие.
    Ответ написан
    Комментировать