Отсортировать слова в порядке убывания частоты их встречаемости - C (СИ)
Формулировка задачи:
Вообщем задача такова: Первый файл содержит текст, который под-
лежит анализу(Анализ провел успешно) Второй файл необходимо создать, и записать все слова, встретившиеся в тексте с указанием частоты появления(Сделано) Вот собственно само задание: расположить слова в порядке убывания частоты их встречаемости.
Решение задачи: «Отсортировать слова в порядке убывания частоты их встречаемости»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> //Удаляет из строки s1 все символы встречающиеся в строке s2 void squeeze (char s1[], char s2[]) { int i, j, k; for (i = k = 0; s1[i] != '\0'; i++) { for (j = 0; s2[j] != '\0' && s2[j] != s1[i]; j++); if (s2[j] == '\0') s1[k++] = s1[i]; } s1[k] = '\0'; } //приведение к нижнему регистру char to_lower(char *A) { if( A >= 'A' && A <= 'Z') return A + ('a' - 'A'); return A; } //длина строки int slen(char *p) { int i; for(i = 0; p[i] != '\0'; i++); return i; } //сравнение строк по алфавиту int sequal(char *s1, char *s2) { while ( *s1 && *s2 ){ if( *s1 < *s2 ) return -1; if( *s1 > *s2 ) return 1; ++s1; ++s2; } return *s1? -1 : *s2? 1 : 0;//если s1 то s2 иначе 0 } // поиск символа char *_strchr(char *A, char delim) { while ( *A && *A != delim ) A++; return ( *A ) ? (char*) A : 0; } // Разбиение строки на поля char *_strtok(char *A, char * delim) { char *H, *T, *R; if (A){ H = A; T = H + slen(H); for (R = H; R < T; R++) if (_strchr(delim, *R)) *R = '\0'; } while (! *H && H < T) H++; if (H >= T) return 0; else { R = H; H += slen(H); } return R; } /* Подсчитываем количество слов в тексте */ char word_count(char *A, int n) { int i; int k = 0; for (i = 0; i < n; i++){ if (A[i] == ' ' || A[i] == '\n' || A[i] == '\t') k++; } printf("\nKolichestvo slov v texste: %d \n", k + 1); } int main() { char *A; char delim = " "; char *ptr[260]; char sym[260] = { '.', ',', ':', ';', '!', '№', '^', '?', '#', '$', '%', '*', '|', '/', '\\', '~', '`', '"', '<', '>', '_', '-', '+', '=', '(', ')', '{', '}', '[', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\n'}; int n = 0; int i; FILE *file; FILE *file2; /* Открываем файл для подсчёта символов */ if((file = fopen("1.txt", "r")) == NULL){ puts("File not found!"); return 0; } /* Считаем количество символов до конца файла */ while(!feof(file)){ char tmp; if((fscanf(file,"%c", &tmp)) == 1){ n++; } } fclose(file); // n - file size printf("Kolichestvo simvolov N = %d \n \n", n); /* Выводим кол - во символов на экран */ A = malloc (sizeof (char) * (n + 1)); if((file = fopen("1.txt", "r")) == NULL){ /*Считываем символы из файла*/ puts("File not found!"); return 0; } for (i = 0; i < n; i++){ fscanf(file,"%c",&A[i]); /* Записываем символы из файла в массив */ //printf("%c", A[i]); } fclose(file); word_count(A, n);//Подсчитываем количество слов в тексте ////////////////////// /*приводим к нижнему регистру*/ i=0; while (A[i]!='\0') { A[i] = to_lower (A[i]); i++; } squeeze(A, sym);//Удаляет из строки s1 все символы встречающиеся в строке s2 //printf("\n%s ", A); char *a[n], *slovo[n], *t; int *kolichestvo; int j, q, sk, h = 0, d , f; t = malloc (sizeof (char) * (n + 1)); kolichestvo = malloc (sizeof (char) * (n + 1)); i = 0; t = _strtok (A," "); while (t != NULL){ a[i] = t; t = _strtok (NULL," "); i++; } for(j = 0; j < i; j++){ sk = 0; f = 0; // подсчитываем количесво одинаковых слов for(q = 0; q < i; q++){ if (sequal(a[j], a[q]) == 0) { sk++; } } //printf("%d ",sk); // если слово встречалось, то на экран не выводим for(d = 0; d < h; d++){ if (sequal(a[j], slovo[d]) == 0) { f++; } } //printf("%d ",f); if(f == 0){ slovo[h] = a[j];// в пустой массив записываем разбитый на слова текст kolichestvo[h] = sk; if(kolichestvo[h] > 1) h++; } //printf("%d ",h); } for(j = 0; j < h; j++){ printf("\nSlovo: %s", slovo[j]); printf(" (%d)", kolichestvo[j]); } ////////////////////// A[n] = '\0'; if ((file2 = fopen("2.txt", "w")) == NULL){ puts("File not found!"); return 0; } for(j = 0; j < h; j++){ if ((fprintf(file2, "\nSlovo: %s (%d)", slovo[j],kolichestvo[j] )) == NULL){ /* Записываем символы в новый файл */ puts("The file is not written!"); return 0; } } fclose(file2); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д