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...
-
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!
-
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.
-
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.