[MRT] Praktikum Simu S06 (zahlen sortieren)

Antworten
hayns
Beiträge: 36
Registriert: 30.10.2008 12:20
Geschlecht: männlich
Studienrichtung: Elektrotechnik
Matrikel: 2008
Angestrebter Abschluss: Dipl-Ing.

[MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von hayns » 14.11.2009 14:48

Hallo Ihrs,

ich möchte in diesem Thema diejenigen von Euch anregen, die im MRT-Prak die Aufgabe S06 (Zahlen einlesen und absteigend wieder ausgeben) haben, hier ein bisschen Code auszutauschen. Ich weiß nicht, auf wie viel Interesse das hier stößt, zumal ich ja keine direkte Frage habe ;)

Ich möchte bspw.einen alternativen Lösungsweg aufzeigen, als den, der so kompliziert in dem [Dateien- und Artikel]-Bereich zum Download steht.

In der o.g. Version kommt eine Art Bubble-sort zum einsatz, die die komplette Tablle durchsortiert.
Das ist aber code-intensiv und nicht explizit gefordert!
Statt dessen wird nur das einlesen in eine Tabelle und sortierte Ausgeben gefordert.

Und da setze ich an:
Anstelle die Tabelle zu sortieren, gehe ich alle AScii-Zeichen in sortierreihenfolge durch (9,8,7,.... 0) und prüfe jedes Zeichen in der Tabelle, ob gleich. Wenn ja, ausgeben, ansonsten einfach weiter.
Vorteil: Dieser Code ist auf Size optimiert, kann aber durchaus länger brauchen als der lange Code (müsste man mal austesten)
weiterer Vorteil: fehlerunanfällig!
Ich musste den Simulator ganze 4 mal bemühen. EInmal eingabe in tabelle testen, einmal ausgabe testen und 2 mal optimieren/prüfen.

ergebnis: 30 Zeilen Befehle + 9 Zeilen Definitionen!

Code: Alles auswählen

;einlesen        
BEGIN   LDA   TABLOC    ; TABELLENANFANG laden
            STA   TABPTR     ; in tabellenpointer laden
            ADD   FUENF      ; loop grenze errechnen
            STA   LPTRLIM    ; in CONST LPTRLIM = *TABELLE + 5 speichern
LREADCH RDA              ; LoopREADCHar
            STA,I TABPTR     ; gelesenes Zeichen in tabelle kloppen
            LDA   TABPTR     ; Pointer eins erhöhen
            ADD   EINS
            STA   TABPTR
            CMP   LPTRLIM    ; schon 5 zeichen eingelesen?
            JLT   LREADCH    ; springe loop wenn noch nich 5 zeichen gelesen

;sortieren: gehe alle zahlen von 0-9 durch und prüfe, ob diese in aufnahmetab drin ist.
;kurzer code, da keine aufwendige sortierung und ausgabe bei sortierung.
;laufzeit 9*5 durchläufe allerdings kurzer code!
        LDA  ASCIEND       ; absteigend: beginne mit 9
        STA  LOOPPTR      ; unsere loop var
CHCHARS LDA  TABLOC       ;CHeckCHars - geht alle 9 ascii-zeichen durch // init 
        STA  TABPTR       ;unserer pointer durch die tabelle
SUBCHEC LDA,I TABPTR      ;SUBCHECk (betrachtet das vorliegende zeichen + vgl) 
        CMP  LOOPPTR      ; vergleich mit zeichen
        JNE  WEITER    ;ẃenn zeichen[tabelle] == aktuelles zeichen[durchlauf]
        WRA               ; picard: auf den schirm!
WEITER  LDA TABPTR        ;Tabellenpointer eins weiter für nächstes zeichen
        ADD EINS          ; "
        STA TABPTR        ; "
        CMP LPTRLIM       ;ende der tabelle erreicht?
        JLT SUBCHEC
 ;END SUBCHEC
        LDA LOOPPTR       ; "
        SUB EINS          ; nächstniedrigeres Zeichen durchlaufen lassen
        STA LOOPPTR       ; "
        CMP ASCIANF        ; vorher pruefen ob wir schon am ende sind
        JGE CHCHARS       ; entsprechend weitermachen / ende
 ;END CHCHARS      
