C程序求根错误
C program to find roots error
我正在用 C 编写一个具有以下规范的函数:
float find_root(float a, float b, float c, float p, float q);
find_root
取二次方程的系数a,b,c和区间(p,q)。它将 return 这个等式在给定区间内的根。
例如:find_root(1, -8, 15, 2, 4)
应该产生根 "close to" 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;
}
请告诉我错误是什么。
您的程序无法运行,因为您从未从 main()
中调用 find_root()
。
find_root()
不应该 运行 完全独立 。您的程序从 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.
先生的建议进行。
根据定义,您的程序从 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 编译器(以及像 emacs
或 gedit
这样的编辑器)来完成作业,例如在 Linux 笔记本电脑上使用 gcc
或 clang
(然后使用 gdb
...)。您不需要特定的 seashell
对于该数据,您的两个根是 5
和 3
。 p == 2
和 q == 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
最后,如果您的编译器抱怨无法 link sqrt
(根据您的评论之一),您可能会发现可以通过指定数学库,例如:
gcc -o myprog myprog.c -lm
更改此条件
if (root1<=q || root1>=p)
至
if (root1<=q && root1>=p)
否则只要有一个条件满足,root1会被退回,root2几乎不会被退回。希望这能解决您的问题。
我正在用 C 编写一个具有以下规范的函数:
float find_root(float a, float b, float c, float p, float q);
find_root
取二次方程的系数a,b,c和区间(p,q)。它将 return 这个等式在给定区间内的根。
例如:find_root(1, -8, 15, 2, 4)
应该产生根 "close to" 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;
}
请告诉我错误是什么。
您的程序无法运行,因为您从未从 main()
中调用 find_root()
。
find_root()
不应该 运行 完全独立 。您的程序从 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.
根据定义,您的程序从 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 编译器(以及像 emacs
或 gedit
这样的编辑器)来完成作业,例如在 Linux 笔记本电脑上使用 gcc
或 clang
(然后使用 gdb
...)。您不需要特定的 seashell
对于该数据,您的两个根是 5
和 3
。 p == 2
和 q == 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
最后,如果您的编译器抱怨无法 link sqrt
(根据您的评论之一),您可能会发现可以通过指定数学库,例如:
gcc -o myprog myprog.c -lm
更改此条件
if (root1<=q || root1>=p)
至
if (root1<=q && root1>=p)
否则只要有一个条件满足,root1会被退回,root2几乎不会被退回。希望这能解决您的问题。