Нормально ли, что определенное мной условие l oop не действует так, как ожидалось? - PullRequest
0 голосов
/ 12 июля 2020

Я только начал курс CS50, проводимый Гарвардом. В настоящее время я работаю над набором задач 1, который заключается в проверке номера кредитной карты. Почему мое состояние l oop не действует так, как ожидалось? Например, когда я ввожу номер кредитной карты len 16, который не соответствует заданным условиям (например, 59e14), он все равно будет распечатывать «MASTERCARD»?

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

// Declaration of the functions
long get_number(void);
//const char * check_len(long cc);
void check_len(long cc);

// Main program
int main(void)
{
    int i;
    long credit_number = get_number();
    printf("Validation for %ld\n", credit_number);

    check_len(credit_number);
}

// Function that prompt the user for a credit card number
long get_number(void)
{
    // Declaration of the credit card variable
    long number;

    // Ask the user for a credit card number. If it's not none-negative, keep asking
    do
    {
        number = get_long("Enter credit card number: ");
    }
    while (number <=0);
    return number;
}

// Function to check the type of credit card
void check_len(long cc)
{
    // Declaration of variables
    int i;
    long number = cc;

    // Count the len of the provided credit card number
    for (i = 0; cc != 0; i++)
    {
        cc = cc/10;
    }
    printf("%i\n", i);

    // Validate the type of card
    if (i == 15)
    {
        if ( (number >= 34e13 && number < 35e13) || (number >= 37e13 && number < 38e13) )
        printf("AMEX\n");
        else
        {
            printf("INVALID\n");
        }
    }
    else if (i == 13 || i == 16)
    {
        if ( (number >= 51e14  || number < 56e14) )
        {
            printf("MASTERCARD\n");
        }
        else if ( (number >= 4e12 || number < 5e12) || (number >= 4e15 || number <= 5e15))
        {
            printf("VISA\n");
        }
        else
        {
            printf("INVALID\n");
        }
    }
}

1 Ответ

3 голосов
/ 12 июля 2020

Учитывая

 if ( (number >= 51e14  || number < 56e14) )
     ...

51e14 меньше 56e14, поэтому КАЖДЫЙ действительное число больше 51e14 или меньше 56e14.

Если вам нужны только числа из этого диапазона, вам нужно использовать &&, чтобы он удовлетворял обоим условиям:

 if ( ( number >= 51e14 )  && ( number < 56e14 ) )
     ...

Похоже, что в других ваших условиях есть аналогичные проблемы.

...