【问题标题】:I'm stuck: 'CS50, PSET 1, Credit', only prints 'INVALID' despite various conditionals我被卡住了:\'CS50, PSET 1, Credit\',尽管有各种条件,但只打印 \'INVALID\'
【发布时间】:2022-10-19 13:09:21
【问题描述】:

我编写了这个程序,用于检查用户输入的卡号的有效性;输出卡的类型(如果有效)或“无效”。

尽管大多数功能单独工作,但在运行程序时,我只得到一个输出。

我哪里错了?

我的代码是:

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

long get_number(void);
int calculate_checksum(long number);
int calculate_length(long number);
int calculate_startd(long number);
int calculate_startdv(int startd);

int main(void)
{
    long number = get_number();
    int checksum = calculate_checksum(number);
    int length = calculate_length(number);
    int startd = calculate_startd(number);
    int startdv = calculate_startdv(startd);

    if (checksum == 0 && (length == 13 || length == 16) && startdv == 4)
    {
        printf("VISA\n");
    }
    else if (checksum == 0 && length == 15 && (startd == 34 || startd == 37))
    {
        printf("AMEX\n");
    }
    else if (checksum ==0 && length == 16 && (startd >= 51 && startd <= 55))
    {
        printf("MASTERCARD\n");
    }
    else
    {
        printf("INVALID\n");
    }
}

// get number from user
long get_number(void)
{
    long number;
    do
    {
        number = get_long("Number: ");
    } while (number <= 0);

    return number;
}

// calculate checksum
int calculate_checksum(long number)
{
    int d1;
    int d2;
    int d22;
    int p1 = 0;
    int p2 = 0;
    int total;
    int checksum;

    do
    {
        d1 = number % 10;
        number /= 10;
        p1 += d1;
        d2 = number % 10;
        number/= 10;
        d22 = d2 * 2;
        p2 += d22;
    } while (number > 0);

    total = p1 + p2;
    checksum = total % 10;

    return checksum;
}

// calculating the length of the card number
int calculate_length(long number)
{
    int length = 0;

    do
    {
        number /= 10;
        ++length;
    } while (number > 0);

    return length;
}

// work out/ isolate the starting digits of the number
int calculate_startd(long number)
{
    int startd;

    do
    {
        startd = number % 10;
        number /= 10;
    } while (number > 100);

    return startd;
}

// isolating the first digit for visa cards
int calculate_startdv(int startd)
{
    int startdv;

    do
    {
        startdv = startd % 10;
        startd /= 10;
    } while (startd > 10);

    return startdv;
}

【问题讨论】:

  • 您在“无效”但期望其他内容的地方输入了什么?
  • @mkrieger1 感谢您分享的链接!我正在使用来自贝宝的有效卡号示例;我的程序与它们一起工作(校验和和长度计算器),直到我尝试实际定义卡类型 ahh x
  • 提示:将大整数除以 10 时,商小于 100 时为 2 位。小于 10 时为 1 位...用更少的变量重新编写“开始”函数。 ..
  • @Fe2O3 我不确定我是否理解如何用更少的变量重写它,我认为它们已经每个只需要一个变量输入?对不起,我是初学者!

标签: c function cs50


【解决方案1】:

在 Luhn 的算法中,我们将每隔一个数字乘以 2,然后如果任何乘法都没有产生单个数字,我们将该数字的所有数字相加,然后继续前进。

查看图像中第一步的第四个子步。它说:

现在让我们将这些产品的数字(即,不是产品本身)加在一起

问题出在这个特定的代码块中:

    do
    {
        d1 = number % 10;
        number /= 10;
        p1 += d1;
        d2 = number % 10;
        number/= 10;
        d22 = d2 * 2;
        p2 += d22;
    } while (number > 0);

您可以像这样更正它:

do
{
    p2 += d22 % 10;
    d22 /= 10;
}
while (d2 > 0);

它将自动处理产品是否为一位数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多