Freitag, 19. April 2024, 08:54 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Lieber Besucher, herzlich willkommen bei: INVESTOX-Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

syps

unregistriert

1

Montag, 14. April 2008, 07:22

Quersumme

Hallo miteinander,
wie kann man in der Formelsprache aus der Zahl 123 die Quersumme 1+2+3=6 bilden? Dank im voraus!
Viele Grüße Syps

Investox

Administrator

Registrierungsdatum: 31. August 2002

Beiträge: 5 680

2

Montag, 14. April 2008, 10:21

Hallo,

const Zahl: 123;
const x1: Zahl \ 100; // Integer-Division in Konstantenberechnungen mit \
const x2: (Zahl - x1*100) \ 10;
const x3: Zahl - x1*100 - x2*10;
x1+x2+x3

Viele Grüße

Andreas Knöpfel

Wiwu Weiblich

Experte

Registrierungsdatum: 4. September 2002

Beiträge: 1 752

Wohnort: Neuenhagen b. Berlin

3

Montag, 14. April 2008, 10:24

..oder alternativ auch in VBS mit Investox V5:



for i= 1 to alleperioden
Do while counter <= perioden
qsum=qsum+counter
counter=counter+1
loop
ergebnis(i)=qsum
next

(Indikator enthält 1 Parameter "Perioden", Typ Wert)
Viele Grüße von Anke

http://www.ascunia.de

syps

unregistriert

4

Montag, 14. April 2008, 18:51

Vielen Dank für die Hilfe,
INV 5 hab ich noch nicht, so bleibt mir die Möglichkeit mit VBS verwehrt. Zur Variante von Herrn Knöpfel: Was mache ich, wenn ich nicht weiss, wieviel Stellen die Zahl hat? 123 hab ich nur als Beispiel genommen.
Wenn die Zahl z.B. 1 oder 2 Stellen hätte, so hab ich folgendes probiert:

const Zahl: x;
(If(Zahl<10, Zahl, // wenn nur eine Stelle da ist kann keine Quersumme gebildet werden
const Z1: Zahl\10;
const Z2: Zahl - Z1*10;
Z1 + Z2))

und leider nur Fehlermeldungen bekommen :wacko:
Viele Grüße Syps

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »syps« (14. April 2008, 19:44)


Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

5

Montag, 14. April 2008, 20:50

Hallo Sysps

Das ist ein interessantes Problem. Fast schon schildkrötenartig, jedenfalls hätte Zeno seine Freude! Achilles würde sprinten und Gödel dreht sich im Kreise :D

Ich kenne zwei Arten, das Problem zu lösen (wenn es nicht schon im "Grundwortschatz" einer Programmiersprache vorhanden ist): iterativ oder rekursiv. Aus Performance-Gründen auf aktuellen Von-Neumann-Rechnern würde man die rekursive Variante vermeiden, und zur iterativen greifen. Ein Beispiel dafür hat Anke gegeben. Diese iterative Version ist aber erst mit V5 und VB Script möglich.

Die rekursive Variante bliebe also, und ich wäre geneigt, einen Indikator sich selbst aufrufen zu lassen. Leider hat Herr Knöpfel rekursive Aufrufe gesperrt (*), ist Investox doch für Programmier-DAUs gemacht ... dementsprechend produziert die rekursive Version eine billige Fehlermeldung (siehe Bild).

Leider funktioniert es auch nicht, wenn sich zwei gleichartige Funktionen unterschiedlichen Namens gegenseitig aufrufen, um die Fehlermeldung wegen dem "Selbstaufruf" zu umgegehn. Herr Knöpfel erkennt einen "zirkulären" Aufruf leider ebenfalls zur Zeit des Syntax-Checks - und es klappt wieder nicht ...

Schön wäre es, wenn in sinnvolle Fehlermeldungen soviel Aufmerksamkeit geflossen wäre - aber so bleibt immerhin ein interessantes ungelöstes nettes intellektuelles Problem :D

Zwar habe ich selbst eine schöne Quersummern Funktion in VB Script unter INV V5, aber ich bin an rekursiven Lösungsmöglichkeiten rein aus "Weiterbildungsgründen" interesseirt! Hoffentlich hat jemand da was in der Hinterhand!


PS *: Es gibt Laufzeitumgebungen, die das Problem unendlicher Rekurionen eleganter lösen: die Rekurison wird natürlich zugelassen und es wird die Stack-Tiefe mitgezählt. Dazu existiert ein System-Parameter, nennen wir ihn maxdeep=10000. Wird zur Laufzeit eine Rekursion von maxdeep überschritten., so wird die Kette abgebrochen und eine Laufzeit-Fehlermeldung produziert. Etwas eleganter, als ein gut gemeinter Syntax Check ...
»Bernd« hat folgendes Bild angehängt:
  • QsumR.png
Gruss
Bernd

syps

unregistriert

6

Dienstag, 15. April 2008, 13:00

Hallo Bernd,
auch Dir vielen Dank, hat mich ein bisschen weitergebracht. Die Lösung von Herrn Knöpfel funktioniert ganz gut. Ich muss nur festlegen wie viele Stellen die Zahl maximal haben darf. Wenn sie dann kleiner ist, werden die ersten Berechnungen einfach 0. Leider kommt jetzt ein Fehler ohne Fehlermeldung bei folgender Berechnung:
const Zahl: 29;
const x1: Int(Zahl/10); //=2
const x2: Zahl - x1*10; //=9
const sum: x1+x2; //=11
Int(sum/10) //=29 ???????

Vielleicht weiss jemand Abhilfe
Viel Grüße Syps

syps

unregistriert

7

Dienstag, 15. April 2008, 15:55

Hallo an alle,
Problem gelöst. Ich muss mit calc arbeiten:
const Zahl: 29;
const x1: Int(Zahl/10); //=2
const x2: Zahl - x1*10; //=9
calc sum: x1+x2; //=11
Int(sum/10) //=1
Viele Grüße Syps