ISBN-Nummer zerlegen
-
Also mir wäre die Methode von thordk lieber, weil wir noch nicht mit Strings gearbeitet haben.
Allerdings weiß ich nicht, wie ich das nun anwenden soll. Als was muss ich isbn deklarieren und muss ich uchar auch deklarieren?
-
DeLaSerna schrieb:
...Ein Problem dabei ist, dass manche dieser Nummern ein X beinhalten und ich dies beachten muss...
Hi,
soweit ich weiß, kann das höchstens bei der letzten Stelle sein (Prüfziffer), Deswegen würde ich nicht für jede Stelle eine Sonderlocke einbauen, sondern nur für die letzte Stelle (z.B. die letzter Stelle auf 'X' abfragen und int auf 10 setzen)....
Gruß,
Simon2.
-
Ihr lebt ja wohl noch im ersten Jahrtausend nach 1006 n.Ch., inzwischen gibts doch was viel besseres. Jeder Depp weiss doch, dass 13 mehr als 10 ist, also sind die neuen ISBN auch besser.
http://www.heise.de/newsticker/result.xhtml?url=/newsticker/meldung/83064
-
@Simon2
Ja, nur die letzte Stelle kann ein X sein.@Entenwickler
Die Aufgabenstellung lautet aber 10stellige ISBN-Nummern zu überprüfen und nicht 13stellige
-
Kann mir nochmal bitte jemand helfen?
Ich würd gern den Vorschlag von thordk nehmen, aber ich hab keine Ahung, was ich dabei beachten muss.
-
Du mußt vor allem beachten, daß du genug Platz für die ISBN vorsehen solltest (10 Byte+Stringende = 11, wenn du Trennzeichen nicht vorher aussortierst, auch mehr). Und du mußt bedenken, daß '1'!=1 ist (ein char-Wert entspricht dem ASCII-Code des Zeichens).
Ansonsten: Was sollst du mit den ISBN's machen? Und was hast du schon vorliegen?
PS: Auch wenn der Autor deines Buches anderer Meinung sein wird - std::string ist wesentlich einfacher zu handhaben als char*. Und imho sollte man sich das Leben nicht unnötig schwer machen

