c复数加减乘除的实现
使用函数计算两个复数之积c语言

标题:使用C语言计算两个复数之积的函数一、概述复数是数学中的一个重要概念,它包括实部和虚部。
在实际工程项目中,我们经常需要进行复数运算,特别是计算两个复数的乘积。
本文将介绍如何使用C语言编写函数来计算两个复数的乘积。
二、复数的表示1. 复数的表示形式复数可以用a+bi的形式表示,其中a为实部,b为虚部,i为虚数单位。
2. C语言中的复数表示在C语言中,通常使用结构体来表示复数。
一个典型的复数结构体可以定义如下:```ctypedef struct {double real; // 实部double imag; // 虚部} Complex;```三、计算两个复数的乘积计算两个复数的乘积可以分为两个步骤:实部相乘减去虚部相乘得到新的实部,实部相乘再加上虚部相乘得到新的虚部。
具体的计算过程如下:```cComplex multiply(Complex c1, Complex c2) {Complex result;result.real = c1.real * c2.real - c1.imag * c2.imag; // 新的实部 result.imag = c1.real * c2.imag + c1.imag * c2.real; // 新的虚部return result;}```四、示例下面我们通过一个示例来演示如何使用上面定义的multiply函数来计算两个复数的乘积。
```c#include <stdio.h>int m本人n() {Complex c1 = {3.0, 4.0}; // 3+4iComplex c2 = {5.0, 6.0}; // 5+6iComplex result = multiply(c1, c2);printf("The product of f+fi and f+fi is f+fi\n", c1.real, c1.imag, c2.real, c2.imag, result.real, result.imag);return 0;}```五、总结本文介绍了如何使用C语言编写函数来计算两个复数的乘积。
简单实现C++复数计算器

