0

課題の期限が迫っていますが、その課題が実際に私に何を求めているのか、またはどのように進めればよいのか理解できません。複素数とは何かは知っていますが、C++ および Python バージョンの次の操作が何をすべきか理解できません。

op: Complex × Complex → Complex 
op: Complex × double → Complex 
op: double × Complex → Complex 

ダブル?double がこれに入る場所がわかりません。また、python バージョンはコンプレックスを文字列に変換する必要がありますが、これが何を求めているのかわかりません。複合体(整数?)を文字列データ型に文字通り変換すると言っていますか? プログラミングを試みることができるように、割り当てが何を求めているのかを理解するのを手伝ってくれるかどうか教えてください.

複素数クラス

複素数を表し、加算、減算、乗算、除算などの重要な演算をサポートするクラスを C++、Java、および Python で設計します。C++ および Python のバージョンでは、操作ごとに次の関数を実装する必要があります。

op: Complex × Complex → Complex
op: Complex × double → Complex  op:
double × Complex → Complex

op は +、-、*、または / のいずれかです。さらに、このタイプのオブジェクトを出力するには、ストリーム挿入演算子 << をオーバーロードする必要があります。double から Complex への暗黙的な変換を可能にするために、代入演算子をオーバーロードするだけでなく、コンストラクターを定義する必要があります。適切と思われるその他の方法も含める必要があります。クラスが完成すればするほど、より良いものになります。

Java では演算子のオーバーロードやフレンド関数が許可されていないため、Java バージョンにはそれほど多くのメソッドはありません。繰り返しますが、Java クラスは完成度が高いほど良いです。toString() メソッドをオーバーライドします。

Python バージョンには、複合体から文字列に変換する関数も含める必要があります。

このプロジェクトに必要なファイルは、complex クラスの宣言を含む complex.h ファイル、complex クラスで宣言されたメソッドと関数の実装を含む complex.cc ファイル、複素数をインスタンス化する main.cc、およびすべてのメソッドと関数、Java 実装である Complex.java ファイル、Complex クラスのすべてのメソッドをインスタンス化してテストする Main.java ファイルをテストします。必要な python ファイルは、complex.py ファイルです。

彼は次のコードを提供してくれました。

/*
 *
 *  Java version
 *
 */

/* Main.java */

public class Main {

    public static void main(String[] args) {

        Rational a = new Rational(1, 2);
        Rational b = new Rational(2, 3);

        int i = 5;

        System.out.println(a + " + " + b + " = " + a.add(b));
        System.out.println(a + " - " + b + " = " + a.sub(b));
        System.out.println(a + " * " + b + " = " + a.mul(b));
        System.out.println(a + " / " + b + " = " + a.div(b));

        System.out.println(a + " + " + i + " = " + a.add(i));
        System.out.println(a + " - " + i + " = " + a.sub(i));
        System.out.println(a + " * " + i + " = " + a.mul(i));
        System.out.println(a + " / " + i + " = " + a.div(i));
    }
}

/* Rational.java */

public class Rational {

    public Rational() {

        this(0);
    }

    public Rational(int num) {

        this(num, 1);
    }

    public Rational(int num, int den) {

        this.num = num;
        this.den = den;
    }

    public Rational add(Rational o) {

        return new Rational(num * o.den + o.num * den, den * o.den);
    }

    public Rational add(int n) {

        return new Rational(num + n * den, den);
    }

    public Rational div(Rational o) {

        return new Rational(num * o.den, den * o.num);
    }

    public Rational div(int n) {

        return new Rational(num, den * n);
    }

    public Rational mul(Rational o) {

        return new Rational(num * o.num, den * o.den);
    }

    public Rational mul(int n) {

        return new Rational(num * n, den);
    }

    public Rational sub(Rational o) {

        return new Rational(num * o.den - o.num * den, den * o.den);
    }

    public Rational sub(int n) {

        return new Rational(num - n * den, den);
    }

    public String toString() {

        return "(" + num + " / " + den + ")";
    }

    private int den;
    private int num;
}

/*
 *
 *  C++ version
 *
 */

/* rational.h */

#ifndef RATIONAL_H
#define RATIONAL_H

#include <iostream>

using std::ostream;

struct rational {

    rational(int = 0, int = 1);

    rational operator+(const rational &) const;
    rational operator-(const rational &) const;
    rational operator*(const rational &) const;
    rational operator/(const rational &) const;

    rational operator+(int) const;
    rational operator-(int) const;
    rational operator*(int) const;
    rational operator/(int) const;

    friend rational operator+(int, const rational &);
    friend rational operator-(int, const rational &);
    friend rational operator*(int, const rational &);
    friend rational operator/(int, const rational &);

    friend ostream &operator<<(ostream &, const rational &);

private:

    int den;
    int num;
};

#endif /* RATIONAL_H */

/* rational.cc */

#include <iostream>
#include "rational.h"

rational::rational(int num, int den) : num(num), den(den) {}

rational rational::operator+(const rational &o) const {

    return rational(num * o.den + o.num * den, den * o.den);
}

rational rational::operator+(int n) const {

    return rational(num + n * den, den);
}

rational rational::operator-(const rational &o) const {

    return rational(num * o.den - o.num * den, den * o.den);
}

rational rational::operator-(int n) const {

    return rational(num - n * den, den);
}

rational rational::operator*(const rational &o) const {

    return rational(num * o.num, den * o.den);
}

rational rational::operator*(int n) const {

    return rational(num * n, den);
}

rational rational::operator/(const rational &o) const {

    return rational(num * o.den, den * o.num);
}

rational rational::operator/(int n) const {

    return rational(num, den * n);
}

rational operator+(int n, const rational &o) {

    return o + n;
}

rational operator-(int n, const rational &o) {

    return rational(n) - o;
}

rational operator*(int n, const rational &o) {

    return o * n;
}

rational operator/(int n, const rational &o) {

    return rational(n) / o;
}

ostream &operator<<(ostream &out, const rational &o) {

    out << '(' << o.num << " / " << o.den << ')';
    return out;
}

/* main.cc */

#include <iostream>
#include "rational.h"

using std::cout;
using std::endl;

int main(void) {

    rational a(1, 2);
    rational b(2, 3);

    int i = 5;

    cout << a << " + " << b << " = " << a + b << endl;
    cout << a << " - " << b << " = " << a - b << endl;
    cout << a << " * " << b << " = " << a * b << endl;
    cout << a << " / " << b << " = " << a / b << endl;

    cout << a << " + " << i << " = " << a + i << endl;
    cout << a << " - " << i << " = " << a - i << endl;
    cout << a << " * " << i << " = " << a * i << endl;
    cout << a << " / " << i << " = " << a / i << endl;

    cout << i << " + " << a << " = " << i + a << endl;
    cout << i << " - " << a << " = " << i - a << endl;
    cout << i << " * " << a << " = " << i * a << endl;
    cout << i << " / " << a << " = " << i / a << endl;

    return 0;
}

#
#
# Python version
#
#

class rational:
    def __init__(self, num=0, den=1):
        self.num = num
        self.den = den

    def __add__(self, other):
        if isinstance(other, int):
            return rational(self.num + other * self.den, self.den)
        elif isinstance(other, rational):
            return rational(self.num * other.den + other.num * self.den, self.den * other.den)
        else:
            raise TypeError

    def __truediv__(self, other):
        if isinstance(other, int):
            return rational(self.num, self.den * other)
        elif isinstance(other, rational):
            return rational(self.num * other.den, self.den * other.num)
        else:
            raise TypeError

    def __float__(self):
        return float(self.num) / self.den

    def __int__(self):
        return self.num / self.den

    def __mul__(self, other):
        if isinstance(other, int):
            return rational(self.num * other, self.den)
        elif isinstance(other, rational):
            return rational(self.num * other.num, self.den * other.den)
        else:
            raise TypeError

    def __radd__(self, other):
        return self + other

    def __rtruediv__(self, other):
        return rational(other) / self

    def __rmul__(self, other):
        return self * other

    def __rsub__(self, other):
        return rational(other) - self

    def __str__(self):
        return '(' + str(self.num) + ' / ' + str(self.den) + ')'

    def __sub__(self, other):
        if isinstance(other, int):
            return rational(self.num - other * self.den, self.den)
        elif isinstance(other, rational):
            return rational(self.num * other.den - other.num * self.den, self.den * other.den)
        else:
            raise TypeError

