Частотный анализ текста - 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 для подсчета общего количества символов.
- Выводим таблицу с количеством вхождений каждого символа в виде процентов от общего количества символов.
- Завершаем программу успешно.