简单实现C++复数计算器本⽂实例为⼤家分享了简单实现C++复数计算器的具体代码,供⼤家参考,具体内容如下1.有关计算器的功能A,实现多个复数(包括实数)的加减乘除,⼤⼩⽐较,B.实现⼗进制实数的进制转换,可以转换任意进制2.有关设计的原理A.复数计算的部分,采⽤运算符的重载,进⾏复数的加减乘除以及⼤⼩⽐较对于输⼊输出,(>>和<<),加减乘除运算进⾏重载。
输⼊的重载,实现a+bi形式的复数的输⼊。
输出的重载,实现实数的输出(实现特殊的只输出实部虚部之类的)。
加减乘除的重载,实现有关复数的运算。
B.进制转换的部分,采⽤进制转换的⽅法,实现10进制的任意进制转换。
辗转相除,记录每次的余数,存储在数组中来记录转换得到的数字3.有关设计的特点A.采⽤函数对所实现功能进⾏封装。
B.采⽤运算符的重载,使复数运算更加⽅便C.考虑所有的输⼊输出情况,对选择的操作,输⼊复数的类型等进⾏判断与相应的处理D.程序在完成以后,接受⼤家建议,规范代码格式,⾃⼰在制作过程有所收获也有所学习。
下⾯是有关代码的实现:#include <iostream>#include <algorithm>#include <cmath>#include <cstdlib>#include <cstring>#include <fstream>#include <ctime>#define EPS 1e-5 //定义精度常数using namespace std; //使⽤标准空间命名stdnamespace NameCCom //定义命名空间NameCCom{class CCom //定义⼀个CCom类{public:double Real,Image;//实部和虚部CCom(double real=0,double image=0) //构造函数{Real=real;Image=image;}friend istream & operator>>(istream &is,CCom &com); //重载输⼊friend ostream & operator<<(ostream &os,CCom &com); //重载输出CCom operator+(CCom &com); //加法重载CCom operator-(CCom &com); //减法重载CCom operator*(CCom &com); //乘法重载CCom operator/(CCom &com); //除法重载CCom operator+=(CCom &com); //加法赋值重载CCom operator-=(CCom &com); //减法赋值重载CCom operator*=(CCom &com); //乘法赋值重载CCom operator/=(CCom &com); //除法赋值重载};struct User //定义⽤户结构体类型{char szName[20]; //⽤户名}user; //定义全局变量int CCom::operator>(CCom &com) //重载运算符">",⽐较模的⼤⼩{if(mod()>com.mod())return 1; //若⼤,则返回1elsereturn 0; //否则,则返回0}int CCom::operator<(CCom &com) //重载运算符"<",⽐较模的⼤⼩{if(mod()<com.mod())return 1; //若⼩,则返回1elsereturn 0; //否则,则返回0}int CCom::operator!=(CCom &com) //重载运算符"!=",分别判断复数的实部和虚部{if(*this==com)return 0; //若相等,则返回0elsereturn 1; //否则,则返回1}istream & operator>>(istream &is,CCom &com) //重载输⼊,可以输⼊a+bi的形式{cout<<"请输⼊复数:";char s[80];is>>s; //⽤字符串的形式接受复数int len=strlen(s); //求出字符串的长度int n=0,sign=1; //n为当前从字符串中提取出来的数字,初始化为0;sign是标记符号,初始化为正 com.Image=com.Real=0;for(int k=0;k<len;k++) //判断接受的字符串是否合法{if((s[k]<'0' || s[k]> '9') && (s[k]!='+' && s[k]!='-' && s[k]!='i')){cout<<"error"<<endl;return is; //错误,输出出错信息并返回}}for(int k=0;k<len;) //顺序识别字符串中各字符{if(n!=0 &&(s[k]=='-'||s[k]=='+')) //当前字符是否是符号位{com.Real=sign*n; //sign是符号位,且n!=0,即n已被赋值,表明当前读取的是虚部的符号n=0; //将原n*sign值赋给实部,将n清零,准备接受虚部的值}if(s[k]=='-') //当前字符为负号{sign=-1;k++; //给符号标志赋值}if(s[k]=='+') //当前字符为正号{sign=1;k++; //给符号标志赋值}if(s[k]=='i') //当前字符为'i'{if(k!=len-1) //判断字符'i'是否为字符串中作后⼀个字符cout<<"error\n"; //如果不是,说明复数数据格式错误elsecom.Image=sign*n; //如果是最后⼀个字符,复数对象已接受完,⽤sign*n为虚部赋值break;}while(s[k]>='0' && s[k]<='9') //如果当前字符在0~9之间,将数字字符转换成数字数值{n=n*10+s[k]-'0';k++;}}if(s[len-1]!='i' && n!=0) //如果最后⼀个字符不是'i',表⽰复数对象内只有实部,没有虚部{com.Real=n*sign;}return is;}ostream & operator<<(ostream &os,CCom &com) //重载输⼊{if(fabs(com.Image)<EPS) // 如果虚部为0os<<com.Real; //只输出实部else if((fabs(com.Real)<EPS)) //如果实部为0os<<com.Image<<"i"; //只输出虚部else if(com.Image>0)os<<com.Real<<"+"<<com.Image<<"i";elseos<<com.Real<<com.Image<<"i"; //虚部为正return os;}CCom CCom::operator+(CCom &com) //加法重载{CCom sum;sum.Real=Real+com.Real; //实部相加sum.Image=Image+com.Image; //虚部相加return sum;}CCom CCom::operator-(CCom &com) //减法重载{CCom sub;sub.Real=Real-com.Real; //实部相减sub.Image=Image-com.Image; //虚部相减return sub;}CCom CCom::operator*(CCom &com) //乘法重载{CCom multi;multi.Real=Real*com.Real-Image*com.Image; //实部乘积multi.Image=Real*com.Image+Image*com.Real; //虚部乘积return multi;}CCom CCom::operator/(CCom &com) //除法重载{CCom div;div.Real=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image); //实部除积div.Image=(Image*com.Real-Real*com.Image)/(com.Real*com.Real+com.Image*com.Image); //虚部除积return div;}CCom CCom::operator+=(CCom &com) //重载加法赋值{Real=Real+com.Real; //实部相加Image=Image+com.Image; //虚部相加return *this;}CCom CCom::operator-=(CCom &com) //重载减法赋值{Real=Real-com.Real; //实部相减Image=Image-com.Image; //虚部相减return *this;}CCom CCom::operator*=(CCom &com) //重载乘法赋值{double nReal=Real*com.Real-Image*com.Image; //实部乘积double nImage=Real*com.Image+Image*com.Real; //虚部乘积Real=nReal;Image=nImage;return *this;}CCom CCom::operator/=(CCom &com) //重载除法赋值{double nReal=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image); //实部除积 double nImage=(Image*com.Real-Real*com.Image)/(com.Real*com.Real+com.Image*com.Image); //虚部除积 Real=nReal;Image=nImage;return *this;}int CCom::operator==(CCom &com) //重载等于{if(Real==com.Real && Image==com.Image)return 1;elsereturn 0;}void Add() //复数加法运算函数{CCom num1,num2,sum,Zero(0,0);cout<<"加法计算\n"<<"最少输⼊两个复数,并且以0结束\n"; cout<<"第⼀个复数:";cin>>num1;cout<<"第⼆个复数:";cin>>num2;sum=num1+num2;cout<<"第三个复数:";cin>>num1;int i=4;while(!(num1==Zero)){sum=sum+num1;cout<<"第"<<i<<"个复数:";cin>>num1;i++;}cout<<"加法结果是:"<<sum<<endl;cout<<"请按任意键继续\n";cin.get();cin.get();}void Sub() //复数减法运算函数{CCom num1,num2,sub,Zero(0,0);cout<<"最少输⼊两个复数,并且以0结束\n";cout<<"第1个复数:";cin>>num1;cout<<"第2个复数:";cin>>num2;sub=num1-num2;cout<<"第3个复数:";cin>>num1;int i=4;while(!(num1==Zero)){sub=sub-num1;cout<<"第"<<i<<"个复数:";cin>>num1;i++;}cout<<"减法结果是:"<<sub<<endl;cout<<"请按任意键继续\n";cin.get();cin.get();}void Mul() //复数乘法运算函数{CCom num1,num2,mul,Zero(0,0);cout<<"乘法计算\n"<<"最少输⼊两个复数,并且以0结束\n"; cout<<"第⼀个复数:";cin>>num1;cout<<"第⼆个复数:";cin>>num2;mul=num1*num2;cout<<"第三个复数:";cin>>num1;int i=4;while(!(num1==Zero)){mul*=num1;cout<<"第"<<i<<"个复数:";cin>>num1;i++;}cout<<"乘法结果是:"<<mul<<endl;cout<<"请按任意键继续\n";cin.get();cin.get();}void Div() //复数除法运算函数{CCom num1,num2,div,Zero(0,0);cout<<"除法计算\n"<<"最少输⼊两个复数,并且以0结束\n";cout<<"第⼀个复数:";cin>>num1;cout<<"第⼆个复数:";cin>>num2;div=num1/num2;cout<<"第三个复数:";cin>>num1;int i=4;while(!(num1==Zero)){div/=num1;cout<<"第"<<i<<"个复数:";cin>>num1;i++;}cout<<"除法结果是:"<<div<<endl;cout<<"请按任意键继续\n";cin.get();cin.get();}void Compare() //两复数⽐较函数{CCom num1,num2;cout<<"请输⼊两个复数\n";cout<<"第⼀个复数:";cin>>num1;cout<<"第⼆个复数\n";cin>>num2;if(num1==num2)cout<<"这两个复数相等\n";else if(num1>num2)cout<<num1<<"的模⼤于"<<num2<<"的模\n";else if(num1<num2)cout<<num2<<"的模⼤于"<<num1<<"的模\n";elsecout<<"这两个复数的模相等\n";cout<<"请按任意键继续\n";cin.get();cin.get();}void Jinzhi() //实现进制转换{long n;int p,c,m=0,s[100];cout<<"输⼊要转换的数字:\n";cin>>n;cout<<"输⼊要转换的进制:\n";cin>>p;cout<<"("<<n<<")10="<<"(";while (n!=0)//数制转换,结果存⼊数组s[m]{c=n%p;n=n/p;m++;s[m]=c; //将余数按顺序存⼊数组s[m]中 }for(int k=m;k>=1;k--)//输出转换后的序列{if(s[k]>=10) //若为⼗六进制等则输出相对应的字母 cout<<(char)(s[k]+55);else //否则直接输出数字cout<<s[k];}cout<<")"<<p<<endl;cout<<"请按任意键继续\n";cin.get();cin.get();}void outpt(){char szName[20];cout<<"请输⼊您的姓名:";cin>>szName;system("cls");do{system("cls");cout<<"\t这是⼀个计算器,可实现以下功能,请按对应的按键(0-6)\n\n\n";cout<<"\t*----------Hpioneer⼩计算器菜单---------*\n";cout<<"\t| 1:多个复数加法,以0结束 |\n";cout<<"\t| 2:多个复数减法,以0结束 |\n";cout<<"\t| 3:多个复数乘法,以0结束 |\n";cout<<"\t| 4:多个复数除法,以0结束 |\n";cout<<"\t| 5:复数⽐较 |\n";cout<<"\t| 6:进制转换 |\n";cout<<"\t| 0:退出程序 |\n";cout<<"\t| 请您选择: |\n";cout<<"\t*---------------------------------------*\n";}}using namespace NameCCom;int main(void) //主函数开始,void可以不写{int h;output();cin>>h;//每步操作if(h==1) //⽤户选1则调⽤Add()函数Add();else if(h==2) //⽤户选2则调⽤Sub()函数Sub();else if(h==3) //⽤户选3则调⽤Mul()函数Mul();else if(h==4) //⽤户选4则调⽤Div()函数Div();else if(h==5) //⽤户选6则调⽤Compare()函数Compare();else if(h==6) //⽤户选7则调⽤函数Jinzhi()函数Jinzhi();else if(h==0)cout<<"⾮常感谢您的使⽤\n";elsebreak;}return 0;}以上就是本⽂的全部内容,希望对⼤家学习C++程序设计有所帮助。
用c语言编程计算复数

