为什么我的用户定义函数重复两次?

问题描述 投票:0回答:1

我正在为 CS50 问题集 1 中的信用问题编写一段代码。这段代码已经可以运行,但在一些调试过程中,我注意到我的第一个函数(检查信用卡号是否符合 Luhn 算法)重复了两次。该程序仍然成功地检查了卡号,但我想了解为什么该功能会重复两次。

该函数应该通过使用新值更新总和变量来运行,因为它梳理输入的信用卡号,执行 Luhn 算法中的每个步骤。然后它返回一个 0 或 1 的返回值,由下一个打印卡类型的函数处理,以确定卡号是否符合算法。相反,该函数运行两次,在下一个函数运行之前两次产生相同的总和值。我试过尝试构建函数的格式,以及第一个函数的返回方式,但我无法确定它为什么会重复。

//prompts and checks for valid credit card number
#include <cs50.h>
#include <stdio.h>

int checksum(long num);
void digit_checker(long num);

int main(void)
{
    //prompts for input
    long card_number = get_long("Number: ");
    checksum(card_number);
    digit_checker(card_number);
}

//creates checksum fuction
int checksum(long num)
{
    long digit_div1 = 100, digit_div2 = 10, digit_div3 = 10, digit_div4 = 1, digit_add = 0, num_i = 0, num_j = 0;
    int sum = 0;
    do
    {
        // seperates digits and mutiplies by 2
        num_i = num % digit_div1;
        num_i -= num_i % digit_div2;
        num_i = num_i / digit_div2;
        digit_add = num_i * 2;

        // adds digits of numbers
        if (digit_add > 9)
        {
            long pre_sum = digit_add - digit_add % 10;
            sum += pre_sum / 10;
            sum += digit_add % 10;
        }
        else
        {
            sum += digit_add;
        }

        // reassigns variable values to target next digit
        digit_div1 = digit_div1 * 100;
        digit_div2 = digit_div2 * 100;
    }
    while (digit_div1 / 10 < num);

    do
    {
        // adds other digits
        num_j = num % digit_div3;
        num_j -= num_j % digit_div4;
        num_j = num_j / digit_div4;
        sum += num_j;

        //reassigns variable values
        digit_div3 = digit_div3 * 100;
        digit_div4 = digit_div4 * 100;
    }
    while (digit_div3 / 10 < num);

    //checks and prints if valid
    if (sum % 10 == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void digit_checker(long num)
{
    if (!checksum(num))
    {
        //did not pass sum check
        printf("INVALID\n");
        return;
    }
    int len = 0;
    int first_dig = 0, sec_dig = 0;
    //get first digits and number length
    while (num != 0)
    {
        sec_dig = first_dig;
        first_dig = num % 10;
        num /= 10;
        len++;
    }
    //length & digit checker
    if (len == 13 && first_dig == 4)
    {
        printf("VISA\n");
    }
    else if (len == 16)
    {
        if (first_dig == 4)
        {
            printf("VISA\n");
        }
        else if (first_dig == 5)
        {
            if (sec_dig == 1 || sec_dig == 2 || sec_dig == 3 || sec_dig == 4 || sec_dig == 5)
            {
                printf("MASTERCARD\n");
            }
            else
            {
                printf("INVALID\n");
            }
        }
        else
        {
            printf("INVALID\n");
        }

    }
    else if (len == 15 && first_dig == 3)
    {
        if (sec_dig == 4 || sec_dig == 7)
        {
            printf("AMEX\n");
        }
        else
        {
            printf("INVALID\n");
        }
    }
    else
    {
        //did not pass digit check
        printf("INVALID\n");
    }
    return;
}
c function if-statement cs50 function-call
1个回答
3
投票

函数

digit_checker
调用函数
checksum

void digit_checker(long num)
{
    if (!checksum(num))
    //...

再来一次,:)

checksum(card_number);
digit_checker(card_number);

看来你需要删除这个声明

checksum(card_number);

没有效果。

© www.soinside.com 2019 - 2024. All rights reserved.