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ęść):
Kopiuj
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:
Kopiuj
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: |
|
|
Kopiuj
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;