У меня возникает проблема, когда моя кредитная программа 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 получает НЕДЕЙСТВИТЕЛЬНЫЙ для всех номеров.
else if (firstdig == 3 && (secdig == 4 || secdig == 7)) { if (num_digits == 15) { printf ("AMEX\n"); } }
в качестве примера: если введен первый if (), а второй if () завершился неудачно, то ничего не выводится. Однако должна выводиться некоторая индикация ошибки. - person user3629249   schedule 22.09.2019get_long()
на что-то вроде:scanf( "%lu", &card_num );
, потому что файл заголовка:cs50.h
не переносится и / или доступен не везде - person user3629249   schedule 22.09.2019