TIA Alle Array-Elemente miteinander addieren

miroblaz

Level-1
Beiträge
47
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe die Aufgabe, alle Elemente eines Arrays miteinander zu addieren.
Z.B.
ArrayValue: Array[1..5] of Real;

Ergebnis soll ein neues Array sein:
1
2
3
4
5
1+2
1+3
1+4
1+5
2+3
2+4
usw. sein

Ich habe viele scl-Schleifen ausprobiert, aber keine funzt irgendwie richtig.

Kann mir jemand weiterhelfen?

Dankeschön.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry für meine dumme Frage.
Da das Lösen solcher aufgaben nicht mein tägliches Geschäft ist, kommt es zu "Verzweiflungsfragen" ;)

Ich habe es so probiert:
FOR #i := 1 TO #u BY 1 DO // Anzahl der Betriebspunkte in der Kombination
CASE #i OF
1:
FOR #e := 1 TO #u BY 1 DO // Wenn nur 1er Kombi
#"V Summen"[#s] := #"Testarray"[#e];
#s := #s + 1;
END_FOR;
2:
FOR #e := 1 TO #u-1 BY 1 DO // Wenn 2er Kombi
FOR #z := #e+1 TO #u BY 1 DO
#"V Summen"[#s] := #"Testarray"[#e] + #"Testarray"[#z];
#s := #s + 1;
END_FOR;
END_FOR;
3:
FOR #e := 1 TO #u-2 BY 1 DO // Wenn 3er Kombi
FOR #z := #e+1 TO #u-1 BY 1 DO
FOR #d := #z+1 TO #u BY 1 DO
#"V Summen"[#s] := #"Testarray"[#e] + #"Testarray"[#z] + #"Testarray"[#d];
#s := #s + 1;
END_FOR;
END_FOR;
END_FOR;

Ich weiß, es geht auch eleganter. Aber, übersichtshalber habe ich "CASE" benutzt.
Ich habe die kombinierten Elemente (Betriebspunkte) eines Arrays addiert.

Jetzt funktioniert es soweit.
Der nächste Schritt ist, die Erweiterung für bis zu 10 Elemente.
 
Es scheint das was du gemacht hast ist für ein andere Aufgabe als was du in Eintrag #1 beschrieben hast.
Du hast 3 Arrays (eigentlich 1 Array, aber mit unterschiedliche Offset) die du summierst, nicht 1 Array.
Wenn du 3 Arrays summieren willst, dann 3 Arrays deklarieren. Oder alternativ ein mehrdimensionales Array (Z.B: testarray : ARRAY[1..5,1..3] of REAL).
Wofür die "Kombi's" gibts ist mir unklar.

Für solche Programmübungen ist den eigentliche Arbeit das man den Aufgabe genau definiert.
Hat man den Definition, ist der Programmierung meistens offenbar.
 
Schau mal unter den LGF Siemens Baustein (Eine Bib die bekommst du von der Siemens Homepage).
Der "LGF_MatrixAddition" wäre genau das wonach du suchst, mithilfe von mehreren Aufrufen könntest du eine Erweiterung "leicht" umsetzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und bitte benutze für Deine Code-Auszüge die Code-Tags[CODE]...[/CODE], die Du auch leicht mit dem letzen Button [#] der 2. Icon-Reihe erzeugen kannst.
Dadurch wird der Code besser lesbar und Du kannst auch mit Einrückungen arbeiten.
;)
 
Folgende Überlegungen - Du brauchst 2 ineinander verschachtelte FOR-Schleifen:

