Entwickler-Ecke

Sonstiges (Delphi) - Programm wird einfach geschlossen, obwohl readln am Ende...


Hazer - Fr 18.03.05 23:01
Titel: Programm wird einfach geschlossen, obwohl readln am Ende...
Hi,
habe mal'ne Frage.
Wie kann es sein, dass mein Programm einfach durchläuft und sich dann am ende schließt (Rede ist von einer Konsolen Aplikation)
Obwohl ich am Ende genau vor end. ein readln; zu stehen habe.
Hier der Code (Alles andere nicht beachten! ;))

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:
program rechner;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  s,d,a1,a2,op1,op2,operation:string;
  c:integer;
begin
  writeln('Willkommen bei "compute you stupid V1.0 Beta"');
  writeln('Gebe nun deine Funktion ein, die berechnet werden soll!',chr(266));
  readln(s);
  d:=s;
  if (ord(d[1]) < 58AND (ord(d[1]) > 44then begin
     c:=0;
     repeat
        c:=c+1;
        if not (((ord(d[c]) < 58AND (ord(d[c]) > 47)) OR (ord(d[c]) = 46)) then begin;
           if a1='' then a1:=copy(d,1,c-1)
           else a2:=copy(d,1,c-1);
           if ord(d[c])+ord(d[c+1])+ord(d[c+2]) > 161 then begin
              delete(d,1,c-1);
              if a2='' then op1:=copy(d,1,3)
              else op2:=copy(d,1,3);
              delete(d,1,3);
           end;
           if ord(d[c])+ord(d[c+1])+ord(d[c+2]) < 161 then begin
              delete(d,1,c-1);
              operation:=copy(d,1,1);
              delete(d,1,1);
           end;
        end;
     until c = length(d);
  end;
  write(a2);
  readln;
end.


Es kommt keine Fehlermldung oder Sonstiges. Es läfut bis readln(s); normal durch. Dann gebe ich die Funktion ein und schwupss, sehe ich kurz wie unten noch a2 ausgegeben wird und schon ist das Ding wieder zu ;(
Als ob das readln; am Ende nicht zählen würde ;( Woran liegt das? Ist mir glaube ich schoneinmal passiert. Da hab ich dann einfach den ganzen Code nochmal abgeschrieben :shock:

Erstaunlich ist, dass, wenn ich die ganze If-Anweisung als Kommentar schreibe, dass dann alles glatt läuft. o.0? Aber ich verstehe einfach nicht warum :evil:

Danke schonmal für die Hilfe^^"


retnyg - Fr 18.03.05 23:36

vielleicht musste vor dem readln ein writeln machen oder ne variable bei readln angeben


delfiphan - Fr 18.03.05 23:39

Mach mal ein try..finally..end drum herum. Es gibt bestimmt irgendwo nen Fehler.
//Edit: Access Violation auf Zeile 19.


Hazer - Sa 19.03.05 00:25

Stimmt bei try finally end kommt tatsächlich das Programm bis readln;

Doch stellt Sich mir jetzt die frage, was am code falsch ist o.0?
Und was bedeutet Zugriffsverletzung in Zeile 19?
Wie kann ich das bereinigen?


AXMD - Sa 19.03.05 00:27

Ganz einfach: du greifst auf das c-te Zeichen von d (s) zu, ohne dich zu vergewissern, dass das d überhaupt ein c-tes Zeichen hat...

AXMD


Hazer - Sa 19.03.05 00:37

:shock: :?:
Wie? Das geht nicht?
Mein schönes Programm... es hat kein Sinn mehr :( :cry:

Hat jemand eine idee, wie ich das praktich umsetzen kann?
Sollte ich immer vorher nachfragen ob es ein c-tes Zeichen gibt?

Bsp.:

Quelltext
1:
if length(d)<=c then...                    

:?:
Oder verstehe ich das falsch?


AXMD - Sa 19.03.05 00:40

Wieso einfach wenn's auch kompliziert geht :lol:

Mach doch einfach eine for- anstatt einer repeat-Schleife; da die for-Schleife kopfgesteuert ist stellst du sicher, dass die Schleife nicht durchlaufen wird, wenn Length(d) <= c ;).

AXMD


Hazer - Sa 19.03.05 00:43

Na, ich Depp :oops:

Danke ;)


Hazer - Sa 19.03.05 18:39

habe damit mal weiter gearbeitet und bin wieder da, wo ich vorher war ;(

Der einzigste Unterschied das Programm funktioniert. Aber leider nur, wenn ich try finally end; benutze :cry:
ich habe schon verschiedenes probiert, damit es läuft, bei einem war sogar nur der Unterschied von einem </> zu 'groß' dass es funktionierte. Ich habe echt kein plan, wie man das 'handling' muss.
wonach muss ich ausschau halten und wie komm ich auf die angesprochene Fehlermeldung, wie sie delphiphan bekommen hat?

Mist, ich komm mir jetzt richtig dumm vor... :cry:
Wäre nett, wenn ihr noch mal kucken könntet und mir meine Dummheit verzeihen :?

Hier der code

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:
program rechner;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  s,d,a1,a2,op1,op2,operation:string;
  c,b:integer;
begin
 readln(s);
  d:=s;
  b:=0;
  c:=1;     try
  if (ord(d[1]) < 58AND (ord(d[1]) > 44then begin;
     while c <= length(d) do begin;
        b:=b+1;
        if (ord(d[c]) > 57OR (ord(d[c]) < 48)then begin;
           if (length(a1)=0OR (length(a2)=0OR (length(op1)=0OR (length(op2)=0then begin;
              if length(a1)=0 then a1:=copy(d,0,b-1)
              else a2:=copy(d,0,b-1);
              if not (a2=''then begin
                 if ord(d[b]) > 114 then begin;
                    op2:=copy(d,b,3);
                    delete(d,1,3);
                 end;
              end;
              delete(d,1,b-1);
              c:=c-b+1;
              b:=0;
             if (ord(d[c]) <= 47AND (ord(d[c]) <> 46)  AND (length(operation) = 0)then begin;
                 operation:=copy(d,0,1);
                 delete(d,1,1);
                 c:=c-1;
              end;
              if (ord(d[c+1])+ord(d[c+2]) < 115then begin;
                 if length(op1)=0 then op1:=copy(d,0,3);
                 delete(d,1,3);
                 c:=c-3;
              end;
           end;
        end;
     c:=c+1;
     end;
  end;             finally
  readln;                 end;
end.


AXMD - Sa 19.03.05 18:43

Du solltest deinen Code mal sauberer formatieren, das sieht ja grauenvoll und unlesbar aus

AXMD


matze.de - Sa 19.03.05 18:59

hier mal der Formatierte Quellcode:

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:
Program rechner;

{$APPTYPE CONSOLE}

Uses
    SysUtils;
Var
    S, D, a1, a2, op1, op2, Operation: String;
    C, B: Integer;
Begin
    ReadLn(S);
    D := S;
    B := 0;
    C := 1;
    Try
        If (Ord(D[1]) < 58And (Ord(D[1]) > 44Then
        Begin
            While C <= Length(D) Do
            Begin
                B := B + 1;
                If (Ord(D[C]) > 57Or (Ord(D[C]) < 48Then
                Begin
                    If (Length(a1) = 0Or (Length(a2) = 0Or (Length(op1) = 0Or (Length(op2) = 0Then
                    Begin
                        If Length(a1) = 0 Then
                            a1 := Copy(D, 0, B - 1)
                        Else
                            a2 := Copy(D, 0, B - 1);
                        If Not (a2 = ''Then
                        Begin
                            If Ord(D[B]) > 114 Then
                            Begin
                                op2 := Copy(D, B, 3);
                                Delete(D, 13);
                            End;
                        End;
                        Delete(D, 1, B - 1);
                        C := C - B + 1;
                        B := 0;
                        If (Ord(D[C]) <= 47And (Ord(D[C]) <> 46And (Length(Operation) = 0Then
                        Begin
                            Operation := Copy(D, 01);
                            Delete(D, 11);
                            C := C - 1;
                        End;
                        If (Ord(D[C + 1]) + Ord(D[C + 2]) < 115Then
                        Begin
                            If Length(op1) = 0 Then
                                op1 := Copy(D, 03);
                            Delete(D, 13);
                            C := C - 3;
                        End;
                    End;
                End;
                C := C + 1;
            End;
        End;
    Finally
        ReadLn;
    End;
End.


Warum hast du nach "begin" manchmal ein ";" gesetzt? Also bei mir läuft das Programm so, aber mir fehlt da irgendwie noch der sinn ;D

mfg matze


AXMD - Sa 19.03.05 19:04

user profile iconmatze.de hat folgendes geschrieben:
Also bei mir läuft das Programm so, aber mir fehlt da irgendwie noch der sinn ;D
mfg matze


Ich frage mich generell, was dieses Programm überhaupt machen soll...

AXMD


retnyg - Sa 19.03.05 19:19

also mit matzes formatierung ist der source noch schwerer zu lesen als vorher...


Hazer - Sa 19.03.05 19:19

hi,
sorry wegen der 'Unformatiertheit' :(
Also das mit dem begin hab ich so ina Schule gelernt. Aber na ja nicht so wichtig.
Der Sinn ist erstmal egal, da es nur ein kleiner Teil eines Programms wird 8)

Aber mein Problem ist, dass ich es ohne try finally end; haben muss.
So schreibt's jedenfalls mein Lehrer vor :evil:


matze.de - Sa 19.03.05 19:26

user profile iconretnyg hat folgendes geschrieben:
also mit matzes formatierung ist der source noch schwerer zu lesen als vorher...


hm? Warum das denn? Das ist Borland StandartFormatierung bis auf die Tabgröße.

mfg matze


retnyg - Sa 19.03.05 19:26

bzgl formatierung: folgender stil hat sich am besten bewährt
-neuen absatz zwei leerzeichen einrücken
-begin ans ende eines statements stellen, zb. so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Uses
  SysUtils;
Var
  S, D, a1, a2, op1, op2, Operation: String;
  C, B: Integer;
Begin
  ReadLn(S);
  D := S;
  B := 0;
  C := 1;
  Try
    If (Ord(D[1]) < 58And (Ord(D[1]) > 44Then begin
      While C <= Length(D) Do Begin
        B := B + 1;
        ...
      end;
    end;
  finally
  end;
end;


erzeugt kompakten, gut lesbaren code, der nicht unnötig weit nach rechts rückt, wodurch man zum scrollen gezwungen wird.


matze.de - Sa 19.03.05 19:28

jedem das seine...

mfg matze


retnyg - Sa 19.03.05 19:31

@matze, habe das noch begründet, siehe oben


matze.de - Sa 19.03.05 19:35

naja vllt fürs delphi forum optimiert, aber bei mir in der IDE sieht es anders besser aus und ich kanns besser lesen.

mfg matze


raziel - Sa 19.03.05 19:39

Der Code ist imho einwandfrei formatiert, man muss lediglich ein bisschen scrollen, aber das müsste man im Grunde genommen auch, wenn man nur zwei Zeichen einrücken würde... Es gibt auf jeden schlimmeres ;)

Aber jetzt bitte zurück zum Thema :mahn: ;)


AXMD - Sa 19.03.05 19:40

Und damit bitte wieder zurück zum eigentlichen Thema ;)

AXMD


Hazer - Sa 19.03.05 20:32

Vieleicht bringt es ja was, wenn ich schreibe, was das Programm machen soll.

Also es soll ein "Taschenrechner" werden (schulaufgabe)
Und da soll man halt eine Funktion eingeben.
Diese lautet zum Beispiel "5rad+8fak"
rad und fak sind 'specials' hier also einmal rad=Wurzel und fak=Fakultät.

Und da man das alles auf einmal eingibt, muss ich das ja trennen;)
Hierzu ist a1 die erste Zahl, op1 das erste 'Feature'
und a2 bzw.op2 das andere
operation ist halt ob plus oder...

Und das funktioniert leider nur mit try,finally,end; *grrr*

Und ich weiß jetzt echt nicht warum das nicht ohne funktioniert...


P.S.
Wegen der Formatierung: Es ist halt nut das Try/Finally und end; was aus der Reihe tanzt. Alles andere ist sauber strukturiert ;) ABER IST JA AUCH EGAL! MAN WILL JA KEINE BEENDETEN DISKUSIONEN WIEDER AUFLEBEN LASSEN! :evil:


matze.de - Sa 19.03.05 20:43

du willst also einen mathe-Parser basteln :) denke da gibt es hier genug vorlagen bzw. leute die sowas schon gemacht haben, auch komplexer.

mfg matze


Hazer - Sa 19.03.05 20:51

Aber wo bleibt denn da der Lerneffeckt? :shock:

Wenn ich dann in der klausur sitze kann ich auch nicht einfach zu jemanden anderen hingehen und mir ein teil kopieren
^^"

Wollte halt nur ne kleine Antwort auf mein Frage, wie dieses Ding ohne try/finally/end; funktioniert :cry:


matze.de - Sa 19.03.05 20:54

ich hab gar nichts von kopieren gesagt?? :roll:
Ach ja, bei mir läuft es ohne Try..Finally-Block

mfg matze


Hazer - Sa 19.03.05 21:07

user profile iconmatze.de hat folgendes geschrieben:
ich hab gar nichts von kopieren gesagt?? :roll:

o.0? Oder halt abkucken und das denn verwenden :?

user profile iconmatze.de hat folgendes geschrieben:
Ach ja, bei mir läuft es ohne Try..Finally-Block

mfg matze

:shock:
Bei mir nicht :x
Liegt das an der Version?


retnyg - Sa 19.03.05 21:08

verwende doch einfach mal den source von matze, hazer
lag sicher an deiner formatierung


Hazer - Sa 19.03.05 21:12

user profile iconretnyg hat folgendes geschrieben:
verwende doch einfach mal den source von matze, hazer
lag sicher an deiner formatierung


nope :cry:

ohne try, etc. geht auch das nicht :cry:


retnyg - Sa 19.03.05 21:19

so funktionierts (ich habe mir nicht die mühe gemacht es umzuformatieren)
bei 5rad+8fak gehts zum readln, nur keine ausgabe erfolgt.

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:
Program rechner;

{$APPTYPE CONSOLE}

Uses
    SysUtils;
Var
    S, D, a1, a2, op1, op2, Operation: String;
    C, B: Integer;
Begin
    //useinputoutput; <- brauchts nur bei kol
    ReadLn(S);
    D := S;
    B := 0;
    C := 1;
        If (Ord(D[1]) < 58And (Ord(D[1]) > 44Then
        Begin
            While C <= Length(D) Do
            Begin
                B := B + 1;
                if C = 0 then break;
                If (Ord(D[C]) > 57Or (Ord(D[C]) < 48Then
                Begin
                    If (Length(a1) = 0Or (Length(a2) = 0Or (Length(op1) = 0Or (Length(op2) = 0Then
                    Begin
                        If Length(a1) = 0 Then
                            a1 := Copy(D, 0, B - 1)
                        Else
                            a2 := Copy(D, 0, B - 1);
                        If Not (a2 = ''Then
                        Begin
                            If Ord(D[B]) > 114 Then
                            Begin
                                op2 := Copy(D, B, 3);
                                Delete(D, 13);
                            End;
                        End;
                        Delete(D, 1, B - 1);
                        C := C - B + 1;
                        B := 0;
                        If (Ord(D[C]) <= 47And (Ord(D[C]) <> 46And (Length(Operation) = 0Then
                        Begin
                            Operation := Copy(D, 01);
                            Delete(D, 11);
                            C := C - 1;
                        End;
                        If (Ord(D[C + 1]) + Ord(D[C + 2]) < 115Then
                        Begin
                            If Length(op1) = 0 Then
                                op1 := Copy(D, 03);
                            Delete(D, 13);
                            C := C - 3;
                        End;
                    End;
                End;
                C := C + 1;
            End;
        End;
        ReadLn;
End.

ich habe nur zeile 21 eingefügt.


Hazer - Sa 19.03.05 21:26

danke :wink:

Jetzt nur noch versuchen a2/op2 hin zu kriegen und meine 1 ist mir sicher muahahahahaha :D

thx


AXMD - Sa 19.03.05 21:28

user profile iconHazer hat folgendes geschrieben:
danke :wink:

Jetzt nur noch versuchen a2/op2 hin zu kriegen und meine 1 ist mir sicher muahahahahaha :D

thx


Darf ich nochmal fragen, welchen Zweck dein Programm hat und welche Eingaben es erwartet? Ich seh nur haufenweise Stringroutinen...

AXMD


Hazer - Sa 19.03.05 21:31

user profile iconAXMD hat folgendes geschrieben:


Darf ich nochmal fragen, welchen Zweck dein Programm hat und welche Eingaben es erwartet? Ich seh nur haufenweise Stringroutinen...

AXMD


:?

Zitat:
Original von Hazer

Vieleicht bringt es ja was, wenn ich schreibe, was das Programm machen soll.

Also es soll ein "Taschenrechner" werden (schulaufgabe)
Und da soll man halt eine Funktion eingeben.
Diese lautet zum Beispiel "5rad+8fak"
rad und fak sind 'specials' hier also einmal rad=Wurzel und fak=Fakultät.

Und da man das alles auf einmal eingibt, muss ich das ja trennen;)
Hierzu ist a1 die erste Zahl, op1 das erste 'Feature'
und a2 bzw.op2 das andere
operation ist halt ob plus oder...
...


übersehen oder zu verwirrend?


AXMD - Sa 19.03.05 21:39

user profile iconHazer hat folgendes geschrieben:
user profile iconAXMD hat folgendes geschrieben:


Darf ich nochmal fragen, welchen Zweck dein Programm hat und welche Eingaben es erwartet? Ich seh nur haufenweise Stringroutinen...

AXMD


:?

Zitat:
Original von Hazer

Vieleicht bringt es ja was, wenn ich schreibe, was das Programm machen soll.

Also es soll ein "Taschenrechner" werden (schulaufgabe)
Und da soll man halt eine Funktion eingeben.
Diese lautet zum Beispiel "5rad+8fak"
rad und fak sind 'specials' hier also einmal rad=Wurzel und fak=Fakultät.

Und da man das alles auf einmal eingibt, muss ich das ja trennen;)
Hierzu ist a1 die erste Zahl, op1 das erste 'Feature'
und a2 bzw.op2 das andere
operation ist halt ob plus oder...
...


übersehen oder zu verwirrend?


Quote übersehen, Quelltext zu verwirrend ^^

AXMD


Hazer - Sa 19.03.05 23:29

OK... ich steh so knap vor der Lösung *Daumen und Zeigefinger berühren sich fast*
Doch nun kommt noch eine Hammer n00b Prob, was das selbe Kaliber, wie die anderen fragen heute/gestern hatten :oops:

ALSO:

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:
  {if (ord(d[1]) < 58) and (ord(d[1]) > 44) then begin
            while c <= length(d) do begin
                b := b + 1;
                if c = 0 then break;
                if (ord(d[c]) > 57) or (ord(d[c]) < 48) then begin
                    if (length(a1) = 0) or (length(a2) = 0) or (length(op1) = 0) or (length(op2) = 0) then begin
                        if length(a1) = 0 then a1 := copy(d, 0, b - 1);
                        a3:=copy(d,0,b-1);
                        if (length(a1) <> 0) AND not(a3='') AND not(a3=a1) then a2 := copy(d, 0, b - 1);
                        delete(d, 1, b - 1); }

                        if a2=a3 then begin
                            if ord(d[b]) > 57 then begin  //HIER LIEGT DAS PROBLEM
                                op2 := copy(d, b, 3);
                                delete(d, 13);
                            end;
                        end;
                       { c := c - b + 1;
                        b := 0;
                        if (ord(d[c]) <= 47) and (ord(d[c]) <> 46) and (length(operation) = 0) then begin
                            operation := copy(d, 0, 1);
                            delete(d, 1, 1);
                            c := c - 1;
                        end;
                        if (ord(d[c + 1]) + ord(d[c + 2]) < 115) then begin
                            if length(op1) = 0 then op1 := copy(d, 0, 3);
                            delete(d, 1, 3);
                            c := c - 3;
                        end;
                    end;
                end;
                c := c + 1;
            end;
   end;
   readln;}


Oops... Ist ja wieder die verhasste Hazer-Formatierung SORRY :oops: (Ahh ne ist die Hazer-Formatting 1.1 (ohne ';' hinter den begin ;))

Dort wo die beiden Kommentar getrennt sind, ist das Problem...
So findet das Prog wieder zuschnell ein Ende :evil:
Aber setze ich

Quelltext
1:
if ord(d[b]) <= 114 then begin                    

Dann funktioniert es wieder, halt ohne den gewünschten Erfolg :evil:

plz... need help :!:


retnyg - Mo 21.03.05 02:01

falls dein problem noch besteht, poste hier doch mal ein beispiel was man eingeben muss, und was die gewünschte ausgabe wäre.
ausserdem - WAS ist genau das problem ?


delfiphan - Mo 21.03.05 03:35

user profile iconHazer hat folgendes geschrieben:
Jetzt nur noch versuchen a2/op2 hin zu kriegen und meine 1 ist mir sicher muahahahahaha :D

Ich würd mich noch nicht zu früh freuen. Bei allem Respekt: Der Code ist komplett unbrauchbar und ich wette dein Lehrer wird sich nicht mal die Mühe machen, dein Programm zu korrigieren.
If (Ord(D[1]) < 58And (Ord(D[1]) > 44Then beginGemeint ist dabei folgendes: "Falls D[1] eines der folgenden Zeichen ist: -./0123456789". Ich kann mir fast keine schrecklichere Art ausdenken das zu programmieren!
Noch schlimmer diese Zeile hier:
if (ord(D[C + 1]) + ord(D[C + 2]) < 115ThenWer blickt da noch durch!?
Wenn du überprüfen willst, ob ein Char in einem bestimmten Bereich liegt, oder zu einer bestimmten Menge von Zeichen gehört, kannst du das so tun:

Delphi-Quelltext
1:
2:
3:
4:
5:
const
 Ops = ['+','-','/','*'];
 Zahl = ['0'..'9'];
// ...
 if C in Ops then

Im Übrigen lässt sich das ganze vielleicht in ein Case packen, wenn du das ganze ein wenig ummodellierst.

Was mir grad noch auffällt:

Delphi-Quelltext
1:
Copy(D, 01)                    

Das erste Zeichen im String ist das Zeichen 1, nicht 0. (Abgesehen davon ist Copy ein Overkill, wenn du damit nur ein einzelnes Zeichen aus dem String lesen willst)

Mein Vorschlag: Fang nochmals komplett von vorne an! Achte auf einen sauberen Programmierstil und versuch nicht, zwei Sachen gleichzeitig zu realisieren, wenn dabei die Lesbarkeit des Programmes drunter leidet! Verwende keine "Dirty Tricks" sondern programmier so, dass die Bedeutung jeder Programmzeile klar ersichtlich ist! Bei einem gut geschrieben Code sind nämlich Kommentare meist überflüssig.
Was die Geschwindigkeit angeht - dein Programm ist ohnehin nicht sehr effizient; du sparst mit deiner Programmierart definitiv am falschen Ort!

Gruss,
Simon