1 / 1 / 2
Регистрация: 02.12.2013
Сообщений: 105
1

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

17.02.2014, 21:41. Показов 7679. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано осмысленное текстовое сообщение (т.е. алфавитно-цифровая информация,
разделенная пробелами и знаками препинани, в конце которого ставится точка):
Вывести только те слова сообщения, которые встречаются в нем ровно один раз.

Помогите с кодом.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2014, 21:41
Ответы с готовыми решениями:

Вывести только те слова сообщения, которые встречаются в нем ровно один раз
Вывести только те слова сообщения, которые встречаются в нем ровно один раз. Помогите исправить...

Вывести только те слова сообщения, которые встречаются в нем более n раз
Нужно выполнить эту задчку используя только библиотеки string и iostream. Буду очень благодарен,...

Вывести только те слова сообщения, которые встречаются в тексте один раз
Дано осмысленное текстовое сообщение (т.е. алфавитно-цифровая информация, разделенная пробелами и...

Из предложения напечатать те символы, которые встречаются в нем ровно один раз
Из заданного предложения выбрать и напечатать те символы, которые встречаются в нем ровно один раз...

7
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
17.02.2014, 21:57 2
Лучший ответ Сообщение было отмечено filimoncc как решение

Решение

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;    
}
0
1 / 1 / 2
Регистрация: 02.12.2013
Сообщений: 105
19.02.2014, 21:12  [ТС] 3
GuGo1991, а можно прокомментировать строки программы?
0
272 / 266 / 146
Регистрация: 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;    
}
1
1 / 1 / 2
Регистрация: 02.12.2013
Сообщений: 105
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 указаны, но это кому как надо.
0
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
22.02.2014, 00:58 6
filimoncc, у меня лично выходит за границу массива. В 34-ой строчке вы присвоили неправильное
значение size. Он должен равняться counter + 1. Это во первых. А во вторых убрав проверку из последнего
цикла у вас выведутся все значения (слова) и повторяющиеся и неповторяющиеся, а это не удовлетворяет
условию вашего задания.
0
1 / 1 / 2
Регистрация: 02.12.2013
Сообщений: 105
22.02.2014, 21:45  [ТС] 7
GuGo1991, не работает поиск повторяющихся слов. повторяющиеся слова полностью исчезают.
0
1 / 1 / 2
Регистрация: 02.12.2013
Сообщений: 105
22.02.2014, 21:59  [ТС] 8
вот скрин
Миниатюры
Вывести только те слова сообщения, которые встречаются в нем ровно один раз  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2014, 21:59
Помогаю со студенческими работами здесь

Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз
Не могу научиться мыслить на c++. Но старательно пытаюсь.... Если бы не традиционное &quot;Завтра...

Выбрать из текста только те символы, которые встречаются в нем только один раз
Здравствуйте, помогите пожалуйста написать программу:) Условие. Дана строка, содержащая текст на...

Напечатать все слова , которые встречаются в исходной строке ровно один раз
Дана производная строка, слова в которой разделены пробелами. Напечатать все слова , которые...

Выбрать из файла те символы, которые встречаются в нем только один раз
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru