Quick Sort Verfahren

Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es jetzt Danke eurer Hilfe und Beispielen hinbekommen, so dass ich mit den Werten weiter arbeiten kann.
Vielen Dank noch mal :) hab in den zwei Tagen sehr viel dazu gelernt :)(y)

Falls es für jemanden Interessant sein sollte, habe ich den Code mal angehangen.
 

Anhänge

Du könntest deinen Code noch etwas "schöner" machen: Wenn du sowieso zu Beobachtungszwecken deinen Abwahl-Input "Lx_Abgewaehlt" in ein Array kopierst, dann nutze doch direkt das Array für die Übergabe.

Dazu müsstest du die Übergabe der Abwahl an den Anfang des Bausteins rücken. Dann kannst du die sieben Codestellen mit
Code:
IF #L1_Abgewaehlt = TRUE THEN
     #Betriebsstunden[1] := 2_147_483_647;
ELSE
     #Betriebsstunden[1] := #Luefter[1].Betriebszeit;
END_IF;

ergänzen durch:

Code:
For #i = 1 TO 7 Do
   IF #Motor_abgewaehlt[#i] THEN
     #Betriebsstunden[#i] := 2_147_483_647;
   ELSE
     #Betriebsstunden[#i] := #Luefter[#i].Betriebszeit;
   END_IF;
END_FOR;

Macht im Endeffekt das gleiche, sieht aber schöner aus. Und lässt sich später noch einfacher erweitern, wenn neue Motoren dazukommen.
 
Ich würde auch noch 2 kleine Verbesserungen vorschlagen.

• die "magic number" 2_147_483_647 als lokale typisierte Konstante deklarieren und dann alle Verwendungsstellen der Zahl durch die Konstante ersetzen. Ein "sprechender Name" ist verständlicher als irgendeine krumme Zahl und man kann sich bei der Eingabe weniger vertippen.
Code:
VAR CONSTANT
   DINT_MAX : DINT := DINT#+2147483647;
END_VAR
Dann alle Verwendungstellen von 2_147_483_647 ersetzen durch #DINT_MAX, z.B. #Betriebsstunden[1] := 2_147_483_647; ersetzen durch #Betriebsstunden[1] := #DINT_MAX;

Man könnte auch noch die oft verwendete "magic" 7 durch eine Konstante ersetzen, aber das sieht wohl jeder, dass das die Anzahl Elemente ist...

• in REGION Reihenfolge ermitteln die 7 fast gleichen Codeabschnitte durch eine Schleife ersetzen, wie in #35 vorgeschlagen.
kannst du den 7x Suchcode auch in eine "äußere" Schleife FOR #Platz := 1 TO 7 DO packen.
und dabei einen kleinen unbedeutenden Fehler korrigieren (die innere Schleife braucht nur von 2 bis 7 durchlaufen werden)
Code:
REGION Reihenfolge ermitteln

    FOR #Platz := 1 TO 7 DO
        #Rangliste[#Platz] := 1;
        #kleinster := #Betriebsstunden[1];
        FOR #i := 2 TO 7 DO
            IF #Betriebsstunden[#i] < #kleinster THEN
                #Rangliste[#Platz] := #i;
                #kleinster := #Betriebsstunden[#i];
            END_IF;
        END_FOR;
        #Betriebsstunden[#Rangliste[#Platz]] := #DINT_MAX; //den gefundenen kleinsten Wert "ausschliessen"
    END_FOR;

END_REGION
#Platz ist eine lokale VAR: Platz : Int;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest deinen Code noch etwas "schöner" machen: Wenn du sowieso zu Beobachtungszwecken deinen Abwahl-Input "Lx_Abgewaehlt" in ein Array kopierst, dann nutze doch direkt das Array für die Übergabe.
Naja, was ist "schöner"?
Wenn man die INPUTs L1_Abgewaehlt ... L7_Abgewaehlt in ein Array packt und das Array übergibt, dann lassen die sich nicht mehr einzeln direkt an der Bausteinschnittstelle beim Bausteinaufruf beobachten. Vielleicht war das extra beabsichtigt? Außerdem kann man denen dann nicht mehr direkt beim Bausteinaufruf durch eine Verknüpfung einen Wert zuweisen, sondern muss das irgendwo anders extra machen.
 
Naja, was ist "schöner"?
Wenn man die INPUTs L1_Abgewaehlt ... L7_Abgewaehlt in ein Array packt und das Array übergibt, dann lassen die sich nicht mehr einzeln direkt an der Bausteinschnittstelle beim Bausteinaufruf beobachten. Vielleicht war das extra beabsichtigt? Außerdem kann man denen dann nicht mehr direkt beim Bausteinaufruf durch eine Verknüpfung einen Wert zuweisen, sondern muss das irgendwo anders extra machen.

Aber das tut der TE doch sowieso schon?
In dem Code, der in #41 steht, gibt es am Baustein-Ende die REGION Übersicht der Werte, in der die Input-Bools in das Array Motor_abgewaehlt übergeben werden.

Und schöner heißt für mich in diesem Fall, die Möglichkeit der FOR-Schleife für genau das zu tun, was sie gut kann (gleiche Bearbeitungsschritte über ein Array zu iterieren). Natürlich ist das mein persönlicher Geschmack, deswegen auch die Anführungszeichen.

PS: Wie formatierst du das "L1_Abgewaehlt"?
 
Zuletzt bearbeitet:
Zurück
Oben