C程序找到root错误

时间:2015-02-06 06:42:55

标签: c function imperative-programming

我正在使用以下规范在C中编写函数:

float find_root(float a, float b, float c, float p, float q);

find_root取二次方程的系数a,b,c和区间(p,q)。它将在给定的时间间隔内返回此等式的根。

例如:find_root(1, -8, 15, 2, 4)应该生成一个“接近”3.0

的根

我写了下面的代码,我不明白为什么它不起作用:

#include<stdio.h>
#include<math.h>

main()
{
    printf("Hello World");
}

float find_root(float a, float b, float c, float p, float q) {

    float d,root1,root2;  
    d = b * b - 4 * a * c;
    root1 = ( -b + sqrt(d)) / (2* a);
    root2 = ( -b - sqrt(d)) / (2* a);

    if (root1<=q || root1>=p)
    {
        return root1;
    }
    return root2;
}

请让我知道错误是什么。

5 个答案:

答案 0 :(得分:2)

您的计划无效,因为您从未通过find_root()致电main()

find_root()不支持自行运行 。您的程序从main()开始执行。您需要从main()调用子函数才能使它们执行。

更改主号码以拨打find_root(),如下所示。

int main()                              //put proper signature
{

float anser = 0;

answer = find_root(1, -8, 15, 2, 4);   //taken from the question
printf("The anser is %f\n", answer);        //end with a \n, stdout is line buffered

return 0;                                 //return some value, good practice

}

然后,像

一样编译程序
gcc -o output yourfilename.c -lm

除此之外,对于find_root()函数中的逻辑问题,请按照 @paxdiablo 先生建议的方式进行。

答案 1 :(得分:1)

根据定义,您的计划从main开始。

您的main函数未调用find_root,但它应该。

你需要编译所有警告&amp;调试信息(gcc -Wall -Wextra -g)然后使用调试器gdb)逐步运行代码以了解程序的行为,因此使用

进行编译
gcc -Wall -Wextra -g yoursource.c -lm -o yourbinary

clang -Wall -Wextra -g yoursource.c -lm -o yourbinary

然后了解如何使用gdb(例如,在没有调试器的情况下运行gdb ./yourbinary ...及更高版本./yourbinary

然后,您将考虑并改进源代码并重新编译它,并再次进行调试。并重复这个过程,直到你对你的计划感到满意为止。

顺便说一下,您最好使用printf结束\n格式字符串,或了解fflush(3)

不要忘记阅读您正在呼叫的每个功能(如printf(3) ...)的文档。

您可能想要为您的程序提供一些参数(通过main(int argc, char**argv) ...)。您可以使用atof(3)将其转换为double

另请阅读undefined behavior,您应该始终避免这种情况。

顺便说一句,您可以使用任何标准C编译器(以及emacsgedit等编辑器)来完成作业,例如:在Linux笔记本电脑上使用gccclang(然后使用gdb ...)。您不需要特定的seashell

答案 2 :(得分:1)

对于该数据,您的两个根是53。使用p == 2q == 4

if (root1<=q || root1>=p)

变为:

if (5<=4 || 5>=2)

这是真的,所以你得到5

您想要的if条件是:

if ((p <= root1) && (root1 <= q))

如以下程序所示,产生正确的3

#include<stdio.h>
#include<math.h>

float find_root (float a, float b, float c, float p, float q) {
    float d,root1,root2;

    d = b * b - 4 * a * c;
    root1 = ( -b + sqrt(d)) / (2* a);
    root2 = ( -b - sqrt(d)) / (2* a);

    if ((p <= root1) && (root1 <= q))
        return root1;

    return root2;
}

int main (void) {
    printf ("%f\n", find_root(1, -8, 15, 2, 4));
    return 0;
}

计算根源时的逻辑错误。

请记住,代码中存在其他问题。

您需要确保实际调用函数本身,而main目前却没有。

不会p/q范围内产生一个值,相反,如果它在这些范围内,它会给你第一个根,否则它会给出你是第二根,无论其价值如何。

您可能希望了解d为负数的情况,因为您不想采用它的平方根:

a = 1000, b = 0, c = 1000: d <- -4,000,000

最后,如果您的编译器抱怨无法链接sqrt(根据您的一条评论),您可能会发现您可以通过指定数学库来解决这个问题。像:

gcc -o myprog myprog.c -lm

答案 3 :(得分:0)

首先,您需要在sqrt(d)之前检查d的值。

您还应该检查root2是否在间隔内。

而且你还需要一种方法来回归“间隔中没有根”。

答案 4 :(得分:0)

更改此条件

if (root1<=q || root1>=p)

if (root1<=q && root1>=p)

否则,如果满足任何条件,将返回root1,几乎永远不会返回root2。希望这可以解决您的问题。