Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66

Найти ошибку: определить входящие символы в строку

21.01.2016, 21:28. Показов 3082. Ответов 45
Метки нет (Все метки)

Здравствуйте, форумчани! Очень нужна ваша помощь.
Задача такова: "Для заданной строки определить все входящие в нее символы. Например: строка abccbbbabba состоит из символов "a", "b" и "c"."
Вот код, который я попыталась написать. Хоть он и работает, но определяет символы совсем криво. Укажите на ошибку, пожалуйста! Буду рада объяснениям!
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
int main()
{
    string in_str;
    char str;
    int i;
    cin >> in_str;
    for (i = 1; i <in_str.size(); i++)
    //for (i = 1; i < in_str.size() && in_str[i] == str; ++i)
    {
        if (in_str[i] != str) {
            str = str + in_str[i];
        }
        if (in_str[i] == str) {
            cout << in_str[i] << endl;
            str = str - in_str[i];
        }
        system("pause");
        return 0;
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.01.2016, 21:28
Ответы с готовыми решениями:

Определить символы в первой строке не входящие в другую строку
Доброго времени суток. Пытаюсь организовать поиск, но что-то выходит не так. Суть задания: За основу брал код здесь: .data ...

В заданной строке с нулевым завершителем определить символы, не входящие в другую строку
Есть вот такой код. Нужно его изменить так, чтобы программа определила символы первой строки которых нет в другой строке и записала их в...

В заданной строке с нулевым завершителем определить символы, входящие в другую строку
Записывает первую строку в результирующую , как исправить? .data str1 db &quot;qaz123&quot;,0 str2 db &quot;war426&quot;,0 res...

45
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
22.01.2016, 20:47
Цитата Сообщение от nord_v Посмотреть сообщение
Для поставленной задачи не нужно строку портить, всё что нужно, можно сделать или при учёте символов, или при выводе результата.
Делать что-то при выводе результата, на мой взгляд, не правильно. Не надо платить за то,что не используешь(кажись идиома C++ ). Т.е. не нужен символ? не храним его.
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
22.01.2016, 20:48
Цитата Сообщение от Navka Посмотреть сообщение
а как определить индекс
после цикла a[32]=0 сделайте
0
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
22.01.2016, 20:51  [ТС]
nord_v, мне, конечно, стыдно задавать такие глупые вопросы, но учится то надо
можете дословно объяснить, что в Вашем коде делает каждая строка?

Добавлено через 42 секунды
S_el, как я понимаю, оба варианта имеют место быть, вот только вариант с string::erase мне понятнее
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
22.01.2016, 20:58
Цитата Сообщение от Navka Посмотреть сообщение
вот только вариант с string::erase мне понятнее
Так и должно быть. Дам вам подсказку:
одним string::erase(я надеюсь такой формой вы обозначаете обычный, а не статический метод) не обойтись.
Еще вы можете воспользоваться регулярными выражениями(здесь это, конечно, не требуется,говорю в качестве дополнительной информации).
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
22.01.2016, 21:12
Цитата Сообщение от Navka Посмотреть сообщение
nord_v, мне, конечно, стыдно задавать такие глупые вопросы, но учится то надо
можете дословно объяснить, что в Вашем коде делает каждая строка?
Это не мой код. Спрашивай у Dimension.
0
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
22.01.2016, 21:15  [ТС]
S_el, нужны еще итераторы?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
22.01.2016, 23:07
Лучший ответ Сообщение было отмечено Navka как решение

Решение

Цитата Сообщение от Navka Посмотреть сообщение
нужны еще итераторы?
хм, я вижу у вас некоторое непонимание. Лучше всего возьмите хороший учебник и прочитайте материал по итераторам:
Литература C++

Теперь по шагам, в следующий раз вы сделаете тоже самое самостоятельно.
1. Задача - удалить пробелы из строки.
2. Ключевое слово удалить, нужен алгоритм удаления. Ищем метод для удаления, нашли erase. Читаем описание:
Удаляет указанные символы из строки.
1) Удаляет count символов, начиная с позиции index.
2) Удаляет символ в позиции position.
3) Удаляет символы в диапазоне [first; last).
подходит? нет.
3. Ищем стандартный алгоритм. Не числовые алгоритмы находятся в заголовочном файле algorithm.
Читаем здесь краткое описание, останавливаемся на нужном(там очень удобно,функции разбиты по категориям):
http://www.cplusplus.com/reference/algorithm/
нашли нужный:
http://www.cplusplus.com/refer... hm/remove/
4. Применяем, получаем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
 
