0

我正在用 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;
}

请让我知道错误是什么。

4

4 回答 4

2

您的程序不起作用,因为您从未find_root()main().

find_root()不应该单独运行您的程序从 statrs 执行main()。您需要从中调用您的子功能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先生建议的方式进行。

于 2015-02-06T06:50:25.650 回答
1

您的程序从main定义开始。

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

您需要使用所有警告和调试信息 ( 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没有调试器的情况下)

然后你会思考和改进源代码并重新编译它,并再次调试它。并重复该过程,直到您对您的程序感到满意为止。

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

不要忘记阅读您正在调用的每个函数(如printf(3) ...)的文档。

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

另请阅读未定义的行为,您应该始终避免。

顺便说一句,您可以使用任何标准 C 编译器(和类似emacsor的编辑器gedit)来完成作业,例如在您的 Linux 笔记本电脑上使用gccor (然后使用...)。你不需要特定的clanggdbseashell

于 2015-02-06T06:50:47.870 回答
1

对于该数据,您的两个根是53p == 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
于 2015-02-06T06:52:53.667 回答
0

改变这个条件

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

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

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

于 2015-02-06T07:00:11.523 回答