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

    @abcd0x00
    Понадобятся ли мне для решения синтаксические деревья? Если да, какую литературу посоветуете?

    Есть классическая книжка Ахо, Ульман "Теория синтаксического анализа, перевода и компиляции".

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

    @abcd0x00
    Сначала полное словесное описание.
    Потом блок-схема по словесному описанию.
    Потом псевдокод по блок-схеме.
    Потом код по псевдокоду.

    Все этапы делаешь на бумаге или чём там, пока они не станут выполняться в воображении. То есть, если пишешь псевдокод, то в голове уже должна быть ясная блок-схема. Если рисуешь блок-схему, то в голове должно быть полное словесное описание алгоритма. Если же пишешь код сразу, то в голове должно быть всё.

    А сейчас твой псевдокод ничего из себя не представляет, поэтому и код по нему получается никакой.
    Ответ написан
    Комментировать
  • Можно ли писать на чистом Си под Qt? Или для этого нужно именно Си++?

    @abcd0x00
    Из C++ там нужно не много - классы и пространства имён. Всё остальное делается там средствами самого Qt. Так что какого-то глубокого знания C++, которое используется в других cpp-шных программах, там не требуется. Можешь писать по-сишному, просто привязывая код к окнам через cpp-шные средства.
    Ответ написан
    Комментировать
  • Как применять перечисляемый тип enum?

    @abcd0x00
    Для начала тебе надо выкинуть тот материал, в котором ты прочитал вот это:
    void main(void) {

    Когда найдёшь материал, где написано:
    int main(void) {
    тогда и узнаешь, что такое enum и так далее.

    Просто если ты учишься по хреновым материалам, то ты и не можешь ничего узнать, потому что автор материалов сам ничего не знает.

    Есть хорошая книга, главная в C мире
    https://en.wikipedia.org/wiki/The_C_Programming_La...
    250 страниц, в которых ты найдёшь всё, что надо.
    Ответ написан
    2 комментария
  • В чем суть maillist'ов и по какому принципу они работают?

    @abcd0x00
    В чем суть? Это же довольно нечитаемо получается.

    Ты просто пропустил целую эпоху. Раньше вместо форумов (форумов не было вообще) были такие почтовые места. Они были двух типов: просто списки рассылки и списки рассылки-эхи. Просто список рассылки - это когда ты подписался на адрес и тебе приходят какие-то новости, например, и ты их просто читаешь и больше ничего не происходит. А списки рассылки-эхи (или просто эхи), это когда толпа подписывается на него и общается друг с другом через этот адрес.

    Суть сводилась к следующему: ты подписываешься на почтовый адрес и становишься участником почтовой рассылки. Потом ты посылаешь письмо на определённый адрес и оно копируется и рассылается всем участникам рассылки. Допустим, если их 1000 человек, то они все получают твоё письмо. И потом они начинают тебе отвечать точно так же, посылая ответ на этот широковещательный адрес. Ты просто принимаешь почту с этого адреса и она у тебя складывается в треды. Дальше ты эти треды разворачиваешь и читаешь - что ты спрашивал и что тебе наотвечали там и что они между собой там наотвечали ещё. А тред (или цепочка) - это один спросил что-то, ему кто-то на это ответил, а потом на этот ответ ответил ещё кто-то, а потом на его ответ ответил ещё кто-то. В каждом письме сохраняется специальный заголовок "ответ тому-то". Так почтовая программа определяет, из каких писем образуется тред. И в результате у тебя в почтовой программе в папке этого списка рассылки лежат треды, где каждый тред - это такой разговор между кем-то и кем-то (может быть два человека, может быть три человека, а может и десять).

    Так что вот эти рассылки - это такой привет из прошлого. Сейчас мы с тобой общаемся через web-приложение, а раньше их не было, все общались через почту. Поэтому сегодня вся движуха идёт в вебе, а из почты все ушли. А ещё раньше, до почты, были группы новостей.
    Ответ написан
    1 комментарий
  • Pure C. Где исходные коды стандартной библиотеки Си?

    @abcd0x00
    Неужели СТАНДАРТНАЯ БИБЛИОТЕКА (которая почти часть языка) это какой-то секрет?

    Стандартная библиотека функций одна. Она описана в стандарте (документе). А все компиляторы - это реализации того, что там описано. Они могут быть написаны по-разному даже в пределах одной системы. Главное, что все функции должны работать одинаково, где бы они ни были (для этого стандарт и существует).
    Ответ написан
    Комментировать
  • Как запомнить классы, функции и методы в программировании и сэкономить время?

    @abcd0x00
    Сначала проходишь всё один раз и подробно. При прохождении каждого раздела делаешь файл с заметками для него. После прохождения раздела читаешь этот файл с заметками снова.

    Ещё сделай себе html-страницу, где помещай ссылки на разделы, на стандарты, на страницы с материалом.
    Через эту страницу входи каждый раз, чтобы продолжить обучение. На этой же странице отмечай то, что ты уже прошёл.

    Потом делаешь одну html-страницу для всех своих html-страниц. (Прямо на диске переходишь между ними, никаких интернетов не надо.)

    Подробности

    Почему надо проходить полностью? Потому что если ты не пройдёшь все нюансы, ты не будешь знать их. А когда ты не знаешь нюансы, ты начинаешь писать всякую лишнюю хрень. Очень часто при открытии файла на чтение в питоне пишут 'r'. А почему? А потому что не читали полное описание open(), в котором написано, что по умолчанию там всегда 'r'. А когда точно не знают, начинают писать на всякий случай. То же самое касается кодировки в третьем питоне. Вот человек не знает, что там кодировку по умолчанию поменяли, и пишет там всегда "#encoding: utf-8", и удалить боится, потому что не знает, можно ли удалить. А чтобы знать, надо читать PEP, а он не читал.
    Ответ написан
    Комментировать
  • Разработчик языка программирования создает только стандарт?

    @abcd0x00
    Язык ведь определяет его транслятор?

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

    Поэтому язык представляет из себя грамматику, которую составляют и для которой реализуют транслятор.

    Например, ассемблер - это язык (грамматика). Цепочка инструкций ассемблера с помощью транслятора транслируется в цепочку кодов машинного языка.

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

    @abcd0x00
    По стандарту C89 (и до C11), при сдвиге вправо знакового отрицательного числа результат зависит от реализации.


    3.3.7 Bitwise shift operators

    ...

    The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1
    has an unsigned type or if E1 has a signed type and a nonnegative
    value, the value of the result is the integral part of the quotient of
    E1 divided by the quantity, 2 raised to the power E2 . If E1 has a
    signed type and a negative value, the resulting value is
    implementation-defined.


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

    @abcd0x00
    >>> import collections
    >>> 
    >>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> n = 5
    >>> 
    >>> deq = collections.deque(enumerate(lst))
    >>> 
    >>> while len(deq) > 1:
    ...     deq.rotate(-n)
    ...     print(deq.pop())
    ... 
    (4, 5)
    (0, 1)
    (6, 7)
    (3, 4)
    (2, 3)
    (5, 6)
    (8, 9)
    (1, 2)
    >>> print(deq)
    deque([(7, 8)])
    >>>
    Ответ написан
    Комментировать
  • Верить ли Макконнелу?

    @abcd0x00
    Он дело говорит или забить?

    1)
    Лучший комментарий - тот, без которого и так всё понятно.
    В комментариях обычно описывается причина, по которой ты пишешь тот или иной фрагмент. Если ты собрался описывать то, как оно работает, то надо не комментарий писать, а код переписать так, чтобы комментарий вообще не нужен был (ниндзя-комментарий).

    2)
    Форматирование - это важная вещь до самых деталей. Есть автоматическое форматирование. Но какое бы оно ни было, ручное или автоматическое, точное и определённое форматирование нужно для того, чтобы сократить время чтения кода.
    Подробности

    Когда форматирования нет, ты сначала ищешь где что, потом у себя в голове раскладываешь это в правильно виде, а потом это рассматриваешь (в воображении). Так вот, голова не бесконечна, поэтому когда ты кладёшь форматирование в голову, то там места под более полезные вещи уже не хватает и размышлять о содержимом кода ты уже в полную силу не можешь. Тебе нужно думать про алгоритм, а ты думаешь "а правильно ли у меня там блок вложен? а в том ли блоке тот оператор получается?". И всё это только потому, что ты не можешь предоставить это экрану.
    Ответ написан
    Комментировать
  • Как происходит выделение памяти под читаемый файл?

    @abcd0x00
    Получается тогда нам нужно в начале размер файла прочитать, а потом уже все содержимое или как оно все происходит?

    Размер файла записан на диске (в файловой системе). Сам файл хранится в виде кусочков в разных местах диска. Кусочки связаны друг с другом по очереди (в каждом кусочке записано, где следующий кусочек).

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

    Чтобы прочитать файл, выделяется небольшой буфер, в который загружается часть файла. Если ты его прочитал, то в него же загружается следующая часть файла. Ты читаешь файл как бы через окно в виде буфера, которое скользит по файлу вперёд.

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

    @abcd0x00

    Как правильно следить за ходом выполнения работы и поддерживать запуск с предыдущего удачно выполненного этапа, в случае некорректно завершения текущего?

    У тебя прямо в скриптах должно быть завершение с кодом. Если ошибок не было, нужно завершать скрипт через exit 0. Если произошла ошибка, нужно завершать скрипт через exit 1.
    Когда у тебя скрипты так сделаны, ты можешь проверять их код завершения.

    А потом ты можешь написать скрипт со строками
    { script1.sh && echo "script1 - ok"; } || echo "script1 - fail"
    { script2.sh && echo "script2 - ok"; } || echo "script2 - fail"
    { script3.sh && echo "script3 - ok"; } || echo "script3 - fail"


    Пример
    { echo x1 && echo "script1 - ok"; } || echo "script1 - fail"
    { cat x && echo "script2 - ok"; } || echo "script2 - fail"
    { echo x2 && echo "script3 - ok"; } || echo "script3 - fail"
    { touch /x && echo "script4 - ok"; } || echo "script4 - fail"


    [guest@localhost ~]$ { echo x1 && echo "script1 - ok"; } || echo "script1 - fail"
    x1
    script1 - ok
    [guest@localhost ~]$ { cat x && echo "script2 - ok"; } || echo "script2 - fail"
    cat: x: Нет такого файла или каталога
    script2 - fail
    [guest@localhost ~]$ { echo x2 && echo "script3 - ok"; } || echo "script3 - fail"
    x2
    script3 - ok
    [guest@localhost ~]$ { touch /x && echo "script4 - ok"; } || echo "script4 - fail"
    touch: невозможно выполнить touch для «/x»: Отказано в доступе
    script4 - fail
    [guest@localhost ~]$



    Можно сделать и так
    { script1.sh && echo "script1 - ok"; } || { echo "script1 - fail"; exit 1; }
    { script2.sh && echo "script2 - ok"; } || { echo "script2 - fail"; exit 1; }

    Тогда он в случае успеха будет выводить успешную фразу и продолжать, а в случае ошибки он будет выводить сбойную фразу и сразу выходить (с кодом ошибки).
    Ответ написан
    Комментировать
  • Кто хочет поломать немного мозг?

    @abcd0x00
    Проходим циклом по оси X, и в каждой клетке (по оси Х) проверяем все ячейки по оси У (снизу вверх).

    Представь себе спаянную фигуру в виде лестницы из квадратов. При этом она спаяна целиком. И как ты её будешь проверять?

    Тут нужно саму фигуру делать объектом, который состоит из квадратов. А каждый квадрат должен знать, можно ли его сдвинуть в любую сторону. Тогда, чтобы сдвинуть всю фигуру, она должна будет просто опросить все свои квадраты.
    Ответ написан
    Комментировать
  • Как bash terminal парсит комманду и какие параметры ей передать?

    @abcd0x00
    Мне интересен сам алгоритм как BASH сохраняет алиасы, парсит параметры и т.д чтобы воспроизвести что-то подобное на PHP.

    Ну, это надо сделать цикл, в котором принимать ввод по одной строке, а при вводе строки разбирать её на составляющие и сохранять нужные части в хеш-таблицу (если про алиасы речь). В bash'е алиасы тоже нужно записывать в файл, который выполняется при каждой загрузке интерпретатора. То есть нет там какого-то секретного места, они просто загружаются в память и висят там.
    Ответ написан
    1 комментарий
  • Как открыть ссылки из файла в браузере?

    @abcd0x00
    Для Firefox (в Linux)
    [guest@localhost tmp]$ cat urls 
    http://www.yandex.ru
    http://www.toster.ru
    [guest@localhost tmp]$ firefox `cat urls`
    [guest@localhost tmp]$
    Ответ написан
    Комментировать
  • С чего начать изучение MySQL для веб-проекта?

    @abcd0x00
    Ответ написан
    Комментировать
  • Как изучить язык приближенно к 100%?

    @abcd0x00
    Думаю, что лучшим способом будет просто перелопатить всю документацию от А до Я и забить на другие ресурсы. Это правильные мысли?

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

    Классическая задача - распознавание сишных комментариев. Тебя просят сделать программу для очистки исходника от многострочных комментариев, но не говорят, как это сделать. Ты все конструкции языка знаешь, а записать их правильно не можешь. И тогда ты развиваешься, ты узнаёшь, что опять что-то не знаешь, и начинаешь искать эти недостающие знания. И так из книги по одному языку ты приходишь в теорию алгоритмов, общую для всех языков.
    Ответ написан
    Комментировать
  • Алгоритм или как создаются линейные штрих-коды?

    @abcd0x00
    Как создаются линии?

    https://ru.wikipedia.org/wiki/European_Article_Number
    https://ru.wikipedia.org/wiki/Universal_Product_Code

    При проектировании структуры кода, в условиях ещё не слишком развитой электроники, было важным сделать его как можно более простым для считывания сканером и упростить аппаратную часть самого сканера. Одной из сложностей была проблема вероятного считывания кода в обратном направлении, то есть считывания кода на товаре, который кассир поднёс к сканеру «вверх ногами». Поэтому очень важно было, чтобы чередование полос было одинаковым в обоих направлениях — сначала тёмный штрих, потом белый, потом опять тёмный и так далее.


    Много нюансов там, связанных с аппаратурой и человеческим фактором. Поэтому логика кодирования такая, немного странноватая.
    Ответ написан
    Комментировать
  • Как из html вытащить url по определенной маске?

    @abcd0x00
    Нужно выбрать все ссылки, а потом из них выбрать те, которые удовлетворяют критерию. Именно так, по частям, потому что как источник ссылок может поменяться независимо от критерия, так и критерий выбора может поменяться независимо от источника.
    Ответ написан
    Комментировать