int main() {
    std::string line;
    std::getline(std::cin,line);
    line.erase(std::remove(line.begin(), line.end(), ' '), line.end());
    std::set<char> dict(line.begin(),line.end());
    for( const auto &el :dict)
        std::cout<<el;
    std::cout<<std::endl;
    return 0;
}
http://ideone.com/3p69J8

В качестве упражнения измените код так,чтобы пробельный символ удалялся из контейнера вместо строки.
0
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
23.01.2016, 17:01  [ТС]
S_el, так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main() {
    std::string line;
    std::getline(std::cin, line);
    line.erase(std::remove(line.begin(), line.end(), ' '), line.end());
    std::set<char> dict(line.begin(), line.end());
    
    for (auto &el : dict)
    {
        auto del = dict.begin(); del != dict.end();
        auto n = *del;
        if (n == ' ')
        {
            del = dict.erase(del);
        }
        std::cout << el;
        }
    
            std::cout << std::endl;
            system("pause");
            return 0;
    }
Добавлено через 12 минут
Все равно не так. Неправильно del объявила.
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
23.01.2016, 17:03
вы в line уже удалили все пробелы перед помещением в dict
0
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
23.01.2016, 17:06  [ТС]
ну и не так же
C++
1
2
3
4
5
6
7
8
9
10
11
    for (auto &l : dict)
    {
        for (auto del = dict.begin(); del != dict.end(); )
        {
            auto n = del;
            if (del == ' ')
            {
                del = dict.erase(del);
            }}
        std::cout << l;
        }
Добавлено через 1 минуту
Dimension, значит, нужно удалить строку 4?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
23.01.2016, 17:08
Navka, зачем так сложно? Старайтесь по-возможности использовать стандартные средства.
И, самое главное, пишите каждую строку осознанно. Посмотрите в отладчике или выведите на экран содержимое интересующих вас объектов, переменных. Посмотрите что изменится.
0
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
23.01.2016, 17:12  [ТС]
S_el, можете мне написать код удаления из контейнера? А я уже пойду от обратного и, может быть, пойму
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
23.01.2016, 17:21
Navka, нет. Я вам написал как надо действовать и показал на примере строки.
В чем по-вашему заключается разница между удалением элемента из строки и контейнера?
0
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
23.01.2016, 17:22  [ТС]
S_el, так, кстати, все работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main() {
    std::string line;
    std::getline(std::cin, line);
    std::set<char> dict(line.begin(), line.end());
    auto del = dict.begin(); del != dict.end();
    auto n = *del;
    if (n == ' ')
    {
        del = dict.erase(del);
    }
    for (auto &el : dict)
        std::cout << el;
 
    std::cout << std::endl;
    system("pause");
    return 0;
}
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
23.01.2016, 17:24
Цитата Сообщение от Navka Посмотреть сообщение
так, кстати, все работает
напишите комментарий к каждой строке и поясните почему работает.
1
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
23.01.2016, 17:34  [ТС]
S_el,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main() {
    std::string line; //объявляем строку
    std::getline(std::cin, line); //ввод строки пользователем
    std::set<char> dict(line.begin(), line.end()); //объявление контейнера
    auto del = dict.begin(); del != dict.end(); //задаем область del 
    auto n = *del; //приравниваем переменной n значение del. Не знаю, зачем, но без этой строки не работало... 
    if (n == ' ') 
    {
        del = dict.erase(del);//удаляем пробелы
    }
    for (auto &el : dict)
        std::cout << el;//выводим результат
 
    std::cout << std::endl;
    system("pause");
    return 0;
}
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
23.01.2016, 18:48
Navka,
пара вопросов по коду:
C++
1
 std::set<char> dict(line.begin(), line.end());
