0

次のことを行う OOP クラス用のプログラムを作成しました。

  1. 複素数を表すクラスを定義します。
  2. コンストラクターを使用して、複素数オブジェクトを初期化します。
  3. 関数から複素数オブジェクトを渡したり返したりします。
  4. ドライバーで複素数クラスをテストします。
  5. 必要に応じて、複素数を加算および減算します。

私のプログラムは次のように機能します。

  1. 複素数の実部と虚部の値を入力するようにユーザーに求めます。
  2. ユーザーが指定した値を ComplexNumber コンストラクターへのパラメーターとして使用して、ComplexNumber オブジェクトを作成します。
  3. スタンドアロンの print 関数を使用して、複素数オブジェクトの値を出力します。

ただし、この要件には少し混乱しています。

static void printComplexNumber(ComplexNumber n)

この関数は、フォームのパラメーターとして渡された複素数オブジェクトを出力します。realPart + imaginaryPart i

は、負のrealPart場合にのみ署名する必要があります。realPartとの間の符号は、imaginaryPartが正の場合imaginaryPartは正、 が負の場合imaginaryPartは負でなければなりません。実数部がゼロの場合、虚数部のみを正しい符号で出力します。虚部がゼロの場合、実部のみを出力します。虚部が 1 に等しい場合は、虚部の記号iを出力します。

これが私の質問です。いつ何を印刷するかを決定するための最良の(最も効率的で、明確で、簡潔な)方法は何ですか?

私の印刷方法の私のコード:

static void PrintComplexNumber(ComplexNumber n)
{
    // what's the best thing to do here to determine what to print? 
    // if-else?
    // to get my real value and complex value, I have methods of the
    // ComplexNumber class entitled: GetRealPart(), and GetComplexPart().
}
4

3 に答える 3

1

私はあなたの根底にある質問に答えるつもりです。それはこのような混乱したり複雑な条件があるときに何をすべきかです:あなたは体系的な方法でそれを解決することができます。

私がやっていることは、最初にそれを部分に分割することです。どれほど冗長であるかは関係ありません(時間がある限り)。たとえば、出力を次のように分割するとします。

[RealSign] [RealPart] [ImSign] [ImPart] [iSymbol]

次に、ルールを書き留めて、それぞれがいつ表示されるかを分析します。

  • RealSign:RealPart <0
  • RealPart:RealPart <> 0
  • ImSign:ImPart <> 0
  • ImPart:ImPart <> 0 || ImPart <> 1
  • iSymbol:ImPart <> 1

ここから、単純化を開始できます。

于 2009-12-03T05:32:00.533 に答える
1

これらのメソッドを呼び出して、実数部分と複素数部分 (整数または浮動小数点数だと思いますか?) を早い段階で格納します。次に、if-else ロジックを使用して必要なものを見つけます。

ほとんどの場合、ロジック用に設計しているだけでパフォーマンスが高くないような場合 (...または、実際に実際に記述しなければならないものでさえあります!) if-else ステートメントだけで十分です。必要。

私のアドバイス:

  • 考えすぎないでください。if-else を記述して、説明の各文を実装するだけです (該当する場合)。コンパイラはそれをかなり高速にします。
  • if ロジックを (正確に) どのように記述すればよいかわからない場合は、何かを記述してテストし、間違いを発見したときにロジックを改良してください。

あなたはプログラミングに少し慣れていないと思うので、一般的なアドバイスを追加させてください...

  • 何よりも、ストレスをためないでください。真剣に。詳細に行き詰まると、速度が低下するだけです。特定の構文の使い方がわからない場合は、調べて例を見つけてみてください。そして、すでに行っているように、質問することを恐れないでください。

結局のところ、プログラミングに慣れていない場合 (おそらく C# だけですか?)、私の謝罪を受け入れてください。私は見下すつもりはありません。

編集:コメントの後、回答を編集することにしました。

あなたはすでにテスト段階にいます (上で述べたように、あなたは何かを書きました)。素晴らしいスタート。次に、改良する必要があります。

あなたの問題はダブルマイナスですよね?いくつかのオプションがあります。

1 つ目は、記号と実際の部分の間にスペースが必要な場合 (要件では、これが可能であることが示唆されています)、実際の部分の直前にある負の記号は、スペースなしでタグ付けされるため使用できません。したがって、ある種の絶対値関数を使用して、数値を (一時的に) 正にすることができます。

このようなもの(疑似コード、申し訳ありませんが、C#をよく知らないので):

double complexPart = getComplexPart();
double realPart = getRealPart();

bool realIsNegative = false;
if (Math.abs(realPart) != realPart) realIsNegative = true;

print complexPart + " ";
if (realIsNegative) print "- ";
else print "+ ";
print Math.abs(realPart);

少し扱いに​​くいので、条件付き三項演算子やより適切なインデントなどを使用すると、よりきれいになる可能性があります。しかし、うまくいけば、それはある程度理にかなっていて、あなたが始めるきっかけになるでしょう.

于 2009-12-03T04:40:31.010 に答える
0

符号条件については、ToString() をformattingで使用できます。これにより、if - else で処理できるゼロと 1 つのケースが残ります。

于 2009-12-03T04:42:11.910 に答える