C语言 CS50信用问题-不适用10位数以上的卡



我是一个编程新手,在CS50学分问题上遇到了一点麻烦。

它似乎运行得很好,直到第一个case函数-这是它应该计算从倒数第二个数字*2的乘积的地方。它似乎返回预期的结果,直到用户输入达到11位——然后它变得越来越古怪!为什么会这样呢?

secondCase函数似乎也将自己添加到firstCase的结果中(这是您最终希望它做的,但我没有意识到我已经指示了它!)。哪位代码是这样做的?

我得到INVALID(假设是因为上面的原因),所以我注释掉了最终结果,并且刚刚使用printf firstSum和total进行测试。

对不起,我知道这个问题已经在这里发布了很多次,但这已经把我难住了-任何人可以提供的任何建议都会非常感激。谢谢!

#include <cs50.h>
#include <stdio.h>
long getNumber(void);
int cardDigits(long number);
long returnDivisor(int cardLength);
long firstCase(long workingcc);
long secondCase(long workingcc);
int conditions(long total);
int cardType(int checkConditions, long divisor, int firstDigit, int secondDigit);
int main(void)
{
long number = getNumber();
int cardLength = cardDigits(number);
long divisor = returnDivisor(cardLength);
long workingcc = number;
int firstDigit = number / divisor;
int secondDigit = number / (divisor / 10);
long firstSum = firstCase(workingcc);
long total = secondCase(workingcc);
//int checkConditions = conditions(total);
//int cardResult = cardType(checkConditions, divisor, firstDigit, secondDigit);
//if (cardResult == 1){
//  printf("AMEX n");}
//else if (cardResult == 2){
//  printf("MASTERCARD n");}
//else if (cardResult == 3){
//  printf("VISA n");}
//else if (cardResult == 4){
//  printf("INVALID n");}

}

//Get card number from user
long getNumber(void){
long n;
do
{
n = get_long("card number ");
}
while (n <= 0);
return n;
}

//Obtain card length and divisor
int cardDigits(long number){
long n;
n = number;
int count = 0;
while (n > 0)
{
n = n / 10;
count++;
}
return count;
}
//Obtain divisor
long returnDivisor(int cardLength){
long divisor = 10;
for (int j = 0; j < cardLength - 2; j++)
{
divisor = divisor * 10;
}
return divisor;
}

//Obtain sum for first condition
long firstCase(long workingcc){
int sum;
workingcc = workingcc / 10;
while (workingcc !=0)
{
int lastDigit = workingcc % 10;
int timesTwo = lastDigit * 2;
sum = sum + (timesTwo % 10) + (timesTwo / 10);
workingcc = workingcc / 100;
}
return sum;
}

//Obtain sum for second condition
long secondCase(long workingcc){
int sumb;
while (workingcc > 0)
{
int lastDigit2 = workingcc % 10;
sumb = sumb + lastDigit2;
workingcc = workingcc / 100;
}
return sumb;
}
//Check total modulo 10 congruent to 0
int conditions(long total){
if (total % 10 == 0){
return 1;
}
else{
return 0;
}
}
//Check results and print card type
int cardType(int checkConditions, long divisor, int firstDigit, int secondDigit){
if (checkConditions == 1 && divisor == 15 && (secondDigit == 34 || secondDigit == 37)){
return 1;
}
else if (checkConditions == 1 && divisor == 16 && (secondDigit == 51 || secondDigit == 52 || secondDigit == 53 || secondDigit == 54 || secondDigit == 55)){
return 2;
}
else if (checkConditions == 1 && divisor == (13 | 16) && firstDigit == 4){
return 3;
}
else{
return 4;
}
}
  1. 您的第一个包含缺少'#'(我更新了问题)。

  2. firstCase():sum未初始化

  3. secondCase():sumb未初始化

  4. divisor == (13 | 16)表示divisor等于与divisor == 29相同的二进制或。

  5. 你没有对main()中的结果做任何事情,所以它可能被完全优化了。

您可以按如下方式重构这两个函数

long firstCase(long workingcc) {
int sum = 0;
for(workingcc /= 10; workingcc; workingcc /= 100) {
int timesTwo = (workingcc % 10) * 2;
sum += (timesTwo % 10) + (timesTwo / 10);
}
return sum;
}
long secondCase(long workingcc) {
int sumb = 0;
for(; workingcc; workingcc /= 100) {
sumb += workingcc % 10;
}
return sumb;
}

使用美国运通测试信用卡号码378282246310005firstCase()返回27,secondCase()返回33。现在它们都没有展示你所观察到的,但是你需要告诉我们它们应该做什么来验证正确性。

最新更新