Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > функция if неодолеть никак ее логику |
Автор: MegaUser 20.12.2006, 18:35 | ||
начал недавно изучать С++ и столкнулся с такой непонятностью, помогите разобраться: условие такое нужно чтобы одна из трех переменных равнялась такомуто числу, если другие три переменные равняются еще определенным трем переменным...(надеюсь понятно), вот что я написал :
причем перед этим кодом у меня переменные x y z даже близко неравны a[0],a[1]или a[2], по идее результат должен равняться 0 но в итоге результат у меня получается 50.... почему? может быть есть более лучший способ реализовать мое условие?, или проконсультируйте чайника что не так делаю.. |
Автор: Дрон 20.12.2006, 18:39 |
В С++ оператор сравнения это == а не =. Т.е. надо писать if (x == a[0]) и т.п. |
Автор: CaptainFlint 20.12.2006, 18:39 |
MegaUser Сравнение в плюсах - это ==, а одиночное = - это присваивание (даже внутри if'а). |
Автор: MegaUser 20.12.2006, 18:52 |
от млин точно, спасибо))) , читал же даже про это, получилось, тада еще вопрос: к такому коду я пришел за пол дня, сначала пробовал записать все в одну строчку, щас уже непомню как у меня это выглядело, но ничего неполучалось, поскажите как оформить это одной строкой(через && или ||). |
Автор: UniBomb 20.12.2006, 18:58 | ||
MegaUser,
По другому одной строкой не получится... |
Автор: MegaUser 20.12.2006, 19:04 |
To Дрон я тока как неделю сел за с++ (типа хобби себе придумал), почитаю книжки прикину в голове задачу(так как книжные неочень), и пытаюсь ее реализовать, вот и сегодня почитав , поставил себе задачу написать чтото типа джек пота(казиношная игра) , есть три случайно выпадающие цифры, и соответственно нужно написать алгоритм расчета выигрыша , т.е если я набрал 123, а выпало 456 выигрыш =0 , а если 156 выпало то скажем выигрыш равен 250.... To UniBomb а почему нельзя через "и" или "или" реализовать? |
Автор: Partizan 20.12.2006, 19:05 | ||||
А так слабо?
|
Автор: bilbobagginz 20.12.2006, 19:06 | ||||
совет: при сравнении с константой, ставь константу слева от ==. тогда если ошибешься, и оставишь "=", при компиляции выйдет ошибка.
|
Автор: Дрон 20.12.2006, 19:13 | ||||
Во! Совсем другое дело. Сейчас подумаю... ![]()
Вуаля ![]() Хитрость в том, что в Си можно считать, что истина (true) равна 1, а ложь (false) -- 0. Ну и наоборот, если понадобится ![]() |
Автор: UniBomb 20.12.2006, 19:14 | ||||
MegaUser, Partizan, Я не понял смысл сказанного:
Но судя по листингу - если какая то из переменных равна какому то числу, то другой переменной с той же буквой присвоить значение 50. Здесь же:
Присваивается значение всем переменным, но только в случае всеобщего равенства (x == a[0] && y == a[1] && z == a[2]) Оба куска кода которые вы написали будут выполнять разные действия. |
Автор: bilbobagginz 20.12.2006, 19:43 | ||
мне рассказывали, что единственное что могут обещать в Си - false == 0 a то, что true == 1 я не слышал. ( не факт что это не правда ) может быть один компилятор и реализует true через 1. а другой может и не реализует. |
Автор: Xenon 20.12.2006, 20:10 |
Истина все, что не 0 |
Автор: Дрон 20.12.2006, 22:27 | ||||
Ок, не буду говорить за Си, но в С++ это должно быть определено однозначно: http://msdn2.microsoft.com/en-us/library/tf4dy80a(VS.80).aspx
То же самое упоминается здесь: http://www.kuzbass.ru:8086/docs/isocpp/conv.html в пункте 4.5.4. |
Автор: MegaUser 21.12.2006, 12:03 | ||||||
вот про "истина (true) равна 1, а ложь (false) -- 0" - ценная информация, ее и буду использовать.... спасибо ![]() а, опять столкнулся с непонятками, вот еще вопрос: почему
у меня mnoj равна всегда 0 почему?, вроде все верно сделал...... |
Автор: Anikmar 21.12.2006, 15:45 | ||||
Я бы всетаки ориентировался, что ложь это 0, а истина - все остальное. Потому, что если алгоритм будет заточен именно на то, что истина 1, то возможна его неправильная работа:
В любом случае лично я использую явное сравнение - 100% гарантия успеха if (i==0) { ...} else {...} |
Автор: WatchCat 21.12.2006, 17:27 | ||||||
Дело в том, что if может проверять не только тип bool, так ещё с C пошло. Поэтому надо всегда учитывать что true это всё что не 0.
Результат будет
![]() |
Автор: Little_Lamer 21.12.2006, 17:40 |
MegaUser, хмм.. судя по твоей задаче, при подсчете mnoj тебе вместо if (x1==a[0]){x1=1;} нужно поставить if (x==a[0]){x1=1;} |
Автор: MegaUser 21.12.2006, 18:14 | ||
да и те и те переменные вставлял, результат один и тотже, на этот вариант расчета я в итоге забил и сделал чуть подругому, просто очнь интересно было почему неработает такой код...... плохо что непонятно изза чего он непашет можно лопухнутся следующий раз с чем нибудь.. to Anikmar: я вот так у себя правду ложь реализовал : if (x==a[0]||y==a[1]||z==a[2]){rez=5*( (x==a[0]) + (y==a[1]) + (z==a[2]) ); rezult();} можеш на этом примере подсказать как подстраховаться, а то я тока начал изучать с++ и чесно говоря невъехал как это: if (i==0) { ...} else {...} и еще у меня вопрос некасаемо if, в начале я прописываю #include "iostream" что это я примерно понял, но вот иногда возникают мысли насчет того , как определить что мне нужно в программе добавить #include "iomanip" или что то еще, короче как узнать какой #include и когда мне понадобится?, или отошлите где это обсуждалось, чето я порыскал по форуму и ненашел(поиск неработает кстати на форуме)... |
Автор: Anikmar 21.12.2006, 19:21 | ||
Если есть 100% гарантия, что true == 1 то будет работать. Лично у меня ее нет - так как лично сталкивался с компилятором, который true преобразовывал в -1 (не помню какой - давно было) Лично я бы сделал так (может подлиньше, но 100% работать будет)
|
Автор: JackYF 21.12.2006, 19:30 | ||
else (x2,y2,z2=0); замени на
Оператор запятая в С++ имеет совсем другой смысл. |
Автор: Daevaorn 21.12.2006, 19:33 |
Тут уже говорилось, в стандарте прописано, что при преобразовании rvalue типа bool к rvalue типа int, false -> 0 и true -> 1 Если же идет обратное преобразование, то: 0, нулевой указатель, нулевой указатель на метод -> false, всё остальное -> true |
Автор: Anikmar 21.12.2006, 20:28 |
Видимо с -1 у меня компилятор Си был. Не помню, давно было, но после этого такие конструкции я не использую (да и большого смысла нет). Конечно На С++ можно в одну строку записать абалденную конструкцию. Но когда к такому приколу возвращаешься через пол-года, то весьма много о себе же вслух произносишь нецензурного, пытаясь врубиться в то, что сам написал. |
Автор: Дрон 21.12.2006, 22:29 | ||
Я такое знаю только в Бейсике.
Угу. Я и не говорю, что так стоит делать. Просто раз попросили одной строкой -- я и записал ![]() |
Автор: UniBomb 22.12.2006, 00:59 | ||
MegaUser, потому что неправильно написано - else не проверяет на истинность, потому оно и переводится как иначе. Ты логически построй структуру если тырыпыры, иначе трам-пам-пам. А тот вариант, что у тебя написан должен выглядеть так:
Здесь проверяется переменная x1, если она равна числу а, то остальное даже не проверяется... Тоже самое относится к остальным переменным... Ну и в конце, если ни одна переменная не подходит, то находим mnoj... |
Автор: MegaUser 22.12.2006, 11:19 | ||
спасибо всем, много чего нового(чего в книжках нету) узнал, вот что у меня в итоге получилось: посмотрите как гуру может надо что то не так делать или как то по другому, мне важно мнение специалистов, так как для меня, то что я написал - все как надо, тока несмеятся если есть глупые какие нить вещи в ней, третья по счету моя програмулина
|
Автор: Anikmar 22.12.2006, 11:53 | ||||
Ой-ой. Так нельзя делать:
Если ты будешь вызывать main по кругу - постоянно сжирать стек будешь. Про то, что это вечный кайф получится - я молчу (как выйти из программы интересно? - Только по Ctrl+c?) Общая структура должна быть такая:
|
Автор: MegaUser 22.12.2006, 12:51 | ||
спасиб за подсказку.... ща попробую что нить сделать.. выход только по Ctrl+c, ибо я недодумаюсь никак как сделать выход из программы скажем по нжатию кнопки Q... вот так получилось теперь, main нетрогается, правильно ли?? а для чего в main был совет для использования do/while? и еще про сжирание стека, это только касаемо только main , или другие тоже нежелательно покругу пускать?
от терь с выходом из программы заморочился.... как это реализовать то? ![]() все привинтил "выход" неполучалось изза того что писал q вместо 'q' тока он неудобно реализован, но это фигня, главное получилоь, потом можно подумать куда его лучше впихнуть ![]() |
Автор: Anikmar 22.12.2006, 14:50 |
Грубо говоря "Те же яйца вид сбоку" Последовательность вызовов: main -> man2 -> result ->man2 ... Нет возвратов. Я набросал схему вызовов - там без цикла никак не обойтись (goto исключаю - не тот случай) |
Автор: MegaUser 22.12.2006, 15:42 |
чето я недопонимаю логики для чего нужно do/while , она ведь будет все равно обращатся к функциям main -> man2 -> result ->man2 только внутри будет условие "do ..... while", объясни этот момент, если можно, я так чувствую что то важное упускаю..... еще, я подумал, может скакать между функциями так?: return rezult(),0; return man2(),0; |
Автор: Anikmar 22.12.2006, 16:45 | ||||
Нет, это тоже ерунда получается. Делаем функцию main В ней цикл. Я не могу набрасывать сразу походу - я не помню синтаксис консольных команд (не разу с ними не работал) - поэтому набрасываю алгоритм:
|
Автор: MegaUser 22.12.2006, 17:29 |
ага, кажется дошло, я немного нетак сначала тебя понял ![]() спасибы ... осталось только чтобы все заработало что у меня в голове придумалось(только одно нестыкуется "пользователь радостно жмет y" - нехотелось чтобы он постоянно жал "y" чтобы продолжить цикл) , и тема можно считать пройдена... |
Автор: KelTron 22.12.2006, 17:33 |
16 строчка в коде MegaUserа, абсолютно бесполезная |
Автор: Anikmar 22.12.2006, 17:35 | ||
Ну тогда - сам Бог велел изучать нормальные виндовые приложения. Сделать окошки, кнопочки. Можно звук мерзкий добавить. Можно и не мерзкий. |
Автор: apook 22.12.2006, 17:52 | ||
Только rand че то одно и то-же выдает всегда |
Автор: JackYF 22.12.2006, 18:05 | ||
apook, ты
сделал в начале main() ? |
Автор: MegaUser 25.12.2006, 10:48 |
to Anikmar , я пока недочитал как виндовские проекты собирать пока чертыхаюсь в досовских окнах....(((( to apook некомпилится у меня код этот..... генератор да дурацкий, другого пока непридумал(но дело времени), поменять int rezult() на long rezult() , это тоже моя недодумка, long будет правильней.... goto ниразу неприменял, везде пишут что нужно стараться обходится без него, и нигде больше про него нерассказывается, что конкретно делает goto(я понимаю что "идти к" может просто есть какие нить нюансы)? |