首页 > 编程知识 正文

共轭复数相乘怎么算,复数相乘的计算

时间:2023-05-05 06:15:02 阅读:275762 作者:4722

[PTA] 7-11 复数相乘–运算符重载 (30分)

7-11 复数相乘–运算符重载

说来惭愧,现在快期末了才想起来2月份开启了PTA,当时卡在宿舍排身高那里就不敢做了,前天重新打开PTA,毕竟,不做就挂科了嘛[笑],宿舍排身高房间号不能是字符串,必须是int,然后<<setw(6)<<setfill(‘0’),这个不是今天的重点.

复数相乘

建立一个复数类Complex,实数和虚数是其私有数据成员;
建立复数类的无参和参数化构造函数;
建立一个 (乘号)的运算符重载,以便于对两个复数直接进行乘法运算;
建立输出函数void display(),对复数进行输出;
主函数里定义三个复数类对象c1、c2、c3.
输入格式:
输入一共一行,每行两个复数,分别为复数类c1和c2。
输出格式:
执行c3=c1c2运算之后,调用display函数,对c3进行输出。
提示:输入或输出的复数,可能只包含实部或虚部。
输入样例:
1+2i 2+3i
输出样例:
-4+7i

学过高中数学我们知道复数有实部和虚部,像a+bi,1是实部,bi是虚部;或者像单独一个a就是纯实数,单独一个bi就是纯虚数.
此外复数之间相乘是遵循(a+bi)(c+di) = (ac+bdi²)+(bc+ad)i,其中i²=-1,故(a+bi)(c+di) = (ac-bd)+(bc+ad)i.
知晓这些就足够了
由于PTA的类定义,类实现和主函数是写一起,我个人是习惯拆开,放不同文件里,所以我拆开了

类定义 #pragma once class Complex{int re;//实部int im;//虚部char flag = '+';//是虚数时,虚部前的正负号,默认是正public:Complex();//无参构造Complex(int RE,int IM);//有参构造,但没有用到,在类测试时使用void reInit(int RE,int IM);//重新初始化这个对象的数据Complex operator*(const Complex &c);//重载*void input();//输入复数,其实这个感觉重载>>会好一点void display();//输出复数,同样感觉重载<<会好一点}; 实现 无参 Complex::Complex(){re = 0;im = 0;} 有参 Complex::Complex(int RE,int IM){re = RE;im = IM;if(im < 0){flag = '-';//当虚部是负数时符号变负}} 重初始化 void Complex::reInit(int RE,int IM){re = RE;im = IM;} 看上去是重点,但其实不是的重载*运算符 Complex Complex::operator*(const Complex &c){int RE = (this->re*c.re)-(this->im*c.im);int IM = (this->re*c.im)+(this->im*c.re);return Complex(RE,IM);} 输入输出的格式

void display()函数

void Complex::display(){if(re == 0){if(im == 0){cout<<0<<endl;//当实部虚部都为0时输出为0}else{//实部为0虚部不为0时,即纯虚数时if(abs(im)==1){//纯虚数的四种情况if(im<0){cout<<"-i"<<endl;}else{cout<<"i"<<endl;}}else{if(im<0){cout<<"-"<<abs(im)<<"i"<<endl;}else{cout<<abs(im)<<"i"<<endl;}}}}else{//实部不为0时if(im == 0){cout<<re<<endl;//虚部为0时,单独输出实部}else{if(im < 0){flag = '-';//当虚部小于0}//从这里开始flag才有作用if(abs(im)==1){cout<<re<<flag<<"i"<<endl;}else{cout<<re<<flag<<abs(im)<<"i"<<endl;}}}}

这道题的难点在于控制输入的格式void input()

void Complex::input(){int re=0,im = 0;//input函数的局部变量们char input[9]="",flag='+';cin>>input;//调用这个函数时对input变量进行输入int length = strlen(input);//获取输入的长度if(input[length-1]!='i'){//当输入的字符串最后一个不是i就当做实数处理,我相信他给的数据不会太刁钻int start = 0;//开始下标为0if(input[0]=='-'){//第一个字符为-号,开始下标移动到1start = 1;}for(int i = start;i < length;i++){//将实数的字符转成数字赋值给rere = re * 10;re = re + (input[i]-'0');}if(input[0]=='-'){//当第一个字符为-号时re取反re = -re;}im = 0;//此时im虚部为0}else{//当输入最后一个字符为i时int start = 0;//开始下标同上if(input[0]=='-'){start = 1;}int i;bool iscim = true; //是否是纯虚数,默认是纯虚数for(i = start;i<(length-1);i++){if(input[i]=='+'||input[i]=='-'){//除了首字符外,在中间遇到+-号就说明有实部,所以不是纯虚数iscim = false;}}if(iscim){//如果是纯虚数for(i = start;i<(length-1);i++){//字符转数字赋值给虚部im = im * 10;im = im + (input[i]-'0');}//当输入的是i时,im是0,所以要给im赋值1,但是输入0i也会变成i,祈祷系统不会出刁钻的数据if(im == 0){im = 1;}//当首字符为-号时,虚部取反if(input[0]=='-'){im = -im;}}else{//如果不是纯虚数for(i = start;i<(length-1)&&input[i]!='+'&&input[i]!='-';i++){//实部部分的字符转数字赋值给实部re = re * 10;re = re + (input[i]-'0');}if(input[0]=='-'){//首字符为-号时实部取反re = -re;}flag = input[i++];//flag赋值为实部与虚部之间的正负号for(;i<(length-1);i++){//虚部部分的字符转数字赋值给虚部im = im * 10;im = im + (input[i]-'0');}if(im == 0){//若输入a+i,则im会变为0,所以要赋值为1,但是如果输入a+0i的话也会变成a+i,我相信系统不会这么刁钻im = 1;}if(flag == '-'){//虚部前的字符为-号时虚部取反im = -im;}}}reInit(re,im);//调用重初始化函数} 主函数 #include "Complex.h"int main(){Complex c1,c2,c3;c1.input();c2.input();c3 = c1*c2;c3.display();return 0;} 结果





版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。