Что делает "главная" функция в markov.c?

Вот код с комментариями, которые я добавил, пытаясь выяснить, что он делает:

int main()
{   int i, wordsleft = 10000, l, m, u;
    char *phrase, *p;
    word[0] = inputchars;
    // (1) ---------------------------------------------------------------------
    while (scanf("%s", word[nword]) != EOF) {
        word[nword+1] = word[nword] + strlen(word[nword]) + 1;
        nword++;
    }
    // (2) ---------------------------------------------------------------------
    for (i = 0; i < k; i++)
        word[nword][i] = 0;
    // (3) ---------------------------------------------------------------------
    for (i = 0; i < k; i++)
        printf("%s\n", word[i]);
    qsort(word, nword, sizeof(word[0]), sortcmp);
    phrase = inputchars;
    // (4) ---------------------------------------------------------------------
    for ( ; wordsleft > 0; wordsleft--) {
        l = -1;
        u = nword;
        // (5) -----------------------------------------------------------------
        while (l+1 != u) {
            m = (l + u) / 2;
            if (wordncmp(word[m], phrase) < 0)
                l = m;
            else
                u = m;
        }
        // (6) -----------------------------------------------------------------
        for (i = 0; wordncmp(phrase, word[u+i]) == 0; i++)
            if (rand() % (i+1) == 0)
                p = word[u+i];
        phrase = skip(p, 1);
        // (7) -----------------------------------------------------------------
        if (strlen(skip(phrase, k-1)) == 0)
            break;
        printf("%s\n", skip(phrase, k-1));
    }
    return 0;
}

Ниже приведено объяснение того, что, по моему мнению, происходит в коде и может быть неверным:

  1. Программа получает список слов и сохраняет их в word, Переменная inputchars используется в качестве буфера для входящих строк.
  2. Каждая строка в стиле C в word в настоящее время прекращается.
  3. Все захваченные слова выводятся на экран.
  4. Цикл пытается распечатать 10000 случайных слов.
  5. Выполняется поиск следующего слова, которое появляется в цепочке марков.
  6. Слово выбирается случайным образом, если оно является частью текущей ссылки в цепочке.
  7. Если в программе заканчиваются слова, она выходит преждевременно.

Может ли кто-нибудь исправить мои комментарии и объяснить, что происходит в программе? Было бы неплохо добавить некоторую документацию к этому коду для всех, кто может столкнуться с ним в будущем и с трудом понимает его, как я.


С полной программой можно ознакомиться здесь: http://9p.io/cm/cs/pearls/markov.c

Редактировать:

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

  1. заполнить inputchars с завершенными нулем строками C до конца файла. word массив, который указывает на каждое отдельное слово в inputchars,
  2. Создайте дозорное слово, обозначающее конец word массив.
  3. Напечатайте первые два слова из word массив. Кроме того, оставить inputchars без изменений, но сортировать указатели в word массив в соответствии с обычными правилами сортировки.

0 ответов

Другие вопросы по тегам