Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as C# by zzz ( 14 years ago )
using System;
using System.Collections;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace TestForKontur
{
class Program
{
static void Main(string[] args)
{
try
{
StreamReader sr = new StreamReader(@"input.txt");
string buf = sr.ReadToEnd();
sr.Close();
//подготовка данных для сохранения
string wRes = string.Empty;
//извлечение пользовательских значений для поиска
ArrayList arrVar = new ArrayList();
Regex rexVar = new Regex(@"(?<var>[a-zA-Z]+.?)rn");
MatchCollection mVar = rexVar.Matches(buf);
for (int i = 0; i < mVar.Count; i++)
{
arrVar.Add(mVar[i].Groups["var"].Value);
}
foreach (string val in arrVar)
{
//заполнение массива данными о словах и их частоте встречаемости
//поиск похожих слов
Regex rex = new Regex(@"b" + val + @"(.+.[0-9]b)");
MatchCollection m = rex.Matches(buf);
//шаблон для получения значения слова(латинские буквы) и счетчика встречаемости
Regex pattern = new Regex(@"(?<word>w+?) (?<dig>.+.?)");
//если в словаре есть что то похожее на введеное пользователем
if (m.Count != 0)
{
string result = string.Empty;
//массив для хранения результата
//"слово" "счетчик частоты"
string[,] sArr = new string[m.Count, 2];
for (int i = 0; i < m.Count; i++)
{
//строка для разбиения (слово-счетчик)
result = m[i].Groups[0].Value;
//поиск по шаблону
MatchCollection mVal = pattern.Matches(result);
sArr[i, 0] = mVal[0].Groups["word"].Value;//string value
sArr[i, 1] = mVal[0].Groups["dig"].Value;//counter
}
//сортировка результата по убыванию частоты(метод пузырика)
for (int i = m.Count - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (int.Parse(sArr[i, 1]) > int.Parse(sArr[j, 1]))
{
int tmp = int.Parse(sArr[i, 1]);
string strTmp = sArr[i, 0];
sArr[i, 1] = sArr[j, 1];
sArr[i, 0] = sArr[j, 0];
sArr[j, 1] = tmp.ToString();
sArr[j, 0] = strTmp;
}
}
}
//если значений найдено больше одного
if (m.Count > 1)
{
//упорядочить по алфавиту, если счетчики одинаковые
//выбор строк с одинаковым значением счетчиков
ArrayList arr = new ArrayList();
//значение счетчика если есть повторения
string tmpСounter = string.Empty;
//ограничение количества если больше 10 то ограничиваем
int kol = 10 - 1;
//если меньше то берем текущее количество элементов
if (m.Count < 10)
{
kol = m.Count - 1;
}
//только первые 10 значений
for (int i = 0; i < kol - 1; i++)
{
if (sArr[i, 1] == sArr[i + 1, 1])
{
//установка нового значения счетчика
if (tmpСounter == string.Empty | tmpСounter != sArr[i, 1])
{
tmpСounter = sArr[i, 1];
//заполнение временного массива
for (int j = i; j < kol; j++)
{
if (sArr[j, 1] == tmpСounter)
arr.Add(sArr[j, 0]);
}
//сортировка массива в алфавитном порядке
arr.Sort();
//заполнение основного массива упорядочеными значениями
for (int p = 0; p < arr.Count; p++)
{
sArr[i + p, 0] = arr[p].ToString();
}
//очищаем массив от утсаревших данных
arr.Clear();
}
}
}
}
//количество элементов в массиве, если больше 10
//то выводим только 10 первых
int kolEl = m.Count;
if (m.Count > 10)
{
kolEl = 10;
}
//подготовка данных для сохранения
for (int i = 0; i < kolEl; i++)
{
wRes += "" + sArr[i, 0] + "rn";
}
wRes += "rn";
}
//если слова нет в словаре
else
{
wRes += "-rn";
}
}
//сохранить результат в файл
StreamWriter sw = new StreamWriter(@"output.txt");
sw.WriteLine(wRes);
sw.Close();
wRes = string.Empty;
}
//вывод сообщения о возникших ошибках
catch (Exception exp)
{
Console.WriteLine(exp.Message);
Console.ReadLine();
}
}
}
}
Revise this Paste