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.
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Hallo zusammen,

ich sitze nun immer wieder an folgender Aufgabe bei meiner Prüfungsvorbereitung und komme einfach nicht weiter. Die Aufgabe ist:
Programmieren Sie das Einlesen zweier Zahlen und berechnen Sie die Summe aller Zahlen zwischen der kleineren und größeren Zahl (mit for-Schleife/mit while-Schleife).

Code: Alles auswählen

zahl1 = input ("Geben Sie eine Zahl ein: ")
zahl1 = int (zahl1)

zahl2 = input ("Geben Sie eine weitere Zahl ein: ")
zahl2 = int (zahl2)

lst = []
lst.append(zahl1)
lst.append(zahl2)
lst.sort()
print (lst)

sum = 0
for i in range(lst[0], lst[0]):
   sum + i
   print(sum)
   
Das Setup der Aufgabe an sich ist nicht das Problem. Bei der for-Schleife hakt es dann leider. Ich bekomme es nicht hin entweder die beiden Input-Variablen direkt als Grenzen für die for-Schleife zu setzen oder auch über die Liste und dann die einzelnen Zahlen hochzuzählen und zusammen zu addieren.

Über jede Hilfe wäre ich sehr dankbar! Bis bald.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

`lst` ist ein sehr generischer Name für zwei Zahlen, die sortiert werden sollen. Wenn man schon weiß, welche Elemente in einer Liste stehen sollen, kann man sie auch direkt in eckigen Klammern schreiben:

Code: Alles auswählen

zahl1 = int(input("Geben Sie eine Zahl ein: "))
zahl2 = int(input("Geben Sie eine weitere Zahl ein: "))
zahlen = [zahl1, zahl2]
zahlen.sort()
Dann solltest Du Dir genau anschauen, von welcher Zahl bis zu welcher Zahl `range` läuft.
Das Ergebnis der Addition solltest Du wieder einer Variable zuweisen.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 3.

Was ist genau mit `*alle* Zahlen zwischen der kleineren und größeren Zahl` gemeint?
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Die Aufgabenstellung ist in der Hinsicht echt nicht gut formuliert muss man sagen, geht aber ja eher darum das Konzept zu verstehen. In der Übung sagte mir der Prof., dass er die Addition inklusive Start- und End-Zahl addiert haben möchte.

Also bei Eingabe von 1 und 4 dann: 1 + 2 + 3 + 4.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Mit range:

Code: Alles auswählen

print(sum(range(zahl1, zahl2 + 1)))

als zahl1 und zahl2 musst du dann halt die Elemente der sortierten Liste nehmen.
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Habe nun folgende Schleife:

Code: Alles auswählen

for summe in range (zahlen[0], zahlen[1] +1):
	print (sum(range(zahl1, zahl2 + 1)))
Etwas unschön ist die Ausgabe in der Konsole bei z.B. 1 und 4, dass das Endergebnis 4 Mal ausgegeben wird. Ist das für das Programm nötig, Schönheitsfehler oder gar nicht anders machbar? Nicht das ich jetzt lange rumprobiere und es ist anders gar nicht realisierbar.

Das Umwandeln in die while-Schleife hoffe ich selbstständig hinzukriegen. :?
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

ich glaube kaum, dass Du die `sum`-Funktion benutzen darfst. `summe` ist der falsche Name für die for-Schleifenvariable, und bei falschen Namen kann auch kein sinnvolles Programm rauskommen.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Der Körper der for-Schleife ist falsch. die Varaible in der for-Schleife sollte nicht summe heißen, sondern zahl, weil das immer ein Element der range() ist.
Diese zahl musst du dann im Körper einfach auf sich selber drauf addieren und am Ende - wenn die Schleife fertig ist - das Ergebnis ausgeben.

Code: Alles auswählen

zahl1 = int(input("Geben Sie eine Zahl ein: "))
zahl2 = int(input("Geben Sie eine weitere Zahl ein: "))
zahlen = [zahl1, zahl2]
zahlen.sort()


#Wenn mit einer Schleife das ergebnis berechnet werden soll
ergebnis = 0
for zahl in range(zahlen[0], zahlen[1] + 1):
    ergebnis += zahl #ist wie ergebnis = ergebnis + zahl
print(ergebnis)


#Wenn der Weg egal ist und nur das Ergebnis zählt:
print(sum(range(zahlen[0], zahlen[1] + 1)))
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Danke euch bis hierhin!

