Entwickler-Ecke

Sonstiges (Delphi) - Programmerklärung


Funkydonkey - So 12.12.10 13:51
Titel: Programmerklärung
Könnte mir viellecht jemand, die einzelen Programmschritte folgenden Programms erklären? Ich schreibe Anfang nächter Woche eine Informatik Klausur über dieses Programm, nur blicke ich nicht vollständig durch. Wäre super wenn mir jemand helfen könnte.

Vielen Dank im Vorraus!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
program Nim;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
(* ---------------------------------------------------*)
UNIT Unit1;
// NIM-Spiel [02] Dez 2010
INTERFACE
USES
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
TYPE
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Label_XOR: TLabel;
Panel1: TPanel;
Button_Analyse: TButton;
PROCEDURE Edit1KeyPress(Sender: TObject; VAR Key: CHAR);
PROCEDURE Edit2KeyPress(Sender: TObject; VAR Key: CHAR);
PROCEDURE Edit3KeyPress(Sender: TObject; VAR Key: CHAR);
PROCEDURE Button_AnalyseClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
END;
VAR
Form1: TForm1;
IMPLEMENTATION
{$R *.dfm}
{ 1} CONST
{ 2} bits=15//0..bits
{ 3} TYPE
{ 4} NullEins = ShortInt;
{ 5} bitfolge = ARRAY[0..bits] OF NullEins; //eine Folge als 01
{ 6} bitfolgen= ARRAY[1..3OF bitfolge; //alle drei Folgen als 01
{ 7} sbitfolgen= ARRAY[1..3OF STRING//alle drei Folgen als Strings
{ 8} tbinzahl=ARRAY[1..3OF CHAR;
{ 9}
{ 10} VAR
{ 11} bz: bitfolgen; //die drei Zahlen bitweise ( 0 und 1)
{ 12} XOR_Erg: bitfolge; //Ergebnis der Analyse der 3 Zahlen
{ 13} binzahl: tbinzahl; //enthalten die drei Zahlen an der höchsten XOR-Stelle
{ 14} //eine 0(-) oder eine 1(+)
{ 15}
{ 16} PROCEDURE analysiere; FORWARD;
{ 17}
{ 18} FUNCTION XOR3(a,b,c: NullEins): NullEins;
{ 19} FUNCTION XOR2(a,b: NullEins): NullEins;
{ 20} BEGIN
{ 21} IF a<>b THEN XOR2:=1 ELSE XOR2:=0;
{ 22} END;
{ 23} BEGIN
{ 24} XOR3:=XOR2(XOR2(a,b),c);
{ 25} END;
{ 26}
{ 27} PROCEDURE berechne;
{ 28} VAR
{ 29} z1,z2,z3: INTEGER;
{ 30} i: INTEGER;
{ 31} bfolge: sbitfolgen;
{ 32} sXOR: STRING;
{ 33}
{ 34} PROCEDURE BitsToString(bz: bitfolgen; VAR s: sbitfolgen);
{ 35} VAR
{ 36} i,j: INTEGER;
{ 37} BEGIN
{ 38} s[1]:=''; s[2]:='';s[3]:='';
{ 39} FOR j:=1 TO 3 DO
{ 40} FOR i:=0 TO bits DO
{ 41} BEGIN
{ 42} s[j]:=intToStr(bz[j,i])+s[j];
{ 43} IF (i MOD 4=3AND (i<>bits) THEN s[j]:=':'+s[j];
{ 44} END;
{ 45} END;
{ 46}
{ 47} BEGIN
{ 48} WITH form1 DO
{ 49} BEGIN
{ 50} z1:=StrToInt(edit1.TEXT);
{ 51} z2:=StrToInt(edit2.TEXT);
{ 52} z3:=StrToInt(edit3.TEXT);
{ 53}
{ 54} FOR i:= 0 TO bits DO
{ 55} BEGIN
{ 56} bz[1,i]:= z1 MOD 2; z1:= z1 DIV 2;
{ 57} bz[2,i]:= z2 MOD 2; z2:= z2 DIV 2;
{ 58} bz[3,i]:= z3 MOD 2; z3:= z3 DIV 2;
{ 59} END;
{ 60} BitsToString(bz, bfolge);
{ 61} Label1.Caption:=bfolge[1];
{ 62} Label2.Caption:=bfolge[2];
{ 63} Label3.Caption:=bfolge[3];
{ 64}
{ 65} FOR i:= 0 TO bits DO
{ 66} XOR_Erg[i]:=XOR3( bz[1,i],bz[2,i],bz[3,i]);
{ 67} sXOR:='';
{ 68} FOR i:=0 TO bits DO
{ 69} BEGIN
{ 70} sXOR:=IntToStr(XOR_Erg[i])+sXOR;
{ 71} IF (i MOD 4=3AND (i<>bits) THEN sXOR:=':'+sXOR;
{ 72} END;
{ 73} Label_XOR.Caption:= sXOR;
{ 74} END// WITH
{ 75}
{ 76} analysiere; // die 3 Zahlen
{ 77}
{ 78} END//berechne
{ 79}
{ 80} FUNCTION finde_Position_hoechster_1(b: bitfolge):INTEGER; //IN XOR
{ 81} VAR
{ 82} i: INTEGER;
{ 83} gefunden: BOOLEAN;
{ 84} BEGIN
{ 85} i:=bits;
{ 86} gefunden:=FALSE;
{ 87} WHILE (i>=0AND NOT gefunden DO
{ 88} BEGIN
{ 89} gefunden:= (b[i]=1);
{ 90} Dec(i); //i:=i-1
{ 91} END;
{ 92} finde_Position_hoechster_1:=i+1;
{ 93} END;
{ 94}
{ 95} PROCEDURE Status_aller_drei_Zahlen(VAR h: tbinzahl); //steht "dort" eine 1?
{ 96} VAR
{ 97} j: INTEGER;
{ 98} BEGIN
{ 99} FOR j:=1 TO 3 DO
{100} IF bz[j][finde_Position_hoechster_1(XOR_Erg)]=1
{101} THEN h[j]:='+' ELSE h[j]:='-'// + ja - nein
{102} END;
{103}
{104} PROCEDURE analysiere;
{105} VAR
{106} h: tbinzahl;
{107} BEGIN
{108} Status_aller_drei_Zahlen(h);
{109} Form1.button_Analyse.Caption:=
{110}
{111} 'Status '+h[1]+' '+h[2]+' '+h[3]+ ' (Bit '+IntToStr(finde_Position_hoechster_1(
XOR_Erg))+')';
{112} END;
{113}
{114} PROCEDURE tuwas(Sender: TObject; VAR Key: CHAR);
{115} VAR
{116} dummy: INTEGER;
{117} BEGIN
{118} IF Key=#13 THEN Key:=#0;
{119} IF Sender is TEdit THEN
{120} WITH Sender as TEdit DO
{121} IF TryStrToInt(TEXT, dummy)
{122} THEN IF key=#0
{123} THEN berechne;
{124} END;
{125}
{126}
{127} PROCEDURE TForm1.Edit1KeyPress(Sender: TObject; VAR Key: CHAR);
{128} VAR
{129} dummy: INTEGER;
{130} BEGIN
{
Beenden einer Eingabe mit [Enter]:
Zeilenumbrüche in einzeiligen Eingabefeldern sind logischerweise nicht erlaubt und
deshalb ertönt
bei Eingabe von [Enter] ein Fehlerton. Deshalb fängt man den Tastendruck im
"OnKeyPress"-Handler
des Edit-Controls ab und löscht ihn bei Bedarf (nämlich wenn es die [Enter]-Taste ist).
}

{137} IF Key=#13 THEN // #13 = [Enter]
{138} Key:=#0;
{139} IF TryStrToInt(Edit1.TEXT, dummy) //fehlerhafte Eingaben ignorieren
{140} THEN IF key=#0 THEN berechne;
{141} END;
{142}
{143} PROCEDURE TForm1.Edit2KeyPress(Sender: TObject; VAR Key: CHAR);
{144} BEGIN // kürzere Alternative für Profis
{145} tuwas(Sender, Key);
{146} END;
{147}
{148} PROCEDURE TForm1.Edit3KeyPress(Sender: TObject; VAR Key: CHAR);
{149} BEGIN
{150} tuwas(Sender, Key);
{151} END;
{152}
{153} PROCEDURE TForm1.Button_AnalyseClick(Sender: TObject);
{154} BEGIN
{155} berechne;
{156} END;
{157}
{158} END.


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - So 12.12.10 14:39

Hallo und :welcome:

user profile iconFunkydonkey hat folgendes geschrieben Zum zitierten Posting springen:
Könnte mir viellecht jemand, die einzelen Programmschritte folgenden Programms erklären? Ich schreibe Anfang nächter Woche eine Informatik Klausur über dieses Programm, nur blicke ich nicht vollständig durch. Wäre super wenn mir jemand helfen könnte.
Wäre super, wenn du konkret schreiben würdest was du nicht verstehst. :roll:

Wie sollen wir dir denn helfen, wenn gar nicht klar ist was du eigentlich nicht verstehst und wo du ein Problem hast? :gruebel:


Funkydonkey - So 12.12.10 15:17

Die Zeilen 46-49, 52-54, 57, 141+142, 150-153, 156-165 :)


wirbeldelphi - So 12.12.10 16:11

Du meinst, du hast dich gar nicht damit beschäftigt.


Funkydonkey - So 12.12.10 16:29

Doch klar, nur ich kenne die verschiedenen Vorgehensweisen einfach nicht.


Xion - So 12.12.10 17:09


45-49
1:
2:
3:
4:
5:
{ 4} NullEins = ShortInt;
{ 5} bitfolge = ARRAY[0..bits] OF NullEins; //eine Folge als 01
{ 6} bitfolgen= ARRAY[1..3OF bitfolge; //alle drei Folgen als 01
{ 7} sbitfolgen= ARRAY[1..3OF STRING//alle drei Folgen als Strings
{ 8} tbinzahl=ARRAY[1..3OF CHAR;

Hier werden verschiedene Typen deklariert. Einmal ein array aus ShortInts = NullEins.
Dann ein Array of bitfolge = Array of array of ShortInt.
Und ein Array aus Strings und aus Chars. Die Zahlen in eckigen Klammern geben jeweils an, welchen Bereich das array abdeckt (es besteht z.B. aus den Einträgen [1],[2] und [3]).


52-55
1:
2:
3:
4:
{ 11} bz: bitfolgen; //die drei Zahlen bitweise ( 0 und 1)
{ 12} XOR_Erg: bitfolge; //Ergebnis der Analyse der 3 Zahlen
{ 13} binzahl: tbinzahl; //enthalten die drei Zahlen an der höchsten XOR-Stelle
{ 14} //eine 0(-) oder eine 1(+)

Hier werden 3 Variablen deklariert, von den oben definierten typen. (sozusagen instantiiert)


136-143
1:
2:
3:
4:
5:
6:
7:
8:
PROCEDURE Status_aller_drei_Zahlen(VAR h: tbinzahl); //steht "dort" eine 1?
{ 96} VAR
{ 97} j: INTEGER;
{ 98} BEGIN
{ 99} FOR j:=1 TO 3 DO
{100} IF bz[j][finde_Position_hoechster_1(XOR_Erg)]=1
{101} THEN h[j]:='+' ELSE h[j]:='-'// + ja - nein
{102} END;

h ist ein array [1..3] of char (siehe oben). bz ist ein zweidimensionales array. Die erste Dimension wird mit j durchlaufen, und dabei gibt "finde_Position_hoechster_1(XOR_Erg)" die Position in der zweiten Dimension an. Ist diese 1, so wird h[j] zu '+', sonst '-'. finde_Position_hoechster_1 ist eine funktion und gibt einen integer zurück.


145-154
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 PROCEDURE analysiere;
{105} VAR
{106} h: tbinzahl;
{107} BEGIN
{108} Status_aller_drei_Zahlen(h);
{109} Form1.button_Analyse.Caption:=
{110}
{111} 'Status '+h[1]+' '+h[2]+' '+h[3]+ ' (Bit '+IntToStr(finde_Position_hoechster_1(
XOR_Erg))+')';
{112} END;

Hier wird im Wesentlichen die Caption des Buttons "Button_Analyse" gesetzt, bestehend aus 3 Chars, die zuvor aus der procedure Status_aller_drei_Zahlen(h) geliefert wurde (h ist dort als VAR definiert, somit werden Änderungen auch außerhalb der procedure vorgenommen).


156-166
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
{114} PROCEDURE tuwas(Sender: TObject; VAR Key: CHAR);
{115} VAR
{116} dummy: INTEGER;
{117} BEGIN
{118} IF Key=#13 THEN Key:=#0;
{119} IF Sender is TEdit THEN
{120} WITH Sender as TEdit DO
{121} IF TryStrToInt(TEXT, dummy)
{122} THEN IF key=#0
{123} THEN berechne;
{124} END;

Hier wird im wesentlichen die Eingabe #13 (= Entertaste) auf #0 gesetzt. Dann wird geguckt, ob im angewählten Edit ne Zahl steht. Wenn ja wird berechnet...der Weg über das #0 ist etwas eigenwillig...es wird halt dann berechnet, wenn man Einter drückt...


Funkydonkey - So 12.12.10 17:48

Könnte man die Zeilen 45-49 als dreidimensionales Array verstehen?


jaenicke - So 12.12.10 19:33

Im Grunde ja, denn du kannst es auch so schreiben und nutzen:

Delphi-Quelltext
1:
  bitfolgen = array[1..3of array[0..bits] of ShortInt;                    
Streng genommen ist es bei dir keins, weil die inneren Arrays eigene Typen sind.


Funkydonkey - Mo 13.12.10 09:40

Habe gerade nochmal drübergeguckt. Wäre es nicht doch ein zweidimensionales Array? Ich sehe die dritte nicht.


jaenicke - Mo 13.12.10 09:45

Da habe ich gar nicht drauf geachtet, klar. Mir ging es um das Prinzip. ;-)