Я пытаюсь подсчитать количество триграмм или последовательностей из трех букв в блоке текста. У меня уже есть код, который успешно подсчитывает количество биграмм (двухбуквенная последовательность) с использованием двумерного массива, но у меня возникли проблемы с его изменением для приема триграмм.
#include <stdio.h>
int main(void) {
int count['z' - 'a' + 1]['z' - 'a' + 1] = {{ 0 }};
int c0 = EOF, c1;
FILE *plain = fopen("filename.txt", "r");
if (plain != NULL) {
while ((c1 = getc(plain)) != EOF) {
if (c1 >= 'a' && c1 <= 'z' && c0 >= 'a' && c0 <= 'z') {
count[c0 - 'a'][c1 - 'a']++;
}
c0 = c1;
}
fclose(plain);
for (c0 = 'a'; c0 <= 'z'; c0++) {
for (c1 = 'a'; c1 <= 'z'; c1++) {
int n = count[c0 - 'a'][c1 - 'a'];
if (n) {
printf("%c%c: %d\n", c0, c1, n);
}
}
}
}
return 0;
}
Изменить: вот код, который я уже пробовал. Я надеялся просто расширить массив 2d до массива 3d, но это ничего не возвращает.
#include <stdio.h>
int main(void) {
int count['z' - 'a' + 1]['z' - 'a' + 1]['z' - 'a' + 1] = {{{ 0 }}};
int c0 = EOF, c1, c2;
FILE *plain = fopen("filename.txt", "r");
if (plain != NULL) {
while ((c1 = getc(plain)) != EOF) {
if (c1 >= 'a' && c1 <= 'z' && c0 >= 'a' && c0 <= 'z' && c2 >= 'a' && c2 <= 'z') {
count[c0 - 'a'][c1 - 'a'][c2 - 'a']++;
}
c0 = c1;
c1 = c2;
}
fclose(plain);
for (c0 = 'a'; c0 <= 'z'; c0++) {
for (c1 = 'a'; c1 <= 'z'; c1++) {
for (c2 = 'a'; c2 <= 'z'; c2++) {
int n = count[c0 - 'a'][c1 - 'a'][c2 - 'a'];
if (n) {
printf("%c%c%c: %d\n", c0, c1, c2, n);
}
}
}
}
}
return 0;
}
Например, этот код выводит все вхождения биграмм, таких как aa, ab, ac и т. д. Но мне нужно, чтобы он подсчитывал вхождения aaa, aab, ... zzz. Любая помощь будет принята с благодарностью!
Редактировать 2: теперь он успешно печатает правильный вывод, но он должен быть в порядке убывания (наиболее часто используемая триграмма вверху)
aaa
вaaaa
? - person Eugene Sh.   schedule 11.09.2019c1 = getc(plain)
- вы перезаписываете сохраненныйc1
. Я думаю, что вы хотите прочитать вc2
- person Eugene Sh.   schedule 11.09.2019strstr
, чтобы найти количество всех триграмм - person Miradil Zeynalli   schedule 11.09.2019struct
, если вы собираетесь эффективно переупорядочивать их (или иметь два шага). - person Neil   schedule 12.09.2019