Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2020, 16:35   #1
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
Печаль Импликация

Код:
using System;
class Implication {
    static void Main() {
      bool p=false, q=false;


      int i, j;
      for(i = 0; i < 2; i++) 
          {
          for(j = 0; j < 2; j++) 
          {
          if(i==0) p = true;
          if(i==1) p = false;
          if(j==0) q = true;
          if(j==1) q = false;
          Console.WriteLine("p равно " + p + ", q равно " + q);
          if(!p | q)
              Console.WriteLine("Результат импликации " + p +
                                             " и " + q + " равен " + true);
          Console.WriteLine();
       }
     }
  }
}
Всем привет! Народ я изучаю книгу Шилдта C#, подскажите "пожалуйста" и помогите разобраться в нескольких вопросах.
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?.
Короч я в замешательстве.
bITA666 вне форума Ответить с цитированием
Старый 14.09.2020, 19:23   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

1.
В начале вступление, для понимания примера.
Пример приводится для того, чтобы показать, как работает оператор импликации.
Этот оператор записывается в элементарных логических функциях как: ^a | b
Или иначе: НЕ A ИЛИ B.
При вычислении импликации берётся отрицание первого операнда и результат объединяется по ИЛИ со вторым оператором.

2.
Хорошим тоном считается, что переменные, перед их использованием в выражениях, независимо в какой части выражения они будут использованы, должны быть инициализированы. В противном случае, как правило, трансляторы могут выдавать предупреждение. Конечно, это предупреждение можно игнорировать, но не следует.

3.
Цитата:
после проверки условия цикле for если результат проверки будет истинным то оператор инкремента увеличивает свой операнд на 1.
Нет. Вход в цикл for безусловный.
Т.е. входим в цикл с инициализированным переменными цикла. В вашем случае это i и j, которые инициируются нулём. После выполнения тела цикла происходит инкремент(декремент) переменной цикла и проверка нового значения на допустимость. Если всё хорошо, то тело цикла вновь выполняется. В вашем примере, например, i = 0, а затем 1. На следующем шаге i = 2, что, из-за условия i < 2, приводит к прекращению цикла.

4.
Импликация на Си записывается так: !p | q. Это выражение будет истинным, когда p = false или q = true.
Условный оператор сработает так: а) Получить отрицание p; б) получить результат ИЛИ с q.
Если выражение получит значение true, то будет выведено сообщение.

5.
Новые значения переменным p и q присваиваются с тем, что бы получить различные комбинации:
Код:
  p    q
-----------
false false
false true
true  false
true  true
PS: Последовательность комбинаций в таблице не соответствует тому, что будет получено в примере.
Попробуйте определить эту таблицу сами.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 15.09.2020, 15:11   #3
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение

