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

Вывести только те слова сообщения, которые встречаются в нем ровно один раз - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
filimoncc
1 / 1 / 1
Регистрация: 02.12.2013
Сообщений: 101
17.02.2014, 21:41     Вывести только те слова сообщения, которые встречаются в нем ровно один раз #1
Дано осмысленное текстовое сообщение (т.е. алфавитно-цифровая информация,
разделенная пробелами и знаками препинани, в конце которого ставится точка):
Вывести только те слова сообщения, которые встречаются в нем ровно один раз.

Помогите с кодом.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2014, 21:41     Вывести только те слова сообщения, которые встречаются в нем ровно один раз
Посмотрите здесь:

C++ задача на строки на С.Даны 2 слова.Напечатать только те буквы слов,которые встречаются в обоих словах только один раз.
Строки в С++ - вывести слова, которые встречаются один раз C++
Напечатать все слова , которые встречаются в исходной строке ровно один раз C++
Нужно из строки символов удалить символы которые встречаются в нем только один раз C++
Выбрать из текста только те символы, которые встречаются в нем только один раз C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
17.02.2014, 21:57     Вывести только те слова сообщения, которые встречаются в нем ровно один раз #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
filimoncc, если нужно проверить ещё символы добавьте в функцию check_func()
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
#include <iostream>
#include <string>
 
bool check_func(char ch)
{
    if(ch == ' ' || ch == ',' || ch == '.')
        return true;
    return false;
}
 
int main()
{
    std::string s, temp;
    std::string* str;
    int index = 0, counter = 0, size;
    std::cout << "Enter string: ";
    getline(std::cin, s);
    
    while(s[index])
    {
        if(!check_func(s[index]))
        {
            while(check_func(s[index]))
            {
                index++;
            }
            counter++;
        }
        index++;
    }
 
    size = counter + 1;
    str = new std::string[size];
    counter = 0;
    index = 0;
    
    while(s[index])
    {
        if(!check_func(s[index]))
        {
            temp += s[index];
            if(!s[index + 1])
            {
                str[counter] = temp;
            }
        }
        else
        {
            if(temp != "")
            {
                str[counter] = temp;
                temp.clear();
                counter++;
            }
        }
        index++;
    }
    
    counter = 0;
    
    for(int i = 0; i < size; i++)
    {
        temp = str[i];
        for(int j = 0; j < size; j++)
        {
            if(temp == str[j])
                counter++;
        }
        if(counter == 1)
            std::cout << str[i] << "\n";
        counter = 0;
    }
    
    std::cout << "\n";
    
    system("pause");
    return 0;    
}
filimoncc
1 / 1 / 1
Регистрация: 02.12.2013
Сообщений: 101
19.02.2014, 21:12  [ТС]     Вывести только те слова сообщения, которые встречаются в нем ровно один раз #3
GuGo1991, а можно прокомментировать строки программы?
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
19.02.2014, 22:29     Вывести только те слова сообщения, которые встречаются в нем ровно один раз #4
filimoncc
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
 
bool check_func(char ch)
{
    if(ch == ' ' || ch == ',' || ch == '.')
        return true;
    return false;
}
 
int main()
{
    std::string s, temp;
    std::string* str;
    int index = 0, counter = 0, size;
    std::cout << "Enter string: ";
    getline(std::cin, s); //Сохраняем s в напечатанную строку
    
    while(s[index]) //Пока не дойдём до нулевого символа s
    {
        if(!check_func(s[index])) //Если функция возвращает true, 
        {                         //значит мы наткнулись на пробел, запятую или точку
            while(check_func(s[index])) //Пока имеем подобный символ
            {
                index++; //проверяем следующий элемент строки
            }
            counter++; //Увеличиваем счётчик
        }
        index++; //Если функция возвращает false, проверяем следующий элемент строки
    }
    //В счётчике хранится количество интервалов между словами в строке.
    //Т. е. запятые с пробелами, точки (всё что не касается слов)
    size = counter + 1; //Увеличив счётчик на 1 получим количество слов
    str = new std::string[size]; //Создаём массив, в который будем сохранять слова
    counter = 0;
    index = 0;
    
    //Повторяем те же операции
    while(s[index])
    {
        if(!check_func(s[index]))
        {
            temp += s[index]; //только теперь каждую букву слова сохраняем в temp
            if(!s[index + 1]) //Если встречается символ
            {
                str[counter] = temp; //слово сохраняется в массив
                counter++; //увеличивается индекс массива. Забыл добавить в первый раз.
            }              //Если пробелов много, ответ был бы неправильный. Моя вина...
        }
        else
        {
            if(temp != "") //Если первое условие не выполнилось, а в temp осталось слово
            {
                str[counter] = temp; //сохраняем
                temp.clear(); //очищаем
                counter++; //увеличиваем индекс
            }
        }
        index++;
    }
    
    counter = 0;
    //Поиск не повторяющихся слов
    for(int i = 0; i < size; i++)
    {
        temp = str[i]; //Первый элемент массива присваиваем temp
        for(int j = 0; j < size; j++)
        {
            if(temp == str[j]) //Проверяем с каждым элементом массива
                counter++; //Увеличиваем счетчик при повторении
        }
        if(counter == 1) //Если счётчик равен 1, т.е. слово наткнулось лишь само на себя
            std::cout << str[i] << "\n"; //выводим слово
        counter = 0; //обнуляем счётчик
    }
    
    std::cout << "\n";
    
    system("pause");
    return 0;    
}
filimoncc
1 / 1 / 1
Регистрация: 02.12.2013
Сообщений: 101
21.02.2014, 21:43  [ТС]     Вывести только те слова сообщения, которые встречаются в нем ровно один раз #5
Уважаемый GuGo1991, я проанализировал код, вырезал ненужное, дополнил и сделал код короче+подправил комментарии. Программа полностью работает

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
#include <iostream>
#include <string>
using namespace std;
 
