Hilfe C-Programm, kreditkarte



  • Huhu,

    in diesem Code sollen einige Fehler drinne sein, komme aber grad nit wirklich weiter ... nen paar hatte ich schon rausgeholt aber naja.... seht ihr noch welche? Vielen Dank schonmal!

    #include <stdio.h>
    #include <string.h>
    
    /* Die Kreditkarten-Prüfsumme basiert auf dem Luhn-Algorithmus.  Alle Ziffern
       werden von rechts beginnend addiert; die Ziffern mit den geraden Indizes 
       (beginnend bei 1 für die letzte Ziffer) werden verdoppelt. Falls die 
       Verdopplung 9 überschreitet, wird 9 von der Ziffer abgezogen.
    
       Die Kartennummer ist gültig, wenn die Summe ein Vielfaches von 10 ergibt.
    
       Testdaten 
       (http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm):
       Australian BankCard 5610591081018250
       Visa 4111111111111111
       Visa 4012888888881881
    */
    
    void validate(int *digits)
    {
        int i;
        int sum;
        int is_valid;
        for (i = 0; i < 16; i++)
        {
            int digit = digits[i] - '0';
            if (i%2 = 0) 
            {
                /* Ungerade Position: addieren */
                sum += digit;
            }
            else
            {
                /* Gerade Position: Verdoppeln, evtl. 9 abziehen, addieren */
                digit *= 2;
                if (digit >= 9)
                    digit -= 9;
                sum += digit;
            }
        }
        is_valid = (sum % 10) == 0
    }
    
    int main(int argc, char *argv[])
    {
        if (argc != 2)
        {
            printf("Usage: csum <card number>\n");
            return 1;
        }
        if (strlen(argv[1]) != 16)
        {
            printf("Only 16-digit card numbers are supported\n");
            return 1;
        }
        if (!validate(argv[1])
        {
            printf("Checksum error\n");
            return 2;
        }
        retrun(0);
    }
    

  • Mod

    Kannst du ein bisschen genauer werden, was für Fehler wir suchen sollen? Wir sind keine Hellseher. Auf den ersten Blick sehe ich sogar Rechtschreibfehler in Schlüsselwörtern sowie einen operator-! auf einen void-Wert angewandt, der Code kann so niemals übersetzt werden. Hast du den etwa für das Forum abgetippt? Bitte unbedingt Copy & Paste benutzen, sonst finden wir bloß deine Tippfehler, nicht die eigentlichen Fehler.
    http://www.c-plusplus.net/forum/200753
    http://www.c-plusplus.net/forum/304133
    http://www.c-plusplus.net/forum/136013



  • Ich hab den Code kurz überflogen und da sind mir folgende Punkte aufgefallen (vielleicht hats noch mehr drin, habe nicht allzu genau hingeschaut):

    In

    if (i%2 = 0)
    

    hats einen Fehler drin.

    Wenn i % 2 gleich 0 ist, ist i dann gerade oder ungerade? 😉

    validate(..) hat keinen return type. Die Variable is_valid ist nicht sichtbar in main. Gib der Funtkion validate(..) einen bool Rückgabetyp.

    Das return statement sieht etwas vermurkst aus 😉



  • Huhu,

    danke schon mal! Und es ist eigentlich eine Übung zur Fehlersuche, da waren noch deutlich mehr drinne vorher 😞 Es sollte btw
    if (i%2 == 0) sein! den hatte ich eben noch gefunden.



  • Huhu,

    hab noch einige Fehlende Klammern bzw zuviele gefunden und dann mal den kompilier benutzt.
    Dabei kam nurnoch eine Fehlermeldung:
    csum.c:55:5: Fehler: falsche Benutzung eines Voids-Ausdruckes
    Der code sieht nu wie folgt aus:

    #include <stdio.h>
    #include <string.h>
    
    /* Die Kreditkarten-Pr��fsumme basiert auf dem Luhn-Algorithmus.  Alle Ziffern
      werden von rechts beginnend addiert; die Ziffern mit den geraden Indizes
      (beginnend bei 1 f��r die letzte Ziffer) werden verdoppelt. Falls die
      Verdopplung 9 ��berschreitet, wird 9 von der Ziffer abgezogen.
    
      Die Kartennummer ist g��ltig, wenn die Summe ein Vielfaches von 10 ergibt.
    
      Testdaten
      (http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm):
      Australian BankCard 5610591081018250
      Visa 4111111111111111
      Visa 4012888888881881
    */
    
    void validate(char *digits)
    {
       int i;
       int sum;
       int is_valid;
       for (i = 0; i < 16; i++)
       {
           int digit = digits[i] - '0';
           if (i%2 == 0)
           {
               /* Ungerade Position: addieren */
               sum += digit;
           }
           else
           {
               /* Gerade Position: Verdoppeln, evtl. 9 abziehen, addieren */
               digit *= 2;
               if (digit >= 9)
                   digit -= 9;
               sum += digit;
           }
       }
       is_valid = (sum % 10) == 0;
    }
    
    int main(int argc, char *argv[])
    {
       if (argc != 2)
       {
           printf("Usage: csum <card number>\n");
           return 1;
       }
       if (strlen(argv[1]) != 16)
       {
           printf("Only 16-digit card numbers are supported\n");
           return 1;
       }
       if (!validate(argv[1]))
       {
           printf("Checksum error\n");
           return 2;
       }
       return(0);
    }
    


  • icarus2 schrieb:

    validate(..) hat keinen return type. Die Variable is_valid ist nicht sichtbar in main. Gib der Funtkion validate(..) einen bool Rückgabetyp.

    int geht auch.



  • Habe jetzt das void in ein int geändert und am ende der validate funktion einfach ein:
    return is_valid;
    drinne, dürfte das somit nu richtig sein?



  • Hört sich richtig an.

    Was sagt der Compiler und der Testlauf?



  • der compiler ging durch, aber das programm funktioerniert nicht wirklich 😕 Die Testdaten gehen ganze zeit als falsch, also checksum error durch ...



  • Dann gib die Daten mal testweise verkehrt herum ein.

    Ich glaube da ist ein Fehler in der Berechnung gerade/ungerade.
    Der Code fängt ganz links an (Index 0, Stelle 16) -> Also sollte es gerade sein -> verdoppeln.
    Im Code steht aber nur einfach.



  • Auch andersrum klappt des nicht 😕



  • sum ist auch nicht initialisiert:

    int sum = 0;
    

    Sonst mal Kontrollausgaben einbauen (in jedem Schleifendurchlauf i, digit und sum ausgeben) oder Debugger nehmen.



  • wie ein vorposter schon sagte ist die berechnung falschrum

    if (i%2 == 0)
           {
               /* Ungerade Position: addieren */
               sum += digit;
           }
    

    x modulo 2 ist eben dann null wenn x eine gerade zahl ist

    außerdem ist auch hier ein fehler:

    if (digit >= 9)
    

    es muss >9 heißen oder >=10



  • Danke an alle 🙂 Funktioniert nu! 🙂


Anmelden zum Antworten