Der verkürzte Weg über 'sum' ist wohl nicht gewünscht, da nicht der Weg über die Schleife geht. Beim Schreiben der while-Schleife für die gleiche Funktionalität fehlt mir grad aber auch jeglicher Ansatz oder Fantasie... Ich probiere mal weiter.
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Habe es nochmal probiert, aber bin zu keinem Ergebnis gekommen. Wenn mir jemand einen Ansatz geben könnte, der mich in die richtige Richtung schubst, wäre ich sehr dankbar! Für heute ist Feierabend... Morgen früh schaue ich wieder rein.
Benutzeravatar
mp1337
User
Beiträge: 23
Registriert: Dienstag 5. Mai 2020, 16:33
Kontaktdaten:

Bitteschön:

Code: Alles auswählen

zahl1 = int(input("Geben Sie eine Zahl ein: "))
zahl2 = int(input("Geben Sie eine weitere Zahl ein: "))
zahlen = [zahl1, zahl2]
zahlen.sort()

#For Schleife wie ich sie machen würde:
ergebnis = 0
for zahl in zahlen:
    ergebnis += zahl
print(ergebnis)

#Alternativ mit range:
ergebnis = 0
for zahl in range(len(zahlen)):
    ergebnis += zahlen[zahl]
print(ergebnis)

#while:
ergebnis = 0
zahl = 0
while zahl <len(zahlen):
   ergebnis += zahlen[zahl]
   zahl+=1
print(ergebnis)
IT-News ohne Werbung
https://www.it-feedo.de
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@mp1337: Dein Code löst ein anderes Problem. Ließ noch mal die Aufgabenstellung des TE.
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Guten Morgen,

ist aber gar nicht so verkehrt, dass die Lösung ein anderes Problem löste. Habe mir dann beide for-Schleifen angeschaut und geguckt was passiert und die Zeilen einzeln übersetzt, für mich als Rookie wohl immer noch eine gute Übung.

Versuche die von mp1337 gepostete while-Schleife so zu ändern, dass sie meine Aufgabenstellung löst, hat bisher leider noch nicht geklappt. Bei den Lösungen von mp addiert die Schleife nur die beiden Listenelemente. Ich denke mit einem kleinen Eingriff sollte er auch die Zahlen dazwischen addieren können. Dabei muss ich hinkriegen das auch die while-Schleife im Durchlauf durch die beiden Elemente von 'zahlen' limitiert wird. Bisher vergeblich.
Benutzeravatar
Briter
User
Beiträge: 4
Registriert: Freitag 14. August 2020, 18:31

Ich habe richtig verstanden, dass die Schleife nur ein paar Elemente der Liste hinzufügt, was wiederum die addition von zahlen beeinflusst.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht einfach mal die Schritte notieren, wie man diese Aufgabe ohne Computer lösen würde. Sagen wir mal, die Zahlen sind 7 und 2. Die bringt man erstmal in die geforderte Reihenfolge. Wie kann man das machen, wenn man kein sort() zur Hand hat? Und wie läuft das dann in den kleinsten denkbaren Schritten beim Aufaddieren ab? Worin steckt die Wiederholung bei dem ganzen und welches Detail ändert sich bei jeder Wiederholung? Wenn dies klar geworden ist, lässt sich das Vorgehen des Aufaddierens sinnvoll in eine Schleife gießen. Normalerweise eine for-Schleife, da die Anzahl der Wiederholungen zu Beginn der Schleife bekannt ist. Zu Übungszwecken ist die Umformung zu einer while-Schleife aber auch nicht verkehrt.
Benutzeravatar
__blackjack__
User
Beiträge: 14031
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mir fehlt bei der Aufgabe ja eine Lösung ohne jegliche (auch implizite) Schleife. Habe mal die Varianten in Kotlin geschrieben:

Code: Alles auswählen

package de.python_forum.blackjack

fun sumWithClosedFormula(a: Int, b: Int): Int = (b * b + b - a * a + a) / 2

fun sumWithRange(a: Int, b: Int): Int = (a..b).sum()

fun sumWithFor(a: Int, b: Int): Int {
    var result = 0
    for (n in a..b) result += n
    return result
}

fun sumWithWhile(a: Int, b: Int): Int {
    var result = 0
    var n = a
    while (n <= b) {
        result += n
        n++
    }
    return result
}