-
Also hier ist mal meine komplette Aufgabenstellung:
Es solle eine Funktion
int gew_quersumme (int zahl);
entworfen und implementiert werden. Der Parameter zahl stelle die Ziffern 1 – 9 der zu überprüfenden ISBN-Nummer dar. Die Funktion soll als Ergebnis die gewichtete Quersumme der Ziffern 1-9 nach o.g. verfahren berechnen und diese dem rufenden Programm zurückgeben.
Weiter soll eine Funktion
bool test_isbn(int zahl, char letzte);
entworfen und implementiert werden. Der Parameter zahl stelle die Ziffern 1 – 9 der zu überprüfenden ISBN-Nummer dar. Die gewichtete Quersumme dieser Zahl soll mit Hilfe der Funktion gew_quersumme berechnet werden. Zu dieser soll der gewichtete Wert der letzten Ziffer (Wertevorrat '0'...'9',X, Wichtuing dieser Ziffer ist 10) hinzuaddiert werden. Die letzte Ziffer wird als Parameter letzte übergeben.
Wie gesagt, soll ich keine Strings o.ä. verwenden, weil wir das noch nicht behandelt haben.
Hier ist mal das Programm, was ich bis jetzt gemacht habe:
#include <iostream> #include <math.h> using namespace std; main() { char isbn[10]; char z0, z1, z2, z3, z4, z5, z6, z7, z8, z9, X; cout << "Bitte geben Sie eine 10stellige ISBN-Nummer ein!\n"; cin >> isbn; z0 = isbn[0]; z1 = isbn[1]; z2 = isbn[2]; z3 = isbn[3]; z4 = isbn[4]; z5 = isbn[5]; z6 = isbn[6]; z7 = isbn[7]; z8 = isbn[8]; z9 = isbn[9]; if (z9 = X) { z9 = 10; } else { z9 = isbn[9]; } cout << endl; cout << (z0*1 + z1*2 + z2*3 + z3*4 + z4*5 + z5*6 + z6*7 + z7*8 + z8*9 + z9*10) % 11; cout << endl; system("PAUSE"); }Irgendetwas an meiner Abfrage wegen dem X stimmt auch noch nicht. Wenn ich diese rausnehme, funktioniert das Programm aber wenigstens für alle ISBN-Nummern ohne X.
-
Erstmal stimmt an deinem Programm nicht, daß du von den char-Werten noch jeweils '0' abziehen müsstest, um auf den jeweiligen Ziffernwert zu kommen. Und zweitens mußt du nicht mit X (das ist eine Variable, die dir der Compiler höchstwahrscheinlich als "nicht deklarierter Bezeichner" um die Ohren hauen dürfte), sondern mit 'X' (char-Konstante) vergleichen.
-
Wer lesen kann ist im Vorteil, er hat eine Variable names X, die ist aber nicht initalisiert, darum wirds wohl (nur) Warnungen regnen.
Warum machst du nicht einfach das was in der Aufgabe steht? Ist meistens Sinn und Zweck davon. Das ist ne verdammte Uebungsaufgabe und kein Enduser-Programm, also kannste das ganze mit der Fehlerueberpruefung bei der Eingabe vergessen, geh doch mal einfach davon aus der Anwender gibt das im Format ein wie du es haben willst, Kosemetik geht danach immer noch.
Dann sieht das ganze etwa so aus:
#include <iostream> int gew_quersumme (int zahl) { } bool test_isbn(int zahl, char letzte) { int summe; if(letzte >= '0' && letzte <= '9') { summe = letzte - '0'; } else if(tolower(letzte) == 'x') { summe = 10; } else { assert(false); } return summe == qew_quersumme(zahl); } int main() { int isbn; char pruefsumme; cin >> isbn >> pruefsumme; if(test_isbn(isbn, pruefsumme)) { cout << "isbn ist ok" << endl; } }Man bin ich grade nett, naja hatte heute auch schon nen BJ das setzt viel von dem Hormonzeug aus.
-
Dankeschön. Allerdings funktioniert das Ganze bei mir noch nicht. Kommen noch Fehlermeldungen

-
Hallo
Willst du die selber eliminieren, oder willst du, dass wir raten?
chrische
-
Ich würde das ja selber machen, aber leider hab ich wirklich keine Ahnung...
-
Wir sind leider nicht in der Lage, von hier aus deinen Rechner zu sehen (Kristallkugel lässt grüßen :D), deshalb mußt du uns schon sagen, was für Fehler du hast (und bei welchem Programm).
-
Also ich benutzt Dev-C++ 4.9.9.2 und bekommen folgende Fehlermeldungen beim kompilieren:
In function
bool test_isbn(int, char)': Zeile 14 -qew_quersumme' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)In function
int main()': 20cin' undeclared (first use this function)
22cout' undeclared (first use this function) 22endl' undeclared (first use this function)Bei dem Fehler in Zeile 14 steht ja soweit ich das verstehe, dass gew_quersumme nicht deklariert ist und bekomm den Fehler nicht selber weg.
Bei den 3 anderen Fehler weiß ich nich wirklich, was ich damit anfangen soll.
-
Die anderen drei Fehler besagen, daß die Objekte cin, cout und endl nicht definiert sind - für diese brauchst du den Header <iostream> und notfalls ein "using namespace std;" am Anfang des Programms. Die Funktion gew_quersumme mußt du schon selber schreiben (und darauf achten, daß du dich bei dem Namen nicht verschreibst).
-
Tut mir leid dass ich mich da vertippt hab (Achtung, das war Sarkasmus!) - aber bei deiner Eigeninitiative ist es wohl besser wenn du endlich folgdes schreibst: " Hallo ich habe keine Ahnung bitte gebt mir einen fertigen Quellcode denn ich will eine gute Note haben. "