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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Объясните, как работает программа http://www.cyberforum.ru/cpp-beginners/thread415819.html
программа по трем введеным числам определяет и выводит на экран число имеющее в составе наибольше едениц. Пожалуйста, объясните подробно какие действия происходят в цикле, в книге написано, что удаляет последнюю цифру из числа, увеличивает счетчик... но я не понял как это делается, сам смысл действий... #include <iostream> #include <conio.h> using namespace std; void main() { ...
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> #define m 6 //Количество строк #define n 6 //Количество столбцов int main() {
C++ создание класса http://www.cyberforum.ru/cpp-beginners/thread415787.html
Создать класс для работы с матрицей. Данные класса: матрица A(3×3). Открытые функции класса: транспонирование матрицы. Перегрузить операции «>>», «<<» для ввода и вывода матрицы. Перегрузить операции «++» и «--» увеличения или уменьшения каждого элемента матрицы на 1.
C++ Даны две строки, содержащие не более 100 символо 6. Даны две строки, содержащие не более 100 символов. Строки состоят из слов, разделенных пробелами. Распечатать строку, которая содержит заданное слово заданное количество раз. Вот код моей программы: #include <iostream> #include <conio.h> #include <string.h> #include <stdio.h> #include <windows.h> using namespace std; int main() { подробнее

Показать сообщение отдельно
greeezz
272 / 165 / 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;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru