Styl programow zaliczeniowych z laboratorium PW *********************************************** 1 Ogolne reguly --------------- 1.1 Ocenie podlegaja jedynie programy przyslane skryptem submit. 1.1.1 Zakazane jest jakiekolwiek pakowanie przysylanych programow (poza tym co robi submit). 1.2 Kazdy program zaliczeniowy musi byc zaopatrzony w Makefile. 1.2.1 Wywolanie make bez parametrow musi przeprowadzic kompilacje wszystkich komponentow. 1.2.2 Wywolanie 'make clean' musi usuwac wszystkie wyniki kompilacji. 1.3 Programy sa kompilowane z opcja -Wall i nie moga generowac zadnych ostrzezen. 1.4 Programy musza dzialac co najmniej w pracowni studenckiej. Tlumaczenie, ze program dziala w domu, nie bedzie brane pod uwage. 1.5 Poleceniem #include mozna dolaczac jedynie pliki naglowkowe (*.h). 1.6 Deklaracje wspolne dla kilku plikow zrodlowych umieszcza sie w plikach naglowkowych (wystepowanie duplikatow definicji, deklaracji i makrodefinicji w plikach zrodlowych swiadczy o niechlujstwie i bedzie karane). 1.7 Uzywanie zmiennych globalnych jest zakazane. Wszystkie dane nalezy przekazywac przez parametry podprogramow. 1.7.1 Wyjatkiem sa sytuacje, w ktorych bez zmiennych globalnych absolutnie nie da sie napisac programu. 1.8 Uzywanie instrukcji goto jest zakazane. 1.9 Wciecia sa dwuspacjowe. Nie wolno uzywac w tym celu tabulatorow. 1.10 Wartosci przekazywane przez wywolania systemowe musza byc badane. 1.11 Identyfikatory i komentarze musza byc zapisywane w jezyku polskim. 2 Nazewnictwo ------------- 2.1 Identyfikatory musza byc znaczace. 2.2 Nazwy makrodefinicji piszemy wielkimi literami. 2.2.1 Kolejne slowa oddzielamy podkresleniem np. BUFFER_LEN. 2.3 Pozostale identyfikatory piszemy glownie literami. Kolejne slowa oddzielamy za pomoca wielkich liter na poczatku drugiego i kolejnych slow, np. biezacaPozycja. 2.4 Poza wyzej wymienionymi przypadkami, uzywanie podkreslenia jest zakazane. 3 Pliki naglowkowe ------------------ 3.1 Plik naglowkowy moze zawierac jedynie: 3.1.1 Makrodefinicje, 3.1.2 Deklaracje podprogramow, 3.1.3 Deklaracje struktur, 3.1.4 Deklaracje typow (typedef). 3.2 Plik naglowkowy nazwa.h ma format: #ifndef _NAZWA_H_ #define _NAZWA_H_ /* deklaracje i makrodefinicje */ #endif 3.3 Poszczegolne deklaracje pliku naglowkowego nalezy rozpoczac w pierwszej kolumnie. 4 Format poszczegolnych konstrukcji ----------------------------------- 4.1 Separatory 4.1.1 Przed przecinkiem nie wystepuje spacja. Po przecinku jest jedna spacja. np. mnoz(345, 657) 4.1.2 Operatory -> . nie moga miec spacji po zadnej stronie. np. osoba.nazwisko biezacy->nastepny 4.1.3 Po prawej stronie jednoargumentowego minusa nie moze wystapic spacja. np. y = -x; y = 2 * (-x + 3); 4.1.4 Po nawiasie otwierajacym i przed nawiasem zamykajacym nie moze wystapic spacja. Dotyczy wszystkich rodzajow nawiasow. 4.1.5 Pozostale operatory sa otoczone pojedyncza spacja, np. znaleziony = pozycja + 5; 4.2 W deklaracjach zmiennych wskaznikowych gwiazdke umieszcza sie przy nazwie zmiennej, np. int *miejsce; 4.3 Deklaracja struktury (lub unii) ma postac: struct nazwa { typ1 pole1; typ2 pole2; ... }; 4.4 Deklaracja podprogramu ma postac: typ_wyniku nazwa(typ_arg1 p_arg1, ..., typ_argn argn); 4.5 Definicja podprogramu ma postac: typ_wyniku nazwa(typ_arg1 p_arg1, ..., typ_argn argn) { typ_zmiennej_lokalnej1 v_zmienna1; typ_zmiennej_lokalnej2 v_zmienna2; ... instrukcje; } 4.6 Instrukcja warunkowa ma jedna z postaci: if (warunek) if (warunek) if (warunek) instrukcja; instrukcja1; instrukcja1; else else { instrukcja2; instrukcje2; } if (warunek) { if (warunek) { if (warunek) { instrukcje1; instrukcje1; instrukcje; } else } else { } instrukcje2; instrukcje2; } 4.6 Petle maja jedna z nastepujacych postaci: for(instrukcje_poczatkowe; warunek; krok) ; for(instrukcje_poczatkowe; warunek; krok) instrukcja; for(instrukcje_poczatkowe; warunek; krok) { instrukcje; } 4.6.1 Tak samo jest gdy zamiast for(...) jest while(...). 4.6.2 Petla do ... while ma nastepujaca postac: do { instrukcje; } while (warunek); 4.7 Instrukcja switch ma nastepujaca postac: switch (wyrazenie) { case stala1: instrukcje; case stala2: instrukcje; ... default: instrukcje; } 4.7.1 Fraza default musi wystepowac nawet jesli wydaje sie to bez sensu (kontrola bledow). 4.7.2 Kazde fraza case ... powinna konczyc sie instrukcja break, exit, return, syserr lub fatal. 4.7.2.1 Brak break wymaga komentarza. 5 Format plikow zrodlowych (*.c) -------------------------------- 5.1 Na poczatku wystepuja polecenia #include. 5.1.1 Pierwsze ida pliki bibliotek standardowych (#include <...>). 5.1.2 Za nimi (po jednej pustej linii) pliki bibliotek uzytkownika (#include "..."). 5.1.3 Jesli plik definiuje biblioteke, nalezy dolaczyc takze jej plik naglowkowy (np. w error.c jest #include "error.h"). 5.2 Za #include wystepuja deklaracje, ktore moglyby znalezc sie w pliku naglowkowym (punkt 3.1). 5.2.1 Jesli jakas deklaracja wystapilaby w wiecej niz jednym pliku zrodlowym nalezy ja przeniesc do pliku naglowkowego. 5.2.2 Nie ma obowiazku deklarowania procedur wystepujacych w biezacym pliku. Nalezy je deklarowac w miare potrzeby tzn. wtedy, gdy wymagana jest deklaracja w rodzaju Pascalowego forward. 5.3 Za deklaracjami wystepuja definicje podprogramow. 5.3.1 Kolejne definicje podprogramow sa poodzielane co najmniej jedna wolna linia. 5.3.2 Nie nalezy oddzielac definicji prodprogramow liniami z komentarzami, np. pelnymi gwiazdek. 5.4 Podprogramy lokalne (prywatne) biblioteki musza byc oznakowane jako static. 6 Komentarze ------------ 6.1 Stosujemy jedynie komentarze z C, czyli /* ... */ 6.2 Komentarze wystepuja tylko tam gdzie znaczenie programu nie jest oczywiste i jasno nie wynika z konstrukcji i znaczacych identfikatorow. 6.2.1 Godna najwyzszej kary glupota jest pisanie komentarzy typu: i++; /* zwiekszenie i o jeden */ 6.3 Komentarza wymagaja bardziej skomplikowane i nieintuicyjne konstrukcje, oraz pola struktur, unii, zmienne i parametry, ktorych przeznaczenie nie wynika jasno z ich nazwy. 6.3.1 Komentarz do instrukcji ma postac: instrukcja; /* komentarz krotki */ instrukcja; /* komentarz * * bardzo * * dluuuuuuuuuuuuuu uuuuuuuuuuuuuuuuuuuuuuuuuuuugi */ 6.3.2 Komentarz do deklaracji zmiennej, typu, struktury, unii ma postac: typ_zmiennej nazwa; /* komentarz krotki */ typ_zmiennych nazwa1, /* komentarz krotki */ nazwa2, /* komentarz krotki */ nazwa3; /* komentarz krotki */ typ_zmiennej nazwa; /* komentarz * * bardzo * * dluuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuugi */ 6.4 Ze wzgledow estetycznych warto zadbac aby ograniczniki komentarzy wystepowaly w tych samych kolumnach (tak jak wyzej). 6.5 Komentarz do funkcji ma postac: typ_wyniku nazwa(typ_arg1 arg1, ..., typ_argn argn); /* opis co funkcja robi * * ... * * MODYFIKOWANE PARAMETRY: ... */ 6.5.1 MODYFIKOWANE PARAMETRY: ... opuszcza sie, gdy ta lista jest pusta. 6.5.1.1 Przez modyfikowane parametry rozumie sie parametry wskazujace obszary pamieci, ktorych zawartosc ulegnie zmianie. 6.5.1.2 Przypomina sie, ze w C sa tylko parametry przekazywane przez wartosc. 6.5.2 Jesli funkcja ma deklaracje, komentarz wystepuje przy deklaracji. 6.5.3 Jesli funkcja ma tylko definicje, komentarz wystepuje przy definicji.