Ответы пользователя по тегу C
  • Как будет выглядеть данный псевдокод в коде на языке Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вижу несколько проблем. Во-первых, проставьте фигурные скобки ко всем циклам. И отступы поставьте аккуратно (открывающая скобка - +отступ, закрывающяя - -отступ). У вас сейчас инструкции, которые вы думаете в цикле - они вне его.

    Во-вторых, вот это что такое вообще? return flag=1;
    Ответ написан
    3 комментария
  • Как написать на СИ программу, которая выделяет числа из строк?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Напишите функцию, которая начиная с заданного индекса выделяет в строке число и возвращает индекс конца числа. Эта функция состоит из тупо одного while, который проверяет, а не символ или конце строки текущий символ.

    Сама программа идет по строке, если видит, что текущий символ - цифра, то запускает функцию выше. Потом выводит от текущего до найденного символа, потом сдвигает текущий индекс на конец числа. Лучше делать while. Внутри вы или увеличиваете индекс на 1, если текущий символ - не цифра, или сдвигаете его на конец найденного числа.
    Ответ написан
    Комментировать
  • Segmentation fault (core dumped) как пофиксить?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Пройдитесь по коду отладчиком. Ну, или добавьте отладочный вывод: например, в начале цикла while и цикла for выводите, что происходит итерация цикла и переменные c,i такие-то.

    Вы быстро заметите, что у вас цикл по for выполняется на первом же символе более 100 раз. Посмотрите в свой код, подумайте, почему так происходит.
    Ответ написан
    Комментировать
  • В чем ошибка в написанном коде, в 5 строке?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Воткните эту фразу в гугл транслейт. Там все понятно написано. Нельзя объявлять переменную прямо в цикле (int i) в том режиме, в котором у вас работает компилятор. Надо что-то в свойствах IDE поковырять и включить режим C99.

    Ну, или объявляйте переменную i до цикла.
    Ответ написан
    2 комментария
  • Самый эффективный способ поиска последовательности нулевых байт?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Самый эффективный способ - использовать SIMD инструкции (какой-нибудь _mm256_cmpeq_epi8 и хитрую битовую арифметику вроде _mm256_movemask_epi8 и подобных над результатом).

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

    Если вы ищите короткую последовательность, то еще нужно прверить, что в текущем болке она встречается. Например, чтобы проверить, что в битовой маске М есть последовательность из 5 бит, можно проверить, что (M & M >> 1) && ((M & M >> 1) >> 2) & M >> 4 имеет ненулевые биты. Достаточно log k сдвигов и битовых И для поиска последовательности из K ненулевых бит.

    Но вряд ли вы будете с этим возиться. Следующий вариант - эмулировать SIMD руками в int64. Читайте из памяти по 8 байт (через memcpy в int64) и там уже проверяйте через LSB/MSB сколько нулевых байт на конце, в начале. Чуть сложнее, если вам надо искать последовательность короче восьми байт. Тогда надо еще отдельно проверить через битовые сдвиги, есть ли она внутри блока из 8 байт.

    Дальше, есть какой-то ненулевой шанс, что memmem именно вариант выше и реализует, но это вряд ли. Я думаю ваш случай достаточно частен и ручная реализация будет быстрее.
    Ответ написан
    Комментировать
  • Почему не читаются данные при вводе из файла?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Скорее всего ошибка в файлах. Они наывазются не так, как вы передаете в параметрах, или находятся в другой директории, или пусты. А правильный текст вы видите в другом файле. Перепроверьте еще раз все названия. Или там первая строчка пустая.
    Ответ написан
    2 комментария
  • На чём написан язык программирования C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Учтите, что язык программирования - это просто набор спецификаций и правил. Он написан на английском языке.

    Если же вас интересует на чем запрограммированы компиляторы языка С, то самые популярные нынче развивающиеся компиляторы написаны на C и C++ соответственно:
    gcc: https://github.com/gcc-mirror/gcc
    clang: https://github.com/llvm/llvm-project/tree/main/clang

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

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

    А так, наверно, есть куча неподдерживаемых устаревших компиляторов Си на всевозможных языках.
    Ответ написан
    2 комментария
  • Как удалить из предложения слова, в которых нет указанной буквы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если бы вы использовали нормальные имена переменных, то вам бы сразу стало очевидно, какую одну строчку (даже один символ!) надо изменить, чтобы стали удалятся слова без буквы, вместо слов с буквами.

    Подумайте, что хранится в переменной g - что она означает, какой ее физический смысл, какие значения и при каких условиях она принимает?
    Ответ написан
    Комментировать
  • Как сделать компилятор СИ на джаве?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы уверены? Создать компилятор Си с нуля, даже очень тривиальный, даже используя всякие генераторы парсеров - это несколько месяцев работы целой команды специалистов.

    Нужно понимать ассемблер, иметь знания по теории компиляторов (есть много книг), теории языков.

    Если же вам надо просто прикрутить компиляцию к вашему редактору, то, как многие другие IDE, вам надо будет лишь запускать сторонний компилятор (будь то gcc, clang, visual studio или что-то другое).

    У всех них есть консольное приложение которому можно передать файлы в качестве аргументов в коммандной строке. Вам остается лишь разобраться, как запускать приложения на Java.
    Ответ написан
    3 комментария
  • Как в vector на си вставлять элемент на конкретное место?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Сначала через memmove надо сдвинуть элементы с i по count-1 на позиции i+1...count. Потом чуть изменить memcopy, чтобы записать новв элемент на позицию i, а не count.
    Ответ написан
  • Последнюю строку массива мне выводит очень много раз, в чем проблема?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вы повнимательнее посмотрите на свой код, то заметите, что там вывод массива a происходит в цикле while(n>k). Где именно ошибка - непонятно, ибо неясно, что ваш код должен делать. Или вы вывод массива вставили не туда, или GetComb делает что-то не то и цикл исполняется больше раз, чем должен.
    Ответ написан
  • Как сделать проверку числа на повторность в массиве?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Завести переменную флаг. Пройтись циклом по уже сформированному массиву, сравнить текущее число с числом в массиве. Если нашли совпадение, надо записать это в bool флаг. После цикла посмотреть на флаг.

    Можно из цикла при совпадении выходить через break.

    Нечетные числа можно генерить сразу, умножая рандом на 2 и прибавляя 1.
    Ответ написан
  • Как вытащить значение из под указателя на начало строки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Для преобразования из строки в число можно восспользоваться atoi().

    Однако, если в строке фиксированное заранее известное количество чисел, то лучше воспользуйтесь sscanf(). Можно указать нужное вам количество %d через запятую примерно так:
    sscanf(s, "%d, %d", &a, &b);
    Ответ написан
  • Какой список использовать?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    4 комментария
  • Помощь с задачкой на Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Раз с русскими буквам не работает - это значит, что русские буквы идут в каком-нибудь utf-8 формате. Тогда один символ может задаваться несколькими байтами. Ваша работа с char проверяет, что слова являются полиндромами побайтово, что в случае utf-8 не то же самое, что посимвольно.

    Попробуйте или поменять кодировку файла на что-нибудь вроде CP1251.

    Или перепишите вашу программу используя wchar_t* и wcstok()
    Ответ написан
    3 комментария
  • Чем распарсить строку на C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    sscanf(str, "%d,%d,%d,%d,True", ...);
    Ответ написан
    Комментировать
  • Как редактировать определенную строчку в файле?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вам придется прочитать весь файл, отсчитать нужное количество строк, потом заменить кусок между двумя переводами строки на отредактированное значение, и в конце переписать весь файл. Можно немного соптимизировать и переписывать не весь файл, а только начиная с изменной строки. Используйте fseek чтобы переместится на начало строки/файла, fwrite, чтобы записать новые данные и ftruncate чтобы обрезать файл, если он стал короче.
    Ответ написан
    Комментировать
  • Как сделать такой финт ушами с double?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Используйте memcopy. Копируете из адреса дабловой переменной в адрес интовой.

    Трюки с union и реинтерпритацей указателей довольно опасны.
    Ответ написан
    2 комментария
  • Как нарисовать такой рисунок на с?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Функция вывода на экран - printf(). Один символ или строку, которую вам надо вывести надо передать туда одним параметром в кавычках, например printf("1");.
    Чтобы сделать перевод строки надо вывести символ "\n". Можно добавлять его в конец строки, например printf("44\n");
    Ответ написан
  • Безопасно ли здесь использование функции printf?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Безопасно.
    Ответ написан
    Комментировать