2017-02-20 11 views
1

проблема, с которой я сталкиваюсь, заключается в том, что я не совсем уверен, как сбросить количество слов. Я создал поиск по словам, но когда я подсчитаю количество вхождений 10 разных слов, он останется тем же числом из первого слова, которое он считает. Я считаю, что проблема у меня, где я использую for петлюПроблема со входом счетного слова для нескольких слов

Выход

boy appeared 3 times 
Snape appeared 3 times 
Dumbledore appeared 3 times 
he appeared 3 times 
her appeared 3 times 
the appeared 3 times 
it appeared 3 times 
is appeared 3 times 
will appeared 3 times 
all appeared 3 times 

Что это должно выглядеть

boy appeared 3 times 
Snape appeared 7 times 
Dumbledore appeared 4 times 
he appeared 27 times 
her appeared 4 times 
the appeared 13 times 
it appeared 6 times 
is appeared 12 times 
will appeared 2 times 
all appeared 3 times 

Читая мои коды Я уверен, что я имею сделал его более сложным, чем он есть. Я был бы признателен за любые советы и исправления, которые я сделал.

Полный код

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include <vector> 

// Main Function 
int main() 
{ 
    // Declaration 
    std::string list, passage, word[10]; 
    std::ifstream listFile("WordList.txt", std::ios::in); 
    std::ifstream passageFile("HarryPotterPassage.txt", std::ios::in); 
    std::vector<std::string> vec_wordList, vec_passage; 


    /* Read a file that contains a list of 10 words */ 
    if (listFile.is_open()) 
    { 
     // Store text file in a vector 
     while (listFile) 
     { 
      listFile >> list; 
      vec_wordList.push_back(list); 
     } 

     // Assign vector to individual strings 
     for (int i = 0; i < 10; i++) 
     { 
      word[i] = vec_wordList[i]; 
     } 

     // Close file 
     listFile.close(); 
    } 
    else 
     std::cout << "No file found.\n"; 


    /* Read another file containing a paragraph */ 
    if (passageFile.is_open()) 
    { 
     while (passageFile) 
     { 
      // Store text file in a string 
      std::getline(passageFile, passage); 
     } 

     // Close file 
     passageFile.close(); 
    } 
    else 
     std::cout << "No file found.\n"; 

    //std::cout << passage << '\n'; 


    /* Count the number of words from the first file 
     from the second file that contains the paragraph */ 
    size_t count = 0; 
    std::string::size_type pos = 0; 

    for (int i = 0; i < 10; i++) 
    { 
     while ((pos = passage.find(word[i], pos)) != std::string::npos) 
     { 
      count++; 
      pos += word[i].size(); 
     } 

     std::cout << word[i] << " appeared " << count << " many times\n"; 
    } 

    system("pause"); 
    return 0; 
} 

Спасибо заранее.

+0

Было бы легче решить с помощью 'std :: unoredered_map '. –

+0

Я думаю, что вам нужно установить 'count = 0' и' pos = 0' в начале каждой итерации цикла 'for'. В принципе, вы можете просто переместить эти два объявления ** в ** этот цикл. –

ответ

0

Вам нужно сбросить count и pos в начале каждой итерации внешнего цикла.

Другими словами, это изменить:

size_t count = 0; 
std::string::size_type pos = 0; 
for (int i = 0; i < 10; i++) 
{ 
    ... 
} 

к этому:

for (int i = 0; i < 10; i++) 
{ 
    size_t count = 0; 
    std::string::size_type pos = 0; 
    ... 
} 

Кстати, я бы также изменить что 10 к sizeof(word)/sizeof(*word).

+0

И если вы на C++ 11 или выше, я бы даже использовал 'for (const auto & w: word)' и заменял каждое 'word [i]' внутри цикла 'w'. –

+0

Ничего себе! Я знал, что это так просто. Бывало, что я боюсь головной боли в течение 24 часов, пытаясь понять, почему он не будет сброшен. Большое спасибо. – gomicoo

+0

@gomicoo: проблем нет. Кстати, я даже не потрудился проверить свое решение. Для меня было очевидно, что для каждого 'слова [i]' вам нужен другой 'count', и оттуда я пришел к выводу, что вам также понадобилось другое' pos' для каждого слова [i] '. Обратите внимание на дополнительное исправление, предложенное в комментарии выше. –

1

Вы используете слово [9] вместо слова [i], поэтому вы получаете результаты последнего слова вместо каждого. попробовать:

for (int i = 0; i < 10; i++) 
{ 
    while ((pos = passage.find(word[i], pos)) != std::string::npos) 
    { 
     count++; 
     pos += word[i].size(); 
    } 

    std::cout << word[i] << " appeared " << count << " many times\n"; 
} 
+0

Проклятье, я забыл изменить его. Вот как я изначально его использовал, используя слово [i]. Я менял номера, поэтому я знаю, какие результаты это на самом деле предполагается. Изменение его на слово [i] тоже не работает для меня. – gomicoo

Смежные вопросы