zoukankan      html  css  js  c++  java
  • 【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(0), i(0) {}
        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
    ";
        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(3, 2);
        cout << x;
        cin >> x;
        cout << x;
    }
    
    void testAdd() {
        Complex c1(2, 2);
        Complex c2(3, 3);
        cout << c1 - c2 + 1 << 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 0;
    }

    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(0) {}
        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 = -1;
        while (r != 0) {
            r = m % n;
            m = n;
            n = r;
        }
        return m;
    }
    
    void print(Number& x)
    {
        printf("%d/%d
    ", x.m, x.n);
    }
    
    int main()
    {
        // test add
        printf("test add: 1/15 + 4/15 = ");
        Number a(1, 15);
        Number b(4, 15);
        a.add(b);
        print(a);
    
        // test minus
        printf("test minus: 2/3 - 1/3 = ");
        Number c(2, 3);
        Number d(1, 3);
        c.minus(d);
        print(c);
    
        // test multi    
        printf("test multi: 2/4 * 4/3 = ");
        Number e(2, 4);
        Number f(4, 3);
        e.multi(f);
        print(e);
    
        // test divide
        printf("test divide: 1/12 div 1/3 = ");
        Number g(1, 12);
        Number h(1, 3);
        g.divide(h);
        print(g);
    
        return 0;
    }
    
    
     
     

    Ⅱ、重载运算符版(待)

    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+1];
        }
        ~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(0,1); // arr[0]. arr[1]
        cin >> arr;
        cout << arr;
        
        return 0;
    }
  • 相关阅读:
    极大似然法估计
    概率统计
    打怪升级必备书单
    嵌入式运用的思路
    清华大学保研笔试题
    使用ffmpeg将海康视频rtsp转为hls
    Linux基础系统权限
    Ubuntu使用tzselect修改时区
    Apache mod_rewrite规则重写的标志说明
    Postgresql导出指定的数据表
  • 原文地址:https://www.cnblogs.com/xkxf/p/6826664.html
Copyright © 2011-2022 走看看