CS50信用分配-浮点异常

时间:2020-06-05 10:20:54

标签: c cs50

有什么想法为什么会生成浮点异常?请忽略错误的编码。这是非常粗糙的,我只是尝试在此作业上尝试不同的事情。另外,我尝试仅使用在课堂上学到的操作来完成这项作业(我很惊讶还有其他一些方法可以使这更容易)

谢谢!

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

int main(void)
{   long c = get_long("What is your credit card number?\n");
    long i = 10;
    long j = 100;
    long n = 0;
    long m = 0;
    long x = 2;
    do
    {   long a = (c % i - (c % i)/10)/(i/10);
        n = a + n;
        i = i*100;
    }
    while (c/i >= 0.1 || c/i == 0);
    do
    {   long b = (c%j - (c%j)/10)/(j/10);
        m = b + m;
        j = j*100;
    }
    while (c/j >= 0.1 || c/j == 0);

    long sum = n + 2*m;

    if (i > j)
    {   
        x = i;
    }

    else
    {   
        x = j;
    }

    if (sum % 10 == 0)
    {   if((x == 10000000000000000) && ((c % (x/100) - c % (x/1000))/(x/100000) == (34)))
        {
            printf("Amercan Express\n");
        }
        else if((x  == 100000000000000000) && ((c % (x/100) - c % (x/1000))/(x/100000) == (51)))
        {
            printf("MasterCard\n");
        }
        else if((x == 10000000000000) && ((c % (x/100) - c % (x/1000))/(x/100000) == 4))
        {
            printf("Visa\n");
        }
        else if((x == 10000000000000000) && ((c % (x/100) - c % (x/1000))/(x/100000) == 4))
        {
            printf("Visa\n");
        }
        else
        {
            printf("Invlid\n");
        }
    }

    else
    {
        printf("Invlid\n");
    }   
}'''

2 个答案:

答案 0 :(得分:0)

您尝试做N % 0

这是0除。

答案 1 :(得分:0)

这是问题所在的部分:

while(c / i> = 0.1 || c / i == 0);

在您的第一个while循环中。

您的数据类型很长,所以您说只要c / i大于0.1或== 0,然后继续。不幸的是,这将永远持续下去,因为long不能始终保持小数位,所以它总是> = 0.1或<=0。如果使用debug50 ./filename来调试debug50,则可以放置一个红点并逐步执行。您将看到,第一次做while循环将继续运行,从而增加每个周期的i值。最终,i的值长时间大于内存限制,因此代码会产生意外的结果。如果逐步执行,您会发现它最终为i分配了0,因此您将遭受除以0的错误。

您可以通过更改数据类型或更改while循环来解决此问题。

我希望能有所帮助。 ID建议在CS50 IDE中使用debug50逐步执行while循环,以查看发生了什么。