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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Когда вы выделяете массив на n элементов типа T вам надо n*sizeof(T) памяти.

    Когда вы выделяете строку на n символов вам надо n+1 байт памяти. Потому что каждый символ занимает 1 байт, и вам нужно место под n символов и под завершающий символ '\0'. В C/C++ строки всегда завершаются нулевым символом. Надо про него всегда помнить и выделять под него место.
    Ответ написан
  • При попытке перевернуть число выдает левые значения. Откуда?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Число y переполняется. Вы записываете двоичную запись десятичными цифрами. в uint16_t помещаются число до 65535. Соответственно, если вы постараетесь 100000 туда записать, оно переполнится. Т.е. ваша программа не работает при x>=32.

    Вместо запихивания довичной записи в десятичное число вы должны биты записывать в строку std::string. Потом ее перед выводом развернуть.
    Ответ написан
    Комментировать
  • Как добавить в один вектор элемент из другого вектора под определенным индексом?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что пытается сделать ваш код - совершенно непонятно. Подозреваю, что ассерт может происходить из-за кривых прочитанных из файла значений Index. с26451 - это предупреждение, а не ошибка, но по одному номеру сказать сложно. Приведите весь текст предупреждения. Попробуйте тип Index поменять на size_t, может уберет его.

    Ответ на вопрос в заголовке - vector::insert

    Если хотите добавить x после k элементов в вектор a, то сделайте
    a.insert(a.begin()+k, x);
    Ответ написан
    7 комментариев
  • Почему зависает при вызове connect WSA?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    А зачем вы делаете ptr = result->ai_next;?

    В документации есть пример, как обрабатывать результат:
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

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

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

    Тут есть 2 куска 1110. Но за первым идет "010", а за вторым "011". Начинать со второго - выгоднее.

    В этой задаче очень маленькие ограничения - можно полностью перебирать все возможные числа и брать максимальное. Можно даже не переводить в двоичную систему, а воспользоваться битовыми операциями.
    Когда вы узнали, сколько битов в числе, то самый младший бит x можно получить как x&1. Сдвинуть все биты числа на одну позицию вправо - это x >> 1. При этом младший бит пропадает. Чтобы вставить новый бит b слева нужно сделать x | (b << k) - тут k - номер позиции этого бита, считая с 0.

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

    И так, для развития: Если бы ограничения были слишком большие (число в десятки тысяч бит), то тут пришлось бы применять умные строковые алгоритмы. Это была бы задача на поиск лексикографически максимального циклического сдвига. Решается с помощью суффиксного дерева, суффиксного массива или суффиксного автомата.
    Ответ написан
    2 комментария
  • Что делает в данной ситуации yield()?

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

    Yield говорит планировщику, что сейчас хорошо бы текущий поток вытеснить.

    Зачем он тут нужен? В сильно конкурентной среде это позволит другим потокам что-то доделать и сократить накладные расходы на попытки захватить мьютекс. Но вообще говоря тут он не нужен. И вообще надеяться на yield - плохая идея. Планировщик может его и вообще проигнорировать.
    Ответ написан
    Комментировать
  • Почему не работает перегрузка класса?

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

    Если же у вас указатель, к которому вы применяете операцию ++, то вызывается не перегруженный оператор, а используется арифметика указателей - просто сдвигается адрес в памяти на следующий.

    Попробуйте (*p)++.
    Ответ написан
    2 комментария
  • Как убрать нілики из ответа даного кода, ответ правильний только нулі виводить перед ответом?

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

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

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

    Надо циклом найти в массиве самую последнюю не нулевую цифру и выводить с нее.

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

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

    Уберите ненужные переменные. Еще, зачем у вас там i % columns?

    Похоже, надо в output.txt выводить, а не в stdout.

    Еще, советую выводить перевод строки всегда, и не пропускать его на последней строке вывода.

    Чтобы не было проблем с пробельными символами - читайте в двух вложенных циклах до rows и columns по одному char (а не string до eof). Это и ввод упростит и сделает его более безопасным ко всяким артефактам в тестах.
    Ответ написан
  • Почему функция не возвращает указатель на объект класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (!a)	{
        a->s = s;
        cout << 5;
        return a; //ошибка, не возвращает указатель на обьект класса
    }


    У вас тут a==NULL - пустой указатель. Вы пытаетесь его члену что-то присвоить (то. что программа не упала - вам дико повезло). потом вы возвращаете этот же пустой указатель.

    Вам надо создавать новый объект через new в этом случае.
    Ответ написан
    3 комментария
  • Как решить данную задачку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если он указывает на "E" и встретил 0, куда он будет указывать после поворота? На "N".
    Аналогично, в обратную сторону, при указывании на " N" после 1, он будет указывать на "E".

    Чему это соответствует в вашем массиве a? Что происходит с индексом?
    Ответ написан
    Комментировать
  • Как найти внутри текстового файла слово?

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

    Быстрые алгоритмы есть: Кнута-Морриса-Пратта, Бойера-Мура. Там есть примеры реализации алгоритма в википедии прямо кодом на Си. Эти алгоритмы сканируют строку текст посимвольно. Эту часть нужно тупо заменить вводом очередного символа из файла (не забудьте сделать буферизацию, если ваш ЯП этого не делает сам).

    Ну, или, если файл не большой, то можно тупо прочитать весь файл в строку и запустить какой-нибудь встроенный метод поиска подстроки в строке. Большинство ЯП уже реализуют какой-либо быстрый метод поиска.
    Ответ написан
    Комментировать
  • Где в решении задачи ошибка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Инициализируйте не нулями, а двумя первыми числами и min1|2 и max1|2. Не забудьте их в нужном порядке сделать (num1max>=num2max). И цикл с 2 гоните, а не от нуля при этом.

    Например на тесте {1, 0} у вас программа может вывести 2 нуля.

    Потому что num1min и num2min останутся нулями а оба произведения по нулям.
    Ответ написан
  • Как вращать кривую Безье в функций на WinAPI?

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

    Чтобы окно перерисовывалось периодически само надо делать как тут: запустить таймер на несколько миллисекунд и по его срабатыванию перерисовывать окно. Можно или как в этом примере стирать и рисовать заново, а можно вызывать WM_PAINT через какой-нибудь RedrawWindow:
    RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
    Ответ написан
  • Как Исправить код?

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

    Можно делать так вместо ZeroMemory:
    STARTUPINFO info={sizeof(info)};
    Ответ написан
  • Как удалить запись из структуры?

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

    Для удаления надо пройтись по всему списку - это уже делается в функции main при выводе библиотеки (кстати, там не нужен pLibrary. Можно совместить цикл while и цикл for после него. Вы проходитесь циклом по элементам списка, кладете их в массив и потом проходитесь по массиву. Достаточно просто делать с ними, что вам надо прямо в первом цикле).

    Потом, вместо вывода сравнивайте название текущей книги с введенным с клавиатуры (функция strcmp). Если совпало, то надо предыдущему элементу в next присвоить next текущей записи и потом вызвать free() от текущей записи и вывалиться из цикла через break.

    Да, единственная сложность - надо поддерживать указатель на предыдущую запись, а лучше даже на next у предыдущей записи (это будет LIBRARY**). Тогда для удаления надо просто head->next записать туда и текущий элемент выпадет из списка. Перед переходом к следующему элементу в цикле while просто перезапишите этот указатель на &head->next. Изначально он должен быть &head. Таким образом можно удалить даже первый элемент списка без разбора случаев.
    Ответ написан
  • Как вычислить количество слов, которые начинаются с большой буквы, подобное этому коду?

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

    Вам могут понадобится функции isalpha() isspace() isupper() из файла ctype.h
    Ответ написан
    Комментировать
  • Как изменить код, чтобы заполнялась нижняя заштрихованная треугольная часть квадратной матрицы вместо верхней на С++?

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

    Соответственно, штриховка это когда j лежит между n-1-i и i включительно. Надо оба знака развернуть. Только сначала замените < N... на <= N-1...
    Ответ написан
    Комментировать
  • Как сделать реверс масива на С++?

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

    void Reverse (int *a, int x, int y) { 
      int i = y+1;
      int j = x-1;
      while (i < j) {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
        i++;
        j--;
      }
    }


    Или, если хочется, можно покороче:
    for (int i=x+1, j = y-1; i < j; i++, j--) {
      std::swap(a[i], a[j]);
    }


    Или совсем просто, если это не задание а для дела нужно:
    std::reverse( &a[x+1], &a[y]);

    Только надо обязательно проверить, что x < y - что есть что разворачивать.
    Ответ написан
    1 комментарий