This is an old revision of the document!
Poniższe kryteria mają charakter orientacyjny! Starałem się oceniać całościowo – nie tylko na podstawie jednego konkretnego zadania, lecz także uwzględniając ogólne “rozgarnięcie” (oczywiście z korzyścią dla Was!).
W przypadku wątpliwości odnośnie popełnionych błędów bądź chęci ich omówienia – zapraszam na konsultacje (generalnie podczas laboratoriów nie będę omawiał indywidualnych przypadków).
Wyniki kolokwium: kolokwium_2015-16_1_wyniki.pdf
Punktacja za zadania
Zadanie | Max. pkt. | Na co szczególnie zwracana uwaga? |
---|---|---|
1 | 2 p. | poprawność scanf() i printf() |
2 | 2 p. | poprawność konstrukcji pętli for |
3 | 2 p. | poprawność konstrukcji pętli while |
4 | 3 p. | poprawność deklaracji funkcji (typ funkcji, argumenty) sprawdzenie działania funkcji |
5 | 3 p. | poprawność deklaracji funkcji (typ funkcji, argumenty) sprawdzenie działania funkcji |
RAZEM | 12 p. |
Błędy krytyczne (-2 p.)
for
, pętla while
, funkcja scanf
, wywołanie funkcji). Błędy poważne (-1 p.)
==
zamiast <=
, <
zamiast <=
itp.), podawanie liczby większej o 10 zamiast mniejszej o 10).Błędy drobne (-0,5 p.)
≤
zamiast <=
.
Nie karzę dwa razy za te same błędy związane z brakiem znajomości języka C.
Komentarz prowadzącego:
Wyniki kolokwium: (klik)
Błędy krytyczne (-2 p.)
Błędy poważne (-1 p.)
*
) oraz adresu (&
) – np. w niewłaściwym miejscu.Błędy drobne (-0,5 p.)
%
to reszta z dzielenia, a $\text{mod}(x,n) \in [0,n-1]$).Oto arkusz, na podstawie którego będę oceniał projekty: (klik)
Arkusz należy odczytywać w następujący sposób:
1
w kolumnie pod odpowiednim numerem indeksu.
Przykład (student o numerze indeksu 123456
):
Za kryterium Modułowość na poziomie “żółtym” student otrzymał $0.5 \text{[pkt]} \cdot 0.15 = 0.075 = 7.5\%$ całości punktów. Łącznie za cały projekt student otrzymał 62.5% całkowitej ilości punktów.
Poniżej w możliwie obrazowy sposób przedstawiłem, co rozumiem pod wybranymi kryteriami.
Oto przykład niespójnego nazewnictwa (funkcji):
void wypisz_powitanie(); void calculate_Data(); void wypiszBlad();
Niby wszystkie identyfikatory dość dobrze opisują cel funkcji, jednak mamy tu pomieszanie języków (polski, angielski) oraz sposobu oddzielania członów nazwy.
Spójny system w powyższym przypadku wyglądałby na przykład tak:
void wypiszPowitanie(); void obliczDane(); void wypiszBlad();
Funkcja wypisująca statystyki działania programu składające się z kilku tablic powinna korzystać z funkcji pomocniczej do wypisywania jednej tablicy (a nie zawierać skopiowany kilkukrotnie kod – dla każdej tablicy z osobna).
Poniższy kod nie jest konfigurowalny:
int main() { double masy[3] = {1.2, 3.0, 5.0}; double sily[3]; int i; for (i = 0; i < 3; i++) { // Oblicz ciezar danego ciala. sily[i] = masy[i] * 9.81; } return 0; }
…w przeciwieństwie do takiego oto kodu:
#define ILOSC_OBIEKTOW 3 int main() { const double PRZYSPIESZENIE_ZIEMSKIE = 9.81; double masy[ILOSC_OBIEKTOW] = {1.2, 3.0, 5.0}; double sily[ILOSC_OBIEKTOW]; int i; for (i = 0; i < ILOSC_OBIEKTOW; i++) { // Oblicz ciezar danego ciala. sily[i] = masy[i] * PRZYSPIESZENIE_ZIEMSKIE; } return 0; }
W poniższej instrukcji:
if (a == 5) { ... } else { // pusty `else` }
fragment z else
jest zbędny.
Zbędne fragmenty kodu utrudniają jego zrozumienie oraz zwiększają ryzyko błędu.
Przykładowo, jeśli do rozwiązania danego zadania należy w pewnym momencie wykonać następującą sekwencję operacji:
X
.X
przestanie być spełniony.X
(np. zwiększenie wartości o z góry określoną ilość).
To do dobrych praktyk programistycznych należy użycie pętli for
zamiast pętli while
.
Oto przykłady zbędnych komentarzy (wbrew pozorom często spotykanych!):
int i = 5; i++; // zwieksz `i` o 1
Natomiast poniższej funkcji obliczającej w szybki sposób wartość $x^{-\frac{1}{2}}$ zdecydowanie przydałoby się kilka zdań komentarza…
float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed return y; }
To zresztą przykład autentycznego kodu umieszczonego m.in. w silniku graficznym słynnej gry Quake III… – (klik)
…a jeśli chodzi o moje podejście do oceniania: