Allyson Bryant Ответов: 4

Помощь (как мне избежать повторения утверждения, когда мне нужно определенное)? C#


Мой профессор хочет, чтобы мы отразили этот образ, используя циклы, заявления о принятии решений... и т. д. Единственное, чего я не понимаю, так это как мне удалось продублировать слово "жужжание" под "BuzzLightYear", когда его вообще не должно было быть.

Что он хочет от нас сделать:
https://i.stack.imgur.com/Vcp77.png[^]

Мой код:

int variable = 25;
while (variable <= 50)
{
if (variable % 2 == 0 && variable % 3 == 0 && variable % 7 == 0)
{
Console.Write("BuzzLightYear\n");
}
if (variable % 2 == 0)
{
Console.Write("Buzz\n");
}
if (variable % 3 == 0 && variable % 2 != 0 && variable % 7 != 0)
{
Console.Write("Light\n");
}
if (variable % 7 == 0 && variable % 2 != 0 && variable % 3 != 0)
{
Console.Write("Year\n");
}
if (variable % 2 != 0 && variable % 3 != 0 && variable % 7 != 0)
{
Console.WriteLine(variable);
}
++variable;
}
Console.Write("\nPress any key to continue to infinity and beyond...");
Console.ReadKey();

What I have tried:

If anyone would be kind enough to help, thanks!

4 Ответов

Рейтинг:
2

Richard MacCutchan

Все, что вам нужно сделать, это сделать все тесты после первого, чтобы быть альтернативами, добавив else к if утверждения, а также замена последнего на else Таким образом, для каждой итерации цикла будет выполняться только один набор условий.

int variable = 25;
while (variable <= 50)
{
    if (variable % 2 == 0 && variable % 3 == 0 && variable % 7 == 0)
    {
        Console.Write("BuzzLightYear\n");
    }
    else if (variable % 2 == 0)
    {
        Console.Write("Buzz\n");
    }
    else if (variable % 3 == 0 && variable % 2 != 0 && variable % 7 != 0)
    {
        Console.Write("Light\n");
    }
    else if (variable % 7 == 0 && variable % 2 != 0 && variable % 3 != 0)
    {
        Console.Write("Year\n");
    }
    else
    {
        Console.WriteLine(variable);
    }
    ++variable;
}
Console.Write("\nPress any key to continue to infinity and beyond...");
Console.ReadKey();


Рейтинг:
2

George Swan

Прежде всего, проанализируйте проблему. Что здесь происходит? Ну а решение о том, что печатать, принимается на основе отношений между 2,3,7 и переменной. Что это за отношения? Он основан на том, являются ли 2,3,7 факторами переменной или нет, точнее, это паттерн состояния isFactor для каждого из чисел 2,3,7 по отношению к переменной. Есть комбинации из 3-х bool значения, определяющие то, что печатается, могут быть представлены таблицей истинности, например: true,true,true false,true false и т.д.

Существуют различные способы кодирования этого. Я бы использовал метод, который возвращает a value tuple(bool,bool,bool)

public static (bool,bool,bool)AreTwoThreeSevenFactors(int target)
        {
            (bool is2, bool is3, bool is7) results;
          ...

Затем я бы подключил результаты к компьютеру. switch оператор, который возвращает ответ в виде string.
private static string ResultsToString((bool, bool, bool) status,int target)
        {
            return status switch
            {
                (true, true, true) => "BuzzLightYear",
         ...

Все это может быть закодировано без единого слова. if заявление. Поехали. Совет : используйте значение сброса для параметра "гудение" (true,_,_)


Рейтинг:
0

BillWoodruff

The only thing I do not get is how I managed to duplicate the word 'Buzz' under 'BuzzLightYear' when it should not be there at all.
if (variable % 2 == 0 && variable % 3 == 0 && variable % 7 == 0)
{
    Console.Write("BuzzLightYear\n");
}
if (variable % 2 == 0)
{
    Console.Write("Buzz\n");
}
Когда значение равно 42, он печатает "BuzzLightYear; затем он выполняет следующий тест, и, поскольку 42 % 2 == 0, он печатает "Buzz." Он делает то, что ты ему говоришь !

Интересно, серьезно ли ваш "профессор" дает вам такую кодовую путаницу?

Подумайте о том, как вы можете (легко) уменьшить сложность путем:

1. используя тот факт, что каждое число между 25 и 49 является либо нечетным, либо четным.

Я не собираюсь писать ваш код для вас, но вот схема, с которой вы можете начать работать:
int variable = 25;
bool isMod2 = false; 
bool isMod3 = false;

while (variable <= 50)
{
    isMod2 = variable % 2 == 0;
    isMod3 = variable % 3 == 0;

    if (isMod2)
    {
        if (isMod3)
        {

        }
        else
        {
            
        }
    }
    else
    {
        // we know isMod3 is 'true here
        // we know the case of both mod 2 and 3 == true has been handled
    }
}
Подумайте о том, как можно уменьшить количество тестов для "редчайшего" случая, когда переменная mod 7 равна 0.


Рейтинг:
0

Patrice T

Цитата:
Что он хочет от нас сделать:
https://i.stack.imgur.com/Vcp77.png

Когда вы просите о помощи, это хорошая идея, чтобы объяснить, в чем результат является неправильным.
Дать кусок кода, который мы можем запустить, тоже хорошая идея.
-----
Совет: Научитесь правильно делать отступы в вашем коде, это покажет его структуру и поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
int variable = 25;
while (variable <= 50)
{
    if (variable % 2 == 0 && variable % 3 == 0 && variable % 7 == 0)
    {
        Console.Write("BuzzLightYear\n");
    }
    if (variable % 2 == 0)
    {
        Console.Write("Buzz\n");
    }
    if (variable % 3 == 0 && variable % 2 != 0 && variable % 7 != 0)
    {
        Console.Write("Light\n");
    }
    if (variable % 7 == 0 && variable % 2 != 0 && variable % 3 != 0)
    {
        Console.Write("Year\n");
    }
    if (variable % 2 != 0 && variable % 3 != 0 && variable % 7 != 0)
    {
        Console.WriteLine(variable);
    }
    ++variable;
}
Console.Write("\nPress any key to continue to infinity and beyond...");
Console.ReadKey();

Стиль отступа - Википедия[^]

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]


BillWoodruff

Проголосовал #1

- Дать часть кода, который мы можем запустить, тоже хорошая идея."

Код операции компилируется и запускается. Все, что вы сделали, - это добавили отступ: вы легко могли бы отредактировать сообщение OP или Оставить комментарий.

Вы написали: "хорошая идея, чтобы объяснить, в чем результат неправильный.":

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

Вам действительно так нужны очки репутации ?

Patrice T

Привет Билл,
Спасибо, что прокомментировали ваш даунвот, по крайней мере, у вас есть мужество дать объяснение, а не многие это делают.
"(Как я могу избежать повторения утверждения, когда мне нужно определенное)" было мне не ясно.
Свалка фактического результата с комментарием на неправильных строках была бы легче справиться (для меня).
Слово "зеркало" мне тоже было непонятно. Может быть, это слишком длинная ночь для меня (5 утра, когда я писал свой ответ).