Почему я продолжаю получать недействительные отзывы? - PullRequest
2 голосов
/ 31 октября 2019

Я работал над кредитом cs50 pset1 в течение последних 36 часов. Мой код не генерирует никаких ошибок, но когда я ввожу данные своей карты, он показывает недействительным, в чем может быть проблема. Я нуб, ребята, пожалуйста, помогите.

#include <stdio.h>
#include <cs50.h>

 int main (void)
{
    long long ccnumber;

     do 
     {
         //Prompting the user for his creditcard number
         ccnumber=get_long_long("What is your creditcard number\n");
     }
     while (ccnumber<= 0);

     //validating the credit card number to ascertain if its upto 13. 14 or 16
    long long numbers = ccnumber;
     int totaldigits = 0; 

     while (numbers > 0)
     {
         numbers = numbers/10;
         totaldigits++;
     }
     if(totaldigits != 13 || totaldigits !=14 || totaldigits !=16)
     {
         printf("Invalid\n");
     }

     //Starting from the second to last digit
     //And multiplying through by 2
     int number1 = ((ccnumber/10) % 10) *2;
     int number2 = ((ccnumber/1000) % 10) *2;
     int number3 = ((ccnumber/100000) % 10) *2;
     int number4 = ((ccnumber/10000000) % 10) *2;
     int number5 = ((ccnumber/1000000000) % 10) *2;
     int number6 = ((ccnumber/100000000000) % 10) *2;
     int number7 = ((ccnumber/10000000000000) % 10) *2;
     int number8 = ((ccnumber/10000000000000000) % 10) *2;

     //Getting the Sum of the first number series
     int sum1;
         sum1 = (number1 + number2 + number3 + number4 + number5 + number6 + number7 + number8);

     //Populating the second number series
     int number9 = ccnumber % 10;
     int number10 = ((ccnumber/100) % 10);
     int number11 = ((ccnumber/10000) % 10);
     int number12 = ((ccnumber/1000000) % 10);
     int number13 = ((ccnumber/100000000) % 10);
     int number14 = ((ccnumber/10000000000) % 10);
     int number15 = ((ccnumber/1000000000000) % 10);
     int number16 = ((ccnumber/100000000000000) % 10);

    int sum2;
        sum2 =(number9 + number10 + number11 + number12 + number13 + number14 + number15 + number16);

     //Adding sum1 and sum2
     int checksum;
         checksum = sum1 + sum2;
     if (checksum % 10 != 0)
     {
         printf("invalid/n");
      }

     //Verifying for visacard(1)
     if(totaldigits == 13)
     {
         printf("Visa\n");
     }

     // Verifying for visa(2)
     if(totaldigits == 16)
     {
         long long visa;
         visa = ccnumber/1000000000000000;
       if(visa!=4)
       {
           printf("Invalid\n");
       } 
         else 
         {
             printf("VISA\n");
         }
         //Verifying for MasterCard
         long long master;
         master = ccnumber/100000000000000;
         if(master!=51 || master!=52 ||master!=53 ||master!=54 ||master!=55)
         {
             printf("Invalid\n");
         }
         else
         {
             printf("MASTER\n");
         }
     }

       //Verifying for Amex
     }

/ counter Ваш номер кредитной карты 2221000000000009 Неверный неверный / nНеверный Неверный

1 Ответ

1 голос
/ 31 октября 2019

Прежде всего, некоторые из ваших if условий неправильные. Например,

if(totaldigits != 13 || totaldigits != 14 || totaldigits != 16)

Вы хотите проверить, равны ли итоговые цифры 13 или 14 или 16, но здесь вы проверяете , если итоговые цифры не равны 13, затем выведите неверные значения или * 1007. * если totaldigits не равно 14, выведите неверное значение и т. д. Следовательно, он всегда будет печатать неверно. Вам нужно использовать && (AND) вместо || (OR).

Та же проблема существует и в этой строке.

if(master!=51 || master!=52 ||master!=53 ||master!=54 ||master!=55)

Другая проблема заключается в том, что вы ставите 1 ненужный 0 для деления вэта строка, поэтому она всегда возвращает 0.

int number8 = ((ccnumber/10000000000000000) % 10) *2; // 1 zero unnecessary

Как предлагается в комментариях, вам может потребоваться создать массив для хранения отдельных цифр вместо использования 16 различных целых чисел. Когда у вас есть массив, вы можете делать деления в цикле for, чтобы не путать множество нулей. Например, вы можете обратиться к этой ссылке Решение проблемы проверки кредитной карты cs50 .

...