VC++ 6.0下用c 语言编程计算复数(电气专业专用)欧拉公式:θθθθ∠=+=1sin cos j ej学过电路的人都知道,欧拉公式在电路中应用很广,特别是遇到正弦量的题,别说有多烦, 代数复数和极坐标复数的转化计算超级麻烦,不做过电路题的人是不能理解的,介于此,本人想通过c 语言来简化这一操作,如果是代数复数的直接输入实部和虚部,如果是极坐标的直接输入模和相角,转化和计算交给程序和计算机去做吧!要使用此程序必须要有c 的编程环境,这里推荐大家使用VC++系类的。
各位同学如果学过c 语言的应该不会陌生的。
下面教大家如何创建一个工程区—工程—源文件。
要先创建一个文件夹用来存放工程区,工程,和c语言,要有良好的习惯。
打开之后使用快捷键“Ctrl+n”打开新建目录对话框。
后点击ok,工程区创建完成。
再使用快捷键“Ctrl+n”,选中projects,名字自定义,其他的如图所示,点击ok。
点击完finish之后,再点击一次ok,工程创建完成。
选中工程,再来一次快捷键“Ctrl+n”。
跟前面操作差不多,就是输入个名字而已,我们编的是c语言,一定要加后缀名.c,否则默认为.cpp,点击ok完成源文件创建。
下面把程序复制到源文件里面:#include<stdio.h>#include<math.h>#define PI 3.1415926double Re(double m,double zeta) /*极坐标转换实部*/{double r;r=m*cos(PI*zeta/180);return r;}double Im(double m,double zeta) /*极坐标转换虚部*/{double j;j=m*sin(PI*zeta/180);return j;}double Mo(double x,double y) /*复数转换为幅值*/{double m;m=sqrt(x*x+y*y);return m;}double Phi(double x,double y) /*复数输出相角*/{double zeta;zeta=180/PI*atan(y/x);if((x>=0&&y>=0)||(x>=0&&y<0)) /*第一、四限角*/return zeta;else if((x<0&&y<0)||(x<0&&y>=0)) /*第二、三限角*/return (zeta+180);return 0;}void input(double *one,double *two,int *pwn) /*选择复数输入形式,并输入该数,并返回3个值*/{int w;double u,v;printf("请选择数的输入类别:1为复数输入,0为极坐标方式输入\n");scanf("%d",&w);if(w){printf("以复数形式输入该数,先输入实部,再输入虚部:\n");scanf("%lf%lf",&u,&v);*one=u;*two=v;*pwn=1;}else{printf("以极坐标形式输入该数,先输入幅值,再输入相角:\n");scanf("%lf%lf",&u,&v);*one=u;*two=v;*pwn=0;}}void main(){double a1,a2,b1,b2,d1,d2,e1,e2,f1,f2,g1,g2;int pwn1,pwn2,c1,c2,c3; /*pwn为标志位,为1时表示以复数输入,为0时表示以极坐标形式输入*/printf("请输入第一个复数\n");input(&a1,&a2,&pwn1);printf("请输入第二个复数\n");input(&b1,&b2,&pwn2);printf("请选择算法种类:加法和减法为1;乘法和除法为0\n");scanf("%d",&c1);if(c1) /*c1为真执行加减法*/{printf("选择加法输入1,选择减法输入0\n");scanf("%d",&c2);if(!pwn1) //加减法用复数方便多了.{d1=Re(a1,a2);d2=Im(a1,a2);}else{d1=a1;d2=a2;}if(!pwn2){e1=Re(b1,b2);e2=Im(b1,b2);}else{e1=b1;e2=b2;}if(c2) //c2为真执行加法.{{f1=d1+e1;f2=d2+e2;g1=Mo(f1,f2);g2=Phi(f1,f2);}printf("输出结果为:\n");if(!pwn1&&!pwn2)printf("%.3f/_%.2f°+%.3f/_%.2f°=\n",a1,a2,b1,b2);if(!pwn1&&pwn2)printf("%.3f/_%.2f°+%.3f+%.3fi=\n",a1,a2,b1,b2);if(pwn1&&!pwn2)printf("%.3f+%.3fi+%.3f/_%.2f°=\n",a1,a2,b1,b2);if(pwn1&&pwn2)printf("%.3f+%.3fi+%.3f+%.3fi=\n",a1,a2,b1,b2);printf("复数形式为:%.3f+%.3fi\n",f1,f2);printf("极坐标形式为:%.3f/_%.2f\n",g1,g2);}else //c2为假执行减法.{{f1=d1-e1;f2=d2-e2;g1=Mo(f1,f2);g2=Phi(f1,f2);}printf("输出结果为:\n");if(!pwn1&&!pwn2)printf("%.3f/_%.2f°-%.3f/_%.2f°=\n",a1,a2,b1,b2);if(!pwn1&&pwn2)printf("%.3f/_%.2f°-%.3f+%.3fi=\n",a1,a2,b1,b2);if(pwn1&&!pwn2)printf("%.3f+%.3fi-%.3f/_%.2f°=\n",a1,a2,b1,b2);if(pwn1&&pwn2)printf("%.3f+%.3fi-%.3f+%.3fi=\n",a1,a2,b1,b2);printf("复数形式为:%.3f+%.3fi\n",f1,f2);printf("极坐标形式为:%.3f/_%.2f\n",g1,g2);}}else //乘除法化极坐标形式方便多啦.{printf("选择乘法输入1,选择除法输入0\n");scanf("%d",&c3);if(pwn1){d1=Mo(a1,a2);d2=Phi(a1,a2);}else{d1=a1;d2=a2;}if(pwn2){e1=Mo(b1,b2);e2=Phi(b1,b2);}else{e1=b1;e2=b2;}if(c3) //c3为真执行乘法.{{f1=d1*e1;f2=d2+e2;g1=Re(f1,f2);g2=Im(f1,f2);}printf("输出结果为:\n");if(!pwn1&&!pwn2)printf("%.3f/_%.2f°*%.3f/_%.2f°=\n",a1,a2,b1,b2);if(!pwn1&&pwn2)printf("%.3f/_%.2f°*(%.3f+%.3fi)=\n",a1,a2,b1,b2);if(pwn1&&!pwn2)printf("(%.3f+%.3fi)*%.3f/_%.2f°=\n",a1,a2,b1,b2);if(pwn1&&pwn2)printf("(%.3f+%.3fi)*(%.3f+%.3fi)=\n",a1,a2,b1,b2);printf("复数形式为:%.3f+%.3fi\n",g1,g2);printf("极坐标形式为:%.3f/_%.2f\n",f1,f2);}else //c3为假执行除法{{f1=d1/e1;f2=d2-e2;g1=Re(f1,f2);g2=Im(f1,f2);}printf("输出结果为:\n");if(pwn1&&pwn2)printf("%.3f/_%.2f°/%.3f/_%.2f°=\n",a1,a2,b1,b2);if(pwn1&&!pwn2)printf("%.3f/_%.2f°/(%.3f+%.3fi)=\n",a1,a2,b1,b2);if(!pwn1&&pwn2)printf("(%.3f+%.3fi)/%.3f/_%.2f°=\n",a1,a2,b1,b2);if(!pwn1&&!pwn2)printf("(%.3f+%.3fi)/(%.3f+%.3fi)=\n",a1,a2,b1,b2);printf("复数形式为:%.3f+%.3fi\n",g1,g2);printf("极坐标形式为:%.3f/_%.2f\n",f1,f2);}}}按顺序点击三个图标,编译完成并执行程序。
复数的基本运算(C语言)