что это за контейнер и что определяют аргументы конструктора?

C++
1
del != dict.end(); //задаем область del
зачем это вообще делать?

C++
1
 auto n = *del; //приравниваем переменной n значение del. Не знаю, зачем, но без этой строки не работало...
разыменовываем итератор, т.е. получаем значение, на которое он указывает(как указатель).

Вы понимаете почему код рабочий или нет?
0
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
23.01.2016, 19:14  [ТС]
S_el, Вы меня пугаете
1. Это контейнер, который содержит отсортированные элементы. Он динамический, то есть его размер задается во время выполнения. Еще он не может содержать повторяющиеся элементы. Аргументы - это диапазон введенной строки...
2. Да, можно и не делать. Удалила эту строку, работает.

Я не понимаю, почему вообще ВСЕ работает. Делаю что-то чисто интуитивно и по тем знаниям, которые имеются... Да-да, читаю литературу, листаю форумы... Но проще и понятнее от этого программирование для меня не становится. Мозги, наверное, не технические.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
23.01.2016, 20:22
Цитата Сообщение от Navka Посмотреть сообщение
Вы меня пугаете
В самом деле?

Цитата Сообщение от Navka Посмотреть сообщение
Он динамический, то есть его размер задается во время выполнения.
небольшой уточнение: в данном случае его размер вообще не задается.

Цитата Сообщение от Navka Посмотреть сообщение
Аргументы - это диапазон введенной строки...
важное дополнение: который задается итераторами.

Цитата Сообщение от Navka Посмотреть сообщение
Мозги, наверное, не технические.
Дело не в мозгах, а в недостатке практики и(или) неправильном подходе.
0
 Аватар для Navka
1 / 1 / 0
Регистрация: 17.05.2015
Сообщений: 66
23.01.2016, 20:50  [ТС]
S_el,
Цитата Сообщение от S_el Посмотреть сообщение
В самом деле?
Есть такое ;_;

Цитата Сообщение от S_el Посмотреть сообщение
важное дополнение: который задается итераторами.
Чтобы понять простыми словами: итератор - это штука, которая на что-то указывает. Правильно понимаю?

Цитата Сообщение от S_el Посмотреть сообщение
Дело не в мозгах, а в недостатке практики и(или) неправильном подходе.
Вполне может быть, что дело в подходе. Потому что учу все набоум. Чуток, Таненбаума, чуток Дэвиса... А устаканенного плана изучения нема.

Но в целом то, что я написала, правильно же? #36
И спасибо огрооомное за помощь и "разжевывание"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2016, 20:50

Ввести строку. Найти все символы, входящие в слова четной длины
Ввести строку. Найти все символы, входящие в слова четной длины.

Напечатать все символы, входящие в заданную строку, в алфавитном порядке (найти и исправить ошибки в коде)
Подскажите пожалуйста, что надо сделать для того, что бы буквы, которые уже встречаются в строке не удалялись, а выводились так же, в...

Вывести все символы строки a, не входящие в строку b
решите пожалуйста Даны строки a$ и b$. Вывести все символы строки a$, не входящие в строку b$.

В строке символов удалить все символы, входящие в другую строку
В строке символов удалить все символы, входящие в другую строку символов.

Из заданной строки удалить все символы, входящие в другую заданную строку
Из заданной строки удалить все символы, входящие в другую заданную строку. (Процедура получает строку и позицию в ней удаляемого символа и...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru