Problem z zadaniem STOS ze SPOJa – dlaczego przekroczono limit czasu?

0

Mam pytanie bo nie wiem czemu mi nie zalicza zadania SPOJ wyrzuca mi że przekroczono limit czasu. Nie wiem jak to zadanie poprawić żeby w końcu przeszło przez sędziego. Oto link do zadania: https://pl.spoj.com/problems/STOS/ a oto mój kod źródłowy do zadania:

#include <iostream>

using namespace std;

int main ()
{
    int stos[10];
    char znak;
    int liczba, licznik = 0;
    while (true)
    {
        cin >> znak;
        if (znak == '+')
        {
            cin >> liczba;
            if (licznik <= 9)
            {
                stos[licznik] = liczba;
                licznik++;
                cout << ":)" << endl;
            }
            else
                cout << ":(" << endl;

        }
        else if (znak == '-')
        {
            if (licznik >= 1)
            {
                licznik--;
                cout << stos[licznik] << endl;
            }
            else
                cout << ":(" << endl;
        }
    }
    return 0;
}

0

Masz w kodzie coś takiego jak: while (true) tymczasem nigdzie nie widać żadnego break, które przerywałoby wykonywanie się programu. Stąd przekroczenie czasu - program trwa wiecznie.

edit: Nie czytałem treści zadania z linku, który podesłałeś, stąd nie wiem czy to jedyny błąd jaki popełniasz i jakie jeszcze ewentualne problemy tutaj się znajdą.

0

W poleceniu pisze że liczba tych danych jest nieznana więc nie wiem jak określić koniec działania programu. Kto wie jak to poprawić?

0

Może spróbuj z char** argv jako parametr funkcji main()?
W ten sposób będziesz mógł iterować się linia po linii wykrywając znak nowego wiersza. Koniec danych najpewniej określony będzie przez znak końca ciągu '\0'.
Dzięki temu będziesz mógł pobrać pierwszy znak, a następnie w pętli zamiast true wykrywać nextCharacter != '\0'.

1

wystarczy zamienic:

    while (true)
    {
        cin >> znak;

na

while (cin >> znak)
    {

i bedzie ok

0

A jest może jakieś prostsze rozwiązanie ponieważ dopiero zaczynam z C++ i za bardzo nie wiem o czym mówisz. Może jakoś getline czy getchar() tylko nie wiem cyz da się jakoś to zastosować

0
katelx napisał(a):

wystarczy zamienic:

    while (true)
    {
        cin >> znak;

na

while (cin >> znak)
    {

i bedzie ok

To nie zadziała ponieważ strumień wejścia będzie zawsze czekał na podanie jakiegoś znaku i pętla również się nie zakończy

0
kaktus123 napisał(a):

To nie zadziała ponieważ strumień wejścia będzie zawsze czekał na podanie jakiegoś znaku i pętla również się nie zakończy

jak wiesz lepiej to po co pytasz? moze bys chociaz sprawdzil zamiast filozofowac? :D

0

Sprawdziłem i nie działa.
Testuję i sam muszę zamknąć program ręcznie. Co bym nie wpisał to będzie prosić o znak

0

moze upewnij sie ze umiesz uzywac interfejsu SPOJ, bo skoro zrobiles dokladnie to co ci powiedzialam to powinno dzialac.
mi przeszlo bez problemu po tej zmianie https://pl.spoj.com/status/STOS,javarules/

0
kaktus123 napisał(a):

Sprawdziłem i nie działa.
Testuję i sam muszę zamknąć program ręcznie. Co bym nie wpisał to będzie prosić o znak

lepiej uzyj ideone.com do testowania

0

Okej przeszło miałaś rację. Jak testowałem sam to program działał bez przerwy i pętla się nigdy nie kończyła a teraz jak wysyłam do SPOJ-a to działa bez problemu. Mogłabyś mi wytłumaczyć na jakiej zasadzie to działa?

1

gdy uruchamiasz lokalnie i czytasz ze stdin to nigdy nie wysylasz tzw EOF (end-of-file).
mozes to wymusic jesli uruchamiasz pod konsola - https://stackoverflow.com/questions/4702072/how-do-i-force-eof-on-stdin
jesli nie za bardzo ogarniasz konsole, strumienie itp to poczytaj o tym, zanim to zrozumiesz to najlepiej tak jak mowilam - pod ideone.com

1 użytkowników online, w tym zalogowanych: 0, gości: 1