Частотный анализ текста - C (СИ)
Формулировка задачи:
Доброго времени суток!
Решаю задачу в С++ (среда Borland C++ 3.0)
И второй вопрос, предстоит решение задач по структурам, типа:
Дан файл Assort, содержащий сведения об игрушках: указывается название игрушки ее стоимость в рублях и возрастные границы (например, игрушка может предназначаться для детей от двух до пяти пет). Получить название самой дорогой игрушки, подходящей детям двух-трех лет.
На паскале, используя записи, такое решал, на С++ ещё не касался, со структурами(объявление) всё понятно, а вот как они взаимодействуют с файлом, читал, что это реализуется потоками , так ли это , и в какую сторону копать ?
Дан файл, содержащий текст, набранный заглавными английскими буквами. В нем содержатся также знаки препинания. Провести частотный анализ текста, т.е. указать (в процентах) сколько раз встречается та или иная буква.
Моё видение алгоритма: 1 Создаём массив , содержащий английский алфавит заглавными буквами; 2 Открываем файл для чтения; 3 Делаем цикл for по массиву с алфавитом; 4 Внутри этого цикла проходим посимвольно содержимое файла; 5 При совпадении символов увеличиваем временную переменную 6 Дойдя до конца файла, выводим процент по формуле (временная переменная * 100)/ на количество букв в файле. 7 Повторяем цикл снова , перейдя на следующий элемент массива Вот мой код (работает с ошибками), есть подозрение что нужно делать цикл прохождения по массиву внутри цикла прохождения по файлу, а не как у меня:#include <stdio.h> #include <conio.h> #include <iostream.h> #include <string.h> #include <stdlib.h> void main() { int ch,g=0,p=0; char chs[]={'A','B','C','D','E','F','G','H','I','K','L','M','N','O','P', 'Q','R','S','T','V','X','Y','Z' }; int i=0; FILE *f; f=fopen("18.txt","r+"); fseek(f,0,SEEK_SET); // вывожу содержимое файла if (f==NULL) {cout << "File not found";} else { do { ch=fgetc(f); cout << char(ch); } while (ch!=EOF); fclose(f); } f=fopen("18.txt","r+"); fseek(f,0,SEEK_SET); for (i=0;i<23;i++) { //Прохожу по файлу с сопоставлением символов while (ch!=EOF) { ch=fgetc(f); cout<< char(ch); p++; if (char(ch)==chs[i]) { g++; cout <<"("<< chs[i]<<")"<<"["<< g<<"]"; } } ch++; //while (ch!=EOF); } fclose(f); // Вывожу количество букв cout << "\n\nKol vo :" << p; getch(); clrscr(); }
Решение задачи: «Частотный анализ текста»
textual
Листинг программы
#include <iostream> #include <fstream> #include <iomanip> int main() { const int start=32; const int size=128; char ch; int mas[size]={}; std::ifstream in("1.txt", std::ios::out | std::ios::binary); if (!in){ std::cout<<"error open file"; return EXIT_FAILURE; } while (in.get(ch)) ++mas[(int)ch]; //count symbols int cnt_char=0; for (int i = start; i < size; ++i) cnt_char+=mas[i]; //table std::cout<<"__ Frequency of characters in the percentage __"<<std::endl<<std::endl; for (int i = start; i < size; ++i){ if ( mas[i] ) std::cout<<(char)i<<" --> "<<(float)(mas[i]*100)/(float)cnt_char<<"%"<<std::endl; } return EXIT_SUCCESS; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с потоками и манипуляциями с выводом.
- Объявляем константы, которые будут использоваться в программе: start=32, size=128.
- Объявляем переменную типа char для хранения очередного символа из файла.
- Объявляем массив типа int с размером 128 для подсчета количества вхождений каждого символа.
- Открываем файл
1.txt
в бинарном режиме для чтения. - Проверяем, что файл успешно открылся, иначе выводим сообщение об ошибке и завершаем программу.
- Считываем каждый символ из файла и увеличиваем счетчик в соответствующей ячейке массива.
- Инициализируем переменную cnt_char для подсчета общего количества символов.
- Выводим таблицу с количеством вхождений каждого символа в виде процентов от общего количества символов.
- Завершаем программу успешно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д