Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 13.04.2014, 17:41   #1 (permalink)
bsik
Новичок
 
Регистрация: 18.12.2013
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -20
Arrow Счетчики С++

Здравствуйте! Дана задача которая выводит часто встречаемое слово в тексте: как в данном коде сделать счетчик количества появления слова в тексте и убрать ограничение на вводимый текст.
Код:
#include <iostream>
using namespace std;
 
void mostRecent(char *, char *); // прототип функции поиска часто встречающегося слова
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "rus");   // установка локалии
    cout << "Введите текст:\n";
 
    const int buff_size = 1001; // максимальное количество вводимых символов + позиция под '\0'
    char buff_text[buff_size];  // символьный массив, который хранит введённый текст
    char word[30];             // строка, в которй будет храниться искомое слово
 
    mostRecent(gets(buff_text), word); // вызов функции поиска часто встречающегося слова
    for (int counter = 0; counter < strlen(word); counter++)
        word[counter] = toupper(word[counter]); // преобразование символов слова в верхний регистр
    cout << "Cамое часто встречающееся слово в тексте: " << word << endl;
    system("pause");
    return 0;
}
 
void mostRecent(char * text, char *word) // функция поиска часто встречающегося слова
{
    int words_counter = 0; // количество слов в тексте
    char *arrayPtr[1000];  //массив указателей на строки, в которых будут храниться слова из текста
    arrayPtr[0] = strtok(text, " "); // нулевому указателю присваеваем первое слово
    // подсчёт количества слов во введённом тексте
    while (arrayPtr[words_counter] != NULL) // пока в тексте есть слова
    {
        words_counter++; // инкремент счётчика слов
        arrayPtr[words_counter] = strtok(NULL, " "); // очередное слово сохраняем в массиве
    }
 
    bool first_iter = true, // флаг определяющий этап первой итерации
        go = false;
    int max_number1 = 0, // количество слов
        max_number2 = 0, // количество слов
        max_word = 0,    // индекс самого часто встречающегося слова
        flag = 0;        // флаг, подсчёта двух итераций
    int index1, index2;
    for (int counter1 = 0; counter1 < (words_counter - 1); counter1++) // перебор слов, начиная с первого и заканчивая предпоследним
    {
        flag++; // инкремент итераций
        for (int counter2 = counter1 + 1; counter2 < words_counter; counter2++) // перебор слов, начиная со второго и заканчивая предпоследним
        {
            if (strcmp(arrayPtr[counter1], arrayPtr[counter2]) == 0) // сравниваем два слова
            if (first_iter) // если первая итерация (то есть сюда заходим один раз)
            {
                max_number1++; // инкремент переменной, подсчитывающей количество одинаковых слов
                first_iter = false; // меняем условие оператора if
                index1 = counter1;
            }
            else
            {
                max_number2++; // инкремент переменной, подсчитывающей количество одинаковых слов
                index2 = counter1;
            }
        }
        if (flag == 2 || go) // если прошли две итерации, или поэлементный проход разрешён
        {
            if (max_number1 >= max_number2) // если количество первого слова больше количества второго слова
            {
                max_word = index1; // присваиваем индекс самого часто повторяющегося слова
            }
            else { max_word = index2; max_number1 = max_number2; } // присваиваем индекс самого часто повторяющегося слова и количество появления второго слова присваиваем переменной max_number1
            flag = 0; // обнуляем счётчик итераций
            go = true; // разрешить поэлементный проход
        }
        max_number2 = 0; // обнуляем накопленное количество появления второго слова
    }
 
    strcpy(word, arrayPtr[max_word]); // возвращаем результат поиска самого часто встречающегося слова
}
bsik вне форума   Ответить с цитированием

Старый 13.04.2014, 17:41
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Обычно первым делом эффективнее всего прочитать похожие темы

Продам счетчики Г-Мюллера СИ-29БГ.

Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
с++, счетчик

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 16:37.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.