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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ошибка у вас в логике. Смотрите, пусть есть два участка - 20 миль / 1 галлон и 50 миль / 2 галлона. Если найти показатель миль/на галлон для каждого участка, то получим 20 и 25. Среднее арифметическое - 22.5. Но ведь реально мы проехали 70 миль на 3 галлонах, то есть 70/3 = 23.(3) ≠ 22.5
    Ответ написан
    Комментировать
  • Сколько памяти занимает int в C?

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А что там придумывать? Сложение - первый класс начальной школы, операции с дробями - пятый класс.
    Просто последовательно складывайте дроби в натуральном представлении.
    Ответ написан
    4 комментария
  • Как записать 256 бит в массив из 16 слов?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    for (int i = 0; i < 255; i++) {
      arr[i / 16] = (arr[i / 16] & ~(1 << (i % 16))) | (func(i) << (i % 16));
    }
    Ответ написан
    Комментировать
  • Куда теряется 1 в цикле при работе с мк?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В первом варианте у вас в цикле i получает значение 8, затем в начале следующего цикла сначала идёт попытка зажечь девятый светодиод и только потом i уменьшается до 7. Ну и программа написана неэффективно.
    int main(void)
    {
      DDRD = 0xFF;
      PORTD = 0x00;
      char position = 0;
      char step = -1;
      while(1) {
        PORTD = (1 << position);
        if (0 == position || 7 == position) {
          step = -step;
        }
        position += step;
        _delay_ms(200);
      } 
    }
    Ответ написан
    8 комментариев
  • Обработка разнобитных bmp картинок, в чем конкретная разница?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В формате BMP в режимах 32, 24 и 16 bpp каждая группа байтов хранит непосредственно цвет пиксела. В режимах 1, 4 и 8 bpp хранится номер цвета из палитры.
    Ответ написан
    Комментировать
  • Поиск групп подобных треугольников среди массива треугольников по сторонам. Как реализовать?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для начала, чтобы было проще искать, лучше сохранить стороны треугольников по возрастанию, то есть z[j].n <= z[j].m <= z[j].o
    Затем, вспоминаем правило подобия треугольников с учётом сортировки длин сторон:
    (z[i].n / z[j].n) = (z[i].m / z[j].m) = (z[i].o / z[j].o)

    Перепишем эти условия для компьютера:
    (z[i].n / z[j].n) = (z[i].m / z[j].m) => ((z[i].n * z[j].m) / (z[i].m * z[j].n)) = 1
    (z[i].n / z[j].n) = (z[i].o / z[j].o) => ((z[i].n * z[j].o) / (z[i].o * z[j].n)) = 1

    Поскольку вещественные вычисления на компьютере дают погрешность, то условия надо преобразовать (epsilon - константа, задающая точность вычислений):
    abs(((z[i].n * z[j].m) / (z[i].m * z[j].n)) - 1) < epsilon && 
    abs((z[i].n * z[j].o) / (z[i].o * z[j].n)) - 1) < epsilon

    Теперь начиная с первого треугольника, относим его к классу 1 проверяем его на подобие остальным и там, где треугольники подобны записываем их в класс 1.
    Затем ищем треугольник, у которого класс не задан, относим его с следующему классу, проверяем его подобие остальным бесклассовым треугольникам, для подобных записываем тот же класс.
    Продолжаем, пока все треугольники не будут отнесены к одному из классов.
    Ответ написан
  • Как переводить в негатив/черно-белое bmp на С?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если хотите делать всё самостоятельно, то начните, например, отсюда: https://en.wikipedia.org/wiki/BMP_file_format
    В принципе, для b/w (1bpp) и grayscale (8bpp) достаточно перевернуть палитру.
    Ответ написан
    8 комментариев
  • Как перевести на си в HEX код(bmp)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Так вы выводите данные как строку (%s). Что вы ожидаете увидеть?
    Ответ написан
    Комментировать
  • Как изменить определенное кол-во символов внутри строки (язык Си)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В условии задачи сказано, что надо заменить все последовательности, искать самую длинную не надо. Самый простой способ - создать ещё один массив того же размера и перебирая символы первого заносить во второй готовую последовательность. Также можно сделать всё в одном массиве, читая и записывая по двум разным указателям.
    Ответ написан
  • Почему в строке 35 структура объявлена таким образом?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Структура rusage определена в resource.h
    Ответ написан
    Комментировать
  • Массив uint8_t [8] на переменную uint64_t?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    union {
      uint8_t  u8[8];
      uint64_t u64;
    } var;

    Или
    uint8_t var[8];
    *((uint64_t *)var);

    Или
    uint64_t var;
    ((uint_8 *)&var)[0];
    ((uint_8 *)&var)[7];
    Ответ написан
    5 комментариев
  • Как устроены хэш-таблицы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Открытая и закрытая адресации (в терминах данной статьи) отличаются поведением в случае коллизии, то есть добавления в хэш-таблицу записи с уже имеющимся в ней хэшем.
    При открытой адресации будет создан динамический список, голова которого находится в соответствующей ячейке хэш-таблицы, а элементами будут хэшируемые данные (или указатели на них).
    При закрытой - будет попытка найти слева (или справа, в зависимости от реализации) от уже занятой ячейки свободную, в которую будет записан хэш и хэшируемые данные.

    Очевидно, что открытый вариант несколько более сложен в реализации, но при этом гораздо более гибок и хорошо расширяем. Достоинством является то, что получив хэш простым перебором списка мы можем получить все значения, с таким хэшем.
    Закрытый вариант имеет фиксированное потребление памяти и более простую реализацию, но при многочисленных коллизиях даёт низкую эффективность, поскольку надо перебирать ячейки в поисках значений с нужным хэшем.
    Ответ написан
  • Почему в С 0 != 0, а 0 == 0?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Из-за особенностей машинного представления вещественных чисел сравнивать их напрямую крайне не рекомендуется. Попробуйте вместо %f использовать %e и, скорее всего, обнаружите, что в массиве вовсе не нули.
    Ответ написан
    6 комментариев
  • Как пользоваться stdint.h?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас в константе единичка лишняя
    184467440737095511615
    Ответ написан
    Комментировать
  • Точность рекуррентной формулы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы вывели формулу получения k+1 элемента из k-го, а в программе используете её для получения k-го элемента из k-1. Это разные формулы.
    Ответ написан
    Комментировать
  • Как на си разобрать бинарные данные?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Как правило определяют структуру, соответствующую данным, затем создают переменную с типом этой структуры, считывают данные в неё и просто обращаются к полям структуры.
    #pragma pack(push,1)
    typedef _websocketPacket {
      unsigned char one; // здесь ваша 1
      unsigned char indexElement;
      unsigned char rest[18];
    } wsPacket;
    #pragma pack(pop)
    wsPacket myData;
    Ответ написан
    Комментировать
  • Преобразование инта в строку?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    void wrInt(int val) {
      int l = 1, v = val;
      if (v < 0) {
        write(1, "-", 1);
        v = -v;
      }
      while ((v = v/10) > 0)
        l *= 10;
      while (l > 0) {
        v = val % l;
        ft_putchar(v + '0');
        val -= v*10;
        l /= 10;
      }
    }
    Ответ написан
  • Как вернуться к началу строки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    #include <string.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
      unsigned char *text, *key;
      unsigned char shift, rightNumber;
      for (text = argv[1], key = argv[2]; *text; text++, key++) {
        if (0 == *key)
          key = argv[2];
        if (*text >= 'A' && *text <= 'Z') {
          shift = *key - 'A';
        rightNumber = *text + shift;
        if (rightNumber > 'Z')
          rightNumber -= ('Z' - 'A');
        printf(""%c + %c '%.3d' == "%c\n", *text, *key, shift, rightNumber);
      }
    }
    Ответ написан
  • Как внутри работает Flex или Lex?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Нет, задача лексера - преобразовать поток символов (текст программы) на входе в поток лексем, как правило расширенных, на выходе. Например:
    1 + 1 * 2 => <число(1)> <плюс> <число(2)> <умножить> <число(2)>

    flex по формальной грамматике строит лексер, то есть выдаёт код на C, содержащий определение функции yylex(), при каждом вызове которой выдаётся следующая лексема.
    Реализация лексера может быть различной, часто используются конечные автоматы.
    Ответ написан