Ответы пользователя по тегу C++
  • Как получить название сети, к которой подключен компьютер?

    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 комментария
  • Почему из двух функций, стоящих в условии цикла, при определенных условиях выполняется только одна?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Фокус в оптимизации логических операций.
    Если первый операнд AND имеет значение false, то результат будет false независимо от значения второго операнда. Соответственно, вычислять второй операнд смысла нет.
    Аналогично, если первый операнд OR имеет значение true, то результат будет true независимо от значения второго операнда.
    Если вам нужно, чтобы выполнялись обе функции, то решением, как ни странно, будет явный вызов обоих функций в теле цикла с записью результатов выполнения в переменные.
    Ответ написан
    Комментировать
  • Вызвано исключение: нарушение доступа для записи. **_Str** было 0x1110112. Что не так?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не выделена память для строки.
    P.S. И sizeof - это не длина строки.
    Ответ написан
    Комментировать
  • Возможно ли перевести эти символы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас текст в кодировке win1251, который загружен как win1252 или UTF-8.
    Либо взять исходные файлы и прочитать их в нужной кодировке, либо написать конвертер.
    Ответ написан
  • Где в решении задачи ошибка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Попробуйте подать на вход набор (-1, 1).
    Ответ написан
    Комментировать