Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> || в while 
:(
    Опции темы
Kirgston
Дата 7.4.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Всем доброго времени суток! Пишу программку... только вот не понимаю почему оператор || в While работает... еее как то не так... может конечно и я такой =) но. 

Код

while ( (us_hp>0) || (ai_hp>0) ) battle();


Код

void battle()
{
    user_attack();
    ai_attack();

    att=us_att;
    if (us_a==ai_d) {
       ai_hp-=(att-ai_d);
    }
    else
    ai_hp-=att;

    att=ai_att;
    if (ai_a==us_d) {
        us_hp-=(att-us_d);
    }
    else
    us_hp-=att;
}


Вроде он должен проверять 2 параметра и если один из них меньше нуля то ити дальше, а иначе вызывать Баттле. Но не знаю почему... но оно идет дальше только когда оба параметра меньше нуля...
PM MAIL   Вверх
zim22
Дата 7.4.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Kirgston @  7.4.2009,  11:31 Найти цитируемый пост)
Вроде он должен проверять 2 параметра и если один из них меньше нуля то ити дальше, а иначе вызывать Баттле

тело while будет выполняться до тех пор, пока оба аргумента оператора ИЛИ не станут равными false.
false - это челочисленное значение 0
true - это все остальные значения. -1 в том числе.

Это сообщение отредактировал(а) zim22 - 7.4.2009, 11:40


--------------------
PM MAIL   Вверх
math64
Дата 7.4.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Насколько я понял, нужно:
Код

while ( (us_hp>0) && (ai_hp>0) ) battle();

battle() будет вызываться пока оба числа us_hp и ai_hp больше 0
При использовании ||, battle() будет вызываться пока одно из чисел us_hp и ai_hp больше 0
Причём если проверка первого числа не проходит, проверка второго не делается

zim22: Результат операции > всегда true(1) или false(0), -1 никогда не бывает.
PM   Вверх
zim22
Дата 7.4.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(math64 @  7.4.2009,  11:59 Найти цитируемый пост)
battle() будет вызываться пока оба числа us_hp и ai_hp больше 0

или меньше нуля.

Цитата(math64 @  7.4.2009,  11:59 Найти цитируемый пост)
езультат операции > всегда true(1) или false(0), -1 никогда не бывает.

я знаю, спасибо за напоминание.


--------------------
PM MAIL   Вверх
Soah
Дата 7.4.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 6
Всего: 54



Цитата(zim22 @  7.4.2009,  12:15 Найти цитируемый пост)
или меньше нуля.

 smile 

Код

int us_hp = -1;
int ai_hp = -1;
while ( (us_hp>0) || (ai_hp>0) ) battle();

PM MAIL   Вверх
math64
Дата 7.4.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(zim22 @  7.4.2009,  12:15 Найти цитируемый пост)
или меньше нуля.

Так будет если написать
Код

while ( us_hp && ai_hp ) battle();

что эквивалентно
Код

while ( (us_hp!=0) && (ai_hp!=0) ) battle();

Лучше всегда явно указывать используемую операцию сравнения и не испльзоовать что 0 считается false, а ненулевое значение true

Добавлено через 3 минуты и 39 секунд
PS: в примере Soah battle() вызываться не будет
PM   Вверх
zim22
Дата 7.4.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(math64 @  7.4.2009,  12:32 Найти цитируемый пост)
Так будет если написатькод C++1:while ( us_hp && ai_hp ) battle();

я почему то и увидел, что так и было (без оператора >) надо зрение проверить smile



--------------------
PM MAIL   Вверх
Albor
Дата 7.4.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Kirgston @  7.4.2009,  10:31 Найти цитируемый пост)
Вроде он должен проверять 2 параметра и если один из них меньше нуля то ити дальше, а иначе вызывать Баттле. Но не знаю почему... но оно идет дальше только когда оба параметра меньше нуля... 