#include<stdio.h>#include<stdlib.h>typedef struct fushu//抽象数据类型定义{float real;//数据对象float image;}fushu;fushu ComplexNumberInput(float a,float b)//构造二元组{fushu c;c.real=a;//实部c.image=b;//虚部return(c);}fushu ComplexNumberAdd(fushu c1,fushu c2)//求和运算{fushu sum;sum.real=c1.real+c2.real;sum.image=c1.image+c2.image;return (sum);}fushu ComplexNumberSub(fushu c1,fushu c2)//求差运算{fushu sub;sub.real=c1.real-c2.real;sub.image=c1.image-c2.image;return (sub);}fushu ComplexNumberMul(fushu c1,fushu c2)//求积运算{fushu Mul;Mul.real=c1.real*c2.real-c1.image*c2.image;Mul.image=c1.real*c2.image+c1.image*c2.real;return (Mul);}fushu ComplexNumberDiv(fushu c1,fushu c2)//求商运算{fushu div;float d1,d2,d3,d4;d1=c1.real*c2.real+c1.image*c2.image;d2=c2.real*c2.real+c2.image*c2.image;d3=c1.image*c2.real-c1.real*c2.image;d4=c2.real*c2.real+c2.image*c2.image;if(d2!=0&&d4!=0){div.real=d1/d2;div.image=d3/d4;return(div);}else{div.real=0;div.image=0;return(div);}}void ComplexNumberOutput(fushu c)//输出运算结果{if(c.real==0.0&&c.image==0.0) printf("0\n");if(c.real==0.0&&c.image!=0.0) printf("%fi\n",c.image);if(c.real!=0.0&&c.image==0.0) printf("%f\n",c.real);if(c.real!=0.0&&c.image!=0.0) printf("%f+(%fi)\n",c.real,c.image); }void main()//主函数{int choice;int k;float a1,a2,b1,b2;struct fushu c1,c2,sum,sub,mult,div;printf("欢迎进行复数的基本代数运算\n");printf("1: 复数加法运算\n");printf("2: 复数减法运算\n");printf("3: 复数乘法运算\n");printf("4: 复数除法运算\n");printf("0: 推出系统\n");printf("请分别输入第一个复数的实部和虚部: ");scanf("%f%f",&a1,&b1);c1 = ComplexNumberInput(a1,b1);printf("第一个复数为: ");ComplexNumberOutput(c1);printf("请分别输入第二个复数的实部和虚部: ");scanf("%f%f",&a2,&b2);c2 = ComplexNumberInput(a2,b2);printf("第二个复数为: "); ComplexNumberOutput(c2);for(;;){printf("请输入你选择的功能: ");scanf("%d",&choice);switch(choice){case 0:exit(0);break;case 1:sum = ComplexNumberAdd(c1,c2);printf("求和后结果为: ");ComplexNumberOutput(sum);break;case 2:sub = ComplexNumberSub(c1,c2);printf("求差后结果为: ");ComplexNumberOutput(sub);break;case 3:mult = ComplexNumberMul(c1,c2);printf("求积后结果为: ");ComplexNumberOutput(mult );break;case 4:div=ComplexNumberDiv(c1,c2);if(div.real!=0&&div.image!=0){printf("求商后结果: ");ComplexNumberOutput(div);break;}else{printf("除零错误,请重新输入第二个复数;\n");k=0;exit(k);}}}}THANKS !!!致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考。
C语言复数的运算(实验报告)

