EAN Prüfziffer berechnen
-
Hallo,
ich würde gerne ein C++ programm für EAN Prüfziffernberechnung schreiben. Leider bin ich im moment nicht so fitt in c++. Ich benutze den Borland builder 5. Vielleicht hat ja jemand den Quellcode und kann ihn hier rein posten.
Ich habe auch schon mal im netz gesucht und auch was gefunden. allerdings funzt der nicht.
include <iomanip.h> include <conio.h> include <iostream.h> using namespace std; int main() { int gerade = 0; // Speichert die Summe aller Zahlen mit geradem Index int ungerade = 0; // Speichert die Summe aller Zahlen mit ungeradem Index char ean[14]; // 14 Stellen benötigt wegen der binären NULL cout << "Berechnung der Pruefsumme der Europaeischen Artikel Nummer.\n"; cout << "Bitte geben Sie die (E)uropaeischen (A)rikel (N)ummer ein:"; cin >> ean; //------------------------------------------------- // Auslesen der geraden, als auch ungeraden Indices // und aufsummieren der Ergebnisse. for(int i = 1; i < 13; i++) { if (i%2 == 0) { char temp = ean[i-1]; gerade += atoi(&temp); } else { char temp = ean[i-1]; ungerade += atoi(&temp); } } //------------------------------------------------- //------------------------------------------------- // Die Formel für den EAN Code lautet: // 7 7 2 8 3 5 5 9 7 0 3 4 4 // c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 k // k = Prüfsumme // Formel: //( -(c1 + c3 + c5 + c7 + c9 + c11) - 3 * (c2 + c4 + c6 + c8 + c10 + c12) ) mod 10 = k // Man erkennt, dass der Code zwar Einzelfehler, jedoch // eine Nachbartransponität nicht erkennt. // 1 2 3 4 5 6 7 8 9 10 11 12 k // 0 0 0 0 5 0 0 0 0 0 0 0 5 ist voll kommen korrekt da (-5) - 3*(0) mod 10 = 5 = k // 0 0 0 5 0 0 0 0 0 0 0 0 5 ist ebenfalls korrekt da ( 0) - 3*(5) mod 10 = 5 = k int ergebnis = (- ungerade - 3 * gerade) % 10; // Wenn man -5 mod 8 rechnen will dann kommt nicht etwa -3 raus sondern 3 // -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 // MOD 8 = // 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 // Deswegen muss man das Ergebnis falls es negativ ist einfach + 8 nehmen char k = ean[12]; if (ergebnis < 0) { ergebnis += 10; } if (ergebnis == atoi(&k))// Das Ergebnis muss mit der Prüfsumme übereinstimmen { cout << "\nDer EAN Code ist korrekt.\n\a"; } else { cout << "\nDer EAN Code ist nicht korrekt.\n"; cout << "Die \"richtige\" Pruefsumme muesste " << ergebnis << " lauten.\n\a"; } getch() return 0; }
vielleicht weiß jemand den fehler ja.
danke schon mal im vorraus...
//Edit Codetags
-
atoi() erwartet einen nullterminierten C-STring als Eingabe - und dein einzelner char-Wert ist höchstwahrscheinlich NICHT nullterminiert. Ersetze mal diese Aufrufe durch:
int ziffer = ean[i-1] - '0'; if(i%2==0) gerade += ziffer; else ungerade -=ziffer;
Außerdem hast du die Prüfziffer 'k' bereits in deiner Summenformel eingesetzt.
-
ehh wie gesagt ich bin nich so bewandert in c++. wo soll das hin?*G*
-
Anstelle deines atoi()-Gebastels in der ersten for()-Schleife.
-
class EanChecksum { private: int multiply, checksum, check; public: EanChecksum(std::string const& ean) : multiply(3), checksum(0) { for_each(ean.rbegin() + 1, ean.rend(), bind1st(mem_fun(&EanChecksum::push), this)); check = *(ean.end() - 1) - '0'; } void push (char c) { checksum += (c - '0') * multiply; multiply = (multiply == 3) ? 1 : 3; } int get() const { return 10 - checksum % 10; } bool valid() const { return get() == check; } }; int main(int argc, char *argv[]) { EanChecksum ean("5449000096241"); cout << ean.valid(); cin.get(); }
-
Es sollte sich erst gar keine ungültige EAN erzeugen lassen. :p
-
OOP schrieb:
Es sollte sich erst gar keine ungültige EAN erzeugen lassen. :p
Mensch, mir graut vor dir! Er wird natürlich versuchen die Eingabe eines menschlichen Kollegen zu prüfen...
Greetz, Swordfish
-
Keine Ahnung was du jetzt meintest
, aber ich meinte man könnte die EAN schon im Konstruktor auf Gültigkeit prüfen und wenn sie nicht gültig ist eine Exception schmeissen.