21 / 75
Sep 2017

Witam , mógłby ktoś zerknąć na ten kod oraz wskazać mi co jest nie tak z tym kodem ?

#include

using namespace std;

int rozmiar;
int dane;
double *tab = new double [dane];

void push()
{
cin >> tab[rozmiar];
rozmiar = rozmiar +1;
cout<<":)"<<endl;
}

void pop()
{ if(rozmiar>=1)
{
cout<<tab[rozmiar]<<endl;
rozmiar = rozmiar - 1;
}
else
{
cout<<":("<<endl;
}

}

int main()
{

char znak;
while(cin>>znak)
    {

        switch(znak)
            {
              case '+' : push(); break;
              case '-' : pop (); break;
            }
    }

return 0;

}

po pierwsze nie kompiluje się, zapewne na skutek złego wklejenia kodu - wskazane jest przekazywanie kodu poprzez link do ideone.com15 z jednoczesnym wstawieniem tam danych przykładowych

po drugie (po doprowadzeniu do kompilacji) i wstawieniu danych przykładowych nie daje poprawnego wyniku (dziwne, że w ogóle daje jakiś wynik)

a generalnie, to program nie realizuje tego, co podano w zadaniu - przeczytaj uważnie treść zadania

14 days later
#include <iostream>
using namespace std;

int main()
{
    int stos[10], ile=0,w=1;
    string znak;

    while(cin>>znak)
    {
        if(znak=="+")
        {
            if(w!=2)
            {
                if(w==3)ile++;
                w=4;
                cin>>stos[ile];
                cout<<":)"<<endl;
                ile++;
            }
            else cout<<":("<<endl;
            if(ile>9)
            {
                w=2;
                ile--;
            }
        }
        else
        {
            if(znak=="-")
            {
                if(w!=1)
                {
                    if(w==4)ile--;
                    w=3;
                    cout<<stos[ile]<<endl;
                    stos[ile]=NULL;
                    ile--;
                }
                else
                {
                    cout<<":("<<endl;
                }
                if(ile<0)
                {
                    w=1;
                    ile++;
                }
            }
            else
            {
                cout<<":("<<endl;
            }
        }
    }
    return 0;
}

Pal licho bibliotekę, każdy zgadnie pewnie o jaką chodzi, gorzej, że nie wkleiło twojego pytania i opisu sytuacji, a to jest już nie do odgadnuięcia. ;-).

10 months later

Pytanko mam czy rezultaty mają wyświetlać się na bieżąco czy już przy danych wejściowych?

SPOJ nie sprawdza w którym momencie wypisujesz dane (nie licząc zadań interaktywnych). Możesz je wypisać nawet bez wczytywania danych wejściowych, o ile potrafisz to zrobić :wink:

Witam
Mam pewien problem z zadaniem STOS. Po pewnych modyfikacjach przed ktorymi mialem problem z przekroczonym limitem czasu wyskoczyl mi komunikat o blednym programie.Natomiast szczerze mowiac analizujac go kilka razy nie moge za bardzo znalezc bledu.Liczylbym na jakas wskazowke.Nie szukam gotowego rozwiazania ale podpowiedzi

Mam nadzieje ze dobrze wrzucilem kod

Po zamianie warunku na while(cin>>sign) jest AC. Dlaczego - za bardzo nie wiem.

Faktycznie poszlo.Wczesniej juz wrzucalem warunek w takiej postaci ale nie chcialo wejsc.Byc moze literowka gdzies.Warunek z EOF wydawal mi sie bardziej pewny ale no nic dobrze by bylo wiedziec dlaczego tak a nie inaczej .Dzieki za podpowiedz.

Cześć, a co w przypadku, kiedy piszę np. w języku C#, gdzie funkcja “ReadLine” nie zwraca, ani true ani false, więc jak zrobić inaczej pętlę jak nieskończoną, wydaje mi się, że wszystko robię dobrze, tylko błąd leży w przystosowaniu tego zadania do różnych języków :confused:

