Aufgabe: EAN Code berechnen
-
Hallo und schönen Nachmittag liebe Gemeinde.
Ich habe eine neue Aufgabe bekommen. Sie lautet wie folgt:
`Schreiben Sie ein Programm, welches die Prüfziffer für den 13-stelligen EAN-Code berechnet.
Der EAN-Code ist folgendermaßen aufgebaut:
Beispiel: 4012700963109
40 -> Länderkennziffer(40=Deutschland
12700 -> Kennzeichen des Herstellers
96310 -> Produktziffer
9 -> Prüfziffer
Die Prüfziffer dient zur Kontrolle, ob der eingegebene oder eingelesene EAN-Code korrekt ist. Wurde z. B. eine Zahl vertauscht oder falsch eingegeben, so stimmt die Prüziffer nicht mit der Prüfziffer überein, die bei der Fehleingabe errechnet wurde. An der Scannerkasse ertönt ein Warnsignal.
Die Prüziffer errechnet sich wie folgt aus den ersten 12 Stellen:
Summe 1: Die Summe aus der 1.,3.,5.,7.,9. und 11. Ziffer
Summe 2: Die Summe aus der 2.,4.,6.,8.,10. und 12. Ziffer. Die Summe2 wir mit 3 multipliziert und zur Summe1 addiert.
Die Prüfziffer ergibt sich aus der Differenz dieser Summe zur nächsten durch 10 teilbaren Zahl.
Beispiel:
Summe1: 4+1+7+0+6+1 = 19
Summe2: 0+2+0+9+3+0 = 14 * 3 = 42
Gesamtsumme: 61
Differenz zu 70 = 9 9 ist die Prüfziffer.
`
Ich habe mir folgenden Ablaufplan erstellt:
`Einlesen: 401270096310
1stens: Sum1: 417061 -> Quersumme 1 = 19
2tens: Sum2: 020930 -> (Quersumme 2) * 3;
Quersumme1 und Quersumme2 addieren =61
nächsthöhere 10er Zahl finden
Differenz bilden
`
Folgenden Code habe ich bereits geschrieben:
#include <iostream> #include <string> using namespace std; string berechne_Summe_1(string Ganz) { string Erg; for(int i=0; i<Ganz.size(); i+=2) { char c = Ganz[i]; Erg = Erg + c; } return Erg; } string berechne_Summe_2(string Ganz) { string Erg; for(int i=1; i<Ganz.size(); i+=2) { char c = Ganz[i]; Erg = Erg + c; } return Erg; } int qsum(string str) { int sum = 0; for(int i=0; i<str.size(); i++) { char Zeichen = str[i]; int zahl = static_cast<int> (Zeichen); sum += zahl; } return sum; } int main() { string strEAN_Code; string strSumme_1; string strSumme_2; cout << "\t Programm zur Bestimmung der Prüfziffer eines EAN Codes!\n"; cout << "Geben Sie den 12stelligen EAN Code ein\n"; cin >> strEAN_Code; strSumme_1 = berechne_Summe_1(strEAN_Code); //cout << strSumme_1 <<"\n"; int qs1 = qsum(strSumme_1); cout << qs1; strSumme_2 = berechne_Summe_2(strEAN_Code); cout << strSumme_2 <<"\n"; cin >> strEAN_Code; return 0; }
Wenn ich jedoch mit dem Debugger arbeite, bekommt die Variable "zahl" aus Zeile 38 den Wert '52'.
Nun zu meinen Fragen:
Ist '52' der ASCII Wert? Ist es überhaupt möglich, einen C++ String in Integer umzuwandeln, wie ich in Zeile 37 gemacht habe?
Danke für die Antworten im Voraus.
Gruß
Max
-
zum thema umwandeln eines zeichens in eine zahl für deine quersumme:
#include <string> #include <iostream> int main() { std::string str("1234"); for(int i = 0; i < str.size(); ++i) // du könntest auch einen iterator verwenden, wenn du weißt, was das ist, wenn nicht, vergiss es einfach, so geht das auch { std::cout << static_cast<int>(str[i] - '0') << " "; // du musst noch die '0' subtrahieren. WICHTIG hierbei ist, dass die 0 in hochkommatas steht => char // wieso du subtrahieren musst erkennst du in einer ascii-tabelle, wenn du die dezimalwerte der zeichen anschaust // und folgende rechnung nach vollziehst: static_cast<int>(str[i]) - static_cast<in>('0') (das ist dann die gleiche rechnung wie zwei zeilen weiter oben) } }
http://en.cppreference.com/w/cpp/language/ascii
ein beispiel noch: static_cast<int>('8') - static_cast<in>('0') = 56 - 48 = 8
den rest hab ich mir nicht angeschaut, ob das so vom algorithmus her stimmt.
noch ein kleiner tip, benenne deine funktionen so, dass man vom namen her ableiten kann, was sie machen. unter berechne_Summ_1 kann ich mir ohne dein wissen erstmal nicht viel vorstellen, aber addiere_ungerade_stellen, oder so etwas in der richtung, ist dann, finde ich zumindest, aussagekräftiger
-
Ich weiß jetzt nicht, ob der Fehler an sich an der Funktion liegt...
int qsum_1(string str) { int sum_1 = 0; for(int i=0; i<str.size(); i++) { char Zeichen = str[i]; int zahl = static_cast<int> (Zeichen); sum_1 += zahl; } return sum_1; }
Wenn ich mit dem Debugger arbeite, dann bekomme ich für die Variable
sum
folgende Werte:
1ster Durchlauf: 52
2ter Durchlauf: 52+49=101
3ter Durchlauf: 101+55=156
4ter Durchlauf: 156+48=204
usw.
-
Nur zu deiner Frage, den Code habe ich mir nicht weiter angesehen:
Nein, so nicht.Aber du kannst an den Zahlenwert eines Zahlzeichens kommen, indem du das Zeichen '0' (die Darstellung der Null) abziehst:
str[i] - '0'
Wenn du dir den ASCII mal ansiehst, kannst du feststellen dass die Ziffern aufsteigend und zusammenhängend sind.
Das wird so vom Standard auch garantiert.
Was nicht garantiert ist, das es ASCII sein muss. (Also das '0' den Wert 48 hat).
Darum schreibst du ja auch '0' und nicht 48.Beachte, das es das Zeichen '0' (Ziffer für 0) ist und nicht das Stringende '\0'
-
vario-500 schrieb:
zu
#include <string> #include <iostream> int main() { std::string str("1234"); for(int i = 0; i < str.size(); ++i) // { std::cout << static_cast<int>(str[i] - '0') << " ";//Das muss ich ja dann in der jeweiligen Funktion machen..??? } }
-
ja genau, du musst es in jeder funktion machen.
als beispiel für deine quersumme:unsigned /*ein ergebnis kleiner als 0 kann es nicht geben*/ quersumme(std::string str) //oder const std::string& str { unsigned sum = 0; for(int i=0; i<str.size() - 1; i++) // die letzte ziffer nicht dazu addieren, dass ist ja deine prüfziffer (wenn ich das jetzt richtig verstanden hab) { char zeichen = str[i]; int zahl = static_cast<int>(zeichen - '0'); // hier die '0' subtrahieren sum += zahl; // man könnte die drei zeilen auch in eine schreiben } return sum; }
dementsprechend kannst du auch die anderen funktionen schreiben, jedoch dann halt nur mit anderem schleifenkopf
-
Bitte verstehe mein jetziges Posting nicht als Kritik, aber wenn ich das, was Du vorgeschlagen hast, rein hacke, dann stimmen in der Ausgabe die ersten 5 Ziffern nicht mit den Ziffern des EAN Codes überein
Hier die beiden Funktionen, um die es mir geht:int qsum_1(string str) { int sum_1 = 0; for(int i=0; i<str.size()-1; i++) { char Zeichen = str[i]; int zahl = static_cast<int>(Zeichen-'0'); sum_1 += zahl; } return sum_1; } int qsum_2(string str) { int sum_2 = 0; for(int i=0; i<str.size()-1; i++) { char Zeichen = str[i]; int zahl = static_cast<int>(Zeichen -'0'); sum_2 += zahl; sum_2 = sum_2*3; } return sum_2; }
-
Das ist falsch:
sum_2 = sum_2*3;Du musst am ende mal 3 nehmen, nicht jedesmal.
Mach es anders:
Setz dich auf Papier hin und rechne jeden einzelnen Schritt den du programmieren willst vorher auf Papier durch. Und dann wenn die Rechnung fertig ist, tippst du das einfach in C++ ab.
-
ich hab es gerade ausprobiert udn es klappt. ( http://ideone.com/LLbllo )
deine qsum_2 funktion arbeitet falsch. zeile 20 wir mit jedem zeilendurchlauf ausgeführt. du hast aber oben geschrieben, dass die zweite summe berechnet werden solll UND DANN mit 3 multipliziert werden soll, deshalb klappt das bei dir nicht. schau mal genau hin, was du stattdessen machst.
die funktion qsum_1 müsste eigentlich richtig sein und die funkionsnamen sind immer noch nicht so richtig gut, finde ich.
-
vario-500 schrieb:
ich hab es gerade ausprobiert udn es klappt. ( http://ideone.com/LLbllo )
Also bei mir werden in der Ausgabe die ersten 6 Ziffern falsch angezeigt... Kannst Du bitte eine Verlinkung zu Ideone.com reinstellen, damit ich das vergleichen kann?
vario-500 schrieb:
die funktion qsum_1 müsste eigentlich richtig sein und die funkionsnamen sind immer noch nicht so richtig gut, finde ich.
Es geht mir im Moment ja nur darum, ob es funktioniert... Die Schönheitschirugie kann ich danach auch machen
-
silent_max schrieb:
Also bei mir werden in der Ausgabe die ersten 6 Ziffern falsch angezeigt... Kannst Du bitte eine Verlinkung zu Ideone.com reinstellen, damit ich das vergleichen kann?
der link ist doch da ? und dein fehler wurde dir auch zwei mal gesagt. mach es einmal auf mit nem bleistift auf papier und schreib dir einfach jede kleine rechnung dazu auf, dann brauchst du nachher fast nur noch abschreiben für den quelltext.