2 / 6
Jun 2019

#include

using namespace std;

int main()
{
int x;
cin>>x;
for(int i=0; i<x; i++)
{
string napis;
cin>>napis;
int dlugosc=napis.length();
int p=0,d,ile;
while(p<dlugosc)
{
ile=2;
if(napis[p]!=napis[p+2])
{
cout<<napis[p];
p++;
}

        else
        {
            d=p+1;
            while(napis[d]==napis[d+1])
            {
                ile++;
                d++;
            }
            cout<<napis[p]<<ile;
            p+=ile;
        }

    }
    cout<<endl;
}
return 0;

}

Nie jestem w stanie znaleźć błędu .
Proszę więc o pomoc…

  • created

    Jun '19
  • last reply

    Jul '19
  • 5

    replies

  • 850

    views

  • 4

    users

  • 1

    like

  • 2

    links

1 month later

Witam. Wiem, że mam błąd, gdy czasami liczba do wstawienia jest dwucyfrowa. Nie umiem go jednak naprawić. Mógłby mi ktoś pomóc? Link:https://ideone.com/xtLQqd3

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int t;
string napis;
int main()
{
    cin>>t;
    for(int i=0; i<t; i++)
    {
        cin>>napis;
        int dlugosc=napis.length();
        char sprawdzanie;
        int licznik=1;
        for(int j=0; j<=dlugosc; j++)
        {
            if(j==dlugosc)
            {
                if(licznik>2)
                {
                    int a=licznik;
                    stringstream ss;
                    ss<<a;
                    string str=ss.str();
                    napis.replace(j-licznik+1,licznik-1,str);

                }
            }
            else
            {
                if(sprawdzanie==napis[j])
                {
                    licznik++;
                }
                else if(licznik>2)
                {
                    int a=licznik;
                    stringstream ss;
                    ss<<a;
                    string str=ss.str();
                    napis.replace(j-licznik+1,licznik-1,str);
                    int b=0;
                    if(a>100)
                    {
                        b=2;
                    }
                    else if(a>10)
                    {
                        b=1;
                    }
                    j=j-licznik+2+b;
                    dlugosc=dlugosc-licznik+2+b;
                    licznik=1;
                }
                else
                {
                    licznik=1;
                }
                sprawdzanie=napis[j];
            }
        }

        cout<<napis<<endl;
    }

    return 0;
}

Kod jest strasznie nieczytelny i w dodatku nawet nie działa dla podanych testów. Początkową myślałem, że problemem jest inicjalizacja zmiennych (np. ‘sprawdzanie’), albo niepoprawne liczenie długości pod koniec ciągu (j = j - licznik + 3 + b). Przyczyna leży u złym użyciu funkcji replace. Proponuję też napisanie kodu od nowa.

Kilka dodatkowych porad:

  • Włącz ostrzeżenia kompilatora - łatwiej znajdziesz trywialny błędy takie jak niezainicjalizowane zmienne
  • Nazwy zmiennych nie powinny być jednoliterowe(z wyjątkiem iteracji pętli) - to bardzo utrudnia czytanie kodu
  • Nie używaj zmiennych globalnych
  • Nie używaj ‘using namespace std’
  • Od C++11 do konwersji liczby na string możesz użyć funkcji std::to_string
  • Nie twórz więcej zmiennych gdy ich nie potrzebujesz(patrz zmienne ‘a’)
  • Nie zagnieżdżaj instrukcji warunkowych gdy możesz użyć else if