Dobre rady

25.10.2010

 

Zapoczątkowana lata temu przez Kubę Łopuszańskiego lista dobrych rad dla początkujących zawodników - zachęcamy do lektury!

 

  • 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.
  • Używając cout zamiast endl lepiej wypisywać "\n".
  • Programy wykonują się w środowisku 64-bitowym. Oznacza to, że w języku C/C++ rozmiar typu long int oraz wskaźników to 8 bajtów, a nie 4 jak poprzednio. Rozmiar typu int to nadal 4 bajty.
  • 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.
  • 64 bitowym typem danych w C i C++ jest long long. Pozwala on na przechowywanie liczb z zakresu [-2^63, 2^63-1]. Oprócz tego jest jeszcze typunsigned long long, który przechowuje liczby z zakresu [0, 2^64-1].
  • Aby wczytać typ long long, można posłużyć się cin >> zmienna albo scanf("%lld", &zmienna)
  • Typ unsigned long long za pomocą cin wczytuje się tak samo, natomiast przy scanf trzeba zamienić literkę d na u.

 

 

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com