1 / 9
May 2016

Mam problem ponieważ sędzia spoja wykazuje błąd ale wszystko działa :confused:
Może sposób nie jest najlepszy ale działa :wink:
http://pl.spoj.com/problems/FLAMASTE/6

`#include

using namespace std;

int n;
string napis;

int main()
{
cin>>n;

for(int i=0;i<n;i++)
{
    cin>>napis;

    for(int j=0;j<napis.length(); j++)
    {
        int k=0;
        while(napis[j]==napis[j-1])
        {
            k++;
            j++;
        }
        if(k>=2) cout<<k+1<<napis[j];
        else if(k==0) cout<<napis[j];
        else if(k==1)cout<<napis[j-1]<<napis[j];

    }
    cout<<endl;
}
return 0;

}
`

  • created

    May '16
  • last reply

    May '16
  • 8

    replies

  • 1.3k

    views

  • 5

    users

  • 2

    links

dwie sprawy wystarczy poprawić:

while(napis[j]==napis[j-1])

oraz

cout<<k+1<<napis[j]

Zauważ, że jak zaczynasz pętlę od 0, to nie masz tak jakby elementu (j-1) :slight_smile:

jak to poprawisz, to w wyniku zobaczysz, co trzeba poprawić przy "cout-cie" :slight_smile:

Ps: Niepoprawny sposób wstawienia kodu: moze być tak, że ktoś Ci nie odpowie przez błędne wstawianie ;p

kod jest trochę niekompletny :slight_smile:
ale niezależnie od tego powstaje pytanie - jakie wartości mają:

napis[-1] i napis[napis.length()]

bo do takich wartości (całkowicie nielegalnie) program się odwołuje, dla niektórych kompilatorów nie uda się programu uruchomić.

a tam gdzie się uda, wyjście jest niepoprawne - przekieruj wyjście do pliku i obejrzyj wynik w jakim edytorze, który pozwala na oglądanie w hex-ie

W stringu litery są numerowane od zera, więc ostatnia ma "numer" lenghth() - 1. Ty natomiast odwołujesz się do znaku końca stringa, co może zostać uznane za wyjście poza dozwolony obszar. Bo co np jakbyś nie czytał tylko coś tam zapisał? String mógłby stać się "nieskończony" i zawierać rzeczy których twórca programu wolał by nie ujawniać. (np hasła dostępu).

A jak sprawdzasz czy działa? Wystarczyłoby jakbyś sprawdził dla testów z zadania!!!!????

Lub popraw. to co już Ci sugerował między innymi anim_90 plus ... w sumie 4 [słownie cztery] poprawki.

indeksowanie od 1 [poprawiłeś]
indeksowanie do length() [tzn nie do '<'length(), ale wbrew dobrym radom <= length(), pod tym indeksem [napis.length()] jest zupełnie legalnie dostępny znak == 0
zawsze wypisujesz [j-1] - w twoim programie wypisywanie [j] jest błędem
no i zrób coś z tym: `cout<<k+1<<napis[j] <--` tu są aż dwa błędy [1 błąd - patrz moją radę wyżej] drugi - przeczytaj treść UWAŻNIE zadania lub przetestuj a anjlepiej i to i to.

Dobra rozwiązałem to tak ale jest strasznie zagmatwane i nadal sędzia nie przepuszcza :frowning:

#include <iostream>
#include <stdio.h>

using namespace std;

int n;
string napis;

int main()
{
    cin>>n;

    for(int i=0; i<n; i++)
    {
        cin>>napis;
        cout<<napis[0];

        for(int j=1; j<=napis.length(); j++)
        {
            int k=0;
            while(napis[j]==napis[j-1])
            {
                k++;
                if(j==(napis.length()-1))
                {
                    if(k>=2) cout<<k+1<<napis[j];
                    else if(k==0) cout<<napis[j];
                    else if(k==1)cout<<napis[j];
                    goto so;
                }
                j++;
            }
            if(k>=2) cout<<k+1<<napis[j];
            else if(k==0) cout<<napis[j];
            else if(k==1)cout<<napis[j-1]<<napis[j];

        }
        so:
        cout<<endl;
    }
    return 0;
}

Więc nie gmatwaj, tylko wróć do pierwszego, przysłanego kodu i popraw tylko to co Ci napisałem, ale dokładnie to wszystko. Nic więcej nie zmieniaj i nie kombinuj. Po taych poprawkach dostałem AC.