C中方程的根
我对C语言比较陌生,正在努力提高自己。我做了一个计算器,加上了二次方程求解器,因为我知道求根的公式。但我面临两个问题 代码:C中方程的根,c,calculator,quadratic,C,Calculator,Quadratic,我对C语言比较陌生,正在努力提高自己。我做了一个计算器,加上了二次方程求解器,因为我知道求根的公式。但我面临两个问题 代码: #包括 #包括 #包括 #包括 main(){ 浮点数A1、A2、A、B、C、ans、Z; printf(“欢迎使用二次方程求解器。输入系数X^2,后跟系数X,后跟整数值。\n\n输入值:”; scanf(“%f%f%f”、&A、&B和&C); CheckF=(B*B-4*A*C); 如果(检查f=0){ Z=功率(检查f,1/2); A1=(-B+Z)/(A+A); A
#包括
#包括
#包括
#包括
main(){
浮点数A1、A2、A、B、C、ans、Z;
printf(“欢迎使用二次方程求解器。输入系数X^2,后跟系数X,后跟整数值。\n\n输入值:”;
scanf(“%f%f%f”、&A、&B和&C);
CheckF=(B*B-4*A*C);
如果(检查f<0){
系统(“彩色B4”);
printf(“此计算器十六进制,目前无法处理复数。\n请原谅我的开发人员。我现在将您重定向到主菜单。\n”);
系统(“暂停”);
系统(“cls”);
系统(“颜色F1”);
转到开始;
}否则如果(检查f>=0){
Z=功率(检查f,1/2);
A1=(-B+Z)/(A+A);
A2=(-B-Z)/(A+A);
如果(A1==A2){
ans=A1;
printf(“\n方程的根是%f(重复根)\n”,ans);
睡眠(250);
}如果(A1!=A2),则为else{
printf(“方程的根是%f和%f\n”,A1,A2);
睡眠(250);
}
}
}
问题1:
当我运行代码并输入3 32 2
时,数学上的输出应该是方程的根是-0.06287和-10.6038
,我用我的夏普计算器仔细检查了这两个方程。然而,我得到的输出是关闭的:方程的根是-5.166667和-5.500000
我完全不确定为什么它不能计算方程的正确根
问题2:
有些根没有系数X^2,例如(2X+2),可以通过求解得到-2的重复根(6X-3),从而得出X是0.5的重复根。然而,根据二次方程,它被2A除,将永远不起作用,因为它被0除。摆脱这种局面的可能途径是什么?是否要检查A=0,然后执行其他操作?任何帮助都将是可观的。整数除法
pow(CheckF,1/2)
是1.0,因为1/2是商为0的整数除法
// Z = pow(CheckF, 1/2);
Z = pow(CheckF, 1.0/2.0);
// or better
Z = sqrt(CheckF);
// Even better when working with `float`.
// Use `float sqrtf(float)` instead of `double sqrt(double)`.
Z = sqrtf(CheckF);
最佳-使用double
而不是float
重新写入。在这里使用float
的理由很少double
是C goto浮点类型
其他问题
//#include <maths.h>
#include <math.h>
// main() {
int main(void) {
// CheckF = (B * B - 4 * A * C);
float CheckF = (B * B - 4 * A * C);
// goto Start;
/#包括
#包括
//main(){
内部主(空){
//CheckF=(B*B-4*A*C);
浮点数f=(B*B-4*A*C);
//转到开始;
使用自动格式化程序我发现代码存在一些问题。首先,我建议您使用double而不是float。它们提供更好的精度,理想的计算器需要精度。其次,您需要:
Z = pow(CheckF, 1/2);
您应该使用sqrt(CheckF),因为C中有一个专门的平方根函数!下面的代码对我很有用,所以如果您解决了上述两个问题,您的代码可能会工作
int main() {
double A1, A2, A, B, C, ans, Z;
printf("Welcome to Quadratic Equation solver. Enter the coefficient of X^2, followed by\nthe coefficient of X, followed by the integer value.\n\nEnter values: ");
A = 3;
B = 32;
C = 2;
double CheckF = (B * B - 4 * A * C);
if (CheckF >= 0) {
Z = sqrt(CheckF);
A1 = (-B + Z) / (A + A);
A2 = (-B - Z) / (A + A);
if (A1 == A2) {
ans = A1;
printf("\nRoot of equation is %f (Repeated root)\n", ans);
} else if (A1 != A2) {
printf("Roots of equation are %f and %f \n", A1, A2);
}
}
}
对于问题2,任何没有x^2项的方程都不是二次方程。它只是一条直线,很容易解。@Christophermore那么,我们应该添加一个if条件来检查a!=0吗?如果是0,那么ans=-C/B,否则如果不是==0,继续二次方程吧?不,它不是二次方程。你不能用它解线性方程。林ear方程只有两个项,一个项有一个变量。用简单的代数应该很容易解。@ChristopherMoore哦,好的,我会试试。但是第一个问题呢?或者你需要完整的代码来运行它吗?创建一个最小的可重复的例子。你当前的例子看起来基本上很好。只要确定定义了你的我们不知道的示例。
powf()
和sqrtf()
更好,因为OP使用浮点数而不是双精度。@Shawn对浮点数
类型提出了很好的建议。@chux:有没有办法处理负数的根?对于可能出现的虚数根。上面,我刚说这个计算器不能处理虚数,但有没有办法?我看到了一些方法正在生成printf(“%fi”,ans);但仍然不能work@UnfreeHeXcomplex双d=csqrt(检查F)
是一种直接的方法。@chux.Oh。我想我的编译器没有附带的复杂的.h
头文件。我查找了它的源代码,但它包括其他文件,如bits/math.def
和类似的文件,我也找不到。不用担心。我会把它作为错误保留。谢谢。祝你玩得开心好的,先生。
int main() {
double A1, A2, A, B, C, ans, Z;
printf("Welcome to Quadratic Equation solver. Enter the coefficient of X^2, followed by\nthe coefficient of X, followed by the integer value.\n\nEnter values: ");
A = 3;
B = 32;
C = 2;
double CheckF = (B * B - 4 * A * C);
if (CheckF >= 0) {
Z = sqrt(CheckF);
A1 = (-B + Z) / (A + A);
A2 = (-B - Z) / (A + A);
if (A1 == A2) {
ans = A1;
printf("\nRoot of equation is %f (Repeated root)\n", ans);
} else if (A1 != A2) {
printf("Roots of equation are %f and %f \n", A1, A2);
}
}
}