tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
519
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    PPhilipp PPhilipp ist offline Mitglied
    Registriert seit
    Nov 2003
    Ort
    Düsseldorf
    Beiträge
    18
    Ich habe hier ein paar Schwierigkeiten mit 2 Registermaschinen:

    R1:

    LOAD2
    if c0 = 0 GOTO 10
    LOAD 1
    CADD 1
    STORE 1
    LOAD 2
    CSUB 1
    STORE 2
    GOTO 2
    END


    R2:

    LOAD 2
    CSUB 5
    if c0 = 0 GOTO 8
    LOAD 2
    MULT 1
    STORE 1
    GOTO 11
    LOAD 2
    ADD 1
    STORE 1
    END

    Wie bekomme ich daraus die jeweilige Funktion?
     

  2. #2
    Avatar von LicoMonch
    LicoMonch LicoMonch ist offline Grünschnabel
    Registriert seit
    Dec 2003
    Beiträge
    1
    Wenn Du die Funktion erhalten möchtest, solltest Du zuerst einmal die Befehlsfolge von 1 bis n durchnummerieren.

    Danach musst Du die Registermachine vorbelegen.
    zB: c1 mit x und c2 mit y (c0 ist in der Startkonfiguration immer unbelegt, auf c0 werden alle arbeiten ausgeführt, der Rest der Register kann nur in c0 geladen werden oder mit den Wert von c0 gefüllt/gespeichert werden)

    1:LOAD2 -> lade Inhalt von Register c2 in den Akkumulator (c0 = Arbeitsregister)
    2:if c0 = 0 GOTO 10 -> ist der Wert in c0 jetzt gleich 0 ? Wenn ja springe zu Befehl 10, sonst mach mit dem nächsten Befehl weiter
    3:LOAD 1 -> lade Inhalt von c1 in c0
    4:CADD 1 -> addiere die Konstante 1 zu c0 hinzu
    5:STORE 1 -> speichere c0 in c1
    6:LOAD 2 -> lade c2 in c0
    7:CSUB 1 -> subtrahiere von c0 die Konstante 1
    8:STORE 2 -> speicher c0 in c2
    9:GOTO 2 -> gehe zu Befehl 2
    10:END -> Beende das Programm

    Wenn Du das jetzt auf einen Zettel mit c1=x und c2=y durchrechnest, und die verschiedenen IF-Zweige beachtest, müsstest Du auf c1 = x +1 +1 +1 +... (y-mal "+1") kommen.
    Daraus ergibt sich dann c1 = c1 + c2 , im Beispiel also x+y

    Zu R2 nur soviel: Mult 1 heisst in c0 das Ergenis aus c0*c1 schreiben.
    Beim If ist zu beachten, dass beim abziehen einer grösseren Zahl von einer kleineren immer Null das Ergebnis ist.
    Die Lösung ist einfach durch aufschreiben und auszuprobieren zu erhalten:

    c1 = {
    c2 + c1, wenn c2 =< 5
    c2 * c1, sonst



    PS: im Java-Forum bist Du damit aber eigentlich etwas Falsch.