Нужна помощь в исправлении кода для вывода правильного количества уникальных слов из файла - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь найти уникальное количество слов из текстового файла.Но по какой-то причине мой номер всегда выключен.Мой обычный счетчик слов выходит хорошо, хотя.

Мой строковый массив wordArr содержит все слова из файла.

Я пытаюсь присвоить каждое слово другому массиву после того, как он будет признан не уникальным, затем я просматриваю списокслова, через которые я уже прошел, чтобы увидеть, соответствует ли это текущему слову, которое показывают.Если слова совпадают, я устанавливаю oldWord в значение true, и слово не учитывается при подсчете unique.

//New portion
int main(int argc, char *argv[]) {
    //File Paths
    ifstream fp;
    fp.open(argv[1]);
    if (fp.fail()) {
        cout << "Error No file" << endl;
        return 0;
    }
    string wordArr[10000];
    string words;
    string temp;
    int wordCount = 0;


    while (fp >> words) {
        int newWord = 0;
        for (int i; i < words.length(); i++) {
            if (isalpha(words[i])) {

            } else {
                wordArr[wordCount++] = words.substr(0, i);
                //wordCount++;
                newWord = 1;
                if(words[i] + 1 != '\0') {
                    for (int j = i + 1; j <  words.length(); j++) {
                        temp = temp +words[j];
                    }
                    wordArr[wordCount++] = temp;
                    //wordCount++;
                }

            }

        }
        if (newWord == 0) {
            wordArr[wordCount] = words;
            wordCount++;
        }
    }
    cout << "Number of words found was: " << wordCount << endl;
    //New portion


    // makes all lower
    for(int k=0; k<wordCount;k++){ //need to find size of array
        for(int l=0; l<wordArr[k].length(); l++){
            tolower(wordArr[k].at(l));
        }

    }



    //unique count
    string tempArr[10000];
    int unique=0;
    int oldWord=0;
    for(int m=0; m<wordCount;m++ ) {
        for (int n = 0; n < wordCount; n++) {
            if (wordArr[m] == tempArr[n]) {


                oldWord = 1;
            }
        }
        if(oldWord==0){
            wordArr[m] = tempArr[n];
            unique++;
        }
    }
    cout << "Unique word count is: " << unique << endl;
}

Я ожидаю получить 52 уникальных слова из моего теста, но в итоге получаю только37.

Контрольный пример:

Криптография - это как практика, так и изучение методов, используемых для передачи и / или хранения информации или данных в частном и безопасном режиме, без перехвата третьими лицами.,Это может включать такие процессы, как шифрование, хеширование и стеганография.До современной эры криптография почти исключительно относилась к шифрованию, но в настоящее время криптография является широкой областью применения во многих критических областях нашей жизни.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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

Короче говоря, весь этот кодполно ошибок, которые нужно исправить, например:

#include <iostream>
#include <fstream>
#include <string>
#include <ctype.h>
using namespace std;

int main(int argc, char *argv[]) {
    //File Paths
    ifstream fp;
    fp.open(argv[1]);
    if (!fp.is_open()) {
        cout << "Error No file" << endl;
        return 0;
    }

    string wordArr[10000];
    string words;
    int wordCount = 0;
    while ((fp >> words) && (wordCount < 10000)) {
        for (int i = 0; i < words.length(); ++i) {
            if (!isalpha(words[i])) {
                wordArr[wordCount++] = words.substr(0, i);
                if (wordCount == 10000) break;
                ++i;
                while ((i < words.length()) && (!isalpha(words[i]))) {
                    ++i;
                }
                words.erase(0, i);
                i = -1;
            }
        }
        if (words.length() > 0) {
            wordArr[wordCount++] = words;
        }
    }
    cout << "Number of words found was: " << wordCount << endl;

    // makes all lower
    for(int k=0; k<wordCount;k++){ //need to find size of array
        for(int l=0; l<wordArr[k].length(); l++){
            wordArr[k][l] = tolower(wordArr[k][l]);
        }
    }

    //unique count
    string tempArr[10000];
    int unique=0;
    for(int m=0; m<wordCount;m++ ) {
        int oldWord=0;
        for (int n = 0; n < unique; n++) {
            if (wordArr[m] == tempArr[n]) {
                oldWord = 1;
                break;
            }
        }
        if(oldWord==0){
            tempArr[unique++] = wordArr[m];
        }
    }
    cout << "Unique word count is: " << unique << endl;
}

Теперь код работает как положено :

Number of words found was: 64
Unique word count is: 52
0 голосов
/ 24 января 2019

Вам нужно сбрасывать oldWord в каждой итерации:

 //unique count
string tempArr[10000];
int unique=0;
int oldWord=0;
for(int m=0; m<wordCount;m++ ) {
    for (int n = 0; n < wordCount; n++) {
        if (wordArr[m] == tempArr[n]) {


            oldWord = 1;
        }
    }
    if(oldWord==0){
        wordArr[m] = tempArr[n];
        unique++;
    }
    // reset the oldWord variable here
    oldWord=0;

}
cout << "Unique word count is: " << unique << endl;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...