文章目录
编程语言
C++
运算符的重载
21、定义复数类,并使用运算符重载来实现其功能
问题描述
定义一个复数类Complex,重载运算符+,使之能用于复数的加法。运算符的重载函数作为Complex类的成员函数,求两个复数的和。
参考代码
#include <iostream>
using namespace std;
class Complex
{
private:
double real;
double imag;
public:
Complex()
{
}
Complex(Complex &c1)
{
real = c1.real;
imag = c1.imag;
}
Complex(double x, double y)
{
real = x;
imag = y;
}
friend Complex operator+(Complex &c1, Complex &c2)
{
Complex a(c1.real + c2.real, c1.imag + c2.imag);
return a;
}
friend Complex operator-(const Complex &c1, const Complex &c2)
{
Complex a(c1.real - c2.real, c1.imag - c2.imag);
return a;
}
friend Complex operator*(const Complex &c1, const Complex &c2)
{
Complex a(c1.real * c2.real - c1.imag * c2.imag, c1.real * c2.imag + c1.imag * c2.real);
return a;
}
friend Complex operator/(const Complex &c1, const Complex &c2)
{
if (c2.real == 0 && c2.imag == 0)
{
Complex a(0, 0);
return a;
}
else
{
Complex a(((c1.real * c2.real + c1.imag * c2.imag) / (c2.real * c2.real + c2.imag * c2.imag)), ((c1.imag * c2.real - c1.real * c2.imag) / (c2.real * c2.real + c2.imag * c2.imag)));
return a;
}
}
friend void operator+=(Complex &c1, Complex &c2)
{
c1.real = c1.real + c2.real;
c1.imag = c1.imag + c2.imag;
}
friend ostream &operator<<(ostream &output, const Complex &c1)
{
if (c1.imag >= 0)
output << c1.real << "+" << c1.imag << "i" << endl;
else
output << c1.real << c1.imag << "i" << endl;
return output;
}
};
int main()
{
double a, b, c, d;
cin >> a >> b >> c >> d;
Complex c1(a, b), c2(c, d);
Complex c3;
c3 = c1 + c2;
cout << c3;
}
22、重载运算符使之能进行复数的运算
问题描述
下面是一个用来表达复数的类Complex的部分代码.该类包含两个私有double型成员变量,分别代表复数的实部和虚部,默认为0。
class Complex {
private:
double real;
double img;
public:
//..
Complex operator + (const Complex & other) //….
};
请按要求补全该类其他代码。
该类需有完备的类构造函数,至少支持Complex a; Complex b(a); Complex c(4, 5); 这三种定义Complex类对象的方式。重载操作符+, +=, , 分别完成两个复数的加法和乘法,其中操作符的重载必须用友元函数的形式完成。
补全该类后,对于如下的main函数,要求其能通过编译,并正常运行。
int main () {
Complex c2(2., 3.), c3 = c2 + Complex(1., 2.),c1(c2);
Complex c4;
c4 += c2 * c3 + c2;
cout << c1 << c2 << c3 << c4;
return 0;
}
参考代码
#include <iostream>
using namespace std;
class Complex
{
private:
double real;
double img;
public:
Complex(double real = 0, double img = 0);
Complex(const Complex &c2)
{
real = c2.real;
img = c2.img;
}
Complex operator+(const Complex &other)
{
Complex c;
c.real = real + other.real;
c.img = img + other.img;
return c;
}
Complex operator+=(const Complex &c1)
{
*this = *this + c1;
return *this;
}
friend Complex operator*(Complex &c1, Complex &c2)
{
return Complex((c1.real * c2.real - c1.img * c2.img), (c1.img * c2.real + c1.real * c2.img));
}
friend ostream &operator<<(ostream &output, Complex &c)
{
if (c.img >= 0)
output << c.real << "+" << c.img << "i" << endl;
else
output << c.real << c.img << "i" << endl;
return output;
}
};
Complex::Complex(double a, double b)
{
real = a;
img = b;
}
int main()
{
Complex c2(2., 3.), c3 = c2 + Complex(1., 2.), c1(c2);
Complex c4;
c4 += c2 * c3 + c2;
cout << c1 << c2 << c3 << c4;
return 0;
}
类和对象的特性
23、将普通函数声明为友元并使用它输出日期与时间
问题描述
顺序定义时间类Time与日期类Date。其中,Time拥有私有数据hour, minute, second,以及友元函数display;Date拥有私有数据day, month, year,以及友元函数display。在类外定义display函数并实现它,display函数接收一个Time类和一个Date类的引用,并将其按照格式输出。 运行时依次从键盘输入day, month, year,hour, minute, second,最后调用display函数将其全部按格式输出。
参考代码
#include <iostream>
using namespace std;
class Date;
class Time
{
private:
int hour, minute, second;
public:
Time(int a, int b, int c)
{
hour = a;
minute = b;
second = c;
}
friend void display(Date &d, Time &t);
};
class Date
{
private:
int day, month, year;
public:
Date(int a, int b, int c)
{
day = a;
month = b;
year = c;
}
friend void display(Date &d, Time &t);
};
void display(Date &d, Time &t)
{
cout << d.day << "/" << d.month << "/" << d.year << "" << t.hour << ":" << t.minute << ":" << t.second << endl;
}
int main()
{
int a, b, c, d, e, f;
cin >> a >> b >> c >> d >> e >> f;
Time t(d, e, f);
Date dd(a, b, c);
display(dd, t);
return 0;
}
24、使用友元成员函数输出日期与时间
问题描述
顺序声明时间类Time与日期类Date。其中Time拥有私有数据hour, minute, second,以及公有函数display(接收一个Date的引用作为参数);Date拥有私有数据day, month, year,以及友元函数display(要求声明Time中的display函数为Date的友元成员函数)。运行时依次从键盘输入day, month, year,hour, minute, second,最后调用Time的display函数将其全部按格式输出。
参考代码
#include <iostream>
using namespace std;
class Date;
class Time
{
private:
int hour, minute, second;
public:
Time(int a, int b, int c)
{
hour = a;
minute = b;
second = c;
}
void display(Date &t);
};
class Date
{
private:
int day, month, year;
public:
Date(int a, int b, int c)
{
day = a;
month = b;
year = c;
}
friend void Time::display(Date &);
};
void Time::display(Date &t)
{
cout << t.day << "/" << t.month << "/" << t.year << "" << hour << ":" << minute << ":" << second << endl;
}
int main()
{
int a, b, c, d, e, f;
cin >> a >> b >> c >> d >> e >> f;
Time t(d, e, f);
Date dd(a, b, c);
t.display(dd);
return 0;
}
25、使用友元函数输出时间
问题描述
现有一时间类Time,拥有私有成员hour, minute, second,以及一友元函数display。display以引用的方式接收一个Time对象,并以hour:minute:second的格式来输出时间。
参考代码
#include <iostream>
using namespace std;
class Time
{
private:
int hour, minute, second;
public:
Time(int a, int b, int c)
{
hour = a;
minute = b;
second = c;
}
friend void display(Time &t)
{
cout << t.hour << ":" << t.minute << ":" << t.second;
}
};
int main()
{
int a, b, c;
cin >> a >> b >> c;
Time t(a, b, c);
display(t);
return 0;
}
26、使用指针传参找到成绩最高的学生
问题描述
现有一批学生(共5人,其类名为Student)的数据需要存放,包括私有数据成绩(名为score),数据从键盘输入。要求使用名为arr的对象静态数组存放这5个学生的数据,并使用名为sp的对象指针指向其对象数组的首地址(要求使用取地址符),最后将该指针传递给max函数(指针在max中的形参名为p),找出5个学生中成绩最高者并输出其成绩。
参考代码
#include <iostream>
using namespace std;
class Student
{
private:
int score;
public:
Student(int a)
{
score = a;
}
Student()
{
score = 0;
}
friend Student max(Student *p);
void display()
{
cout << score;
}
};
Student max(Student *p)
{
Student s;
for (int i; i < 5; i++, p++)
if (s.score < p->score)
{
s = *p;
}
return s;
}
int main()
{
int a, b, c, d, e;
cin >> a >> b >> c >> d >> e;
Student s1(a), s2(b), s3(c), s4(d), s5(e);
Student arr[5];
arr[0] = s1;
arr[1] = s2;
arr[2] = s3;
arr[3] = s4;
arr[4] = s5;
Student *sp;
sp = &arr[0];
Student aa = max(sp);
aa.display();
return 0;
}
27、用指针输出学生信息
问题描述
现有一批学生(共5人,其类名为Student)的数据需要存放,包括私有数据成绩(名为score),数据从键盘输入。要求使用名为arr的对象数组(要求动态分配)存放这5个学生的数据,并使用名为sp的对象指针指向其对象数组的首地址(要求使用取地址符),随后有序输出第1、3、5个学生的数据。
参考代码
#include <iostream>
using namespace std;
class Student
{
private:
int score;
public:
Student(int a)
{
score = a;
}
Student()
{
score = 0;
}
void display()
{
cout << score << " ";
}
};
int main()
{
int a, b, c, d, e;
cin >> a >> b >> c >> d >> e;
Student s1(a), s2(b), s3(c), s4(d), s5(e);
Student *arr = new Student[5];
if (!arr)
cout << "内存分配失败";
else
{
arr[0] = s1;
arr[1] = s2;
arr[2] = s3;
arr[3] = s4;
arr[4] = s5;
Student *sp;
sp = &arr[0];
sp->display();
(sp + 2)->display();
(sp + 4)->display();
delete[] sp;
sp = NULL;
}
return 0;
}
28、统计学生平均成绩,要求使用静态成员函数
问题描述
现有一批学生(其类名为Student)成绩(均为整数)需要统计,要求使用类内静态公有函数(函数名为average)求出这批学生的平均成绩(学生人数并不确定)。在输入成绩时,先输入一个整数,表示学生总人数,然后再输入相应个数学生成绩,并将这些数据都存入一个名为arr的数组中,该数组必须使用new动态开辟,最后输出学生的平均成绩。(结果要求保留1位小数,检测内存分配是否成功需使用NULL)
参考代码
#include <iostream>
#include <iomanip>
using namespace std;
class Student
{
private:
int score;
public:
Student(int a)
{
score = a;
}
Student()
{
score = 0;
}
int get()
{
return score;
}
static float average(int n, Student arr[])
{
int a;
for (int i = 0; i < n; i++)
{
a += arr[i].get();
}
return (float)a / n;
}
};
int main()
{
int a, b;
cin >> a;
Student *arr = new Student[a];
for (int i; i < a; i++)
{
cin >> b;
arr[i] = Student(b);
}
if (arr == NULL)
cout << "xx";
cout << setiosflags(ios::fixed) << setprecision(1);
cout << Student::average(a, arr);
delete arr;
return 0;
}
29、利用面向对象的思想求解长方体体积
问题描述
有一个长方体类,其类名为box, 其私有数据成员包括length(长)、width(宽)、height(高)以及一个名为volume的公有成员函数,volume函数用来计算长方体的体积。现有3个长方体,存储在一个名为arr的静态对象数组中,3个长方体的长、宽、高(三者均为整数)从键盘分别输入,要求使用名为bp的指针指向这个数组的首地址(要求使用数组名),并有序输出三个长方体的体积,体积的计算须使用volume函数。
参考代码
#include <iostream>
#include <iomanip>
using namespace std;
class box
{
private:
int length, width, height;
public:
box(int a, int b, int c) : length(a), width(b), height(c)
{
}
box() : length(0), width(0), height(0)
{
}
int volume()
{
return height * length * width;
}
};
int main()
{
int a, b, c, d, e, f, g, h, i;
cin >> a >> b >> c >> d >> e >> f >> g >> h >> i;
box a1(a, b, c), a2(d, e, f), a3(g, h, i);
box arr[3];
arr[0] = a1;
arr[1] = a2;
arr[2] = a3;
box *bp = arr;
cout << bp[0].volume() << " ";
cout << bp[1].volume() << " ";
cout << bp[2].volume() << " ";
bp = NULL;
return 0;
}
30、利用面向对象的思想求解长方体体积
问题描述
有一个长方体类,其类名为box, 其私有数据成员包括length(长)、width(宽)、height(高)以及一个名为volume的公有成员函数,volume函数用来计算长方体的体积。现有3个长方体,存储在一个名为arr的静态对象数组中,3个长方体的长、宽、高(三者均为整数)从键盘分别输入,要求有序输出三个长方体的体积。
参考代码
#include <iostream>
#include <iomanip>
using namespace std;
class box
{
private:
int length, width, height;
public:
box(int a, int b, int c) : length(a), width(b), height(c)
{
}
box() : length(0), width(0), height(0)
{
}
int volume()
{
return height * length * width;
}
};
int main()
{
int a, b, c, d, e, f, g, h, i;
cin >> a >> b >> c >> d >> e >> f >> g >> h >> i;
box a1(a, b, c), a2(d, e, f), a3(g, h, i);
box arr[3];
arr[0] = a1;
arr[1] = a2;
arr[2] = a3;
box *bp;
bp = &arr[0];
cout << bp[0].volume() << " ";
cout << bp[1].volume() << " ";
cout << bp[2].volume() << " ";
bp = NULL;
return 0;
}
原创声明
文章作者:Zam9036
文章链接:https://zam9036.gitee.io/2019/11/20/17-Object-oriented-technical-problem-classification-example-3
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自Zam9036的博客!