文章目录

0x00 前言

0x01 问题分析

0x02 代码设计

0x03 完整代码

0x04 运行效果

0x05 参考文献

0x06 总结


0x00 前言

在 1545 年,意大利学者卡丹所写的《关于代数的大法》中,提出了一元三次方程的求根公式。人们将其称为卡丹公式。对于标准型的一元三次方程 ax+bx+cx+d=0 (其中 a、b、c、d 属于实数且 a 不等于 0),可以通过变量代换将其转化为 x³+px+q=0 的形式,从而求出其根。

0x01 问题分析

一元三次方程的一般形式:

一元三次方程只含有 1 个未知数,并且未知数的最高次数为 3 次的整式方程。其中,abc为常数, 为未知数,且 a≠0 。方程的公式解法为卡尔丹公式法。

0x02 代码设计

#include <stdio.h>
#include <math.h>

        代码解析:先使用 #include 引入需要使用到的头文件,例如 C 框架中的标准输入输出库 <stdio.h> 以及需要使用 <math.h> 数学库计算一元三次方程的解。

        double a = 0.0, b = 0.0, c = 0.0, d = 0.0, x1, x2, x3, P, Q, R, cos_value, theta;printf("请输入四个系数:");

        代码解析:定义 double 双精度类型的变量 a 、 b 、 c 和 d ,以及一元三次方程的三个实根设为 x1 、 x2 、 x3 。定义 P 、 Q 、 R 以及 cos_value 和 theta 这几个变量方便后续使用卡丹公式。使用 printf(); 函数提示用户输入四个系数。

        while (scanf("%lf %lf %lf %lf", &a, &b, &c, &d) != 4 || a == 0.0) {printf("错误:请输入四个数值,且 a 不等于 0 !\n"); while (getchar() != '\n') continue;} 

代码解析:使用 while 循环语句判断用户输入的数值是否是四个数,并且判断 a 是否等于 0 。如果用户输入的数值不是四个数或者 a 为零,那么则进入循环。如果进入循环中,那么会提示 “错误:请输入四个数值,且 a 不等于 0 !” 并且执行 while 循环语句清空缓冲区,直到遇到换行符执行 continue 语句跳出当前循环。

     if (getchar() != '\n') {while (getchar() != '\n') continue;printf("警告:您输入了多余的字符,已被清除!\n");continue; }

        代码解析:使用 if 语句判断如果输入缓冲区中还有字符(不包括换行符号),那么执行 if 语句中的内容。其中, while 循环和上文中的代码一样是清空缓冲区,直到遇到换行符执行 continue 语句跳出当前循环。

        P = b / (3.0 * a);Q = (pow(P, 3) - (b * c / (3.0 * a)) + d / a) / 2.0;R = (c / a) - pow(P, 2);cos_value = Q / sqrt(pow(Q, 2) + pow(R, 3));theta = acos(cos_value);x1 = -2.0 * sqrt(R) * cos(theta / 3.0) - P;x2 = -2.0 * sqrt(R) * cos((theta + 2.0 * M_PI) / 3.0) - P;x3 = -2.0 * sqrt(R) * cos((theta - 2.0 * M_PI) / 3.0) - P;

        代码解析:其中, P 代表一元三次方程中 x 的一次幂系数的一半, Q 和 R 分别代表一元三次方程中 x 的零次幂系数和二次幂系数的函数, cos_value 代表计算出来的角度余弦值, theta 代表角度值, x1 、 x2 、 x3 分别代表一元三次方程的三个根。

     if (Q == 0 && R == 0){x1 = -b / (3.0 * a);printf("方程有三个相等的实根:x1 = x2 = x3 = %.2lf\n", x1);return 0;}

代码解析:判断如果 Q 和 R 都为零,说明三个根相等,那么可以用公式 -b / (3.0 * a) 计算方程相等的实根。并输出方程有三个相等的实根,保留两位小数。如果正常执行就返回 0 。

     printf("方程的解为:x1 = %.2lf, x2 = %.2lf, x3 = %.2lf\n", x1, x2, x3);return 0;

代码解析:输出 x1 , x2 , x3 的计算结果,并保留两位小数。

