Sigmond Gatt Ответов: 4

Сложнее, если заявления на C


Привет ребята,

Я делаю приложение, в котором пользователи могут использовать определенную информацию из полей со списком, флажков и т. д

Проблема в том, что мне нужно дать им некоторые детали клиента, зависящие от выбранных ими данных.


У меня есть оператор if с 5 условиями пример:

Если(а &ГТ; 0, Б и gt;0, ц&ГТ;0 ,д&ГТ;0, е&ГТ;0)

теперь они могут быть объединены, поэтому мне нужно сделать много операторов if ( факториал из 5 (120 операторов if))


, кто-то знает способ, как я могу уменьшить сложность и повторение этого заявления if, пожалуйста.



ПРИМЕР КОДА:


/if (this.Mcc.Length > 1 && this.CheckboxIsTicked == false && this.TestCases > 0 && THIS.TESTCASE1 > 0 && THIS.TESTCASE2 > 0)
                    {
                        
                            sql = "SELECT * FROM  TABLE1;
                       

                    }ELSE IF(<pre>this.Mcc.Length > 1 && this.CheckboxIsTicked == false && this.TestCases > 0 && THIS.TESTCASE1 > 0 && THIS.TESTCASE2 < 0
)
{
sql = "SELECT * FROM TABLE2;

}


И МНОГОЕ ДРУГОЕ

Что я уже пробовал:

я пытался сделать это проще, но не могу. Какие-нибудь предложения, пожалуйста?

Patrice T

Не ясно, что вы пытаетесь сделать, этот код не является C.

Sigmond Gatt

c# извините, но я не могу найти, где я могу отредактировать свой вопрос :/... originalgriff понимает это ...

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

4 Ответов

Рейтинг:
33

CPallini

Взгляните на это Таблица решений - Википедия[^].


Ziee-M

Сегодня я узнал кое-что новое, ТХ-х

CPallini

Добро пожаловать.

Maciej Los

5ed!

CPallini

Слишком хорошо, сэр!
Спасибо.

Maciej Los

;)

Рейтинг:
26

OriginalGriff

если вам нужны только строки, то один из способов сделать это-настроить массив и уменьшить каждое условие if до одного бита в целочисленном виде.

int index = 0;
if (a > 0) index |= 1;
if (b > 0) index |= 2;
if (c > 0) index |= 4;

Затем можно настроить массив строк, относящихся к значению индекса:
string[] selects = new string[] { "Select * FROM none",
                                  "Select * FROM a only",
                                  "Select * FROM b only",
                                  "Select * FROM a and b",
                                  "Select * FROM c only",
                                  "Select * FROM a and c",
                                  "Select * FROM b and c",
                                  "Select * FROM a, b, and c"};
И выберите свою строку напрямую.


Sigmond Gatt

тогда я могу позвонить select[index] , верно ?

OriginalGriff

Именно так!

Sigmond Gatt

но проблема в том, что у меня будет такое же количество утверждений if, есть способ, которым я могу их уменьшить, пожалуйста ?

OriginalGriff

Нет, вся идея в том, что ты этого не делаешь. В приведенном мною примере у вас есть три оператора if, и он выбирает из восьми строк (здесь идет речь о базовом двоичном коде). Вы сказали, что у вас есть пять условий, которые объединены: это то, что делает двоичное значение или значение индекса: если a и b истинны, индекс содержит три (1/2 == 3)
У вас есть пять условий, которые дают вам 32 варианта, но только пять операторов if.

Sigmond Gatt

Вау, это кажется интересным. Я буду вдаваться в более подробно об этом. спасибо :)

OriginalGriff

Всегда пожалуйста!

Ziee-M

Я бы все делал немного по-другому.
-1 - я создаю таблицу, которая содержит все возможные ответы, я думаю об этих условиях как о правилах, которые могут меняться/обновляться с течением времени. установка их в таблице, чтобы разрешить обновление пользователей, кажется мне хорошей идеей.
-2 - Подобно OriginalGriff, я бы сгенерировал двоичный файл 5 (00000->11111) и в зависимости от значения использовал бы свою таблицу базы данных и получал бы строку.
-3 - результатом должна быть только одна строка кода, так как все ваши правила находятся на уровне базы данных

OriginalGriff

Использование базы данных-неплохая идея, но в данном случае это немного опасно.
Помните, что он разрабатывает, какую команду SQL SELECT выполнить, поэтому к системам, которые легче изменить эту команду и заставить ее выполняться в других системах, следует относиться с осторожностью. Модифицировать исходный код сложно - количество людей, которые имеют доступ к исходному коду и компилятору и могут выдавать исправленную версию всем клиентам, вероятно, довольно мало. Но число людей, которые могут изменять строковые значения в базе данных, как правило, намного больше. Так что точно так же как SQL инъекция это не займет много времени чтобы добавить код вы будете выполнены позже почти без следа:
Обновление зарплаты SET HourlyRate = HourlyRate + 1, где EmpID = 666; выберите * из таблицы 1
В одной записи, которая используется только в конкретном случае, и удалите ее через месяц или два, и ее будет практически невозможно отследить, если вы действительно не знаете, где искать и как. Вы должны быть осторожны с этими вещами!

Ziee-M

Действительно, ваше объяснение имеет большой смысл в данном конкретном случае, thx для того, чтобы указать на него.

OriginalGriff

Всегда пожалуйста!

Рейтинг:
2

Pete O'Hanlon

То, на что вы смотрите, - это построение таблицы решений.


Рейтинг:
2

Patrice T

Цитата:
теперь они могут быть объединены, поэтому мне нужно сделать много операторов if ( факториал из 5 (120 операторов if))

Нет, у вас есть 5 двоичных условий, это делает 2^5= 32 возможности.

Вам нужно узнать, что C чувствителен к регистру, это означает, что:
"это" - правильно, "это" - нет.
"если" - правильно, "если" - нет.
"иначе" - это правильно, "иначе" - нет.
sql = "SELECT * FROM  TABLE1"; // is correct
sql = "SELECT * FROM  TABLE1; // is not


if (THIS.TESTCASE2 > 0) {...}
else if (THIS.TESTCASE2 < 0) {...}

Этот код пропускает случай (THIS.TESTCASE2 == 0), который не обрабатывается.