if __name__ == '__main__':

    a = rational(1, 2)
    b = rational(2, 3)

    i = 5

    print('%s + %s = %s' % (a, b, a + b))
    print('%s - %s = %s' % (a, b, a - b))
    print('%s * %s = %s' % (a, b, a * b))
    print('%s / %s = %s' % (a, b, a / b))

    print('%s + %i = %s' % (a, i, a + i))
    print('%s - %i = %s' % (a, i, a - i))
    print('%s * %i = %s' % (a, i, a * i))
    print('%s / %i = %s' % (a, i, a / i))

    print('%i + %s = %s' % (i, a, i + a))
    print('%i - %s = %s' % (i, a, i - a))
    print('%i * %s = %s' % (i, a, i * a))
    print('%i / %s = %s' % (i, a, i / a))
4

4 に答える 4

0

double がこれに入る場所がわかりません。

複雑な値ではなく、単純なdouble浮動小数点値であると思います。

また、python バージョンはコンプレックスを文字列に変換する必要がありますが、これが何を求めているのかわかりません。

Complex というカスタム クラスの代わりに String を使用するとします。

複合体(整数?)を文字列データ型に文字通り変換すると言っていますか?

別段のことを知らない限り、私はそう仮定します。

于 2012-12-12T09:38:30.150 に答える
0

割り当てが言うとき

op: Complex × Complex → Complex op: Complex × double → Complex op: double × Complex → Complex op は +、-、*、または / のいずれかです。

これは、複素数の対の間、および実数と複素数の混合対の間でも、すべてのバイナリ演算を実装する必要があることを意味します。たとえば、

*: コンプレックス × ダブル → コンプレックス

次のように書く必要があります。

Complex operator*(Complex z, double t) {
  return Complex(t * z.Real(), t * z.Imag()); 
}
于 2013-01-20T20:46:05.717 に答える
0

文字列への変換は、数値を人間が読める形式で表示するだけです。それは合理的なクラスにあります:return "(" + num + " / " + den + ")";例えば印刷します(5 / 8)。あなたの複雑なクラスは toString メソッドを出力することができます( 5 + 8i )

複素数に数値を掛けること (double) は有効な演算であり、結果として別の複素数が得られます。

複素数に実数を掛ける:

(x + yi) u = xu + yu i.

彼が与えたコードを使用すると、有理数 (num と den の 2 つの数として定義される) に対してまったく同じ割り当てが完了します。そのコードを、数のカップルとしても定義されている複素数に適合させる必要があります。

PS ヒント: http://www.clarku.edu/~djoyce/complex/mult.html

于 2012-12-12T09:37:12.357 に答える
0

複素数には実数部と虚数部が含まれ、どちらも double として格納されます。あなたはすでにこれらについて知っていると言うので、詳細には触れませんが、簡単なグーグルで、あなたがほとんど求めている複素数クラスの多くの Java 実装を明らかにします。

http://introcs.cs.princeton.edu/java/97data/Complex.java.html

私が以前に使用した例であり、あなたが求めているものに適合しています:

public Complex times(Complex b)
public Complex times(double alpha)

これらのメソッドは、実部と虚部に適用する複素数またはアルファを取り、複素数を返します。

Python の文字列部分については、実数部と虚数部を取り、人間が読める形式で表現してほしいと思っていると思います: 文字列

私がmd_5を助けてくれることを願っています

于 2012-12-12T09:39:41.897 に答える