ENDE    HLT

 ;konstanten
EINS      DEC 1
FUENF     DEC 5
ASCIANF HEX 30             ;ascii erstes zeichen: 0
ASCIEND HEX 39             ; ascii letztes zeichen :9
TABLOC    DEF SORTTAB      ; SPEICHERANFANG fuer tabelle
 ;Variablen
SORTTAB   RST 5            ; 5 Zellen fuer sortierung speichern
TABPTR    RST 1            ; Tabellenpointer
LPTRLIM   RST 1            ;loop limit value
LOOPPTR   DEC 0            ;LOOP Pointer (könnte man auch RST nehmen)
einrückungen sehen komisch aus :(

Algorithmus:
#Einlesen über Schleife
-Optimierungen: Die zählvariable unserer Schleife ist gleichzeitig unser Tabellenpointer!
#Ausgabe + Sortierung
-Optimierungen: Die zählvariable unserer Schleife ist gleichzeitig unser Ascii Wert!
- Als Endwert für die zählvariable gilt dann der letzte Ascii-Wert in Sortierreihenfolge.
Gehe jedes Ascii-Zeichen in der gewünschten Sortierreihenfolge durch
(für jedes Ascii Zeichen überprüfe jedes Zeichen unserer Tabelle, ob Gleich)
:ja -> Zeichen ausgeben
:nein -> nix machen
#ENDE

Kommentare erwünscht!

Greetz Hannes

Scholaly
Beiträge: 61
Registriert: 27.11.2008 18:38

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von Scholaly » 14.11.2009 15:25

coole idee. die jetzt zu übernehmen wäre aber bissl auffällig. schließlich kennen die Profs netAction nur zu gut ^^

Benutzeravatar
Philipp
Beiträge: 40
Registriert: 21.10.2008 10:31
Geschlecht: männlich
Studienrichtung: Informatik
Matrikel: 2008
Angestrebter Abschluss: Dipl-Ing.

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von Philipp » 15.11.2009 20:16

heho,

Um das Vertauschen der Elemente in derTabelle zu vermeiden wollte ich das auch so programmieren, die idee ist im Prinzip super, es steht ja nirgends dass die Tabelle im Speicher am Ende sortiert sein soll. Es gibt nur ein Problem: wennwenn eine Zahl doppelt oder dreifach vorkommt, oder sogar fünf mal wird die jeweilige Zahl nur einmal ausgegeben! Hast du dieses Problem in deinem Quelltext umgangen?
12 Zeilen Einlesen
43 Zeilen Sortieren
10 Zeilen Konstanten und so Zeugs; wir haben aber die Variablen vom Einlesen beim Sortieren nochmal genutzt.

Morgen kommt dann der Härtetest :D

trm
Beiträge: 151
Registriert: 19.10.2008 09:55
Studienrichtung: Elektrotechnik
Matrikel: 2012

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von trm » 15.11.2009 21:28

Zahlen einlesen

zahlen auf gleichheit mit 9 prüfen -> Ja Ausgabe/ Nein Weiter
...
zahlen auf gleichheit mit 0 prüfen -> Ja Ausgabe/ Nein Weiter

Code: Alles auswählen

read:   rda
          sta,i pointer
          lda  pointer
          add eins
          sta pointer
          sub anfang
          cmp sechs
          jeq   read
loop1:  lda nowascii
           sub eins
            sta nowascii
            cmp endascii
            jeq fertig
            lda anfang
           sta pointer
loop2: lda,i pointer
          cmp asciinow
          jeq  print
back:  lda  pointer
          add eins
          sta pointer
          sub anfang
          cmp sechs
          jeq  loop1
          jmp loop2
print:   wra 
          jmp back
 fertig: hlt         

          

nowascii dec 59
endascii  dec 47
eins     dec 1
sechs  dec 6
anfang DEF zahlen
pointer DEF zahlen
zahlen RST 5

Benutzeravatar
Philipp
Beiträge: 40
Registriert: 21.10.2008 10:31
Geschlecht: männlich
Studienrichtung: Informatik
Matrikel: 2008
Angestrebter Abschluss: Dipl-Ing.

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von Philipp » 15.11.2009 21:59

Hast du das Programm mal mit einer Zahlenkombination wie z.B. 14411 probiert?
wenn das funktioniert dann wäre der code genial. genial einfach, genial kurz.

Benutzeravatar
TFWalther
Beiträge: 207
Registriert: 16.11.2008 19:01
Name: Tillmann Walther
Geschlecht: männlich
Studienrichtung: Elektrotechnik
Matrikel: 2008
Angestrebter Abschluss: Dipl-Ing.
Wohnort: Dresden
Contact:

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von TFWalther » 15.11.2009 23:03

Hier mal meine Lösung,
ich hab noch berücksichtigt, dass fälschlicherweise auch andere Zeichen als Zahlen getippt werden könnten,
die Schleifen könnte man noch kürzer machen, ich mag der Übersichtlichkeit halber aber den Einsatz von Schleifenzählern und Tabellen

Code: Alles auswählen

; prinzipieller Algorithmus:
;
; zuerst werden Ziffern aus dem Inhalt des Tastaturbuffers geladen
; Buchstaben, Sonderzeichen etc. werden ignoriert
; die ersten 5 Ziffern zwischen 0 und 9 werden in einer Tabelle gespeichert
;
; Danach werden alle Daten der 5 Zellen großen Tabelle
; auf die einzelnen Ziffern in absteigender Reihenfolge geprüft
; zuerst auf die 9, dann die 8 bis zur 0
; Wird eine übereinstimmung gefunden, gibt das Programm das Ergebnis auf dem Bildschirm aus





      ENT           FTAB    ;symb. Adresse FTAB auch in anderen
                            ;Modulen bekannt machen

FTAB  LDA           ASCIID  ; ASCIIN initialisieren
      STA           ASCIIN
      LDA           TABMERA ; Einlesewerttabelle vorbereiten
      STA           TABA    ; Dabei Tabellenzeiger auf den Beginn setzen  
      LDA           FUENF   ; Counter auf 5 setzen, für die Schleife
      STA           CNT     ; |    
    
;Einlesen der 5 Eingegebenen Zahlen in eine Tabelle
STRT  RDA                   ; Tastaturbuffer einlesen
      CMP           ASCIIN  ; Vergleich, ob getippter Wert kleiner als 0 ist,
      JLT           STRT    ; d. h. Überprüfen und ungültig machen, falls keine Zahl eingetippt wurde
      CMP           ASCIIS  ; Vergleich ob getipptes größer als 9 ist ggf. Rücksetzung
      JGE           STRT    ; |

      STA,I         TABA    ; ausgelesene Zahl in der Tabelle speichern
      LDA           TABA    ; Tabellenzeiger um eins erhöhen
      ADD           EINS    ; |
      STA           TABA    ; |
      LDA           CNT     ; Zähler um eins erniedrigen
      SUB           EINS    ; |
      STA           CNT     ; |
      CMP           NULL    ; Mit null vergleichen, um die Schleife zu komplettieren
      JNE           STRT    ; Falls noch nicht alle Zahlen eingelesen sind, eine weitere Zahl einlesen

;Ausgabe der Tabelle in absteigender Reihenfolge
AUSG  LDA           ASCIIS  ;
      SUB           EINS    ; nächste Zahl probieren
      STA           ASCIIS  ; |
      LDA           FUENF   ; 5 als counter speichern
      STA           CNT     ; |
      LDA           TABMERA ; Tabellenzeiger der Tabelle auf den Anfang setzen
      STA           TABA    ; |   
LOOP  LDA           ASCIIS  ; zu schreibenden Wert in dem Akkumulator reservieren
      CMP,I         TABA    ; mit dem Wert aus der Tabelle vergleichen
      JNE           WEITE   ; wenn es ungleich ist beim nächsten Wert versuchen
         WRA                ; bei Gleichheit ausgeben
WEITE LDA           TABA    ; Zeiger für die Tabelle eins hochzählen
      ADD           EINS    ; |
      STA           TABA    ; |
      LDA           CNT     ; counter laden
      SUB           EINS    ; und um eins runterzählen
      STA           CNT     ; |
      CMP           NULL    ; Vergleich ob die Schleife beendet ist
      JNE           LOOP    ; Wenn nicht, dann Sprung an den Anfang der Schleife
      LDA           ASCIIN  ; Vergleich ob man an der letzten Ziffer angekommen ist
      CMP           ASCIIS  ; |
      JNE           AUSG    ; Wenn nicht, dann Sprung an den Anfang
      HLT                   ; reguläres Ende
;Daten
NULL    DEC  0;
EINS    DEC  1;
FUENF   DEC  5;
CNT     RST  1              ; Zähler um genau 5 Zeichen abzuspeichern
TABA    RST  1              ; Speicherzelle für Tabellenzeiger
TABMERA DEF  TABANFA        ; Tabellenanfang
TABANFA RST  5              ; Tabelle für die Eingelesenen Ziffern

TAB     RST   1             ; Speicherzelle für Tabellenzeiger
ASCIIN  HEX   30
ASCIIS  HEX   3A            ; eins über ASCII-Code von Neun
ASCIID  HEX   3A

Benutzeravatar
Hans Oberlander
Beiträge: 2571
Registriert: 19.12.2006 22:22

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von Hans Oberlander » 15.11.2009 23:43

So habe ich das damals auch sortiert :>

trm
Beiträge: 151
Registriert: 19.10.2008 09:55
Studienrichtung: Elektrotechnik
Matrikel: 2012

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von trm » 16.11.2009 00:23

Code: Alles auswählen

read   rda
          sta,i pointer
          lda  pointer
          add eins
          sta pointer
          cmp ende
          jne   read
loopa  lda nowasc
           sub eins
            sta nowasc
            cmp endasc
            jeq fertig
            lda anfang
           sta pointer
loopb lda,i pointer
          cmp nowasc
          jne  back
          wra
back  lda  pointer
          add eins
          sta pointer
          cmp ende
          jeq  loopa
          jmp loopb
fertig hlt         

       

nowasc dec 59
endasc  dec 47
eins     dec 1
zahlen RST 5
anfang DEF zahlen
ende def anfang
pointer DEF zahlen
 
So mal getestet und optimiert 24 Zeilen und 7 Speicher funkioniert einwandfrei

Benutzeravatar
TFWalther
Beiträge: 207
Registriert: 16.11.2008 19:01
Name: Tillmann Walther
Geschlecht: männlich
Studienrichtung: Elektrotechnik
Matrikel: 2008
Angestrebter Abschluss: Dipl-Ing.
Wohnort: Dresden
Contact:

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von TFWalther » 16.11.2009 00:38

bleiben nur noch das Buchstabenproblem und die Möglichkeit das Programm 2mal hintereinander auszuführen, wobei Die Variablen initialisiert werden müssten
*rumnörgel*

trm
Beiträge: 151
Registriert: 19.10.2008 09:55
Studienrichtung: Elektrotechnik
Matrikel: 2012

Re: [MRT] Praktikum Simu S06 (zahlen sortieren)

Beitrag von trm » 16.11.2009 01:08

Code: Alles auswählen

           lda anfang
           sta pointer
           lda stasc
           sta  nowasc
read   rda
          cmp stasc
          jge fertig
          cmp endasc
          jle fertig
          sta,i pointer
          lda  pointer
          add eins
          sta pointer
          cmp ende
          jne   read
loopa  lda nowasc
           sub eins
            sta nowasc
            cmp endasc
            jeq fertig
            lda anfang
           sta pointer
loopb lda,i pointer
          cmp nowasc
          jne  back
          wra
back  lda  pointer
          add eins
          sta pointer
          cmp ende
          jeq  loopa
          jmp loopb
fertig hlt         

       
nowasc dec 59
stasc dec 59
endasc  dec 47
eins     dec 1
zahlen RST 5
anfang DEF zahlen
ende def anfang
pointer DEF zahlen

OK dann eben 32 + 8

Antworten

Zurück zu „3. Semester: Diskussionen“