Самое часто встречающееся слово в тексте

Уровень сложности:

Нужно найти самое часто встречающееся слово в тексте. Текст должен содержать не более 1000 символов. Вывод должен быть в UPPER CASE (верхний регистр). Написать функцию void mostRecent(char *text,char *word).

Параметр char *word должен возвращать самое часто встречающееся слово, например:
ВВОД: Can you can the can with can?
Вывод: CAN

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

#include "stdafx.h"
#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]); // возвращаем результат поиска самого часто встречающегося слова
}

Вводим текст в программу, причём количество символов не может быть больше 1000. В случае, если будет введено больше 1000 символов, в символьном массиве buff_text[1000] сохранятся только 1000 символов. Для искомого слова объявлен символьный массив word [30], таким образом максимальная длинна слова не должна превышать 29 символов. В строках 19 -20 выполняется преобразование найденного слова в верхний регистр. В функции mostRecent(), сначала  массив с текстом разбивается на слова, которые сохраняются в массив указателей на строки arrayPtr[1000]. После чего, методом последовательного перебора слов в массиве указателей, выполняется поиск самого часто встречающегося слова во введённом тексте.

CppStudio.com
Введите текст:
Can you can the can with can?
Cамое часто встречающееся слово в тексте: CAN
Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 11.09.2012
Поделиться:

