Rozwijanie wyrazów (dekodowanie RLE)

0

Cześć Wam,

Mam problem z programem, mianowicie muszę wykonać program w stylu dekodowania RLE, a dokładniej rzecz ujmując ciąg znaków np. A3B11 po dekodowaniu ma wyglądać AAABBBBBBBBBBB. Widziałem podobny temat na forum, jednakże w tamtych kodach użyto funkcji zaprzyjaźnionych, których jeszcze nie przerabiałem (jestem nowicjuszem)

Do tej pory napisałem funkcje, która wyciąga liczby ze stringa, natomiast nie mam pomysłu jak wypisać odpowiednią ilość liter. Z góry dziękuje za pomoc!

#include <iostream>

using namespace std;


void liczba(string wyraz)
{
    int ile;
    for (int i = 0; i <wyraz.length(); i++)
    {
        if (isdigit(wyraz[i]))
        {
            while (isdigit(wyraz[i]))
        {
            ile=ile*10+wyraz[i] - '0';
            i++;
        }
        cout <<ile<<endl;
        ile=0;
        }

    }
}


    int main()
    {
        string wyraz="A3B11";
        //cin >> wyraz;
        liczba(wyraz);

        return 0;
    }

1
Borek1948 napisał(a):

Cześć Wam,

... nie mam pomysłu jak wypisać odpowiednią ilość liter.

while(ile--) cout<<litera;

1

Kod toporny, ale łatwy do analizy, działa przy założeniu, że string jest w formie <litera><liczba><litera><liczba>....

string nTimesString(string s, int n) {
    string out = "";
    for (int i = 1; i <= n; ++i) {
        out += s;
    }
    return out;
}
string decode(string s) {
    string out = "";
    string tmp = "";
    string tmp_num = "";
    for (int i = 0; i < s.size(); ++i) {
        if (!isdigit(s[i])) {
            tmp = s[i];
        }
        else {
            int j = i;
            while (isdigit(s[j])) {
                tmp_num += s[j];
                ++j;
            }
            out += nTimesString(tmp, std::stoi(tmp_num));
            tmp_num = "";
            tmp = "";
        }
    }
    return out;
}

int main() {
    std::cout << decode("A2B3C12"); // -> AABBBCCCCCCCCCCCC
    return 0;    
}
3
lion137 napisał(a):

Kod toporny, ale łatwy do analizy, działa przy założeniu, że string jest w formie <litera><liczba><litera><liczba>....

string nTimesString(string s, int n) {
    string out = "";
    for (int i = 1; i <= n; ++i) {
        out += s;
    }
    return out;
}

Doprawdy? A co powiesz na string(7,'x')?

No i kod naprawdę zbyt toporny.

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

void rleDecode(istream &sin,ostream &sout)
{
	
	for(int prev=EOF,count=0,ch=0;;)
	{
		if(isdigit(ch=sin.get())) count=(count*10)+(ch-'0');
		else
		{
			if(prev!=EOF)
			{
				if(!count) sout<<(char)prev;
				else while(count-->0) sout<<(char)prev;
			}
			count=0;
			prev=ch;
		}
		if(ch==EOF) break;
	}
}

string rleDecode(const string &str)
{
	istringstream sin(str);
	ostringstream sout;
	rleDecode(sin,sout);
	return sout.str();
}

int main()
{
	cout<<rleDecode("a3b2");
	return 0;
}
3
std::ostream& rleDecode(std::ostream& out, std::istream& in)
{
    char ch;
    size_t n;
    while (in >> ch >> n) {
         out << std::string(n, ch);
    }
    return out;
}

https://godbolt.org/z/oMPdYh

1 użytkowników online, w tym zalogowanych: 0, gości: 1