• Как получить значения из массива объектов по id?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сделать из teamNames объект, где ключами будут id, а значениями name. Доставать из этого массива имена при переборе epl, используя team_id в качестве ключа.

    Собираем новый массив:

    const teamNamesObj = Object.fromEntries(teamNames.map(n => [ n.id, n.name ]));
    const eplWithNames = epl.map(n => ({ ...n, team_name: teamNamesObj[n.team_id] }));

    Обновляем существующий:

    epl.forEach(function(n) {
      n.team_name = this[n.team_id];
    }, teamNames.reduce((acc, n) => (acc[n.id] = n.name, acc), {}));
    Ответ написан
    Комментировать
  • Как найти расстояние между двумя отрезками?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Задача разбивается на две более простые подзадачи.

    1) Проверить пересечение отрезков. Если пересекаются, то расстояние равно 0. Можно посчитать площади треугольников, образованных вершинами отрезков. Пересечение будет, если они имеют разный знак +-.

    2) если не пересекаются, то найти 4 расстояния, от каждого конца отрезка до другого отрезка. Это вреде обсуждалось тут ранее, поищи.
    Ответ написан
    Комментировать
  • Что передается с bind'ом?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Acceptor::handleAccept - это нестатический метод класса Acceptor.

    У настатических методов первым параметром должен быть передан указатель на экземпляр класса. Когда вы вызываете методы класса напрямую, компилятор делает такую подстановку неявно. Когда вы это делаете через bind - нужно своими руками передать такой указатель, в данном случае - this.
    Ответ написан
    Комментировать
  • Как принять пробел в строку из пользовательского ввода?

    nowm
    @nowm
    В C++ есть getLine, и он читает всю строку:

    #include <string>
    #include <iostream>
    
    int main()
    {
       std::string words;
       
       std::cout << "Введите слова: ";
       std::getline(std::cin, words);
       
       std::cout << "Слова: " << words << "\n";
    }
    Ответ написан
    2 комментария
  • Почему берутся проблемы с совместимостью массивов и контейнеров?

    @Mercury13
    Программист на «си с крестами» и не только
    Учите матчасть!
    Версия для буфера памяти предполагает, что данные хранятся в непрерывном буфере nm×double (то есть длина mn, элемент double).
    Но vector<vector> — он НЕ непрерывный буфер.
    Есть непрерывный буфер n×vector<double> — центральный вектор. И каждая из n строчек по отдельности — непрерывный буфер m×double. Относительно друг друга в памяти они могут располагаться как угодно.

    Как исправить? — проще всего
    double s = 0;
    for (i...) {
      s += Sum(m, &a[i][0]);
    }

    Можно через шаблоны работать, но это уже сложнее и я сам не смогу это с листа написать, что уж говорить про первокура.
    Ответ написан
    Комментировать
  • Почему strcat() останавливает работу программы?

    includedlibrary
    @includedlibrary
    Потому что в strcat нужно передать указатель на строку, вы передаёте переменную z с типом int. В результате z интерпретируется, как адрес, по которому лежит строка и происходит ошибка сегментирования.
    Ответ написан
    Комментировать
  • Почему дружественная функция, определённая внутри класса с первым параметром встроенного типа, недоступна вне определения класса?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Согласно стандарту, дружественная функция может быть определена по месту объявления только для нелокального класса и только если имя функции не является квалифицированным.
    Первое ограничение нас мало интересует, а второе - является довольно существенным.

    Первично объявленная дружественной функция, согласно стандарту, становится участником пространства имен того типа, для которого объявлена дружественной.
    Получаем такую ситуацию. У нас есть пространство имен, пусть даже глобальное, в котором определяется тип. Во время определения этого типа делается первичное объявление функции как дружественной этому типу. В результате этого функция, как бы, объявляется принадлежащей пространству имен в котором определяется тип, но не совсем.

    Функция f5 не просто первично объявлена, она и определена по месту объявления дружественности. Ее имя является однозначно неквалифицированным в следствии своего определения.

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

    Все потому что т.н. имена скрытых друзей могут быть найдены только средствами ADL.
    Если коротко, Argument-Dependent Lookup опирается на типы аргументов при вызове функции, пространства их имен и пространства имен, в которых эти типы объявлены.
    ADL не выполняет поиск в пространствах имен в отношении фундаментальных типов. Поэтому код f5(5); буквально обречен на ошибку трансляции.

    Первично объявленная дружественной функция будет исключительно ADL-доступной до момента своего объявления или определения в том же пространстве имен, в котором определен тип друга. В этом случае функция станет доступна для поиска квалифицированных или неквалифицированных имен.
    Для f5 доступен только способ с повторным объявлением, т.к. она уже определена.
    Да только в этом случае f5 окончательно потеряет всякий смысл быть дружественной для A и станет просто сильно спрятанной и сбивающей с толку глобальной функцией.
    Суть дружественности в раскрытии доступа, которым f5 относительно A не пользуется, т.к. среди ее параметров нет ни одного с типом A.

    В результате.
    Чтобы ADL нашел функцию f5, среди ее параметров обязан быть параметр и с типом A.
    Чтобы UNL или QNL смогли найти функцию f5, ее надо дополнительно объявить за пределами типа A в его пространстве имен.
    Ответ написан
    1 комментарий
  • Что такое указатели в С++?

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    3*64
    Начните с простого. Сколько будет однозначных чисел, состоящих из цифр 0, 1, 2, 3, 4, 5?
    А сколько из них чётных?
    А сколько будет двузначных чисел из тех же цифр, если первая всегда 2?
    А чётных?
    А трёхзначных?
    И т.д.
    Ответ написан
    2 комментария
  • Как теперь вернуться обратно? Как узнать уравнение параболы в старом базисе?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. Сместим систему координат вниз на 1.
    x' = x
    y' = y + 1
    Обратное преобразование:
    x = x'
    y = y' - 1
    Уравнение прямой: y = x − 1, y' − 1 = x' − 1, y' = x'
    Переход точек: (0, 0) → (0, 1), (0, 1) → (0, 2)

    2. Повернём систему координат по часовой стрелке на π/4.
    x'' = x'⋅cos(π/4) − y'⋅sin(π/4) = x'⋅√2/2 − y'⋅√2/2
    y'' = x'⋅sin(π/4) + y'⋅cos(π/4) = x'⋅√2/2 + y'⋅√2/2
    Обратное преобразование:
    x' = x''⋅cos(π/4) + y''⋅sin(π/4) = x''⋅√2/2 + y''⋅√2/2
    y' = −x''⋅sin(π/4) + y''⋅cos(π/4) = −x''⋅√2/2 + y''⋅√2/2
    Уравнение прямой: y' = x', x''⋅√2/2 + y''⋅√2/2 = −x''⋅√2/2 + y''⋅√2/2, x'' = 0
    Получили, что прямая стала осью ординат.
    Переход точек: (0, 1) → (−√2/2, √2/2), (0, 2) → (−√2, √2)

    Уравнение параболы, симметричной оси ординат: y'' = a⋅x''2 + b
    a/2 + b = √2/2
    2⋅a + b = √2
    Отсюда a = √2/3, b = √2/3
    y'' = √2/3⋅x''2 + √2/3
    x'⋅√2/2 + y'⋅√2/2 = √2/3⋅(x'⋅√2/2 − y'⋅√2/2)2 + √2/3
    x'2 + y'2 − 2⋅x'⋅y' − 3⋅x' − 3⋅y' + 2 = 0
    x2 + (y + 1)2 − 2⋅x⋅(y + 1) − 3⋅x − 3⋅(y + 1) + 2 = 0
    x2 + y2 − 2⋅x⋅y − 5⋅x − y = 0
    Ответ написан
    5 комментариев
  • Односвязные списки. Удаление элемента?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Если это не последний элемент, то присваиваем в него значение из следующего, потом удаляем следующий
    Ответ написан
    2 комментария
  • Как связать javascript, работающий в браузере, с программой, работающей в windows?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Поднять http/websocket сервер в программе и общайтесь наздоровье со скриптом.
    Ответ написан
    1 комментарий
  • Как разбить числа по группам так, чтобы в группах находились близкие по значению числа?

    @Mercury13
    Программист на «си с крестами» и не только
    Это называется кластеризация, и самый ходовой метод для неё — K-means.
    Ответ написан
    2 комментария
  • Возможно ли изменить компиляцию С++?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как объяснить данный фрагмент кода?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    В данном коде демонстрируется типичная ошибка подмены типа (type punning [?]), ведущая к неминуемому UB [?] по стандарту.

    num в данном случае представляет собой шестнадцатеричное число, при выводе оно переводится в десятичное число типа double.


    Вот что стандарт говорит о подмене типа.
    [basic.lval#11]
    If a program attempts to access the stored value of an object through a glvalue whose type is not similar to one of the following types the behavior is undefined:
    (11.1) -- the dynamic type of the object,
    (11.2) -- a type that is the signed or unsigned type corresponding to the dynamic type of the object, or
    (11.3) -- a char, unsigned char, or std​::​byte type.

    Относительно unsigned long long тип double не обладает ни одним из требуемых стандартом свойств. Отсюда прямой вывод что данный код вносит UB.
    Поэтому под большим вопросом остается то, что выводится данным кодом.

    В итоге, правильным примером подмены типа на другой может быть только пример, где используется подмена на разрешенный тип представления объекта: char, unsigned char или std::byte для C++17.
    C++ Core Guidelines в секции C.183 однозначно не советует для подмены использовать union. Этого действительно не стоит делать даже при условии того, что все современные трансляторы понимают такие конструкции так, как подозревает писатель.

    Почему неверно работает, к примеру, такой фрагмент кода:

    Второй блок кода означает приведение значения из типа unsigned long long в тип double. В этом случае производится именно стандартное преобразование типа, а не подмена с целью интерпретации представления памяти num иным образом.
    0xC068C0C000000000 для типа unsigned long long означает 13864543383726325760, при преобразовании этого значения в тип double значение будет преобразовано в 1.3864543383726326e+19. В таком виде оно и будет выведено.

    Относительно первого блока кода, лучшим примером подмены типа для кода из вопроса будет такой:
    unsigned long long num = 0xC068C0C000000000;
    double representation = {};
    memcpy( &representation, &num, sizeof( num ) );
    cout << representation;

    И не стоит бояться обращения к memcpy тут. Данный код полностью соответствует стандарту и ожидаемо оптимизируется транслятором до желаемого результата.

    Мне не понятно, как работает такая конструкция, т.е зачем передавать именно ссылку на переменную num?

    Иногда требуется произвести приведение типа значения [?], иногда требуется произвести интерпретацию памяти этого значения другим типом. Это и называется подменой типа или алиасингом. Более детальную информацию о подмене типа, и алиасинге вообще, можно узнать из этой заметки.
    Ответ написан
    Комментировать
  • Как перевести мою логику решения в доказательство?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Найти k - позицию максимального элемент. Если k < n, то сделать 2 шага: разворот 1...k и разворот 1...n. Теперь максимум точно в конце, и задача свелась к сортировке первых n-1 чисел.
    Ответ написан
    Комментировать
  • Как отправить файл на почту?

    CityCat4
    @CityCat4 Куратор тега Электронная почта
    //COPY01 EXEC PGM=IEBGENER
    Если по условиям задачи допустимо применение внешних команд - то сначала man mail, потом отработка отправки файла через команду mail, потом вызов этого всего через system() или exec()..
    Если нужно указывать от кого - вместо mail используется sendmail.
    Если использование внешних команд недопустимо и нужно/хочется обойтись чиста средствами языка (это конечно глупо, но познавательно зело) - берем RFC822, изучаем формат сообщения электронной почты, потом берем и реализуем это.

    То есть нужно будет:
    - сформировать правильные заголовки письма
    - сформировать вложение (mime-encoded, не забываем про то, что в письме могут присутствовать только отображаемые ASCII, никаких спецсимволов!)
    - подключиться к серверу, передать начальную информацию (кто ты, от кого, кому)
    - не забыть про SPF/DKIM/DMARC (иначе с большой долей вероятности письмо будет в корзине, если вообще будет принято - гмыло в этом отношении прост как полено)
    - передать сформированное письмо

    Wataru правильно сказал - пара месяцев напряженной работы уйдет, зато сколько скиллов сразу подтянете :D
    На баше кстати одной строчкой делается (если без изменения From:) и двумя-тремя - если с изменением.
    Ответ написан
    Комментировать
  • Как найти нормаль к плоскости по 3 точкам?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Нормаль к плоскости вычисляется как векторное произведение двух векторов, задающих плоскость. Для точек A, B, C можно взять векторы AB и AC.
    Ответ написан
    Комментировать
  • Из за чего в консоли вместо русского языка выводятся вопросительные знаки?

    @res2001
    Developer, ex-admin
    Это практически первый вопрос, которым задаются юниоры С++, когда пытаются запустить свою первую консольную программу под виндой.
    Ответов на него тут уже была целая пачка.

    Суть в том, что в виндовой консоли может быть 2 русские кодировки (cp866 и cp1251) (не уверен, но может быть консоль винды научилась уже нормально работать с UTF8, если научилась, то считайте, что добавилась еще одна кодировка). Причем по умолчанию используется cp866. Кодировку консоли можно менять из самой консоли или программно.
    При выводе текста в консоль никаких преобразований кодировок не происходит. В какой кодировке у вас написаны исходники - та и выводится. И если кодировка консоли и кодировка исходников не совпадают, то будет не читабельный текст.

    Самый оптимальный и самый сложный вариант - в программе узнать кодировку консоли и перед выводом конвертировать текст в эту кодировку. Так же обратную операцию производить при вводе. В этом случае исходники программы лучше всего писать в UTF8 и использовать wchar_t.

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

    Самый надежный вариант - не используйте русский в консольных программах - только английский. Сомневаюсь, что вам придется когда-то писать профессиональные консольные утилиты, которые бы умели адаптироваться к разным кодировкам, так что, возможно, нет смысла углубляться в эту тему. В GUI приложениях этой проблемы нет.
    Ответ написан
    1 комментарий