【问题标题】:Output for every single if-formula, CS50 Problem Set Credit每个 if 公式的输出,CS50 问题集学分
【发布时间】:2019-03-23 09:35:06
【问题描述】:

我目前正在学习 CS50 在线课程,但被困在第二个练习学分上。目标基本上是提供一个信用卡号码(或任何真正的号码)作为输入,并得到一个无效或三大信用卡(Master、Visa 或 AmEx)之一的输出。

我的代码几乎按照我的预期工作,因为我得到了正确的输出,我的问题是它的格式错误。

如果我输入一个非信用卡号码而不是

无效

我的输出如下所示:

无效 无效的 无效的 无效的 无效

如果我将 AmEx 信用卡号作为输入,我的输出如下所示:

无效 美国运通 无效的 无效的 无效

这是我的代码:

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 或其他任何东西)。

我是否缺少一个简单的解决方案并且可以轻松实施,还是我需要重新设计整个事情?

【问题讨论】:

    标签: cs50


    【解决方案1】:

    这是因为程序检查了前面的if 语句并在每个无效情况下打印“无效”,直到它到达要执行的语句。例如,“AMEX”它为签证、万事达卡和您所做的支票打印“无效”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2021-12-20
      • 1970-01-01
      • 2020-02-18
      相关资源
      最近更新 更多