|
|
Dobre rady
25.10.2009
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.
- Najnowsze kompilatory języka C++ nie dopuszczają sytuacji, gdy używamy funkcji scanf/printf bez biblioteki cstdio. Pamiętajmy więc, aby zamieszczać instrukcję #include <cstdio> w swoim kodzie! Podobnie funkcja sort nie zadziała na sprawdzaczce bez #include <algorithm>.
- 64 bitowym typem danych w C i C++ jest long long. Pozwala on na przechowywanie liczb z zakresu
, czyli na oko . Oprócz tego jest jeszcze typ unsigned long long, który przechowuje liczby z zakresu , tzn. .
- 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 używając funkcji cin i cout zadbać o to, aby działały szybko - w tym celu należy tuż na początku funkcji main dodać instrukcję ios_base::sync_with_stdio(false). Ta instrukcja niezwykle przyspiesza działanie cin i cout - bez niej są niezalecane - program dla dużych danych wejściowych zapewne nie przejdzie przez limity czasowe.
- 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 testy 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.
|
|