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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вот в этих двух подряд идущих строках вас ничего не смущает?
    y[j + 1] = y[j];
    y[j + 1] = temp;
    Ответ написан
    Комментировать
  • Почему msdn нам лгут?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Во втором случае структура относится к файлу btrfs_drv.h из ReactOS.
    Ответ написан
    Комментировать
  • Как реализовать алгоритм Прима для графа в виде списка смежных вершин?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Никакой принципиальной разницы не будет. Отличается только способ перебора рёбер в поисках минимального веса.
    Ответ написан
    Комментировать
  • Выводятся какие-то цифры и ошибка, что не так?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    При j == 7 куда обращается arr[j + 1] ?
    Ответ написан
    Комментировать
  • Как получить название сети, к которой подключен компьютер?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Комментировать
  • Насколько мой код читабелен?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    С ходу же:
    try
    {
        if (from > to)
            throw "Incorrect couple 'from - to' for generating random numbers";
    }
    catch (const char *message)
    {
        std::cerr << message << '\n';
        exit(1);
    }
    Зачем нужен такой изврат, если вы ловите исключение сразу же? Чем хуже
    if (from > to)
    {
        std::cerr << message << '\n';
        exit(1);
    }


    bool init(IntList1D &list, int number)
    {
        if (list == nullptr || *list == nullptr)
        {
            if (list == nullptr)
                list = new IntList1D_element *;
            *list = new IntList1D_element(number);
            return true;
        }
        return false;
    }
    Чем меньше глубина вложенности, тем лучше. Ранний выход из функции лучше, чем выход в самом конце. Сравните
    bool init(IntList1D &list, int number)
    {
        if (is_initialized(list))
        {
            return false;  
        }
        if (list == nullptr)
        {
            list = new IntList1D_element *;
        }
        *list = new IntList1D_element(number);
        return true;
    }


    bool is_inited(const IntList1D list)
    {
        if (list == nullptr || *list == nullptr)
            return false;
        else
            return true;
    }
    Здесь и название функции кривоватое и чересчур усложнена сама функция.
    bool is_initialized(const IntList1D list)
    {
        return (list != nullptr && *list != nullptr)
    }

    Не соблюдаете единый стайлгайд. В некоторых местах одиночные строки после if взяты в фигурные скобки, в некоторых нет. Выберите один какой-либо стиль и придерживайтесь его. (Hint: добавлять строки гораздо проще, если всегда используются фигурные скобки).
    Ответ написан
    7 комментариев
  • Что такое и зачем lpNumberOfBytesWritten в WINAPI функции WriteFile?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Дык английским же по белому написано - long pointer на переменную, в которой вернётся количество записанных байт.
    Ответ написан
    1 комментарий
  • Как исправить ошибку out of memory?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Так если знаете, то почему не проверяете, что ваши x_ и y_ лежат в пределах массива?
    Например, при вызове cast_ray(5, 5, 0, 10), последняя проверяемая точка будет иметь координаты x_ == 5 и y_ == 15.

    P.S. Хотя стоп, там вообще бред написан. При angle == 0 будет деление на ноль (причём, деление там вообще не нужно). Затем, в функцию передаётся угол в градусах (судя по диапазону 0:180, а функции sin и cos принимают радианы.
    Ответ написан
    1 комментарий
  • Как решить задачу на c++?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ошибка 1. Использование переменной ROWS без инициализации.
    while (ROWS < 2) {

    Ошибка 2. Обращение к массиву с индексом -1 при j == 0.
    if ((arr [i][j - 1] < arr [i][j]) || (arr [i][j - 1] > arr [i][j])){

    Ошибка 3. Вместо накопления результата, вы на каждом цикле переписываете значение k. В результате получаете только результат сравнения из последней итерации цикла.

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Надо решить как можно больше аналитически.
    a + a + a = ...a
    Это возможно только при a = 0 или a = 5.
    k + k + k = ...k при a = 0 или k + k + k + 1 = ...k при a = 5
    Эта система имеет решение только при a = 0 и k = 5.
    s - это перенос из младшего разряда. Значит s ∈ {1, 2}.
    e + 0 + e = ...0 или e + 0 + e + 1 = ...0 или e + 0 + e + 2 = ...0
    Такое возможно только при e ∈ {0, 4, 5, 9}. Но 0 и 5 уже заняты. Значит e ∈ {4, 9}.
    Получаем
    int a = 0;
    int k = 5;
    for (int s = 1; s <= 2; s++) {
      for (int e = 4; e <= 9; e += 5) {
        ...Тут все остальные буквы.

    Такой анализ даст сокращение полного перебора в 2500 раз.
    Затем, можно сказать, что d > b > r, соответственно записать циклы как
    ...
        for (int d = 3; d <= 9; d++) {
          for (int b = 2; b < d; b++) {
            for (int r = 1; r < b; r++) {
              ...

    Это сократит перебор ещё почти в 12 раз (с 1000 циклов до 84)
    Для p, с учётом, что из младшего разряда переносится 1, а в старший должна уйти 2, можно записать условие
    d + b + p + 1 >= 20 => p >= 19 - d - b
    Значит получим цикл
    ...
              for (int p = 19 - d - b; p <= 9; p++) {
                ...

    z можно вообще не оборачивать в цикл, а вычислять как z = (d + b + p + 1) % 10.
    Это уменьшит перебор ещё в 10 раз.
    Ну и, как правило, в таких задачах есть условие, что разным буквам соответствуют разные цифры. Стоит добавить проверку там, где это необходимо.
    Суммарно перебор сократится более, чем в 300000 раз.
    Решение на PHP

    <?php
    $a = 0;
    $k = 5;
    $count = 0;
    for ($s = 1; $s <= 2; $s++) {
      for ($e = 4; $e <= 9; $e += 5) {
        for ($d = 3; $d <= 9; $d++) {
          if ($d == 5 || $d == $e) {
            continue;
          }
          for ($b = 2; $b < $d; $b++) {
            if ($b == 5 || $b == $s || $b == $e) {
              continue;
            }
            for ($r = 1; $r < $b; $r++) {
              if ($r == 5 || $r == $s || $r == $e) {
                continue;
              }
              for ($p = 19 - $d - $b; $p <= 9; $p++) {
                if ($p == 5 || $p == $s || $p == $e || 
                    $p == $d || $p == $b || $p == $r) {
                  continue;
                }
                $z = ($d + $b + $p + 1) % 10;
                if ($z == 0 || $z == 5 || $z == $s || 
                    $z == $e || $z == $d || $z == $b || 
                    $z == $r || $z == $p) {
                  continue;
                }
                $count += 1;
                $dedka = $d * 10100 + $e * 1000 + 50;
                $babka = $b * 10100 + 50;
                $repka = $r * 10000 + $e * 1000 + $p * 100 + 50;
                $skazka = $s * 100000 + $z * 100 + 50050;
                if ($dedka + $babka + $repka == $skazka) {
                  print " {$dedka}\n+{$babka}\n+{$repka}\n======\n{$skazka}\n";
                }
              }
            }
          }
        }
      }
    }
    print "count = {$count}\n";
    /*
     94950
    +80850
    +74350
    ======
    250150
    count = 17
    */


    Фактически, проверка основного условия выполнилась только 17 раз вместо 1000000000 в вашем случае.

    P.S. Да, и s можно тоже не перебирать, а вычислять. Тогда будет ещё быстрее, основная проверка выполнится 11 раз.
    Ответ написан
    Комментировать
  • Что значит эта ошибка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Предварительным анализом можно сильно сократить количество вариантов.
    Довольно легко получаются ограничения:
    a = 0
    k = 5
    e ∈ {4, 9}
    s ∈ {1, 2}
    Это уже сокращает перебор в 2500 раз.
    Чуть посложнее, но тоже вполне выводимо:
    d + b + r ∈ {13, 14, 23, 24} => r ∈ {13 - d - b, 14 - d - b, 23 - d - b, 24 - d - b}, d + b ≥ 4
    d + b + p ≥ 19 => p ∈ [19 - d - b, 9], 10 ≤ d + b ≤ 18
    d > b > r => d ∈ [3, 9], b ∈ [max(2, 10 - d), min(d - 1, 18 - d)],
    r ∈ [max(1, 13 - d - b), min(24 - d - b, b - 1)]
    Получаем
    int a = 0;
    int k = 5;
    for (int e = 4; e <= 9; e += 5) {
        for (int s = 1; s <= 2; s += 1) {
            for (int d = 3; d <= 9; d += 1) {
                for (int b = max(2, 10 - d); b <= min(d - 1, 18 - d); b += 1) {
                    for (int r = max(1, 13 - d - b); r <= min(b - 1, 24 - d - b); r += 1) {
                        for (int p = 19 - d - b; p <= 9; p += 1) {
    Ответ написан
    Комментировать
  • Почему не получается получить тело post запроса целиком c++ asio?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Смотрим формат PNG, заголовок файла.
    137 80 78 71 13 10 26 10
    13 10 - это ничто иное, как \r\n.
    А ваш код читает запрос как раз до \n.
    По уму надо читать заголовки, пока не встретится пустая строка (\r\n\r\n), затем искать заголовок Content-Length и считывать указанное в нём количество байт.
    Потом, с учётом Content-Type, из считанных данных восстанавливать запрос.
    Ответ написан
  • Как узнать, что был достигнут конец файла при чтении шифрованного файла?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    getline встречает символ ЕОТ (0x04, End Of Text) и завершает чтение.
    С такими файлами надо работать в бинарном режиме. И не вставлять в них переносы строки, поскольку вы не отличите их от символов, которые в закодированном виде превратились в \r (0x0D) и \n (0x0A).
    Ответ написан
    2 комментария
  • Произведение элементов массива, расположенных после последнего нулевого элемента?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Цикл у вас не до элемента с нулевым значением, а до элемента с нулевым индексом.
    Ну и инициализировать надо единицей, а не нулём, как уже написал dollar.
    Ответ написан
    Комментировать
  • В чем отличие оператора -> от .(точки)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    ЕМНИП
    a->b(*a).b
    Ответ написан
    Комментировать
  • Можно ли менять логический оператор в зависимости от переменной?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    if (f_pos.x * x_direction > R) {
        rot_direction2 = false;
    }
    Ответ написан
    Комментировать
  • Как сделать проверку по второй букве?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. Какой идиот засунул имплементацию класса в файл декларации?
    2. Откройте для себя strncmp().
    Ответ написан
  • Прекращает ли свою работу функция(не void) после того как вернет значение?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    После выполнения последнего оператора, выполнения return или неперехваченного внутри throw прекращает, после yield приостанавливает.
    Ответ написан
    Комментировать
  • Как записать в файл строку и добавить к ней переменную типа интеджер?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Изменение массива в Arduino?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Размер уменьшить не получится, поскольку вы объявили массив статически.
    А данные переписать не проблема
    data[0] = 0xBB;
    data[1] = 0xE7;
    data[2] = 0xD7;
    data[3] = 0xDE;
    Ответ написан
    4 комментария