实验报告题目:复数的四则运算班级:13信管姓名:白浩然学号:201340403034 完成日期:2014.05.21一、需求分析1.本演示程序中复数由两个相互之间存在次序关系的实数构成。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
3.程序执行的命令包括:1)由输入的实部和虚部生成一个复数;2)两个复数求和;3)两个复数求差;4)两个复数求积;5)从已知复数中分离出实部;6)从已知复数中分离出虚部。
4.测试数据:1)构造复数:2)复数求和:3)复数求差:4)复数求积:5)提取实部:6)提取虚部:二、编码实现#include "stdio.h"#include "stdlib.h"struct complex{float real;//实部float imag;//虚部};//构造复数void InitComplex(complex &c,float r1,float r2){c.real=r1;//r1为实部c.imag=r2;//r2为虚部}//复数求和void AddComplex(complex &c,complex c1,complex c2) {c.real=c1.real+c2.real;//实部相加c.imag=c1.imag+c2.imag;//虚部相加}//复数求差void SubComplex(complex &c,complex c1,complex c2) {c.real=c1.real-c2.real;//实部相减c.imag=c1.imag-c2.imag;//虚部相减}//复数求积void MulComplex(complex &c,complex c1,complex c2){c.real=(c1.real*c2.real)-(c1.imag*c2.imag);c.imag=(c1.real*c2.imag)+(c2.real*c1.imag);}//分离实部void RealComplex(complex c,float &r){r=c.real;}//分离虚部void ImagComplex(complex c,float &r){r=c.imag;}//主程序void main(){complex c,c1,c2;float r,r1,r2,r11,r22,r12,r21;int node;printf("请输入要操作的序号:\n");printf("1.构造一个复数2.两个复数求和3.两个复数求差\n");printf("4.两个复数求积5.分离出实部6.分离出虚部\n");scanf("%d",&node);while(node!=0){switch(node){case 1:printf("输入复数的实部和虚部:\n");scanf("%f %f",&r1,&r2);InitComplex(c,r1,r2);printf("构造的复数为:%f+%fi\n",c.real,c.imag);break;case 2:printf("输入c1的实部和虚部:\n");scanf("%f %f",&r11,&r12);InitComplex(c1,r11,r12);printf("输入c2的实部和虚部:\n");scanf("%f %f",&r21,&r22);InitComplex(c2,r21,r22);AddComplex(c,c1,c2);printf("结果为:%f+%fi\n",c.real,c.imag);break;case 3:printf("输入c1的实部和虚部:\n");scanf("%f %f",&r11,&r12);InitComplex(c1,r11,r12);printf("输入c2的实部和虚部:\n");scanf("%f %f",&r21,&r22);InitComplex(c2,r21,r22);SubComplex(c,c1,c2);printf("结果为:%f+%fi\n",c.real,c.imag);break;case 4:printf("输入c1的实部和虚部:\n");scanf("%f %f",&r11,&r12);InitComplex(c1,r11,r12);printf("输入c2的实部和虚部:\n");scanf("%f %f",&r21,&r22);InitComplex(c2,r21,r22);MulComplex(c,c1,c2);printf("结果为:%f+%fi\n",c.real,c.imag);break;case 5:printf("输入复数的实部和虚部:\n");scanf("%f %f",&r1,&r2);InitComplex(c,r1,r2);RealComplex(c,r);printf("实部为:%f\n",r);break;case 6:printf("输入复数的实部和虚部:\n");scanf("%f %f",&r1,&r2);InitComplex(c,r1,r2);ImagComplex(c,r);printf("虚部为:%f\n",r);break;default:printf("结束");}scanf("%d",node);}}三、调试分析1.开始时文件后缀写成了“.c”,导致调试多次无法运行,后来改为“.cpp”;2.多处“%f”写成了“%d”,导致程序不能正常运行;3.定义结构体时,最后一个“}”后忘记加“;”,导致程序出现错误,以后应多加注意。
C++实验使用重载运算符实现一个复数类