Комментарии

  1. Lee Amstrong

    #include <iostream>
    #include <string>
    #include <regex>
    #include <iterator> //transform
    #include <map> //std::map
    
    int main() {
      std::map<std::string, int> word_counter;
      std::cout << "Text: ";
      std::string text;
      std::getline(std::cin, text);
      std::regex reg("\\w+");
      for (auto it = std::sregex_iterator(text.begin(), text.end(), reg); it != std::sregex_iterator(); ++it) {
        std::string word = (*it)[0];
        transform(word.begin(), word.end(), word.begin(), ::toupper);
        word_counter[word]++;
      }
      std::pair<std::string, int> max("",0);
      for (auto& pair : word_counter) {
        if (max.second <= pair.second) {
          max = pair;
        }
      }
      std::cout << max.first << " " << max.second << " times" << '\n';
    }
  2. Arthur

    #include<iostream>
    #include<stdio.h.>
    #include<cstring>
    #include <Windows.h>
    
    using namespace std;
    const int MAXT = 1000;                        //максимальная длина текста
    const int MAXW = 50;                          //максимальная длина слова, и количество макс повторяющихся слов
    void mostRecent(char*, char**, int&, int&  ); //функция поиска повторяющихся слов
    
    int main()
    {
        setlocale(LC_CTYPE,"rus");
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
    
        char text[MAXT];
        char *words[MAXW];      //массив для хранения слов
        for(int x = 0; x<MAXW; x++)
            words[x] = new char[MAXW];
        int numwords = 0;       //число максимально повторяющихся слов
        int maxw   = 0;         //максимальное число повторений
    
        cout<<"Введите строку: "<<endl;
        gets(text);
    
        mostRecent(text, words, numwords, maxw);
        if(numwords != 0)
        {
            cout<<"Самое часто встречающееся слово: ";
            for(int x = 0; x<numwords; x++)
              {
              cout<<endl;
              for(int i = 0; i<strlen(words[x]); i++)
              cout<<(char)toupper(words[x][i]);
              }
            cout<<"\nЧисло повторений в тексте: "<<maxw<<endl;
        }
        else
            cout<<"Не одно слово не встречается чаще других"<<endl;
    
    
      return 0;
    }
    void mostRecent(char *text, char**words, int& numwords, int& maxw)
    {
        char tempword[MAXW] ;         //слово с которым будем сравниваться word
        int ch1 = 1;                  //счетчик подсчета повторений слова в тескте
        int ch2 = 0;
        char word[MAXW];              //слово из текста
        int chword  = 0;              //количество слов в тексте
    
        int lens = strlen(text);      //длина текста
        int x   = 0;
        for( x; x<lens; x++ )
          {
           int y = 0; ch1 = 1;
           while(isalpha(text[x]))    //нахождение слов в тексте
                     word[y++] = text[x++];
           word[y] = '';
    
           if(y)
            {
                chword++;
    
                for( int j = x; text[j]!=''; j++ )
                {
                 int n = 0;
                 while(isalpha(text[j]))
                      tempword[n++] = text[j++];
                 tempword[n] = '';
    
                 if( n && !stricmp(word, tempword)  )
                     ch1++;
                }
            }
                 if(ch1>=maxw && ch1 != 1)
                 {
                       if(ch1>maxw)
                          maxw = ch1;
    
                       if(  maxw>ch2  )
                         numwords=0;
    
                       ch2 = ch1;
                       strcpy(words[numwords++],word);
                 }
          }
    
        if( chword - numwords*maxw == 0)
            numwords = 0;
    }
  3. Arthur

    #include<iostream>
    #include<stdio.h.>
    #include<cstring>
    #include <Windows.h>
    using namespace std;
    
    void mostRecent(char *text,char *word);
    
    int main()
    {
        setlocale(LC_CTYPE,"rus");
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
    
        char text[1000];
        char word [50] ;
    
        cout<<"Введите строку: "<<endl;
        gets(text);
        mostRecent(text,word);
    
      return 0;
    }
    void mostRecent(char *text,char *word)
    {
        char tempword[50] ; //слово с которым будем сравниваться word
        char recword[50] ;//самое часто встречающееся слово
        int ch1=1; int ch2 =1; //счетчики
        int x = 0;
    
        for( x; text[x]!=''; x++ )
        {
           int y = 0; ch1 = 1;
           while(isalnum(text[x]))  //последовательно вытаскиваем слова из текста
           {
              word[y] = text[x]; y++; x++;
              word[y] = '';
           }
            if(y)                                     //если слово найдено
              for( int j = x; text[j]!=''; j++ ) //вытаскиваем все последующие за ним слова
                {
                 int n = 0;
                 while(isalnum(text[j]))
                   {
                    tempword[n] = text[j]; n++; j++;
                    tempword[n] = '';
                   }
                 if( n && !stricmp(word, tempword)  ) //каждое последующее слово за word сравнивается с word
                    {                             //без учета регистра
                     ch1++;                       //если нашли одинаковое слово инкременируем счетчик
                     if(ch1>ch2)                  //если слово встречается чаще предыдущих слов
                        {
                         strcpy(recword, word);     //копируем его в  recword
                         ch2 = ch1;                 //фиксируем сколько раз встретилось это слово
                        }
                    }
                }
    }
      if(ch2 == 1)
        cout<<"Не одно слово не встречается чаще других"<<endl;
      else
      {
        cout<<"Самое часто встречающееся слово: ";
         for(int i = 0; i<strlen(recword); i++)
          cout<<(char)toupper(recword[i]);
        cout<<"\nЧисло повторений в тексте: "<<ch2<<endl;
      }
    }
    
    
  4. inf926t

    void mostRecent(char *text, char *word){
        int textSz=strlen(text);
    
        int wordsCount=1;
        for(int i=0;i<textSz;i++)
            if(text[i]==' ')
                wordsCount++;
    
        char **words=new char*[wordsCount];
        for(int i=0;i<wordsCount;i++)
            words[i]=new char[20];  //20 - максимальная длина слова.
        int *frequency=new int[wordsCount];
        for(int i=0;i<wordsCount;i++)
            frequency[i]=1;
    
        wordsCount=0;
        int countInCurrentWord=0;
        //Запись каждого слова в отдельную ячейку массива words[]
        for(int i=0;i<=textSz;i++){
            if(text[i]=='.'){
                i++;
                wordsCount++;
                countInCurrentWord=0;
                continue;
            }
            if((text[i]==' ') || (i==textSz)){
                countInCurrentWord++;
                words[wordsCount][countInCurrentWord]='';
                wordsCount++;
                countInCurrentWord=0;//to lower case
                continue;
            }
            if((text[i]==',') && (text[i+1]==' ')){
                countInCurrentWord++;
                words[wordsCount][countInCurrentWord]='';
                wordsCount++;
                countInCurrentWord=0;
                i++;
                continue;
            }
            //Можно добавить другие условия разделения слов.
            if((text[i]>=65)&&(text[i]<=90))    //to lower case
                words[wordsCount][countInCurrentWord]=text[i]+32;   //'A'-'a'=32
            else
                words[wordsCount][countInCurrentWord]=text[i];
            countInCurrentWord++;
        }
        //Определение частоты слов.
        for(int i=0;i<wordsCount;i++)
            for(int j=i+1;j<wordsCount;j++){
                if(words[j][0]=='')
                    continue;
                if((strcmp (words[i],words[j])==0)){
                    frequency[i]++;
                    frequency[j]=0;
                    words[j][0]='';
                }
            }
        //Поиск наиболее часто встречающегося.
        int iMax=0;
        for(int i=0;i<wordsCount-1;i++)
            if(frequency[iMax]<frequency[i+1])
                iMax=i+1;
        //Запись в word.
        int i;
        for(i=0;i<strlen(words[iMax]);i++)
            word[i]=words[iMax][i];
        word[i]='';
    
        delete(frequency);
        for(i=0;i<wordsCount;i++)
                delete(words[i]);
    }
  5. petruska

    petruska

    Мой вариант,интерфейс функции не тот,но если надо можно легко конвектировать в нужние параметры

    #include "stdafx.h" // here all libs
    #define SIZE 1000
    
    string FuncMostComWord(char text[]);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	// enter text
    	char text[SIZE];
    	cout << "Enter text:";
    	cin.getline(text,SIZE);
    
    	cout << "The most common words is: " <<FuncMostComWord(text) <<endl; // call and show function
    	return 0;
    }
    
    
    string FuncMostComWord(char text[])
    {
    	int size=1;
    	for (int i=0; i < SIZE; i++) // set size for dynamic array with strings(words)
    	{
    		if (text[i] == ' ')
    			size++;
    	}
    
    	string * data=new string[size];
    
    	char * pch = strtok (text," ,.-:"); // use strtok function for separation words and save on dynamic array
    	int index=0;
        while (pch != NULL) 
        {
    		data[index]=pch;
            pch = strtok (NULL, " ,.-:");
    		index++;
        }
    
    	//algorithm like find max value on array,but use MostComWord like temp variable
    	string MostComWord;
    	int nCout=0,MAX=1; // MAX =1 for program don't enter to cycle excess time
    	for (int i=0; i < size; i++)
    	{
    		nCout=0;
    		for (int j=0; j < size; j++)
    		{
    			if ( data[i] == data[j])
    				nCout++;
    		}
    
    		if (nCout > MAX)
    		{
    			MAX=nCout;
    			MostComWord=data[i];
    		}
    
    	}
    
    	if ( MAX == 1) 
    		MostComWord="All words met only one time!"; 
    
    	delete []data; // delete dynamic array
    
    	// convert final string to upper case,use transform func in algorithm library
    	transform(MostComWord.begin(), MostComWord.end(), MostComWord.begin(), ::toupper);
    
    	return MostComWord; // return resolt
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.