Einlesen zweier Zahlen + Summe berechnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Falls man übrigens wegen zwei Zahlen nicht sort() anschmeißen will oder es nicht benutzen darf, dann geht es auch mit einem Vergleich:

Code: Alles auswählen

if zahl1 > zahl2:
    zahl1, zahl2 = zahl2, zahl1
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Ach, ja. Habe mich in der Hektik vertan... Die Schleife funktioniert, eine Funktion ist das natürlich nicht. Funktionen kommt erst eine Übung später, Übungsweise kann ich die Schleife aber mal als Funktion schreiben und aufrufen. :)

Danke für Einschub snafu.
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Neben einer Lösung mit geschlossener Formel fehlt noch eine andere Lösung ohne Schleife: Eine mit bedingten und unbedingten Sprunganweisungen. Einer der Gründe den kleinen Hack aus diesem Beitrag: pyasm.

Das ganze in Assembler für die Python 3.6 Bytecode-VM:

Code: Alles auswählen

#--------------------------------------------------------------------
# Define a function to ask for a number.

.code ask_number, prompt

loop:
        SETUP_EXCEPT    check_error
        
        LOAD_GLOBAL     int
        LOAD_GLOBAL     input
        LOAD_FAST       prompt
        CALL_FUNCTION   1
        CALL_FUNCTION   1
        RETURN_VALUE
        
check_error:
        DUP_TOP
        LOAD_GLOBAL     ValueError
        COMPARE_OP      EXC_MATCH
        POP_JUMP_IF_FALSE  no_value_error
        POP_TOP
        POP_TOP
        POP_TOP

        LOAD_GLOBAL     print
        LOAD_CONST      "Das war keine Zahl.  Noch mal."
        CALL_FUNCTION   1
        JUMP_ABSOLUTE   loop

no_value_error:
        END_FINALLY
        JUMP_ABSOLUTE   loop
.endcode

        LOAD_CONST      ask_number
        LOAD_CONST      "ask_number"
        MAKE_FUNCTION   0
        STORE_FAST      ask_number

#--------------------------------------------------------------------
# Ask the user for both numbers and leave them on the stack.

        LOAD_FAST       ask_number
        LOAD_CONST      " Erste Zahl: "
        CALL_FUNCTION   1

        LOAD_FAST       ask_number
        LOAD_CONST      "Zweite Zahl: "
        CALL_FUNCTION   1

#--------------------------------------------------------------------
# Store the numbers as `a` and `b`, swap them if necessary.

        DUP_TOP_TWO
        COMPARE_OP      LE
        POP_JUMP_IF_TRUE    no_swap
        ROT_TWO
no_swap:
        STORE_FAST      b
        STORE_FAST      a

#--------------------------------------------------------------------
# Add the numbers from `a` to `b` (inclusive).
# The result is kept on the stack.

        LOAD_CONST      0
add_loop:        
        LOAD_FAST       a
        LOAD_FAST       b
        COMPARE_OP      LE
        POP_JUMP_IF_FALSE   exit_loop
        
        LOAD_FAST       a
        BINARY_ADD
        
        LOAD_FAST       a
        LOAD_CONST      1
        BINARY_ADD
        STORE_FAST      a
        
        JUMP_ABSOLUTE   add_loop
exit_loop:

#--------------------------------------------------------------------
# Print the result from the stack.

        LOAD_GLOBAL     print
        ROT_TWO
        CALL_FUNCTION   1
        RETURN_VALUE
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten