[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的类定义,类实现和主函数是写一起,我个人是习惯拆开,放不同文件里,所以我拆开了
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;} 结果