Letnie PIWO − Wskazówki techniczne
- 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).
- Pamiętajcie, aby na końcu funkcji main umieścić instrukcję
return 0 (istotne przy testowaniu programu przez automat).
- Niech Wasze programy nie wypisują tekstów w rodzaju "Podaj liczbę..."
albo "Uwaga, teraz coś wypiszę...". To nie Wersal, tu liczą się
konkrety... :)
- Nie ma potrzeby deklarowania parametrów funkcji main
(nigdy nie będziemy z nich korzystać), jej
nagłówek powinien tak wyglądać: int main().
- Nie ma potrzeby sprawdzania poprawności danych wejściowych. One
są poprawne. Jeśli jest w zadaniu napisane, że N jest mniejsze od
1000, to na pewno jest i już. :)
- Jeśli używamy biblioteki iostream, wpisujemy
dyrektywę
#include <iostream> i wtedy zawsze używamy
instrukcji using namespace
std;.
- Jeśli używamy biblioteki math, wpisujemy dyrektywę
#include <cmath>.
- Jeśli używamy biblioteki stdlib, wpisujemy dyrektywę
#include <cstdlib> (ta bilioteka jest na ogół
niepotrzebna,
jeśli jednocześnie używamy biblioteki iostream).
- Jeśli używamy biblioteki stdio, wpisujemy dyrektywę
#include <cstdio>.
- 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).
- Nigdy nie używamy biblioteki conio ani funkcji
getch! (Działają pod Windows, ale nie są przewidziane pod
Linuksem.)
- 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.
- 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.
- 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).
- 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.)
- 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).
- 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... ;)
- 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];.
- 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 :) )