1 / 4
May 2018

Witam, mam pytanie dotyczące języka C++. Otóż wiadomo, że przy zadaniach na SPOJ w których mamy nieokreśloną ilość danych stosujemy zazwyczaj pętle while, która wygląda na przykład tak:

int x;
while (std::cin<<x)
{

}

Otóż w niektórych zadaniach osobiście stosuje pewną funkcję typu inline void, która szybciej wczytuje dane niż gdybym miał używać cin lub nawet funkcji scanf, jednak nie wiem jak mógłbym takową funkcje zastosować, jeżeli mamy styczność z takim typem zadania, gdzie wczytujemy tylko jedną zmienną i jest ona jednocześnie warunkiem pętli while. Dobrym przykładem takiego zadania jest zadanie pod tytułem “Sumy Wielokrotne”

Jakie są jeszcze inne sposoby na to, aby móc wczytywać nieokreśloną ilość danych na SPOJ? Czy można wywołać taką funkcje w warunku pętli?

  • created

    May '18
  • last reply

    Aug '18
  • 3

    replies

  • 1.6k

    views

  • 3

    users

  • 1

    like

  • 1

    link

while (std::cin>>x)

działa, bo przy rzutowaniu obiektu cin na boola ustawione są flagi błędu lub końca pliku.

Aby samemu się zatrzymać musisz sprawdzić samemu czy osiągnąłeś koniec pliku. Jeśli np. odczytujesz wejście znak po znaku to w pewnym momencie otrzymasz znak EOF i będzie to oznaczało, że osiągnąłeś koniec danych wejściowych.

Musisz jeszcze pamiętać o obsłużeniu białych znaków, które mogą się przed nim pojawić. Czyli coś takiego przepisze wejście na wyjście i zakończy działanie wraz z końcem pliku:

 #include <cstdio>

/*   ...   */

char ch;
while((ch = getc(stdin)) != EOF){
    putc(ch, stdout);
}
3 months later

A ja mam trochę inne pytanie odnośnie wczytywania nieokreślonej ilości danych więc się podepnę. Konkretnie chodzi mi o to czy spoj raz odpala program i wczytuje w pętli te dane czy też dla każdego testu osobno uruchamia program. Wydawało mi się że powinien raz program uruchomić ale jak wrzuciłem program działający tylko dla jednego przypadku to spoj tego nie odrzucił i i sprawdzał inne przypadki testowe co mnie bardzo zaskoczyło. Jest to istotne dla zadań typu Sito Eratostenesa gdzie warto raz sobie przygotować dane na których się będzie operować dla wszystkich zestawów testowych.

Rozumiem, że mimo to program został odrzucony w takiej wersji?

Ogólnie spoj jak i każda inna sprawdzarka działa w ten sposób, że kompiluje wysłany kod programu do programu wykonywalnego, a następnie kolejno bierze pliki ze zbioru plików wejściowych, podaje je na standardowe wejście do programu i odczytuje wynik ze standardowego wejścia, a następnie porównuje z oczekiwaną odpowiedzią.

Zazwyczaj kolejne pliki nie są wczytywane podczas napotkania pierwszego błędu, ale to zależy od użytego przez autora sędziego. Np. w niektórych zadaniach otrzymuje się punkty za prawidłowo rozwiązane przypadki testowe i wtedy program kontynuuje, nawet gdy napotka błąd.

Odnosząc się do Twojego pytania: Spoj uruchamia program raz dla każdego pliku testowego i zazwyczaj przerywa działanie po napotkaniu pierwszego błędu. Tam nie ma żadnej magii, która odpalałaby program w pętli lub nie ponieważ prowadziłoby to do niejednoznaczności, co jest odpowiedzią programu.

Zadania zawsze należy robić zgodnie z podaną specyfikacją: albo liczba przypadków na wejściu jest podana, albo nieokreślona albo jest jeden przypadek testowy.