Nicole_X Geschrieben 19. Januar 2010 Geschrieben 19. Januar 2010 Hallo miteinander.... ich habe folgendes problem ich müsste ein programm in c ++ schreiben, das einfach eine iban nummer prüft und auch iban nummer berechnet. also ich bräuchte nur die funktionen mehr nicht, wäre wirklich sehr nett, da ich kaum ahnung von c++ habe!! Vielen Dank schonmal!! Zitieren
Klotzkopp Geschrieben 19. Januar 2010 Geschrieben 19. Januar 2010 ich habe folgendes problem ich müsste ein programm in c ++ schreiben, das einfach eine iban nummer prüft und auch iban nummer berechnet.Berechnet aus welchen Eingabedaten? Was die Prüfung angeht: International Bank Account Number ? Wikipedia also ich bräuchte nur die funktionen mehr nicht, wäre wirklich sehr nett, da ich kaum ahnung von c++ habe!! Das heißt, jemand anders soll die Arbeit machen, die eigentlich für dich vorgesehen ist? Wie sieht denn deine Gegenleistung aus? Zitieren
Nicole_X Geschrieben 19. Januar 2010 Autor Geschrieben 19. Januar 2010 Berechnet aus welchen Eingabedaten? Was die Prüfung angeht: International Bank Account Number ? Wikipedia Die IBAN Nummer soll aus Länderkennung, BLZ und Kontonummer berechnet werden. Ja genauso wie auf Wikipedia sollte es ablaufen.. und bei der Prüfung dann einfach wieder umgestellt und Modulo 97 gemacht werden und wenn dort ein Wert von 1 herauskommt ist die IBAN Nummer korrekt und ein anderer Wert als 1 ist sie falsch. Zitieren
Klotzkopp Geschrieben 19. Januar 2010 Geschrieben 19. Januar 2010 Und was möchtest du jetzt von uns? Es ist sicher nicht Sinn dieser Aufgabe, dass du dir im Internet jemanden suchst, der das für dich macht. Wir helfen bei erkennbarer Eigeninitiative gern bei konkreten Problemen, aber wir machen hier nicht deine Arbeit. Zitieren
Nicole_X Geschrieben 19. Januar 2010 Autor Geschrieben 19. Januar 2010 #include "IBAN.h" #include "stdafx.h" using class IBAN_validieren { private: string IBAN; public: IBAN_validieren(string sIBAN) { IBAN = sIBAN; } public: bool ISIBAN() { //Leerzeichen entfernen string mysIBAN = IBAN.Replace(" ", ""); //Eine IBAN hat maximal 34 Stellen if (mysIBAN.Length > 34 || mysIBAN.Length < 5) return false; else { string LaenderCode = mysIBAN.Substring(0, 2).ToUpper(); string Pruefsumme = mysIBAN.Substring(2, 2).ToUpper(); string BLZ_Konto = mysIBAN.Substring(4).ToUpper(); if (!IsNumeric(Pruefsumme)) return false; //Prüfsumme ist nicht numerisch if (!ISLaendercode(LaenderCode)) return false; //Ländercode ist ungültig //Pruefsumme validieren string Umstellung = BLZ_Konto + LaenderCode + "00"; string Modulus = IBANCleaner(Umstellung); if (98 - Modulo(Modulus, 97) != int.Parse(Pruefsumme)) return false; //Prüfsumme ist fehlerhaft } return true; } private bool ISLaendercode(string code) { // Der Code muss laut ISO 3166-1 ein 2-stelliger Ländercode aus Buchstaben sein. if (code.Length != 2) return false; else { code = code.ToUpper(); string[] Laendercodes = { "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "DA", "DB", "DC", "DD", "DE", "DF", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DO", "DP", "DQ", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "DZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EJ", "EK", "EL", "EM", "EN", "EO", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FI", "FJ", "FK", "FL", "FM", "FN", "FO", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GI", "GJ", "GK", "GL", "GM", "GN", "GO", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HI", "HJ", "HK", "HL", "HM", "HN", "HO", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "II" }; if (Array.IndexOf(Laendercodes, code) == -1) return false; else return true; } } private: string IBANCleaner(string sIBAN) { for (int x = 65; x <= 90; x++) { int replacewith = x - 64 + 9; string replace = ((char)x).ToString(); sIBAN = sIBAN.Replace(replace, replacewith.ToString()); } return sIBAN; } private: int Modulo(string sModulus, int iTeiler) { int iStart,iEnde,iErgebniss,iRestTmp,iBuffer; string iRest = "",sErg = ""; iStart = 0; iEnde = 0; while (iEnde <= sModulus.Length - 1) { iBuffer = int.Parse(iRest + sModulus.Substring(iStart, iEnde - iStart + 1)); if (iBuffer >= iTeiler) { iErgebniss = iBuffer / iTeiler; iRestTmp = iBuffer - iErgebniss * iTeiler; iRest = iRestTmp.ToString(); sErg = sErg + iErgebniss.ToString(); iStart = iEnde + 1; iEnde = iStart; } else { if (sErg != "") sErg = sErg + "0"; iEnde = iEnde + 1; } } if (iStart <= sModulus.Length) iRest = iRest + sModulus.Substring(iStart); return int.Parse(iRest); } private bool IsNumeric(string value) { try { int.Parse(value); return (true); } catch { return (false); } } IBAN_validieren ib = new IBAN_validieren(textBox1.Text); if (!ib.ISIBAN()) { MessageBox.Show("IBAN falsch"); } } ja also das is das was ich bis jetzt habe.... aber es sind 100 fehler da drinn :d und ich komm einfach nicht mehr klar aber so ähnlich sollte es ablaufen Zitieren
Klotzkopp Geschrieben 19. Januar 2010 Geschrieben 19. Januar 2010 ja also das is das was ich bis jetzt habe.... aber es sind 100 fehler da drinn Ja, das kommt vor, wenn man Code, den man nicht versteht, von irgendwoher kopiert. Das ist übrigens kein C++, was du da abgeschrieben hast. Um das mal abzukürzen: Hast du vor, das Programm selbst zu schreiben? Zitieren
Nicole_X Geschrieben 19. Januar 2010 Autor Geschrieben 19. Januar 2010 ja danke is mir bewusst dass es c# ist ^^ und selbstverständlich ist der text kopiert ohne geht ja gar nix! :uli: Zitieren
Klotzkopp Geschrieben 19. Januar 2010 Geschrieben 19. Januar 2010 und selbstverständlich ist der text kopiert ohne geht ja gar nix!Wenn bei dir gar nichts geht, wenn du nicht irgendwo abschreibst, ist das ziemlich traurig. Du kannst nicht erwarten, dass hier jemand deine Hausaufgaben macht, wenn deine Eigeninitiative gerade mal dazu ausreicht, irgendwelchen Code abzuschreiben. Zitieren
LadyPreis Geschrieben 19. Januar 2010 Geschrieben 19. Januar 2010 ja danke is mir bewusst dass es c# ist ^^ Und warum schreibst du dann im Titel was von C++? und selbstverständlich ist der text kopiert ohne geht ja gar nix! :uli: Gegen kopieren spricht auch nichts. Man darf aber nicht erwarten, dass Programmierung nur aus dem Kopieren von vorhandenen Quellen besteht. Dazu gehört auch Verständniss. Hast du Klotzkopp eigentlich verstanden? Wenn icht nochmal deutlich: Entweder du beschäftigst dich selbst mit dem Thema und sprichst uns bei konkreten Problemen an (und ein zusammenkopierter Quelltext ist kein konkretes Problem), oder du machst ein Angebot, was derjenige, der für dich deine Aufgabe löst, als Gegenleistung erhält Zitieren
Nicole_X Geschrieben 19. Januar 2010 Autor Geschrieben 19. Januar 2010 Wenn bei dir gar nichts geht, wenn du nicht irgendwo abschreibst, ist das ziemlich traurig. Du kannst nicht erwarten, dass hier jemand deine Hausaufgaben macht, wenn deine Eigeninitiative gerade mal dazu ausreicht, irgendwelchen Code abzuschreiben. Ja find ich auch traurig, aber danke das dus mir nochmal vor Augen geführt hast! Ich erwarte nicht das mir jemand meine Hausaufgaben macht sondern mir Hilfestellungen gibt.. Aber ich kann hier wohl keine Hilfe erwarten. Trotzdem Danke! Zitieren
Klotzkopp Geschrieben 19. Januar 2010 Geschrieben 19. Januar 2010 Ich erwarte nicht das mir jemand meine Hausaufgaben macht sondern mir Hilfestellungen gibt..Hilfestellung bedeutet, dass du selbst auch einen Teil der Arbeit tust. Davon ist aber bisher nichts zu sehen. Zeig, was du bisher geschrieben hast. Ein Grundgerüst für das Programm wirst du ja haben. Eine Zeichenkette vom Benutzer einzulesen, sollte auch kein Problem sein. Zitieren
Nicole_X Geschrieben 20. Januar 2010 Autor Geschrieben 20. Januar 2010 Hilfestellung bedeutet, dass du selbst auch einen Teil der Arbeit tust. Davon ist aber bisher nichts zu sehen. Zeig, was du bisher geschrieben hast. Ein Grundgerüst für das Programm wirst du ja haben. Eine Zeichenkette vom Benutzer einzulesen, sollte auch kein Problem sein. #include <stdafx.h> #include <iostream.h> #include <stdio.h> #include <string.h> #include <afx.h> CString plus(long BLZNr, long KtNr, char BZahl, char BZahlC); CString ZErgebnis; int main(int argc, char* argv[]) { long BLZNr, KtNr, nuller; CString LKennung; double i,i2; double BZahl,BZahlC; char b,c; LKennung = "DE"; BLZNr = 70090100; KtNr = 1234567890; nuller = 00; cout << LKennung << endl; cout << BLZNr << endl; cout << KtNr << endl; b = (char) LKennung.GetAt(0);//Nimmt den ersten Buchstaben der Länderkennung c = (char) LKennung.GetAt(1);//Nimmt den zweiten Buchstaben der Länderkennung char BuchstabeB = b; // ASCII char BuchstabeC = c; // ASCII i = BuchstabeB; i2 = BuchstabeC; BZahl = i -55; // ASCII-Code - 55 BZahlC = i2 -55; // ASCII-Code - 55 cout << BZahl << endl; cout << BZahlC << endl; CString test = plus(BLZNr, KtNr, BZahl, BZahlC); /* long double testl = atof(test); TRACE(test + "\r\n"); TRACE("%f\r\n", testl); */ return 0; } CString plus(long BLZNr, long KtNr, char BZahl, char BZahlC) { CString s; s.Format("%i%i%i%i00", BLZNr, KtNr, BZahl, BZahlC); cout << s << endl; return s; } Bei dem Auskommentierten komm ich nicht mehr weiter.. Wie formatiere ich das ganze jetzt in eine Zahl um? Das Problem ist, das sie so lang ist.. Irgendwelche Vorschläge!? Zitieren
Klotzkopp Geschrieben 20. Januar 2010 Geschrieben 20. Januar 2010 s.Format("%i%i%i%i00", BLZNr, KtNr, BZahl, BZahlC); Beachte, dass eine Kontonummer mit 10 Stellen zu groß für einen long sein kann, da muss ein 64-Bit-Datentyp her, z.B. unsigned __int64. Das Formatfeld sollte dann %I64u sein. Du musst außerdem darauf achten, dass die Teile deiner Prüfzahl die richtige Länge haben. Gegebenenfalls musst du (z.B. bei der Kontonummer) mit Nullen auffüllen! Du kannst das erreichen, indem direkt hinter dem % für das jeweilige Formatfeld eine Null, gefolgt von der Anzahl der Stellen angibst. Für die Kontonummer also beispielsweise %010I64u. Bei dem Auskommentierten komm ich nicht mehr weiter.. Wie formatiere ich das ganze jetzt in eine Zahl um? Das Problem ist, das sie so lang ist..Richtig, die Zahl ist zu groß, selbst für einen 64-Bit-Integer. Die Fließkommatypen helfen dir auch nicht weiter. Sie können zwar so große Zahlen speichern, sind dann aber in den hinteren Stellen ungenau. Hier können die Rechenregeln für Kongruenzen helfen. Es ändert nichts am Ergebnis, wenn du die Einzelteile deiner Prüfzahl schon vorher modulo 97 nimmst. Damit schrumpft die BLZ auf maximal 2 Stellen. Du kannst dasselbe Verfahren dann nochmal auf die gekürzte BLZ + angehängte Kontonummer anwenden, damit sollte die Gesamtzahl klein genug sein, dass sie in einen 32-Bit-Integer passt. Zitieren
Nicole_X Geschrieben 20. Januar 2010 Autor Geschrieben 20. Januar 2010 (bearbeitet) Es ändert nichts am Ergebnis, wenn du die Einzelteile deiner Prüfzahl schon vorher modulo 97 nimmst. Damit schrumpft die BLZ auf maximal 2 Stellen. Du kannst dasselbe Verfahren dann nochmal auf die gekürzte BLZ + angehängte Kontonummer anwenden, damit sollte die Gesamtzahl klein genug sein, dass sie in einen 32-Bit-Integer passt. Versteh ich nicht ganz.. Ich dividiere die BLZ durch 97, dann die Kontonummer dividiert durch 97, und dann die Länderkennung+00 durch 97?! Und die Ergebnisse dann zusammenzählen?! Da kommt dann aber nicht das richtige raus.. logisch.. Bin nicht so des Mathegenie :floet: Oder kann man das irgendwie so machen wie man schriftlich dividiert? Wie in der 3. Klasse Bearbeitet 20. Januar 2010 von Nicole_X Zitieren
Klotzkopp Geschrieben 20. Januar 2010 Geschrieben 20. Januar 2010 Und die Ergebnisse dann zusammenzählen?!Nein, nicht zusammenzählen. Genauso unter Beachtung der Stellenanzahl hintereinanderpacken wie vorher. Um mal bei deinem Beispiel zu bleiben: 700901001234567890131400 mod 97 = ? 70090100 mod 97 = 34 => 700901001234567890131400 mod 97 = 341234567890131400 mod 97 341234567890131400 ist jetzt schon eine Zahl, die in einen 64-Bit-Integer passt. Du kannst das aber auch noch weiter reduzieren: 341234567890 mod 97 = 19 => 341234567890131400 mod 97 = 19131400 mod 97 19131400 passt locker in einen 32-Bit-Integer. Zitieren
Nicole_X Geschrieben 21. Januar 2010 Autor Geschrieben 21. Januar 2010 Nein, nicht zusammenzählen. Genauso unter Beachtung der Stellenanzahl hintereinanderpacken wie vorher. Um mal bei deinem Beispiel zu bleiben: 700901001234567890131400 mod 97 = ? 70090100 mod 97 = 34 => 700901001234567890131400 mod 97 = 341234567890131400 mod 97 341234567890131400 ist jetzt schon eine Zahl, die in einen 64-Bit-Integer passt. Du kannst das aber auch noch weiter reduzieren: 341234567890 mod 97 = 19 => 341234567890131400 mod 97 = 19131400 mod 97 19131400 passt locker in einen 32-Bit-Integer. hey danke... so könnte ich die rechnung auf jedenfall umsetzen nur wenn da nicht ein problemchen wäre... wie kommst du schon bei der ersten rechnung auf 34? ich komme da auf 35?:confused: kannst du mir das bitte erklären vielleicht so schritt für schritt wäre ganz nett ?danke Zitieren
Klotzkopp Geschrieben 21. Januar 2010 Geschrieben 21. Januar 2010 wie kommst du schon bei der ersten rechnung auf 34? ich komme da auf 35?:confused: Der Windows-Taschenrechner sagt 34. Nachgerechnet: 70090100 / 97 = 722578,35... 722578 * 97 = 70090066 70090100 - 70090066 = 34 Wie kommst du auf 35? Zitieren
Nicole_X Geschrieben 21. Januar 2010 Autor Geschrieben 21. Januar 2010 Wie kommst du auf 35? Oh, okay danke! Hab da was verzockt.. Also könnte ich das so schreiben: cout << BLZNr % 97 << endl; Aber wie bekomm ich jetzt die 34 an die kontonummer angehängt um dann weiterzurechnen?? Zitieren
Klotzkopp Geschrieben 21. Januar 2010 Geschrieben 21. Januar 2010 Aber wie bekomm ich jetzt die 34 an die kontonummer angehängt um dann weiterzurechnen?? Auch hier hilft die Mathematik: 341234567890 = 340000000000 + 1234567890[/code] Du willst die 34 um 10 Stellen nach links verschieben (denn so lang ist die Kontonummer), also musst du sie mit 10 hoch 10 multiplizieren: 34 * (10 hoch 10) = 340000000000 Zitieren
Nicole_X Geschrieben 21. Januar 2010 Autor Geschrieben 21. Januar 2010 Ja das hab ich verstanden. Aber ich meinte wie ich cout << BLZNr % 97 << endl jetzt weiterverwenden kann. Ich kann ja z.B. nicht ModuloBLZ = cout << BLZNr % 97 << endl; cout << ModuloBLZ, KtNr << endl; schreiben.. Zitieren
Klotzkopp Geschrieben 21. Januar 2010 Geschrieben 21. Januar 2010 Was willst du mit cout? Wenn du mit BLZNr % 97 weiterrechnen willst, musst du das Ergebnis einer Variablen zuweisen. Mit cout kannst du es nur ausgeben, das bringt dir nichts BLZNr %= 97; unsigned __int64 BLZundKtNr = BLZNr * 10000000000ull + KtNr;[/code] Zitieren
Nicole_X Geschrieben 21. Januar 2010 Autor Geschrieben 21. Januar 2010 long ModuloBLZ, ModuloKtNr; ModuloBLZ = BLZNr % 97; // BLZNr Modulo 97 cout << ModuloKtNr << endl; CString test2 = BLZKtNr(ModuloBLZ, KtNr); // BLZNr + KtNr CString BLZKtNr(long ModuloBLZ, long KtNr) { CString m; m.Format("%i%i", ModuloBLZ, KtNr); cout << m << endl; return m; } Jetzt wird die Zahl (341234567890) wieder zu lang um es so zu machen: int test3 = atof(test2); TRACE(test2 + "\r\n"); TRACE("%f\r\n", test3); Wie kann ich jetzt weiterrechnen? Zitieren
Klotzkopp Geschrieben 21. Januar 2010 Geschrieben 21. Januar 2010 Ich habe das Gefühl, dass du mindestens die Hälfte von dem, was ich schreibe, ignorierst. Ich hatte vorher schon gesagt, dass ein 32-Bit-long für eine zehnstellige Kontonummer nicht ausreicht. Ich habe dir auch erklärt und danach als Code gezeigt, wie du die verkleinerte BLZ und die Kontonummer zusammenrechnen kannst, jetzt kommst du wieder mit CString::Format. Gut, kann man so machen, dann hätte ich mir die letzten beiden Beiträge auch sparen können. Aber es sollte doch inzwischen bei dir angekommen sein, dass du für solche Zahlen 64-Bit-Datentypen benutzen sollst. Und du kommst wieder mit int(!). Zitieren
peter_lustich_kanns Geschrieben 3. Juli 2013 Geschrieben 3. Juli 2013 Hallo, auch ich muss mich der Prüfung der IBAN in C++ stellen und muss leider mit Bedauern gestehen, dass ich den Mathematischen Aspekt "Kongruenzen" nicht verstanden habe. abstrakt wollen wir nicht mehr als: wenn 700901001234567890131408 mod 97 = 1, dann IBAN OK Woher weiß ich, oder mein Programm, an welcher Stelle meine Zeichenkette abgeschnitten werden muss um die Kongruenz zum kompletten Zeichekette zu finden. Dies kann ich doch nicht einfach anhand der zur Verfügung stehenden Größen des Integer-Bereiches festmachen, sondern muss einen trifftigen Grund haben. Die bisher in dem Threat enthaltenen Berechnungen sind alle in sich stimmig (abgesehen von der 35) doch gleicht mir das ganze mehr der willkür, da ich's einfach nicht verstehe... Über einem Wink mit dem Zaunpfahl wäre ich sehr froh. so long euer peter Zitieren
Klotzkopp Geschrieben 3. Juli 2013 Geschrieben 3. Juli 2013 Woher weiß ich, oder mein Programm, an welcher Stelle meine Zeichenkette abgeschnitten werden muss um die Kongruenz zum kompletten Zeichekette zu finden. Dies kann ich doch nicht einfach anhand der zur Verfügung stehenden Größen des Integer-Bereiches festmachen, sondern muss einen trifftigen Grund haben.Es ist tatsächlich egal, wo du die Zeichenkette abschneidest, das funktioniert immer. Angenommen, wir trennen eine große Zahl x in zwei ganzzahlige "Teile" a und b mit Hilfe einer Zehnerpotenz c, so dass a · c + b = x a' sei a mod m, dann ist a ≡ a' (mod m). Damit ist auch a · c + b ≡ a' · c + b (mod m) Wenn wir also a durch (a mod m) ersetzen, ändert das nichts an der Kongruenz. Das gilt übrigens für jedes c, nicht nur für Zehnerpotenzen. Aber mit Zehnerpotenzen ist natürlich die Verarbeitung als String einfacher, weil man einfach abschneiden kann. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.