skimann: Zahlenreihe mit JavaScript bearbeiten

0 28

Zahlenreihe mit JavaScript bearbeiten

  1. 0
    1. 0
      1. 0
        1. 0
    2. 0
      1. 0
        1. 0
          1. 0
            1. 0
              1. 0
                1. 0
                  1. 0
                    1. 0
                      1. 0
              2. 0

                JavaScript kümmert sich ums Typecasting

                1. 0
                  1. 0
  2. 0
    1. 0
      1. 0
        1. 0
        2. 0
          1. 0
        3. 0
          1. 2
            1. 0
              1. 0

Hallo zusammen,

ich versuche mich als Anfänger an folgendem Problem:

Über ein Eingabefeld wird eine 11-stellige Zahl eingelesen. Von dieser Zahl soll dann jede Ziffer einzeln weiter bearbeitet werden. Jede 2. Ziffer muss dann mit 2 multipliziert werden. Danach wird aus allen Ziffern die Quersumme berechnet und die letzten Zahl (Einer-Stelle) der Quersumme von 10 abgezogen (war die abzuziehnde Zahl 0 bleibt das Ergebnis 0) Hier nochmal zum Verständnis die einzelnen Rechenschritte:

Eingabe z.B.: 91801234123, dann (9x2=18) + 1 + (8x2=16) + 0 + (1x2=2) + 2 + (3x2=6) + 4 + (1x2=2) + 2 + (3x2=6) dann Quersumme: 1 + 8 + 1 + 1 + 6 + 0 + 2 + 2 + 6 + 4 + 2 + 2 + 6 = 41 dann 10 - (Einerstelle von 41 =) 1 = 9

Ich habe schon ein wenig herum probiert, komme aber nicht so richtig weiter. das Problem ist offenbar, mehrstellige Zahlen in Ihre einzelnen Ziffern aufzuteilen, mit denen man dann aber auch rechnen kann.

