Dobre rady dla początkujących

Transkrypt

Dobre rady dla początkujących
Dobre rady dla początkujących
Kontynuując tradycję zapoczątkowaną przez Wujka Kubę, zebraliśmy na tej stronie
wskazówki przydatne dla osób zaczynających swoją przygodę z konkursami
programistycznymi.
64 bitowym typem danych w C i C++ jest long long. Pozwala on na przechowywanie liczb
z zakresu < -2^63, 2^63-1 >, czyli na oko < -9*10^18, 9*10^18 >. Oprócz tego jest
jeszcze typ unsigned long long, który przechowuje liczby z zakresu < 0, 2^64-1 >, tzn. <
0, 1.8 * 10^19 >.
Aby wczytać typ long long, można posłużyć się cin >> zmienna albo
scanf("%lld",&zmienna). Przy czym uwaga! Użytkownicy systemu Windows muszą
wczytywać dane tego typu za pomocą instrukcji scanf("%I64d",&zmienna), ale przed
wysłaniem rozwiązania trzeba pamiętać, by zmienić format %I64d na %lld.
Typ unsigned long long za pomocą cin wczytuje się tak samo, natomiast przy scanf
trzeba zamienić literkę d na u.
Należy pamiętać, by nie przesadzić z wczytywaniem danych za pomocą instrukcji cin oraz
wypisywaniem za pomocą cout. Są to wygodne metody, jednak mniej wydajne niż funkcje
printf/scanf. Jeśli więc trzeba wczytać dużo danych lub wypisać duży wynik (powiedzmy
przynajmniej 10000 znaków) , zapomnij na razie o używaniu cin/cout.
Pisząc program w języku C, nie wolno zapominać o instrukcji return 0 na końcu programu.
Pisząc program w C++ można co prawda tę instrukcję pominąć, jednak do dobrej praktyki
należy jej zamieszczanie.
Przed wysłaniem rozwiązania trzeba pamiętać o usunięciu z kodu instrukcji
system("pause") oraz wszelkich kontrolnych wydruków pomocnych w trakcie
"debuggowania" programu, ale nie wymaganych w treści zadania. Nie każdy o tym pamięta i
często traci się przez to cenne punkty.
Mimo, że i float i double przechowują zmienne rzeczywiste, należy używać tylko double dlaczego? Tego dowiecie się między innymi u nas na studiach ;-). A więc pamiętajcie float
tylko na własne ryzyko.
Często w zadaniach proszą nas o obliczanie wyniku modulo jakaś liczba — czyli używania
dzielenia z resztą %. Należy pamietąć, że mimo iż obliczamy wynik modulo miliard to wynik
mnożenia może wyskoczyć poza typ int. W takim wypadku można używać typu long long
albo — co jest lepszą praktyką na procesorach 32 bitowych — bezpośrednio przed
mnożeniem zrzutować jedną liczbę na long long. Np. a = (a + ( (long long)(b) ) *
c) % modulo. Dlaczego? Tutaj polecam zainteresowanie się trochę asemblerem.
Należy pamiętać, że mimo iż zmienne deklarowane globalnie są zerowane, to zmienne
lokalne nie są zerowane. Program być może działa dobrze na Twoim komputerze, jednak nie
warto tracić punktów - Pamiętaj informatyku młody, zainicjalizuj wszystkie zmienne przed
użyciem.
Często złą praktyką, jaką widzać w kodach osób początkujących, jest deklaracja tablic
lokalnie. Może to powodować, że pamięć skończy nam się szybciej niż można było się
spodziewać, dlatego zawsze deklaruj tablice globalnie. No chyba, że jest ona używana w
funkcji rekurencyjnej, ale wtedy należy się poważnie zastanowić, czy nie da się lepiej tego
napisać.
Pamiętaj, że jeśli Twój program przechodzi test przykładowy, to nie znaczy że jest
poprawnie napisany. Osoby układające zadania to z natury wredni ludzie, którzy dają proste
tesy przykładowe dla zmyłki. Dlatego poświęć trochę czasu na testowanie swego kodu!
Jeśli nie jesteś wstanie wymyśleć programu idealnego, nie załamuj się — zawsze warto
napisać program trochę wolniejszy, aczkolwiek poprawny. Jeśli masz pomysł‚ na jakieś
magiczne heurezy, to warto zaryzykować: dla małych danych zastosować wolniejszy
algorytm, a dla większych — magiczną heurezę.
Zadziwiająco często widzać kod, w którym autor wczytuje znak po znaku z długiej linii. Z
reguły jest to zła praktyka, gdyż lepszym wyjściem jest wczytanie od razu całej linii do
pamięci, a potem bawienie się nią — ale jak od każdej reguły i tutaj są wyjątki.
Używaj funkcji i procedur, jeśli jakiś fragment kodu często się powtarza; proste kopiowanie
fragmentów kodu (metoda crtl+c/ctrl+v) to proszenie się o buga.
Tym, którzy nie znają biblioteki standardowej STL, radzę jak najszybsze zapoznanie się z
nią. Często znacznie upraszcza to pisanie kodu. Niestety osobiście nie znam jakiegoś dobrego
tutoriala.