Почему мой кредит PSET1 работает в песочнице, а не в Check50? - PullRequest
0 голосов
/ 22 сентября 2019

У меня возникла проблема с моей кредитной программой PSET1 в песочнице CS50, и я могу определить, является ли карта MasterCard, AMEX или VISA, исходя из ее длины и алгоритма Луна.Однако, когда я отправляю код в Check50, он определяет, что все введенные данные являются недействительными.

Обновление: вместо вывода «INVALID», если число не соответствует алгоритму Луна, я изменил его на «nope» и нашелчто все числа, проверенные check50, приводят к выводу nope, так что я знаю, что ошибка находится где-то в этой части программы.Как и раньше, он все еще работает в песочнице.

Я искал похожие проблемы и решения здесь и в других местах.

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

int main(void)
{
    //Ask user to input number.
    long card_num;
    do
    {
        card_num = get_long("Number: ");   
    }
    //Check if card number is greater than zero.
    while (card_num < 0);

    //Starting with the second to last digit, multiply each digit by 2.
    //Add the products' digits together.
    int digit, prod, sum1, dig1, dig2;
    long holder = card_num;
    while (holder > 0)
    {
        digit = (holder / 10) % 10;
        prod = digit * 2;
        if (prod >= 10)
        {
            dig1 = (prod % 100 - (prod % 10)) / 10;
            dig2 = prod % 10;
            prod = dig1 + dig2;
        }
        sum1 = sum1 + prod;
        holder = holder / 100;
    }

    //Add sum1 to product of the other digits in the card number
    long holder1 = card_num;
    int dig3, sum2;
    while (holder1 > 0)
    {
        dig3 = holder1 % 10;
        sum2 = sum2 + dig3;
        holder1 = holder1 / 100;
    }

    //Check if the sum of the first and second sums has a final digit of 0.
    int last_sum = sum1 + sum2;
    if (last_sum % 10 != 0)
    {
        printf("INVALID\n");
    }
    else
    {
        //Calculate number of digits
    int num_digits = 0;
    long holder3 = card_num;
    while (holder3 != 0)
    {
        holder3 = holder3 / 10;
        num_digits++;
    }

    //Find first two digits of card number
    long holder2 = card_num;
    while (holder2 > 100)
    {
         holder2 = holder2 / 10;
    }
    int firstdig, secdig;
    secdig = holder2 % 10;
    firstdig = holder2 / 10;

    //Check if VISA, Mastercard, or AMEX
    if (firstdig == 4)
    {
        if (num_digits == 13 || num_digits == 16)
        {
            printf ("VISA\n");
        }
    }
    else if (firstdig == 5 && secdig >= 1 && secdig <= 5)
    {
        if (num_digits == 16)
        {
            printf ("MASTERCARD\n");
        }
    }
    else if (firstdig == 3 && (secdig == 4 || secdig == 7))
    {
        if (num_digits == 15)
        {
            printf ("AMEX\n");
        }
    }
    else (printf("INVALID\n"));
    }
}

Ожидаемые результаты: MASTERCARD, VISA, AMEX или INVALID.В Песочнице это работает, но Check50 становится НЕВЕРНЫМ для всех номеров.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Я обнаружил, что проблема в том, что я объявил переменные sum1 и sum2, но не инициализирован их любые значения, чтобы они были назначены любое значение было в памяти.Когда я инициализирован эти тоже 0 программа функционировала без проблем.

0 голосов
/ 22 сентября 2019

Разные системы могут иметь разную реализацию размера 'long'.* 1 001 *

Предложите используя * 1 003 * от stdint.h, потому что

  1. всегда будет иметь тот же размер в различных системах / реализации
  2. значение должно быть без знака, как смещениеЗначения со знаком проблематичны.

при вызове scanf() рекомендуется использовать спецификатор формата: SCNu64

SCNu64 от inttypes.h

пример для scanf()

uint64_t card_num;
scanf( "%" SCNu64, &card_num );

, как проверить номер кредитной карты

Запишите последнюю цифру номера кредитной карты.Это цифра контрольной суммы, которую вы будете использовать для проверки оставшейся части номера кредитной карты.

Перечислите каждую цифру номера кредитной карты, начиная с цифры слева от контрольной суммы и двигаясь влево,Если номер кредитной карты имеет 16 цифр, удвойте количество каждой цифры в нечетных местах, работая справа налево, прежде чем добавлять его в свой список.Для кредитных карт с 15 цифрами вы должны удвоить цифры в четных местах.Если при удвоении цифры получается число больше 10, добавьте две цифры нового номера вместе и запишите этот результат в свой список.Например, если цифра на карте - семь, удвоение приведет к 14. В итоге сумма из двух цифр будет равна пяти.

Итого ваш список чисел.Не включайте контрольную сумму в вашу сумму.Если общая сумма может быть равномерно разделена на 10, у кредитной карты есть действительный номер.В противном случае вам не следует обрабатывать транзакцию по кредитной карте.


Как определить поставщика кредитной карты

Определите компанию, выпустившую кредитную карту, посмотрев напервый номерКарты, начинающиеся с «3», - American Express.Те, которые начинаются с «4» - это кредитные и дебетовые карты Visa, те, которые начинаются с «5» - это кредитные и дебетовые карты MasterCard, а те, которые начинаются с «6» - это кредитные карты Discover.Плата за обслуживание, взимаемая с продавцов, варьируется в зависимости от компании-карты.

Подсчитайте цифры в номере кредитной карты.Большинство кредитных карт должны содержать 15 или 16 цифр.Кредитные карты American Express содержат 15. Три другие крупные кредитные компании - Visa, Mastercard и Discover - имеют 16-значную последовательность на своих картах.

...