ISBN Prüfziffer berechnen als übung... einige Fragen

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.
Antworten
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Ich bin bi einer Aufgabe in meeinem Buch angelangt... und zwar soll cih ein Script entwerfen wo die ISBN-Prüfziffer berechnet wird.

berechnet wird sie nach der Gleichung

Code: Alles auswählen

summe = z1+2*z2+3*z3*4+5*z5+6*z6+7*z7+8*z8+9*z9
zur Erinnerung ;)

So und nun zum Problem..

Die Datei die sie mir als Beispieldatei angeben sieht folgendermaßen aus:

Code: Alles auswählen


#!/usr/bin/env python

# Berechnung der ISBN Pruefziffer

nummer = input("Geben Sie eine neustellige ganze Zahl ein: ")
z9 = nummer%10
nummer = nummer/10
z8 = nummer%10
nummer = nummer/10
z7 = nummer%10
nummer = nummer/10
z6 = nummer%10
nummer = nummer/10
z5 = nummer%10
nummer = nummer/10
z4 = nummer%10
nummer = nummer/10
z3 = nummer%10
nummer = nummer/10
z2 = nummer%10
nummer = nummer/10
z1 = nummer%10
nummer = nummer/10

summe = z1+2*z2+3*z3+4*z4+5*z5+6*z6+7*z7+8*z8+9*z9

pruefziffer = summe%11
print "Pruefziffer: ", pruefziffer
Der Programmablauf sieht dann z.B. so aus.
Geben Sie eine neustellige ganze Zahl ein: 382660423
Pruefziffer: 7
So funktioniert... kein Problem... aber ich sehe nicht ganz durch

Und zwar warum der Autor das hier gemacht hat

Code: Alles auswählen

z9 = nummer%10
nummer = nummer/10
z8 = nummer%10
nummer = nummer/10
z7 = nummer%10
nummer = nummer/10
z6 = nummer%10
nummer = nummer/10
z5 = nummer%10
nummer = nummer/10
z4 = nummer%10
nummer = nummer/10
z3 = nummer%10
nummer = nummer/10
z2 = nummer%10
nummer = nummer/10
z1 = nummer%10
nummer = nummer/10
zerlegt er damit die Eingegebene Zahl in einzelne Ziffern... ja oder?
Wenn ja geht das auch anders/kürzer?

Das ist ansich mein Hauptproblem.

Ich hoffe das ihr mir nen Anschups geben könnt ;)

MfG ChrissiG
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

Hi
Ich hatte mir das Buch irgendwann mal ausgeliehen gehabt,
naja die Aufgabe hab ich noch auf meiner Festplatte gefunden.

Code: Alles auswählen

s = raw_input('ISBN: ')
s = tuple(s)
s = 1*int(s[0]) + 2*int(s[1]) + 3*int(s[2]) + 4*int(s[3]) + 5*int(s[4])\
      + 6*int(s[5]) + 7*int(s[6]) + 8*int(s[7]) + 9*int(s[8])
x = s % 11
print x
Aber frag mich jetzt nicht wieso ich vor so langer Zeit, dass mal so gemacht habe.
Und da hab ich auch noch schlechter programmiert als jetzt also...
eine Musterlösung ist das bestimmt nicht.
ubuntu linux !!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Kurzlösung (isbn ist ein string):

Code: Alles auswählen

pz = sum((num+1)*int(ziffer) for num, ziffer in enumerate(isbn)) % 11
Erklärung: enumerate(a) gibt dir eine Folge von Tupeln (i, x) aus: i ist eine laufende Nummer und x das jeweilige Element von a. Da Strings Folgen von Zeichen sind, kann man enumerate() direkt darauf anwenden.
Da die Nummerierung bei 0 losgeht, multipliziert man also i+1 mit int(ziffer) [da ziffer ja noch ein string ist].

Das Konstrukt "x for y in z" ist eine "generator expression", die x für jedes Element aus z (auf das in x mit y zugegriffen wird) anwendet. sum() summiert das ganze auf.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Soo... das erste Skript war mir persönlich selbsterklärender, aber sehr gute Erklärung beim 2.

Das habe ich letztendlcih genommen... weils einfach einfach kurtz ist.

Vorher musste ich mir deinen Text allerdings etwas umschreiben ;) Ich hoffe das ich das richtig verstanden habe alles

