Поиск 20 слов (1119549)
Текст из файла
// Поиск 20 слов. алгоритм работы:
// делаем 2 таблицы (массива) на 20 элементов для слов и их частот, соответственно Words[] и Freqs[].
// Ещё храним две переменные: текущая длина таблиц (Length, первоначально = 0),
// и Индекс_Минимального_Элемента (MinIndex) в таблице частот.
//
// ход работы: Идём по множеству, вынимаем из него очередное слово (w) и его частоту (number).
// 1. если таблица ещё не заполнилась, т.е. Length < 20, то просто добавляем найденное слово
// в таблицу слов и его частоту -- в таблицу частот на первое свободное место, т.е. по индексу Length,
// При этом мы обновляем индекс минимального элемента, т.е. если новое слово имеет меньшую частоту,
// чем Freqs[MinIndex], то MinIndex = Length. После всего этого увеличивем Length на 1 (расширяем таблицу).
// 2. если таблица заполнена, и новое слово имеет бОльшую частоту, чем самое редкое из имеющихся в таблице
// (именно для этого мы и храним MinIndex), то нужно заменить это слово и его частоту в таблицах,
// после чего заново найти минимальный элемент в таблице частот.
//
// Таким образом, сначала таблица просто заполнится первыми 20-ю словами из множества,
// а потом самые редкие слова будут замещаться новыми. В общем, всё не так уж сложно,
// остается вывести их в порядке убывания частот. Сортировку делать лень, поэтому поступим проще:
// организуем цикл по таблице частот, в нём (с помощью вложенного цикла) находим максимальный элемент
// и его индекс MI, печатаем MI-тое слово из таблицы, а затем обнуляем частоту MI-того слова (Freqs[MI]=0;).
// Фактически, мы при этом "вычёркиваем" слово из таблицы, и при следующем проходе его учитывать не будем.
// Вот, кажется, и всё. With best regards, DMVN Corp.
int main(int argc, char *argv[])
{
...
while (!endOfFileDetected)
{ int c = fgetc(input);
if (isalpha(c)) { CurrentWord += c; wasLetter = true; }
else
{
if (wasLetter)
{
if (set.contains(&CurrentWord)) { Integer* val = (Integer*) set.value(&CurrentWord); ++(val->number); }
else { Integer unit(1); set.add(&CurrentWord, &unit); }
CurrentWord.initialize();
}
wasLetter = false; endOfFileDetected = (c == EOF);
}
}
printf("File reading completed.\n");
// Изменения начинаются с этой строки =================================================
const int NW = 20; // Количество самых частых слов
int Freqs[NW]; // Массив частот самых частых слов
Word Words[NW]; // Массив самих этих слов
int Length = 0; // Текущая длина массивов Freq и Words
int MinIndex = 0;
for (int j = 0; j < NW; j++) Freqs[j] = 0; // Инициализация нулями
HashSet::const_iterator i = set.begin();
HashSet::const_iterator e = set.end();
while (i != e)
{
const HashSet::Pair& pair = *i;
// Вынимаем слово и его частоту из множества
const Word* w = (const Word *) pair.key; // слово...
int number = ((const Integer *) pair.value)->number; // ...и его частота
if (Length < NW) // Если массив ещё не заполнен, заполняем ешё одну ячейку
{ // Length указывает на первую пустую ячейку
Words[Length] = *w; Freqs[Length] = number;
// теперь обновим минимальную частоту (она может, конечно, и остаться прежней)
if (number < Freqs[MinIndex]) MinIndex = Length;
Length++; // увеличиваем текущую длину
}
else // А если массив заполнен, то "вытесняем" самое редкое слово из уже найденных,
{ // если новое слово встречается чаще, чем самое редкое из имеющихся.
Words[MinIndex] = *w; Freqs[MinIndex] = number;
// а теперь надо заново найти самое редкое слово в обновлённом массиве:
int NewMinIndex = 0; int NewMinValue = 2147483647;
for (int j = 0; j < NW; j++) if (Freqs[j] < NewMinValue) { NewMinValue=Freqs[j]; NewMinIndex=j; }
MinIndex = NewMinIndex;
}
++i;
}
// Упорядоченный вывод
for (int j = 0; j < Length; j++)
{
int MI = 0; // индекс максимума
int M = 0; // максимум
for (int k = 0; k < Length; k++) if (Freqs[k] > M) { MI = k; M = Freqs[k]; } // поиск максимального
printf("Word: %s \t\tfrequency: %d.\n", Words[MI].getString(), Freqs[MI]);
Freqs[MI] = 0; // вычёркиваем
}
return 0;
}
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















