Question:
Overload the + operator to allow you to add two statisticians from the previous project. If s1 and s2 are two statisticians, then the result of s1 + s2 should be a new statistician that behaves as if it had all of the numbers of s1 followed by all of the numbers of s2.
My answer:
重载+操作符
statistician operator +(statistician& a, statistician& b){
statistician c;
if((a.sequence_length() + b.sequence_length()) == 0)
return c;
if(a.sequence_length() == 0)
return b;
else if(b.sequence_length() == 0)
return a;
// both a and b are non-empty
double max = (a.sequence_max() < b.sequence_max()) ? b.sequence_max() : a.sequence_max();
double min = (a.sequence_min() < b.sequence_min()) ? a.sequence_min() : b.sequence_min();
// b follows after a
int length = a.sequence_length() + b.sequence_length();
double sum = a.sequence_sum() + b.sequence_sum();
double last_number = b.sequence_last();
if(last_number != max && last_number != min){
c.next_number(max);
c.next_number(min);
while(c.sequence_length() != length-1){
c.next_number((sum-min-max-last_number)/(length-3));
}
c.next_number(last_number);
return c;
} else if(last_number == max){
c.next_number(min);
} else {
c.next_number(max);
}
while(c.sequence_length() != length-1){
c.next_number((sum-min-max)/(length-2));
}
c.next_number(last_number);
return c;
}
测试:
int main(){
statistician s;
s.next_number(1.1);
s.next_number(-2.4);
s.next_number(0.8);
s.next_number(2.1);
s.next_number(-9);
cout << "********************************" << endl;
cout << "s.length: " << s.sequence_length() << endl;
cout << "s.sum: " << s.sequence_sum() << endl;
cout << "s.last number: " << s.sequence_last() << endl;
cout << "s.mean: " << s.sequence_mean() << endl;
cout << "s.min: " << s.sequence_min() << endl;
cout << "s.max: " << s.sequence_max() << endl;
statistician b;
b.next_number(0.3);
b.next_number(-0.7);
b.next_number(3);
cout << "********************************" << endl;
cout << "b.length: " << b.sequence_length() << endl;
cout << "b.sum: " << b.sequence_sum() << endl;
cout << "b.last number: " << b.sequence_last() << endl;
cout << "b.mean: " << b.sequence_mean() << endl;
cout << "b.min: " << b.sequence_min() << endl;
cout << "b.max: " << b.sequence_max() << endl;
cout << "++++++++++++++++++++++++++++++++" << endl;
cout << "after +" << endl;
statistician c = s + b;
cout << "c.length: " << c.sequence_length() << endl;
cout << "c.sum: " << c.sequence_sum() << endl;
cout << "c.last number: " << c.sequence_last() << endl;
cout << "c.mean: " << c.sequence_mean() << endl;
cout << "c.min: " << c.sequence_min() << endl;
cout << "c.max: " << c.sequence_max() << endl;
return 0;
}
测试结果:
因为没有保存完整的输入序列,只能伪装出保存了的样子。即只关注那几个私有成员的值。
Reference:
整理自 Data Structures and Other Objects Using C++ ( Fourth Edition ) Michael Main, Walter Savitch. p120