Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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