По текстовому файлу составить статистику частоты появления символов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

По текстовому файлу составить статистику частоты появления символов и записать в файл в порядке убывания. Я написал так что бы каждый символ записывался в массив как только встретиться и выводится на экран сколько раз встретился, но потом обнаружил что записывает так же переход на новую строку и сдвиг каретки (вроде). мне сказали что нужно что бы строка читалась до /n, я записал так (c == "\n" || c == -52) но не помогло, подскажите как исправить чтобы выводил и записывал только символы, без остального. Пожалуйста
#include <stdio.h>
 
void main(void)
{
    int s[256][2], i, j, yes;
    char line[1024];
    FILE *f, *ff;
    f = fopen("C:\\Users\\Nikita\\Desktop\\source.txt", "rt");
    if (f == NULL)
    {
        printf("Opening error");
        getch();
        return;
    }
    ff = fopen("C:\\Users\\Nikita\\Desktop\\dest.txt", "wt");
    while (!feof(f))
    {
        fgets(line, 1024, f);
        for (i = 0; i < 1024; i++)
        {
            char c = line[i];
            if (c == "\n" || c == -52)
                break;
            for (j = 0; j < 256; j++)
            {
                if (((char)s[j][0]) == c) {
                    s[j][1]++;
                    printf("%3i - %c\n", c, ((int)c));
                    break;
                }
                if (((char)s[j][0]) == ((char)-52))
                {
                    s[j][0] = c;
                    s[j][1] = 1;
                    printf("%3i - %c\n", c, ((int)c));
                    break;
                }
            }
 
        }
    }
    fclose(f);
    yes = 0;
    for (i = 0; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            if (((char)s[j + 1][0]) == ((char)-52)) {
                break;
            }
            if (s[j][1] < s[j + 1][1])
            {
                int temp[2] = { s[j][0], s[j][1] };
                s[j][0] = s[j + 1][0];
                s[j][1] = s[j + 1][1];
                s[j + 1][0] = temp[0];
                s[j + 1][1] = temp[1];
                yes = 1;
            }
        }
        if (yes == 0)
        {
            break;
        }
        yes = 0;
    }
    for (i = 0; i < 256; i++)
    {
        if (s[i][0] == -858993460)
            break;
        printf("'%c' - %i times\n", s[i][0], s[i][1]);
        fprintf(ff, "'%c' - %i times\n", s[i][0], s[i][1]);
    }
    fclose(ff);
    getch();
}

Решение задачи: «По текстовому файлу составить статистику частоты появления символов»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define N 96   //количество символов в таблице ANSII начиная с пробела
int main()
{
    FILE *f1;
    if(!(f1 = fopen("file1.txt", "r"))){
        fprintf(stderr, "Error opening file");
        exit(1);
    }
    int i, c, A[N][2], x = 32;
    for(i = 0; i < N; ++i, ++x){//создаем двумерный массив,в первом столбце символы ANSII начиная с 32-го,т.е. с пробела
        A[i][0] = x;        //во второй будем заносить количество появлений в тексте данного символа
        A[i][1] = 0;
    }
    while((c = fgetc(f1)) != EOF){
        for(i = 0; i < N; ++i){
            if(c == A[i][0])
                A[i][1]++;
        }
    }
    for(i = 0; i < N - 1; ++i)//сортируем на убывание
        for(int j = N - 2; j >= i; --j)
            if(A[j][1] < A[j + 1][1]){
                for(int m = 1; m >= 0; --m){
                    c = A[j][m];
                    A[j][m] = A[j + 1][m];
                    A[j + 1][m] = c;
                }
            }
    for(i = 0; i < N; ++i)
        if(A[i][1] != 0)
            printf("%c %d\n", A[i][0], A[i][1]);
    fclose(f1);
    return 0;
}

Объяснение кода листинга программы

  1. Подключаются необходимые библиотеки
  2. Определяется количество символов в таблице ANSII
  3. Открывается файл для чтения
  4. Создается двумерный массив для хранения статистики
  5. Заполняются оба столбца массива
  6. В цикле считываются символы из файла
  7. По каждому символу обновляется соответствующее поле во втором столбце массива
  8. Два вложенных цикла используются для сортировки массива по убыванию количества появлений символа
  9. Выводится отсортированный список символов и их частоты появления
  10. Файл закрывается
  11. Программа завершается

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

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