По текстовому файлу составить статистику частоты появления символов - 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; }
Объяснение кода листинга программы
- Подключаются необходимые библиотеки
- Определяется количество символов в таблице ANSII
- Открывается файл для чтения
- Создается двумерный массив для хранения статистики
- Заполняются оба столбца массива
- В цикле считываются символы из файла
- По каждому символу обновляется соответствующее поле во втором столбце массива
- Два вложенных цикла используются для сортировки массива по убыванию количества появлений символа
- Выводится отсортированный список символов и их частоты появления
- Файл закрывается
- Программа завершается
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д