also aus

Erklärung: enumerate(a) gibt dir eine Folge von Tupeln (i, x) aus: i ist eine laufende Nummer und x das jeweilige Element von a. Da Strings Folgen von Zeichen sind, kann man enumerate() direkt darauf anwenden.
Da die Nummerierung bei 0 losgeht, multipliziert man also i+1 mit int(ziffer) [da ziffer ja noch ein string ist].

Das Konstrukt "x for y in z" ist eine "generator expression", die x für jedes Element aus z (auf das in x mit y zugegriffen wird) anwendet. sum() summiert das ganze auf.
ist das hier geworden:
Die Funktion "enumerate(isbn)" gibt dir eine Folge von Tupeln (i, x) aus; i ist eine fotlaufende Nummer und x das jeweilige, zu x gehörende Element von isbn.
soweit richtig? Bei der letzen Formulierung bni ich mir net sicher...
Da Strings Folgen von Zeichen sind, kann man enumerate() direkt darauf anwenden.
selbsterklärend...
Da die Nummerierung bei 0 losgeht, multipliziert man also i+1 mit int(ziffer) [da ziffer ja noch ein string ist].
auch selbsterklärend... das wäre dann dieser Teil hier richtig?

Code: Alles auswählen

sum((num+1)*int(ziffer)
Das ganze funktioniert sozusagen so:

"z1 + " 1 um eins addieren "2*z2 + " wieder um eins addieren "3*z3" usw...

habe ich das auch richtig verstanden...?
Das Konstrukt "x for y in z" ist eine "generator expression", die x für jedes Element aus z (auf das in x mit y zugegriffen wird) anwendet. sum() summiert das ganze auf.
Das ist etwas schwerer geworden... da habe ich erstmal Bahnhof verstanden ;)

Das habe ich mir auf das Bsp. umgeschrieben (Also x duch z.B. "(num+1)*int(ziffer)" ersetzt usw.) und dann machte es auch langsam !klack! ;)

Also das ganze schaut jetzt so aus:

Code: Alles auswählen

#!/usr/bin/env python

# Berechnung der ISBN Pruefziffer

isbn = raw_input("Geben Sie eine neustellige ganze Zahl ein: ")

pruefziffer = sum((num+1)*int(ziffer) for num, ziffer in enumerate(isbn)) % 11 

#Gleichung fuer ISBN-Pruefziffer summe = z1+2*z2+3*z3+4*z4+5*z5+6*z6+7*z7+8*z8+9*z9

print "Pruefziffer: ", pruefziffer
Bei mir hat ist es gegangen ;)


Also Danke für die echt starke Hilfe!

MfG ChrissiG
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

ChrissiG hat geschrieben:
Die Funktion "enumerate(isbn)" gibt dir eine Folge von Tupeln (i, x) aus; i ist eine fotlaufende Nummer und x das jeweilige, zu x gehörende Element von isbn.
soweit richtig? Bei der letzen Formulierung bni ich mir net sicher...
Passt.
Da die Nummerierung bei 0 losgeht, multipliziert man also i+1 mit int(ziffer) [da ziffer ja noch ein string ist].
auch selbsterklärend... das wäre dann dieser Teil hier richtig?

Code: Alles auswählen

sum((num+1)*int(ziffer)
Jo.
Das ganze funktioniert sozusagen so:

"z1 + " 1 um eins addieren "2*z2 + " wieder um eins addieren "3*z3" usw...

habe ich das auch richtig verstanden...?
"um eins addieren" verstehe ich nicht, aber im Prinzip ja. (num+1)*int(ziffer) ist ein Element der Summe. Dieses ist ein Ausdruck, der "num" und "ziffer" enthält. "num" und "ziffer" sind in jedem Element anders, da diese von enumerate(isbn) zurückgegeben werden.

Der Ausdruck "(num+1)*int(ziffer) for num, ziffer in enumerate(isbn)" ergibt also die "Folge" z1, z2*2, z3*3. sum() sorgt für das Aufsummieren. Wenn man statt sum() z.B. list() nimmt, bekommt man entsprechende eine Liste mit den Einzelwerten.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

sehr schön ;)

Danke für die Hilfe!

MfG ChrissiG
Antworten