Посчитать сколько слов, содержит текст произвольной длинны - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Посчитать сколько слов, содержит текст произвольной длинны. Разделителем между словами является символ пробела. Вывести на экран список всех встречающихся в тексте слов и их количество. Указание: использовать связный список. Буду рад подсказкам!Заранее спасибо!

Решение задачи: «Посчитать сколько слов, содержит текст произвольной длинны»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
typedef struct word_t {
    char* ptr;
    unsigned len;
}   TWord;
 
typedef struct info_t {
    TWord word;
    unsigned cnt;
}   TInfo;
 
typedef struct node_t {
    TInfo info;
    struct node_t* next;
}   TNode;
 
//-----------------------------------------------------------------------------
TNode* Find(TNode* list, TWord word) {
    for (; list; list = list->next) {
        if ((word.len == list->info.word.len) &&
            (strncmp(word.ptr, list->info.word.ptr, word.len) == 0)) {
            return list;
        }
    }
 
    return NULL;
}
//-----------------------------------------------------------------------------
void Push(TNode** list, TWord word) {
    TNode* node = Find(*list, word);
 
    if (node) {
        node->info.cnt++;
    }
    else {
        node = malloc(sizeof(TNode));
        node->info.cnt = 1;
        node->info.word.ptr = word.ptr;
        node->info.word.len = word.len;
        node->next = *list;
 
        *list = node;
    }
}
//-----------------------------------------------------------------------------
void Print(const TNode* list) {
    for (; list; list = list->next) {
        printf("%.*s : %u\n",
               list->info.word.len,
               list->info.word.ptr,
               list->info.cnt);
    }
}
//-----------------------------------------------------------------------------
int GetWord(char* text, TWord* word) {
    for (; *text && (!isalpha(*text)); ++text) { ; }
    word->ptr = text;
 
    for (; (isalpha(*text)); ++text) { ; }
    word->len = text - word->ptr;
 
    return word->len;
}
//-----------------------------------------------------------------------------
TNode* GetList(char* text) {
    TNode* list = NULL;
    TWord word;
 
    while (*text) {
        if (GetWord(text, &word)) {
            Push(&list, word);
 
        }
        text += word.len + 1;
    }
 
    return list;
}
//-----------------------------------------------------------------------------
 
int main() {
    char text[] = "dame trot and her cat\n"
                  "sat down for a chat;\n"
                  "the dame sat on this side\n"
                  "and puss sat on that.";
 
    TNode* list = GetList(text);
 
    Print(list);
 
    return 0;
}

Объяснение кода листинга программы

В данном коде используется стек для подсчёта количества вхождений каждого слова в тексте. Список действий:

  1. Создание структуры word_t — определяет структуру слова, содержащую указатель на строку и длину этой строки.
  2. Создание структуры info_t — определяет структуру информации о слове, содержащую структуру word_t и счётчик количества вхождений слова.
  3. Создание структуры node_t — определяет структуру узла списка, содержащую информацию о слове и указатель на следующий узел.
  4. Функция Find — ищет узел списка, содержащий указанное слово.
  5. Функция Push — добавляет новое слово в список. Если слово уже есть в списке, увеличивает счётчик.
  6. Функция Print — выводит информацию о каждом слове из списка.
  7. Функция GetWord — получает слово из текста, игнорируя символы, не являющиеся буквами.
  8. Функция GetList — создаёт список слов из текста.
  9. Основная программа — создаёт текст, содержит строки с примером использования функции GetList.
  10. Вывод информации о словах в списке — с помощью функции Print выводится информация о каждом слове из списка.
  11. Завершение программы — программа завершается, возвращая 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.6 из 5
Похожие ответы