Problemem początkujących programistów jest to, że najwyraźniej w dupie mają regułę DRY... Ostatnio też był tu temat odnośnie gry w kółko i krzyżyk, gdzie formatując kod do postaci czytelnej dla człowieka zrobiło się ponad 1000
linii; Nie dziwiłbym się gdyby nie fakt, że można było go skrócić do 200
linii, dzięki zastosowaniu macierzy i patrzeniu na to, co się powtarza i co można skrócić; U Ciebie jest tak samo, masz powtarzające się instrukcje wyboru, nazwy kontrolek i ich indeksy oraz wartości punktacji; Cały ten kod (i jego dalszą część):
case Pytanie1.ItemIndex of
0: Punkty := Punkty + 1;
1: Punkty := Punkty + 2;
2: Punkty := Punkty + 3;
end;
case Pytanie2.ItemIndex of
0: Punkty := Punkty + 1;
1: Punkty := Punkty + 2;
2: Punkty := Punkty + 3;
end;
case Pytanie3.ItemIndex of
0: Punkty := Punkty + 1;
1: Punkty := Punkty + 2;
2: Punkty := Punkty + 3;
end;
można skrócić do takiej postaci:
var
Punkty, I: Word;
begin
Punkty := 0;
for I := 1 to 3 do
Inc(Punkty, TRadioGroup(FindComponent('Pytanie' + IntToStr(I))).ItemIndex + 1);
end;
i to cała filozofia; Ty dla 10
pytań musisałbyś napisać 10
warunków, czyli 50
linii, a mój kod nie zmieniłby się prawie w ogóle, tyle, że zamiast 3
w liczniku pętli było by 10
;
Jeśli natomiast będziesz chciał zrobić mieszane odpowiedzi:
Pytanie |
Odpowiedź |
Punkty |
1 |
a) |
1 |
b) |
3 |
|
c) |
2 |
|
2 |
a) |
3 |
b) |
1 |
|
c) |
2 |
|
3 |
a) |
2 |
b) |
1 |
|
c) |
3 |
|
zrób macierz statyczną i podczas sumowania punktów dodaj odpowiednią wartość z macierzy: |
|
|
const
{ TPunkty: array [Pytanie, Odpowiedź] of Zakres_Punktów }
TPunkty: array [0 .. 2, 0 .. 2] of 1 .. 3 = ((1, 3, 2),
(3, 1, 2),
(2, 1, 3));
var
Punkty, I: Word;
begin
Punkty := 0;
{ DLA 3 PYTAŃ }
for I := 0 to 2 do
Inc(Punkty,
TPunkty[I][TRadioGroup(FindComponent('Punkty' +
IntToStr(I + 1))).ItemIndex]);
{ DURNE FORMATOWANIE BO NIE MIEŚCI SIĘ W JEDNEJ LINII NA FORUM... }
end;
To wszystko; w intrukcji IntToStr(I + 1)
dodane jest 1
, bo indeksujesz kontrolki od 1
, a nie od 0
; Powinieneś nazwy kontrolek ustawić od 0
(Pytanie0
, Pytanie1
...), wtedy do I
nie będziesz musiał nic dodawać;
Jeżeli będziesz chciał zmienić punktację wystarczy, że zmienisz wartości jedynie w macierzy TPunkty
i ich zakres;