浮点异常CS50可读性分配

时间:2020-04-24 16:03:30

标签: c cs50

我遇到了一些有关浮点异常错误的问题,因为以前我分别打印变量时无法确定出了什么问题。下面是我到目前为止编写的代码。我不确定是什么原因引起的错误,因为我很确定我没有被零除。

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

int main(void)
{
    //promt user for text 
    string n = get_string("Text: ");
    int sumletters = 0; 
    int sumdots = 0;
    int sumspaces = 1;

    for (int i = 0; i < strlen (n); i++ )
    {
        if (n[i] >= 'A' && n[i] <= 'z')
        {
           sumletters = sumletters + 1; 
        }

        if (n[i] == ' ')
        {
            sumspaces = sumspaces + 1;
        }

        if (n[i] == '.' || n[i] == '?' || n[i] == '!' )
        {
            sumdots = sumdots + 1;   
        }

        float L = sumletters / (sumspaces / 100); 
        float S = sumdots / (sumspaces / 100); 
        int index = round ((0.0588 * L) - (0.296 * S) - 15.8); 

        if (index < 1)
        {
            printf ("Before grade 1\n");
        }
        {
            printf ("Grade 16+\n");
        }
        else 
        {
            printf ("Grade %i", index);
        }
    }
printf ("\n");
}

2 个答案:

答案 0 :(得分:0)

这是有问题的部分

sumletters / (sumspaces / 100)

sumspaces / 100使用整数除法,因此几乎总是0。您可以通过简单地分配除法来重构代码以使用浮点除法:

sumletters / sumspaces * 100

答案 1 :(得分:0)

以下是整数除法,商通常为零,因为int数学将舍弃小数。

int sumspaces;
...
sumspaces / 100

以下内容可能导致int除以0。

int sumletters;
...
//           v---------------v might be 0 
sumletters / (sumspaces / 100); 

浮点异常错误...我很确定我没有被零除。

由于常见错误处理程序的各种原因,int除以零可能会被报告为浮点异常。


与许多操作一样,结果类型不在操作中,而仅在赋值中,这种问题很常见。

相反,请确保数学使用目标类型。

//                        v---------------v int division                       
// float L = sumletters / (sumspaces / 100); 

float L = sumletters / (sumspaces / 100.0f); 
//                     ^------------------^ At least float division                       

此外:没有充分的理由在这里使用float类型,只需使用double
请注意,代码在以下情况下使用double数学,而不是float数学:

//         v----v         v---v        v--v  double constants
   round ((0.0588 * L) - (0.296 * S) - 15.8)
// ^---^                                     double function