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
}
结果