Что делает "главная" функция в 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;
}
Ниже приведено объяснение того, что, по моему мнению, происходит в коде и может быть неверным:
- Программа получает список слов и сохраняет их в
word
, Переменнаяinputchars
используется в качестве буфера для входящих строк. - Каждая строка в стиле C в
word
в настоящее время прекращается. - Все захваченные слова выводятся на экран.
- Цикл пытается распечатать 10000 случайных слов.
- Выполняется поиск следующего слова, которое появляется в цепочке марков.
- Слово выбирается случайным образом, если оно является частью текущей ссылки в цепочке.
- Если в программе заканчиваются слова, она выходит преждевременно.
Может ли кто-нибудь исправить мои комментарии и объяснить, что происходит в программе? Было бы неплохо добавить некоторую документацию к этому коду для всех, кто может столкнуться с ним в будущем и с трудом понимает его, как я.
С полной программой можно ознакомиться здесь: http://9p.io/cm/cs/pearls/markov.c
Редактировать:
Я хотел бы пересмотреть свои комментарии после просмотра некоторого кода с другим программистом. Первоначальные комментарии остаются нетронутыми как документация о достигнутом прогрессе при работе с кодом, который некоторым может показаться довольно запутанным.
- заполнить
inputchars
с завершенными нулем строками C до конца файла.word
массив, который указывает на каждое отдельное слово вinputchars
, - Создайте дозорное слово, обозначающее конец
word
массив. - Напечатайте первые два слова из
word
массив. Кроме того, оставитьinputchars
без изменений, но сортировать указатели вword
массив в соответствии с обычными правилами сортировки.