简体   繁体   English

C语言中分数简化程序的浮点异常

[英]Floating-point exception from fraction simplification program in C

When I run the following code, I always get a floating-point exception. 当我运行以下代码时,我总是会得到一个浮点异常。 How can I fix it? 我该如何解决?

    #include <stdio.h>

    //Global Variables

    int num, denom, num1, denom1;

    void simplify(int *numerator, int *denominator);

    int main () {

    //Prompt User as to what program is
    printf("Fraction Simplifier\n");
    printf("===================\n");

    //Ask User for Numerator and Denominator
    printf("Numerator: ");
    scanf("%d", &num);
    printf("Denominator: ");
    scanf("%d", &denom);

    //Call Function
    simplify(&num1, &denom1);

    //Display final output
    printf("%d / %d = %d / %d", num, denom, num1, denom1);

    return 0;
    }

    //Simplify function
    void simplify(int *numerator, int *denominator)
    {

    num = num1;
    denom = denom1;

    num1 = num1 / num1;
    denom1 = denom1 / num1;
    num1 = *numerator;
    denom1 = *denominator;

    }

It looks as if num1 is never initialized. 似乎num1从未被初始化。 It will be zero, which will result in a division by zero. 它将为零,这将导致被零除。

Your simplify function is flawed. 您的simplify功能存在缺陷。 Here's what it means when you are calling simplify : 这就是调用simplify时的含义:

call simplify, passing the address of num1 and denom1 调用simple,传递num1和denom1的地址

And here's what your code inside of simplify means: 这就是您的简化代码的含义:

num = num1;          /* Assign the value of num1 to num, meaning set num to 0. */
denom = denom1;      /* Assign the value of denom1 to denom, meaning set denom to 0. */
num1 = num1 / num1;  /* Divide num1 (which is 0) by num1 (which is 0). Error! */

You can simplify your program and make it easier to understand by eliminating your global variables. 您可以通过消除全局变量来简化程序并使之更易于理解。 This will also help you to correct your errors. 这也将帮助您纠正错误。 Here's a rewrite: 这是一个重写:

#include <stdio.h>

void simplify(int numerator, int denominator, int* newNumerator, int* newDenominator);

int main () {

    int num, denom, num1, denom1;

    /* Do your input code */

    //Call Function
    simplify(num, denom, &num1, &denom1);

    //Display final output
    printf("%d / %d = %d / %d", num, denom, num1, denom1);

    return 0;
}

//Simplify function
void simplify(int numerator, int denominator, int* newNumerator, int* newDenominator)
{
    int simplifiedNumerator;
    int simplifiedDenominator;

    /* Calculate your results.. left out your original code, which calculates incorrectly */
    /* You will refer to the ints numerator and denominator */

    /* Assign your results */
    *newNumerator = simplifiedNumerator;
    *newDenominator = simplifiedDenominator;
}

Notice that simplify now has four parameters. 注意, simplify现在有四个参数。 The first two are the values you want to use in the calculation (we don't need pointers), and the pointers are only used to assign the results to the addresses passed in. 前两个是您要在计算中使用的值(我们不需要指针),并且指针仅用于将结果分配给传入的地址。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM