【问题标题】:C program to find roots errorC程序找根错误
【发布时间】:2015-02-06 06:42:55
【问题描述】:

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

请告诉我错误是什么。

【问题讨论】:

  • 您应该使用所有警告和调试信息 (gcc -Wall -Wextra -g) 进行编译,然后使用调试器 (gdb) 逐步运行您的代码。
  • 请定义doesn't work。你有main() 吗?为什么不给我们看?你链接到-lm了吗?为什么不告诉我们?
  • @BasileStarynkevitch 嗨,我试过了,但无法修复错误。我想确认是我需要更改的调试器设置还是代码本身有什么问题
  • 使用调试器是了解程序实际工作方式的好方法。当然,它不会神奇地纠正你的程序。你需要思考。如果您的程序的行为不是您想要的,则意味着您的程序中存在错误。您必须进行调查,然后改进您的源代码。
  • 实际上问题是这个问题是前一段时间作为家庭作业给出的,在课程中我们将使用一个名为 seashell 的特定调试器-编译器集。因此,我无法真正更改或查看内容。

标签: c function imperative-programming


【解决方案1】:

您的程序无法运行,因为您从未从您的main() 中调用过find_root()

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先生建议的方式进行。

【讨论】:

  • 我不认为拥有 main 函数是一个问题,因为默认情况下我使用的编译器-调试器会添加一个 main 函数和一个调用,因此如果我添加一个 main 函数它会抛出“重复功能”错误。
  • 我面临的确切错误是:编译失败...有关详细信息,请参阅 Public.compile.err /tmp/roots-KXflke.o: In function find_root': /u/cs136t/49627.dir/roots.c:18: undefined reference to sqrt' /u/cs136t/ 49627.dir/roots.c:19:未定义对“sqrt”clang 的引用:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
  • @L887: Sourav Ghosh 写道:更改你的main,不要添加第二个!
  • @L887 看,当您不清楚自己的问题时,这就是问题所在。
  • @L887 编译时,需要链接数学库。查看我的更新答案..
【解决方案2】:

对于该数据,您的两个根是 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(根据您的 cmets 之一),您可能会发现您可以通过指定数学库来解决该问题,例如:

gcc -o myprog myprog.c -lm

【讨论】:

    【解决方案3】:

    根据定义,您的程序从 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

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

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

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

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

    另请阅读 undefined behavior,您应该始终避免使用它。

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

    【讨论】:

      【解决方案4】:

      改变这个条件

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

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

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

      【讨论】:

      • 这是一个非常尴尬的错误感谢指出它
      猜你喜欢
      • 2021-07-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2014-02-25
      相关资源
      最近更新 更多