Выходные данные для каждой формулы if, CS50 Task Set Credit - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время я прохожу онлайн-курс CS50 и застрял на втором упражненииЦель состоит в том, чтобы в качестве входных данных указать номер кредитной карты (или любой другой номер) и получить выходные данные как недействительные или как одну из трех основных кредитных карт (Master, Visa или AmEx).

Мой код работаетпочти так, как я хотел, в том, что я получаю правильный вывод, моя проблема в том, что он в неправильном формате.

Если я введу номер не кредитной карты вместо

INVALID

мой вывод выглядит следующим образом:

INVALID INVALID INVALID INVALID INVALID

если я даю номер кредитной карты AmEx в качестве ввода, мой вывод выглядит следующим образом:

INVALIDAmEx INVALID INVALID INVALID

Это мой код:

int main(void)

{
long long CreditCardNo;

do
{
    CreditCardNo = get_long_long("Enter credit card number:");
}
while (CreditCardNo <= 0);


int countDigits = 0;
long long count = CreditCardNo;


//run loop until number is no longer an integer

while (count != 0)
    {
        //Incremental counter

        countDigits++;

        //Divide input number by 10 to reduce one digit from integer

        count = count / 10;
    }

//return "Invalid" for all numbers with any amount of digits other than 13, 15 & 16

if (countDigits != 13 && countDigits != 15 && countDigits != 16)
    {
        printf("INVALID\n");
    }



//Take 2nd to last digit, and then the every other digit, and multiply by 2 to get the first part for the checksum
int digit1  =   (((CreditCardNo / 10) % 10) * 2);
int digit2  =   (((CreditCardNo / 1000) % 10) * 2);
int digit3  =   (((CreditCardNo / 100000) % 10) * 2);
int digit4  =   (((CreditCardNo / 10000000) % 10) * 2);
int digit5  =   (((CreditCardNo / 1000000000) % 10) * 2);
int digit6  =   (((CreditCardNo / 100000000000) % 10) * 2);
int digit7  =   (((CreditCardNo / 10000000000000) % 10) * 2);
int digit8  =   (((CreditCardNo / 1000000000000000) % 10) * 2);

//Take last digit and then every other to get the second part for the checksum
int digit9  =   (CreditCardNo % 10);
int digit10 =   ((CreditCardNo % 1000) / 100);
int digit11 =   ((CreditCardNo % 100000) / 10000);
int digit12 =   ((CreditCardNo % 10000000) / 1000000);
int digit13 =   ((CreditCardNo % 1000000000) / 100000000);
int digit14 =   ((CreditCardNo % 100000000000) / 10000000000);
int digit15 =   ((CreditCardNo % 10000000000000) / 1000000000000);
int digit16 =   ((CreditCardNo % 1000000000000000) / 100000000000000);

//Add all digits for first checksum
int check1  =   digit1 + digit2 + digit3 + digit4 + digit5 + digit6 + digit7 + digit8;

//Add all digits for second checksum
int check2 = digit9 + digit10 + digit11 + digit12 + digit13 + digit14 + digit15 + digit16;

//Add checksums

int check3 = check1 + check2;

//If checksum doesn't end in 0 return invalid


if (check3 % 10 != 0)
    {
        printf("INVALID\n");
    }



//Validation for AmEx

int CheckAmex = CreditCardNo / 10000000000000;

if (CheckAmex != 34 && CheckAmex != 37)
    {
        printf("INVALID\n");
    }
else
    {
        printf("AMEX\n");
    }



//Validation for MasterCard

int CheckMasterCard = CreditCardNo / 100000000000000;

if (CheckMasterCard != 51 && CheckMasterCard != 52 && CheckMasterCard != 53 && CheckMasterCard != 54 && CheckMasterCard != 55)
    {
        printf("INVALID\n");
    }
else
    {
        printf("AMEX\n");
    }


//Validation for Visa

int CheckVisa1 = CreditCardNo / 1000000000000;

if (CheckVisa1 != 4)
    {
         printf("INVALID\n");
    }
else
    {
        printf("Visa\n");
    }


int CheckVisa2 = CreditCardNo / 1000000000000000;

    if (CheckVisa1 != 4)
    {
         printf("INVALID\n");
    }
else
    {
        printf("Visa\n");
    }
}

Я пытался переупаковать самую первую формулу if в else и наложить остальные на эту первую, но я не могупохоже, он работает, так как я получаю новые ошибки по типу «необъявленного идентификатора« CheckMasterCard »(или Visa, или вообще чего-то еще).

Есть ли простое решение, которое я пропускаю иМожно осуществить легко, или мне нужно переделать все это?

1 Ответ

0 голосов
/ 01 февраля 2019

Это потому, что программа проверяет предыдущие операторы if и печатает «недопустимый» в каждом недействительном случае, пока не достигнет оператора для выполнения.Например, «AMEX» печатает «недействительно» для визы, мастер-карты и чека, который вы сделали.

...