Rozwijanie wyrazow c++

0

Cześć,

Mam do napisania program, który po wprowadzeniu np A4B5, na wyjściu daje nam AAAABBBBB, na tę chwilę program zachowuję się tak ze na wyjściu daje AAAABBBBBBBBBBBBBBBBBBBBBBBB... Wychodzi na to ze daję mi AAAA, ale potem bierze pod uwagę zamiast tylko 5, liczbę 45....

Poniżej kod, gdzie szukać błędu?

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>

using namespace std;


int konwersjaIntNaString(string liczba)
{

    int liczbaWIncie;
    istringstream iss(liczba);
    iss >> liczbaWIncie;
    return liczbaWIncie;
}

int main()

{
    string wyrazDoRozwiniecia;
    string powtarzajacySieZnak;
    string rozpakowanyWyraz;
    string liczbaWyraz;
    int dlugosc;
    int iloscPowtorzenZnaku;
    int i=0;

    cin >> wyrazDoRozwiniecia;

    dlugosc=wyrazDoRozwiniecia.length();
    while (i<dlugosc)
    {
        if((wyrazDoRozwiniecia[i]>='0') && (wyrazDoRozwiniecia[i]<='9' ))
        {
            powtarzajacySieZnak=wyrazDoRozwiniecia[i-1];


            while ((wyrazDoRozwiniecia[i]>='0') && (wyrazDoRozwiniecia[i]<= '9'))
            {
                liczbaWyraz=liczbaWyraz+wyrazDoRozwiniecia[i];
                i++;

            }
           iloscPowtorzenZnaku=(konwersjaIntNaString(liczbaWyraz));
           cout << iloscPowtorzenZnaku<<endl;
            for (int j=1; j<=iloscPowtorzenZnaku-1; j++)
            {
                rozpakowanyWyraz=rozpakowanyWyraz+powtarzajacySieZnak;

            }
            iloscPowtorzenZnaku=(konwersjaIntNaString(liczbaWyraz));
            iloscPowtorzenZnaku=0;
        }

        else
        {
            rozpakowanyWyraz=rozpakowanyWyraz+wyrazDoRozwiniecia[i];
            i++;
        }


    }
    cout << rozpakowanyWyraz;

}


2

Pomimo że kod jest krótki, ciężko się go czyta. Szukaj błędu w błędnych nazwach (np. konwersjaIntNaString jest działaniem odwrotnym, wtf) i słabej modularyzacji.

Swoją drogą, implementacja RLE powinna być mega krótka.

0

A jak na wejściu będzie AB10, to na wyjściu ma być ABABABABABABABABABAB, czy A (a potem błąd, bo po A nie ma liczby), czy może AB (a potem jakiś błąd, bo 0 niczemu nie odpowiada)?

0

liczbaWyraz=liczbaWyraz+wyrazDoRozwiniecia[i];

Tutaj dopisujesz nową liczbę, co w efekcie daje 45 zamiast 5 po drugim sprawdzaniu.

Staraj się rozbijać cały kod na małe funkcje z odpowiednimi nazwami to łatwiej Ci będzie analizować całość.

Poczytaj o debugowaniu kodu.

0

Problem jest z wejsciem, czy liczby mogą być dwu i więcej cyfrowe, np: A100B1? Trzeba się przyłożyć do "sparsowania" tego inputu w listę par, <string, int>, a potem wydruk już trywialny. I, jak wyżej, rozbijaj kod, bo czytanie i debugowanie będzie koszmarne.

0

@enedil:
Jak wpiszemy AB10 to powinno być ABBBBBBBBBB

@lion137
Tak program ma założenie ze mogą wystąpic liczby a nie tylko cyfry.

Tylko tak jak napisał kolega wyżej podczas drugiego sprawdzenia wczytuje 45 zamiast 5.

Na tę chwilę mam zrobić program w oparciu o kod powyżej. Wiem ze da się go zrobić o wiele bardziej czytelnie.

1

Strasznie przekombinowane:

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

void decode(istream &sin,ostream &sout)
{
	size_t cnt=0;
	for(int prev=EOF,ch=0;ch=sin.get();)
	{
		if(isdigit(ch)) (cnt*=10)+=ch-'0'; // cnt=cnt*10+(ch-'0');
		else
		{
			while(cnt-->1) sout.put(prev);
			if(ch==EOF) break;
			sout.put(prev=ch);
			cnt=0;
		}
	}
}

/* jeżeli trzeba z napisu na napis
string decode(const string &in)
{
	istringstream sin(in);
	ostringstream sout;
	decode(sin,sout);
	return sout.str();
}
*/

int main()
{
	//cout<<decode("A2X7")<<endl; // jeżeli trzeba z napisu na napis
	decode(cin,cout);
	return 0;
}
3

To zadanie jest ewidentną odwrotnością tego: Zadanie Spoj Flamaster

std::ostream& decode_flamaster(std::istream& in, std::ostream& out)
{
    char ch;
    while (in >> ch) {
        int repeat = 1;
        if (std::isdigit(in.peek())) {
            in >> repeat;
        }
        out << std::string(repeat, ch);
    }
    return out;
}

https://godbolt.org/z/jETPdK

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