Zum Inhalt springen

C++ IBAN berechnung, benötige Hilfe


Empfohlene Beiträge

Geschrieben

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!!

Geschrieben
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?
Geschrieben
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.

Geschrieben

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.

Geschrieben

#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:d und ich komm einfach nicht mehr klar aber so ähnlich sollte es ablaufen

Geschrieben
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?

Geschrieben
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.

Geschrieben
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

Geschrieben
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!

Geschrieben
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.

Geschrieben
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!?

Geschrieben
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.

Geschrieben (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 :D

Bearbeitet von Nicole_X
Geschrieben
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.

Geschrieben
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 :D ?danke

Geschrieben
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?

Geschrieben

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??

Geschrieben
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

Geschrieben

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..

Geschrieben

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]

Geschrieben

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?:)

Geschrieben

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(!).

  • 3 Jahre später...
Geschrieben

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

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...