fun main() {
    val a = 23
    val b = 42
    val sumFunctions = listOf(
            ::sumWithClosedFormula,
            ::sumWithRange,
            ::sumWithFor,
            ::sumWithWhile
    )
    for (f in sumFunctions) println(f(a, b))
}
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Ich habe mich Samstag und heute nochmal dran probiert und habe einfach ein großes Problem mit while-Schleifen. Bin ganz froh, dass die Klausur erst in 4 Wochen ist - noch genug Zeit um das zu beheben. Mir fehlt einfach das Verständnis wie die while-Schleife bei der Aufgabe aussehen muss und auch eine Umwandlung der for- in die while-Schleife klappt nicht. Habe es probiert mal ohne die Vorlage einfach die while zu programmieren, leider vergeblich.

Es ist echt zum Haare raufen, wenn man da nicht weiter kommt... Danke für eure Hilfe bis hierhin!
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Die Logik für die While-Schleife siehst du ja in __blackjack__ Beitrag. Du musst das nur noch auf die Python Syntax umschreiben.

Was meinst du mit Umwandlung der for-Schleife in eine while-Schleife?
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man braucht halt eine Zähler-Variable, oft i genannt. Der grobe Ablauf für die while-Schleife:

Code: Alles auswählen

i = kleine zahl
solange i kleiner oder gleich grosse zahl:
    neue summe = alte summe + i
    erhöhe i um eins
zeige endsumme
Und nun muss man diese Gedanken eben als Code schreiben. Vorab zu klären wäre die Frage, ob man wirklich eine Unterscheidung für die neue und alte Summe braucht. Nein, braucht man nicht. Was einem in Prosa sinnvoll erscheint, kann nämlich im Code unnötig kompliziert sein. Also stattdessen besser nur summe benutzen und dies bei jedem Durchlauf erhöhen.

Dann noch die Frage, was der Startwert für die Summe vor Betreten der Schleife sein muss. Denn ich kann ja nicht einfach i zu Nichts addieren. Aber welche Zahl steht denn in der Mathematik für "Nichts" und kann man die hier sinnvoll einsetzen? Überleg mal...
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

@Jankie. Ja, du hast ja recht, aber für mich hat der Beitrag von Blackjack nur mehr Verwirrung gestiftet als Aufklärung gebracht. Bin einfach nicht so im coden drin als das mir ausführliche Beispiele da helfen, so schade das für mich auch ist. Und dann noch von einer anderen Sprache auf Python umzuschreiben würde ich wohl gar nicht hinbekommen. Studiere kein Informatik, sondern hatte Java und eben Python als Pflichtmodule in einem Wirtschaftsingenieur-Studiengang. Daher verzeiht auch die mitunter dämlichen Fragen, die von mir kommen. Für mich ist das leider alles nicht selbstverständlich (offensichtlich).
Es gibt doch ein bestimmtes Schema (Bedingung, Anweisungen, etc.) wie eine for- und eine while-Schleife aufgebaut ist. Dann könnte man sonst ja einfach auch die for-Schleife nehmen und die danach umschreiben.

@snafu

Habe grad folgendes programmiert und es scheint zu funktionieren:

Code: Alles auswählen

zahl1 = int(input("Geben Sie eine Zahl ein: "))
zahl2 = int(input("Geben Sie eine weitere Zahl ein: "))
zahlen = [zahl1, zahl2]
zahlen.sort()

ergebnis = 0

i = zahlen [0]
while i <= zahlen[1]:
    ergebnis = ergebnis + i
    i+=1
print (ergebnis)
So müsste es funktionieren. Wenn es unsauber o.ä. programmiert ist einmal bitte anmerken, aber die Funktion läuft jetzt.
nezzcarth
User
Beiträge: 1754
Registriert: Samstag 16. April 2011, 12:47

ScottyMiller hat geschrieben: Dienstag 18. August 2020, 14:43 Wenn es unsauber o.ä. programmiert ist einmal bitte anmerken, aber die Funktion läuft jetzt.
Das ist keine Funktion. Eine Funktion wird in Python mit 'def …' eingeleitet und gibt einen Rückgabewerte zurück. Du musst auch nicht unbedingt eine Funktion daraus machen, nur ist die Terminologie an der Stelle eben nicht zutreffend. Ansonsten gibt es stilistisch einige Dinge zu bemängeln. Zum Beispiel verwendest du einmal '+=', in der Zeile darunter aber wieder nicht. vor und Hinter solche Operatoren gehört ein Leerzeichen, vor eckige und runde Klammern (bei Funktionsaufrufen) jedoch nicht.
Antworten