0

Есть текст. Нужно посчитать сколько было использовано слов. Пример:
Слово "The" использовалось 2 раза
Слово "promise" использовалось 3 раза
Слово "to" использовалось 4 раза
и т.д.
На данный момент моя программа считает только количество слов в тексте.

#include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <windows.h>
#define STRLEN 255

using namespace std;

int main(char ArrWord) { SetConsoleCP(1251); SetConsoleOutputCP(1251);

string path = &quot;file.txt&quot;;
ifstream Myfile;
Myfile.open(path);
if (!Myfile.is_open())
{
    cout &lt;&lt; &quot;Файл не открыт&quot; &lt;&lt; endl;
    return 0;
}
else
{
    cout &lt;&lt; &quot;Файл успешно открыт&quot; &lt;&lt; endl;
}
char str[STRLEN];
char * p;
int count_all, count_word;
count_all = count_word = 0;

while (!Myfile.eof())
{
    Myfile &gt;&gt; str;
    for (p = strtok(str, &quot; &quot;); p != NULL; p = strtok(NULL, &quot; &quot;)) {
        ++count_all;
    }
}
printf(&quot;Всего слов: %d\n&quot;, count_all);
system(&quot;pause&quot;);
return 0;

}

korlak
  • 27
  • while (!Myfile.eof()) - см. https://ru.stackoverflow.com/questions/833980/%d0%9f%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b8-%d0%ba%d0%be%d0%bd%d1%86%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0 Для подсчета количества слов используйте map. Но у вас слова разделяются только пробелами - это нормально? А знаки препинания? – Harry Jun 06 '21 at 18:33

1 Answers1

1

Привожу свою реализацию данной задачи. При желании ее достаточно просто модифицировать в соответствии со своими потребностями. Для решения я использовал контейнер map. Данные считываются из текстового файла(как в Вашей программе). В качестве результата, программа выводит слово и то количество раз, которое оно встречалось в тексте, а также общее число слов.

Ниже привожу реализацию на C++, который снабжен моими комментариями:

#include <iostream>
#include <fstream>
#include <map>
#include <string>
using namespace std;

//Проверяем, является ли символ знаком пунктуации bool check(char s){ return ( s == '.' or s == ',' or s == ':' or s == ';' or s == '?' or s == '!' or s == '"' or s == ')' or s == '(' ); }

//Вывод содержимого словаря на экран void show(map <string, int> m, int count_all){ map <string, int> :: iterator it = m.begin(); for (int i = 0; it != m.end(); it++, i++) { // выводим их cout << i << ". Word: " << it->first << " - used " << it->second << endl; } //cout << "========================"<< endl; cout << "Total word in this text: " << count_all << endl; } int main() { ifstream file("input.txt"); //считали файл, можно указать свой путь

//Используемые переменные string temp_word; map <string, int> word_stat; // словарь для хранения слов int count_all = 0; //общее число слов в тексте string text;

getline(file, text); //считываем текст из файла в строку

//Удалим все знаки пунктуации. Предполагается, что словами они не являются. for(int i=0; i < text.length(); i++){ if(check(text[i])) text[i] = ' '; } int i =0; while(i < text.length()){

string temp_word = &quot;&quot;;
//Ищем слово, ведь слова отделены теперь пробелами
if(text[i]!= ' '){
    while(text[i] != ' ' and i &lt; text.length()){
        temp_word = temp_word + text[i];
        i++;
    }
    word_stat[temp_word]++;
    count_all++;
}

i++;

}

show(word_stat, count_all);

}

Конечно, выше я описал довольно простой подход, который можно было бы улучшить, например, приводить слова к лемме(то есть начальной форме), чтобы слова ball & balls считались, как одно слово, но это уже совсем другая задача =)

2DAY
  • 109