Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2017, 19:43   #1
lisica198808
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 64
По умолчанию частотный анализ текста

есть строка с текстом в файле .. нужно провести частотный анализ текста, т.е. просчитать с какой частотой появляется тот или иной символ в тексте.
необходимый символ находит.. но частоту не считает.не выводит сообщения о частоте и о том, сколько раз встречается символ в тексте. почему? что я намудрила?

Код:
// ch.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <locale.h>
#include <Windows.h>
using namespace std;
 
int main(int argc, char *argv[])
{   setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
	SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
    string alfabet = "абвгдежзийклмнопрстуфхцчшщъыьэюя";
        string s; //Строка считанная из файла
	char simvol;//запоминаем символ если нашли
	int dlina;//длина строки из файла
	int raz;
	float chastota;//частота символа
	
	cout<<"Текст из файла mess.txt: ";
	      setlocale(LC_ALL,"Russian");//Чтение файла
          ifstream in("mess.txt");
          getline(in,s);
          cout<<s;
		  dlina=s.length();
		  in.close();

     for (int i = 0; i < dlina; i++)//пока не закончится строка файла
	 { int raz=0; 
		 for (int index =0 ; index<32; index ++)
		{	 for (int ind =0 ; ind<32; ind ++)
		      {if (alfabet[index]==s[ind])//если символ строки равен символу алфавита\
			     
		            
		 {simvol=alfabet[index];//запоминаем его
	                  raz++;//и сколько раз он появляется в тексте
		             }
		          
		 cout<<"\nСимвол ";
		 // for (int index =0 ; index<32; index ++)
		  { cout<<simvol;}
		     }
         cout<<"встречается %i раз\n"<<raz<<endl;

	    }
	 chastota=float(100*raz/dlina);
	 cout<<"Частота появления символа="<<chastota<<endl;
	 }
	
	 system("pause");

}
lisica198808 вне форума Ответить с цитированием
Старый 28.03.2017, 22:28   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

А ну попробуй:

Код:
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <locale.h>
#include <Windows.h>
using namespace std;

int main(int argc, char *argv[])
{
	setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
	SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода

	string s;
	char simvol;//запоминаем символ если нашли
	int dlina;//длина строки из файла
	int chastota;//частота символа

	cout << "Текст из файла mess.txt: ";
	setlocale(LC_ALL, "Russian");//Чтение файла
	ifstream in("mess.txt");
	getline(in, s);
	cout << endl << s;
	dlina = s.length();
	in.close();
	
    //сначало пробелы (' ')
	chastota = 0;
	for (int i = 0; i < dlina; i++)
	{
		if (s[i] == ' ')
		{
			chastota++;
		}
	}
	if (chastota != 0)
	{
		cout << "\n\nСимвол - пробел" << ", частота его появления= " << chastota << endl;
	}
	
	//а теперь всё остальное
	for (int i = 0; i < dlina; i++)
	{
		chastota = 0;
		simvol = s[i];	
		for (int j = 0; j < dlina; j++)
		{
			if (simvol != ' ' && simvol == s[j])
			{
				chastota++;
				s[j] = ' ';
			}		
		}
		if (chastota != 0)
		{
			cout << "Символ " << simvol << ", частота его появления= " << chastota << endl;
		}
	}
	cout << endl;

	system("pause");
	return 0;
}
ura_111 вне форума Ответить с цитированием
Старый 28.03.2017, 22:59   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

У меня возник вопрос, а что, с массивом не ...?
1. Создать массив размерностью в алфавит.
2. Обнулить элементы массива.
3. Прочитать очередную строку текста.
4. Получить номер очередного символа ...
5. Инкремент соответствующего элемента массива.
6. Конец файла? Нет, к п.3
7. Подсчитали число всех символов - сумма элементов.
8. Вычислили и вывели частоту каждого элемента.

Так вроде прозрачнее будет.

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 28.03.2017, 23:05   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Так, что-ли?
(lisica198808, проверь и его).

Код:
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <locale.h>
#include <Windows.h>
using namespace std;

int main(int argc, char *argv[])
{
	setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
	SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
	string s;
	int dlina;//длина строки из файла
	cout << "Текст из файла mess.txt: ";
	setlocale(LC_ALL, "Russian");//Чтение файла
	ifstream in("mess.txt");
	getline(in, s);
	cout << endl << s;
	dlina = s.length();
	in.close();

	unsigned char simvol;//запоминаем символ если нашли
	int chastota[256];//частота символа

	for (int i = 0; i < 256; i++)
	{
		chastota[i] = 0;
	}
	 
	//сначало пробелы (' ')
	for (int i = 0; i < dlina; i++)
	{
		if (s[i] == ' ')
		{
			chastota[0]++;
		}
	}
	if (chastota[0] != 0)
	{
		cout << "\n\nСимвол - пробел" << ", частота его появления= " << chastota[0] << endl;
	}
	chastota[0] = 0;
	//а теперь всё остальное
	for (int i = 0; i < dlina; i++)
	{
		if (s[i] != ' ')
		{
			chastota[int('я') - int(s[i])]++;
			//chastota[abs(int(s[i]))]++;
		}
	}	
	for (int i = 255; i != -1; i--)
	{
		if (chastota[i] != 0)
		{
			cout << "Символ " << char(int('я') - i) << ", частота его появления= " << chastota[i] << endl;
		}
	}
	cout << endl;

	system("pause");
	return 0;
}
ura_111 вне форума Ответить с цитированием
Старый 29.03.2017, 00:08   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вот ещё вариантик:
Код:
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <locale.h>
#include <Windows.h>
using namespace std;

int main(int argc, char *argv[])
{
	setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
	SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
	string alfabet = "абвгдежзийклмнопрстуфхцчшщъыьэюя";
	string s; //Строка считанная из файла
	char simvol;//запоминаем символ если нашли
	int dlina;//длина строки из файла
	int raz;
	float chastota;//частота символа

	cout << "Текст из файла mess.txt: ";
	setlocale(LC_ALL, "Russian");//Чтение файла
	ifstream in("mess.txt");
	getline(in, s);
	cout << s;
	dlina = s.length();
	in.close();

	cout << "\n\n";
	for (int i = 0; i < 33; i++)//пока не закончится строка файла
	{
		simvol = alfabet[i];
		raz = 0;
		for (int j = 0; j < dlina; j++)//пока не закончится строка файла
		{
			if (simvol == s[j])//если символ строки равен символу алфавита\					     
			{
				raz++;//и сколько раз он появляется в тексте
			}
		}
		if (raz != 0)
		{
			cout << "символ " << simvol << " встречается " << raz << " раз\n";
		}
	}
	cout << "\n";
	
	system("pause");
	return 0;
}
ura_111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анализ текста REztor Microsoft Office Word 1 08.10.2015 08:14
Частотный словарь текста (Си) Taina Помощь студентам 6 20.06.2012 11:55
Частотный анализ текста(посимвольный) kestugar Помощь студентам 1 12.05.2011 23:04
Анализ текста DAV88 Помощь студентам 1 17.05.2010 12:35
частотный анализ текста kaizer131 Общие вопросы C/C++ 0 19.02.2010 09:36