Как написать код в C, который проверяет наличие повторяющихся слов в строках и вычисляет их количество вхождений? - PullRequest
0 голосов
/ 07 января 2020

Я сейчас пишу код для моей курсовой работы, который анализирует вставленный вручную текст. Я должен найти общее количество непробельных символов и общее количество слов. Кроме того, я должен найти любые повторяющиеся слова в строке, а затем отобразить их с количеством повторений. Я застрял в поиске повторяющихся слов и отображении количества повторений. Кроме того, мое знание C ограничено, с темами, которые я знаю, включая указатели, строки, файлы и функции, циклы, если условия и т. Д. c ... Ниже приведен мой код:

#include <stdio.h>

int num, numi, text, length, length1, word;
numi = 0;
word = 1;

int main()
{
    char text[] = "Dennis        MacAlistair Ritchie (September 9, 1941 - October 12, 2011) was an American computer scientist. He created the C programming language and, with long-time colleague Ken Thompson, the Unix operating system and B programming language. Dennis Ritchie was born in Bronxville, New York. His father was Alistair E. Ritchie, a long-time Bell Labs scientist and co-author of The Design of Switching Circuits on switching circuit theory. As a child, Dennis moved with his family to Summit, New Jersey, where he graduated from Summit High School. He graduated from Harvard University with degrees in physics and applied mathematics.";
    printf("Welcome to UNM Text Editor. Your original text is:\n\n");
    printf("%s", text);
    length = strlen(text);
    for (numi=0; numi<=length; numi++)
    {
        if (text[numi] == ' ')
        {
            length1++;
            if (text[numi + 1] != ' ')
            {
                word++;
            }
        }
    }
    printf("\n\nThe total number of characters (without spaces) is: %d", length-length1);
    printf("\nThe total number of words is: %d", word);
}

1 Ответ

0 голосов
/ 08 января 2020

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

Для этого вы можете использовать структуру данных Tr ie, пожалуйста, возьмите Посмотрите на ссылку ниже.

https://www.geeksforgeeks.org/trie-display-content/

это на C ++, но на самом деле не так много вещей из C ++, поэтому его легко переписать в C , Вам нужно добавить всего несколько строк в код GeeksForGeeks, чтобы он заработал. Поскольку это ваша курсовая работа, возможно, вы должны не просто использовать весь код, а написать собственный, но я хотел бы показать вам и общую идею:

  1. Добавить переменное число вхождений «строки» в структуру:

    <code>
    struct TrieNode
    {
        struct TrieNode* children[alpha_size];
        bool isLeaf;
        int occurrence; // <-- I ADDED IT HERE
    }
    
  2. в конце insert_node_function добавить:

    <code>
    ...
    pCrawl->isLeaf = true;
    pCrawl->occurrence++; // <-- I ADDED IT HERE
    ...
    
  3. Отображать только при числе вхождений больше, чем 1

    <code></p>
    
    <p>void display(struct TrieNode* root, char str[], int level)
    {
        // If node is leaf node, it indicates end 
        // of string, so a null character is added 
        // and string is displayed 
        if (isLeafNode(root) && root->occurrence > 1)  // <-- I ADDED IT HERE
        {
            str[level] = '\0';
            cout << str << " " << root->occurrence << endl;  // <-- I ADDED IT HERE
        }
        ...
    

Остается только одно: как прочитать одно слово из «текста» (символ текста в вашем примере). Чтобы сделать это проще, вы можете удалить все дублирующиеся пробелы и go через текст еще раз. Затем вы можете скопировать слово для обработки пробела в качестве разделителя (например, с помощью strncat) и вставить его в tr ie.

Чтобы понять, как работает tr ie, попробуйте поискать его в Google. Там должно быть много информации об этом.

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