C++实验使⽤重载运算符实现⼀个复数类实验⽬的:1.掌握⽤成员函数重载运算符的⽅法2.掌握⽤友元函数重载运算符的⽅法实验要求:1.定义⼀个复数类,描述⼀些必须的成员函数,如:构造函数,析构函数,赋值函数,返回数据成员值的函数等。
2.定义运算符重载函数,通过重载运算符:+,-,*,/,直接实现⼆个复数之间的加减乘除运算。
编写⼀个完整的程序,测试重载运算符的正确性。
要求乘法“+”,“*”⽤友元函数实现重载,除法“-”,“/”⽤成员函数实现重载,参数是复数或实数。
3.通过重载运算符:>>,<<,=,直接实现复数的输⼊、输出及赋值运算,通过重载运算符:= =,!=直接实现复数的⽐较运算,编写⼀个完整的程序,测试重载运算符的正确性。
操作菜单可参考如下格式:1输⼊复数2查看输⼊的复数3复数相加4复数相减5复数相乘6复数相除7输出结果0退出#include <iostream>#include<cstdio>using namespace std;class Complex{public:Complex(double r = 0,double i = 0)//构造函数{real=r;imag=i;}~Complex(){}friend Complex operator+(Complex &c1,Complex &c2); //重载为友员函数friend Complex operator*(Complex &c1,Complex &c2);Complex operator -(Complex&);//重载为成员函数Complex operator /(Complex&);friend istream& operator>>(istream&, Complex&);friend ostream& operator<<(ostream&, Complex&);friend bool operator==(Complex &c1,Complex &c2);friend bool operator!=(Complex &c1,Complex &c2);void display( );private:double real;double imag;};Complex operator + (Complex &c1,Complex &c2){return Complex(c1.real+c2.real, c1.imag+c2.imag);}Complex operator * (Complex &c1,Complex &c2){return Complex(c1.real*c2.real, c1.imag*c2.imag);}Complex Complex::operator-(Complex &c){return Complex(real-c.real,imag-c.imag);}Complex Complex::operator/(Complex &c){return Complex(real/c.real,imag/c.imag);}istream& operator>>( istream& in, Complex &c ) {in >> c.real >> c.imag;return in;}ostream& operator<<( ostream& out, Complex &c ) {out << c.real << "+" << c.imag << "i\n";return out;}bool operator == (Complex &c1,Complex &c2){if(c1.real==c2.real&&c1.imag==c2.imag){return true;}else{return false;}}bool operator != (Complex &c1,Complex &c2){if(c1.real!=c2.real||c1.imag!=c2.imag){return true;}else{return false;}}void Complex::display( ){cout<<real<< "+" <<imag<<"i\n"<<endl;}int Menu(){int t;cout << endl;cout<<"=================="<<endl;cout<<"1.输⼊复数"<<endl;cout<<"2.查看输⼊的复数"<<endl;cout<<"3.复数相加"<<endl;cout<<"4.复数相减"<<endl;cout<<"5.复数相乘"<<endl;cout<<"6.复数相除"<<endl;cout<<"7.输出结果"<<endl;cout<<"0.退出"<<endl;cout<<"=================="<<endl;cout<<"请选择(0-7):";cin>>t;return t;}int main(){int iChoice =1;Complex c1,c2,c3,c4;while (iChoice!=0){iChoice = Menu();switch (iChoice){case1:{cout<<"请输⼊⼀个复数:"<<endl;cin>>c1;getchar();break;}case2:{//c1.display();cout<<c1;break;}case3:{cout<<"原有的复数:"<<endl;cout<<c1;cout<<"请再输⼊⼀个复数相加:"<<endl; cin>>c2;getchar();c3=c1+c2;break;}case4:{cout<<"原有的复数:"<<endl;cout<<c1;cout<<"请再输⼊⼀个复数相减:"<<endl; cin>>c2;getchar();c3=c1-c2;break;}case5:{cout<<"原有的复数:"<<endl;cout<<c1;cout<<"请再输⼊⼀个复数相乘:"<<endl; cin>>c2;getchar();c3=c1*c2;break;}case6:{cout<<"原有的复数:"<<endl;cout<<c1;cout<<"请再输⼊⼀个复数相除:"<<endl; cin>>c2;getchar();c3=c1/c2;break;}case7:{cout<<"运算的结果:"<<endl;cout<<c3;break;}case0:{break;}}}return0;}。
C++ 29复数的四则运算

本案例知识要点●复数类的定义●+、-、*、/运算符重载●输出函数的设计一、案例需求1.案例描述复数a=x1+y1i和a=x2+y2i的四则运算公式如下:,,试编写程序对输入的两个复数进行加减乘除四则运算,并在屏幕上输出计算结果。
2.案例效果图图29-1 案例效果图3.功能说明(1)进行加“+”,减“-”,乘“*”,除“/”运算符重载,对输入的两个复数对象输出其运算结果。
(2)当第二个复数b的实部和虚部同时为0时,除法不能运算,需要提示。
(3)设计输出函数,对于计算结果的虚部为负数的情况能进行处理。
如2-2i不要输出为2+-2i。
二、案例分析根据案例需求,需要利用MFC环境定义了一个菜单;一个输入对话框类,提供个两个复数的输入界面;另外定义一个complex类,在complex类中定义了数据成员:实部值和虚部值,定义了成员函数:声明了友元加号运算符重载函数、友元减号运算符重载函数、友元乘号运算符重载函数、友元除号运算符重载函数、实部值获取函数和虚部值获取函数。
最后在视图区输出了两个复数的运算结果。
本案例的重点是如何使用运算符重载函数来进行复数对象的四则运算,因为在MFC环境中不能重载输入和输出运算符,需要独立设计复数输出函数。
本案例的难点在于复数的虚部计算结果为负数时的输出函数设计。
三、案例设计1.类的设计本案例需要设计一个类complex。
图29-2 complex类图●数据成员double real;复数实部。
double imag;复数虚部。
●函数成员complex();默认构造函数。
complex(double,double);带参构造函数。
friend complex operator + (complex &c1,complex&c2);友元运算符重载函数+。
friend complex operator - (complex &c1,complex&c2);友元运算符重载函数-。
复数的基本运算(C语言)

#include<stdio.h>#include<stdlib.h>typedef struct fushu//抽象数据类型定义{float real;//数据对象float image;}fushu;fushu ComplexNumberInput(float a,float b)//构造二元组{fushu c;c.real=a;//实部c.image=b;//虚部return(c);}fushu ComplexNumberAdd(fushu c1,fushu c2)//求和运算{fushu sum;sum.real=c1.real+c2.real;sum.image=c1.image+c2.image;return (sum);}fushu ComplexNumberSub(fushu c1,fushu c2)//求差运算{fushu sub;sub.real=c1.real-c2.real;sub.image=c1.image-c2.image;return (sub);}fushu ComplexNumberMul(fushu c1,fushu c2)//求积运算{fushu Mul;Mul.real=c1.real*c2.real-c1.image*c2.image;Mul.image=c1.real*c2.image+c1.image*c2.real;return (Mul);}fushu ComplexNumberDiv(fushu c1,fushu c2)//求商运算{fushu div;float d1,d2,d3,d4;d1=c1.real*c2.real+c1.image*c2.image;d2=c2.real*c2.real+c2.image*c2.image;d3=c1.image*c2.real-c1.real*c2.image;d4=c2.real*c2.real+c2.image*c2.image;if(d2!=0&&d4!=0){div.real=d1/d2;div.image=d3/d4;return(div);}else{div.real=0;div.image=0;return(div);}}void ComplexNumberOutput(fushu c)//输出运算结果{if(c.real==0.0&&c.image==0.0) printf("0\n");if(c.real==0.0&&c.image!=0.0) printf("%fi\n",c.image);if(c.real!=0.0&&c.image==0.0) printf("%f\n",c.real);if(c.real!=0.0&&c.image!=0.0) printf("%f+(%fi)\n",c.real,c.image); }void main()//主函数{int choice;int k;float a1,a2,b1,b2;struct fushu c1,c2,sum,sub,mult,div;printf("欢迎进行复数的基本代数运算\n");printf("1: 复数加法运算\n");printf("2: 复数减法运算\n");printf("3: 复数乘法运算\n");printf("4: 复数除法运算\n");printf("0: 推出系统\n");printf("请分别输入第一个复数的实部和虚部: ");scanf("%f%f",&a1,&b1);c1 = ComplexNumberInput(a1,b1);printf("第一个复数为: ");ComplexNumberOutput(c1);printf("请分别输入第二个复数的实部和虚部: ");scanf("%f%f",&a2,&b2);c2 = ComplexNumberInput(a2,b2);printf("第二个复数为: ");ComplexNumberOutput(c2);for(;;){printf("请输入你选择的功能: ");scanf("%d",&choice);switch(choice){case 0:exit(0);break;case 1:sum = ComplexNumberAdd(c1,c2);printf("求和后结果为: ");ComplexNumberOutput(sum);break;case 2:sub = ComplexNumberSub(c1,c2);printf("求差后结果为: ");ComplexNumberOutput(sub);break;case 3:mult = ComplexNumberMul(c1,c2);printf("求积后结果为: ");ComplexNumberOutput(mult );break;case 4:div=ComplexNumberDiv(c1,c2);if(div.real!=0&&div.image!=0){printf("求商后结果: ");ComplexNumberOutput(div);break;}else{printf("除零错误,请重新输入第二个复数;\n");k=0;exit(k);}}}}。