– edit

Dobra troszeczkę za wcześnie zapytałem, w C# po prostu nie można deklarować nowych zmiennych w while, ale można zastosować bez obaw następującą konstrukcję: while((zmienna = Console.ReadLine()) != null)

Może komuś się przyda!

3 months later

Cześć,
Od 1,5 tygodnia próbuję skrobać w c++. Ostatnim zadaniem z jakim próbuję się zmierzyć to stos. Niby kod działa, poprawnie wyrzuca a sędzia jednak informuje o przekroczonym czasie. Próbuję na różne sposoby, ale efekt jest taki sam. Co robię nie tak? Z góry dziękuję za pomoc.

https://ideone.com/amACop24

zdecydowanie lepiej :slight_smile:

twoja pętla nigdy się nie kończy (dlaczego ? - musisz sam poszukać odpowiedzi)

to teraz przeczytaj ten wątek, znajdziesz informację jak poprawnie zrobić, aby zakończyć pętlę, gdy skończą się dane

Wytłumacz mi proszę w takim razie bo nie rozumiem. Mam że jeśli znak + to wybór 1, jeśli - minus to wybór 2. Jeśli cokolwiek innego to wybór 3. Pętla działa do momentu kiedy wybór jest <3. To nie jest poprawne zakończenie pętli?
Ps. Zadziałało dodanie linii while(cin>>znak). Natomiast wciąż nie rozumiem dlaczego tamto nie działało. Co więcej, teraz kiedy podam pusty string, albo inny znak program działa dalej. Dlaczego więc jest poprawnym rozwiązaniem?

zakończenie jest poprawne, niepoprawne jest twoje założenie, że tym znakiem będzie coś innego niż ‘+’ lub '-'
efekt wiadomy :slight_smile:

zmienna znak nie zostanie zmieniona, jeżeli dane w strumieniu wejściowym się skończą

czyli dla danych:

+ 1
-

program nigdy się nie skończy (a przynajmniej do momentu, gdy zostanie przerwany z zewnątrz)

skończył by się np. dla:

+1
-
*

ale w zadaniu nie ma, że na zakończenie jest jakiś nie biały znak

więc powinieneś uzupełnić swoje informacje o strumieniach wejściowych (o wyjściowych pewnie też)

3 months later

Męczyłem się kilka godzin, aby zrobić coś takiego i nie wiem co dalej. Może jutro na coś wpadnę, ale na chwilę obecną rozkładam ręce. Najchętniej bym to zrobił przez getchar() ale nie wiem jak.


Nowy kod wszystko działa poprawnie tylko jest przekroczony limit czasu

@bombardello zastanów się dokładnie co robisz np tutaj:

cin >> a;
switch (a)
{
case'+':
{
	cin >> dane[rozmiar];

	rozmiar++;
	cout << ":)" << endl;

	if (rozmiar == 9)cout << ":(" << endl;
	break;
}

Załóżmy, że próba dodania elementu się nie uda to czemu rozmiar jest zmieniany i zostaną wypisane również ‘:)’? Zastanów się jak uniknąć próby odczytania pamięci poza tablicą. Włącz ostrzeżenia kompilatora, lub/i czytaj je - pomogą znaleźć banalne błędy:

prog.cc:38:10: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
        }while(a=100);
               ~^~~~
prog.cc:38:10: note: place parentheses around the assignment to silence this warning
        }while(a=100);
                ^
               (    )
prog.cc:38:10: note: use '==' to turn this assignment into an equality comparison
        }while(a=100);
                ^
                ==

Przeoczenie naprawiłem(banalny błąd), ale przekraczam limit czasu. Dzięki za te ostrzeżenia. Nie wiedziałem on nich. Jak dam == to ne funguje jak powiadają sąsiedzi z południa.
Działa po picy(awesome). Wystarczyło przeczytać linijka po linijce co robi program.
Dziękuję wszystkim za pomoc.