【C语言】复数的四则运算与复数运算的头文件

【C语言】复数的四则运算与复数运算的头文件,第1张

目录


一、复数的四则运算


二、复数的头文件#include


三、一些碎碎念


 


一、复数的四则运算

(1)计算方法

  1. 加法:(a+bi)+(c+di)=(a+c)+(c+d)i【实部与实部相加,虚部与虚步相加】

  2. 减法:(a+bi)-(c+di)=(a-c)+(c-d)i【实部与实部相减,虚部与虚步相减】

  3. 乘法:(a+bi)(c+di)=ac+adi+cdi+bdi*i=(ac-bd)+(bc+ad)i【普通的多项式相乘;i^2=-1】

  4. 除法:(a+bi)/(c+di)=(a+bi)(c-di)/((c+di)(c+di))=((ac+bd)+(bc-ad)i)/(c^2+d^2)【分子分母同时乘以分母的共轭复数,然后上边是乘法,下边也是乘法】

(2)例题:本题要求编写程序,计算2个复数的和、差、积、商。


输入格式:

输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。


题目保证C2不为0。


输出格式:

分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。


如果结果的实部或者虚部为0,则不输出。


如果结果为0,则输出0.0。


输入样例1:
 2 3.08 -2.04 5.06
输出样例1:
 (2.0+3.1i) + (-2.0+5.1i) = 8.1i
 (2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
 (2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
 (2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i
输入样例2:
 1 1 -1 -1.01
输出样例2:
 (1.0+1.0i) + (-1.0-1.0i) = 0.0
 (1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
 (1.0+1.0i) * (-1.0-1.0i) = -2.0i
 (1.0+1.0i) / (-1.0-1.0i) = -1.0
 #include
 float a, b, c, d; 
 ​
 void sign(char op);
 void operation(float e,float f,char op);  
 int main(void)
 {
     scanf("%f%f%f%f", &a, &b, &c, &d);
     operation(a+c, b+d, '+');
     operation(a-c, b-d, '-');
     operation(a*c - b*d, a*d + b*c, '*');
     operation((a*c + b*d) / (c*c + d*d), (b*c - a*d) / (c*c + d*d), '/');
     return 0;
 }
  
 void sign(char op)
 {
     printf("(%.1f", a);
     if(b>=0)
         printf("+"); 
     printf("%.1fi) %c (%.1f", b, op, c);
     if(d>=0)
         printf("+");        
     printf("%.1fi) = ", d);
 }
  
 void operation(float e,float f,char op)
 {
     sign(op);
     if((int)(e*10))
         printf("%.1f", e);
     if((int)(f*10))
     {
         if ((f > 0) && (int)(e*10))
             printf("+");
         printf("%.1fi", f);
     }
     else if (!(int)(e*10))
         printf("0.0");
     printf("\n");
 }

 


二、复数的头文件#include

(1)C语言中有三个类型可以存储复数

float_Complex:实部和虚部都为float类型

double_Complex:实部和虚部都为double类型

long double_Complex:实部和虚部都为long类型

例如:double_Complex x;

注:C99对复数的支持,用这种定义方法不需要任何头文件。


(2)加入头文件#include ,就可以用complex代替_Complex,这个头文件把虚部定义为'I',所以定义定义这样一个复数可以这样float complex z=a+bI;

(3)宏

宏名称
complex_Complex
_Complex_I虚数单位,类型为const float_Complex
I_Complex_I

这里的I代替Complex_I可以类比bool(#include 中的)和Bool一样

复数的赋值方法如:doubel complex dc=2.0+3.5*I;

 

(4)几个函数

1.double real_part=creal(z);//得到Z的实部

2.double imag_part=cimag(z)//得到Z的虚部

在处理float和long double类型时,用crealf()和creall(),cimagf()和cimagl()。


【理解:以double complex为基准】

3.延展:允许复数有乘除绝对值 *** 作,但是必须有CX_LIMITED_RANGE的编译提示

 

 

 

 

 

 

4.复数函数拓展

 

 

 

 

复数有关函数分类:三角函数、双曲函数、指数函数和对数函数、幂函数和 *** 作函数。


*** 作函数就比如这样的

 

(2)例题:求一元二次方程的根

特别注意:一元二次方程的虚根求解办法:把负数变成正数,但是需要在他后边加上一个i

 

所以,实部=-b/(2a),虚部=sqrt(-dert)/(2a)。


描述

从键盘输入a, b, c的值,编程计算并输出一元二次方程ax2 + bx + c = 0的根,当a = 0时,输出“Not quadratic equation”,当a ≠ 0时,根据△ = b2 - 4ac的三种情况计算并输出方程的根。


输入描述:

多组输入,一行,包含三个浮点数a, b, c,以一个空格分隔,表示一元二次方程ax2 + bx + c = 0的系数。


输出描述:

针对每组输入,输出一行,输出一元二次方程ax2 + bx +c = 0的根的情况。


如果a = 0,输出“Not quadratic equation”;

如果a ≠ 0,分三种情况:

△ = 0,则两个实根相等,输出形式为:x1=x2=...。


△ > 0,则两个实根不等,输出形式为:x1=...;x2=...,其中x1 <= x2。


△ < 0,则有两个虚根,则输出:x1=*实部-虚部i;x2=实部+虚部i**,即x1的虚部系数小于等于x2的虚部系数,实部为0时不可省略。


实部= -b / (2a),虚部= sqrt(-△ ) / (2*a)

所有实数部分要求精确到小数点后2位,数字、符号之间没有空格。


示例1

输入:

 2.0 7.0 1.0

输出:

 x1=-3.35;x2=-0.15
 #include 
 #include 
 double zhengen(double m, double n, double d);//实现一元二次方程求根公式函数+
 double fugen(double m, double n, double d);//实现一元二次方程求根公式函数-
 double shibu(double m, double n);
 double xubu(double m, double d);
 int main()
 {
     double a = 0, b = 0, c = 0,x1=0,x2=0;
     while(scanf("%lf %lf %lf", &a, &b, &c)!=EOF)
     {
         double derta = pow(b, 2) - 4 * a * c;
         if (a != 0)//第一个参数不为0
         {
             if (derta == 0)//①=0
             {
                 if(b==0)//这个直接丢了也可以,只是会多算一点
                     printf("x1=x2=0.00\n");
                 else
                 {
                     x1 = x2 = zhengen(a,b,derta);
                     printf("x1=x2=%.2lf\n", x1);
                 }
 ​
             }
             else if (derta > 0)//②>0
             {//这里是把较大的解赋给正根,较小的解赋给负根
                 x1 =( zhengen(a, b, derta)> fugen(a, b, derta)) ? fugen(a, b, derta) : zhengen(a, b, derta);
                 x2 =(zhengen(a, b, derta) > fugen(a, b, derta)) ? zhengen(a, b, derta) : fugen(a, b, derta);
                 printf("x1=%.2lf;x2=%.2lf\n",x1,x2);
             }
             else if (derta < 0)//③<0——虚根
             {
                 if(xubu(a,derta)<0)//要注意正负号和加减号的区别
                     printf("x1=%.2lf%.2lfi;x2=%.2lf+%.2lfi\n",shibu(a, b),xubu(a, derta), shibu(a, b), -xubu(a, derta));
                 else
                     printf("x1=%.2lf-%.2lfi;x2=%.2lf+%.2lfi\n",shibu(a, b),xubu(a, derta), shibu(a, b), xubu(a, derta));
             }
         }
         else
         {
             printf("Not quadratic equation");//不是二次方程
         }
     }
     return 0;
 }
 double zhengen(double m, double n, double d)//实现一元二次方程求根公式函数+
 {
     double x = 0;
     x = (-n + sqrt(d)) / (2 * m);
     return x;
 }
 double fugen(double m, double n, double d)//实现一元二次方程求根公式函数-
 {
     double x = 0;
     x = (-n - sqrt(d)) / (2 * m);
     return x;
 }
 double shibu(double m, double n)
 {
     double s = 0;
     s = (-n) / (2 * m);
     return s;
 }
 double xubu(double m, double d)
 {
     double xu = 0;
     xu = sqrt(-d) / (2 * m);
     return xu;
 }

 


三、一些碎碎念

这次总结是因为之前做到了一元二次方程的这个编程题,对于虚根就不是特别理解,只不过回头一看,原来题目上说了他们的求法,只是自己没有认真看。


然后今天在课上做实验题时,发现有那个复数的四则运算,自己本身复数运算就学的不是太好,在加上编程,双层buff,我天,当时就一个头,两个大,但是又联想到之前做的那个虚根的问题,就想着这次自己一定要把它给攻破。


不能再像之前一样,总是发现问题,而不去解决问题,只等着别人把东西喂给自己,自己还可能不吃这个知识点。


最后一点点看着自己下滑,别人一点点上升,心有不甘,却又无能为力,四处碰壁。


这次自己主动联想,主动总结有关复数的内容就是一个好的开端。


加油~好了,废话到此结束,再回顾一下这次主要弄了什么

1.复数的算术运算/四则运算【计算规则以及计算机表示——这里采用的是4个operation函数,参数都是两个数和一个运算符,两个参数分别是自己根据负数的运算规则计算出的实部和虚部;然后一个主要打印等式的函数sign(这里需要特别注意里边符号的打印就比如说实部/虚部的正负==>+/-)】

2.一元二次方程【整体分为2种情况a>0与a<0,其中a>0分为3种情况,一种是dert>0,dert<0,dert=0.然后dert<0的情况需要计算实部(-b/2a)和虚部(sqrt(-dert)/2a);这里的计算很多,我们把它给封装成函数会更加方便——zhengen+fugen+shibu+xubu】

3.对头文件#include 有了了解,比如定义3种类型的变量,得到有了一个复数的实部,得到一个复数的虚部。


至于其他的都只是拓展阅读吧,没有实例和应用场景,理解会不到位。


比如说I、complex等是宏定义来的,还有一些复数的函数(一般都是以c开头的,比如csin)一些了解。


 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/634281.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-16
下一篇2022-04-16

发表评论

登录后才能评论

评论列表(0条)

    保存