写点什么

C 语言实现解一元二次方程

作者:codists
  • 2023-07-17
    广东
  • 本文字数:1448 字

    阅读完需:约 5 分钟

《Programming Abstractions In C》今日完成进度:p67-p68,通过解一元二次方程来理解指针的其中一个用途:Pointers facilitate sharing data between different parts of a program。完整代码见:https://github.com/codists/Programming-Abstractions-In-C

/* * File: quadeq.c * -------------- * This program finds roots of the quadratic equation *   * ax^2 + bx + c = 0 *  问题: * 1.如何获取输入的值?*/#include <math.h>#include <stdio.h>#include "genlib.h"#include "simpio.h"
/* * 函数原型(Private function prototype)*/static void GetCoefficients(double *pa, double *pb, double *pc);static void SolveQuadratic(double a, double b, double c, double *px1, double *px2);static void DisplayRoots(double x1, double x2);
/*
*/void GetCoefficients(double *pa, double *pb, double *pc) { printf("Enter coefficients of quadratic equation:\n"); /* *1.一次性全部输入还是逐个输入? 答:逐个输入。 *2.因为a, b, c还要给下一个函数使用,所以传递的是指针(引用传递)。 * */ printf("请输入第1个系数a:\n"); scanf("%lf", pa); printf("请输入第2个系数b:\n"); scanf("%lf", pb); printf("请输入第3个系数c:\n"); scanf("%lf", pc);}
static void SolveQuadratic(double a, double b, double c, double *px1, double *px2) { /* *1.如何解一元二次方程?答:求根公式,x=(-b ± √(b^2-4ac))/2a。 *2.数学运算:(1)求根?sqrt();(2)求幂?pow()。 *3.因为a, b, c没有涉及到修改,所以值传递,而x1, x2, 计算出来还要返回给一个函数使用,所以采用 *应用传递。 *4.特殊情况处理:(1)a==0,此时不是一元二次方程。(2)b^2-4ac<0,此时误解。 *5.特殊情况怎么处理?答:使用Error方法报错。 * */ double disc, sqrtDisc; // disc: discriminant:判别式(即b^2-4*a*c) if (a == 0) { // 书中这里用的是Error,但是编译不通过,提示:undefined reference to `Error',改用prror // Error("a不能等于0"); perror("a不能等于0");
} // 原书使用的是b * b表示 b^2 disc = pow(b, 2) - 4 * a *c; if (disc < 0) { perror("根是复数"); } sqrtDisc = sqrt(disc); *px1 = (-b + sqrtDisc)/ (2 * a); *px2 = (-b - sqrtDisc)/ (2 * a);}
/* *Function: DisplayRoots *Usage: DisplayRoots(x1, x2) * -------------------------- * This function displays the value x1 and x2, which are the roots of a quadratic equation * %g:如果未指定精度,则是6位,参考:https://stackoverflow.com/questions/54162152/what-precisely-does-the-g-printf-specifier-mean*/static void DisplayRoots(double x1, double x2) { // printf("方程的解是x1=%lf, x2=%lf", x1, x2); if (x1 == x2) { printf("There is a double root at %g\n", x1); } else { printf("The root are %g and %g\n", x1, x2); }}
/* * 测试方程1:2x^2-4x+2=0,根为1. * 测试方程2:2x^2+4x-2=0,根为2 * */void main() { double a, b, c, x1, x2;
GetCoefficients(&a, &b, &c); SolveQuadratic(a, b, c, &x1, &x2); DisplayRoots(x1, x2);
}
复制代码


发布于: 刚刚阅读数: 5
用户头像

codists

关注

公众号:编程人 2021-01-14 加入

Life is short, You need Python

评论

发布
暂无评论
C语言实现解一元二次方程_codists_InfoQ写作社区