Luhn-Algorithmus



  • Grüßgott die Damen und Herren,
    befinde mich im 3ten Jahrgang einer HTL, und hatten letzte Woche Programmiertest punkto C++.
    Zu Programmieren war der Luhn-Algorithmus, welche die Validät von Kreditkartennummern prüfen sollte.

    http://de.wikipedia.org/wiki/Luhn-Algorithmus

    1. Nur Ziffern werden berücksichtigt, Sonderzeichen und Leerzeichen werden
    ignort.
    2. Man untersucht die Ziffern beginnend bei der *letzten* Ziffer und
    arbeitet sich nach vorne.
    3. Für jede *zweite* Ziffer wird die Quersumme des doppelten Wertes der
    Ziffer zur Prüfsumme addiert.
    4. Für die übrigen Ziffern wird der einfache Wert der Ziffer zur Prüfsumme
    addiert.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    bool istLuhnOk(char *cp);
    
    int main() {
    	while (true) {
    		// Kreditkartennummern einlesen, beenden bei Leerzeile
    		char eingabe[1000];
    		cout << "Bitte Kreditkartennummer eingeben (Leerzeile zum Beenden):" << endl;
    		cin.getline(eingabe, sizeof(eingabe));
    
    		if (! eingabe[0])
    			break;
    
    		// Kreditkartennummer prüfen
    		bool ok = istLuhnOk(char *cp);
    
    		cout << "Diese Kreditkartennummer ist " << (ok ? "" : "nicht ") << "korrekt." << endl;
    	}
    
    	return 0;
    }
    
    bool istLuhnOk(string& nummer) {
    
    	// TODO Implementiere diese Funktione
    
    	return false;
    }
    

    Und hier meine Abgabe zum Test:

    #include<string.h>
    
    static int verify_checksum(char *credit_card)
    
    {
    char *cp;
    int dbl;
    int check_sum;
    
    check_sum = 0;
    dbl = 0;
    cp = credit_card + strlen(credit_card) -1;
    while (cp >= credit_card)
    
    {
    
    int c;
    
    c = *cp-- -'0';
    
    if (dbl)
    {
    c *= 2;
    if (c >= 10)
    c -= 9;
    
    }
    
    check_sum += c;
    dbl = !dbl;
    
    }
    return ((check_sum % 10) == 0);
    }
    

    Beim compilen sind einige Fehler aufgetreten, aber doch wollte ich fragen ob der Code an sich der Logik und Funktionalität den Anforderungen entspricht oder ob das kompletter nonsense ist.

    Danke im vorhinein!

    PS: Test wurde mit 5 benotet.



  • Der erste Quelltext gehört zur Aufgabenstellung?

    Da sagen meine Testcompiler -> ein oder zwei Fehler.
    Mit welchem Compiler arbeitet ihr?

    Wenn das so ist, hast du mit dem 2.Quelltext, wenn das dein eigener ist, die Lösung verfehlt.

    Oder kannst du deinen Quelltext per copy&paste im Aufgabenquelltext zum Laufen bekommen? Ausserdem, der erste Quelltext deutet in Richtung C++, der zweite dagegen in C!



  • Je nach Anspruch 5 bis 10 Zeilen ändern in beiden Quelltexten dann wäre das brauchbar. Eine sinnvolle und einheitliche Textformatierung erleichtert das Lesen.

    Wenn du versuchen möchtest über deine Note zu diskutieren, dann solltest du dir schnell gute Kenntnisse in C und C++ anzueignen. Auch die Unterschiede zwischen C und C++ solltest du dann drauf haben.

    Denn würde mir so etwas vorgelegt, gehe ich von mindestens 2 Autoren aus und der es abgeschrieben hat, hat nicht viel Plan von dem was er geschrieben hat :p

    P.S. Österreich hat Schulnoten von 1 bis 5, Deutschland von 1 bis 6 in der Regel, und die Schweizer je nach Kanton unterschiedlich. Bei den Schweizern kann 1 die schlechteste Note bedeuten.



  • Luckyprogrammierer schrieb:

    bool istLuhnOk(string& nummer) {
    
    	// TODO Implementiere diese Funktione
    
    	return false;
    }
    

    Und hier meine Abgabe zum Test:

    static int verify_checksum(char *credit_card)
    

    Auch zur konkreten Aufgabenstellung etwas: Oben steht explizit wie die Funktion aussehen soll: bool istLuhnOk(string& nummer) . Unten steht eine Funktion die weder den gleichen Input fordert noch den geforderten Output. Und die Lösung kann noch nicht einmal aus der Funktion istLuhnOk heraus aufgerufen werden ! Probier mal die Funktion dort aufzurufen - viel Spaß.

    // angenommen verify_checksum ist richtig bitte mal so Implementieren dass
    // das funktioniert (OHNE die Funktionsdeklaration zu ändern!)
    
    bool istLuhnOk(string& nummer)
    {
        ...
        ... verify_checksum(...);
        ...
    
        return ....;
    }
    

    Meine Einschätzung wäre die gleiche wie von f.th.: Das hat der irgendwo abgeschrieben und noch nicht mal durchdacht oder auch irgendwie getestet.

    In C++ würde man das mit std::string machen - was die vorgegebene Funktion ja auch schon bereit stellt. Da ist die Implementierung entsprechend anders.



  • tunichtgut schrieb:

    Luckyprogrammierer schrieb:

    bool istLuhnOk(string& nummer) {
    
    	// TODO Implementiere diese Funktione
    
    	return false;
    }
    

    Und hier meine Abgabe zum Test:

    static int verify_checksum(char *credit_card)
    

    Auch zur konkreten Aufgabenstellung etwas: Oben steht explizit wie die Funktion aussehen soll: bool istLuhnOk(string& nummer) . Unten steht eine Funktion die weder den gleichen Input fordert noch den geforderten Output. Und die Lösung kann noch nicht einmal einfach aus der Funktion istLuhnOk heraus aufgerufen werden ! Probier mal die Funktion dort aufzurufen - viel Spaß.

    // angenommen verify_checksum ist richtig bitte mal so Implementieren dass
    // das funktioniert (OHNE die Funktionsdeklaration zu ändern!)
    
    bool istLuhnOk(string& nummer)
    {
        ...
        ... verify_checksum(...);
        ...
    
        return ....;
    }
    

    Meine Einschätzung wäre die gleiche wie von f.th.: Das hat der irgendwo abgeschrieben und noch nicht mal durchdacht oder auch irgendwie getestet.

    In C++ würde man das mit std::string machen - was die vorgegebene Funktion ja auch schon bereit stellt. Da ist die Implementierung entsprechend anders.



  • Na, dann mal der eine Quelltext mit Kommentar:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    bool istLuhnOk(char *cp);   // was soll das, C-Stil in C++ oder C++?
    
    int main() {
        while (true) {
            // Kreditkartennummern einlesen, beenden bei Leerzeile
            char eingabe[1000]; // was soll das, C-Stil in C++ oder C++?
            cout << "Bitte Kreditkartennummer eingeben (Leerzeile zum Beenden):" << endl;
            cin.getline(eingabe, sizeof(eingabe)); // was soll das, C-Stil in C++ oder C++?
    
            if (! eingabe[0]) // was soll das, C-Stil in C++ oder C++?
                break;
    
            // Kreditkartennummer prüfen
            bool ok = istLuhnOk(char *cp);  // siehe was dein Compiler sagt!
    
            cout << "Diese Kreditkartennummer ist " << (ok ? "" : "nicht ") << "korrekt." << endl;
        }
        return 0;
    }
    
    bool istLuhnOk(string& nummer) {    // & ->??
    
        // TODO Implementiere diese Funktione
    
        return false;
    }
    

    sollte ja C++ werden oder?


Anmelden zum Antworten