double U_cubic_E()
{   while(1){double a = 0.0, b = 0.0, c = 0.0, d = 0.0, x1, x2, x3, P, Q, R, cos_value, theta;printf("请输入四个系数:");while (scanf("%lf %lf %lf %lf", &a, &b, &c, &d) != 4 || a == 0.0) {if (getchar() != '\n') {P = ...Q = ...R = ...cos_value = ...theta = ...x1 = ...x2 = ...x3 = ...if (Q == 0 && R == 0){printf("方程的解为:x1 = %.2lf, x2 = %.2lf, x3 = %.2lf\n", x1, x2, x3);return 0;}
}

        代码解析:为计算一元三次方程的代码添加 while 死循环,确保用户输入错误能重新执行程序获得用户输入并执行。并设置一个 double 类型的函数将循环代码封装到函数中,如果函数执行完毕,那么会返回 0 表示程序正常执行。

int main()
{U_cubic_E();return 0;
}

        代码解析:主函数,调用 U_cubic_E(); 函数用来求解一元三次方程,返回值为 0 时,表示程序执行完毕。

0x03 完整代码

#include <stdio.h>
#include <math.h>double U_cubic_E() //一元三次方程
{   while(1){double a = 0.0, b = 0.0, c = 0.0, d = 0.0, x1, x2, x3, P, Q, R, cos_value, theta;    printf("请输入四个系数:");while (scanf("%lf %lf %lf %lf", &a, &b, &c, &d) != 4 || a == 0.0) // 如果输入不是四个数或者a为0,则进入循环 {printf("错误:请输入四个数值,且 a 不等于 0 !\n"); // 提示用户输入错误 while (getchar() != '\n') // 清空输入缓冲区,直到遇到换行符continue;} if (getchar() != '\n') // 判断如果输入缓冲区中还有字符(不包括换行符){while (getchar() != '\n') // 清空输入缓冲区,直到遇到换行符continue;printf("警告:您输入了多余的字符,已被清除!\n");continue; // 提示用户输入多余字符,并清除,使用 continue 跳出循环}P = b / (3.0 * a); // 计算 P 的值Q = (pow(P, 3) - (b * c / (3.0 * a)) + d / a) / 2.0; // 计算 Q 的值R = (c / a) - pow(P, 2); // 计算 R 的值cos_value = Q / sqrt(pow(Q, 2) + pow(R, 3)); // 计算角度的余弦值theta = acos(cos_value); // 计算角度值x1 = -2.0 * sqrt(R) * cos(theta / 3.0) - P; // 计算 x1x2 = -2.0 * sqrt(R) * cos((theta + 2.0 * M_PI) / 3.0) - P; // 计算 x2x3 = -2.0 * sqrt(R) * cos((theta - 2.0 * M_PI) / 3.0) - P; // 计算 x3if (Q == 0 && R == 0) // 如果 Q 和 R 都为零,说明三个根相等{x1 = -b / (3.0 * a); // 计算三个根的解printf("方程有三个相等的实根:x1 = x2 = x3 = %.2lf\n", x1);return 0;}printf("方程的解为:x1 = %.2lf, x2 = %.2lf, x3 = %.2lf\n", x1, x2, x3);return 0;}
}int main()
{U_cubic_E(); // 调用一元三次方程函数return 0;
}

0x04 运行效果

请输入四个系数:a b c d
错误:请输入四个数值,且 a 不等于 0 !
0 1 2 3
错误:请输入四个数值,且 a 不等于 0 !
1 2 3 4 5
警告:您输入了多余的字符,已被清除!
请输入四个系数:20 23 4 12
方程的解为:x1 = -0.62, x2 = 0.08, x3 = -0.61--------------------------------
Process exited after 15.24 seconds with return value 0
请按任意键继续. . .

0x05 参考文献

[1].百度百科. 一元三次方程[EB/OL]. [2023-04-12]. https://baike.baidu.com/item/%E4%B8%80%E5%85%83%E4%B8%89%E6%AC%A1%E6%96%B9%E7%A8%8B?fromModule=lemma_search-box.

[2].百度百科. 一元三次方程求根公式[EB/OL]. [2023-04-12]. https://baike.baidu.com/item/%E4%B8%80%E5%85%83%E4%B8%89%E6%AC%A1%E6%96%B9%E7%A8%8B%E6%B1%82%E6%A0%B9%E5%85%AC%E5%BC%8F/10721952.

0x06 总结

文章内容为学习记录的笔记,由于作者水平有限,文中若有错误与不足欢迎留言,便于及时更正。

C语言笔记 | 一元三次方程相关推荐

  1. c语言求解一元三次方程(二分法和公式法)

    一.二分法 1.二分法概念:二分法,又称分半法,是一种方程式根的近似值求法.对于区间[m,n]上连续不断且f(m)*f(n)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为 ...

  2. C语言笔记 | 一元二次方程

    文章目录 0x00 前言 0x01 问题分析 0x02 代码设计 0x03 完整代码 0x04 运行效果 0x05 参考文献 0x06 总结 0x00 前言 一元二次方程指的是,通过化简后,只含有一个 ...

  3. C语言笔记 | 一元一次方程

    文章目录 0x00 前言 0x01 问题分析 0x02 代码设计 0x03 完整代码 0x04 运行效果 0x05 参考文献 0x06 总结 0x00 前言 一元一次方程指只含有一个未知数.未知数的最 ...

  4. 基于C语言使用卡尔丹公式法求解一元三次方程

    求根公式的推导 这里直接引用网络上的一般公式 ,如下图. 在C语言中的实现 #include<stdio.h> #include<math.h> #include<com ...

  5. C语言 一元三次方程 二分法 切线法

    想起了自己之前刚学习C语言的时候总喜欢做一些有意思的事,最让自己满意的就是解一元三次方程.这其中也有别的原因的,高中时候也研究过一元三次方程,但是当时绞尽脑汁也没有想出求解的办法,只是找出了三个根之间 ...

  6. C语言——二分法求一元三次方程的方程根

    C语言--二分法求一元三次方程的方程根 #include <stdio.h>#include <math.h>int main() {double m, n;double i ...

  7. 一元三次方程高精度实数根(C语言)

    文章目录 一.问题描述 二.CCC代码 三.参考文献/资料 一.问题描述   已知一元三次方程ax3+bx2+cx+d=0(a≠0)ax^3 + bx^2 + cx+d = 0(a\neq0)ax3+ ...

  8. 弦截法c语言程序,用弦截法求解一元三次方程的根(利用c语言实现)

    用弦截法求解一元三次方程的根(利用c语言实现)0 特别v2013.09.24浏览296次分享举报 #include #include float f(x) { float a,b,c,d; float ...

  9. 某叶C语言学习上重大的一步——一元三次方程求解

    目前某叶编的最难的程序了......感觉算是跨越吧,之前最难的是一元二次方程求解,虽然是最"难"的,只是因为最长,但是写起来还是很轻松的 不过一元三次方程可一点都不轻松,很累,因为 ...

最新文章

  1. 关于如何使用机器学习来做异常检测的7个问题
  2. 网页测试本地服务器_音视频开发搭建一个直播服务器
  3. union-find算法分析(2)
  4. python模拟鼠标拖动滑块_如何通过拖动滑块来控制Kivy滚动视图?
  5. [CF903G]Yet Another Maxflow Problem
  6. 《.NET 性能优化》送书活动结果公布
  7. 一如此前的回应,王劲将景驰科技总部搬到了广州
  8. 后悔药来了?发出去的微信图文消息删除后不再显示
  9. HAWQ取代传统数仓实践(一)——为什么选择HAWQ
  10. java 四级联动_使用js实现四级联动
  11. 中兴新支点操作系统_中兴新支点操作系统的设计和功能怎样?
  12. 简述 mybatis 事务的使用
  13. 机顶盒利旧改造,实现安卓和Linux双系统启动
  14. React项目中提示caniuse-lite已过时,建议更新
  15. Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
  16. spark性能优化(二)数据倾斜问题
  17. 蓝色大气的交替导航菜单
  18. Github Pages + Hugo 搭建个人博客
  19. 记录一下nginx代理引起的ip失真问题
  20. Android的DrawText详解

热门文章

  1. 中国科学院大学计算机学科评估,中国科学院大学学科评估结果排名
  2. 博格丁机器人_【江苏建协工程咨询有限公司扬州分公司】-看准网
  3. Greenplum 的备份与恢复
  4. Qt编写安防楼宇对讲管理平台源码
  5. CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-癫痫发作预测(六)
  6. 软件需求说明书(GB856T——88)基于协同的在线表格forture-sheet
  7. 个人桌面版linux,Linux 个人桌面版压根普及不了,就目前的情况来看……
  8. 苹果电脑win10蓝牙音响卡顿_解决Macbook Pro下Win10双系统蓝牙鼠标无法连接及卡顿...
  9. python中find是什么意思啊_python中str的find()
  10. Oracle数据库期末考试范围题