Letnie PIWO − Wskazówki techniczne

  1. Pod Windows używamy kompilatora Dev C++ (wersja 4.9.9.2 lub nowsza), zaś pod Linuksem kompilatora gcc (g++) (wersja 4.1.2 lub nowsza).
  2. Pamiętajcie, aby na końcu funkcji main umieścić instrukcję return 0 (istotne przy testowaniu programu przez automat).
  3. Niech Wasze programy nie wypisują tekstów w rodzaju "Podaj liczbę..." albo "Uwaga, teraz coś wypiszę...". To nie Wersal, tu liczą się konkrety... :)
  4. Nie ma potrzeby deklarowania parametrów funkcji main (nigdy nie będziemy z nich korzystać), jej nagłówek powinien tak wyglądać: int main().
  5. Nie ma potrzeby sprawdzania poprawności danych wejściowych. One poprawne. Jeśli jest w zadaniu napisane, że N jest mniejsze od 1000, to na pewno jest i już. :)
  6. Jeśli używamy biblioteki iostream, wpisujemy dyrektywę #include <iostream> i wtedy zawsze używamy instrukcji using namespace std;.
  7. Jeśli używamy biblioteki math, wpisujemy dyrektywę #include <cmath>.
  8. Jeśli używamy biblioteki stdlib, wpisujemy dyrektywę #include <cstdlib> (ta bilioteka jest na ogół niepotrzebna, jeśli jednocześnie używamy biblioteki iostream).
  9. Jeśli używamy biblioteki stdio, wpisujemy dyrektywę #include <cstdio>.
  10. Nie używa się nazw plików nagłówkowych kończących się na ".h" (używane tylko w klasycznym ANSI C, w C++ są przestarzałe).
  11. Nigdy nie używamy biblioteki conio ani funkcji getch! (Działają pod Windows, ale nie są przewidziane pod Linuksem.)
  12. Jeśli chcemy, aby program uruchomiony pod Windows wyświetlił swój wynik w oknie, a następnie "zaczekał" na nas, aż przeczytamy tekst, wtedy można użyć polecenia system("pause");. Program z takim poleceniem skompiluje się także pod Linuksem, ale podczas wykonania napisze, że nie rozumie polecenia pause (jest to polecenie systemu DOS). Wystarczy dopisać przed tym poleceniem symbol komentarza //, aby program zadziałał bez problemu pod Linuksem.
  13. Wypisując na ekranie rezultat programu (poleceniem cout << ... albo printf), zawsze należy zakończyć go znakiem nowego wiersza, chyba że w temacie zadania jest wyraźnie określone inaczej.
  14. Typ danych long oraz long int to dokładnie to samo, co typ int (4-bajtowa liczba całkowita, od −2147483648 do 2147483647). Nie ma więc sensu ich używać. Jeśli mamy istotny powód, aby użyć większego typu, wtedy możemy użyć typu long long (8-bajtowa liczba całkowita, od −9223372036854775808 do 9223372036854775807).
  15. W języku C/C++ nie ma operatora potęgi liczby całkowitej (operator ^ oznacza bitową operację XOR). Wyjątek stanowi potęga liczby 2, którą można uzyskać przez przesunięcie bitowe, np. 2 do potęgi piatej to (1 << 5) (liczba 1 przesunięta w lewo o 5 miejsc, czyli 32). Takie wyrażenie dobrze jest wziąć w nawiasy okrągłe, aby nie pomyliła się ta operacja z dopisywaniem do strumienia (cout << ...). Inne potęgi całkowite trzeba liczyć "własnym sumptem". (Biblioteczna funkcja pow nadaje się tylko do obliczeń zmiennoprzecinkowych, na typie double.)
  16. Starajcie się unikać operacji zmiennoprzecinkowych (z natury niedokładnych i zdradliwych) i zamiast nich − jeśli to możliwe − stosujcie operacje całkowitoliczbowe (zawsze dokładne). Na przykład zamiast n < sqrt(m) lepiej napisać n*n < m (oczywiście, o ile mamy pewność, że n jest nieujemne).
  17. W języku C++ (w przeciwieństwie do ANSI C) mamy do dyspozycji "dedykowany" typ logiczny czyli bool. Niektórzy zamiast niego używają typu int. To działa, ale − moim zdaniem − nieładnie wygląda... ;)
  18. Jeśli deklarujecie tablicę, np. int A[N];, to wtedy jej rozmiar (N) musi być wartością stałą. Niedopuszczalna jest konstrukcja w rodzaju: int N; cin >> N; int A[N];. To nic, że kompilator to zaakceptuje − jest to niezgodne ze standardem języka C++ i na pewno sprawi Wam kiedyś niemiłą niespodziankę dla dużych N. Jeśli już potrzebujecie tablicy "na miarę", to prawidłowo powinno być tak: int N; cin >> N; int *A = new int[N];.
  19. Pamiętajcie o inicjalizacji (nadaniu początkowej wartości) zmiennych. W C++ problem automatycznej inicjalizacji jest dość złożony i naprawdę łatwo utworzyć zmienną, której wartość będzie przypadkowa. Dlatego proszę Was, abyście przyzwyczaili się do bezwzględnej inicjalizacji wszelkich używanych zmiennych (zarówno skalarnych jak i tablic). To oszczędza wiele problemów, zwłaszcza podczas konkursu, gdy jest mało czasu. Jeśli chcemy wyzerować całą tablicę, to wystarczy napisać int A[100] = {0};. Jeśli chcemy wypełnić ją inną wartością niż zero, wtedy musimy użyć pętli. (Zosiu, thx za konstruktywny komentarz :) )