Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C/C++] "Сжатие" строки и её ''разжатие"


Автор: Гость_Гала 2.12.2005, 10:55
Здрасьте всем!

Получила такое задание:
1. Написать ф-цию типа void, принимающую в качестве параметров две строки(source и dest). ф-ция должна "сжать" строку source в строку dest в "формате RLE" , т.е. если source имеет такой вид: "qqwwweeeerrrrrtttyy", то dest должна выглядеть так: "2q3w4e5r3t2y".

2. Написать ф-цию типа void, принимающую в качестве параметров две строки(source и dest) и выполняющую прямо противоположное действие, т.е. если source имеет такой вид:"4e5r3t" , то dest должна выглядеть так: "eeeerrrrrttt".

Спасибо.

Автор: Гость_Гала 2.12.2005, 11:07
Забыла добавить, что число повторений символов - не более 9.

Автор: Dov 2.12.2005, 20:33
Цитата
Забыла добавить, что число повторений символов - не более 9.

Не понял. smile smile

Автор: newalex 2.12.2005, 21:19
Просматриваешь строчку посимвольно. Насколько я понял надо учитывать только подряд идущие буквы? Если так то считываешь символ (при этом присваиваешь счетчику едницу), затем следующий. Если он такой же как и прежний, то увеличиваешь счетчик ещё на единицу, если нет то вывод значения счетчика + сам сивол и т.д.

Автор: newalex 3.12.2005, 09:29
А для расжатия... Посимвольно просматривать строку, если цифра, то присваиватьзначению счетчика эту цифру. И for counter downto 0 выводить следующую букву (так как количество цифр ограничено 9, от две цифры следом идти не могут). Затем следующий симол просматривать и т.д...

Автор: Гость_Гала 3.12.2005, 13:43
Цитата(Dov @ 2.12.2005, 20:33)
Не понял

Dov, это такое ограничение, имеется ввиду, что количество подряд идущих одинаковых символов в строке не должно превышать 9.
newalex, спасибо.Теоритически я это понимаю, но на практике не получается, нехватка опыта.


Автор: Dov 3.12.2005, 21:47
Цитата
Dov, это такое ограничение, имеется ввиду, что количество подряд идущих одинаковых символов в строке не должно превышать 9.

А-ааа, понял. Щщас сделаем.

Автор: Dov 3.12.2005, 22:52
Гость_Гала , принимай. Не знаю, даже, что тута комментировать
Код
#include <iostream.h>

// "сжимает" строку
void funcRLE_1(char *source, char *dest)
{
     for(; *source; dest += 2)      
         for(*dest = '0', *(dest + 1) = *source; *(dest + 1) == *source; (*dest)++, source++)
             ;
     *dest = '\0';
}

// "разжимает" строку
void funcRLE_2(char *source, char *dest)
{
    for(; *source; source += 2)
        while((*source)-- > '0')
           *dest++ = *(source + 1);
    *dest = '\0';


int main()
{
    char str1[] = "aaahhggggdddttbbbbbbpppp";
    char str2[81];
    char str3[] = "4f3p4l6g3d2y9b";

    cout <<"Source string: " << str1 << endl;
    funcRLE_1(str1, str2);
    cout <<"funcRLE_1    : " << str2 << endl;

    cout <<"\nSource string: " << str3 << endl;    
    funcRLE_2(str3, str2);
    cout <<"funcRLE_2    : " << str2 << endl;

    return 0;
}

Автор: Гость_Гала 5.12.2005, 19:58
newalex && Dov,огромное спасиба, попробую разобраться. smile smile smile

Автор: Ciminance 24.10.2022, 09:06
Модератор: Сообщение скрыто.

Автор: Queuego 5.11.2022, 03:18
Модератор: Сообщение скрыто.

Автор: Saceaddep 7.12.2022, 08:17
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)