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.