16 / 75
Jan 2016

Też mam problem z tym zadaniem. U mnie wszystko działa, ale sędzia wywala mi SEGFAULTa.

Edit: AC, usuwam kod.

Tak napisana poniższa funkcja powoduje błąd.

Albo musisz podać zmienną, do której scanf zapisze wczytaną wartość, albo musisz dodać gwiazdkę:
scanf("%*hd"); aby poinformować, że chcesz ją pominąć.

PS
Inna sprawz, twój kod nie podoba mi się wink, ale to może tylko rzecz gustu.

Wielkie dzięki, mam AC. A umiałbyś powiedzieć czymu mój kod Ci się nie podoba, czy to tylko wkestia estetyki?

Raczej estetyka, np ja użyłbym tylko typu int, [iwszędzie zamiast %hd, %d, a w poniższy sposób można deklarować zmienne [także short]:

int   stack[11], // tu dodatkowy 1 element 
       stack_pointer = 0, // też int
       operation;     // też int

getchar_unlocked() - jeżeli bardzo Ci zależy na i/o ale przecież używaśz wolnego scanf i printf, więc tu raczej użyłbym samego getchar()

scanf("%d\n", &stack[stack_pointer**++**]); // lub %hd "\n"dodatkowo konsumuje enter i nie muszę póżniej "zjadać" go getcharem()

Jeżeli jednak chcesz koniecznie użyć short int to wystarczy jeden wyraz short [kompilatror domyśli się, że chodzi o short int].

Czyli w sumie same takie tam drobiazgi.

PS
Wiadomo, że każdy program, można napisać na 1000 sposobów, więc jeszcze taki mój inny sposób [pomijamy-niepotrzebny skanf z gwiazdką, zawsze gdzieś wczytujemy.]
W gałęzi else [+], można najpierw wczytać: scanf("%hd", &stack[stack_pointer]); bez ++ [i po to był mi potrzebny 11 element], a potem dopiero zastanawiać się co zrobić. Jeżeli 11 to tylko wypisujemy ;( i nic więcej, jeżeli nie to incrementujemy wskaźnik i drukujemy wink [bo wczytaliśmy już wcześniej, na samiutkim początku pętli]

Chciałbym jeszcze dopisać małe uzupełnienie. W twoim [pierwotnym] kodzie jest jeszcze mała, niewidoczna wada. Ale najpierw jeszcze jeden pomysł na AC tamtym twoim kodem.
Wystarczy tylko dodać dwie magiczne ukośne kreseczki "//" w odpowiednim miejscu, czyli zakomentować, lub wprost usunąć jedną linijkę. Oczywiście domyślasz się, że chodzi o:
// scanf("%hd");
Jednak taki kod ma tą samą wadę co pierwotny, ale jeszcze bardziej "rozbuchaną" i w jeszcze większym stopniu [jeżeli jest to możliwe]. Dodatkowo, dla specyficznych testów, specjalnie-wrednie przygotowanych, być może, może nawet dawać błędne wyniki.

Dlaczego stosujesz konstrukcję:
if (operation == '-') .....
else if (operation == '+') ...

zamiast:
if (operation == '-') .....
else { ........

Dlatego, że zmienna operation, może od czasu do czasu zawierać także "śmieci" [czyli ta zmienna powinna się tak naprawdę nazywać operationORgarbage wink]

Czy da się to jakoś naprawić/poprawić? Oczywiście, że można. Np.: Należy wczytywać operację jako string [o długości jednego znaku], czyli nie getchar[_unlocked]. A takie wredne testy to np:
+
-1
+
+2
itd

PS
Jeżeli ktoś uczy się C++ + OOP, może napisać mały template klasy stos dla wartości różnych typów [char, int, long long, string itd] i dwie metody - operatory + - działające w tej klasie.

3 months later

Witam, SPOJ zwraca mi błąd. Gdy kompiluję program wszystko gra jak należy, używałem danych wejściowych z zadania - wynik dokładnie taki sam. Będę wdzięczny, jeśli podpowiecie mi co może być przyczyną błędu na SPOJ-u.

Pozdrawiam!

//edit po drobnych zmianach akceptuje kod, dziękuję sig.

Mam błąd kompilacji, i nic dziwnego bo zmienna s pojawia się w switch(s), mimo że wcześniej jej nawet nie deklarowałeś (można zresztą kliknąć na błąd kompilacji i przeczytać komunikat błędu). Ale mimo tego daje ci złą odpowiedź, bo próbujesz wczytać t którego w tym zadaniu niema, masz wczytywać póki coś się będzie na wejściu pojawiać. (więc na przykładowych danych nie mógł zadziałać), więc zamień pętlę for (int i...) na while (cin >> znak) i usuń wczytywanie z wnętrza pętli.
Popoprawiaj to i usuń kod z forum bo ci zaliczy.

ps Do tego funkcje które nic nie zwracają masz zadeklarowane jako zwracające inta.

7 months later

Witam,
Sędzia kompilując kod wyświetla komunikat: "Przekroczony limit czasu". Czy to oznacza, że trzeba ten kod jeszcze usprawnić? Wydaje mi się, że nie ma w nim zbędnych elementów.

//Dziękuje Sig c:

Masz pętlę która nigdy się nie kończy,zamiast while(true) powinno być while(cin>>wybor). Cin z wnętrza pętli naturalnie usuń. Po tej zmianie ci zaliczy.

3 months later

Hej, mój kod w Code Bloksie działa zgodnie z wymogami zadania, ale w Spoju wyskakuje błąd kompilacji - dotyczy to biblioteki conio.h i funkcji getch (). Czym mogę zamienić funkcję getch(), tak aby po wpisaniu liczby także nie pokazywała się ona na ekranie??

include

include

using namespace std;

char dane[10];
int rozmiar=0;

void push()
{
if (rozmiar>=10)
{
dane[rozmiar]=getch();
cout<<":("<<endl;
}
else
{dane[rozmiar]=getch();
rozmiar++;
cout<<":)"<<endl;}
}

void pop()
{
if(rozmiar>0)
{rozmiar--;
cout<<dane[rozmiar]<<endl;}
else cout <<":("<<endl;
}

int main()
{
char wybor;

while(true)
{
wybor=getch();
if (wybor == '-') pop ();
else if (wybor == '+') push();
else cout<<":("<<endl;
}

return 0;

}

9 months later

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.