Wertebereich für long zu klein (ISBN-10 einlesen)
-
Hallo,
ich bin kurz vorm Ziel eines umfangreichen Programms, jedoch hänge ich nun an einer Stelle fest.Mein Prof möchte das ich aus folgender Textdatei ISBNs als unsigned long einlese:
3-4233-62167-2 3-446-19313-8 0-7475-5100-6 3-89842-643-5
typedef struct{ unsigned long ISBN; }
Dabei soll ich dann die Prüfsumme berechnen und mit der aus der Textdatei vergleichen.
Jetzt habe ich jedoch das Problem das der Wertebereich von long nur bis 2147483647 geht.
Habt ihr vielleicht eine idee was sich der Prof dabei gedacht hat und wie man dabei die einzelnen Zahlen auslesen könnte um die Prüfsumme berechnen zu können?
-
Fehler gefunden:
unsigned long geht doch bis 4.294.967.295Aber wie schaffe ich es nun, aus der riesigen Zahl die Prüfsumme zu berechnen?
Wenn ich die ISBN als char Array einlesen würde, würde das doch mehr sinn machen?!
-
TheGrandCoder schrieb:
Habt ihr vielleicht eine idee was sich der Prof dabei gedacht hat
Etwas in der Art von: "Das musste ich schon vor 30 Jahren als Übungsaufgabe in Fortran machen" und nicht viel mehr. Vermutlich ist ihm gar nicht bekannt, welche Wertebereiche ein unsigned long garantiert hat und er geht eben von seinem System aus, wo der long 64 Bit hat und denkt, das wäre überall so. Ein unsigned long long (aus C99, auch bei vielen C89-Dialekten verfügbar) hat jedoch garantiert immer mindestens 64 Bit. Oder du nimmst den uint64_t aus stdint.h (ebenfalls ab C99). Ich würde jedenfalls nicht anfangen, da von Hand die Gesamtzahl aus mehreren longs zusammen zu setzen.
und wie man dabei die einzelnen Zahlen auslesen könnte um die Prüfsumme berechnen zu können?
Wenn du die Zahl erst einmal gespeichert hast, ist das kein Problem mehr, oder?
TheGrandCoder schrieb:
Wenn ich die ISBN als char Array einlesen würde, würde das doch mehr sinn machen?!
Ja. Aber wenn das nun einmal nicht die Aufgabe ist, dann musst du dich mal dunkel erinnern, wie dir in der Grundschule das Ziffernsystem erklärt wurde.
-
Die Prüfziffer gehört auch nicht zur Nummer, da diese auch X sein kann.
Zumindest bei ISBN 10. Für ISBN 13 ist der Wertebereich eh zu klein.Und wie die Prüfsumme berechnet wird, steht in Wikipedia.
An die einzelnen Stellen kannst du nacheinander mit dem Modulo-Operator % und der Division kommen.
-
Super! Vielen Dank für eure Hilfe!
Die Modulo Operation wirds seinNoch eine Frage:
Wie kann ich die korrekt ermittelten ISBNs in ihrer Ursprungsform (X-XXXXX-XXX-X) ausgeben?Soweit ich es richtig verstanden habe, lese ich die Bindestriche bei unsigned long nicht mit ein.
Habt ihr vielleicht eine Idee, wie ich das am besten lösen könnte?
-
Ungefähr auf die gleiche Weise wie das Berechnen der Prüfsumme.
-
Also quasi immer in Bindestrich nach bestimmter Anzahl hinzufügen?
Problem ist nur die ursprünglichen ISBN unterschiedliche formen haben:
X-XXX-XXXXX-X
X-XXXX-XXXX-X
X-XXXXX-XXX-X
-
TheGrandCoder schrieb:
Also quasi immer in Bindestrich nach bestimmter Anzahl hinzufügen?
Das beschreibt jetzt dein Vorhaben, aber ob dein Ansatz zur Lösung ist daraus nicht herauslesbar.
Problem ist nur die ursprünglichen ISBN unterschiedliche formen haben:
X-XXX-XXXXX-X
X-XXXX-XXXX-X
X-XXXXX-XXX-XDa gibt es ja vordefinierte Muster zwischen den Werten und der Gruppierung, die man einprogrammieren könnte. Dies ist wieder eine Schwäche der Repräsentation der gesamten ISBN in einer einzigen Zahl. Die ISBN ist nun einmal eine Ziffern- oder mindestens eine Zahlenfolge, die Repräsentation als eine Zahl ist da eher ungünstig. Bist du sicher, die Aufgabe richtig verstanden zu haben?