Warning: Undefined array key "p" in /home/clients/119990c2465ec8673b725b4ed2ffc513/sites/informatikboard.ch/includes/vb5/template.php(404) : eval()'d code on line 794 Warning: Undefined array key "p" in /home/clients/119990c2465ec8673b725b4ed2ffc513/sites/informatikboard.ch/includes/vb5/template.php(404) : eval()'d code on line 794 Warning: Undefined array key "p" in /home/clients/119990c2465ec8673b725b4ed2ffc513/sites/informatikboard.ch/includes/vb5/template.php(404) : eval()'d code on line 794 Fragen zur WHILE-Sprache - iB - InformatikBoard.ch - Benutzer helfen Benutzern

Ankündigung

Einklappen
Keine Ankündigung bisher.

Fragen zur WHILE-Sprache

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Frage: Fragen zur WHILE-Sprache

    Guten Tag

    Ich verstehe die Idee hinter der WHILE-Sprache (also die do-while-Befehle) aber nicht die Details der Sprache.

    X2 <-X1; bedeutet ja Weise X2 den Wert X1 zu.

    Was bedeutet aber X2 <- S(X2) resp. P(X2)?

    Und warum ist: `X2 <- X0 WHILE X1=/= 0 do (X2 <- S(X2); X1 <- P(X1)) od` eine Addition? Warum muss man Anfangs X2 X0 zuweisen?

    Wäre eine Subtraktion dann so: `X2 <- X0 WHILE X1=/= 0 do (X2 <- P(X2); X1 <- S(X1)) od`?

    Danke für eure Hilfe!

    Liebe Grüsse, Tulbih

  • #2
    AW: Fragen zur WHILE-Sprache

    Ich kenne die WHILE-Sprache nicht, ich kann also auch nur raten was es bedeutet.

    Der Ausdruck `X2 <- S(X2)` ruft wohl die Funktion mit dem Namen "S" auf und weist das Resultat der Funktion `X2` zu.

    Die Funktion "S" ist vermute ich kurz für "Successor", und liefert wohl den nächstgrösseren numerischen Wert zurück, also Mathematisch ausgedrückt `S(X) = X + 1`. Die Funktion P "Predecessor" würde ich sagen sieht so aus: `P(X) = X - 1`.

    Folgende Anweisungen sind also äquivalent:

    Code:
    `X2 <- X2 + 1` und `X2 <- S(X2)`
    sowie:

    Code:
    `X2 <- X2 - 1` und `X2 <- P(X2)`
    Aber ich vermute in der Aufgabenstellung sind die Arithmetischen Operatoren nicht vorgesehen, darum wurde wohl S und P eingeführt.

    Bei der Addition hilft es vielleicht, die Schleife mit Konkreten Beispielen durchzuspielen. Ausserdem hilft es für das Verständnis vielleicht, dass eine Zahl ja auch als Summe von "einsen" dargestellt werden kann. Also 3 kann z.B. als "1 + 1 + 1" dargestellt werden - diese Darstellung ist besonders praktisch, wenn man eine Programmiersprache hat, welche Zahlen nur um eins erhöhen oder verkleinern kann .

    Offensichtlich werden drei Variabeln verwendet: X0, X1 und X2. X0 enthält den ersten Summanden, X1 enthält den zweiten Summanden und in X2 steht dann das Resultat. Sagen wir einmal der erste Summand (X0) ist fünf und der zweite Summand (X1) ist drei. Unsere Symboltabelle sieht also am Anfang des Algorithmus etwa so aus, wobei ich bei X2 "-" eingetragen habe, was etwa soviel bedeutet wie "undefiniert":

    0 5 3 -
    Der erste schritt im Algorithmus ist ja `X2 <- X0`. Unsere Symboltabelle sieht nun so aus:

    0 5 3 -
    1 5 3 5
    X0 und X2 sind jetzt gleich. Nun kommt die eigentliche Schleife. Bei jeder Iteration (also immer wenn der "Body" der Schleife ausgeführt wird), wird die Symboltabelle verändert. Danach wird die Schleifenbedingung ausgewertet und wenn die Bedingung "Falsch" ist, ist das Ende der Schleife erreicht.

    Wenn wir den Body der Schleife ansehen, stellen wir fest, dass die Variabel X2 jeweils um eins erhöht wird, während X1 jeweils um eins verringert wird. Nach der ersten Ausführung der Schleife sieht die Symboltabelle also so aus:

    0 5 3 -
    1 5 3 5
    2 5 2 6
    Wenn wir nun in Gedanken die Schleife weiter Anwenden erhalten wir am Schluss folgende Tabelle:

    0 5 3 -
    1 5 3 5
    2 5 2 6 Erster Schleifendurchlauf
    3 5 1 7 Zweiter Schleifendurchlauf
    4 5 0 8 Dritter Schleifendurchlauf, Ende der Schleife
    Wenn X1 0 ist, hört die Schleife auf, bei Schritt Nr. 4 ist der Algorithmus also am ende angekommen. Wir haben in X2 nun das Resultat der Additon von 5 und 3, also 8.

    Die Tabelle mit den Werten ist hilfreich um nicht die Übersicht zu verlieren. Wenn man schon etwas länger Programmiert macht man das im Kopf, so fern die Anzahl der Variabeln überschaubar ist.

    Bezüglich der Frage Warum am Anfang `X2 <- X0` gemacht wird: man muss es nicht machen aber ich bin mir auch nicht sicher warum es gemacht wurde. Man könnte argumentieren, dass der Entwickler die Originalen Summanden nicht anfassen wollte, jedoch wird der zweite Summand "X1" ja auch verändert (es ist ja praktisch der Schleifenzähler). Man könnte den Algorithmus auch umschreiben, so dass X2 nicht verwendet wird. Es würde dann etwa so aussehen:
    Code:
    WHILE X1=/= 0 do (X0 <- S(X0); X1 <- P(X1)) od
    Das Resultat der Operation wäre dann in X0, statt in X2.

    Die Subtraktion ist eigentlich gleich wie die Addition, einfach muss statt "S" ebenfalls "P" verwendet werden:

    Code:
    X2 <- X0 WHILE X1=/= 0 do (X2 <- P(X2); X1 <- P(X1)) od
    Die Anweisung `X1 <- P(X1)` bleibt gleich, weil immer noch geprüft wird ob X1 =/= 0 ist. Und wenn da `X1 <- S(X1)` stehen würde, wäre `X1` niemals 0 (ausser `X1` wäre schon negativ, also kleiner als 0).

    Ich hoffe meine Ausführungen helfen ein wenig weiter, ansonsten musst Du sagen wo Du festsitzt.

    Ich wäre ein schrecklicher Lehrer

    Kommentar


    • #3
      AW: Fragen zur WHILE-Sprache

      hallo vstm

      Ganz und gar kein schrecklicher Lehrer, besser könnts man ja wohl nicht erklären.

      Wahrscheinlich wählt man das X2 damit man dann den Originalwert (hier 5) noch erhalten hat und ihn vielleicht in einer andere Rechnung wieder gebrauchen kann!?

      Das mit der Tabelle ist wirklich eine gute Idee!

      Danke vielmals für deine ausführliche Hilfe,
      Tulbih

      Kommentar


      • #4
        AW: Fragen zur WHILE-Sprache

        Zitat von vstm Beitrag anzeigen
        Ich kenne die WHILE-Sprache nicht, ich kann also auch nur raten was es bedeutet.
        Also für ein Raten scheint mir die Antwort ziemlich fundiert
        Klasse Beitrag, vstm!

        Kommentar

        Lädt...
        X