us_hp и ai_hp, наверное, глобальные. Видимо, battle() их изменяет таким образом, что цикл заканчивается только когда оба становятся меньше 0. Здесь 100% дело не в условии цикла.
Kirgston,  а выполнить по шагам? Ведь здесь ни чего военного.

Это сообщение отредактировал(а) Albor - 7.4.2009, 13:22
PM MAIL ICQ   Вверх
Dmi3ev
Дата 7.4.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

us_hp и ai_hp, наверное, глобальные. Видимо, battle() их изменяет таким образом, что цикл заканчивается только когда оба становятся меньше 0. Здесь 100% дело не в условии цикла.

 smile 


--------------------

PM MAIL   Вверх
Fazil6
Дата 7.4.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(Kirgston @  7.4.2009,  11:31 Найти цитируемый пост)
Вроде он должен проверять 2 параметра и если один из них меньше нуля то ити дальше, а иначе вызывать Баттле. Но не знаю почему... но оно идет дальше только когда оба параметра меньше нуля... 

почитай учебник. Все именно так как ты написал, только с точностью наоборот. Пока хотябы один больше нуля, будет выполняться цикл. Т.е. то что ты называешь

Цитата(Kirgston @  7.4.2009,  11:31 Найти цитируемый пост)
While работает... еее как то не так...
 он работает как раз правильно. То что ты описал это работа оператора &&, а не ||

PM MAIL   Вверх
Kirgston
Дата 8.4.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Цитата(math64 @  7.4.2009,  11:59 Найти цитируемый пост)
battle() будет вызываться пока оба числа us_hp и ai_hp больше 0При использовании ||, battle() будет вызываться пока одно из чисел us_hp и ai_hp больше 0 

Ага хотелось бы... но не так =) при || оно просто ждет пока 2 числа станут меньше нуля...

Цитата(Fazil6 @  7.4.2009,  13:28 Найти цитируемый пост)
он работает как раз правильно. То что ты описал это работа оператора &&, а не ||

ну я же не слепой. Я ставлю || и он у меня работает как && ! Взял из учебника. || - логическое или, && - логическое И. Когда я ставлю Или то или другое... оно ждет пока 2 значения опускаються в "меньше нуля". 
Цитата(zim22 @  7.4.2009,  11:39 Найти цитируемый пост)
тело while будет выполняться до тех пор, пока оба аргумента оператора ИЛИ не станут равными false.

Но вот не понимаю... а где тогда использовать || ? 

Ребята... пожалуйста обясните по простому... почему у меня && работает как || то есть он ждет пока одна из переменных не станет меньше нуля, а || работает как &&... то есть он ждет пока обе из переменных не будут меньше нуля... почему так?
PM MAIL   Вверх
mes
Дата 8.4.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Kirgston @  7.4.2009,  10:31 Найти цитируемый пост)
while ( (us_hp>0) || (ai_hp>0) ) battle();


Цитата(Kirgston @  8.4.2009,  09:18 Найти цитируемый пост)
почему у меня && работает как || то есть он ждет пока одна из переменных не станет меньше нуля, а || работает как &&... то есть он ждет пока обе из переменных не будут меньше нуля... почему так? 

потому что Вы условие читаете кверх ногами... где Вы нашли меньше ?
Ваше условие звучит так :
Пока (us_hp больше 0) или  (ai_hp больше 0) делай;
если заменить || на && то "или" заменится "и".


--------------------
PM MAIL WWW   Вверх
Kirgston
Дата 8.4.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Ну правильно... мне надо чтобы цыкл работал пока одно из значений не станет меньше нуля... извините если я чего либо не понимаю...
PM MAIL   Вверх
xvr
Дата 8.4.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Kirgston @ 8.4.2009,  10:18)
Цитата(math64 @  7.4.2009,  11:59 Найти цитируемый пост)
battle() будет вызываться пока оба числа us_hp и ai_hp больше 0При использовании ||, battle() будет вызываться пока одно из чисел us_hp и ai_hp больше 0 

Ага хотелось бы... но не так =) при || оно просто ждет пока 2 числа станут меньше нуля...

Цитата(Fazil6 @  7.4.2009,  13:28 Найти цитируемый пост)
он работает как раз правильно. То что ты описал это работа оператора &&, а не ||

ну я же не слепой. Я ставлю || и он у меня работает как && ! Взял из учебника. || - логическое или, && - логическое И. 

Мда, имеют место быть проблемы с переводом. Перевожу с С на человеческий:
Код

while (       Пока
  (us_hp>0)   us_hp больше нуля
  ||          или
  (ai_hp>0)   ai_hp больше нуля
 ) battle();  вызывать battle()
Если интересует когда battle() ПЕРЕСТАНЕТ вызываться, то условие из while нужно проинвертировать - это будет (us_hp<=0) && (ai_hp<=0)

PM MAIL   Вверх
mes
Дата 8.4.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Kirgston @  8.4.2009,  09:31 Найти цитируемый пост)
Ну правильно... мне надо чтобы цыкл работал пока одно из значений не станет меньше нуля... извините если я чего либо не понимаю... 

В вашей формулировке записывается так
Код

while (!(us_hp<0) && !(ai_hp<0)) ...

но тоже самое можно перефразировать, чтоб не ломать себе голову - делать пока оба значения больше или равны нулю :
Код

while (us_hp>=0 && ai_hp>=0) ...

второй пример читается легче, хотя оба следуют одному условию.  smile 



Это сообщение отредактировал(а) mes - 8.4.2009, 10:42


--------------------
PM MAIL WWW   Вверх
Kirgston
Дата 8.4.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



mes, вот посмотрите... как написал код xvr . Я так же написал... и так же понимаю как он будет действовать... только почему если я использую код то ... он работает как И а не как ИЛИ? 

Извините пожалуйста... просто я не понимаю до конца, но очень хочу разобратся! Может проблема в среде? Билдер 2009 Ап2
PM MAIL   Вверх
mes
Дата 8.4.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Kirgston @  8.4.2009,  09:50 Найти цитируемый пост)
mes, вот посмотрите... как написал код xvr .

посмотрел.

Цитата(Kirgston @  8.4.2009,  09:50 Найти цитируемый пост)
и так же понимаю как он будет действовать... только почему если я использую код то ... он работает как И а не как ИЛИ? 

работает как И  это как ?




--------------------
PM MAIL WWW   Вверх
Kirgston
Дата 8.4.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Ну когда я в коде поставил || то цыкл ждал пока оба значения не станут меньше нуля... но там же стоит ИЛИ... смотрите первый мой пост... там код просто ждал пока оба значения не станут меньше нуля... но вроде при || программа должна ждать пока одна  из переменных не станет меньше нуля...
PM MAIL   Вверх
mes
Дата 8.4.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Kirgston @  8.4.2009,  10:14 Найти цитируемый пост)
Ну когда я в коде поставил || то цыкл ждал пока оба значения не станут меньше нуля... н

правильно делал.. Это Вы опять выражаете видимое кверх ногами. Откуда меньше ?!  smile  не выдумывайте того чего нет.  smile 
Цикл ждет(выполняется) пока первое ИЛИ второе значение будет больше 0. 



Это сообщение отредактировал(а) mes - 8.4.2009, 11:27


--------------------
PM MAIL WWW   Вверх
xvr
Дата 8.4.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Kirgston @ 8.4.2009,  11:14)
Ну когда я в коде поставил || то цыкл ждал пока оба значения не станут меньше нуля... но там же стоит ИЛИ... смотрите первый мой пост... там код просто ждал пока оба значения не станут меньше нуля... но вроде при || программа должна ждать пока одна  из переменных не станет меньше нуля...

