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】重载运算符的更多相关文章

  1. YTU 2443: C++习题 复数类--重载运算符3+

    2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1368  解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...

  2. YTU 2442: C++习题 矩阵求和--重载运算符

    2442: C++习题 矩阵求和--重载运算符 时间限制: 1 Sec  内存限制: 128 MB 提交: 1457  解决: 565 题目描述 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运 ...

  3. YTU 2441: C++习题 复数类--重载运算符2+

    2441: C++习题 复数类--重载运算符2+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 847  解决: 618 题目描述 定义一个复数类Complex,重载运算符"+ ...

  4. YTU 2440: C++习题 复数类--重载运算符+,-,*,/

    2440: C++习题 复数类--重载运算符+,-,*,/ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1189  解决: 774 题目描述 定义一个复数类Complex,重载运算符& ...

  5. YTU 2439: C++习题 复数类--重载运算符+

    2439: C++习题 复数类--重载运算符+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1022  解决: 669 题目描述 定义一个复数类Complex,重载运算符"+ ...

  6. C++习题 复数类--重载运算符2+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...

  7. C++习题 复数类--重载运算符+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...

  8. 第十五周oj刷题——Problem M: C++习题 矩阵求和--重载运算符

    Description 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<&quo ...

  9. C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】

    重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...

随机推荐

  1. c#上传大文件方法

    客户端代码: /// <summary> /// 将本地文件上传到指定的服务器(HttpWebRequest方法) /// </summary> /// <param n ...

  2. gibhub上搭建个人静态网站介绍

    之前学习过git的基本命令.今天介绍一下github上搭建个人网站的步骤. 在window系统上搭建gibhub个人网站(只能执行html.css和js文件),这就是纯静态页面. 步骤一:注册gith ...

  3. 【Raspberry pi】python ide-spyder

    sudo apt-get install spyder 简单 明了

  4. Android上传图片(PHP服务器)

    原理 Android客户端模拟一个HTTP的Post请求到服务器端,服务器端接收相应的Post请求后,返回响应信息给给客户端. PHP服务器 <?php move_uploaded_file($ ...

  5. Alpha matting算法发展

    一.抠图算法简介 Alpha matting算法研究的是如何将一幅图像中的前景信息和背景信息分离的问题,即抠图.这类问题是数字图像处理与数字图像编辑领域中的一类经典问题,广泛应用于视频编缉与视频分割领 ...

  6. Django 后台 无法显示文章标题

    我们会发现所有的文章都是叫 **object,这样肯定不好,比如我们要修改,如何知道要修改哪个呢? 我们修改一下 blog 中的models.py # coding:utf-8 from django ...

  7. thrift框架总结,可伸缩的跨语言服务开发框架

    thrift框架总结,可伸缩的跨语言服务开发框架 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其 ...

  8. 把配置和环境解耦 eliminate “works on my machine” problems when collaborating on code with co-workers docker架构与解决的问题

    Docker实践 - 懒人的技术笔记 - 博客频道 - CSDN.NET  http://blog.csdn.net/lincyang/article/details/43055061 Docker直 ...

  9. Vue1.0常用语法

    摘要: var vm = new Vue({ el: "选择器", 挂载到页面的那个元素里,即确定vue的作用范围 外部可通过vm.$el访问,得到的是一个原生dom元素,可进行对 ...

  10. <2014 08 29> MATLAB的软件结构与模块、工具箱简示

    MATLAB的系统结构:三个层次.九个部分 ----------------------------------- 一.基础层 是整个系统的基础,核心内容是MATLAB部分. 1.软件主包MATLAB ...