Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Поиск повторяющихся слов в тексте (доработка кода) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Объясните, как работает программа http://www.cyberforum.ru/cpp-beginners/thread415819.html
программа по трем введеным числам определяет и выводит на экран число имеющее в составе наибольше едениц. Пожалуйста, объясните подробно какие действия происходят в цикле, в книге написано, что...
C++ Найти максимальный элемент массива В массиве x найти максимальный элемент http://www.cyberforum.ru/cpp-beginners/thread415803.html
Реализовать функцию копирования элементов первого массива во второй в обратном порядке. C++
1. Создать проект, который содержит консольную программу Win32. 2. Создать два массива на N элементов, размер первого определить неявно (путем инициализации определенным количеством элементов)....
C++ исправьте программу, добавив функцию
Написал программу, работает. Но нужно переделать с функцией, не могу осилить. #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<iomanip> #include<iostream> #include<math.h>...
C++ создание класса http://www.cyberforum.ru/cpp-beginners/thread415787.html
Создать класс для работы с матрицей. Данные класса: матрица A(3×3). Открытые функции класса: транспонирование матрицы. Перегрузить операции «>>», «<<» для ввода и вывода матрицы. Перегрузить...
C++ Даны две строки, содержащие не более 100 символо 6. Даны две строки, содержащие не более 100 символов. Строки состоят из слов, разделенных пробелами. Распечатать строку, которая содержит заданное слово заданное количество раз. Вот код моей... подробнее

Показать сообщение отдельно
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
24.12.2011, 01:34
вот как-то так получилось.
прокомментировал то что показалось неочевыидным.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
#include <cstring>
using std::string;
 
#include <cstdio>
 
#include <sstream>
using std::stringstream;
 
struct Words {
    string word;
    int count;
};
 
int readText(string &);
bool isPunct(const char &);
void splitText(const string &, Words[], const int &);
void countWords(Words[], const int &);
 
int main() {
    string myText; //весь текст
    int numberOfWords;
    Words * wordsInText;
 
    numberOfWords = readText(myText); // посчитаем сколько слов в тексте и удалим знаки припенания
    wordsInText = new Words[numberOfWords]; //создадим массив для слов в тексте
 
    splitText(myText, wordsInText, numberOfWords);  //делим текст на слова
    countWords(wordsInText, numberOfWords); //считаем слова
 
    // print results
    for (int i = 0; i < numberOfWords; ++i) {
        if (wordsInText[i].count > 0) {
            cout << wordsInText[i].word << " ";
            cout << wordsInText[i].count << endl;
        }
    }
    cout << "Words total :: " << numberOfWords;
 
    delete [] wordsInText;
    return 0;
}
 
//считаем слова
void countWords(Words wordsInText[], const int &numberOfWords) {
    for (int i = 0; i < numberOfWords - 1; ++i) { //пока не достигнут конец массива
        if (wordsInText[i].count == 1) { //если данное слово еще не было отмечено как повторяющееся
            for (int j = i + 1; j < numberOfWords; ++j) { //для всех следуюших слов
                if (wordsInText[i].word.length() == wordsInText[j].word.length()) { //если длина слов совпадает
                    for (unsigned int k = 0; k < wordsInText[i].word.length(); ++k) { // пока не проверены все буквы в слове
                        if (wordsInText[i].word.at(k) != wordsInText[j].word.at(k)) { // если буквы не совпадают то выходим из цикла
                            break;
                        }
                        if (k + 1 == wordsInText[i].word.length()) { // если достигли последней буквы то слова одинаковые
                            wordsInText[i].count++; //увеличиваем количесто повторений на 1
                            wordsInText[j].count = 0; // отмечаем найденное повторение как обработанное
                        }
                    }
                }
            }
        }
    }
}
 
//делим текст на слова и записываем слова в массив поотдельности
void splitText(const string &myText, Words wordsInText[], const int &numberOfWords) {
    stringstream ss(myText);
    for (int i = 0; i < numberOfWords && ss >> wordsInText[i].word; ++i) {
        wordsInText[i].count = 1;
    }
}
 
//читаем весь текст.  записываем его в виде одной строки.
//знаки припенания заменяем на пробелы
int readText(string &myText) {
    int lines, numberOfWords = 0;
    char ch;
 
    cout << "Enter number of lines ::\n>";
    cin >> lines;
    cin.clear();
    cin.ignore();
 
    for (int i = 1; i <= lines; ++i) {
        cout << "Please enter " << i << " line ::\n>";
        while ((ch = cin.get())) {
            if (isPunct(ch)) {
                ch = ' ';
            }
            if ((ch == ' ' || ch == '\n') && myText.at(myText.length() - 1) != ' ') {
                numberOfWords++;
            }
            if (ch != '\n') {
                myText.append(1, ch);
            } else {
                break;
            }
        }
        myText.append(1, ' ');
    }
    return numberOfWords;
}
 
 
//проверямем является ли сивол знаком припенания
bool isPunct(const char &ch) {
    const int size = 6;
    const char punct[size] = { '.', ',', '?', '!', ':', ';' };
    for (int i = 0; i < size; ++i) {
        if (ch == punct[i]) {
            return true;
        }
    }
    return false;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru