Задать вопрос
  • Как сделать чтоб игра продолжалась до тех пор пока все слова не будут угаданы и предлагаемые слова не повторялись?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Сначала перемешайте слова. Возьмите массив длины NUM_WORDS чисел и заполните его изначально индексами от 0 до NUM_WORDS-1. Перемешайте. Потом сделайте цикл по словам, который будет загадывать слово с индексом вот из этого массива. Внутри while(true) будет спрашивать пользователя, пока он не угадает. Т.е. вот этот ваш код весь выносится в отдельную функцию и вместо случайной генерации choice, получает его в качестве параметра. Можно через возвращаемое значение сообщать о том, что пользователь попросил выйти.

    И еще, чтобы перемешать случайно слово/массив индексов надо делать вот так (а не так, как у вас):
    for(int i = 0; i < length; ++i) //меняет буквы местами
        {
            int prev = (rand() % (i+1));
            char temp = jumble[prev];
            jumble[prev] = jumble[i];
            jumble[i] = temp;
        }


    Надо не менять местами два случайных символа, а менять i-ый со случайным предыдущим. А то у вас не все перестановки генерируются одинаково равновероятно.
    Ответ написан
    1 комментарий
  • Чем обусловлены различия в работе со строками и другими массивами?

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если ваш двумерный массив сделан как указатель-на-массив-указателей-на-строки - то да. Если же вы завели массив вроде int a[100][200]; - то нет.
    Ответ написан
    Комментировать
  • Какой можно применить алгоритм для хранение индекса для 50 миллиардов записей в golang?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    vgray, Удаляются ли записи?

    Так-то, поиск на полное совпадение по строке не самое сложное. Какое-нибудь B-Tree или Trie - отлично подойдут тут. Проблема только в том, что оно в память не влезает, поэтому придется повозиться с хранением этого всего кусками в файлах. B-Tree как раз для этого и сделано, но оно будет медленнее работать со строками. Аккуратно порезанный на куски Trie будет быстрее.
    Ответ написан
    Комментировать
  • Как реализовать опциональные колбэки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Тут похоже ошибка в архитектуре. Логичнее было бы сделать чтобы Lane::Place(Unit *) вызывало какие-то методы у Unit, если это надо для конкретной реализации Lane (Эта логика будет в виртуальном методе, переопределенном в конкретных реализациях интерфейса).

    Или Unit::OnPlaced(Lane*) всегда вызвает какие-то методы у Lane и вот они могут сказать, что Unit-у не надо ничего делать.

    Ну, или раз вам вот так хочется сделать, то пишите шаблонный метод Unit::OnPlaced(T*), И ручками прописывайне инстанциировки с кокретными SkyLane, GroundLane и т.д. Ну и "дефолтную" реализацию пропишите пустую - вообще ничего не делающую для типа T*
    Ответ написан
    Комментировать
  • Возможно ли изменять windows 10 с помощью c++?

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

    C++, наверно, не самый удобный для этого язык, хотя бы из-за его скудности работы со строчками и возможностей выстрелить себе в ногу.

    Вам тут в первую очередь надо изучать не C++, а настройки windows и документацию о нем же.
    Ответ написан
    Комментировать
  • Чем отличаются структуры данных от колекции?

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

    Но не любая структура данных - коллекция. Например, граф, хранимый в виде списков смежности - не является коллецией. Еще примеры: cуффиксное дерево, дерево отрезков - тоже не являются коллекциями.
    Ответ написан
  • C++ Как посчитать сколько из данных чисел кратны числу n и заканчиваются на 1?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Число кратно n, если остаток от деления на n равен 0. Получить остаток можно, воспользовавшись оператором деления по модулю: x%n. Сравнение с 0 делается оператором сравнения ==.

    Число заканчивается на 1, если последняя цифра равна 1. Цифру можно получить, взяв остаток от деления на 10 (см. оператор % выше). Надо этот результат сравнить с 1.

    Чтобы выполнялись оба условия, надо объединить их оператором логического И (&&).

    Чтобы подсчитать числа, в которых выполняются условия выше - надо пройтись по ним циклом (или 5 раз написать похожий код). Там надо через if проверить условие и, если оно выполняется, увеличить счетчик (можно вот так: ++cnt;

    В код переводите сами, это же ваше задание по изучению C++.
    Ответ написан
    Комментировать
  • Как найти площадь квадрата, имея 2 отрезка?

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

    Не совсем пока еще понятно, квадрат может быть ориентирован как угодно, или тоже должен быть параллелен осям координат? Судя по тупости формулеровок я думаю, что составители задачи имели в виду более простой вариант, и стороны квадрата тоже должны быть параллельны.

    В этом случае можно сначала построить обрамляющий прямоугольник вокруг обоих прямоугольников (взять максимум и минимум по каждой оси из всех углов). А потом взять его большую сторону в качестве стороны квадрата-ответа (возвести в квадрат и вывести).

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

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

    Похоже там тупо где-то стоит округление вниз, ведь разница после преобразований по всем каналам - ровно 1. Может, это значение RGB в HSL на самом деле что-то вроде (15.01, 30.5, 49.9). Но в пиксели HSL в итоге запишутся целые числа (0-255). Из-за этого округления при обратном преобразовании получается не 0x91 а 0x90.6, что, опять же, округляется вниз.

    Если так важна полная обратимость преобразований, попробуйте использовать 10-битные или 16-битные форматы пикселей (расширяя исходный 8-битный RGB нулями справа). Тогда эти округления не испортят важные вам 8 старших бит.
    Ответ написан
    1 комментарий
  • Как получить точку касания вектора, зная его начало и модуль?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Одно квадратное уравнение. Пусть точка конца имеет координаты t*v3. Уранение: |t*v3-v1|^2=100^2 (расстояние от начала до конца - 100). Распишите длину как сумму квадратов разностей по всем координатам. Там квадратное уравнение на t, ведь координаты v1 и v3 даны. Найдите положительный корень.
    Ответ написан
  • Почему последний множитель в формуле числа размещений = (n-k+1)?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Потому что оно есть n! / (n-k)! Вот n-k и в числителе и в знаменателе сокращается. А вот n-k+1 в числителе остается, потому что сокращатся ему не с чем.
    Ответ написан
    Комментировать
  • Как найти похожие отрезки в 2 множествах данных, или корреляцию с смещением?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Формализуйте метрику корелляции. Там если расписать - то в итоге все придет к свертке (если одну последовательность развернуть сначала). Ее можно за n log n подсчитать быстрым преобразованием фурье.
    Ответ написан
    Комментировать
  • Как в играх находят нужные участки памяти?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Тут уже надо дизассемблировать игру и там находить уже код, отвечающий за торможение, и там же в ассемблерном коде надо посмотреть, а по какому адресу он пишет/читает.
    Ответ написан
    Комментировать
  • Kак показать на экране все числа до заданного числа, которые будут кратны второму заданному числу через цикл (while)?

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

    Это реально 3 строки кода, если вам непонятно, снова почитайте учебник про циклы.
    Ответ написан
    Комментировать
  • Почему delete вызывает ошибку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Первая ошибка:
    char *marka_ = new char;

    Тут вы выделяете память под ровно один символ. Строку туда читать не получится никак (не забывайте, что вам еще байт для нулевого символа в конце строки нужен).

    Вторая ошибка:
    char* m = "Renault"

    Тут используется значение аргумента по умолчанию, где у вас строковая константа. Тут не происходит копирование строки, просто в переменную m сохраняется адрес вот этой вот константы, которую компилятор куда-то в памяти проложения засунет. Вы не выделяли эту память, поэтому попытка сделать delete на ней - неопределенное поведение, что в данном удачном случае приводет к крэшу.

    У вас вообще проблема тут - marka может указывать на выделенную вами в Input() память, а может указывать на переданную из вне память. Кто ее удалять должен-то? Так же в Input() вы можете переписать переданный в конструкторе указатель. А надо ли было его удалять классу?

    Я бы сделал в конструкторе всегда копирование переданной строки. Тогда можно будет передавать туда и строковые константы и использовать вот такое вот значение по умолчанию.
    Ответ написан
    Комментировать
  • Как правильно оформить присваивание значения возвращаемого из функции C++?

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

    Возвращаемое функцией значение является временным значением. В него нельзя писать, но его можно читать. Оно const. И его нельзя передавать в описанный вами оператор копирования.
    Ответ написан
  • C - как сделать замену подстроки в строке (руками)?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    А что делает startsof()?

    Даже если принять, что оно действительно ищет вхождение второй строки в первой - у вас там в каждой второй строчке ошибка.

    malloc(string_size + sub_size - to_size);

    Объясните мне, как вы получили вот это значение длины?

    А дальше копирование у вас неправильно. Чтобы заменить строку-вхождение вам надо в ответ скопировать начало str1 до вхождения, потом скопировать to, потом скопироваать конец строки str1, после вхождения. Это должны быть три параллельных цикла. У вас в одной ветке их 2 (один в функцию бесполезную спрятан), в другой - только 1.
    Ответ написан
    Комментировать
  • На сколько корректна такая реализация?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Во-первых, стоит эти два класса разнести по разным файлам (декларация в .h файле, реализация в .cpp).

    А дальше надо поменять иерархию ваших классов.
    С такими циклическими зависимостями, конечно, можно что-то даже скомпилировать (в каждом cpp включать другой хедер, в интерфейсе второй класс передавать только как указатель. Или у вас в одном файле сначала сделать оба прототипа, forward declaration второго класса перед ними, потом реализации). Но это будет запутанно и сложно.

    Подумайте, а так ли вам надо в snakeUpdate передавать GameField? Можно, например, из Snake возвращать ее координаты или что там влияет на Update и потом их передавать какому-то методу в GameField. Сейчас ваш snakeUpdate вообще ничего из Snake не задействует - его можно наружу вывести, но это, наверно, еще в разработке. Не надо без крайней необходимости создавать усложненную структуру зависимостей классов. Решите, какой класс будет более важным, и пусть не ему передается второй класс, а второй класс наоборот дергает какие-то его методы.
    Ответ написан
    1 комментарий
  • Формула вращающегося прямоугольника как?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Ну это же школьная геометрия. (L-W)/sqrt(2), если длинная сторона L, а короткая W.

    Там равносторонний прямоугольный треугольник с длиной (L-W)/2 (вычли пересечение из длины, осталось 2 одинаковых куска, поделили пополам - нашли искомый кусок. А дальше - теорема Пифагора.
    Ответ написан