Problem bei der Berechnung von Kommazahlen

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.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Ich habe ein Problem unzwar,
Ich will das bei einer Rechnung eine Kommazahl herauskommt ( nicht wie bei x=25 y=13 Z=x/y rauskommen tut 1) kommt immer diese Meldung: (Ich hab' die Werte über easygui herausgekriegt (AS und AD6 und P = ad6 * 6))
Traceback (most recent call last):
File "...", line 6, in <module>
P2 = P/AS
TypeError: unsupported operand type(s) for /: 'str' and 'str'
ich habs schon so probiert (variablen nehmen wir jetzt mal an haben den Wert AS=25 und AD6 = 13)

P = AD6 * 6
P2 = str(P) / str(AS)
auch schon so
P2 = str(P) / AS
so :
P2 = P / str(AS)
und so:
P2 = P / AS

könnt ihr mir helfen, dass am ende eine Kommazahl eherauskommt? :K :oops:

Viele Grüße Micky2010
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

TypeError: unsupported operand type(s) for /: 'str' and 'str'
Die Meldung sagt doch alles. Du hast Strings und musst diese in ein passendes Zahlenformat wandeln. Dazu schau Dir in der Doku die Built-in Functions an.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Wie mache ich das?
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Micky2010 hat geschrieben:Wie mache ich das?
Wie du dir die Built-in Functions in der Dokumentation anschauen kannst?

Öffne einen Webbrowser. Gehe auf die Webseite http://www.python.org. Klicke auf "Documentation". Such die passende Python-Version und klick dort auf "Library Reference". Klicke dort auf "Built-in Functions".

Im Tutorial ist im 3. Kapitel übrigens ebenfalls die Funktion erwähnt, mit der du z.B. einen String in eine Fließkommazahl verwandeln kannst. Vielleicht solltest du dich wirklich erst einmal im Tutorial etwas weiter durcharbeiten bevor du an jeder Ecke mit einem Problem hängen bleibst.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Micky2010 hat geschrieben:
Hyperion hat geschrieben:[...] schau Dir in der Doku die Built-in Functions an.
Wie mache ich das?
Indem du hier draufklickst: http://docs.python.org/library/functions.html.
In specifications, Murphy's Law supersedes Ohm's.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Hab' das Problem gelöst (selber) unzwar mit:
P2 = float(P) / float(AS)

print(P2)

:D :D :D :D

Trotzdem, ihr habt mir sehr geholfen, danke :mrgreen:

Frage geschlossen
_______________________________________________________________________________________________________________________
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Vielleicht ist das hier noch hilfreich:

Code: Alles auswählen

In [14]: import locale

In [15]: locale.setlocale(locale.LC_NUMERIC, "de_DE")
Out[15]: 'de_DE'

In [16]: locale.atof('2,3')
Out[16]: 2.2999999999999998
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Die Lösung ist, ich wandle die Strings in int's um.
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Micky2010 hat geschrieben:Die Lösung ist, ich wandle die Strings in int's um.
Wenn du mit Nachkommastellen arbeiten möchtest, dann sollten es vielleicht besser floats sein.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Ich meine so, hier der Quelltext:

Code: Alles auswählen

# -*- coding: cp1252 -*-

import easygui # importiert easygui ( Ein Modul)
def Notenberechnung():
    pass
easygui.msgbox(msg="Wenn z.b. niemand eine 1 oder eine 5 geschrieben hat, bitte 0 eingeben, sonst funktioniert's nicht!", title="Wichtiger Hinweis")
AS = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche die Arbeit geschrieben haben eingeben', title='Bitte Schüleranzahl eingeben')
AD1 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 1 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 1 eingeben')
AD2 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 2 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 2 eingeben')
AD3 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 3 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 3 eingeben')
AD4 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 4 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 4 eingeben')
AD5 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 5 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 5 eingeben')
AD6 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 6 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 6 eingeben')
# holt die Werte durch easygui
AD1=int(AD1)#wandelt sie in ints um
AD2=int(AD2)
AD3=int(AD3)
AD4=int(AD4)
AD5=int(AD5)
AD6=int(AD6)
P6 = AD6 * 6 # rechnet anzahl der Schüler welche eine 6 geschrieben haben mal 6 wie bei 5,4,3,2,1
P5 = AD5 * 5
P4 = AD4 * 4
P3 = AD3 * 3
P2 = AD2 * 2
P1 = AD1 * 1
Y = int(P1) + int(P2) + int(P3) + int(P4) + int(P5) + int(P6) # rechnet die zuvor errechneten Werte zusammen
DS =  float(Y) / float(AS) # rechnet Y durch die Anzahl der Schüler welche die Arbeit geschrieben haben
print(DS) # schreibt DS 
if __name__ == '__main__':
     Notenberechnung()
Das ist der Code.
Viele Grüße Micky2010
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mal abgesehen, daß das eine umständliche Art ist ein gewichtetes Mittel zu berechnen ...

Was ist denn der Typ von P1-P6? Und wieso mußt Du diesen Typ dann in Integer wandeln? Und was wäre wenn AD1-AD6 schon floats wären, würde sich das Ergebnis verändern, würden alle weiteren Umwandlungen weggelassen? Und wenn man schon die Zahl der geschriebenen Arbeiten gesondert eingeben läßt, statt sie zu berechnen: Wäre es dann nicht sinnvoll eine Kontrolle einzubauen, ob die übrigen Nutzerangaben stimmig sind?

Und wozu eine Funktion, die nichts macht, hinter der __name__-Abfrage?

Nur mal so als Anregungen,
Gruß,
Christian

PS Vielleicht wären Funktionen wie 'map' auch mal interessant angeschaut zu werden? ;-)
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Das mit den Int's mach ich lieber zur Sicherheit, ich könnte es aber auch weglassen und dieser Weg ist der einfachste der mir eingefallen ist.


