1 / 17
May 2016

Witam.
Próbowałem wcześniej na niekończącej się pętli for, ale przekraczałem limit czasu. Teraz program wygląda tak :wink: nie mam pomysłu czemu wyskakuje 'Błędna Odpowiedź' zważywszy, że przy testach było wszystko OK. Coś jest nie tak, a ja już nie wiem co :stuck_out_tongue_winking_eye:
Z góry dziękuję za pomoc.
A oto kod:

include

using namespace std;

char znak;
int i=0;
int stos[10];

int main()
{
while (cin>>znak)
{
if (znak == '+')
{
cin>>stos[i];
if (i<=9)
{
cout<<":)"< i++;
}
else cout<<":("< }
else if (znak == '-')
{
if (i>0)
{
i--;
cout< }
else cout<<":("< }
}

return 0;

}

kod niekompletny, więc sprawdzić się nie da.

spróbuj taki test:

+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
-
-
-
-
-
-
-
-
-
-
-

Jeżeli tak testujesz, i uważasz, że jest OK: --> http://ideone.com/LJwki339 <-- to bez komentarza :wink:

10 days later

Dalej nie mam pojęcia co jest grane. Podczas kompilacji programu w codeblocks wszystko śmiga poprawnie, a na ideone już nie. Testowałem go chwile i wychodzi na to, że ideone podczas dodawania liczby na stos w ogóle nie zwraca uwagi na if'y.. inkrementuje ciągle ' i ' i wyjeżdża poza tablicę dając uśmieszek w kolejnych jej elementach, które nie istnieją.. Czyli gdy program dostanie z góry całe wejście, a dopiero później odsyła wyjście to leży ;D Z góry dziękuję za pomoc :wink:

Oto kompletny kod:
#include

 using namespace std;

 char znak;
 int i=0;
 int stos[10];

 int main()
 {
         while (cin>>znak)
         {
             if (znak == '+')
                 {
                     cin>>stos[i];
                     if (i<10)
                         {
                             cout<<":)"<<endl;
                             i++;
                         }
                     else if (i==10) cout<<":("<<endl;
                 }
             else if (znak == '-')
             {
                     if (i>0)
                         {
                             i--;
                             cout<<stos[i]<<endl;
                         }
                     else if (i==0) cout<<":("<<endl;
             }
         }
     return 0;
 }

Twój problem tkwi w "funkcji push()".

Najpierw odczytujesz wartość, którą chces wrzucić na stos i od razu zapisujesz do tablicy, a później sprawdzasz czy i < 10. Powinieneś zapisać wartość w tablicy po tym sprawdzeniu i masz AC.

OK. Zrobiłem i trochę wynik testów się poprawił, ale dalej błąd.
Zauważyłem, że po pętli, w której zapisuję liczbę do 10 (nieistniejącego) miejsca w tabeli, program wysyła ' ;( ', po czym zeruje ' i '..ponownie jak dojdzie do 10 miejsca dzieje się taka sama sytuacja.. ' i ' to typ int, nie ma w kodzie żadnego zerowania, a jednak takowe się dzieję..

Wyniki w ideone.com. Pokazałem też ' i ' po każdym wykonaniu pętli
stdin
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
0
+
1
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
0
+
1

stdout
:)
I WYNOSI  1
:)
I WYNOSI  2
:)
I WYNOSI  3
:)
I WYNOSI  4
:)
I WYNOSI  5
:)
I WYNOSI  6
:)
I WYNOSI  7
:)
I WYNOSI  8
:)
I WYNOSI  9
:)
I WYNOSI  10
:(
I WYNOSI  1
:)
I WYNOSI  2
:)
I WYNOSI  3
:)
I WYNOSI  4
:)
I WYNOSI  5
:)
I WYNOSI  6
:)
I WYNOSI  7
:)
I WYNOSI  8
:)
I WYNOSI  9
:)
I WYNOSI  10
:(
I WYNOSI  0
:)
I WYNOSI  1

Czy mógłbyś wkleić obecną postać swojego kodu? Łatwiej się wtedy udziela pomocy...

Przede wszystkim Twoja tablica ma 10 elementów, więc ich indeksy zawierają się w zakresie <0, 9>.

Twoj tok postępowania to:
1. Wstawiasz jakąś wartość na stos pod indeksem i;
2. SPRAWDZASZ czy możesz zapisać (czy i < 10);
3. Jeśli tak Wyświetlasz ":)" i inkrementujesz i.

Powinno być:
1. Sprawdzasz czy możesz zapisać - indeks i < 10
2. Jeśli tak, to wstawiasz coś pod indeksem i na stos, wyświetlasz ":)" i inkrementujesz inseks i.

a zastanowiłeś się, co się dzieje, gdy wczytujesz coś do nieistniejącego miejsca ?

tak naprawdę, to ta wartość gdzieś trafia - gdzie, to zależy od kompilatora (a dokładniej od tego jak kompilator układa zmienne w pamięci) i dlatego dla różnych kompilatorów wynik będzie różny

wystarczy, że dodasz jeden element do zmiennej stos, a będzie AC, choć to raczej nieeleganckie rozwiązanie.

A w przyszłości odradzam używanie nieistniejących elementów tablicy :), wynik rzadko zadowalający, a błąd za to często trudny do znalezienia

9 days later

Witam, moglby ktos spojrzec na ten kod i podpowiedziec dlaczego spoj wyrzuca przekroczenie czasu?

#include  < iostream >
#include < stdio.h >
#include < cstdlib >
using namespace std;

int suma=0, liczba, lel;
int tablica [10];
int main()
{
    for ( ;; )
    {
        char d;
        cin>>d;
        switch(d)
        {
        case '+':
            if (suma<0)
            {
                suma++;
                cin>>tablica[suma];
                cout<<":)"<< endl;
                suma++;
            }
            else if (suma>9)
            {
                cin>>lel;
                cout<<":("<< endl;
            }
            else
            {
                cin>>tablica[suma];
                cout<<":)"<< endl;
                suma++;
            }
            break;
        case '-':
            if (suma>=1)
            {
                suma--;
                cout<<tablica[suma]<< endl;
            }
            else if (suma==0)
            {
                cout<<":("<< endl;
                suma--;
            }
            break;
        default:
        {
            cout<<":("<< endl;
        }
        break;
        }
    }
}
10 months later

Skoro działa, to usuń kody z forum. Swoją drogą następnym razem umieść je w tagu dostępnym pod ctrl + shift + c, inaczej będą "pocięte" jak te co je dałaś. Działających kodów tu generalnie nie umieszczamy.

3 months later

pewnie nie zrozumiałeś treści zadania - więc z kolei nie rozumie cię sędzia

co będzie dla takich danych ?

+ 1 + 2 - - - - + 3 + 4 - -