# ISBN Nummer prüfen



## Luke22 (20. Nov 2017)

Hallo Leute!

Ich bin Studienanfänger, hatte vorher also noch nie mit JAVA zu tun und habe folgende Aufgabe bekommen.

Die Internationale Standardbuchnummer (englisch: International Standard Book Number, ISBN) ist eine Nummer zur
eindeutigen Kennzeichnung von Büchern und anderen selbständigen Veröffentlichungen mit redaktionellem Anteil, wie
beispielsweise Multimedia-Produkten und Software. Es existieren dazu verschiedene Varianten, e.g. ISBN-10 und ISBN-
13. Hier wollen wir uns auf ISBN-10 beschränken.
Zu Sicherungs- und Kontrollzwecken von ISBNs wird die letzte Stelle als Prüfziffer verwendet. Diese Prüfziffer der ISBN
wird nach einfachen Regeln aus den übrigen Ziffern berechnet:
Man multipliziere die erste Ziffer mit eins, die zweite mit zwei, die dritte mit drei und so fort bis zur neunten Ziffer, die mit
neun multipliziert wird. Man addiere die Produkte und teile die Summe ganzzahlig mit Rest durch 11. Der Divisionsrest ist
die Prüfziffer. Falls der Rest 10 beträgt, ist die Prüf-"ziffer" ein "X".
Beispiel einer ISBN-Prüfziffer:
ISBN 3898641171 ("Sprechen Sie Java?")
3*1 + 8*2 + 9*3 + 8*4 + 6*5 + 4*6 + 1*7 + 1*8 + 7*9 =
3 + 16 + 27 + 32 + 30 + 24 + 7 + 8 + 63 = 210
210 / 11 = 19 Rest: 1 => Prüfziffer korrekt!
Schreiben Sie ein Programm, das eine ISBN einliest und prüft ob diese formal korrekt ist, d.h. ob die Prüfziffernrechnung
korrekt ist. Verwenden Sie zum Einlesen der ISBN die Methode In.read().

Meine Fragen dazu sind:
Wie kann ich, wenn die ISBN als eine eingelesen wird, die einzelnen Stellen mit der jeweiligen Zahl (1-9) multiplizieren?
Wie kann ich die Länge der ISBN überprüfen?

Danke im voraus!


----------



## SchwarzWeiß (20. Nov 2017)

Also mit Modulo kommst du an die einzelnen Ziffern einer Zahl. 
Bekommst du die Zahl als Integer oder als String in der Form "ISBN 3898641171 ("Sprechen Sie Java?")" ? Falls du den String bekommst, musst du die Zahl natürlich zuerst herausschneiden.


----------



## Luke22 (20. Nov 2017)

Also, das habe ich jetzt aus einer anderen Aufgabe (Mastermind):
int zZ4 = zahl % 10;
int zZ3 = (zahl/10) % 10;
int zZ2 = (zahl/100) % 100;
int zZ1 = (zahl/1000) % 1000;

nur das eben mit den 9 Stellen?
lg


----------



## SchwarzWeiß (20. Nov 2017)

Genau, so kommst du ja an die neun Stellen und kannst sie entsprechend multiplizieren.


----------



## Luke22 (20. Nov 2017)

Die Sache ist die, dass ich die ISBN als char eingeben muss da die 10. Stelle kann auch ein X sein.
Deswegen geht das mit Modulo nicht oder täusch ich mich??


----------



## SchwarzWeiß (20. Nov 2017)

Luke22 hat gesagt.:


> Schreiben Sie ein Programm, das eine ISBN einliest und prüft ob diese formal korrekt ist, d.h. ob die Prüfziffernrechnung
> korrekt ist.


Also für mich hört sich das so an, als würde das Programm die korrekte Schreibweise (=zehn Ziffern) erwarten und nur die Korrektheit bzgl. der Ziffern muss überprüft werden. 
Falls die Schreibweise auch falsch sein kann, würde ich eine syntaktische Überprüfung vorher machen und wenn alles passt zu einem Integer konvertieren und dann eben wie gesagt das mit der Modulorechnung.


----------



## Luke22 (20. Nov 2017)

Das sind die Beispiele die gegeben sind, sorry habe ich vorher vergessen:

ISBN-Prüfung
============
ISBN: 3898641171
ISBN ist korrekt!
...
ISBN: 389864117X
ISBN ist nicht korrekt!
...
ISBN: 12345678901
Keine gueltige ISBN!

Es soll also die Anzahl der Stellen überprüft werden (ob sie 10 sind oder nicht), falls diese zu viele sind heißt es "Keine gueltige ISBN". Das ist also die erste Abfrage.
Dann soll die letzte Stelle berechnet werden ob diese korrekt ist oder nicht.
Die ISBN soll aber eben als Eine eingegeben werden, also kann auch ein X an letzter Stelle stehen.
Mit einem möglichen X kann die ISBN aber kein int sein, muss doch ein char sein?
Deswegen steh ich da gerade an.
Das ich die 10. Stelle auf Richtigkeit mit den ersten 9 Stellen überprüfe ist mir klar. 
Eben das ist mein Problem:
Wie grenze ich also die ersten 9 Stellen ab um die 10. zu berechnen?
Und wie überprüfe ich die Anzahl der gesamten Stellen der ISBN?


----------



## SchwarzWeiß (21. Nov 2017)

Ein char ist ein einzelnes Zeichen, du meinst ein String. Mit der Methode substring() von String kannst du schon mal das ISBN wegstreichen, dann könntest du versuchen mit Integer.parseInt() den String zu konvertieren (in einem try-catch-Block). Im try-Block machst du weiter, wenn es funktioniert, im catch-Block gibst du die Meldung aus, dass die ISBN nicht korrekt ist.


----------



## SchwarzWeiß (21. Nov 2017)

Und dann noch eine Abfrage ob die Zahl im Bereich zwischen 1000000000 und 10000000000 ist.


----------