Viele Grüße Micky2010
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

"Zur Sicherheit" ein int in ein int wandeln ist wie wenn man mit der Taschenlampe nachschaut, ob die Deckenlampe leuchtet. Außerdem bezog sich CMs Nachfrage nicht auf die Zeile

Code: Alles auswählen

Y = int(P1) + int(P2) + int(P3) + int(P4) + int(P5) + int(P6)
sondern explizit auf die Zeilen

Code: Alles auswählen

ADn=int(ADn)
wo du einen String in einen numerischen Typ umwandelst, und da kannst du gleich nach float umwandeln, statt nach int. Außerdem solltest du lernen, was es mit Schleifen und Listen auf sich hat.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

pillmuncher hat geschrieben:Außerdem solltest du lernen, was es mit Schleifen und Listen auf sich hat.
Etwas konkreter: Wenn man anfängt, Bezeichner durchzunummerieren ist das ein typischer Hinweis darauf, dass man besser eine Liste verwenden sollte.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

pillmuncher hat geschrieben:"Zur Sicherheit" ein int in ein int wandeln ist wie wenn man mit der Taschenlampe nachschaut, ob die Deckenlampe leuchtet. Außerdem bezog sich CMs Nachfrage nicht auf die Zeile

Code: Alles auswählen

Y = int(P1) + int(P2) + int(P3) + int(P4) + int(P5) + int(P6)
sondern explizit auf die Zeilen

Code: Alles auswählen

ADn=int(ADn)
wo du einen String in einen numerischen Typ umwandelst, und da kannst du gleich nach float umwandeln, statt nach int.
Warum sollte man einen Wert, der eine ganze Zahl sein muss besser gleich in eine Fließkommazahl umwandeln?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Weil am Ende ein float bei der Division herauskommen soll.

OK, jetzt ist natürlich wichtig zwischen Python 2.x und 3.x zu unterscheiden, aber ich habe mal 2.x unterstellt.

Gruß,
Christian
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

CM hat geschrieben:Weil am Ende ein float bei der Division herauskommen soll.

OK, jetzt ist natürlich wichtig zwischen Python 2.x und 3.x zu unterscheiden, aber ich habe mal 2.x unterstellt.
Naja, bei 2.x sollte man sowieso immer "from __future__ import division" in einer der ersten Zeilen haben wenn man etwas ausrechnen will. Anders darf man sich sowieso zu Tode debuggen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

pillmuncher hat geschrieben:"Zur Sicherheit" ein int in ein int wandeln ist wie wenn man mit der Taschenlampe nachschaut, ob die Deckenlampe leuchtet.
LOL - Deine Erfindung oder ist das ein bekanntes "Gleichnis"?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Ich habe das Programm umgeschrieben mit arrays und erstmal ohne easygui, mit inputs.

Code: Alles auswählen

# -*- coding: cp1252 -*-
noten = []
for z in range(1,7):
               note = input("Bitte anzahl der "+str(z)+"-er eingeben.(Wenn null dann 0 eingeben):\n")
               noten.append(note)

for y in range(0,6):
    var = noten[y]
    schueler = schueler + var
    y_2 = var * (y + 1)
    ges_noten = ges_noten + y_2



durchs = ges_noten / float(schueler)
print"Der Durchschnitt ist : %.3f" % durchs

Bitte schreibt eure kritik dazu,
gut ich könnte die fors umbenennen.
LG Micky2010
P.S. kennt jemand ein gutes SQlite tutorial und kann man auch SQL importieren /benutze?
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

- wieso codierst Du in diesem kruden Windows-Encoding und nicht in etwas sinnvollem wie utf-8? Es fehlt der Shebang.

- benutzt Du Python3 oder 2? Wenn 2, dann bitte ``raw_input`` nutzen!

- String-Konkatenation mit "+" ist ganz schlecht, per "%"-Operator schon besser, am besten per ``"".format()`` Methode!

- wieso muss die erste Schleife bei "1" anfangen?

- wieso fängt die zweite bei "0" an, wo Du dort wohl die "1" benötigst? Du willst Dort aber auch einfach ``enumerate`` nutzen - dann sparst Du Dir diese Überlegungen ;-) (ok, da solltest Du auch den Start auf "1" setzen)

- ``y`` und ``y_2`` sind sehr schlechte Namen - was soll man mit ``y`` anfangen? Da denkt man eher an eine Koordinate... (``ges_noten`` und vor allem ``durchs`` sind das natürlich auch)

- die Anzahl der Schüler kannst Du einfacher so berechnen:

Code: Alles auswählen

>>> noten = [2, 5, 8, 5, 2, 0]
>>> sum(noten)
22
- die letzte for-Schleife kann man auch durch einen Generator-Ausdruck ersetzen:

Code: Alles auswählen

>>> sum((count*note for count, note in enumerate(noten, 1)))
66
Aber ok, dass muss man als Anfänger nicht ;-) Immerin habe ich Dir schon mal die Verwendung von ``enumerate`` verraten...

- Du verwendest also doch Py2 (hab das ``print`` erst jetzt gesehen). Also beachte die obigen Hinweise!

- Code auf Modulebene - das solltest Du in Funktionen auslagern.

@SQL-Fragen: Für neues Thema bitte einen neuen Thread erstellen. Klar sind mir diese Fragen so auch noch nicht. Also formuliere das am besten in einem separaten Thread noch mal neu ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten