14 / 75
Sep 2015

Te CTRL F9 i F10 kojarzą mi się z code:blocks czy jakimś innym IDE. Jeżeli faktycznie używasz go, to otwiera się terminal, ale tylko do wprowadzania danych - ten terminal jest pod całkowitą kontrolą IDE i nie możesz tu zrobić [w nim zrobić] przekierowania.
Aby w windowsie mieć dostęp do terminala "systemowego" musisz uruchomić go komendą "cmd" [cmd.exe]. Dopiero w nim, jak znajdziesz się w odpowiednim katalogu możesz właśnie to zrobić. W IDE też pewnie gdzieś w konfiguracji możesz sobie takie przekierowania też wpisać na stałe, lub każdorazowo modyfikować..
Jeżeli używasz menadżera plików np totalcommander to całą taką linijkę polecenia + przekierowania możesz wpisać w lini poleceń total commandera czy jakiegokolwiek innego menadżera, jeżeli ma taką możliwość.

2 years later

niby tak, po prostu przyzwyczaiłem się, że zadania nawet kończące się EOF dało się kończyć pustym Strigiem

a ready() znam, ale z jakiegoś powodu nie korzystam. mam wrażenie(obiecuję sobie w końcu doczytać implementację), że jak zostaną znaki kontrolne w buforze to stream jest ready, co o ile pamiętam kilka razy dało mi WA.

dobra, jeszcze kilka łatwych i czas ruszyć do średnich. tak czy inaczej bez urazy, po prostu mało śpię a to zadanie dawało mi rozstrój żołądka, chociaż rozwiązanie było banalne(a samych wersji algorytmu napisałem ze 4 szukając błędu w obsłudze wejścia)

1 year later

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