Programmierlösung gesucht

Lipperlandstern

Level-3
Beiträge
6.049
Reaktionspunkte
1.750
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Cracks.

Ich stehe vor folgenden Problem : :cry:

Ich habe in einem DB 4 verändererbare Werte (als Bsp. : DW1:1000, DW2:1200, DW3:1450, DW4:1800) Jetzt muss ich wissen welcher von diesen Werten am besten zu einem 5. Wert (DW5 :1250) passt. Dabei muss der kleinstmögliche Wert rausgesucht werden der noch grösser ist als Wert 5. In diesem Fall wäre das DW3 (1450). Das eigentlich Problem dabei ist das die Werte 1-4 nicht unbedingt in auf- und absteigender Reihenfolge vorliegen sondern "wild" durcheinander sein können. Irgendwie fällt mir da kein richtiger Lösungsansatz ein. Vielleicht hat ja von Euch jemand ne gute Idee.

Schönen Abend noch.

Axel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Upsss.... na das ist ja nen Hammer.... da muss ich mich erstmal mit auseinanderssetzen :wink:
Ich hoffe das überfordert so einen Maschinenprogrammierer wie mich nicht .... schaun wir mal
 
hallo

ich hatte vor einiger zeit die gleiche aufgabe ich musste in einer siloanlage auslesen in welcher zelle sich der kleinste füllstand befindet, den baustein habe ich in scl geschriben, den könnte ich dir per mail zusenden.
dann muss man nur noch die differenz der einzelnen werte berechnen und danach die kleinste zahl rausfiltern.

gruss
uz
 
@zottel
Deine Projekt habe ich mal runtergeladen und es funktioniert wie verrückt ;-)... Leider hab ich die Funktion und Vorgehensweise noch nicht ganz verstanden aber da werde ich mich morgen mit auseinandersetzen.

@uz
Danke für Deine Hilfe. Aber SCL hab ich mich noch nicht beschäftigt. Werde ich aber wohl bald müssen wenn die Aufgabenstellungen weiterhin immer komplexer werden.

Bis hinhin erstmal vielen Dank. Alles weitere morgen :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

das mit dem Sortieren ist ja gut und schön, aber eigentlich garnicht notwendig. Zumal man danach trotzdem noch in einer Schleife nach dem richtigen Wert suchen muss.

Man könnte es auch so machen:

- Initialisieren: ERGEBNIS:=32767 (Integer?)
- Schleife zum Abklappern der Werte 1 bis n
- WENN (Wert x > VERGLEICHSWERT) UND (Wert x < ERGEBNIS) DANN ERGEBNIS := Wert x
- Schleife bis zum Wert n fortsetzen

oder so ähnlich.


Gruss, Onkel
 
Onkel Dagobert schrieb:
Hallo Leute,

das mit dem Sortieren ist ja gut und schön, aber eigentlich garnicht notwendig. Zumal man danach trotzdem noch in einer Schleife nach dem richtigen Wert suchen muss.

Man könnte es auch so machen:

- Initialisieren: ERGEBNIS:=32767 (Integer?)
- Schleife zum Abklappern der Werte 1 bis n
- WENN (Wert x > VERGLEICHSWERT) UND (Wert x < ERGEBNIS) DANN ERGEBNIS := Wert x
- Schleife bis zum Wert n fortsetzen

oder so ähnlich.
Da hast du absolut recht und ich habe einen Moment lang nachdenken müssen, wo die Unterschiede sind:
1. Der Frager in dem anderen Thread brauchte mehrere Betriebsmittel. Bräuchte er nur eins, so würde ein Durchlauf der äußeren Schleife von Bubblesort reichen.
2. Deine Schleife unterbindet das weitere "Absinken" oder "Aufsteigen" eines Wertes in der Liste, sobald Wert nicht mehr > Vergleichswert.
3. Demjenigen, der in dem anderen Thread z.B. 5 Betriebsmittel brauchte, hätten auch 5 Durchläufe der äußeren Schleife gereicht. Ob der Rest sortiert ist, wäre ja egal.
4.
..Zumal man danach trotzdem noch in einer Schleife nach dem richtigen Wert
suchen muss.
. Fast hätte ich in der 1.Antwort noch geschrieben, daß man das in einer sortierten Liste mit binärer Suche tun kann; aber bei 4 Elementen ist das "Overkill" hoch 3.
 
Lipperlandstern,

vielleicht kannst du ja auch zur Erzeugungszeit der Werte den Index speichern der zum gesuchten Wert führt (oder den Wert selbst) und nicht zur Abfragezeit. Also ich meine eine Art "early-calculation".

yb
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe ein ähnliches Problem. Ich möchte aus 8 Zahlen immer wieder die nächstgrößere ausgeben. Als Beisp. z1=1; Z1=2;....z8=8; Wird die Schleife beim ersten mal durchlaufen soll er mir die 1 ausgeben. Bezugspunkt beim ersten Durchlauf ist die 0. Beim zweiten mal die 2, Bezugspunkt hier ist die letzte ausgegebene Zahl. Und immer soweiter...

Hier mal mein bisheriger Code... So wird er nicht funktionieren, weil er mir so immer die größte Zahl ausgibt. Für einen Tipp bin ich sehr dankbar. Sind meine ersten Versuche mit SCL.

Code:
FOR "Positionen"."Anzahl der Positionen" := 0 TO 7 DO
                 IF (("Positionen".Positionen["Positionen"."Anzahl der Positionen"] > "Positionen"."letzte angefahrene Position"))  THEN  
                       #Pos := "Positionen".Positionen["Positionen"."Anzahl der Positionen"];    
                  END_IF;
                END_FOR;
          "Positionen"."anzufahrende Position" := #Pos;
          "Positionen"."letzte angefahrene Position" := #Pos;

Gruß
Sascha
 
Hi.
Wenn ich dich richtig verstanden habe ...
Versuche es doch mal mit der Exit-Anweisung in SCL! Allerdings hast du dann nach 8 Zyklen wieder den höchsten Wert in #Pos stehen. Wird die Schleife unbedingt ausgeführt oder wird hier vorher noch eine Bedingung abgefragt, die die Schleife ausführt ???

Auszug aus der Online-Hilfe:
Eine EXIT-Anweisung dient zum Verlassen einer Schleife (FOR, WHILE oder REPEAT) an beliebiger Stelle und unabhängig vom Erfülltsein der Abbruchbedingung.

Die EXIT-Anweisung wird nach folgenden Regeln bearbeitet:

Diese Anweisung bewirkt das sofortige Verlassen derjenigen Wiederholungsanweisung, die die EXIT-Anweisung unmittelbar umgibt.

Die Ausführung des Programms wird nach dem Ende der Wiederholungsschleife (z.B. nach END_FOR) fortgesetzt.

Code:
Annahmen:

"Positionen"."letze angefahrene Position" = 0
"Positionen".Positionen[0] = 1
"Positionen".Positionen[1] = 2
...
"Positionen".Positionen[6] = 7
"Positionen".Positionen[7] = 8

Dann wäre nach dem ersten Schleifendurchlauf #Pos = 1, nach dem zweiten Durchlauf #Pos = 2, usw.
Bleibt halt nur die Frage, ob die Position im gleichen Zyklus noch erreicht wird??? Nach 8 Zyklen bleibt dann die 8 in Pos stehen (auf deinen hier geposteten Code bezogen)
 
Zurück
Oben