Hilfe beim Quelltext

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.
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Also ich versuche hier eine Aufgabe zu meistern und bekomme es einfach nicht hin... :(
Die Aufgabe lautet:
Schreibe ein Programm Addierer, das den Anwender auffordert, ganze Zahlen einzugeben, die addiert werden sollen. Jede Zahl wird mit <Enter> abgeschlossen. Eine leere Eingabe (also nur <Enter>) beendet die Eingabe.
Beispiel:
Eingabe: 2 <Enter> 5 <Enter> 1 <Enter> <Enter>
Ausgabe: 2+5+1=8

Mein Problem ist das ich nicht weiß wie ich das mit der Ausgabe hinbekommen soll...
Ich könnte höhstens die "8" als Ergebnis ausgeben, aber die anderen Zahlen nicht..
Es würde mich freuen wenn mir jemand helfen könnte.
BlackJack

@Dupstre: Warum kannst Du die anderen Zahlen nicht ausgeben? Du musst doch im Grunde nur die Liste durchgehen, wo Du Dir die Zahlen gemerkt hast, und sie dann ausgeben. Wobei man sich am besten die eingegebenen Zeichenkettendarstellungen merkt und diese mit der `join()`-Methode auf Zeichenketten mit den '+'-Zeichen verbindet.
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Das kann ich nicht, weil ich noch ein Anfänger bin und wir diese Befehle nochnicht gelernt haben...
Das sind die Befehle die mir zur verfügung stehen:
while
if
else
elif
print
input
str/int/float/round
</>/<=/>=/==/!=
+/-/*/ "/" /%
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Dupstre: Das sind streng genommen auch nicht alles "Befehle", sondern auch Funktionen und Datentypen. Und ohne Listen wird es nur auf eine schmutzige Art und Weise gehen...

Zeig uns doch mal Deinen bisherigen Code!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Naja der ist leider falsch und besitzt Sytaxfehler.. Ich lerne die Prigramiersprache "Python" ja erst seid einer Woche.

Code: Alles auswählen

# Addierer.py
# Dieses Programm addiert Zahlen

a = 0
while True:
    eingabe = str(input("Geben Sie eine ganze Zahl ein:")
    [u]a[/u] = a + int(eingabe)
    if int(eingabe) % 1 != 0[u]:[/u]
        break
print(a)
An den unterstrichenen Stellen werden mir auch Sytaxfehler angezeigt...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dupstre hat geschrieben:Naja der ist leider falsch und besitzt Sytaxfehler..
Dann solltest Du die mal als erstes ausbessern ;-) Schreibe doch nicht so viel Code auf einmal, der nicht funktioniert! Schreibe immer nur kleine Häppchen und teste diese aus. Damit kommst Du erst gar nicht dahin, dass Du mehrere Syntaxfehler auf einmal beheben musst.
Dupstre hat geschrieben: An den unterstrichenen Stellen werden mir auch Sytaxfehler angezeigt...
Innerhalb von Code-Tags funktionieren die BBCodes natürlich nicht.

- Schau Dir mal die Zeile mit dem `input` genau an. Zähle die Klammern, die Du aufmachst und die, die Du schließt. Beides muss dieselbe Zahl ergeben... sonst ist eine Klammerebene ja nicht geschlossen ;-)

- `input` liefert Dir bereits ein Objekt vom Typ `str`. Die Umwandlung via `str()` ist damit überflüssig, wie man schnell in einer Shell nachprüfen kann:

Code: Alles auswählen

In [2]: text = input("Ihr Text: ")
Ihr Text: 42

In [3]: type(text)
Out[3]: builtins.str

In [4]: text
Out[4]: '42'
- Der Ausdruck `integer % 1` ist immer 0. Die Bedingung kann somit nie wahr werden...

- Du willst eine *leere* Eingabe als Abbruch haben. Der Rückgabewert ist dann ein leerer String. Der Wahrheitswert davon ist `False`. Somit kannst Du das direkt in einem `if`-Statement testen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

- Du willst eine *leere* Eingabe als Abbruch haben. Der Rückgabewert ist dann ein leerer String. Der Wahrheitswert davon ist `False`. Somit kannst Du das direkt in einem `if`-Statement testen.
Könntest du mir bitte diese Zeile schreiben?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dupstre hat geschrieben: Könntest du mir bitte diese Zeile schreiben?
Nö, da wir hier nur Hilfe zur Selbsthilfe geben; speziell bei Hausaufgaben ;-)

Aber mal als Denkanstoß:

Code: Alles auswählen

In [22]: bool("42")
Out[22]: True

In [23]: bool("")
Out[23]: False
Ein der Wahrheitswert eines leeren Strings ist also `False`. Ein `if`-Statement wertet den folgenden Ausdruck immer nach dessen Wahrheitswert aus.

In Pseudo-Code:

Code: Alles auswählen

if Ausdruck:
    # springe hier rein, wenn Ausdruck `True` ist
Mit dem Operator `not` kann ich einen Wahrheitswert invertieren:

Code: Alles auswählen

In [24]: not True
Out[24]: False

In [25]: not False
Out[25]: True
Mit diesen Bruchstücken bzw. Wissen solltest Du das nun selber formulieren können.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Hmm erstmal danke ich dir für deine Hilfe weitergebraucht hat es mich auf jedenfall, denn jetzt konnte ich die Eingabe und die Ausgabe perfektionieren, jedoch fehlt mir immernoch der Mittelteil, undzwar der Teil der sozusagen rausfindet ob nichts eingegeben wurde und nur die <Enter> Taste gedrückt wurde...
So weit bin ich jetzt schon und ich hoffe du kannst mir den entscheidenden Hinweis geben:

Code: Alles auswählen

# Addierer.py
# Dieses Programm addiert Zahlen

a = 0
b = ""
while True:
    eingabe = input("Geben Sie eine ganze Zahl ein:")
    a = a + int(eingabe)
    b = str(b) + eingabe
    if :
        break
print(a)
Zuletzt geändert von Hyperion am Mittwoch 9. Mai 2012, 17:47, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Schau Dir doch mein letztes Posting noch einmal an und versuche die einzelnen Schritte und Aspekte in einer Python-Shell nachzuvollziehen! Da ist *alles* dabei, was Du brauchst. Du hast eine *leere* Eingabe (== leerer String) und kannst dessen Wahrheitswert verwenden, um in einen `if`-Zweig zu gelangen. Das `if` hast Du ja sogar schon stehen... fehlt nur noch der passende Ausdruck.

Ach ja: Wie haben hier für Python-Code spezielle Code-Tags: [ code=python ] ... [ /code] oder [ python ] [ /python ] ohne die Leerzeichen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Ja das habe ich jetzt. Nur mein einziges Problem ist der Quellcode, denn falls ich nicht eingebe kann er das Nichts nicht in eine int Zahl umwandeln und ich würde gerne wissen wie ich diese Zeile anders schreiben kann...
So sieht mein Quellcode aus:

Code: Alles auswählen

# Addierer.py
# Dieses Programm addiert Zahlen

a = 0
b = ""
while True:
    eingabe = input("Geben Sie eine ganze Zahl ein:")
    a = a + int(eingabe)
    b = str(b) + eingabe
    if not eingabe:
        break
Und ich rede von dieser Zeile:

Code: Alles auswählen

a = a + int(eingabe)
BlackJack

@Dupstre: Die Anweisungen in dem ``if``-Block werden der Reihe nach ausgeführt.

Was passiert: Es wird eine Zeichenkette vom Benutzer entgegen genommen. Dann wird die in eine Zahl umgewandelt und zu `a` addiert. Dann wird die Zeichenkette zu `b` hinzugefügt. Dann wird geprüft ob die `eingabe` die leere Zeichenkette war und gegebenenfalls die Schleife verlassen.

Was ist daran falsch? Und wie müsste es in Worten passieren, damit bei einer leeren Eingabe nicht versucht wird sie in eine Zahl umzuwandeln? Beschreib das mal. Dann sollte Dir etwas auffallen…
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Na ich würd mal sagen der Fehler liegt beim ändern in eine Zahl, weil auch nichts eingegeben werden kann und man nichts nicht in eine Zahl umwandeln kann, aber wie bereits oben beschrieben weiß ich nicht wie man das "umgehen" kann.. und das war das was ich wissen wollte und nicht wo mein Fehler ist, denn das weiß ich bereits! :wink:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du hast BlackJack nicht wirklich verstanden. Denke mal über die *Reihenfolge* nach, in der Du dort verschiedene Dinge tust! Überlege Dir, *wann* Du das Testen auf eine leere Eingabe am besten vornehmen kannst ;-)

Denn wenn man die Reihenfolge abändert, dann kommt es zu dem Problem erst gar nicht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Okay. Und wie bekomme ich das Ergebnis hin?
Also das die einzellnen Summanden auch angezeigt werden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bitte sei mal präziser. Heißt "okay", dass Du das Problem mit der Umwandlung einer leeren Eingabe in einen Integer nun gelöst hast? (Eben durch Umstellung einiger Sachen)?

Und was ist nun Deine aktuelle Frage?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Ja es ist gelöst.
Jetzt bekomme ich aber nicht Ausgabe nicht hin.. :(
Ich schaff es nur die Summe herauszubekommen. Die Summanden bekomme ich nicht hin.
Könntet ihr mir bitte helfen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zeig uns doch bitte Deinen Code :roll: Ohne Code geht gar nichts, weil wir nicht wissen können, wie Dein bisheriges Grundgerüst aussieht.

Dann schreibst Du uns, was dein Programm ausgibt und was Du gerne haben willst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dupstre
User
Beiträge: 15
Registriert: Mittwoch 9. Mai 2012, 15:45

Momentaner Code:

Code: Alles auswählen

# Addierer.py
# Dieses Programm addiert Zahlen

momergebnis = 0
eingabe = 0
while True:
    momergebnis = momergebnis + int(eingabe)
    eingabe = input("Geben Sie eine ganze Zahl ein:")
    if not eingabe:
        break
print(momergebnis)
Dieser addiert alle eingegebenen Zahl und zeigt das Ergebnis an falls man eine leere Eingabe eingibt.
Das Programm soll aber auch die Summanden anzeigen.

Beispiel:
Eingabe: 2 <Enter> 5 <Enter> 1 <Enter> <Enter>
Ausgabe: 2+5+1=8
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dupstre hat geschrieben:Dieser addiert alle eingegebenen Zahl und zeigt das Ergebnis an falls man eine leere Eingabe eingibt.
Das Programm soll aber auch die Summanden anzeigen.
Dann solltest du die eingegebenen Zahlen in einer Liste sammeln. Listen sind ein absoluter Basisdatentyp und ich gehe davon aus, dass du sie kennst.

Alternativ müsstest du mit Stringverkettung arbeiten, aber das ist nicht so elegant.

Dein Code wäre übrigens leicht umgestellt etwas logischer:

Code: Alles auswählen

momergebnis = 0
while True:
    eingabe = input("Geben Sie eine ganze Zahl ein:")
    if not eingabe:
        break
    momergebnis = momergebnis + int(eingabe)
print(momergebnis)
Zuletzt geändert von /me am Donnerstag 10. Mai 2012, 12:20, insgesamt 1-mal geändert.
Antworten