Seite 2 von 2
Re: Einlesen zweier Zahlen + Summe berechnen
Verfasst: Mittwoch 19. August 2020, 06:21
von snafu
Falls man übrigens wegen zwei Zahlen nicht sort() anschmeißen will oder es nicht benutzen darf, dann geht es auch mit einem Vergleich:
Re: Einlesen zweier Zahlen + Summe berechnen
Verfasst: Mittwoch 19. August 2020, 16:08
von ScottyMiller
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.
Re: Einlesen zweier Zahlen + Summe berechnen
Verfasst: Donnerstag 20. August 2020, 09:58
von __blackjack__
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