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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5
Похожие ответы