• Как в си найти котангенс?

    @Mercury13
    Программист на «си с крестами» и не только
    Единственно правильный способ — tg(π/2 − x).
    Дело в том, что 1/tg будет глючить в районе 90°.
    Ответ написан
    4 комментария
  • Существует ли переходник USB2 → USB3 для матплат и передней панели?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Нашёл ещё вот такое. Не самое дешёвое (особо не проверял), но это решение второй задачи.
    Поисковый запрос «usb3.0 pin adapter».

    https://ru.aliexpress.com/item/Dual-2-Port-USB3-0-...
    Ответ написан
    Комментировать
  • Чем отличается анализ бинарного кода от статического и какие у него преимущества?

    @Mercury13
    Программист на «си с крестами» и не только
    Это разные вещи.

    Статический анализ кода — это проверка исходного текста на распространённые ошибки без попыток запуска. Чем ближе код к стандартным возможностям языка и библиотеки, без лишних обёрток, тем статический анализ кода успешнее. На Хабре по-чёрному пиарится один из инструментов САК — PVS-Studio. Язык программирования D рассчитывает на специальные аннотации, позволяющие проанализировать код на подобные стандартные ошибки ещё при компиляции (но настоящего статического анализа это не заменяет).

    Анализ бинарного кода — это выяснение с использованием дизассемблеров, отладчиков и виртуальных машин, что делает скомпилированная программа. Как частность — есть ли в ней подозрение на зловреда. Этим занимаются как хакеры (вручную), так и антивирусы (автоматически). Антивирусы, анализирующие бинарный код, позволяют сказать: «по базе чисто, но эта программа подозрительная».
    Ответ написан
    3 комментария
  • По разному считается или ошибка в логике?

    @Mercury13
    Программист на «си с крестами» и не только
    Причина в другом. Если человек введёт −1 пройденного пути, надо сразу break, а не проходить огрызок цикла. Пока я проверял, ns 5d выписал действующий код.

    Ну и, конечно, ошибка в логике: среднее потребление (в mpg) = сумма миль / сумму галлонов.

    UPD. Раз уж не хотите break, то…
    while(petrol != -1)
        {
            printf("Enter the gallons used (-1 to end): ");
            scanf("%f", &petrol);
            if(petrol != -1)  {
               // Тут делай ВСЕ вычисления по MPG
            }
       }
    Ответ написан
    Комментировать
  • Не могу найти ошибку в использовании long double в C?

    @Mercury13
    Программист на «си с крестами» и не только
    У меня всё сработало. Может, зависит от библиотеки Си? Какой компилятор?

    UPD. Сработало на MinGW.
    Ответ написан
    1 комментарий
  • Почему меняется выходное значение после нескольких запусков программы?

    @Mercury13
    Программист на «си с крестами» и не только
    Компилятор какой используете? У меня на MinGW всё постоянно — и постоянно не дробная часть. Есть две возможные причины нестабильного поведения.
    1. Флаги сопроцессора — какая-то библиотека Си их не выставляет в постоянное значение.
    2. Неопределённое поведение (uint32_t)var в предпоследней строке. Число-то >1016, а uint32 — это 4·109.

    Тут вы множите число на 10, пока оно не станет целым. Если оно не точный double (а оно не точный), получается ситуёвина, когда младшие биты зависят от флагов сопроцессора, и неизвестно, сколько итераций проработает программа. В любом случае крайне мала вероятность, что будет нечто умещающееся в uint32_t. Таким образом, есть такие варианты обойти проблему.
    1) Умножить сразу на 1e8, а затем обрезать нули.
    2) Сконвертировать в uint64_t.

    Преобразование в uint64_t даёт постоянные 28800000000000024.
    Умножение на 1e8 (число подобрано такое, чтобы в uint32_t вмещалось)
    var *= 1e8;
        number = (uint64_t)var;
    
        while (number % 10 == 0)
            number /= 10;

    даёт 288.

    UPD. Сам я для преобразования дробного в строку в коммерческой проге использую собственную функцию, основанную на GRISU. Там есть много функций наподобие: точность 7 знаков, но если число <1010 — выводим его как целое, с 9-ю знаками.
    Ответ написан
    Комментировать
  • Как возвести число в отрицательную степень, не использую функцию Power?

    @Mercury13
    Программист на «си с крестами» и не только
    Число в отрицательную степень или отрицательное число в степень?
    Отрицательное число можно возводить только в целую степень (уже с рациональной ни фига не понятно, а как мы получили понятие «действительная степень»? — дополнили рациональную по непрерывности).
    Тут вам надо возвести −1 в степень n, и проще всего
    IfThen(Odd(n), -1, 1)

    Для этого ряда так подходит. Но если перед нами ряд для синуса, который вычисляется рекуррентно, то
    x2 := Sqr(x);
    ...
    yNew := -yOld * x2 / ((n - 1) * n);
    Ответ написан
    Комментировать
  • В какой версии Delphi появились хелперы?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Опять отвечаю сам. XE3.
    Ответ написан
    Комментировать
  • Почему код не работает C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Этим переменным не присваивали начального значения и в них могло оказаться что угодно.

    Переводите с английского!
    Ответ написан
    8 комментариев
  • Как реализовать сумму дробей?

    @Mercury13
    Программист на «си с крестами» и не только
    Заводим структуру-сумматор. Изначально она 0/1. Что-то типа
    typedef struct {
      int num, den;
    } Fraction;
    
    …
    
    Fraction sum = { 0, 1 };

    Дальше пишу псевдокодом, НОД и НОК разберись, как реализовать самому.
    для каждой очередной дроби
      ввести(дробь)
      новыйЗнам = НОК(сумматор.знам, дробь.знам)
      множСумм = новыйЗнам / сумматор.знам
      множДробь = новыйЗнам / дробь.знам
      новыйЧисл = сумматор.числ × множСумм + дробь.числ × множДробь
      сокрНод = НОД(новыйЧисл, новыйЗнам)
      сумматор.числ = новыйЧисл/сокрНод
      сумматор.знам = новыйЗнам/сокрНод

    Можно и оптимизировать, но тогда нужна хитрая разновидность алгоритма Евклида; в учебных целях не стоит.

    И ещё. Одна из известных ошибок в написании НОК — произведение аргументов не влезает в свой тип, а НОК влезает. Поймёшь, как в такой ситуёвине избавиться от переполнения?
    Ответ написан
    Комментировать
  • Как разобратся с кодом?

    @Mercury13
    Программист на «си с крестами» и не только
    Матрица имеет вид «хребта», на котором висят массивы-строки.

    Вставка работает так.
    1. Завести новый хребет.
    2. Завести новую строку.
    3. Посадить все остальные строки на новый хребет.
    4. Перенести новую матрицу на место старой.

    Удаление работает точно так же, только без 2.

    Как избавиться от говнокода.
    1. Стоило бы разделить интерактивное удаление и собственно удаление.
    2. Стоило бы тащить this (с какой матрицей работаем). А то на данный момент работаем с одной матрицей, и точка.
    3. Если уж методы — может, стоит писать в объектном стиле?
    4. Снова-таки, утечки памяти!
    Ответ написан
  • Как передать двумерный динамический массив в другую функцию?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть два способа наладить динамический 2D-массив: «хребет» и «линейный массив».

    Хребет определяется как int** a = new int*[m];
    А затем каждый элемент хребта присваиваете new.
    Доступ a[i][j].

    Линейный массив определяется int* a = new int[m*n];
    Доступ a[i*n + j].

    Ваш случай — линейный массив, то есть
    void func(int a[], int n, int m)
    …
    func(a[0], n, m);


    Советую как-то заинкапсулировать эти массивы и передавать
    void dumpArray(const Array2D& x)
    К сожалению, у инкапсулированного массива нет хорошего способа сделать a[i][j], но можно a(i,j).
    Ответ написан
    2 комментария
  • Как вычислить корень n-ой степени?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак, надо решить такую задачу.
    xb = a, a > 0, или xb — a = 0

    Метод Ньютона говорит:
    xn+1 = xn − f(x) / f′(x)
    xn+1 = xn − (xnb — a) / (b·xnb−1) = (xn − a/(xnb−1))/b
    Поскольку функция возрастает и выпукла вниз, x1 лучше брать завышенный. Идеал — хаки с дробными числами (например, заполучить порядок и взять начальным приближением 2[ord/b] для отрицательного порядка и 2[ord/b] + 1 для неотрицательного.

    [x] — усечение дробного числа, при целом b [ord/b] = ord div b. Чтобы заполучить порядок, похимичить с ним и снова собрать в машинное дробное, можно воспользоваться функциями Delphi Frexp и Ldexp, они очень быстры.

    Заканчивать когда |xn+1 − xn| меньше e. Поскольку у метода сходимость квадратичная, почти гарантированно получим нужную нам точность.

    Поскольку для проверки точности нам нужны два приближения, n и n+1, их и храним.

    И последнее. Поверь мне, прекрасная леди, никто не будет решать тебе учебную задачу до конца.
    Ответ написан
    Комментировать
  • Можно ли вынести реализацию шаблонного класса в отдельный cpp файл?

    @Mercury13
    Программист на «си с крестами» и не только
    Можно в таких случаях.
    1. Если у шаблона ровно N специализаций и (N+1)-й быть не может.
    2. Если он private и его синтаксически невозможно вызвать откуда-то ещё, кроме CPP.
    3. template<> (полностью специализированная функция без шаблонных параметров). Ей место именно в CPP, если она общедоступная и не inline.

    Стек, очевидно, ни к одному из этих случаев не относится.

    Код создаёт не сам шаблон, а его расшаблонивание!
    Ответ написан
    Комментировать
  • Что означают эти строки в коде?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Указатель на указатель. Мы создаём 2D-массив как кучу динамических 1D-. Если 1D-массив — указатель, то массив из таких 1D- — массив из указателей, то есть указатель на указатель.
    2. Указатель простой (создать 1D-массив из указателей, который станет «хребтом» нашего 2D-).
    Ответ написан
    5 комментариев
  • Возможно ли заразить компьютер вирусами ,если подключить жесткий диск через USB SATA/IDE?

    @Mercury13
    Программист на «си с крестами» и не только
    Можно. Если не запускать ничего — то зависит от версии Windows и стоящих на ней апдейтов.
    7+ вроде научилась не запускать ничего в DLL, чтобы подгрузить оттуда иконки, и не делать автозапуска ни для чего, кроме CD.
    В общем, советую для таких винтов обновлённую 7+ и двухпанельный коммандер, а не Проводник. Мало ли какой эксплойт попадётся, чтобы заразить комп через Проводник, а под коммандеры пока такого не пишут — да и путей подобного заражения меньше.
    UPD. И исполняемый файл сложнее принять за каталог на двухпанельном коммандере.
    UPD2. После этого тем же коммандером перетряхните скопированные каталоги, чтобы убедиться, что там законные файлы, а не исполняемые. После чего можно пользоваться даже Проводником — вероятность заразиться мизерна. Если там «левые» документы (DOC, PDF и прочее, что часто эксплойтят) — советую прогнать скопированное на проге типа CureIt.
    Ответ написан
    3 комментария
  • Какие dll добавить в проект Qt, чтобы на удаленном компьютере работал доступ к MySQL?

    @Mercury13
    Программист на «си с крестами» и не только
    Если с MySQL работаем напрямую, то
    plugins\sqldrivers\qsqlmysql.dll
    libmysql.dll
    Ответ написан
    4 комментария
  • Как найти алгоритм?

    @Mercury13
    Программист на «си с крестами» и не только
    Если число 3 задано жёстко, проще всего тройной цикл
    для i = [0..n—2)
      для j = [i+1..n−1)
        для k = [j+1..n)


    Если нежёстко, то получаем такое.

    Изначально массив инициализирован числами 0, 1, 2. Шагом является вот такая сложная операция.
    Добавляем единицу к последнему элементу. Если он больше n−1, то крутим вторую итерацию цикла — добавляем 1 к предпоследнему, если он больше n−2, крутим третью.
    Если цикл прошёл весь массив и так и не закончился — перебор окончен. Иначе идём по массиву вперёд и заполняем хвост числами a[i]+1, a[i]+2…
    Ответ написан
    3 комментария
  • Какие есть книги про связь высшей математики и программирования?

    @Mercury13
    Программист на «си с крестами» и не только
    Дональд Кнут. «Конкретная математика»
    Теория графов, алгебра логики — любая книга
    Ответ написан
  • Как переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами?

    @Mercury13
    Программист на «си с крестами» и не только
    Найти индекс минимального и максимального.
    Если нужно, поменять местами, чтобы один был меньше другого. ИНДЕКСЫ, не элементы.
    А теперь цикл.
    ++низИндекс
    --верхИндекс
    пока низИндекс < верхИндекс
      поменять a[низИндекс], а[верхИндекс]
      ++низИндекс
      --верхИндекс

    Если индексы беззнаковые, надо проверить как-то, что первое --верхИндекс не приведёт к «антипереполнению». Например, «если верхИндекс > 0»…
    Ответ написан
    Комментировать