1 / 73
Sep 2015

Witam. Wiecie może dlaczego nie akceptuje mi mojego kodu?

Pewnie ciężko bedzie Wam go sprawdzić ale skompilujcie go sobie i lata jak marzenie...

Daje link na wklej.org bo tam ładnie widać kod:

http://wklej.org/id/1789832/558

  • created

    Sep '15
  • last reply

    May '21
  • 72

    replies

  • 5.6k

    views

  • 36

    users

  • 17

    likes

  • 29

    links

Frequent Posters

There are 72 replies with an estimated read time of 7 minutes.

Tak wiemy, nie akceptuje, bo twój kod nie potrafi latać jak marzenie wink To raczej twoje marzenie żeby latał. Kod jak już to lepiej wklejaj na ideone.com, będzie jeszcze ładniej i od razu można go tam testować.

Twój kod jest taki paskudny, że aż się nie chce na niego patrzeć, jedyne co można zrobić to [jak radziłeś] skompilować go i porównać wyniki jakie daje ze swoim poprawnym programem, w końcu to tylko 80 przypadków testowych, więc za chwilę podam Ci błąd, ale poczekaj chwilę wink

  1. Próbuj sam znaleźć błąd.
  2. Jak nie musisz nie tablicuj danych wejściowych.
  3. Napisz program na nowo.

Szkic [lepszego] programu:

