Seite 1 von 1

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

Verfasst: Donnerstag 27. Juli 2006, 18:23
von EnTeQuAk
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

Verfasst: Donnerstag 27. Juli 2006, 18:53
von icepacker
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.

Verfasst: Donnerstag 27. Juli 2006, 19:22
von birkenfeld
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.

Verfasst: Freitag 28. Juli 2006, 08:03
von EnTeQuAk
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

Verfasst: Freitag 28. Juli 2006, 12:48
von birkenfeld
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.

Verfasst: Freitag 28. Juli 2006, 13:07
von EnTeQuAk
sehr schön ;)

Danke für die Hilfe!

MfG ChrissiG