• Каков шанс попадания в группу 2 из 10 человек?

    @TheCalligrapher
    Если идти "длинным" комбинаторным путем, то можно вычислить количество "благоприятных" размещений 10 человек по 10 позициям и разделить их на полное количество размещений (то есть на 10!).

    "Благоприятными" будут размещения

    (1, 2) (...) (...) (...) (...)
    (2, 1) (...) (...) (...) (...)
    (...) (1, 2) (...) (...) (...)
    (...) (2, 1) (...) (...) (...)

    и т.д, всего 10 вариантов. Количество размещений в каждом варианте очевидно равно 8!

    Итого, вероятность равна (10 * 8!) / 10! = 1/9

    Хотя на самом деле ответ 1/9 очевиден. Без потери общности можно считать, что сначала мы помещаем куда-то человека №1, а затем в одно из свободных мест человека №2. Вероятность, что человек №2 окажется в одной группе с человеком №1 очевидно равна 1/9. Другое дело, что следует показать, что в таких "очевидных" рассуждениях мы не теряем общности, т.е. показать, что не нужно еще отдельно рассматривать варианты, когда первым мы размещаем человека №3, вторым - человека №5 и только затем человека №1 и т.д.
    Ответ написан
    9 комментариев
  • Зачем в конструкторе инициализация вне тела конструктора?

    @TheCalligrapher
    Странный вопрос. В С++ не существует другого спосба инициалиазции полей класса в определении конструктора. Никакой инициализации "в теле самого конструктора" не существует. О чем вы?
    Ответ написан
    Комментировать
  • Возможно ли выражение наподобие #define name #if fds == fds *dosomething* #else *dosomething* #endif сделать валидным в Си? И, если да, то как?

    @TheCalligrapher
    Сделать именно это: нет, невозможно. Определения макросов препроцессора не могут содержать директивы препроцессора.

    Сделать "эквивалент, который работает также" (sic): никто не знает ответа на этот вопрос, потому что вы не удосужились внятно объяснить, что вы пытаетесь сделать этим загадочным набором лексем. Ключевым моментом здесь является характер условия arg == sd. Это значение времени компиляции?

    В любом случае, не ясно, чем вас не устроило обычное

    #define somemacro(arg) if ((arg) == (sd))\
      printf ("some text 1");\
    else\
      printf ("some text 2");
    Ответ написан
    1 комментарий
  • Почему программа падает при вводе отрицательного числа?

    @TheCalligrapher
    В языке С++ не разрешается использовать неконстантые выражения в качестве размера при объявлении массива. Поэтому ни о каком "все нормально пока я не введу отрицательные числа" речи быть не может. Ваш код не является кодом на С++ вообще. Нужно все переделывать с самого начала.

    В качестве массива используйте std::vector<double>. И, разумеется, не float, а double. Почему у вас в коде вдруг используется тип float?
    Ответ написан
  • Почему так можно делать?

    @TheCalligrapher
    Константные ссылки можно привязывать к prvalue, в каковом случае язык сам для вас материализует временный объект, проинициализирует его правильным значением и привяжет к нему ссылку. В вашем примере этот временный объект будет автоматически уничтожен по завершении cout<<sqr(4);.
    Ответ написан
    Комментировать
  • Как восстановить окружность по массиву точек?

    @TheCalligrapher
    Используйте алгоритм Эмо Велла (Emo Welzl) для построения минимальной охватывающей окружности

    https://www.cyberforum.ru/geometry/thread1926478.h...
    www.stsci.edu/~RAB/Backup%20Oct%2022%202011/f_3_Ca...

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

    Так как никаких детальных требований к искомой окружности вы не привели, этот алгоритм будет не лучше и не хуже любых других.
    Ответ написан
  • Почему компилятор ругается?

    @TheCalligrapher
    Потому что написанное вами выражение не соответствует грамматике языка С вообще, т.е. является синтаксической ошибкой. Никакой из вариантов парсинга этого выражения не вписывается в грамматические правила языка. То есть ваше выражение с точки зрения языка С - это бессмысленный набор лексем.

    Чтобы сделать это выражение синтаксически корректным, вы можете добавить в него скобки:

    • ch == 'h' ? (high = guess) : (low = guess)
    • (ch == 'h' ? high = guess : low) = guess
    • еще как-то


    Популярный и часто приводимый ответ о том, что это выражение в С якобы интерпретируется как (ch == 'h' ? high = guess : low) = guess является грубо неверным. Еще раз: этот набор лексем не имеет вообще никакой интерпретации в грамматике языка С. Его невозможно пропарсить в принципе.

    Сообщение, которые вы получили от компилятора ("error: lvalue required as left operand of assignment") говорит о том, что данный компилятор где-то "срезает углы" для экономной/унифицированной реализации грамматик сразу двух языков - С и С++. Грамматики этих языков очень похожи в общем, но сильно отличаются в деталях. Побочным эффектом такой унифицированной реализации является то, что компиляторы иногда выдают сбивающие с толку диагностические сообщения. Сообщения об ошибках не стандартизованы, т.е. формально придраться тут не к чему, но фактически полученное вами сообщение об ошибке вас нагло обманывает. Никакого "lvalue required" тут нет, а есть просто синтаксически некорректный набор лексем.
    Ответ написан
    5 комментариев
  • Как указать степень при вводе?

    @TheCalligrapher
    Ввод плавающих значений поддерживает "научную нотацию". То есть при вводе значения типа double вы можете написать 10e-23. Никакого другого ввода "со степенью" в стандартной библиотеке нет.
    Ответ написан
    Комментировать
  • Как дословно переводится assignment makes pointer from integer without a cast?

    @TheCalligrapher
    Дословно это можно перевести как "присваивание делает/формирует указатель из целого [значения] без [использования] явного приведения типа".

    Термин "cast" в С означает явное приведение типа. Именно явное.

    Сочетание "makes [...] without a cast" ссылается на то, что ваш оператор присваивания пытается выполнить именно неявное преобразование из указателя к целому значению.

    Все сообщение означает, что в своем коде использован оператор присваивания (assignment), правая часть которого является указателем (pointer), а левая - целым числом (integer).

    Такой код является некорректным в С, ибо язык С в общем случае запрещает неявные преобразования между целыми числами и указателями. Чтобы преобразовать целое значение к указателю в С требуется явное приведение типа, т.е. cast.
    Ответ написан
    Комментировать
  • Когда использовать malloc() или calloc()?

    @TheCalligrapher
    • Первым и основным назначением динамической памяти является ручное управление временем жизни объектов. Память выделенная через malloc не подчиняется никаким автоматическим механизмам освобождения памяти. Такая память будет оставаться выделенной "вечно", пока вы сами не освободите ее вызовом free. Другими словами, в отличие от автоматических переменных, объекты, размещенные в динамической памяти, не уничтожаются при выходе из блока. Попросту выражаясь, динамическая память существует в первую очередь для того, чтобы вы могли ее выделить в функции, но не освобождать при выходе из этой функции.

      Это отличие динамической памяти настолько мгновенно бросается в глаза, что совершенно не ясно, откуда даже возникают вопросы, в которых динамическую память пытаются сравнивать с явно объявленными переменными.

    • Второе, не менее важное, важное свойство динамической памяти заключается в том, что количество и размер выделяемых блоков памяти определяется во время выполнения, а не на этапе компиляции. Ничего подобного нельзя получить через явное объявление переменных (за исключением, разве что, VLA)

    • Третье, чисто утилитарное, назначение динамической памяти - размещение объектов, которые просто-напросто слишком велики для других типов пямяти
    Ответ написан
    Комментировать
  • Является ли правильным данный код?

    @TheCalligrapher
    Нет, разумеется, на является.

    1. Одна из строк приведенного кода синтаксически выглядит как statement. В языке С++ statement может располагаться только внутри определения функции. В приведенном коде нет никакого определения функции.

    2. В поле фигурирует некий неопределенный идентификатор cout. Что это за странный cout такой?
    Ответ написан
    Комментировать
  • Библиотека и пространство имен. В чем разница?

    @TheCalligrapher
    У вас у наблюдается какая-то странная терминологическая каша.

    Во-первых, "библиотека" и "пространство имен" - сущности, которые не имеют ничего общего даже отдаленно. Ваш вопрос звучит как "в чем разница между вороной и площадью треугольника". На такой вопрос невозможно ответить без дополнительных пояснений - он бессмыслен.

    Во-вторых, нет никакой "библиотеки iostream" и никогда не было. Почему вы вдруг называете "iostream" "библиотекой"? В С++ существует стандартный заголовок <iostream>, содержащий описания сущностей из стандартной библиотеки языка С++. Но заголовок - это совсем не библиотека. Никто не считает <iostream> "библиотекой". Почему вы вдруг это делаете?
    Ответ написан
    1 комментарий
  • Возможно ли писать на C++ со вставками C?

    @TheCalligrapher
    Нет, нельзя. В С++ нет средств "вставки" кода на других языках программирования, кроме разве что asm.

    Однако язык С достаточно похож на язык С++ для того, чтобы С код можно было рассматривать как С++ код либо сразу, либо с непринципиальными изменениями. Поэтому не ясно, откуда вообще мог возникнуть ваш вопрос.
    Ответ написан
    Комментировать
  • Почему возникает ошибка Codevision "too many initializers"?

    @TheCalligrapher
    "Так не работает, а так работает" - это, скорее всего, какие-то выдумки и/или недоговоренности. Никакой разницы между этими двумя вариантами нет.

    А в остальном:

    1. Эта инициализация корректна в C и некорректна в C++.

    2. Штатный компилятор С в составе CodeVision содержит известный баг, из-за которого он отказывается принимать этот совершенно корректный код. Хотя сообщение об ошибке в нем сформулировано по-другому.
    Ответ написан
  • Если кинуть тело вертикально вверх, какое будет ускорение тела в самой верхней точке?

    @TheCalligrapher
    На протяжении всей траектории полета ускорение тела постоянно и равно g (пренебрегая сопротивлением среды и удалением от поверхности Земли).

    Отмеченный ответ о "нулевом ускорении" в верхней точке неверен и грубейше безграмотен.
    Ответ написан
    Комментировать
  • Не работает структура объявленная в заголовочном файле?

    @TheCalligrapher
    Так а что это такое вообще: htval.num = 10;?

    Это выглядит как инструкция (statement). В языках С и С++ инструкции могут находиться только внутри функций. Больше нигде. Это требование грамматики, т.е. элементарного синтаксиса этих языков. Зачем вы написали инструкцию в "чистом поле" за пределами функции? Это некорректно с точки зрения синтаксиса языка.

    Упрощенно выражаясь, в С и С++ код пишется внутри функций, а не снаружи.

    P.S. Ваш вопрос не имеет никакого отношения к "структуре, объявленной в заголовочном файле". Ни структуры, ни заголовочные файлы тут ни при чем.
    Ответ написан
    Комментировать
  • Каково назначение данной функции для односвязного списка?

    @TheCalligrapher
    Функция добавляет новый элемент в начало односвязного списка и, соответственно, обновляет указатель на начало списка. Именно обновление указателя на начало списка и делается через присваивание *s = el.

    Это функция также может быть использована для вставки элемента в середину списка, если в качестве параметра s будет передаваться указатель на поле next предыдущего элемента. (Другими словами, вставка элемента в середину списка - это ни что иное, что вставка элемента в начало правого подсписка, начинающегося в точке вставки.)

    P.S. Функция написана стилистически кривовато: делает ненужное приведение типа на результате malloc и не пользуется очевидной возможностью выполнить инициализацию переменной el (вместо присваивания).
    Ответ написан
    2 комментария
  • Простенькая программа на С выдаёт ошибку. Как исправить?

    @TheCalligrapher
    Здесь вся программа набита ошибками под самую завязку.

    • Куда пропал тип возвращаемого значения у функции main()?
    • Почему в scanf("%f",&b) использован формат %f? Какой формат следует использовать для ввода значений типа double?
    • Что по-вашему проверяет if (a>x>b)?
    • Что это за чушь: pow(cos,2)? Что там делает этот cos?
    • Что случилось с балансом скобок в if ((x>=b)?
    • Что это за выражения под каждым if, которые как будто что-то вычисляют, но никуда не сохраняют результаты своих вычислений? То есть они фактически ничего не делают. Зачем они такие нужны?
    • printf в конце печатает значение переменной z. Но вы не назначили этой переменной никакого значения.
    Ответ написан
    Комментировать
  • Как организована работа rand()?

    @TheCalligrapher
    Вы все совершенно правильно описали: функция rand() является stateful функцией, т.е. она обладает состоянием (state), которое сохраняется между последовательными вызовами функции. И по понятным причинам это состояние также должно быть доступно функции srand().

    Однако, во-первых, не ясно, почему вы решили, что это состояние обязательно должно храниться в локальной статической переменной, объявленной внутри функции rand(). Даже если следовать вашей логике, то намного разумнее предположить, что это - некая статическая переменная, объявленная не уровне файла (модуля), и немедленно доступная как функции rand(), так и функции srand(). Или даже глобальная переменная. (Во многих реализациях стандартной библиотеки, старающихся поддерживать работу в многопоточных приложениях, это состояние может храниться в thread-локальной переменной.)

    Во-вторых, что важнее (!), реализация стандартной библиотеки в общем случае делается платформенно-зависимыми средствами, не имеющими никакого отношения к языкам С или С++. Она может быть реализована на Ассемблере, Фортране или на языке нанайских мальчиков. С языками С или С++ должен быть совместим лишь ее внешний интерфейс, но не внутренняя реализация. Поэтому рассматривать реализацию стандартной библиотеки в терминах языков С или С++ - бессмысленное и некорректное занятие. Реализация стандартной библиотеки живет по своим законам. Если ей нужно, чтобы состояние rand() было также доступно в srand() - значит так и будет. А как это сделано - волшебство конкретной реализации.
    Ответ написан
    Комментировать
  • Как из вложенного класса получить доступ к переменной основного класса?

    @TheCalligrapher
    Никак не получить, пока вы сами каким-то образом не передадите в точку доступа указатель или ссылку на объект основного класса. То есть необходимый контекст придется либо передавать через параметры метода (update в данном случае), либо хранить в объектах класса thrusterMount на постоянной основе.
    Ответ написан
    Комментировать