Websiteentwicklung: JavaScript: Schleifen: Lösungen


Lösungen zu den Übungsaufgaben über Schleifen


1. Die Lösung könnte so aussehen:

<html>
  <head>
  <title>Verdopplungs-Schleife</title>
  <script type="text/javascript">

     function fDoppelt(dZahl)
        {
        return dZahl*2;
        }

  </script>
  </head>
  <body>
   <h3>Verdopplungs-Schleife</h3>
  <script language="JavaScript" type="text/javascript">

     for(var i=10; i<=100; i+=10)
        {
        document.write("Das Doppelte von " + i + " ist " + fDoppelt(i) + "!<br>");
        }

  </script>
  <noscript>Bitte schalten Sie JavaScript ein!</noscript>
  </body>
</html>


2. Bei einer Schleife mit while wird vor dem ersten Durchlauf die Bedingung geprüft und die Schleife möglicherweise gar nicht durchlaufen, bei einer Schleife mit do ... while erfolgt die Prüfung nach dem ersten Durchlauf, ein Durchlauf ist also garantiert.


3. Fleißarbeit:


3.1. Die Lösung für eine Primzahlfunktion (inklusive der Teiler-Funktion) könnte so aussehen:


function fTeiler(iZ,iT)
    {
    if (iT > 0)
       {
       var iR =0;
       iR=iZ%iT;
       if(iR==0)
          {
          return true;
          }
       else
          {
          return false;
          }
       }
    else
       {
       return false;
       }
    }
function fIstPrim(iN)
   {
   // die Scan-Untergrenze wird mit 1 festgelegt
   var iMin=0;
   //   die Scan-Obergrenze mit der zu untersuchenden Zahl
   var iMax=iN;
   //Variable Anzahl der Teiler definieren und 0 setzen
   var iTAnz=0;
   //boolesche Variable bIT (bIstTeiler) definieren + false setzen
   var bIT=false;
   var i=iMin;

   //die folgende WHILE-Schleife durchläuft alle
   //ganzen Zahlen von Untergrenze (iMin) bis Obergrenze (iMax) oder Anzahl Teiler >0
   //d.h. ein echter Teiler wurden gefunden
   while(i<=iMax && iTAnz==0)
     {
     i=i+1;
     if((i>iMin+1) && (i<iMax-1))
        {
        bIT=fTeiler(iN,i);//Aufruf der Teilerfunktion
        if(bIT)
           {
           iTAnz++;  // ist Teiler - iTAnz wird erhöht
           }
        }
     }

   //Das Ergebnis (Anzahl Teiler) wird ausgewertet
   if(iTAnz==0)
     return true;
   else
     return false;
   }

Die Lösung kommt mit spartanischen Mitteln aus. Man könnte noch die Laufzeit minimieren, z.B. indem man ab 3 in 2-er-Schritten hochzählt (außer 2 gibt es ja keine geraden Primzahlen) und indem man die Obergrenze auf den ganzzahligen Teil der Quadratwurzel der zu prüfenden Zahl begrenzt - dazu würde allerdings das Math-Objekt benötigt (wegen der benötigten Ganzzahl-Methode „Math.floor“ und der Quadratwurzel-Methode „Math.sqrt“), das bisher noch nicht besprochen wurde. Korrekterweise müsste auch noch die Ausgabe der 1 als Primzahl unterdrückt werden, weil alle Primzahlen genau 2 Teiler haben, nämlich 1 und sich selbst - 1 hat aber nur einen Teiler - nämlich 1. Als Lehrbeispiel zeigt dieses Programm aber, wie mächtig JavaScript ist bzw. was man mit den wenigen bisher besprochenen Mitteln bereits erreichen kann.


9. Die Lösung für eine HTML_Seite, die eine Primfaktor-Zerlegung leistet, könnte so aussehen:


<html>
   <head>
      <title>Primfaktorbestimmung in Javascript</title>
      <script type="text/javascript">

            function fTeiler(iZ,iT)
                {
                if (iT > 0)
                   {
                   var iR =0;
                   iR=iZ%iT;
                   if(iR==0)
                      {
                      return true;
                      }
                   else
                      {
                      return false;
                      }
                   }
                else
                   {
                   return false;
                   }
                }

         function fIstPrim(iN)
            {
            // die Scan-Untergrenze wird mit 1 festgelegt
            var iMin=0;
            //   die Scan-Obergrenze mit der zu untersuchenden Zahl
            var iMax=iN;
            //Variable Anzahl der Teiler definieren und 0 setzen
            var iTAnz=0;
            //boolesche Variable bIT (bIstTeiler) definieren + false setzen
            var bIT=false;
            var i=iMin;

            //die folgende WHILE-Schleife durchläuft alle
            //ganzen Zahlen von Untergrenze (iMin) bis Obergrenze (iMax) oder Anzahl Teiler >0
            //d.h. ein echter Teiler wurden gefunden
            while(i<=iMax && iTAnz==0)
              {
              i=i+1;
              if((i>iMin+1) && (i<iMax-1))
                 {
                 bIT=fTeiler(iN,i);//Aufruf der Teilerfunktion
                 if(bIT)
                    {
                    iTAnz++;  // ist Teiler - iTAnz wird erhöht
                    }
                 }
              }

            //Das Ergebnis (Anzahl Teiler) wird ausgewertet
            if(iTAnz==0)
              return true;
            else
              return false;
            }

         function fPrimFaktorAusgabe()
            {
            with(document.frmPrim)
               {
               var iZahl=parseInt(txtZahl.value);
               var iTemp=iZahl;
               var iF=2;
               var iFmin=2;
               var bIT=false;
               var bIP=false;
               if(iZahl>=1)
                  {
                  tAusgabe.value="Primfaktorzerlegung von " + iZahl + "\n \n";
                  while(iTemp>1)
                     {
                     bIP=fIstPrim(iF);
                     if(bIP==true)
                        {
                        bIT=fTeiler(iTemp,iF);
                        if(bIT==true)
                           {
                           tAusgabe.value=tAusgabe.value + iF + "\n";
                           iTemp=iTemp/iF;
                           }
                        else
                           {
                           if(iF==2)
                              {
                              iF=iF+1;
                              }
                           else
                              {
                              iF=iF+2;
                              }
                           }
                        }
                     else
                        {
                        iF=iF+1;
                        }
                     }
                  tAusgabe.value=tAusgabe.value + "\n"+ "\n" + "Fertig !";
                  }
               else
                  {
                  alert("Größer als 1 habe ich gesagt!");
                  }
               }
            }

      </script>
   </head>
   <body>
       <form method="get" name="frmPrim">
       <h2>Primzahlfaktorisierung einer Zahl n</h2>
           <b>Gib eine ganze Zahl n >= 2 ein:</b><br>
           <input type="text" name="txtZahl"></input><br>
           <input type="button" name="btnStart" value="Primzahlfaktorisierung starten"
                        onClick="fPrimFaktorAusgabe()"></input>
           <br>
           <textarea name="tAusgabe" cols="20" rows="20"></textarea>
       </form>
   </body>
</html>