Нет. Вход в цикл for безусловный.
Т.е. входим в цикл с инициализированным переменными цикла. В вашем случае это i и j, которые инициируются нулём. После выполнения тела цикла происходит инкремент(декремент) переменной цикла и проверка нового значения на допустимость. Если всё хорошо, то тело цикла вновь выполняется. В вашем примере, например, i = 0, а затем 1. На следующем шаге i = 2, что, из-за условия i < 2, приводит к прекращению цикла.
Ну то есть после проверки i < 0, компилятор переходит ниже и проверяет цикл j < 0?. Потом идет увеличение инкремента переменной i и j. Увиличивается инкремент переменной i и j.
Все верно?
bITA666 вне форума Ответить с цитированием
Старый 15.09.2020, 18:44   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
Ну то есть после проверки i < 0, компилятор переходит ниже и проверяет цикл j < 0?.
Будьте внимательны.
Компилятор сделал своё дело, когда сформировал объектный файл. Далее сработал компоновщик.
Если вы загружаете программу (код) на исполнение, то это работает код вашей программы и компилятор тут уже не при делах.
Код:
for(i = 0; i < 2; i++) 
   {
    <тут начинается тело цикла по i>
   for(j = 0; j < 2; j++)
      <тут начинается тело цикла по j>
   }
   <тут продолжается тело цикла по i>
}
По ходу выполнения программы встречается код, формирующий заголовок цикла по i: инициализируется переменная i: i = 0.
Далее, там где открывающаяся фигурная скобка, компилятор подставил код проверки условия выполнения цикла: Если i < 2, то выполняем тело цикла.
Далее, по ходу выполнения кода, инициализируется переменная j: j = 0.
Вместо открывающейся фигурной скобки, для этого цикла, компилятор вновь подставил проверку условия выполнения цикла: Если j < 2, то выполняем тело цикла.
Со значением j = 0 выполняется внутренний цикл.
В конце этого цикла, там, где закрывающаяся фигурная скобка, компилятор (на стадии подготовки объектного кода) подставил дополнительный код (его можно увидеть, если получить ассемблерный код программы).
В подставленном коде выполняется инкремент переменной цикла (j = j + 1) и передача управления на проверку завершения этого цикла (в голову, там, где открытая фигурная скобка и проверка на продолжение/завершение цикла).
После выполнения всех шагов вложенного цикла (при последней проверке j = 2) управление передаётся на первый оператор после тела вложенного цикла (за закрывающуюся фигурную скобку).
Далее может следовать код тела внешнего цикла.
Когда выполнение операторов из тела внешнего цикла завершается, выполняется код по инкременту переменной этого цикла (i) и передача управления в голову этого цикла, где проходит проверка на продолжение.

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

PSS: Больше во вложенном файле.
Вложения
Тип файла: docx Цикл.docx (29.4 Кб, 3 просмотров)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 20.09.2020, 00:14   #5
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию HELP

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Привет, подскажи пожалуйста, в основном я разобрался в этой теме. Но! Есть то что я понять не могу.
1)
if(i==1) p = false;
if(j==1) p = false;
р равно False, q равно False
Результат импликации False и True равен True
как получилось True?
мне кажется тут ошибка.

Последний раз редактировалось bITA666; 20.09.2020 в 14:32.
bITA666 вне форума Ответить с цитированием
Старый 20.09.2020, 14:45   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

#2 п. 4 - подробно ViktorR объяснил. Объединение по ИЛИ двух операндов: или первый False, или второй True x -> y = ^x | y .
^0 | 0 = 1 | 0 = 1 (1 = True )
https://ru.wikipedia.org/wiki/Импликация
digitalis вне форума Ответить с цитированием
Старый 20.09.2020, 15:23   #7
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
#2 п. 4 - подробно ViktorR объяснил. Объединение по ИЛИ двух операндов: или первый False, или второй True x -> y = ^x | y .
^0 | 0 = 1 | 0 = 1 (1 = True )
https://ru.wikipedia.org/wiki/Импликация
for(i = 1; i < 2; i++)
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.
bITA666 вне форума Ответить с цитированием
Старый 20.09.2020, 16:04   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Цитата:
ВОПРОС как может Два логических значения а именно p1 и q1 которые являются False и False результатом которым является True стать в !р | q , False и True!
Вот этого глубокомысленного вопроса я так и не понял. Спросил у своего кота - он тоже не понял.
если p1 и q1 являются False и False, то они таковыми и останутся, а результат операции импликации над ними будет True - это ясно из таблицы истинности. В Вики тоже самое говорится.
Изображения
Тип файла: jpg ab.jpg (4.7 Кб, 11 просмотров)
digitalis вне форума Ответить с цитированием
Старый 20.09.2020, 16:58   #9
bITA666
Форумчанин
 
Аватар для bITA666
 
Регистрация: 22.03.2019
Сообщений: 115
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Вот этого глубокомысленного вопроса я так и не понял. Спросил у своего кота - он тоже не понял.
если p1 и q1 являются False и False, то они таковыми и останутся, а результат операции импликации над ними будет True - это ясно из таблицы истинности. В Вики тоже самое говорится.
Все разобрался, спасибо! Очень сложная тема.

Последний раз редактировалось bITA666; 20.09.2020 в 18:44.
bITA666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зарядка для хвоста (логика, импликация) Чайница Помощь студентам 1 30.10.2009 20:20