【c++习题】【17/5/8】重载运算符
1、设计一个Complex(复数)类,完成如下要求:
该类具有实部(Real_Part)和虚部(Image_Part)
通过重载运算符“+”实现两个复数的相加
通过重载运算符“+”实现一个复数与一个数值的相加,其结果为复数的实部加上这个数值
重载“-”运算符,实现复数的减法。
重载“++”运算符,实现复数实部的自增
重载“>>”运算符和 “<<”运算符,实现复数的输入和输出
重载“==”,判断两个复数是否相等
提示:输入输出运算符只能重载为类的友元函数,形式如下
friend ostream &operator<<(ostream &os,const Complex &c); friend istream &operator>>(istream &is,Complex &c);
#include <cstdio>
#include <iostream.h> // vc 6.0
#include <string>
#include <cstring>
#include <vector>
// using namespace std; class Complex { friend ostream &operator<<(ostream &os,const Complex &c);
friend istream &operator>>(istream &is,Complex &c); friend Complex operator+(const Complex &c1,const Complex &c2);
friend Complex operator+(const Complex &c1,int num);
friend Complex operator-(const Complex &c1,const Complex &c2); friend bool operator==(const Complex &c1,const Complex &c2); public:
Complex(): r(), i() {}
Complex(int r, int i): r(r), i(i) {} Complex& operator++() {
++r;
return *this;
} const Complex operator++(int) {
r++;
return *this;
} private:
int r, i;
}; ostream &operator<<(ostream &os,const Complex &c) {
os << c.r << "+" << c.i << "i\n";
return os;
} istream &operator>>(istream &is,Complex &c) {
is >> c.r >> c.i;
return is;
} Complex operator+(const Complex &c1,const Complex &c2) {
Complex x;
x.r = c1.r + c2.r;
x.i = c1.i + c2.i;
return x;
} Complex operator+(const Complex &c1,int num) {
Complex x;
x.r = c1.r + num;
x.i = c1.i;
return x;
} Complex operator-(const Complex &c1,const Complex &c2) {
Complex x;
x.r = c1.r - c2.r;
x.i = c1.i - c2.i;
return x;
} bool operator==(const Complex &c1,const Complex &c2) {
if (c1.r == c2.r && c1.i == c2.i) return true;
return false;
} void testIO() {
Complex x(, );
cout << x;
cin >> x;
cout << x;
} void testAdd() {
Complex c1(, );
Complex c2(, );
cout << c1 - c2 + << endl;
} void testAdd2() {
Complex x1, x2;
x1 = x2++;
cout << x1 << endl;
// cout << x << endl;
} void testEqual() {
Complex x1, x2;
cout << (x1 == x2) << endl;
} int main()
{
// testIO();
// testAdd();
// testAdd2();*
testEqual();
return ;
}
2. 问题描述:有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数,而√2就为无理数。在C++中,并没有预先定义有理数,需要时可以定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中。对有理数的各种操作都可以用重载运算符来实现。
基本要求: 定义并实现一个有理数类,通过重载运算符+、-、*、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。写一个优化函数,它的作用是使有理数约去公分母(4/6=2/3),也即是使保存的有理数分子和分母之间没有公约数(除去1以外)。
Ⅰ、未重载运算符版
#include <iostream>
#include <cstdio>
#include <string>
using namespace std; class Number {
friend void print(Number& x);
friend int gcd(int a, int b);
private:
int m;
int n;
public:
Number(): m() {}
Number(int m, int n): m(m), n(n) {}
void add(Number& b) {
m = m * b.n + n * b.m;
n = n * b.n;
stdlize();
}
void minus(Number& b) {
m = m * b.n - n * b.m;
n = n * b.n;
stdlize();
}
void multi(Number& b) {
m = m * b.m;
n = n * b.n;
stdlize();
}
void divide(Number& b) {
m = m / b.m;
n = n / b.n;
stdlize();
}
void stdlize() {
int x = gcd(m, n);
m = m / x;
n = n / x;
}
}; int gcd(int a, int b)
{
int m = a, n = b, r = -;
while (r != ) {
r = m % n;
m = n;
n = r;
}
return m;
} void print(Number& x)
{
printf("%d/%d\n", x.m, x.n);
} int main()
{
// test add
printf("test add: 1/15 + 4/15 = ");
Number a(, );
Number b(, );
a.add(b);
print(a); // test minus
printf("test minus: 2/3 - 1/3 = ");
Number c(, );
Number d(, );
c.minus(d);
print(c); // test multi
printf("test multi: 2/4 * 4/3 = ");
Number e(, );
Number f(, );
e.multi(f);
print(e); // test divide
printf("test divide: 1/12 div 1/3 = ");
Number g(, );
Number h(, );
g.divide(h);
print(g); return ;
}
Ⅱ、重载运算符版(待)
3、自定义一个Array类,可以根据下标和上标分配空间,并自动判断是否溢出,定义函数实现对数据的赋值,删除等操作。自行编写测试函数实现可以对输入数组的下标和上标,根据其下标和上标分配内存空间并赋值,重载赋值运算符 << 与=可以实现将一个数组的输出与 a1=a2的操作。
#include <cstdio>
#include <iostream.h> // vc 6.0
#include <string>
#include <cstring>
#include <vector>
// using namespace std; class Array { friend istream &operator>>(istream &is, Array &arr);
friend ostream &operator<<(ostream &os, Array &arr); public:
Array(int begin, int end): begin(begin), end(end) {
arr = new int[end-begin+];
}
~Array() {
delete []arr;
}
private:
int *arr;
int begin, end;
}; istream &operator>>(istream &is, Array &arr) {
for (int i = arr.begin; i <= arr.end; ++i) {
is >> arr.arr[i-arr.begin];
}
return is;
} ostream &operator<<(ostream &os, Array &arr) {
for (int i = arr.begin; i <= arr.end; ++i) {
os << arr.arr[i-arr.begin] << " ";
}
os << endl;
return os;
} int main()
{
Array arr(,); // arr[0]. arr[1]
cin >> arr;
cout << arr; return ;
}
【c++习题】【17/5/8】重载运算符的更多相关文章
- YTU 2443: C++习题 复数类--重载运算符3+
2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec 内存限制: 128 MB 提交: 1368 解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...
- YTU 2442: C++习题 矩阵求和--重载运算符
2442: C++习题 矩阵求和--重载运算符 时间限制: 1 Sec 内存限制: 128 MB 提交: 1457 解决: 565 题目描述 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运 ...
- YTU 2441: C++习题 复数类--重载运算符2+
2441: C++习题 复数类--重载运算符2+ 时间限制: 1 Sec 内存限制: 128 MB 提交: 847 解决: 618 题目描述 定义一个复数类Complex,重载运算符"+ ...
- YTU 2440: C++习题 复数类--重载运算符+,-,*,/
2440: C++习题 复数类--重载运算符+,-,*,/ 时间限制: 1 Sec 内存限制: 128 MB 提交: 1189 解决: 774 题目描述 定义一个复数类Complex,重载运算符& ...
- YTU 2439: C++习题 复数类--重载运算符+
2439: C++习题 复数类--重载运算符+ 时间限制: 1 Sec 内存限制: 128 MB 提交: 1022 解决: 669 题目描述 定义一个复数类Complex,重载运算符"+ ...
- C++习题 复数类--重载运算符2+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...
- C++习题 复数类--重载运算符+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...
- 第十五周oj刷题——Problem M: C++习题 矩阵求和--重载运算符
Description 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<&quo ...
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...
随机推荐
- 【BZOJ】3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=3400 既然是倍数我们转换成mod.. 设状态f[i][j]表示前i头牛modj的方案 那么答案显然是 ...
- linux memcache 安装
一,安装所要的软件 wget http://www.monkey.org/~provos/libevent-1.2.tar.gz #下载libevent 下面是下载memcache服务哭端memcac ...
- apache 一个站点配置多个域名
<VirtualHost *:80> ServerAdmin i@kuigg.com DocumentRoot /www/kuigg.com ServerName kuigg.com ...
- Unittest框架概念
1.测试脚手架(test fixture): 测试准备前要做的工作和测试执行完后要做的工作(包括setUp()和tearDown()) 2.测试用例(test case): 最小的测试单元 3.测试套 ...
- Angular2 初识
AppComponent 壳的三个实现文件: app.component.ts— 组件的类代码,这是用 TypeScript 写的. app.component.html— 组件的模板,这是用 HTM ...
- Linux下搜索文件find、which、whereis、locate
Linux下搜索文件find.which.whereis.locate: - which 寻找“执行文件” - -a 将所有可找到的命令均列出,而不仅仅列出第一个找到的命令名称 - whereis 寻 ...
- 烂笔头-Spring3
1.spring相关jar包的导入 2.配置文件bean.xml <?xml version="1.0" encoding="UTF-8"?> &l ...
- MySQL中的注释(有三种)
MysQL支持三种注释: .#... (推荐这种,具有通性) ."-- ..." (注意--后面有一个空格) ./*...*/
- android自定义控件(一)MeasureSpec 与 ListView.onMeasure
A MeasureSpec encapsulates the layout requirements passed from parent to child. Each MeasureSpec rep ...
- Linux学习笔记(7)CRT实现windows与linux的文件上传下载
Linux学习笔记(7)CRT实现windows与linux的文件上传下载 按下Alt + p 进入SFTP模式,或者右击选项卡进入 命令介绍 help 显示该FTP提供所有的命令 lcd 改变本地上 ...