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]. После чего, методом последовательного перебора слов в массиве указателей, выполняется поиск самого часто встречающегося слова во введённом тексте.
Введите текст: Can you can the can with can? Cамое часто встречающееся слово в тексте: CAN
Комментарии
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'; }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; }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; } }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]); }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 }