indent preformatted text by 4 spaces
main(){
  int licznik, testy, n, n_rev, itd; 

cin >> testy;
while (testy--){
   cin >> n;
  cerr << "wynik dla n = " << n << '\t';  
  for (licznik = 0; n != (n_rev = reverse(n)); licznik++)
      n += n_rev;
  cout << n << " " << licznik << endl; 
//wystarczy dopisać funkcję: 
  int reverse(int n){
.....
return reverseN;
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}]

TESTOWANIE - na konsoli
Kompilujesz i uruchamiasz.
Wpisujesz odpowiednio dużą liczbę np 100
wpisujesz liczbę 1
gdy widzisz błąd ctrl C
else
.....
wpisujesz kolejną liczbę np 2
gdy było 100 liczb program się sam kończy np:

c:////> mójLatającyProgram.exe [ENTER]
5
1
wynik dla n = 1 1 0
2
wynik dla n = 2 2 0
itd
.....

Tak rzucając pobieżnie okiem na twój kod muszę niestety stwierdzić, że prawdopodobnie o wiele za mocno przekombinowałeś. To, co zrobiłeś, to tzw. "drabinka ifów" i jest to generalnie bardzo zła praktyka nie tylko pod względem algorytmicznym, ale także czytelności (generalnie bardzo rzadko potrzeba więcej niż 3-4 poziomów zagnieżdżenia). Więc zakładając, że wszystkie rozpatrzone przez ciebie "możliwości" są poprawne (nie sprawdzałem tego), zapewne nie uwzględniłeś wielu innych. Najlepiej by było, jakbyś napisał ten program z czystym umysłem całkowicie od nowa.

Spróbuj rozbić zadanie (problem) na kilka mniejszych podzadań (podproblemów). Tj. zacznij od algorytmu sprawdzającego, czy liczba jest palindromem i na nim się skup. Jak już zrobisz to, to rozwiąż kolejny podproblem, w tym przypadku algorytm odwracania liczby. Jak już uda ci się rozwiązać wszystkie podproblemy, to po prostu połącz je razem w głównej pętli, żeby rozwiązać ostateczny problem (całe zadanie). Powodzenia!

To zadanie można spokojnie testować na konsoli, ale lepiej testować przekierowując dane z pliku lub na ideone.com - wklejając nie tylko kod ale także dane wejściowe, ale na ideone.com nie działą cerr:
http://ideone.com/ughQ97149

I oczywiście takie deklarowanie tablic:

cin >> ile;
int tab[ile];
int tablica[ile];

dla małych wartości ile zadziała [dla gcc/g++] ale nie jest poprawne.

Ja rozumiem, że ten program jest napisany słabo i można to napisać 1000 razy lepiej. Ale na spoju jestem jakies 2 dni chyba i niewiele więcej programuje (o ile można to tak nazwać).

Założenia podane w zadaniu spełnia mój program i dla każdego 1<=n<=80 pokazuje poprawne dane wyjściowe. Dlatego nie wiem dlaczego mój program nie jest akceptowany... Rozumiem, że byłby komunikat, że przekroczyłem czas kompilacji czy coś. Ale pokazuje mi błąd. A program działa na 100% dla wszystkich n-ów (nie działał dla n=10 ale już działa, wystarczyło edytować pętle "if (n>10)" na "if (n>=10)").

No ok, ja to rozumiem, że dopiero zaczynasz i trudno znaleźć ci błędy, ale nie pisz, że lata jak marzenie wink Dlatego też, pokazałem Ci szablon-szkic, jak to napisać ładniej.

wynik dla n = 11 22 1 poprawny 11 0
wynik dla n = 22 44 1 poprawny 22 0
itd

Narbej, tu mnie masz! smile

Poprawiłem ten fakt i mój kod teraz wygląda tak:

http://ideone.com/4KxfuA375

I po wklejeniu do sprawdzenia moim oczom ukazał sie napis: "zaakceptowano".

Dziękuję wszystkim, którzy udzielali sie w temacie. Za jakiś czas, kiedy moje skillsy w pisaniu się zwiększą usiąde do tego zadania jeszcze raz wink

Pozdrawiam.

W takim razie gratuluję.
Nie powinieneś tutaj jednak umieszczać ani działających [AC] kodów ani linków do nich, nawet gdy są brzydkie jak noc wink, a przecież teraz już nikt nie będzie analizował co tam zmieniłeś i jak - SPOJ zaliczył więc ok. Co innego, gdybyś pytał jak napisać ładniej i co tam poprawić, ale przecież już Ci odpowiedziłem i ja i simbax [i sam tak planujesz] napisz od nowa, a ten link [nieśmiało proponuję] najlepiej usuń.

5 months later

Dzień dobry! To mój pierwszy post tutaj smile Gdyby ktos chciał mi pomóc, byłabym wdzięczna...
Napisałam kod, problem rozwiązuje, w konsoli śmiga.
Niestety sędzia uparcie go nie akceptuje.
Dlaczego?
Domyślam się, że to jakiś problem z wczytywaniem danych?
Pomocy unamused

http://wklej.org/id/1927934/164

w złym miejscu odczytujesz wartości smile Wywal cout'a z maina(), a wstaw go w miejscu funkcji pala palindrom():

pala palindrom(pala adm)
{
    if(reverse(adm.liczba)==adm.liczba)
    {
        cout<< adm.liczba << " " << adm.count<<endl;
        return adm;
    } 
    .
    .
    .

i byłoby na tyle smile

Ps; Jako tytuł na forum podawaj: nr. tytuł_zadania smile Pozdrawiam.

Dla danych przykładowych wypisujesz:
1212
11113
50
zamiast:
121 2
1111 3
5 0
ale możliwe, że oprócz tego jest jeszcze jakiś inny błąd. Sprawdź.

Faktycznie, pomogło, wielkie dzięki! smile
Ale właściwie.. dlaczego tak?
Inne programy przy 'cout' w mainie przechodziły

Poniższy fragment powinien wyglądać trochę inaczej.

else
    {
       ...
       ....
       palindrom(adm);

poniżej poprawnie.

else
    {
       ...
       ....
       return palindrom(adm);
@korrohulko Ale właściwie.. dlaczego tak?

O ile się dobrze orientuję - sam programuję stosunkowo krótko - chodzi o to, że w ten sposób jak przekazujesz argumenty do funkcji, to przekazujesz tylko ich kopie (po powrocie z funkcji oryginał, którego próbujesz odczytać poprzez użycie cout tak naprawdę się nie zmienił, zmieniła się kopia, na której pracowałaś w innej funkcji). Żeby pracować na oryginałach, powinnaś przekazać argumenty przez referencję lub tak jak napisał @narbej korzystać z "returna". Jednak return zmienia tylko jedną wartość, natomiast przez referencję lub wskaźniki można operować jednocześnie na kilku oryginałach.

Ja to tak rozumiem ;p Mam nadzieję, że słusznie.

Faktycznie, masz rację - brakowało przechwycenia wyniku funkcji przy pomocy return.

Dziękuję Wam obu smile

Warto może dodać, że ten błąd - brak drugiego returnu to nie moja zasługa ani spostrzegawczość. Gdy[byś] kompilujesz[owała] swój program z opcją -Wall [warning all - drukuj wszystkie ostrzeżenia], kompilator, dla twojego programu wypisał[by] takie ostrzeżenie:

g++ -Wall twojProgram.cpp
twojProgram.cpp: In function ‘pala palindrom(pala)’:
twojProgram.cpp:41:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

Trzeba więc czytać, to co wypisuje kompilator i starać się zrozumieć, co "on" chce nam "po[dpo]wiedzieć" wink

3 months later

Witam chciałby podłączyć się do tematu. Stworzyłem taki oto kod ->`

include

include

using namespace std;

int t, n, liczba, liczba2, licznik;
int tab[10];

int doZmiennej(int *tab, int n);
int doTablicy(int *tab, int liczba);

int main()
{
cin>>t;

for(int i=0; i<t; i++)
{
    cin>>liczba;

    n=doTablicy(tab, liczba);

    while(tab[0]!=tab[n])    
    {
        liczba2=doZmiennej(tab,n);
        liczba+=liczba2;
        licznik++;
        n=doTablicy(tab, liczba);
        cout<<liczba<<" "<<licznik<<endl;
    }
    cout<<liczba<<" "<<licznik<<endl;
    licznik=0;
}

}

int doTablicy(int *tab, int liczba)
{

int i=0;

while(liczba)
{
    tab[i]=liczba % 10;
    liczba/=10;
    i++;    
}

return i-1;

}

int doZmiennej(int *tab, int n)
{
int i=n;
int x=1;
int liczba;

while(i>=0)
{
    liczba+=tab[i]*x;
    i--;
    x*=10;                    
}

return liczba;

}

Kompletnie nie mam pojęcia dlaczego to nie działa. Sprawdzając wynik w pętli wszystko się zgadza. Po wyjściu z pętli dla niektórych liczb pokazuje dobrą wartość dla innych jakieś śmieci. Ślęczę już nad tym jakiś czas i nie wiem w czym jest problem. Może ktoś na to rzucić okiem? Pozdrawiam

kod koszmarny, ale prawie działa :), wystarczy dodać 4 znaki, wliczając 2 znaki '/' aby zasłonić niepotrzebne wyprowadzanie pośredniej wartości i jest AC (a nie WA) - jedynie dzięki temu, że zbytnio ograniczono zakres liczb wejściowych