Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2022, 21:50   #1
poli_
Новичок
Джуниор
 
Регистрация: 12.12.2022
Сообщений: 3
По умолчанию Заменить подряд идущие символы, c++

Нужно в предложении заменить одинаковые, стоящие подряд символы одним символом, после которого в скобках указать количество символов, которые были заменены. Выполнить со строками как массивами символов. И обязательно нужно использовать функции. Есть код со строками как массивами символов, надо сделать без continue, через for
Код:
#include<iostream>
using namespace std;

void func(char*, int, char*);

int main() 
{
    const int SIZE = 16;
    char str[SIZE] = "AAabbbcdd";

    cout << "Before: ";
    cout << str << endl;

    char arr[16];

    func(str, SIZE, arr);

    cout << "After: " << "\t";
    cout << arr << endl;

    return 0;
}

void func(char* str, int len, char* out)
{
    int co = 1;
    int ind = 0;
    bool f = false;
    for (int i = 0; i < len - 1; i++)
    {
        if (str[i] == str[i + 1])
        {
            co += 1;
            if (f) continue;
            f = true;
            out[ind++] = str[i];
            continue;
        }
        if (f)
        {
            f = false;
            out[ind++] = '(';
            out[ind++] = co + '0';
            out[ind++] = ')';
            co = 1;
            continue;
        }
        out[ind++] = str[i];
    }
}

Последний раз редактировалось poli_; 12.12.2022 в 21:59.
poli_ вне форума Ответить с цитированием
Старый 12.12.2022, 22:05   #2
poli_
Новичок
Джуниор
 
Регистрация: 12.12.2022
Сообщений: 3
По умолчанию Замена символов, c++

В предложении заменить одинаковые, стоящие подряд символы одним символом, после которого в скобках указать количество символов, которые были заменены. Можно ли как-то это упростить и сделать с подпрограммой? C++ учу не так давно
Код:
#include <iostream>
#include <string>
using namespace std;

void main()
{
    string str = "aaaacdddd";
    cout << str << endl;
    for (int b = 0, e = 0; b < str.size(); b = e) 
    {
        e = str.find_first_not_of(str[b], b + 1);
        if (e == -1)
            e = str.size();
        if ((e - b) > 1) 
        {
            string rep;
            (((rep += str[b]) += '(') += to_string(e - b)) += ')';
            str.replace(b, e - b, rep);
            e = b + rep.size();
        }
    }
    cout << str;
}
poli_ вне форума Ответить с цитированием
Старый 12.12.2022, 22:11   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если код с continue верный, то:
Код:
    for (int i = 0; i < len - 1; i++)
    {
        if (str[i] == str[i + 1])
        {
            co += 1;
            if (!f)
            {
                f = true;
                out[ind++] = str[i];
            }
        }
        else
        if (f)
        {
            f = false;
            out[ind++] = '(';
            out[ind++] = co + '0';
            out[ind++] = ')';
            co = 1;
        }
        else
        {
            out[ind++] = str[i];
        }
    }
Хотя, пожалуй, в коде "out[ind++] = co + '0';" не хватает обработки случаев многозначного количества повторов.
И не нужно создавать несколько тем с одной и той же задачей.
Цитата:
Сообщение от poli_ Посмотреть сообщение
Можно ли как-то это упростить и сделать с подпрограммой?
Упростить вряд ли. Вынесите весь цикл в подпрограмму.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 12.12.2022 в 22:15.
BDA вне форума Ответить с цитированием
Старый 16.12.2022, 18:16   #4
poli_
Новичок
Джуниор
 
Регистрация: 12.12.2022
Сообщений: 3
По умолчанию Как работает функция c++

Не могу понять, как в данном коде работает функция find_first_not_of. Объясните, пожалуйста
Код:
#include <iostream>
#include <string>
using namespace std;

void func(string&);

void main()
{
    string str = "aaaacdddd";
    cout << str << endl;
    func(str);
    cout << str;
}

void func(string& stroka)
{
    for (int b = 0, e = 0; b < stroka.size(); b = e)
    {
        e = stroka.find_first_not_of(stroka[b], b + 1);
        if (e == -1)
            e = stroka.size();
        if ((e - b) > 1)
        {
            string rep;
            (((rep += stroka[b]) += "(") += to_string(e - b)) += ")";
            stroka.replace(b, e - b, rep);
            e = b + rep.size();
        }
    }
}
poli_ вне форума Ответить с цитированием
Старый 17.12.2022, 11:57   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

В Сети есть ответы и их много. Лень?

В строке (stroka), начиная с позиции b + 1 ищется первое вхождение символа, который не равен символу в позиции с индексом b (stroka[b]). Возвращается позиция такого символа.
Например:
stroka = "mmaaaakcccc"
Если b = 2, то вернётся позиция символа 'k' - 6 (считаем с нуля).
Далее вся часть строки от позиции b до позиции символа 'k' обрабатывается (в приведённом коде).
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заменить символы в строке на С? masha99 Помощь студентам 1 30.11.2018 11:29
В текстовом файле заменить все последовательности идущих подряд пробелов одним пробелом kava13 Общие вопросы C/C++ 0 03.06.2018 19:37
Определить, имеются ли в массиве подряд идущие отрицательные элементы и напечатать и номер первого отрицательного элемента первой группы отрицательных чисел. GoGaCG3 Помощь студентам 1 29.03.2017 16:22
Машина Тьюринга: Определите, имеются ли в слове Х две одинаковые буквы, идущие подряд, если слово состоит из букв "C" и "D" Елешечка Помощь студентам 8 06.04.2014 17:19
Си найти одинаковые идущие подряд элементы и удалить один из них Денни Помощь студентам 8 15.02.2010 01:41