Algorithmus zur Suche der größten und kleinsten Zahl...



  • Hi Leute!

    Von mir erstmal ein "Hallo"; ich bin neu hier... 🙂

    So, ich starte dann gleich mal mit einer Frage zu einem Algorithmus zur Bestimmung der kleinsten und größten von einer Reihe von 25 unterschiedlichen ganzen Zahlen.

    Laut Aufgabe soll ich, um die kleinere Zahl a und b zu finden, x von y subtrahieren. Wenn Ergebnis "minus" ist, dann ist y < x, wenn Ergebnis x = y ist, dann ist Ergebnis gleich 0 ansonsten ist y > x.

    Ich soll dazu nun einen Programmablaufplan schreiben.

    Hier hab ich einen einen http://yfrog.com/7bds22j auf ein Bild von meinem bisherigen Ablaufplan getan. Ich weiß allerdings nicht ob das so richtig ist...

    Könnt ihr mir evtl. (weiter-)helfen?



  • Warum rechnet man erst x - y um dann das Ergebnis mit 0 zu vergleichen anstatt einfach die beiden ausgangszahlen verwenden?



  • Tut mir leid, das steht in meiner Aufgabe, man solle das so machen. Das ist also nicht auf meinem Mist gewachsen... Kannst du mir vielleicht die Antwort daruaf geben, denn das gleiche hab ich mich auch schon gefragt...


  • Mod

    Könnt ihr mir evtl. (weiter-)helfen?

    Das ist zu unpräzise. Es ist gleichbedeutend mit "Kann mir jemand die Hausaufgaben machen?". Hast du eine konkrete Frage?

    Das einzige was ich sagen mag: Dein Ablaufplan ist falsch. Aber ich denke das weißt du auch selber.



  • cooky451 schrieb:

    Warum rechnet man erst x - y um dann das Ergebnis mit 0 zu vergleichen anstatt einfach die beiden ausgangszahlen verwenden?

    Das machen einige Containertypen so, dass ihre Sortierfunktion eine Funktion höherer Ordnung ist, der man eine Vergleichsfunktion als Argument übergeben muss, die die Zahlen auf Gleichheit prüfen soll. Sind Integer im Container, kann der Programmierer dann einfach die Differenz zurück geben, die Sortierfunktion der Containerklasse vergleicht dann beim Sortieren den Rückgabewert auf "kleiner Null", "Null" oder "größer Null".

    Und zu der eigentlichen Frage: Dein Ablaufplan sieht etwas seltsam aus. Was macht er denn überhaupt nach dem Vergleichen bei "Nein"? Bricht er ab? Was ist dann das Ergebnis? Du hast nur eine Möglichkeit für "Ja". Was ist y und x, woher nimmst du sie? Wieso vergleichst du noch einmal x<y, wenn du doch vorher schon Z vergleichst? Auf was bezieht sich nun die "Schleifenbedingung"?



  • Ich habe deinen Ablaufplan nicht eingesehen. Wozu? Das ist eine Standardaufgabe jeder Programmierung und lässt sich mit einfachen Kontrollstrukturen wie for, while und if lösen. :p



  • Du bist ja witzig. Hast du ernsthaft das Gefühl, dass der Threadersteller hier die Erfahrung hat "Standardaufgaben" einfach mal so mit Links zu erledigen? Meine Güte, was für eine Arroganz...



  • Danke Leute für euren nicht vorhandenen Willen mir weiterzuhelfen; ich habe nicht nach einer "Komplettlösung" meiner tatsächlichen Hausaufgabe gefragt sondern viel mehr danach gefragt, mein kleines Wissen darüber zu erweitern indem ihr mir helfen solltet was ich in meinem PAP falsch gemacht habe. Außerdem ist es wirklich so, dass ich (momentan) von Kontrollstrukturen wirklich noch keine Ahnung habe und mir es deshalb nich möglich ist, dieses Problem anhand if, else, for zu lösen, besser gesagt, ich SOLL dieses Problem anhand dieser Kontrollstrukturen gar nicht lösen.

    Das ich mich in diesem Forum so schnell nicht mehr melde ist doch wohl nur klar wenn mir als Neuling in der Welt der ach so tollen Programmierer mit so viel Arroganz begegnet wird. Was ihr mir allerdings jetzt gut gelehrt habt, ist, dass wenn ich ebenfalls mal ein "ach so toller Programmierer" werde, das ich mich selbhst tunlichst vor dieser überbordenden Arroganz bewahre.

    Irgendwie kann ich mir nicht, dass einige Benutzer dieses Forums dem Anspruch einer "Communtiy" gerecht werden.

    In diesem Sinn, danke für die sinnvollen Antworten die ich wie ich das sehe an einer einzigen Hand abzählen kann.



  • Algenmuß schrieb:

    Du bist ja witzig. Hast du ernsthaft das Gefühl, dass der Threadersteller hier die Erfahrung hat "Standardaufgaben" einfach mal so mit Links zu erledigen? Meine Güte, was für eine Arroganz...

    Wir sind hier im Forum C++ für Programmierer unterwegs. Da sollte man schon bereit sein, die Grundlagen für die Programmierung sich anzueignen - sind in jeder Programmiersprache vollkommen gleich. Ich sehe da keine Arroganz! :p



  • bandchef schrieb:

    Das ich mich in diesem Forum so schnell nicht mehr melde ist doch wohl nur klar wenn mir als Neuling in der Welt der ach so tollen Programmierer mit so viel Arroganz begegnet wird.

    Dein Posting klang ganz nach dem üblichen "Ich-hab-keinen-Nerv-meine-Hausaufgaben-selbst-zu-machen-und-suche-daher-einen-Trottle-der-das-für-mich-macht". Wenn Du ein Problem hast bei dem Du nicht weiterkommst, solltest Du konkrete Fragen stellen und nicht so unpräzise sein, daß provoziert nur harsche Antworten - meiner Meinung nach vollkommen zu recht. Niemand hat etwas davon, wenn Du Deine Hausaufgaben nicht selbst machst.



  • Auch Neulinge sollen Fragen stellen dürfen und eine konkrete Antwort erwarten dürfen. Man soll aber davon ausgehen, dass sie simple Dinge der Programmierung auch selbst machen oder lernen wollen. :p Ich schmeiss da mal eine Hausaufgabe rein und jemand liefert mir die fertige Lösung ist nicht unser Ding! 😃


  • Mod

    man kann sich die Zahlen auf auf Papierkärtchen schreiben, und sich vorstellen, Aernie(AX) und Bert(BX) helfen einem dabei, die größte oder kleinste Zahl zu finden.

    Für mich ist diese Art von Aufgaben ein gutes Beispiel dafür, das Assembler die nötigen Zusammenhänge schneller vermittelt als C. Wobei man fairerweise hinzufügen sollte, das asm fast immer etwas mehr mathematischen Zusammenhang in mathematischen Aufgaben aufzeigt, also man mehr gefordert ist, seine Grundlagen-Mathekenntnisse anzuwenden - macht aber Spaß.

    Man braucht zuerst ein paar Zufallszahlen. Ich nehme mein Handy zu Hilfe,
    das Java Progamm Calc von Roar Lauritzen ( http://midp-calc.sourceforge.net/Calc.html ) darauf ist ganz gut (8 Bit reicht, wir wollen uns nicht überanstrengen):

    35 71 15 64 109 176 14 61 27 45 29 37 82 53 88 4 9 66 85 39 114 44 222 125 138

    Diese Zahlen sind in den Speicher zu schreiben. Ich benutze dafür das Windows Programm debug. debug kann aber nur was mit Hexadezimalzahlen anfangen, d.h. sämtliche Zahlen müssen erstmal in das Hexadezimalformat gebracht werden. Das kann man bei 8bit noch leicht im Kopf machen, weil das durch 16 geteilte Ergebnis einstellig bleibt. (222:16 = 208, also D-reizehn, Rest 14 also E, d.h. DE). Also alle obigen Zahlen nochmal als Hexi:

    23 47 F 40 6D B0 E 3D 1B 2D 1D 25 52 35 58 4 9 42 55 27 72 2C DE 7D 8A

    So, jetzt in den Speicher schreiben: Debug aufrufen -> Windowstaste drücken, debug eingeben -> normalerweise öffnet sich ein Dosfenster mit blinkenden Unterstrichprompt...falls nicht, Pech gehabt.

    mit dem Befehl e 200 schreibt man die Zahlen bei Speicherstelle 200 rein. Das kann man nacheinander machen und mit Enter bestätigen. Zweimal Enter springt aus dem Eingabe modus heraus. Falls man einen Fehler gemacht hat, oder eine Zahl bearbeiten will, dann gibt man statt 200 die passende Adresse an, also E 208 oder E 202 oder E 212 etc..
    Mit dem Befehl d 200 kann man seine Eingabe kontrollieren.

    So, und jetzt machen wir ein bißchen party mit Aerni und Bert. Man könnte sich vorstellen, jeder der beiden nimmt die kleinere Zahl in die eine Hand, die Größere in die andere. Aber wir brauchen noch einen Source Indexer, mit dem wir im Speicher navigieren können, dazu buchen wir Schmuggelkönig Han Solo (Si)(Solos Index-Lichtsprung). Der Einfachheit halber schließen wir die Zahl 0 aus und benutzen sie stattdessen als Endemarkierung für unser Leseprogramm

    mit dem kürzel a 100 bzw a adresse oder einfach nur a kann man assemblerbefehle ab Adresse eingeben. Zuserst braucht Han Solo seine Startadresse im Speicher: 200. Dann werden die Zahlen nacheinander aus dem Speicher geholt, und verglichen, wer den größten hat, und wer den kleinsten...

    a 100
    
      mov si,200   ;200 cash auf die Kralle des Schmugglers
      mov ah,[si]  ;die erste von Han Solo geschmuggelte Zahl nach ah
      mov bh,ah    ;damit in bh keine Null steht, und den Vergleich kaputt
                   ;macht
      inc si       ;nächste heiße Ware für al ansteuern
    
    Loop:
      mov al,[si]  ;und nach al geflogen
      cmp al, 0    ;schon das Ende erreicht?
      jz Endealgo  ;falls ja, raus hier
      cmp ah,al    ;wer hat den dicksten?
      jae +4       :ingesamt 4 bytes mitdenken (jump if above or equal)
      xchg ah,al   ;ah = bisher höchster wert
      mov bl,al    ;wer hat jetzt den kleinsten?
      cmp bh,bl
      jbe +4       ;if below or equal
      xchg bh,bl   ;bh = bisher kleinster wert
      inc si       ; wie oben
      jmp Loop         (zurück zum mov al,[si])
    
      hier gehts raus...
    

    wenn das Programm durchgelaufen ist, dann enthält ah die größte und bh die kleinste Zahl. Man kann das Programm testen mit g addresse, also wie unten z.B. mit g 11F.

    Das Programm läßt sich schrittweise testen mit t
    und die register wie auch Instruction Pointer lassen
    sich beschreiben mit rax oder rcs bzw. rip. das heißt, wenn
    man sich verfranst hat, dann wieder 100 nach rip und die alten
    Werte nach in die Segmentregister schreiben, falls die auch nicht mehr stimmen, z.B. nach einem Interruptsprung in den Hyperraum...;)

    hier nochmal mein Testproggi in Debug:

    -r
    AX=DE00  BX=048A  CX=0000  DX=0000  SP=FFF2  BP=0000  SI=0219  DI=0002
    DS=195B  ES=0000  SS=195B  CS=195B  IP=0100   NV UP EI PL ZR NA PE NC
    195B:0100 BE0002        MOV     SI,0200
    
    -u 100
    195B:0100 BE0002        MOV     SI,0200
    195B:0103 8A24          MOV     AH,[SI]
    195B:0105 88E7          MOV     BH,AH
    195B:0107 46            INC     SI
    195B:0108 8A04          MOV     AL,[SI]
    195B:010A 3C00          CMP     AL,00
    195B:010C 7411          JZ      011F
    195B:010E 38C4          CMP     AH,AL
    195B:0110 7302          JNB     0114
    195B:0112 86E0          XCHG    AH,AL
    195B:0114 88C3          MOV     BL,AL
    195B:0116 38DF          CMP     BH,BL
    195B:0118 7602          JBE     011C
    195B:011A 86FB          XCHG    BH,BL
    195B:011C 46            INC     SI
    195B:011D EBE9          JMP     0108
    195B:011F B90000        MOV     CX,0000
    -
    


  • nachtfeuer schrieb:

    cmp ah,al    ;wer hat den dicksten?
    

    Ich glaube, laut Aufgabbenstellung mußt Du zuerst mal sub statt cmp nehmen und hinterher gegen 0 cmpen.



  • nachtfeuer schrieb:

    Für mich ist diese Art von Aufgaben ein gutes Beispiel dafür, das Assembler die nötigen Zusammenhänge schneller vermittelt als C.

    Ja ne iss klar. Der ganze ASM Mist war jetzt bestimmt sehr hilfreich. 🙄



  • Prinzessin Sofia schrieb:

    Der ganze ASM Mist war jetzt bestimmt sehr hilfreich. 🙄

    👍 Lösungsweg für faule: "sort anschmeissen" --> macht wenig Aufwand. 🙄


  • Mod

    volkard schrieb:

    nachtfeuer schrieb:

    cmp ah,al    ;wer hat den dicksten?
    

    Ich glaube, laut Aufgabbenstellung mußt Du zuerst mal sub statt cmp nehmen und hinterher gegen 0 cmpen.

    👍
    Den Asm-Insiderwitz hier, schätze ich mal, verstehen die wenigsten.
    😉


Anmelden zum Antworten