PTA 7-8 复数相加

7-8 复数相加 (70分)

题目:一个复数类,运算符重载 + ,实现复数和复数的相加。输入一组复数,每行一个复数,直到输入0结束。 输出这组复数的结果。
提示: 复数的输入和输出符合数学书写规范
输入示例
3+2i
2+3i
0
输出示例
5+5i

这道题我是先于7-11复数相乘做的,但是实力劝退,单看70分就比7-11感觉难,复数的输入符合数学书写规范这一点,令我不禁思考:是1+i还是1+1i,而且怎么判定输入0.
做完7-11后就豁然开朗了

直接进入正题

类定义

#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(char *INPUT);//input函数带参
		void print();//输出函数
};

实现

无参构造

Complex::Complex(){
	re = 0;
	im = 0;
}

有参构造

Complex::Complex(int RE,int IM){
	re = RE;
	im = IM;
}

重初始化

void Complex::reInit(int RE,int IM){
	re = RE;
	im = IM;
}

重载+运算符

Complex Complex::operator+(const Complex &c){
	int RE = this->re+c.re;
	int IM = this->im+c.im;
	return Complex(RE,IM);
}

print()函数(和7-11的display()一模一样照搬的)

void Complex::print(){
	if(re == 0){
		if(im == 0){
			cout<<0<<endl;
		}else{
			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{
		if(im == 0){
			cout<<re<<endl;
		}else{
			if(im < 0){
				flag = '-';
			}
			if(abs(im)==1){
				cout<<re<<flag<<"i"<<endl;
			}else{
				cout<<re<<flag<<abs(im)<<"i"<<endl;
			}
		}
	}
}

接下来是重点input(char *INPUT)函数
虽说是重点吧,但其实处理的方式和7-11的一样,只是对输入方式进行修改

void Complex::input(char *INPUT){
	int re=0,im = 0;//input函数的局部变量re,im
	char *input,flag='+';
	input = INPUT;//通过主函数传入的INPUT指针进行处理
	int length = strlen(input);//获取传入指针指向的字符串的长度
	if(input[length-1]!='i'){
		//实数的情况
		int start = 0;//起始下标默认为0
		if(input[0]=='-'){
			//若字符串首字符为-则改变起始下标为1
			start = 1;
		}
		for(int i = start;i < length;i++){
			//从起始下标开始给实部赋值
			re = re * 10;
			re = re + (input[i]-'0');
		}
		if(input[0]=='-'){
			//若字符串首字符为-则实部取反
			re = -re;
		}
		im = 0;//实数时定义虚部为0
	}else{
		//虚数的情况
		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');
			}
			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++];//虚部前的正负号
			for(;i<(length-1);i++){
				//在虚数前的正负号后的部分为实部部分
				im = im * 10;
				im = im + (input[i]-'0');
			}
			//当虚部为i时,im为0,所以要赋为1
			if(im == 0){
				im = 1;
			}
			if(flag == '-'){
				im = -im;
			}
		}
	}
	reInit(re,im);//调用重初始化函数
}

主函数

#include "Complex.h" 
int main(){
	Complex sum(0,0),c;//定义Complex类对象
	char input[9];//定义input数组长度为9
	cin>>input;//输入字符串
	while(input[0]!='0'){ //当input[0]不为'0'时执行循环
		c.input(input); //调用c对象的input进行重初始化
		sum = sum + c; 
		cin>>input;//重新输入input
	}
	sum.print();//输出sum
}

结果
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36998526/article/details/106961763
7-8