Отсортировать слова в порядке убывания частоты их встречаемости - 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;
}