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:

Code: Alles auswählen

if zahl1 > zahl2:
    zahl1, zahl2 = zahl2, zahl1

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