Частотный анализ текста - C (СИ)

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

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

Доброго времени суток! Решаю задачу в С++ (среда Borland C++ 3.0)

Дан файл, содержащий текст, набранный заглавными английскими буквами. В нем содержатся также знаки препинания. Провести частотный анализ текста, т.е. указать (в процентах) сколько раз встречается та или иная буква.

Моё видение алгоритма: 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();
}
И второй вопрос, предстоит решение задач по структурам, типа: Дан файл Assort, содержащий сведения об игрушках: указывается название игрушки ее стоимость в рублях и возрастные границы (например, игрушка может предназначаться для детей от двух до пяти пет). Получить название самой дорогой игрушки, подходящей детям двух-трех лет. На паскале, используя записи, такое решал, на С++ ещё не касался, со структурами(объявление) всё понятно, а вот как они взаимодействуют с файлом, читал, что это реализуется потоками , так ли это , и в какую сторону копать ?

Решение задачи: «Частотный анализ текста»

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;
}

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

  1. Включаем необходимые заголовочные файлы для работы с потоками и манипуляциями с выводом.
  2. Объявляем константы, которые будут использоваться в программе: start=32, size=128.
  3. Объявляем переменную типа char для хранения очередного символа из файла.
  4. Объявляем массив типа int с размером 128 для подсчета количества вхождений каждого символа.
  5. Открываем файл 1.txt в бинарном режиме для чтения.
  6. Проверяем, что файл успешно открылся, иначе выводим сообщение об ошибке и завершаем программу.
  7. Считываем каждый символ из файла и увеличиваем счетчик в соответствующей ячейке массива.
  8. Инициализируем переменную cnt_char для подсчета общего количества символов.
  9. Выводим таблицу с количеством вхождений каждого символа в виде процентов от общего количества символов.
  10. Завершаем программу успешно.

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


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

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

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