0

Mittelwert erstellen nur aus Zahlenfeldern, die einen Wert beinhalten.

Guten Tag ihr Lieben,

ich habe ein einfaches Problem, aber komme nicht auf die Lösung.

 

Ich möchte einen Mittelwert von verschiedenen Zahlenfeldern berechnen. Allerdings kommt es vor, dass einige Felder keinen Zahlenwert beinhalten. Diese Felder sollen dann nicht berücksichtigt werden.

 

Hat jemand eine Lösung für mich?

 

Vielen Dank!

Julius

7 Antworten

null
    • Julius
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Vielleicht nochmal zur besseren Erklärung: Wir werten Zeugnisnoten in Bolivien aus. Bisher habe ich von 12 Schulfächern einfach die Summe gebildet und durch 12 rechnen lassen. Nun gibt es Zeugnisse, bei denen zwei Fächer zusammengefasst sind, sodass ich nicht mehr durch 12 rechnen kann. Es sollen also nur die Felder summiert werden, die eine Note beinhalten und dann durch die Anzahl an Feldern berechnet werden, die eine Note beinhalten.

    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Julius. Schau mal, ob es Dir weiterhilft. Lege alle Felder in das Array.

    let ary := [Note1, Note2, Note3,...];
    avg(ary[!= 0])
    
      • Julius
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko hat geklappt :)

      Vielen Dank!

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko Eine elegante Lösung.
      Ich hätte es wie folgt gemacht:

      let ary := [Note1, Note2, Note3,...];
      sum(ary)/cnt(ary)

      Erklärung:
      cnt() ignoriert in einem Array Elemente, die keinen Inhalt haben, damit wird nur durch die Anzahl der Elemente dividiert, die eine Note enthalten.
      Wenn man die tatsächliche Anzahl aller Elemente des Array (incl. leere Elemente) ermitteln möchte nutzt man length(ary).
       

      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG Tja, die niedlichen, kleinen Inkonsistenzen in der Ninox-Scriptsprache. Korrekt wäre ja

      ary[!= 0 and != null]

      gewesen, da die Felder ja leer oder mit 0 gefüllt sein können. Aber NINOX macht in diesem Fall keinen Unterschied zwischen 0 und null.
      Mit != 0 werden beide entfernt, mit !=null nur null. Wird schwierig, wenn man nur 0 und nicht null entfernen will.

      Daß null zwar existiert, aber nicht in cnt() aber in length() gezählt wird, zeigt das Beispiel. Man muss es halt wissen, oder, wie ich, ausprobiert haben.

      let ary := [3, 5, 1, 2, 0, null];
      cnt(ary) = 5 - null wird nicht als Wert gezählt
      debugValueInfo(item(ary, 5)) = null - der Wert kann aber ausgelesen werden, existiert also doch
      length(ary) = 6 - null wird erkannt
      ---
      let ohne0:=ary[!= 0];
      length(ohne0) = 4 - sowohl 0 als auch null werden entfernt

      Danke für Deinen Input. Mirko

    • Maurice
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Nur der Vollständigkeit halber. Du schreibst ja selbst, Mirko: "da die Felder ja leer oder mit 0 gefüllt sein können.", also 

    ary[!=0 or !=null]

    Grüße Maurice

      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Maurice Genau. Es ist nur so, daß Ninox mit dieser Methode in jedem Fall alle null-Werte entfernt. Also auch mit ary[< 2] oder ary[!= 4] usw. Deshalb reicht auch im Fall von Julius ary[!= 0]. Kurz, aber unlogisch. Das nenne ich inkonsistent. Genauer, aber nicht nötig ist ary[!= 0 and != null]. Da hast Du Recht, Maurice. Gruß Mirko

Content aside

  • vor 1 JahrZuletzt aktiv
  • 7Antworten
  • 37Ansichten
  • 4 Folge bereits