C语言笔记 | 一元三次方程

文章目录

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 问题分析

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

ax^{3}+bx^{2}+cx+d=0(a\neq 0)

        一元三次方程只含有 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; // 计算 x1
    	x2 = -2.0 * sqrt(R) * cos((theta + 2.0 * M_PI) / 3.0) - P; // 计算 x2
    	x3 = -2.0 * sqrt(R) * cos((theta - 2.0 * M_PI) / 3.0) - P; // 计算 x3
    	
    	if (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 总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/12278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

港科夜闻|国务院港澳办主任夏宝龙在香港科大考察期间,表示对学校开展创科工作的鼓励及希望...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、国务院港澳办主任夏宝龙在香港科大考察期间&#xff0c;表示对学校开展创科工作的鼓励及希望。考察期间&#xff0c;夏宝龙主任参观了香港科大的空气动力学和声学实验中心&#xff0c;以及香港科大先进显示与光电子技术国…

4个 Python 库来美化你的 Matplotlib 图表

Matplotlib是一个被广泛使用的Python数据可视化库&#xff0c;相信很多人都使用过。 但是有时候总会觉得&#xff0c;Matplotlib做出来的图表不是很好看、不美观。 今天我就给大家分享四个美化Matplotlib图表的Python库&#xff0c;它们可以轻松让你的Matplotlib图表变得好看…

( “树” 之 DFS) 404. 左叶子之和 ——【Leetcode每日一题】

404. 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 示例 2: 输入: root [1]…

OpenGL入门教程之 深入理解

一、OpenGL简介 OpenGL是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程规范。OpenGL包含一系列可以操作图形和图像的函数&#xff0c;但OpenGL没有实现这些函数&#xff0c;OpenGL仅规定每个函数应该如何执行以及其输出值(类似接口)&#xff0c;所以OpenGL仅是一…

基于JSP的网上购物系统的设计与实现(论文+源码)_kaic

摘 要 近些年来&#xff0c;社会的生产力和科技水平在不断提高&#xff0c;互联网技术也在不断更新升级&#xff0c;网络在人们的日常生活中扮演着一个重要角色&#xff0c;它极大地方便了人们的生活。为了让人们实现不用出门就能逛街购物&#xff0c;网络购物逐渐兴起慢慢变得…

新一代AI带来更大想象空间!上海将打造元宇宙超级场景!

引子 上海市经信委主任吴金城4月12日在“2023上海民生访谈”节目表示&#xff0c;上海将着力建设元宇宙智慧医院、前滩东体元宇宙、张江数字孪生未来之城等元宇宙超级场景。 吴金城说&#xff0c;新一代人工智能将带来更大的想象空间。比如&#xff0c;人工智能和元宇宙数字人的…

ESP32设备驱动-SHT20温湿度传感器驱动

SHT20温湿度传感器驱动 文章目录 SHT20温湿度传感器驱动1、SHT20介绍2、硬件准备3、软件准备4、驱动实现1、SHT20介绍 Sensirion 的 SHT20 湿度和温度传感器已成为外形尺寸和智能方面的行业标准:嵌入在 3 x 3mm 封装和 1.1mm 高度的可回流焊双扁平无引线 (DFN) 封装中,它提供…

项目人力资源管理

相关概念 组织结构图:用图形表示项目汇报关系。最常用的有层次结构图、矩阵图、文本格式的角色描述等3种。 任务分配矩阵(或称责任分配矩阵)(RAM):用来表示需要完成的工作由哪个团队成员负责的矩阵,或需要完成的工作与哪个团队成员有关的矩阵。 一、规划人力资源管理(编…

动力节点Vue笔记——Vue与Ajax

四、Vue与AJAX 4.1 回顾发送AJAX异步请求的方式 发送AJAX异步请求的常见方式包括&#xff1a; 原生方式&#xff0c;使用浏览器内置的JS对象XMLHttpRequest const xhr new XMLHttpRequest()xhr.onreadystatechange function(){}xhr.open()xhr.send() 原生方式&#xff0…

zabbix客户端配置

一、zabbix客户端配置 1.实验环境&#xff1a;关闭防火墙和安全模块 systemctl disable --now firewalld setenforce 0 2.服务端和客户端都要时间同步 yum install -y ntpdate #注意安装需要用网络源安装&#xff0c;不能用本地源 ntpda…

google账号注册流程升级了!2023年谷歌gmail邮箱帐号注册申请教程(完整版)

google账号注册升级了&#xff01; 2023年4月份google账号注册流程升级了&#xff0c;升级之前的版本是完成验证手机号码后才填写用户资料&#xff0c;升级之后的版本是需要先填写用户资料才能注册谷歌gmail邮箱帐号&#xff1b; 2023年谷歌gmail邮箱帐号注册申请教程 1、打开…

电子器件系列34:tvs二极管(2)

一、基本原理&#xff1a; 二、重要产数&#xff1a; 不同的资料对于相同的参数可能有不同的命名&#xff0c;要根据实际情况来确定参数的意义 这里以上图表格里的参数名称进行解析&#xff0c;以其他资料作为参考。 结合图表和伏安特性曲线&#xff0c;再结合下面的图我是…

这才是后端API该有的样子

一般系统大致架构如下&#xff1a; 有些小伙伴会说&#xff0c;这个架构太简单太low了吧&#xff0c;什么网关、缓存、消息中间件都没有。 需要说明的是&#xff0c;因为我们主题是API接口&#xff08;tbAPI&#xff0c;pinduoduo API接口调用&#xff09;所以聚焦这一点上就行…

Linux命令·ping

Linux系统的ping命令是常用的网络命令&#xff0c;它通常用来测试与目标主机的连通性&#xff0c;我们经常会说“ping一下某机器&#xff0c;看是不是开着”、不能打开网页时会说“你先ping网关地址192.168.1.1试试”。它通过发送ICMP ECHO_REQUEST数据包到网络主机&#xff08…

【小程序】django笔记2

templates路径除了在settings中的templates的DIR[]中申明还有什么别的方法&#xff1f; 已知&#xff0c;django底层根据app注册顺序查找各app文件中的templates文件夹&#xff0c;在其中搜索目标模版文件。 已知&#xff0c;app注册在settings中的INSTAll-APPS里。 已知&#…

C++ 缺省参数 函数重载 引用

缺省参数&#xff0c;我们先看一下什么是缺省参数 首先&#xff0c;这个是我们的需要传参的函数&#xff0c;这里我们传入 1 然后就输出 a 下面我们就看一下缺省参数 我们现在看main函数里面调用fun函数&#xff0c;这里会输出多少呢&#xff1f; OK 这里我们分别输出了0 和 1…

【2023】cookie是什么?有什么用?一篇文章彻底搞懂cookie

一个不大不小的问题 假设服务器有一个接口&#xff0c;通过请求这个接口&#xff0c;可以添加一个管理员 但是&#xff0c;不是任何人都有权力做这种操作的 那么服务器如何知道请求接口的人是有权力的呢&#xff1f; 答案是&#xff1a;只有登录过的管理员才能做这种操作 …

SpringCloud之OpenFeign介绍案例+相关面试题

概述 OpenFeign是一个声明式的WEB服务客户端&#xff0c;它使WEB服务客户端变得更加容易。具有可插拔的注解支持&#xff0c;SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka&#xff0c;以及SpringCloud LoadBalance&#xff0c;以便在使用Feign时…

pyest+appium实现APP自动化测试,思路全总结在这里

目录 01、appium环境搭建 2、搭建pythonpytestappium环境 3、安装pycharm搭建项目编写脚本 4、执行测试 绵薄之力 01、appium环境搭建 安装nodejs http://nodejs.cn/ 为什么要安装nodejs&#xff1f; 因为appium这个工具的服务端是由nodejs语言开发的 安装jdk&#xf…

mysql数据库简介

1.什么是数据库&#xff1a;数据仓库。访问必须只能用SQL语句来访问。数据库也是一个文件的系统。 2.数据库的作用&#xff1a;存储数据的作用。开发任何的应用&#xff0c;都有数据库。 3.关系型的数据库&#xff1a;数据库中保存的都是实体与实体之间的关系。 4.常见的数据库…