Использование логики принятия решений для удовлетворения этих требований? - PullRequest
0 голосов
/ 03 декабря 2009

Я создал программу для своего класса ООП, которая выполняет следующие действия:

  1. Определяет класс для представления комплексных чисел.
  2. Использует конструктор для инициализации объекта Complex Number.
  3. Пропускает и возвращает объекты комплексных чисел из функции.
  4. Проверяет класс комплексных чисел в драйвере.
  5. При желании добавляет и вычитает комплексные числа.

Моя программа работает следующим образом:

  1. Предлагает пользователю ввести значения действительных и мнимых частей комплексного числа.
  2. Создает объект ComplexNumber, используя предоставленные пользователем значения в качестве параметров для конструктора ComplexNumber.
  3. Печатает значение объекта комплексного числа, используя автономную функцию печати.

Я немного запутался в этом требовании:

static void printComplexNumber(ComplexNumber n)

Функция напечатает объект Complex Number, переданный в качестве параметра в виде realPart + imaginaryPart i

Знак realPart должен быть подписан, только если он отрицательный. Знак между realPart и imaginaryPart должен быть положительным, если imaginaryPart положительным, и отрицательным, если imaginaryPart отрицательным. Если действительная часть равна нулю, выведите только мнимую часть со знаком коррекции. Если мнимая часть равна нулю, выведите только действительную часть. Если мнимая часть равна единице, просто выведите символ 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().
}

Ответы [ 3 ]

1 голос
/ 03 декабря 2009

Я собираюсь ответить на ваш основной вопрос: что делать, когда существуют такие запутанные или сложные условия: вы можете решить их систематическим образом.

Что я делаю, это сначала разбиваю его на части, не важно, насколько многословно (если у вас есть время). Итак, скажем, мы разделим вывод как:

[RealSign] [RealPart] [ImSign] [IMPART] [iSymbol]

Затем мы анализируем, когда каждый из них будет отображаться, записывая правила:

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

Отсюда вы можете начать упрощать вещи.

1 голос
/ 03 декабря 2009

Я просто запомнил бы реальные и сложные части (я полагаю, целые числа или числа с плавающей точкой?), Вызывая эти методы. Затем используйте логику if-else, чтобы выяснить, что вам нужно.

В большинстве случаев для чего-то подобного, когда вы просто разрабатываете для логики, а это не высокопроизводительное (... или даже что-то, что вам действительно нужно написать в реальном мире!), Операторы if-else должны будь всем, что тебе нужно.

Мой совет:

  • Не думай об этом. Просто напишите if-else для реализации каждого предложения в описании (где применимо). Компилятор сделает это достаточно быстро.
  • Если вы не уверены в том, как (точно) вы должны написать логику if, просто напишите что-нибудь и протестируйте ее, уточняя логику при обнаружении ошибок.

Я предполагаю, что вы немного новичок в программировании, поэтому, пожалуйста, позвольте мне добавить общий совет ...

  • Прежде всего, не переживайте. Шутки в сторону. Если вы увязли в деталях, это только замедлит вас. Если вы не знаете, как использовать определенный синтаксис, найдите его и попробуйте найти примеры. И не бойтесь задавать вопросы, как вы уже делаете.

Если вы все-таки не новичок в программировании (может, просто C #?), Примите мои извинения. Я не хочу быть снисходительным или что-то в этом роде.

РЕДАКТИРОВАТЬ: После комментариев я решил отредактировать свой ответ.

Вы уже находитесь на этапе тестирования (как я уже упоминал выше - вы написали ЧТО-ТО). Отличное начало. Теперь вам нужно уточнить.

Ваша проблема в двойном минусе, верно? Ну, у вас есть несколько вариантов.

Во-первых, если вам нужно пространство между знаком и реальной частью (требования предполагают, что это возможно), то отрицательный знак, который находится перед реальной частью, непригоден для использования, так как он будет помечен без пробела. Таким образом, вы можете использовать какую-то функцию абсолютное значение , чтобы сделать число (временно) положительным.

Примерно так (псевдокод, извините, поскольку я на самом деле не знаю 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);

Это немного громоздко, и это может быть аккуратнее, если вы используете такие вещи, как условный троичный оператор и улучшенный отступ. Но, надеюсь, это имеет какой-то смысл и поможет вам начать.

0 голосов
/ 03 декабря 2009

Для условий подписи вы можете использовать ToString () с форматированием . Это оставляет вас с нулем и одним делом, которые могут быть обработаны, если - иначе.

...