bool check_func(char ch)
{
    if(ch == ' ' || ch == ',' || ch == '.')
       { return true;} else
    return false;
}
 
int main()
{
    string s, temp;
    string* str;
    int index = 0, counter = 0, size;
    cout << "Enter string: ";
    getline(cin, s); //Сохраняем в s напечатанную строку
 
    while(s[index]) //Пока не дойдём до нулевого символа s
    {
        if(check_func(s[index])) //Если функция возвращает true,
        {                         //значит мы наткнулись на пробел, запятую или точку
            while(check_func(s[index])) //Пока имеем подобный символ
            {
                index++; //проверяем следующий элемент строки
            }
            counter++; //Увеличиваем счётчик
        }
        index++; //Если функция возвращает false, проверяем следующий элемент строки
    }
    //В счётчике хранится количество интервалов между словами в строке.
    //Т. е. запятые с пробелами, точки (всё что не касается слов) и по нему задается размер массива
    size = counter ; //Задаем размер массива
    str = new string[size]; //Создаём массив, в который будем сохранять слова
    counter = 0;
    index = 0;
 
    //Повторяем те же операции
    while(s[index])
    {
        if(!check_func(s[index]))//если не символ, то цикл открывает свою работу
        {
            temp += s[index]; //только теперь каждую букву слова сохраняем в temp
            if(!s[index + 1]) //Если встречается вдруг символ на следующей позиции, немедленно запускается цикл
            {
                str[counter] = temp; //куча буковок, называемых словом, сохраняется в массив
              temp.clear(); //очищаем temp
                counter++; //увеличивается индекс массива.
            }              //это условие нужно,если будет много символов подряд.
        }
        else//это к первому if
        {
            if(temp != "") //Если первое условие не выполнилось, а в temp осталось слово
            {
                str[counter] = temp; //сохраняем кучу буковок что нашлось в массив
                temp.clear(); //очищаем temp
                counter++; //увеличиваем индекс для массива
            }
        }
        index++;//увеличиваем индекс для перебора буковок
    }
 
    for(int i = 0; i < size; i++)
    {
            cout << str[i] << "\n"; //выводим слово
    }
 
    return 0;
}
Добавлено через 2 минуты
Правда там еще и не все символы в check_func указаны, но это кому как надо.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
22.02.2014, 00:58     Вывести только те слова сообщения, которые встречаются в нем ровно один раз #6
filimoncc, у меня лично выходит за границу массива. В 34-ой строчке вы присвоили неправильное
значение size. Он должен равняться counter + 1. Это во первых. А во вторых убрав проверку из последнего
цикла у вас выведутся все значения (слова) и повторяющиеся и неповторяющиеся, а это не удовлетворяет
условию вашего задания.
filimoncc
1 / 1 / 1
Регистрация: 02.12.2013
Сообщений: 101
22.02.2014, 21:45  [ТС]     Вывести только те слова сообщения, которые встречаются в нем ровно один раз #7
GuGo1991, не работает поиск повторяющихся слов. повторяющиеся слова полностью исчезают.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2014, 21:59     Вывести только те слова сообщения, которые встречаются в нем ровно один раз
Еще ссылки по теме:

Вывести только те слова сообщения, которые встречаются в тексте один раз C++
Из предложения напечатать те символы, которые встречаются в нем ровно один раз C++
C++ Напечатать слова, которые встречаются в двух предложениях только один раз (Pascal -> C++)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
filimoncc
1 / 1 / 1
Регистрация: 02.12.2013
Сообщений: 101
22.02.2014, 21:59  [ТС]     Вывести только те слова сообщения, которые встречаются в нем ровно один раз #8
вот скрин
Миниатюры
Вывести только те слова сообщения, которые встречаются в нем ровно один раз  
Yandex
Объявления
22.02.2014, 21:59     Вывести только те слова сообщения, которые встречаются в нем ровно один раз
Ответ Создать тему
Опции темы

Текущее время: 17:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru