Всем привет!
Пытаюсь решить задачку:
public class Loader {
public static void main(String[] args) {
int milkAmount = 1; // ml
int powderAmount = 1; // g
int eggsCount = 1; // items
int sugarAmount = 1; // g
int oilAmount = 1; // ml
int appleCount = 1;
boolean pancakes = false;
if (powderAmount >= 400 && sugarAmount >= 10 && milkAmount >= 1000 && oilAmount >= 30) {
//powder - 400 g, sugar - 10 g, milk - 1 l, oil - 30 ml
System.out.println("Вы можете приготовить печенье");
pancakes = true;
}
boolean omelette = false;
if (milkAmount >= 300 && powderAmount >= 5 && eggsCount >= 5) {
//milk - 300 ml, powder - 5 g, eggs - 5
System.out.println("Вы можете приготовить омлет");
omelette = true;
}
boolean applePie = false;
if (appleCount >= 3 && milkAmount >= 100 && powderAmount >= 300 && eggsCount >= 4) {
//apples - 3, milk - 100 ml, powder - 300 g, eggs - 4
System.out.println("Вы можете приготовить яблочный пирог");
applePie = true;
}
if (pancakes && omelette && applePie == false) {
System.out.println("Вы не можете готовить без ингредиентов.");
}
}
}
Программа компилируется, но на выходе ничего нету, если в указать малое кол-во ингредиентов, а должно выводить "Вы не можете готовить без ингредиентов."
Anonymous #3002830
3 уровень
Помогите найти решение
Комментарии (26)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
treedeevada
1 июля 2022, 10:10
Потому что в последнем блоке условий, проверяется только последний элемент на false, все остальные на true.
0
Ksenia MarioMaster
2 июля 2022, 08:41
нет, оно не так работает
+1
treedeevada
2 июля 2022, 09:55
Не так? А как? Вы хотя бы поясняли свой ответ.
!pancakes(false)
pancakes(true)
0
VladimirMaster
2 июля 2022, 10:29
Не так? А как? Вы хотя бы поясняли свой ответ.
____________________________________________________________________
В этот иф
компилятор зайдет только в том случае, если на вход прилетают фолсы.
true && true && true - только в этом случае будет тру. Если будет хоть один фолс, то будет фолс и компилятор не зайдет в этот иф, и ты увидишь, что ты можешь приготовить либо печенье, либо еще что.
Резюмирую: !true - это false и соответственно !false - это true.
И теперь если:
!false && !false && !false - будет тру и мы увидим надпись "Вы не можете нифига приготовить, потому, что у вас нет продуктов или они не правильные" 0
VladimirMaster
2 июля 2022, 10:59
Потому что в последнем блоке условий, проверяется только последний элемент на false, все остальные на true.
_________________________________________________________________________
Теперь еще раз и подробнее. :)
Компилятор читает слева на право:
true && true && false - будет false. Читаем слева на право тру и тру будет тру, затем тру и фолс будет фолс.
false && false && true - будет false. Читаем слева на право фолс и фолс будет фолс, затем фолс и тру будет фолс.
true && false && false - будет false. Читаем слева на право тру и фолс будет фолс, затем фолс и фолс будет фолс.
true && true && true - будет true. Читаем слева на право тру и тру будет тру, затем тру и тру будет тру.
Короче в этой конструкции тру будет, если все тру. Если будет хоть один фолс, то результат будет фолс.
Надеюсь понятно объяснил. :)
+2
treedeevada
2 июля 2022, 11:29
В иф пройдет если (pancakes и omlette) = true, а applePie = false.
А в коде проверка, что если (pancakes и omlette) = true & applePie = false, мы проходим, но если (pancakes и omlette) по дефолту = false, и ни один из верхних ифов мы не зашли, то логично, что условие пропускается
0
VladimirMaster
2 июля 2022, 12:45
В иф пройдет если (pancakes и omlette) = true, а applePie = false.
А в коде проверка, что если (pancakes и omlette) = true & applePie = false, мы проходим, но если (pancakes и omlette) по дефолту = false, и ни один из верхних ифов мы не зашли, то логично, что условие пропускается
______________________________________________________________________________
🤦♂️
Вот это выражение
и вот это выражение
Совершенно разные выражения.
Первое логическое, второе присвоение.
Смотри. Представим, что pancakes и omelette true, а applePie false.
Разбираем вот это выражение
как его видит компилятор.
Компилятор читает слева на право.
тру и тру будет тру, затем смотрит вот это логическое выражение applePie == false. То есть компилятор спрашивает applePie равняется фолс? Да равняется. То есть фолс равняется фолс? Да равняется. То есть тру получается, если равняется.
Идем дальше,
там у нас последнее было тру и здесь тру, то есть заходим в иф, потому, что все тру, как я описывал выше. Мы заходим в цикл, если все тру, а в данном случае у нас все тру.
В итоге мы увидим на выходе:
Вы можете приготовить печенье!
Вы можете приготовить омлет!
Вы не можете готовить без ингридиентов!
Вот так это работает. :) 0
treedeevada
2 июля 2022, 12:55
Я и не использовал их как оператор присваивания) А вы внимание только на этот недочет обратили?
0
VladimirMaster
2 июля 2022, 13:23
Давай для закрепления дальше капнем.
Смотри. Если вот так мы напишем,
как ты думаешь, зайдем мы в цикл или нет? Нет и вот почему.
Условия теже, pancakes and omelette true.
Компилятор читает слева направо, напомню.
Компилятор спрашивает, это же логическое выражение, значит он спрашивает, pancakes равняется фолс? А pancakes равняется тру. То есть вопрос, тру равняется фолс? Нет не равняется. Значит будет фолс. И на этом все. Компилятор все бросает и уходит отсюда и не спрашивает дальше. Потому, что уже есть фолс. А как мы помним, что если в выражении будет хоть один фолс, то все выражение принимает значение фолс. Компилятор это знает и не видит смысла читать выражение дальше. Типо говорит, все равно будет фолс, зачем читать дальше
В итоге компилятор не зайдет в иф, а на выходе мы получим:
Вы можете приготовить печенье!
Вы можете приготовить омлет!
Повторюсь еще раз. В цикл этот мы заходим (компилятор), только если все тру. Если хоть один фолс будет, мы (компилятор) в этот иф не заходим.
Вот так это работает. :) Советую с этим разобраться, это тонкая материя. Запутанно вроде, но когда разберешься будет легко. :)
Поиграйся вот с этим:
0
VladimirMaster
2 июля 2022, 13:49
А вы внимание только на этот недочет обратили?
____________________________________________________________________
Нет. Я обратил внимание на то, что ты не совсем понимаешь принцип работы логических операторов. Пытался это исправить. Тебе нужно поковырять логические операторы вдоль и поперек. Логическое и, и или (&& and ||) самые частые с которыми тебе придется столкнуться. Нужно их хорошо освоить.
0
treedeevada
2 июля 2022, 14:47
Но pancakes инициализированы же как false?
0
VladimirMaster
2 июля 2022, 16:00
Но pancakes инициализированы же как false?
__________________________________________________________________
И? Что не понятно? Пиши с примерами кода, что тебе не понятно.
0
treedeevada
2 июля 2022, 16:18
pancakes и omlete инициализированы как false
тут же происходит проверка на true, то есть если pancakes == true && omlette == true && applePie == false, мы попадаем, но если ни в один из предыдущих ифов мы не попали, в этот мы так же не попадем.
P.S.
Я правда не много запутался под конец дня уже, простите если не понимаю элементарных вещей. 0
treedeevada
2 июля 2022, 16:21
как я понял, он хотел сравнить сразу 3 переменные с 1 условием
0
VladimirMaster
2 июля 2022, 16:32
Иван, давай завтра проработаем эту тему досконально, что бы ты все сам понял. Сегодня я занят уже. Завтра разберем эту тему подробнее.
0
VladimirMaster
2 июля 2022, 16:35
как я понял, он хотел сравнить сразу 3 переменные с 1 условием
_____________________________________________________________________________
Возможно, но компилятор думает по другому. На то он и Java Core. Это база. Если не будешь понимать базу, дальше трудно будет.
0
VladimirMaster
3 июля 2022, 06:47
Иван, давай завтра проработаем эту тему досконально, что бы ты все сам понял. Сегодня я занят уже. Завтра разберем эту тему подробнее.
___________________________________________________________________________
Итак, наступило завтра и мы продолжаем разбирать сложную и запутанную (на первый взгляд) тему. 😉🙂
pancakes и omlete инициализированы как false
________________________________________________________________
Компилятор читает сверху вниз, слева на право.
Вначале инициализация фолс, затем идет иф, если мы выполняем условие ифа, то попадаем в тело ифа и после выполнения условия pancakes инициализируется тру и дальше летит уже тру. Если не попадаем, то pancakes так и будет фолс и летит дальше фолсом.
Дальше выполняется следующая итерация и мы смотрим омлет, он инициализирован фолс, далее идет иф, если мы выполняем условие ифа, то попадаем в тело ифа и после выполнения омлет инициализируется тру и летит дальше уже тру, если не попадаем в иф, то он так и летит фолсом.
Затем следующая итерация, applePie инициализирован фолс, далее идет иф, если мы выполняем условие ифа, то попадаем в его тело и после выполнения pancakes инициализируется тру и летит дальше уже тру, если не выполняем он так и летит фолсом.
Далее компилятор натыкается на последний иф и если выполняется условие ифа, то туда заходит и выполняет там код, если не выполняет условие, то туда не заходит.
Итак, резюмирую:
Логическое И && будет тру, если все тру, если хоть один фолс будет, то все условие будет фолс.
Логическое ИЛИ || будет наоборот фолс, если все фолс, если хоть один тру будет, то все условие будет тру.
Вот теперь поиграйся с разными данными на вход. Подавай разные данные блинам, омлету и яблочному пирогу. И пошагово разбирай, как я тебе описывал выше.
Надеюсь понятно? Или снова не понятно?
0
treedeevada
3 июля 2022, 07:53
От части стало, спасибо что уделили время
+1
Ksenia MarioMaster
4 июля 2022, 01:34
Ну с таким то терпением нужно реквизит для оплаты давать :)
+1
Ksenia MarioMaster
4 июля 2022, 01:44
Помнишь, я писала что оно не так работает.
Ну, короч, ты был прав оно так и работает 🤭 просто формулировка в тя странная.
0
treedeevada
4 июля 2022, 07:53
Понять - одно, объяснить - другое, с этим пока проблемы)
0
Ksenia MarioMaster
4 июля 2022, 15:38
Думаю грех после такой вашей переписки с Владимиром даже начинать влазить :)
Так ти же правильно сказал, возьми и обоснуй :)
+1
VladimirMaster
1 июля 2022, 05:44
+3
Ksenia MarioMaster
30 июня 2022, 19:26
почитай про першочерговість операторів.
в == пріорітет вищий ніж у &&
+1
Anonymous #3002830
30 июня 2022, 19:28
Велькi дзякуй!
+3
Anonymous #3002830
30 июня 2022, 18:29
Если оставить одни pancakes, например, то выполняется нормально. Но с омлетом и пирогом также должно работать
0