Цикл while ничего не ждет - он выполняется, ПОКА его условие ИСТИННО. В вашей трактовке 'цыкл ждал пока оба значения не станут меньше нуля' нужно понимать так - цикл ЗАКОНЧИЛСЯ, когда оба значения стали меньше или равны нулю. Как вы понимаете, 'ВЫПОЛНЯТЬСЯ' и 'ЗАКОНЧИТСЯ' - это 2 диаметрально противоположных условия. В while записывается первое - условие ПРОДОЛЖЕНИЯ цикла. Вы пытаетесь его трактовать как второе - условие ОКОНЧАНИЯ, а это ИНВЕРСИЯ условия в while.

Т.е. цикл - while((us_hp>0)   ||  (ai_hp>0))
Условие, при котором цикл БУДЕТ ВЫПОЛНЯТСЯ - (us_hp>0)   ||  (ai_hp>0)
Условие при котором он ЗАКОНЧИТСЯ - !( (us_hp>0)   ||  (ai_hp>0) ) 
   или (что то же самое)  (us_hp<=0)   &&  (ai_hp<=0)

PM MAIL   Вверх
Fazil6
Дата 8.4.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(Kirgston @  8.4.2009,  10:18 Найти цитируемый пост)
ну я же не слепой. Я ставлю || и он у меня работает как && ! Взял из учебника. || - логическое или, && - логическое И. Когда я ставлю Или то или другое... оно ждет пока 2 значения опускаються в "меньше нуля". 


Цитата(Kirgston @  8.4.2009,  10:18 Найти цитируемый пост)
Ребята... пожалуйста обясните по простому... почему у меня && работает как || то есть он ждет пока одна из переменных не станет меньше нуля, а || работает как &&... то есть он ждет пока обе из переменных не будут меньше нуля... почему так? 

покачану, все правильно у тебя работает.  ТЫ НЕПРАВИЛЬНО представляешь себе как оно должно работать.

Добавлено через 7 минут и 22 секунды
Цитата(Kirgston @  8.4.2009,  11:14 Найти цитируемый пост)
Ну когда я в коде поставил || то цыкл ждал пока оба значения не станут меньше нуля... 

это правильно

Цитата(Kirgston @  8.4.2009,  11:14 Найти цитируемый пост)
но там же стоит ИЛИ... смотрите первый мой пост... там код просто ждал пока оба значения не станут меньше нуля... 

это правильно. Так и должно быть


Цитата(Kirgston @  8.4.2009,  11:14 Найти цитируемый пост)
но вроде при || программа должна ждать пока одна  из переменных не станет меньше нуля...

кто тебе Это сказал? Ничего никто не должен ждать. Не надо читать условия наоборот. 
У тебя написано если us_hp>0 или ai_hp>0 сделай battle().
Где тут написано
Цитата
программа должна ждать пока одна  из переменных не станет меньше нуля...


у тебя написано : пока хотябы одна из этих переменных больше нуля - крутиться в цикле

PM MAIL   Вверх
J0ker
Дата 9.4.2009, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(math64 @ 7.4.2009,  11:59)
zim22: Результат операции > всегда true(1) или false(0), -1 никогда не бывает.

true это всегда true, а false это всегда false
в C++ bool - встроенный тип

Добавлено @ 08:27
Цитата(Kirgston @ 7.4.2009,  11:31)
Вроде он должен проверять 2 параметра и если один из них меньше нуля то ити дальше, а иначе вызывать Баттле. Но не знаю почему... но оно идет дальше только когда оба параметра меньше нуля...

Код

while ( us_hp >= 0 && ai_hp >= 0 ) battle();

или
Код

while ( !(us_hp < 0 || ai_hp < 0) ) battle();

или
Код

while ( !(us_hp < 0) && !(ai_hp < 0) ) battle();


Это сообщение отредактировал(а) J0ker - 9.4.2009, 08:28


--------------------
user posted image
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0791 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.