EAN Code
-
ich muss wirklich als kaum könner von c++ outen. ich mach ne eingabe mit m_csEingabe.
könntest du mir das detaillierte erklären.
-
jule_165 schrieb:
ich muss wirklich als kaum könner von c++ outen. ich mach ne eingabe mit m_csEingabe.
Nur am Rande: Der Variablenname hilft hier niemandem wirklich weiter
könntest du mir das detaillierte erklären.
Ich kann's versuchen:
string eingabe = "12345"; int summe = 0; for(size_t i=0;i<eingabe.size();++i) { int ziffer = eingabe[i]-'0'; // ASCII-Umrechnung - das Ergebnis ist der Ziffernwert von 0 bis 0 summe += ziffer; } cout<<"die Quersumme von "<<eingabe<<" ist "<<summe<<endl;
(die Prüfziffer-Berechnungen kannst du hoffentlich selber dort einsetzen)
-
Das funktioniert irgendwie nicht,aber ich glaub das liegt an mir
.
hier mal mein programm code:
#include "stdafx.h" #include "PE_KL.h" #include "PE_KLDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPE_KLDlg dialog CPE_KLDlg::CPE_KLDlg(CWnd* pParent /*=NULL*/) : CDialog(CPE_KLDlg::IDD, pParent) { //{{AFX_DATA_INIT(CPE_KLDlg) m_csEingabe = _T(""); m_csAusgabeLand = _T(""); m_csAusgabeArtikelnummer = _T(""); m_csAusgabeEANNummer = _T(""); m_csAusgabeFirma = _T(""); m_iPruef = 0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CPE_KLDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPE_KLDlg) DDX_Text(pDX, IDC_ED_Eingabe, m_csEingabe); DDX_Text(pDX, IDC_ST_AusgabeLand, m_csAusgabeLand); DDX_Text(pDX, IDC_ST_AusgabeArtikelnummer, m_csAusgabeArtikelnummer); DDX_Text(pDX, IDC_ST_AusgabeEANNummer, m_csAusgabeEANNummer); DDX_Text(pDX, IDC_ST_AusgabeFirma, m_csAusgabeFirma); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPE_KLDlg, CDialog) //{{AFX_MSG_MAP(CPE_KLDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_Auswertung, OnBTNAuswertung) ON_BN_CLICKED(IDC_BTN_Loeschen, OnBTNLoeschen) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPE_KLDlg message handlers BOOL CPE_KLDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CPE_KLDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CPE_KLDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CPE_KLDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CPE_KLDlg::OnBTNAuswertung() { // TODO: Add your control notification handler code here UpdateData(true); if(m_csEingabe.GetLength() != 13) { MessageBox( " EAN - Code entspricht nicht der Länge 13! ", " Fehlermeldung", MB_ICONINFORMATION ); } else { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if( m_csEingabe[0] == '0' && ( m_csEingabe[1] == '0' || m_csEingabe[1] == '1'|| m_csEingabe[1] == '2' || m_csEingabe[1] == '3' //USA und Kanada || m_csEingabe[1] == '4'|| m_csEingabe[1] == '5' || m_csEingabe[1] == '6' || m_csEingabe[1] == '7'|| m_csEingabe[1] == '8' || m_csEingabe[1] == '9' )) { m_csAusgabeLand = " USA und Kanada"; if ((m_csEingabe[2] == '8') && (m_csEingabe[3] == '5') && (m_csEingabe[4] == '1') && (m_csEingabe[5] == '7') && (m_csEingabe[6] == '8')) //Nike Sportswear { m_csAusgabeFirma = " Nike Sportwear"; } if ((m_csEingabe[2] == '9') && (m_csEingabe[3] == '0') && (m_csEingabe[4] == '7') && (m_csEingabe[5] == '7') && (m_csEingabe[6] == '4')) //Converse { m_csAusgabeFirma = " Converse"; } if ((m_csEingabe[2] == '8') && (m_csEingabe[3] == '2') && (m_csEingabe[4] == '2') && (m_csEingabe[5] == '2') && (m_csEingabe[6] == '4')) //Microsoft { m_csAusgabeFirma = " Microsoft"; } else { m_csAusgabeFirma = " Firma nicht vorhanden"; } } if( m_csEingabe[0] == '3' && ( m_csEingabe[1] == '0' || m_csEingabe[1] == '1'|| m_csEingabe[1] == '2' || m_csEingabe[1] == '3' //Frankreich || m_csEingabe[1] == '4' || m_csEingabe[1] == '5' || m_csEingabe[1] == '6' || m_csEingabe[1] == '7') ) { m_csAusgabeLand = " Frankreich"; if ((m_csEingabe[2] == '2') && (m_csEingabe[3] == '8') && (m_csEingabe[4] == '7') && (m_csEingabe[5] == '0') && (m_csEingabe[6] == '4')) // Mchelin { m_csAusgabeFirma = " Michelin"; } if ((m_csEingabe[2] == '2') && (m_csEingabe[3] == '2') && (m_csEingabe[4] == '1') && (m_csEingabe[5] == '1') && (m_csEingabe[6] == '0')) //Saint Albray { m_csAusgabeFirma = " Saint Albray"; } if ((m_csEingabe[2] == '7') && (m_csEingabe[3] == '4') && (m_csEingabe[4] == '6') && (m_csEingabe[5] == '3') && (m_csEingabe[6] == '4')) //L'Oreal { m_csAusgabeFirma = " L'Oreal"; } else { m_csAusgabeFirma = " Firma nicht vorhanden"; } } if( m_csEingabe[0] == '4' && ( m_csEingabe[1] == '0' || m_csEingabe[1] == '1'|| m_csEingabe[1] == '2' || m_csEingabe[1] == '3' //Deutschland || m_csEingabe[1] == '4' ) ) { m_csAusgabeLand = " Deutschland"; if ((m_csEingabe[2] == '0') && (m_csEingabe[3] == '0') && (m_csEingabe[4] == '5') && (m_csEingabe[5] == '2') && (m_csEingabe[6] == '1')) //Dr.Oetker { m_csAusgabeFirma = " Dr. Oetker"; } if ((m_csEingabe[2] == '0') && (m_csEingabe[3] == '1') && (m_csEingabe[4] == '6') && (m_csEingabe[5] == '8') && (m_csEingabe[6] == '6')) //Haribo { m_csAusgabeFirma = " Haribo"; } if ((m_csEingabe[2] == '0') && (m_csEingabe[3] == '3') && (m_csEingabe[4] == '1') && (m_csEingabe[5] == '7') && (m_csEingabe[6] == '1')) //Gutfried { m_csAusgabeFirma = " Gutfried"; } else { m_csAusgabeFirma = " Firma nicht vorhanden"; } } if( m_csEingabe[0] == '4' && ( m_csEingabe[1] == '5' || m_csEingabe[1] == '9' ) ) //Japan { m_csAusgabeLand = " Japan"; if ((m_csEingabe[2] == '0') && (m_csEingabe[3] == '5') && (m_csEingabe[4] == '5') && (m_csEingabe[5] == '2') && (m_csEingabe[6] == '4')) //Sony { m_csAusgabeFirma = " Sony"; } else { m_csAusgabeFirma = " Firma nicht vorhanden"; } } // else // { // m_csAusgabeLand = " Land nicht vorhanden"; // } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CString Artikelnummer; //Ausgabe Artikelnummer for( int i = 0; i != 5; ++i ) { Artikelnummer += m_csEingabe[7+i]; } m_csAusgabeArtikelnummer = Artikelnummer; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// string eingabe = "1111"; int summe = 0; for(size_t i=0;i<eingabe.size();++i) { int ziffer = eingabe[i]-'0'; // ASCII-Umrechnung - das Ergebnis ist der Ziffernwert von 0 bis 0 summe += ziffer; } cout<<"die Quersumme von "<<eingabe<<" ist "<<summe<<endl; UpdateData(false); } void CPE_KLDlg::OnBTNLoeschen() { // TODO: Add your control notification handler code here m_csAusgabeLand = ""; m_csAusgabeFirma = ""; m_csAusgabeArtikelnummer = ""; m_csAusgabeEANNummer = ""; m_csEingabe = ""; UpdateData(false); }
-
Erstens hatte ich gehofft, daß du genug mitdenken kannst, um meinen Beispielcode nicht 1:1 zu übernehmen - das war nur ein Ansatzpunkt, an dem du ansetzen könntest.
Zweitens hast du doch schon herausgefunden, wie du die einzelnen Ziffern der Eingabe erreichen kannst.
Und drittens: sfds (das nächste Mal machst du es bitte gleich richtig ;))
-
Erstens hatte ich gehofft, daß du genug mitdenken kannst, um meinen Beispielcode nicht 1:1 zu übernehmen - das war nur ein Ansatzpunkt, an dem du ansetzen könntest.
Zweitens hast du doch schon herausgefunden, wie du die einzelnen Ziffern der Eingabe erreichen kannst.
Und drittens: So funktioniert das Syntaxcoloring: (das nächste Mal machst du es bitte gleich richtig ;))bei cstring hab ich schon rausgefunden wie das geht. aber ich müsste erstmal die zahlen umwandeln. ach ich hab irgendwie keinen plan!sorry
-
jule_165 schrieb:
bei cstring hab ich schon rausgefunden wie das geht. aber ich müsste erstmal die zahlen umwandeln. ach ich hab irgendwie keinen plan!sorry
Bei einem CString funktioniert das ganz genauso wie bei einem std::string - beide enthalten char-Werte*, an die du mit dem Index-Zugriff herankommst. Und ein char stellt zwar ein Zeichen dar, ist allerdings ein Zahlenwert (der ASCII-Wert hinter dem Zeichen, das dargestellt wird). Durch Subtraktion von '0' kannst du einen Wert im Bereich 0 bis 9 erhalten, mit dem du dann ganz normal weiterrechnen kannst.
PS: Das Zitieren üben wir aber nochmal
* OK, beim CString ist das nur die halbe Wahrheit, aber die Unterschiede zwischen ANSI, UNICODE und MULTIBYTE erspare ich dir an dieser Stelle.
-
Die große Frage ist doch eigentlich warum die Eingabefelder überhaupt ihre Werte an einem CString übergeben, anstatt das nicht gleich in eine Int-Variable anzulegen wenn es eh nur Zahlen sind, dann kann sich das CEdit auch gleich drum kümmer das nur Zahlen eingegeben werden können. Als nächstes könnte man die utopisch Lagen If-Abfragen in Switch-Abfragen wandeln was die Ganze sache wieder Lesbarer macht.
Also wenn das schon mal umgebaut wird, erledigen sich schon mal ne menge Fragen.
-
CTecS schrieb:
Die große Frage ist doch eigentlich warum die Eingabefelder überhaupt ihre Werte an einem CString übergeben, anstatt das nicht gleich in eine Int-Variable anzulegen wenn es eh nur Zahlen sind, dann kann sich das CEdit auch gleich drum kümmer das nur Zahlen eingegeben werden können. Als nächstes könnte man die utopisch Lagen If-Abfragen in Switch-Abfragen wandeln was die Ganze sache wieder Lesbarer macht.
Also wenn das schon mal umgebaut wird, erledigen sich schon mal ne menge Fragen.
Naja, ein EAN-Code im allgemeinen besteht eben nicht nur aus Zahlen. Der EAN-128, den ich hier auch oft verwenden muss, nimmt ganze Zeichenketten auf.
Wenn es natürlich nur das ist, was da so auf den Verpackungen drauf ist, dann hast du natürlich Recht. Allerdings bringen manche Scanner beim Scannen Scanfehler, die eventuell auch schon mal als Buchstabe gedeutet werden (je nach dem was der Scanner intern noch so verarbeitet). Weiterhin finde ich die Zerlegung in Teilstrings wesentlich einfacher als dann Abschnitte aus einem int oder long heraus zu operieren. Aber wie CStoll schon sagte, ganz lustig wirds, wenn das Projekt mit Unicode arbeitet. Aber das scheint ein VC6-Projekt zu sein und da ist das ja schon mal keine Default-Einstellung.
Ja und die if-Konstrukte würde ich auch per switch/case lesbarer gestalten.
-
Also um noch mal meinem Senf mit beizusteuern, bin ich beim lesen davon ausgegangen das der Code per Tastatur eingegeben wird, denn es Handelt sich ja um CEdit Felder, und selbst wenn der Code vom Scanner kommt, dann würde ich den sicherlich net in ein CEdit Packen um ihn im Anschluß wieder daraus Auszulesen, in demfall würde ich mir ne Kleine Klasse Basteln die mir den Code Verwaltet und ich nur noch mit entsprechenden Funktionen drauf zu greif um das passende zurück zu bekommen, also jegliche Konvertierung von String in Int und zurück könnte man in der Klasse machen. Ist einfacher zu Verwalten und zu Pflegen als verstreuter Code im Programm.
-
CTecS schrieb:
Also um noch mal meinem Senf mit beizusteuern, bin ich beim lesen davon ausgegangen das der Code per Tastatur eingegeben wird, denn es Handelt sich ja um CEdit Felder, und selbst wenn der Code vom Scanner kommt, dann würde ich den sicherlich net in ein CEdit Packen um ihn im Anschluß wieder daraus Auszulesen, in demfall würde ich mir ne Kleine Klasse Basteln die mir den Code Verwaltet und ich nur noch mit entsprechenden Funktionen drauf zu greif um das passende zurück zu bekommen, also jegliche Konvertierung von String in Int und zurück könnte man in der Klasse machen. Ist einfacher zu Verwalten und zu Pflegen als verstreuter Code im Programm.
Und wie würdest du des dann machen? Der Sinn eines Strichcodes ist ja sogar, dass er eingegeben wird. Viele Strichcodeschriftarten haben nicht mal ne Klartextanzeige, wie willst du dann wissen welches Zeichen hinter der Masse an dünnen und dickten Strichen steckt. Übrigens: sämtliche unserer Programme inklusive Warenwirtschaftssystem arbeiten so. Ohne Barcode würde das heute bei uns gar nicht mehr gehen, weil der Mist überall drauf ist und man immer ne Charge oder eine Artikel- bzw. Auftragsnummer benötigt. Der Scanner wird ja in der Regel als Tastatur im System erkannt und wenn der Focus in einem CEdit hängt, dann scannst du halt die ganze Zeichenkette da rein. Da der meist noch als abschließendes Zeichen ein return mitgibt kann man das abfangen, um dann mit dem Inhalt des Editfeldes irgendwas (in dem Falle eine Zeichenkettenzerlegung) anfangen.