Die 1. Schleife (#i) läuft vom 1. Arrayelement (1) bis zum vorletztem Element (#Max - 1, im Beispiel 4) des Ausgangsarrays.
Die 2. Schleife (#j) läuft vom nächsten Element des aktuellen Elements der 1. Arrays (#i + 1) bis zum letzten Element (#Max, im Beispiel 5) des Ausgangsarrays.
Das Ergebnis kommt in folgendes Element des Ergebnisarrays: (aktuelles Element der 1. Schleife - 1) x MaxElemente des Ausgangsarrays + aktuelles Element der 2. Schleife (ungetestet, bedarf eventuell einer Anpassung, oder einfach #k hochzählen).
Berechnung des Ergebnisses sollte klar sein.

PS:
Dies ist ein typisches Beispiel zu Benutzung von Konstanten, um z.B. die Größe des Ausgangsarrays einfach verändern zu können.
Und es ist auch ein Beispiel dafür, wie blöd es ist, das man in TIA die Größe des Ergebnisarrays nicht mehr aus der Größe des Ausgangsarrays berechnen kann, was unter Classic möglich war.
 
Zuletzt bearbeitet:
Aufgabenstellung inkl. "u.s.w." nach Gutdünken interpretiert und in Excel-VBA programmiert & getestet.
Dann noch " = " in " := " und " ' " in " // " geändert.
Der folgende Code ist also weder VBA noch SCL sondern ein MischMasch aus beiden - aber hoffentlich trotzdem verständlich.
Code:
Dim ArrSrc(), ArrDst()

xIdxMaxSrc := 5
// ---< SourceArray: anlegen & TestDaten eintragen >---
ReDim ArrSrc(xIdxMaxSrc)
For xi := 1 To xIdxMaxSrc
    ArrSrc(xi) := 2 ^ (xi - 1) 
    Next xi

// ---< DestinyArray: Grösse berechnen & Array anlegen >---
xIdxMaxDst := (xIdxMaxSrc * xIdxMaxSrc + xIdxMaxSrc) / 2
ReDim ArrDst(xIdxMaxDst)

// ---< DestinyArray: Elemente berechnen & eintragen >---
xIdxDst := xIdxMaxSrc
For xi := 1 To xIdxMaxSrc
    ArrDst(xi) := ArrSrc(xi)
    For xj = xi + 1 To xIdxMaxSrc
        xIdxDst := xIdxDst + 1
        ArrDst(xIdxDst) := ArrSrc(xi) + ArrSrc(xj)
        Next xj
    Next xi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
...
// ---< DestinyArray: Grösse berechnen & Array anlegen >---
xIdxMaxDst := (xIdxMaxSrc * xIdxMaxSrc + xIdxMaxSrc) / 2

...
Die Formel sollte IMHO so lauten (PS: wenn die Arrays mit Member 1 begonnen werden; bei 0 wäre es +1 an der ersten Stelle):
Code:
// ---< DestinyArray: Grösse berechnen & Array anlegen >---
xIdxMaxDst := (xIdxMaxSrc - 1) * xIdxMaxSrc / 2
Bei 2 Membern gibt es 1 Summe, bei 3 -> 3 (2+1), bei 4 -> 6 (3+2+1), bei 5 ->10 (4+3+2+1), usw. = Gaußche Summenformel.


Leider ist jedoch, wie bereits erwähnt, das Berechnen von Konstanten zum Anlegen von Arrays unter TIA nicht möglich.
Oder kennt da jemand einen Kniff?
 
Zuletzt bearbeitet:
Nach der Ausgangsbeschreibung trifft doch aber die Gausssche Summenformel nicht zu, denn der Ersteller will ja jede zahl mit jeder addieren. Also nicht 1+2+3+4+5 sondern 1+2 + 1+3 + 1+4 +1+5 + 2+1 + 2+3 ... usw.
Oder würfel ich da grad was durcheinander?
 
Nach der Ausgangsbeschreibung trifft doch aber die Gausssche Summenformel nicht zu, denn der Ersteller will ja jede zahl mit jeder addieren. Also nicht 1+2+3+4+5 sondern 1+2 + 1+3 + 1+4 +1+5 + 2+1 + 2+3 ... usw.
Oder würfel ich da grad was durcheinander?
Ja. Es geht nur um die Anzahl der Summen, nicht deren Ergebnisse.
Die Gaußche Summenformel bestimmt lediglich das Verhältnis von Membern des Ausgangs-Array zu Membern des Ergebnis-Arrays.

Bei Ausgangs-Array[1..5] benötigt das Ergebnis-Array[1..10] (=4+3+2+1 Summen).
Erhöht man das Ausgangs-Array auf [1..6] benötigt man im Ergebnis-Array[1..15] (=5+4+3+2+1 Summen).
Erhöht man das Ausgangs-Array auf [1..7] benötigt man im Ergebnis-Array[1..21] (=6+5+4+3+2+1 Summen).

Und da man in der Regel bemüht ist, die Programmierung möglichst flexibel zu halten, werden die max. Member-Indizies halt normalerweise per Konstante angegeben bzw. daraus berechnet.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Formel sollte IMHO so lauten (PS: wenn die Arrays mit Member 1 begonnen werden; bei 0 wäre es +1 an der ersten Stelle):
Code:
// ---< DestinyArray: Grösse berechnen & Array anlegen >---
xIdxMaxDst := (xIdxMaxSrc - 1) * xIdxMaxSrc / 2
Bei 2 Membern gibt es 1 Summe, bei 3 -> 3 (2+1), bei 4 -> 6 (3+2+1), bei 5 ->10 (4+3+2+1), usw. =
In meinem Code gehe ich davon aus, dass die Elemente des Array von 1 bis xIdxMaxSrc durchnumeiert sind - hatte ich vergessen zu erwähnen.
Anfangs hatte ich
xIdxMaxDst = xIdxMaxSrc * (xIdxMaxSrc + 1) / 2
weil darin aber als ZwischenErgebnis auch "Halbe" vorkommen - also nicht nur ganze Zahlen - habe ich stattdessen ausmultipliziert und
xIdxMaxDst = (xIdxMaxSrc * xIdxMaxSrc + xIdxMaxSrc) / 2
geschrieben, so dass nur noch gerade Zahlen durch 2 dividiert werden.
In VBA funktionieren beide Versionen. Was SCL bzw. TIA bei der ersten Version macht (ohne zwischendurch in REAL zu wandeln), weiss ich nicht.
Leider ist jedoch, wie bereits erwähnt, das Berechnen von Konstanten zum Anlegen von Arrays unter TIA nicht möglich.
Oder kennt da jemand einen Kniff?
Hatte ich wohl zur Kenntnis genommen, aber das betrifft auch nur die Vorbereitung zur Aufgabenstellung und nicht die Aufgabe selbst.
Nach der Ausgangsbeschreibung trifft doch aber die Gausssche Summenformel nicht zu, denn der Ersteller will ja jede zahl mit jeder addieren. Also nicht 1+2+3+4+5 sondern 1+2 + 1+3 + 1+4 +1+5 + 2+1 + 2+3 ... usw.
Oder würfel ich da grad was durcheinander?
Dein Würfel ist wahrscheinlich topfit, aber die Aufgabenstellung ein wenig widersprüchlich.
Ich hatte mich an
Ergebnis soll ein neues Array sein:
1
2
3
4
5
1+2
1+3
1+4
1+5
2+3
2+4
usw. sein
orientiert und nicht an "alle Elemente eines Arrays miteinander zu addieren". In dem vom TE gezeigten Ergebnis enthalten die ersten 5 Elemente keine Summe, sondern sind mit dem SourceArray identisch.

PS:
In meinem Code werden in VBA auch die ArrayElemente mit Index 0 angelegt, aber nicht benutzt - pure Verschwendung - ich weiss.
 
Zuletzt bearbeitet:
Hi Hucki,

ungefähr so hab ich es auch gemacht:
Code:
FOR #e := 1 TO #u-1 BY 1 DO // [INDENT]FOR #z := #e+1 TO #u BY 1 DO[/INDENT]
[INDENT]#"V Summen"[#s] := #"[COLOR=#333333]Testarray[/COLOR]"[#e] + #"[COLOR=#333333]Testarray[/COLOR]"[#z];[/INDENT]
[INDENT]#s := #s + 1;[/INDENT]
[INDENT]END_FOR;[/INDENT]
            END_FOR;
[CODE]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
#s wird nicht initialisiert bevor den ersten Durchlauf der Schleife !
Ist doch egal, weil #u in FOR #e := 1 TO #u-1 auch nicht definiert ist :)
Mit etwas Glück gibt es keinen ersten Durchlauf der Schleife - oder prüft SCL erst nach dem ersten SchleifenDurchlauf?
Ungefähr so hat es der TE gemacht, schreibt er. Und sehr ungefähr hat er sich auch an seine Aufgabenstellung gehalten . . .
 
#s wird nicht initialisiert bevor den ersten Durchlauf der Schleife !
Ist doch egal, weil #u in FOR #e := 1 TO #u-1 auch nicht definiert ist
Muss beides nicht sein.

#s könnte eine Temp-Variable mit Defaultwert = 1 sein und wäre unter TIA damit bei jedem neuen Bausteinaufruf wieder auf diesen automatisch initialisiert.
[Edit]
Sorry :oops:,
Default bei Temp ist immer 0, aber die Temps sind nicht mehr irgendwas wie bei Classic.
Je nach Arraydefinition (siehe Heinilein) hat man also nicht unbedingt einen Fehler.
[/Edit]
#u könnte auch eine Baustein-Konstante sein.

Insbesondere auf Ersteres würde ich mich in meinen eigenen Programmen aber nicht verlassen.
 
Zuletzt bearbeitet:
Zurück
Oben