|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.09.2020, 16:35 | #1 |
Форумчанин
Регистрация: 22.03.2019
Сообщений: 115
|
Импликация
Код:
1) Зачем инициализировать переменные типа boolean и присваивать им значения False?. 2) Как работает вложенные циклы? Если внешняя проверка условия в цикле является истинной то компилятор переходит к проверке во внутренним цикле и проверяет в нем условие?. 3)Как работает оператор if с логическими операторами ! и |?. Ведь "!" - является логическим оператором "НЕ", а "|" оператор "ИЛИ". 4) Я честно запутался, я могу написать своим словами как я понимаю но боюсь что вы не поймете. Попробую: после проверки условия цикле for если результат проверки будет истинным то оператор инкремента увеличивает свой операнд на 1. После первой проверки проверяется второй цикл for и так же проверяется условие и оператор инкремента увеличивает свой операнд на 1. В борьбу вступает оператор if и проверяет значения в переменных: if(i==0) p = true; и if(j==0) q = true; Вот перерь вопрос?! Зачем присваивать переменным P и Q новое значение?. Идем дальше. После присваивания значения переменным выводиться Console.WriteLine("p равно " + p + ", q равно " + q); Дальше я сталкиваюсь с if(!p | q) и тут у меня ступор. Я не могу дальше двигаться, ведь как я говорил раньше что "!" - НЕ! а "|" - ИЛИ!. Или компилятор пропускает этот оператор и не выполнят его так как у нас есть истинные значения типа boolean?. Короч я в замешательстве. |
14.09.2020, 19:23 | #2 | |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,309
|
1.
В начале вступление, для понимания примера. Пример приводится для того, чтобы показать, как работает оператор импликации. Этот оператор записывается в элементарных логических функциях как: ^a | b Или иначе: НЕ A ИЛИ B. При вычислении импликации берётся отрицание первого операнда и результат объединяется по ИЛИ со вторым оператором. 2. Хорошим тоном считается, что переменные, перед их использованием в выражениях, независимо в какой части выражения они будут использованы, должны быть инициализированы. В противном случае, как правило, трансляторы могут выдавать предупреждение. Конечно, это предупреждение можно игнорировать, но не следует. 3. Цитата:
Т.е. входим в цикл с инициализированным переменными цикла. В вашем случае это i и j, которые инициируются нулём. После выполнения тела цикла происходит инкремент(декремент) переменной цикла и проверка нового значения на допустимость. Если всё хорошо, то тело цикла вновь выполняется. В вашем примере, например, i = 0, а затем 1. На следующем шаге i = 2, что, из-за условия i < 2, приводит к прекращению цикла. 4. Импликация на Си записывается так: !p | q. Это выражение будет истинным, когда p = false или q = true. Условный оператор сработает так: а) Получить отрицание p; б) получить результат ИЛИ с q. Если выражение получит значение true, то будет выведено сообщение. 5. Новые значения переменным p и q присваиваются с тем, что бы получить различные комбинации: Код:
Попробуйте определить эту таблицу сами.
Как-то так, ...
|
|
15.09.2020, 15:11 | #3 | |
Форумчанин
Регистрация: 22.03.2019
Сообщений: 115
|
Цитата:
Все верно? |
|
15.09.2020, 18:44 | #4 | |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,309
|
Цитата:
Компилятор сделал своё дело, когда сформировал объектный файл. Далее сработал компоновщик. Если вы загружаете программу (код) на исполнение, то это работает код вашей программы и компилятор тут уже не при делах. Код:
Далее, там где открывающаяся фигурная скобка, компилятор подставил код проверки условия выполнения цикла: Если i < 2, то выполняем тело цикла. Далее, по ходу выполнения кода, инициализируется переменная j: j = 0. Вместо открывающейся фигурной скобки, для этого цикла, компилятор вновь подставил проверку условия выполнения цикла: Если j < 2, то выполняем тело цикла. Со значением j = 0 выполняется внутренний цикл. В конце этого цикла, там, где закрывающаяся фигурная скобка, компилятор (на стадии подготовки объектного кода) подставил дополнительный код (его можно увидеть, если получить ассемблерный код программы). В подставленном коде выполняется инкремент переменной цикла (j = j + 1) и передача управления на проверку завершения этого цикла (в голову, там, где открытая фигурная скобка и проверка на продолжение/завершение цикла). После выполнения всех шагов вложенного цикла (при последней проверке j = 2) управление передаётся на первый оператор после тела вложенного цикла (за закрывающуюся фигурную скобку). Далее может следовать код тела внешнего цикла. Когда выполнение операторов из тела внешнего цикла завершается, выполняется код по инкременту переменной этого цикла (i) и передача управления в голову этого цикла, где проходит проверка на продолжение. PS: Я перечитал, ранее написанное и понял, что ошибся,сказав, что вход в цикл безусловный. На самом деле в голове цикла проходит проверка - выполнять тело или уходить дальше, к операторам за циклом. PSS: Больше во вложенном файле.
Как-то так, ...
|
|
20.09.2020, 00:14 | #5 |
Форумчанин
Регистрация: 22.03.2019
Сообщений: 115
|
HELP
Привет, подскажи пожалуйста, в основном я разобрался в этой теме. Но! Есть то что я понять не могу.
1) if(i==1) p = false; if(j==1) p = false; р равно False, q равно False Результат импликации False и True равен True как получилось True? мне кажется тут ошибка. Последний раз редактировалось bITA666; 20.09.2020 в 14:32. |
20.09.2020, 14:45 | #6 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
#2 п. 4 - подробно ViktorR объяснил. Объединение по ИЛИ двух операндов: или первый False, или второй True x -> y = ^x | y .
^0 | 0 = 1 | 0 = 1 (1 = True ) https://ru.wikipedia.org/wiki/Импликация |
20.09.2020, 15:23 | #7 | |
Форумчанин
Регистрация: 22.03.2019
Сообщений: 115
|
Цитата:
for(j = 1; j < 2; j++) if(i==1) p = false; if(j==1) q = false; р равно False, q равно False; p -> q разве не должен Результат импликации быть False и False равно True, как в последней импликации? Почему тогда последняя импликация где: р равно False, q равно False; Результат импликации False и False равен True А в предыдущей импликации. Результат импликации является False и True < ---- это два логических значений, равен True < ---- ВОТ ЭТО ЖЕ РЕЗУЛЬТАТ ИМПЛИКАЦИИ. ВОПРОС как может Два логических значения а именно p1 и q1 которые являются False и False результатом которым является True стать в !р | q , False и True! Ведь в начале мы проделывали тоже самое с : for(i = 0; i < 2; i++) for(j = 0; j < 2; j++) if(i==0) p = True; if(j==0) q = True; р равно True, q равно True; p -> q Результат импликации True и True равен True Последний раз редактировалось bITA666; 20.09.2020 в 15:38. |
|
20.09.2020, 16:04 | #8 | |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
Цитата:
если p1 и q1 являются False и False, то они таковыми и останутся, а результат операции импликации над ними будет True - это ясно из таблицы истинности. В Вики тоже самое говорится. |
|
20.09.2020, 16:58 | #9 | |
Форумчанин
Регистрация: 22.03.2019
Сообщений: 115
|
Цитата:
Последний раз редактировалось bITA666; 20.09.2020 в 18:44. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Зарядка для хвоста (логика, импликация) | Чайница | Помощь студентам | 1 | 30.10.2009 20:20 |