Здравствуйте! Дана задача которая выводит часто встречаемое слово в тексте: как в данном коде сделать счетчик количества появления слова в тексте и убрать ограничение на вводимый текст.
Код:
#include <iostream>
using namespace std;
void mostRecent(char *, char *); // прототип функции поиска часто встречающегося слова
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "rus"); // установка локалии
cout << "Введите текст:\n";
const int buff_size = 1001; // максимальное количество вводимых символов + позиция под '\0'
char buff_text[buff_size]; // символьный массив, который хранит введённый текст
char word[30]; // строка, в которй будет храниться искомое слово
mostRecent(gets(buff_text), word); // вызов функции поиска часто встречающегося слова
for (int counter = 0; counter < strlen(word); counter++)
word[counter] = toupper(word[counter]); // преобразование символов слова в верхний регистр
cout << "Cамое часто встречающееся слово в тексте: " << word << endl;
system("pause");
return 0;
}
void mostRecent(char * text, char *word) // функция поиска часто встречающегося слова
{
int words_counter = 0; // количество слов в тексте
char *arrayPtr[1000]; //массив указателей на строки, в которых будут храниться слова из текста
arrayPtr[0] = strtok(text, " "); // нулевому указателю присваеваем первое слово
// подсчёт количества слов во введённом тексте
while (arrayPtr[words_counter] != NULL) // пока в тексте есть слова
{
words_counter++; // инкремент счётчика слов
arrayPtr[words_counter] = strtok(NULL, " "); // очередное слово сохраняем в массиве
}
bool first_iter = true, // флаг определяющий этап первой итерации
go = false;
int max_number1 = 0, // количество слов
max_number2 = 0, // количество слов
max_word = 0, // индекс самого часто встречающегося слова
flag = 0; // флаг, подсчёта двух итераций
int index1, index2;
for (int counter1 = 0; counter1 < (words_counter - 1); counter1++) // перебор слов, начиная с первого и заканчивая предпоследним
{
flag++; // инкремент итераций
for (int counter2 = counter1 + 1; counter2 < words_counter; counter2++) // перебор слов, начиная со второго и заканчивая предпоследним
{
if (strcmp(arrayPtr[counter1], arrayPtr[counter2]) == 0) // сравниваем два слова
if (first_iter) // если первая итерация (то есть сюда заходим один раз)
{
max_number1++; // инкремент переменной, подсчитывающей количество одинаковых слов
first_iter = false; // меняем условие оператора if
index1 = counter1;
}
else
{
max_number2++; // инкремент переменной, подсчитывающей количество одинаковых слов
index2 = counter1;
}
}
if (flag == 2 || go) // если прошли две итерации, или поэлементный проход разрешён
{
if (max_number1 >= max_number2) // если количество первого слова больше количества второго слова
{
max_word = index1; // присваиваем индекс самого часто повторяющегося слова
}
else { max_word = index2; max_number1 = max_number2; } // присваиваем индекс самого часто повторяющегося слова и количество появления второго слова присваиваем переменной max_number1
flag = 0; // обнуляем счётчик итераций
go = true; // разрешить поэлементный проход
}
max_number2 = 0; // обнуляем накопленное количество появления второго слова
}
strcpy(word, arrayPtr[max_word]); // возвращаем результат поиска самого часто встречающегося слова
}