Danke für jeden Tipp

  1. Hallo skimann,

    Schritt 1:

    dein Eingabefeld liefert Dir einen String. Zum Beispiel "91801234123".

    Schritt 2:

    Möglichkeit 1: Strings kann man mit dem [] Operator zeichenweise verwenden. xy[3] liefert einen String der Länge 1, der das Zeichen an Indexposition 3 enthält. "91801234123"[3] liefert "0".

    Möglichkeit 2: Strings haben eine Split-Methode, mit der man einen String an einem Trennzeichen in Teilstrings aufteilen kann. "Das Wetter ist schön".split(" ") liefert zum Beispiel das Array [ "Das", "Wetter", "ist", "schön" ]. Guck mal (z.B. in der Entwicklerkonsole des Browsers), was "91801234123".split("") macht.

    Möglichkeit 3: ECMAScript 2015 führt iterierbare Collections ein, die sich mit der for...of Schleife durchlaufen lassen. Arrays sind iterierbar. Und ein String ist eine iterierbare Collection von Zeichen.

    Schritt 3:

    Einen String, der die Textdarstellung einer Integer-Zahl enthält, wandelt man mit parseInt() in eine Zahl um. Oder, allgemeiner, mit Number(). Was auch geht, ist die Multiplikation einer Zahl mit einem String, z.B. 2*"4", das wandelt automatisch "4" in 4 um und liefert 8.

    Tipps genug?

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Ingrid,

      für die Code-Golfer unter uns: mein Gebot ist - gemäß dem Beispiel des OP:

      let prüfziffer=(100-eingabe.split("").reduce((s,v,i)=>v*=2-i%2,s+(v>9?v-9:v)),0))%10;
      

      Rolf

      --
      sumpsi - posui - clusi
      1. @@Rolf B

        für die Code-Golfer unter uns: mein Gebot ist - gemäß dem Beispiel des OP:

        let prüfziffer=(100-eingabe.split("").reduce((s,v,i)=>v*=2-i%2,s+(v>9?v-9:v)),0))%10;

        SyntaxError: unexpected token: ')'

        Dein Gebot ist zu lang (Klammer zu viel) oder zu kurz (Klammer zu wenig).

        LLAP 🖖

        --
        „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
        1. Hallo Gunnar,

          ups. Zu oft zwischen Forum und Konsole rumkopiert. Ein ( hinter => ist nötig.

          let prüfziffer=(100-eingabe.split("").reduce((s,v,i)=>(v*=1+i%2,s+(v>9?v-9:v)),0))%10;
          

          Da ist der Algo nun auch auf das korrekte Luhn-Verfahren korrigiert.

          Irgendwie müsste man deswegen jetzt das ,0 am Ende weglassen können, aber da hab ich grad keine Zeit für.

          Rolf

          --
          sumpsi - posui - clusi
    2. Hallo Rolf,

      danke schon mal für die schnelle Antwort.

      Das Problem mit String und integer hab ich schon erkannt.

      Ich brauch wohl aber noch mehr Hilfe, auch wie die Wiederholungsschleife aussehen müsste

      1. Hallo skimann,

        dann zeig doch mal, was Du bisher hast. Damit wir ein Gefühl dafür bekommen, wo wir Dich abholen müssen.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo Rolf,

          ich dachte mir das mal so: Die Berechnung der Quersumme habe ich aus einem anderen Beitrag hier kopiert (funktioniert aber nicht):

          x=document.Eingabe.nummer.value;  
          var multi = 2;
          var gesamt = 0;
          for (var i = 0; i == 10; i++)
          y = x.charAt(i);
          y = parseInt(y);
          y = y * multi;
              var summe = 0;  // ab hier Quersumme berechnen
                  var segs = (y+'').split('');
                  for (var a=0; a<segs.length; a++)
                     summe += parseInt(segs[a]);    
          gesamt = gesamt + summe;
          if (multi == 2) {   // Multiplikator abwechselnd von 2 auf 1 setzen, bzw umgekehrt
          multi = "1";
          }
          else {
          multi = "2";
          }
          
          1. Hallo,

            ich dachte mir das mal so: Die Berechnung der Quersumme habe ich aus einem anderen Beitrag hier kopiert (funktioniert aber nicht):

            zu dem Problem "Funktioniert nicht", bzw. "funktioniert aber nicht" hatten wir hier schon viele Anfragen und auch Lösungen, da musst du einfach mal die Forensuche verwenden.

            multi = "1";
            multi = "2";

            Mit welchem Variablentyp kann man denn Multiplikationen durchführen?

            Gruß
            Kalk

            1. @@Tabellenkalk

              zu dem Problem "Funktioniert nicht", bzw. "funktioniert aber nicht" hatten wir hier schon viele Anfragen und auch Lösungen, da musst du einfach mal die Forensuche verwenden.

              Oder gleich die Suche in der Zitatesammlung

              multi = "1";
              multi = "2";

              Mit welchem Variablentyp kann man denn Multiplikationen durchführen?

              a = "2"; b = "3"; a * b // ergibt 6

              JavaScript kümmert sich ums Typecasting.

              LLAP 🖖

              --
              „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
              1. Hallo Gunnar,

                JavaScript kümmert sich ums Typecasting.

                Nachdem ich in der Zitatesammlung die schöne Geschichte vom MSBobyCar gefunden habe: Ja, das tut es, aber genau so zuverlässig wie MSBobyCar.

                Wiederhole dein Beispiel mal mit dem + Operator.

                Rolf

                --
                sumpsi - posui - clusi
                1. @@Rolf B

                  JavaScript kümmert sich ums Typecasting. Wiederhole dein Beispiel mal mit dem + Operator.

                  Da der +-Operator für Strings definiert ist, ist JavaScript so schlau, die Strings nicht zu Zahlen zu casten. JavaScript kümmert sich ums Typecasting. 😜

                  LLAP 🖖

                  --
                  „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
                  1. Tach!

                    JavaScript kümmert sich ums Typecasting.

                    Dann lass bitte auch Typgleichheitsprüfungen weg, besonders wenn sie keinen Sinn ergeben, beispielsweise in folgenden Konstrukt.

                    if (typeof something === 'object') ...
                    

                    typeof liefert ausnahmslos einen String und der Typ des Stringliterals auf der rechten Seite ist auch nie etwas anderes. So ein Vergleich ist technisch völlig gleichwertig zu einem mit ==, aber der Teil "stell sicher, dass die Typen gleich sind" des ===-Operators hat hier keinerlei Nutzen. Don't let me think, warum in solch eindeutigen Fällen die Typgleichheit erzwungen werden soll.

                    Und ansonsten: "JavaScript kümmert sich ums Typecasting."

                    dedlfix.

                    1. @@dedlfix

                      So ein Vergleich ist technisch völlig gleichwertig zu einem mit ==, aber der Teil "stell sicher, dass die Typen gleich sind" des ===-Operators hat hier keinerlei Nutzen.

                      Die einen sagen so, die anderen sagen so. Andernorts wird gesagt, dass man stets typsicher vergleichen sollte.

                      Aber in dem Fall ist die Abfrage mit Array​.isArray() wohl sowieso der besser lesbare Code.

                      LLAP 🖖

                      --
                      „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
                      1. Tach!

                        So ein Vergleich ist technisch völlig gleichwertig zu einem mit ==, aber der Teil "stell sicher, dass die Typen gleich sind" des ===-Operators hat hier keinerlei Nutzen.

                        Die einen sagen so, die anderen sagen so. Andernorts wird gesagt, dass man stets typsicher vergleichen sollte.

                        Die Begründung erscheint mit ziemlich fadenscheinig. Es geht wohl nur darum, nicht über die Untiefen der Typumwandlungsregeln nachdenken zu müssen. Das bringt aber nicht viel, wenn das nur an solchen Stellen geschieht und man munter und froh genau diese Typumwandlungen im Rest des Programmes bewusst oder billigend in Kauf nimmt. Die sind ja nicht auf den ==-Oprator beschränkt.

                        Stattdessen plädiere ich dafür, sich der Regeln bewusst zu werden und nicht nur dort, sondern überall darüber nachzudenken, was passiert und was passieren kann und das nicht halbherzig zugunsten eines "hat irgendwer mal gesagt, mach ich schon immer so" wegzulassen.

                        Zur Übung empfehle ich diesen Vortrag namens Wat. Den ersten Durchlauf wegen des Unterhaltungswertes, und mindestens einen zweiten, um darüber nachzudenken, warum die gezeigten Ergebnisse zustandekommen (den Ruby-Teil kann man ja weglassen).

                        Ebenso interessant ist die Javascript-Typvergleichstabelle. Die Grundregel, nach der man alle Eigenheiten erklären kann, ist, dass bei den drei Grundtypen Number, String und Boolean bei Typungleichheit die Werte der Typen String und Boolean in den Typ Number konvertiert werden, bevor sie verglichen werden. Bei Referenztypen werden zwar üblicherweise die Referenzen und nicht die Inhalte verglichen, aber es gibt Ausnahmen bei einigen Arrays, wenn sie mit Zahlen verglichen werden (siehe verlinktes Bild). Wenn ein solcher Fall aber in der freien Wildbahn auftritt, sollte man den nicht mit === totschlagen, sondern sich lieber fragen, wie es überhaupt im Programmverlauf zu einem solchen Vergleich kommen konnte. Wie gesagt, sind Vergleiche nicht die einzigen Stellen, bei denen Typumwandlungen auftreten können, und anderenorts lässt sich die Typsicherheit nicht einfach mit einem dritten = erzwingen.

                        dedlfix.

              2. multi = "1";
                multi = "2";

                Mit welchem Variablentyp kann man denn Multiplikationen durchführen?

                a = "2"; b = "3"; a * b // ergibt 6

                JavaScript kümmert sich ums Typecasting.

                Mit Überraschungen:

                
                >> a = "2"
                >> b = "1"
                >> a * b
                
                ← 6
                
                >> a + b
                
                ← "21"
                

                Besser man gewöhnt sich an, das „selbst“ zu machen.

                1. Hallo ursus contionabundo,

                  JavaScript kümmert sich ums Typecasting.

                  Mit Überraschungen:

                  >> a = "2"
                  >> b = "1"
                  >> a * b
                  ← 6
                  >> a + b
                  ← "21"
                  

                  Ja, wie Gunnar schon schrieb:

                  
                  >> "2" - - "1"
                  
                  ← 3
                  

                  Und wie Gunnar auch schrieb: „Nicht machen, wirklich nicht.“

                  Bis demnächst
                  Matthias

                  --
                  Pantoffeltierchen haben keine Hobbys.
                  ¯\_(ツ)_/¯
                  1. Ich weiß, dass Gunnar das weiß. Ich wollte es nur nicht so stehen lassen. Das Beispiel sollte NIE ohne diese Warnung gezeigt werden.

  2. @@skimann

    Über ein Eingabefeld wird eine 11-stellige Zahl eingelesen. Von dieser Zahl soll dann jede Ziffer einzeln weiter bearbeitet werden. Jede 2. Ziffer muss dann mit 2 multipliziert werden. Danach wird aus allen Ziffern die Quersumme berechnet und die letzten Zahl (Einer-Stelle) der Quersumme von 10 abgezogen (war die abzuziehnde Zahl 0 bleibt das Ergebnis 0)

    Eisenbahn? Genauso wird die Prüfziffer bei Loknummern berechnet. Bspw. für die 65 1057:

    6 10 1 0 5 14, Quersumme: 18, d.h. Prüfziffer 2. Die steht dann hinterm Bindestrich:

    65 1057-2

    Achso, 11-stellig.

    Luhn-Algorithmus

    LLAP 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    1. Hallo Gunnar

      Ja richtig erkannt 😉 11-stellig wird es dann bei den NVR-Nummern. Da möchte ich mir die Prüfziffer durch das Javascript errechnen lassen

      1. Hallo skimann,

        ich habe zwar eine Weile gesucht, den Luhn-Algorithmus aber nicht gefunden.

        Dann ist ein Beispiel falsch - es sieht so aus als würde bei Luhn die Position 2,4,6,8,10 verdoppelt; du hast aber 1,3,5,7,9,11 verdoppelt. Das ist vom Programmieren her zwar egal, die Vorgehensweise ist die Gleiche, aber natürlich beeinflusst es ein paar Details.

        Schauen wir mal was Du bisher gemacht hast:

        x=document.Eingabe.nummer.value;  
        var multi = 2;
        var gesamt = 0;
        for (var i = 0; i == 10; i++)
        y = x.charAt(i);
        y = parseInt(y);
        y = y * multi;
            var summe = 0;  // ab hier Quersumme berechnen
                var segs = (y+'').split('');
                for (var a=0; a<segs.length; a++)
                   summe += parseInt(segs[a]);    
        gesamt = gesamt + summe;
        if (multi == 2) {   // Multiplikator abwechselnd von 2 auf 1 setzen, bzw umgekehrt
        multi = "1";
        }
        else {
        multi = "2";
        }
        

        Folgende Hinweise hätte ich für Dich:

        • wenn Gunnar mit dem Luhn-Algurithmus recht hat, musst Du erst die zweite Stelle verdoppeln, nicht die erste. Du musst also mit multi=1 beginnen.

        • Du möchtest vermutlich in der for-i Schleife mehr tun als nur y = x.charAt(i);. Das ist eine Eigenschaft des for-Befehls: Er führt genau eine Anweisung aus. Wenn Du mehr als eine Anweisung in der Schleife haben willst, musst Du sie mit { ... } zu einem Block zusammenfassen. Dieser Block wird von for dann wieder wie eine Anweisung behandelt. In deinem if für multi hast Du es gemacht. Beim for musst Du sowas auch machen. Du musst Dir nur überlegen, welche Befehle alle in die Schleife hinein gehören.

        • Statt x.charAt(i) hättest Du auch x[i] schreiben können. Das tut das Gleiche.

        • Es ist zwar schwieriger lesbar, aber man muss nicht jede Operation einzeln durchführen. Statt

           y = x.charAt(i);
           y = parseInt(y);
           y = y * multi;
        

        kann man auch schreiben

           y = parseInt(x[i]) * multi;
        

        Wie wir schon anderswo schrieben, konvertiert der * Operator automatisch Strings in Zahlen, d.h. das parseInt könnte man auch weglassen, aber das würde ich persönlich nur beim Codegolfen tun, nicht in Code, den ich nachher noch verstehen will.

        • Wenn Du doch schon weißt, dass man mit charAt an die Zeichen einer Zeichenkette kommt, warum mühst Du Dich dann in der Quersumme mit split('') ab? Das ist doch unnötig kompliziert. Aber egal, weil...

        • Die Quersumme der mit 2 multiplizierten Stellen berechnet man ohnehin einfacher (steht auch im Wikipedia-Artikel zu Luhn, und ich mache das oben in meinem Code-Golf auch). Nicht immer ist das, was in der Vorgabe steht, auch der beste Weg beim Programmieren. Du weißt, dass Du folgendes machen sollst:

          1. nimm eine Ziffer
          2. verdoppele sie, sofern es eine gerade Position ist
          3. Das Ergebnis sei y. Die Stellen von y seien z (Zehner) und e (Einer), d.h. y == 10*z + e.
          4. Ist y einstellig gewesen, dann ist z = 0.
          5. Addiere z+e auf die Gesamtsumme auf.

        Du hast in y also 10z+e stehen, möchtest für y>9 aber eigentlich z+e haben. Der Unterschied zwischen 10z+e und z+e ist, wenn man sich an die Schulalgebra erinnert, 9z. Der Wert von z ist bekannt, nämlich 1, weil Du beim Verdoppeln niemals über die 18 hinauskommst. Du weißt also: Ist y>9, habe ich 9 zuviel. Statt Ziffern zu addieren, kannst Du in deinem konkreten Fall einfach 9 von y abziehen.

        • Auf den Umstand, dass Du multi nicht auf einen String-Wert, sondern auf einen Zahlenwert setzen müsstest, hat Dich Kalk schon hingewiesen. Das ist allerdings nicht ganz so dramatisch, weil JavaScript bei einer Multiplikation weiß, dass es Zahlen braucht, und Strings automatisch in Zahlen konvertiert. Bei einer Addition wäre das anders, weil die "Addition" von Strings zu einer Verkettung führt. "2" * "3" ergibt 6 (Zahl), "2" + "3" aber "23" (String). Das vergessen wir jetzt aber gleich wieder, weil...

        • Wenn man einen Schalter braucht, der zwischen zwei Werten wechselt, dann kann man die Abfrage einfacher formulieren, dafür gibt es den „Dreifach-Operator“ (engl. ternary operator). Der sieht so aus: bedingung ? wert1 : wert2. Ist die Bedingung wahr, liefert er wert1, ist sie falsch, liefert er wert2. In deinem Fall könnte man also schreiben:

           multi = multi == 1 ? 2 : 1;
        

        Ich selbst bin da gelegentlich noch radikaler. Weil 1+2 == 3 gilt, schaltet

           multi = 3 - multi;
        

        ebenfalls zwischen 1 und 2 hin und her, sofern multi korrekt auf 1 oder 2 initialisiert wurde. Aber wie dedlfix unten schreibt: Da behandle ich ein logisches Problem mit arithmetischen Mitteln und das ist unsauber.

        • Die Alternative zu einem Schalter ist die Berechnung des Multiplikationsfaktors mit Hilfe des %-Operators (Divisionsrest). i % 2 liefert für i=0,1,2,3,... die Werte 0,1,0,1,... Da addierst Du noch 1 drauf, und hast 1,2,1,2..., was genau die Multiplikationswerte sind, die Du brauchst. Der Einwand von dedlfix gilt natürlich auch hier.

        Versuche mal, diese Hinweise bei Dir einzubauen. Ich möchte Dir nicht einfach eine fertige Funktion hinschreiben, aus Selbstmachen lernt man mehr. Es sei denn, du verwendest meine Codegolf-Zeile 😂

        Editiert 13:56: Dedlfix' Hinweis bezüglich ?: Operator eingearbeitet

        Rolf

        --
        sumpsi - posui - clusi
        1. @@Rolf B

          Bei einer Addition wäre das anders, weil die "Addition" von Strings zu einer Verkettung führt. "2" * "3" ergibt 6 (Zahl), "2" + "3" aber "23" (String).

          Um auf Nummer sicher zu gehen, zum Addieren also nicht den +-Operator verwenden, sondern - -:

          "2" - - "3" // 5
          

          🤪

          Das vergessen wir jetzt aber gleich wieder

          So isses.

          LLAP 🖖

          --
          „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
        2. Tach!

          • Wenn man einen Schalter braucht, der zwischen zwei Werten wechselt, dann geht das einfacher als mit einer Abfrage. Um multi zwischen 1 und 2 wechseln zu lassen, ziehst Du einfach den aktuellen Wert von 3 ab: multi = 3 - multi;. Allgemein formuliert: Um eine Variable x zwischen den Werten p und q wechseln zu lassen, zieht man ihren Wert von p+q ab:
             // Beispiel für p=2 und q=5. p+q ist 7.
             var x = 2;     // x ist 2
             x = 7 - x;     // x ist 5
             x = 7 - x;     // x ist 2
             x = 7 - x;     // x ist 5
          

          Das ist zwar mathematisch richtig aber schwer zu verstehen. Welche Bedeutung hat die 7, wo kommt der Wert her, wofür steht er? Und man muss erst im Rest nachschauen, welchen Wert x annehmen kann, um festzustellen, dass es lediglich zwei Rechnungen an dieser Stelle geben kann.

          Besser man schreibt das auch so hin, wie man das meint. Wenn es ein Einzeiler sein soll, dann bietet sich an:

          multi = multi == 1 ? 2 : 1;
          

          Und das ist auch nicht wesentlich aufwendiger zu notieren als die mathematische Lösung.

          • Die Alternative zu einem Schalter ist die Berechnung des Multiplikationsfaktors mit Hilfe des %-Operators (Divisionsrest).

          Selbes Problem. Mathematische Lösung für ein eigentlich logisches Problem.

          dedlfix.

          1. Hallo dedlfix,

            Das ist zwar mathematisch richtig aber schwer zu verstehen.

            Das muss an den Jahren Assembler liegen, die ich zu Beginn meiner Computerei hatte (wobei ich in Assembler ein 1/2 Toggle mit XOR toggle,3 realisieren würde und ein 2/5 Toggle mit XOR toggle,7).

            Die ?: ternary-Variante hätte ich wohl besser in meine Optionenliste mit aufgenommen (ergänze ich noch), sie ist für einen Einsteiger aber auch nicht leicht zu lesen.

            Rolf

            --
            sumpsi - posui - clusi
        3. Heureka, ich habs:

          x=document.Eingabe.nummer.value; // da kommt meine 11-stellige Zahl aus dem Eingabedialog 
          gesamt = 0;  
          var multi = 1;  
          for (var i = 0; i <= 10; i++) {  
          y = x[i];  
          y = y * 1;   
          multi = 3 - multi;  
          if (multi == 2) {  
          y = y * 2;  
          }  
          if (y > 9) {  
          y = y - 9;  
          }  
          gesamt = gesamt + y;  
          }  
          gesamt = gesamt % 10;  
          gesamt = 10 - gesamt;  
          if (gesamt == 10) {  
          gesamt = 0;  
          

          Danke nochmal für alle Tipps! Hat ne Weile gedauert, bis ich halbwegs alles kapiert hab, aber jetzt funktioniert's!!!

          1. Tach!

            Auch dein Gehirn wird arbeiten wie jedes andere auch und nach und nach die Details vergessen, die du in diesen Code hast einfließen lassen. Es ist deshalb wichtig, den Code so zu schreiben, dass er verständlich ist und nicht erst noch großartig analysiert werden muss, wenn jemand (inklusive deinem späteren Ich) daran etwas ändern möchte. Ein großes Problem dabei sind Magic Numbers und Strings. Das sind Zahlen- und String-Werte, die verwendet wurde, um etwas zu erreichen, aber deren Bedeutung nicht aus ihnen selbst ersichtlich ist. Ihnen ist dann sozusagen eine Magie innewohnend, die nur dann funktioniert, wenn man den richtigen Wert trifft. Wenn beispielsweise die 23 mehrfach im Code auftaucht, hat sie dann jeweils dieselbe Bedeutung oder unterschiedliche? Wenn ich daran etwas ändern möchte, muss ich alle Vorkommen beachten oder nur bestimmte? Auch Probleme mathematisch statt logisch zu lösen birgt einiges Potential, den Sinn darin nicht oder schwer zu erkennen.

            Deshalb die Vorschläge: Erstell Konstanten für konstante Werte statt Literale zu verwenden (außer vielleicht bei einfachen Werte, wie 0 als Startwert einer Schleife, das sieht/weiß man auch so). Konstanten können benannt werden. Das ist der schwierigste Part beim Programmieren, einen kurzen prägnanten Begriff zu finden, der die Bedeutung widerspiegelt, die man auch noch Jahre später wieder erkennt. Einbuchstabige Variablennamen (außer vielleicht bei offensichtlichen Laufvariablen in Schleifen) sind dafür zum Beispiel keine gute Wahl.

            Benannte Dinge sind schonmal die halbe Miete. Der Rest muss mit Kommentaren erklärt werden. Aber nicht das Offensichtliche kommentieren, das sieht man, sondern was der Sinn dahinter ist. Auch das ist schwierig, weil man nicht weiß, was man später nicht mehr weiß und lieber damals erklärt hätte, als man es noch wusste. Offensichtlich ist sowas wie

            x = x + 1; // hier wird 1 addiert
            

            Das sieht man, dass da eine 1 addiert wird. Aber warum geschieht das da, solange es sich nicht einfach aus dem Kontext herauslesen lässt.

            x=document.Eingabe.nummer.value; // da kommt meine 11-stellige Zahl aus dem Eingabedialog 
            for (var i = 0; i <= 10; i++) {  
            

            Warum hier eine 10 und nicht die 11? Aus dem Kommentar erkennt man, dass die Eingabe 11 Zeichen lang ist, aber die Verarbeitung nimmt eine 10. Ist das Absicht, nur 10 Zeichen zu verarbeiten oder muss man erst den Code analysieren, um den Zusammenhang zur 11 zu erkennen? Sprechender wäre, < statt <= zu nehmen und eine 11, oder besser:

            x=document.Eingabe.nummer.value; // da kommt meine 11-stellige Zahl aus dem Eingabedialog 
            for (var i = 0; i < x.length; i++) {  
            

            length ist auch dann sprechend, wenn die 11 nicht als Kommentar dabeisteht. Noch sprechender wäre es, forEach() zu nehmen, wenn man über alle Elemente einer Menge iterieren möchte. So eine Methode hat ein Javascript-String nicht, aber der lässt sich mit Array.from() in ein Array aus Zeichen umwandeln.

            Es fehlt auch eine Prüfung der Eingabe, dass sie wirklich 11 Zeichen lang ist. Überhaupt ist eine weitere schwierige Aufgabe, nicht nur den Sonnenscheinfall abzuarbeiten, sondern zu erkennen, was alles schiefgehen kann. Dementsprechende Prüfungen vor dem Verarbeiten der Eingabe und, wenn man die Arbeit an Funktionen delegiert, deren Fehlerstatus zu prüfen, bevor man weiterarbeitet, gehören zum unverzichtbaren Alltag des Programmieres, wenn man robuste Programme erstellen möchte.

            dedlfix.

            1. @@dedlfix

              Noch sprechender wäre es, forEach() zu nehmen, wenn man über alle Elemente einer Menge iterieren möchte. So eine Methode hat ein Javascript-String nicht

              Aber for...of.

              aber der lässt sich mit Array.from() in ein Array aus Zeichen umwandeln.

              Nicht nötig, sehen, hören und sagen die 3 Affen.

              LLAP 🖖

              --
              „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
              1. Tach!

                Noch sprechender wäre es, forEach() zu nehmen, wenn man über alle Elemente einer Menge iterieren möchte. So eine Methode hat ein Javascript-String nicht

                Aber for...of.

                Gute Ergänzung. Das geht natürlich auch, besonders wenn man imperativ bleiben möchte statt funktional.

                dedlfix.