Kurs C++
Mam problem z zadaniem ze SPOJa
[pytanie/odpowiedź] O różnych podstawowych sprawach powodujących u początkujących problemy z automatycznie sprawdzanymi zadaniami.Standardowe wejście i wyjście są od siebie niezależne!
Jak wyżej.
Standardowe wejście i wyjście są od siebie niezależne! Większość początkujących błędnie zakłada, że standardowe wejście i wyjście to jest po prostu to, co się widzi w konsoli. A przez to, że widzi się je w jednej konsoli, to pewnie można je przypadkiem pomieszać, więc jak SPOJ najpierw podaje dane i potem sprawdza wyniki, to trzeba wczytać
wszystkie dane, żeby potem wypisać
wszystkie wyniki. A żeby to zrobić, trzeba gdzieś dane zapisać, więc w kodzie pojawia się wektor, który bezsensownie użyty marnuje czas i pamięć - cenne i ograniczone zasoby.
Przykładowe zadanie:
Wejście: N - liczba przypadków testowych [ Niezależnych! ] Dla każdego przypadku testowego: a b - liczby do dodania
Wyjście: N wyników dodawania a+b |
#include <iostream>
int main()
{
int N;
std::cin >> N;
for( int i = 0; i < N; ++i )
{
int a, b;
std::cin >> a >> b;
std::cout << a + b << '\n';
}
}
Z perspektywy użycia tego programu w konsoli i ręcznego wprowadzania danych, dane są przemieszane z wynikami, co nie ma najmniejszego znaczenia, bo to jest po prostu efekt tego, że dane z wejścia i wyjścia są wyświetlane w jednym miejscu.
4
1 2
3
4 5
9
11 0
11
100 200
300
Na SPOJu i innych automatycznych sprawdzarkach dane są zwykle wczytywane z pliku, więc mamy sobie plik
dane.txt:
4
1 2
4 5
11 0
100 200
Uruchamiamy program z przekierowaniem pliku na standardowe wejście (
Plik jest użyty tylko w poleceniu uruchamiającym program, nie w kodzie programu!):
C:\>a <dane.txt
3
9
11
300
I na wyjściu są wyświetlane tylko wyniki, bo standardowe wejście jest związane z plikiem, nie konsolą. Podobnie można przekierować wyjście, do pliku, czy nawet na wejście innego programu, więc nic nie musi być nigdy wyświetlane. Przypominam, że programy sprawdza
automat.
Jak pracujesz przy zadaniu, które wymaga dużo danych, przekierowuj je z pliku, zamiast kopiować, czy wpisywać ręcznie. Work smarter, not harder. |
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.