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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция if неодолеть никак ее логику, вопрос от новичка по поводу if 
:(
    Опции темы
MegaUser
Дата 20.12.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



начал недавно изучать С++ и столкнулся с такой непонятностью, помогите разобраться:
условие такое нужно чтобы одна из трех переменных  равнялась такомуто числу, если другие  три переменные равняются еще определенным трем переменным...(надеюсь понятно),
вот что я написал :
Код

if (x=a[0]){x2=50;}
if (y=a[1]){y2=50;}
if (z=a[2]){z2=50;}
else (x2,y2,z2=0);
rezult=(x2+y2+z2)*5;

причем перед этим кодом у меня переменные x y z даже близко неравны a[0],a[1]или a[2], по идее результат должен равняться 0 но в итоге результат у меня получается 50.... почему?
может быть есть более лучший способ реализовать мое условие?, или проконсультируйте чайника что не так делаю..

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


Java-ненавистник :)
****


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

Репутация: 10
Всего: 92



В С++ оператор сравнения это == а не =.

Т.е. надо писать if (x == a[0])  и т.п.

Это сообщение отредактировал(а) Дрон - 20.12.2006, 18:40


--------------------
Да. Именно так.
PM   Вверх
CaptainFlint
Дата 20.12.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


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

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



MegaUser
Сравнение в плюсах - это ==, а одиночное = - это присваивание (даже внутри if'а).


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
MegaUser
Дата 20.12.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



от млин точно, спасибо))) , читал же даже про это, получилось, 
тада еще вопрос: к такому коду я пришел за пол дня, сначала пробовал записать все в одну строчку, щас уже непомню как у меня это выглядело, но ничего неполучалось, поскажите как оформить это одной строкой(через && или ||).
PM MAIL   Вверх
Дрон
Дата 20.12.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 10
Всего: 92



А можешь подробнее объяснить задачу, а то
Цитата(MegaUser @  20.12.2006,  18:35 Найти цитируемый пост)
условие такое нужно чтобы одна из трех переменных  равнялась такомуто числу, если другие  три переменные равняются еще определенным трем переменным...

не слишком понятно, и не очень соотносится с тем, что написано в коде.



--------------------
Да. Именно так.
PM   Вверх
UniBomb
Дата 20.12.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



MegaUser

Код

if (x==a[0]){x2=50;}    if (y==a[1]){y2=50;}    if (z==a[2]){z2=50;}    else (x2,y2,z2=0);


По другому одной строкой не получится...

Это сообщение отредактировал(а) UniBomb - 20.12.2006, 18:59


--------------------
PM MAIL ICQ Skype   Вверх
MegaUser
Дата 20.12.2006, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



To Дрон
я тока как неделю сел за с++ (типа хобби себе придумал), почитаю книжки прикину в голове задачу(так как книжные неочень), и пытаюсь ее реализовать, вот и сегодня почитав , поставил себе задачу написать чтото типа джек пота(казиношная игра) , есть три случайно выпадающие цифры, и соответственно нужно написать алгоритм расчета выигрыша , т.е если я набрал 123,
а выпало 456 выигрыш =0 , а если 156 выпало то скажем выигрыш равен 250....
To UniBomb
а почему нельзя через "и" или "или" реализовать?
PM MAIL   Вверх
Partizan
Дата 20.12.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Цитата

По другому одной строкой не получится...


А так слабо?

Код

if (x == a[0] && y == a[1] && z == a[2]){
x2 = 50;
y2 = 50;
z2 = 50;
}



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
bilbobagginz
Дата 20.12.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



Цитата

от млин точно, спасибо))) , читал же даже про это, получилось, 
тада еще вопрос: к такому коду я пришел за пол дня, сначала пробовал записать все в одну строчку, щас уже непомню как у меня это выглядело, но ничего неполучалось, поскажите как оформить это одной строкой(через && или ||).

совет: при сравнении  с  константой, ставь константу слева от ==.
тогда если ошибешься, и оставишь "=", при компиляции выйдет ошибка.
Код

const int c=3; // c - константа
int c_var=3;   // c_var - переменная
int x=5;
if (c_var=x) {. .. } // прокатит, и будешь искать в отладчике - где же ты ошибся
if (х=c_var) {. .. } // прокатит, и будешь искать в отладчике - где же ты ошибся
if (c=х) {. .. }        // не прокатит, компилятор закричит. :)





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Дрон
Дата 20.12.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 10
Всего: 92



Цитата(MegaUser @  20.12.2006,  19:04 Найти цитируемый пост)
есть три случайно выпадающие цифры, и соответственно нужно написать алгоритм расчета выигрыша , т.е если я набрал 123,
а выпало 456 выигрыш =0 , а если 156 выпало то скажем выигрыш равен 250....

Во! Совсем другое дело. Сейчас подумаю... smile

Код
result = ( (x==a[0]) + (y==a[1]) + (z==a[2]) ) * 250;


Вуаля smile
Хитрость в том, что в Си можно считать, что истина (true) равна 1, а ложь (false) -- 0. Ну и наоборот, если понадобится smile

Это сообщение отредактировал(а) Дрон - 20.12.2006, 19:15


--------------------
Да. Именно так.
PM   Вверх
UniBomb
Дата 20.12.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



MegaUser
Partizan

Я не понял смысл сказанного:

Цитата

условие такое нужно чтобы одна из трех переменных  равнялась такомуто числу, если другие  три переменные равняются еще определенным трем переменным...


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

Здесь же:
Код

if (x == a[0] && y == a[1] && z == a[2]){    
x2 = 50;    
y2 = 50;    
z2 = 50;    
}


Присваивается значение всем переменным, но только в случае всеобщего равенства (x == a[0] && y == a[1] && z == a[2])


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


--------------------
PM MAIL ICQ Skype   Вверх
bilbobagginz
Дата 20.12.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



Цитата

Вуаля smile
Хитрость в том, что в Си можно считать, что истина (true) равна 1, а ложь (false) -- 0. Ну и наоборот, если понадобится smile

мне рассказывали, что единственное что могут обещать в Си - false == 0
a то, что true == 1 я не слышал. ( не факт что это не правда )
может быть один компилятор и реализует true через 1.
а другой может и не реализует.




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Xenon
Дата 20.12.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



Истина все, что не 0 


--------------------
user posted image  
PM MAIL   Вверх
Дрон
Дата 20.12.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 10
Всего: 92



Цитата
мне рассказывали, что единственное что могут обещать в Си - false == 0

Ок, не буду говорить за Си, но в С++ это должно быть определено однозначно:
http://msdn2.microsoft.com/en-us/library/t...80a(VS.80).aspx
Цитата
The bool type participates in integral promotions. An r-value of type bool can be converted to an r-value of type int, with false becoming zero and true becoming one.


То же самое упоминается здесь: http://www.kuzbass.ru:8086/docs/isocpp/conv.html в пункте 4.5.4.

Это сообщение отредактировал(а) Дрон - 20.12.2006, 22:29


--------------------
Да. Именно так.
PM   Вверх
MegaUser
Дата 21.12.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Дрон @ 20.12.2006,  19:13)

Код
result = ( (x==a[0]) + (y==a[1]) + (z==a[2]) ) * 250;


Вуаля smile
Хитрость в том, что в Си можно считать, что истина (true) равна 1, а ложь (false) -- 0. Ну и наоборот, если понадобится smile

вот про "истина (true) равна 1, а ложь (false) -- 0" - ценная информация, ее и буду использовать....
спасибо smile ...
а, опять столкнулся с непонятками, вот еще  вопрос:
почему 
Код

cin >> x,x1;
тыры пыры.....
cin>>y,y1;
тыры пыры итд.....

if (x1==a[0]){x1=1;}
if (y1==a[1]){y1=1;}
if (z1==a[2]){z1=1;} 
//else (x1,y1,z1=0); - это можно писать можно нет результата никакого
mnoj=( x1+ y1+ z1);

if (x==a[0]){x2=50;}
if (y==a[1]){y2=50;}
if (z==a[2]){z2=50;} 
else (x2,y2,z2=0);

rez=mnoj*(x2+y2+z2)

у меня mnoj равна всегда 0 почему?, вроде все верно сделал......

Это сообщение отредактировал(а) MegaUser - 21.12.2006, 12:16
PM MAIL   Вверх
Anikmar
Дата 21.12.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

вот про "истина (true) равна 1, а ложь (false) -- 0" - ценная информация, ее и буду использовать....
спасибо  ...


Я бы всетаки ориентировался, что ложь это 0, а истина - все остальное. Потому, что если алгоритм будет заточен именно на то, что истина 1, то возможна его неправильная работа:

Код

int i; 

//i = Некоторое значение, которое должно быть 1 при правильной работе
// Если здесь i получает значение 2 или любое другое, то слудующее условие отработает неправильно

if (i) { ... Ветка, которая правильная}

// А вот такой подход будет работать надежнее
if(!i) { Ветка, которая "неправильная"}


В любом случае лично я использую явное сравнение - 100% гарантия успеха
if (i==0) { ...} else {...}
PM MAIL ICQ   Вверх
WatchCat
Дата 21.12.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Anikmar @  21.12.2006,  22:45 Найти цитируемый пост)
Я бы всетаки ориентировался, что ложь это 0, а истина - все остальное. Потому, что если алгоритм будет заточен именно на то, что истина 1, то возможна его неправильная работа:

Дело в том, что if может проверять не только  тип bool, так ещё с C пошло. Поэтому надо всегда учитывать что true это всё что не 0.
Код

int t = 5;
if(t){
    cout << "Passed if(5)" << endl;
}
t = 0;
if(t){ // не отработает.
    cout << "Passed if(0)" << endl;
}
cout << "end" << endl;


Результат будет 
Код

Passed if(5)
end


 smile 

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


Новичок



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

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



MegaUser, хмм.. судя по твоей задаче, при подсчете mnoj тебе вместо 

if (x1==a[0]){x1=1;}

нужно поставить 

if (x==a[0]){x1=1;}

Это сообщение отредактировал(а) Little_Lamer - 21.12.2006, 17:41
PM MAIL   Вверх
MegaUser
Дата 21.12.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Little_Lamer @ 21.12.2006,  17:40)
MegaUser, хмм.. судя по твоей задаче, при подсчете mnoj тебе вместо 

if (x1==a[0]){x1=1;}

нужно поставить 

if (x==a[0]){x1=1;}

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

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  и когда мне понадобится?, или отошлите где это обсуждалось, чето я порыскал по форуму и ненашел(поиск неработает кстати на форуме)... 

Это сообщение отредактировал(а) MegaUser - 21.12.2006, 18:52
PM MAIL   Вверх
Anikmar
Дата 21.12.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если есть 100% гарантия, что true == 1 то будет работать. Лично у меня ее нет - так как лично сталкивался с компилятором, который true преобразовывал в -1 (не помню какой - давно было)

Лично я бы сделал так (может подлиньше, но 100% работать будет)

Код

int  k=0;
if (x == a[0]) k++;
if (y == a[1]) k++;
if (z == a[2]) k++;
rez = 5*k;

PM MAIL ICQ   Вверх
JackYF
Дата 21.12.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



else (x2,y2,z2=0);

замени на 
Код

else (x2=y2=z2=0);


Оператор запятая в С++ имеет совсем другой смысл.

Это сообщение отредактировал(а) JackYF - 21.12.2006, 19:31


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Daevaorn
Дата 21.12.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 51
Всего: 70



Цитата(Anikmar @  21.12.2006,  20:21 Найти цитируемый пост)
Если есть 100% гарантия, что true == 1 то будет работать.

Тут уже говорилось, в стандарте прописано, что при преобразовании rvalue типа  bool к rvalue типа int, false -> 0 и true -> 1
Если же идет обратное преобразование, то: 0, нулевой указатель, нулевой указатель на метод -> false, всё остальное -> true
PM MAIL WWW   Вверх
Anikmar
Дата 21.12.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Видимо с -1 у меня компилятор Си был. Не помню, давно было, но после этого такие конструкции я не использую (да и большого смысла нет).

Конечно На С++ можно в одну строку записать абалденную конструкцию. Но когда к такому приколу возвращаешься через пол-года, то весьма много о себе же вслух произносишь нецензурного, пытаясь врубиться в то, что сам написал.
PM MAIL ICQ   Вверх
Дрон
Дата 21.12.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 10
Всего: 92



Цитата(Anikmar @  21.12.2006,  20:28 Найти цитируемый пост)
Видимо с -1 у меня компилятор Си был.

Я такое знаю только в Бейсике.

Цитата(Anikmar @  21.12.2006,  20:28 Найти цитируемый пост)
Конечно На С++ можно в одну строку записать абалденную конструкцию. Но когда к такому приколу возвращаешься через пол-года, то весьма много о себе же вслух произносишь нецензурного, пытаясь врубиться в то, что сам написал. 

Угу. Я и не говорю, что так стоит делать. Просто раз попросили одной строкой -- я и записал smile


--------------------
Да. Именно так.
PM   Вверх
UniBomb
Дата 22.12.2006, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



MegaUser, потому что неправильно написано - else не проверяет на истинность, потому оно и переводится как иначе. Ты логически построй структуру если тырыпыры, иначе трам-пам-пам. А тот вариант, что у тебя написан должен выглядеть так:

Код

if (x1 == a[0] {...}
else if (y1 == a[1] {...}
else if (z1 == a[2]) {...}
else {mnoj= x1+ y1+ z1;}


Здесь проверяется переменная x1, если она равна числу а, то остальное даже не проверяется... Тоже самое относится к остальным переменным... Ну и в конце, если ни одна переменная не подходит, то находим mnoj...


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


Новичок



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

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



спасибо всем, много чего нового(чего в книжках нету) узнал, вот что у меня в итоге получилось:
посмотрите как гуру может  надо что то не так делать или как то по другому, мне важно мнение специалистов, так как для меня, то что  я написал - все как надо, тока несмеятся если есть глупые какие нить вещи в ней, третья по счету моя програмулина 
Код

#include "iostream"

  using namespace std;
    int x;
    int y;
    int z;
    int x2;
    int y2;
    int z2;
    int rez;
    int rez2;
    int nal=10;
    int stavka;
 int rezult();
 int main();
 int man2();

 int main()
{

    cout << "*********************************************\n";
    cout << "*********************************************\n";
    cout << "***************IGRA TIPA KAZINO**************\n";
    cout << "*********************************************\n";
    cout << "*********************************************\n\n";
    nal=rez2+nal;
    if (nal<=0){cout <<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n*********GAME OVER***********\n\n\n\n\n\n\n\n\n\n\n\n\n\n";nal=10; system("PAUSE");}
    cout << "=================NALICHKA: "<< nal<<"================\n";
    cout <<"VVEDI STAVKU:  ";
    cin>> stavka;
    if (stavka>nal){cout <<"NIFIGA!!!!  U TEBYA STOKA NALICHKI NETU!!!\n<<";main();}
 man2();
}
int man2()
{
    cout <<"Vvedi pervoe chislo ot 1 do 9:  ";
    cin>>x;
    cout <<"Vvedi vtoroe chislo ot 1 do 9:  ";
    cin>>y;
    cout <<"Vvedi trtie chislo  ot 1 do 9:  ";
    cin>>z;
 const int n=3;//генератор случайных чисел(тока он странный какойто)
 int a[n];
 cout<<"##########VYPALI CHISLA#########"<<endl;
  for (int i=0; i<n; i++)
  {
      a[i]=rand()%9+1;
      cout<< "################################"<<a[i]<<"\n";
  };
//это условия для расчета результата
if (x==a[0]&&y==a[1]&&z==a[2]){rez=50;cout<< "\n!!!NU TIPA BINGO!!!! VSE UGADAL!!!\n";rezult(); }
else rez=0;
if (x==a[0]||y==a[1]||z==a[2]){rez=5*( (x==a[0]) + (y==a[1]) + (z==a[2]) ); rezult();}
else rez=0;
if (x==a[2]||x==a[1]){x2=2;}
else x2=0;
if (y==a[0]||y==a[2]){y2=2;}
else y2=0;
if (z==a[0]||z==a[1]){z2=2;}
else z2=0;
//конец условий  исчисления результата
rezult();//передаю управление функции для расчета результата
}
int rezult()
{
rez2=((rez+x2+y2+z2)*stavka-stavka);
cout <<"\nVuygral stolko: "<<rez2<<"\nStavka byla:  "<<stavka <<"\n";
main();//прыгаем в начало где идет расчет ниличности и ввода ставки
}
 
PM MAIL   Вверх
Anikmar
Дата 22.12.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ой-ой. Так нельзя делать:

Код

int rezult()
{
rez2=((rez+x2+y2+z2)*stavka-stavka);
cout <<"\nVuygral stolko: "<<rez2<<"\nStavka byla:  "<<stavka <<"\n";
main();//прыгаем в начало где идет расчет ниличности и ввода ставки
}


Если ты будешь вызывать main по кругу - постоянно сжирать стек будешь.
Про то, что это вечный кайф получится - я молчу (как выйти из программы интересно? - Только по Ctrl+c?)

Общая структура должна быть такая:
Код

main()
{
   do
   {
      // Тут вызываем меню или ставку
      // и вызываем result
   } while (не условие выхода из цикла)
}
result()
{
  // Тут считаем бабло
}


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


Новичок



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

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



спасиб за подсказку.... ща попробую что нить сделать..
выход только по Ctrl+c, ибо я недодумаюсь никак как сделать выход из программы скажем по нжатию кнопки Q... 
вот так получилось теперь, main нетрогается, правильно ли?? а для чего в main был совет для использования do/while?
и еще про сжирание стека, это только касаемо только main , или другие тоже нежелательно покругу пускать? 
Код

#include "iostream"

  using namespace std;
    int x;
    int y;
    int z;
    int x2;
    int y2;
    int z2;
    int rez;
    char quit;
    int rez2;
    int nal=10;
    int stavka;
 int rezult();
 int main();
 int man2();

 int main()
{
    cout << "*********************************************\n";
    cout << "*********************************************\n";
    cout << "***************IGRA TIPA KAZINO**************\n";
    cout << "*********************************************\n";
    cout << "*********************************************\n\n";
rezult();//ïîñëå âñòóïëåíèÿ -> ê ðàñ÷åòàì
 }
int man2()
{
    cout <<"Vvedi pervoe chislo ot 1 do 9:  ";
    cin>>x;
    cout <<"Vvedi vtoroe chislo ot 1 do 9:  ";
    cin>>y;
    cout <<"Vvedi trtie chislo  ot 1 do 9:  ";
    cin>>z;
 const int n=3;//ãåíåðàòîð ñëó÷àéíûõ ÷èñåë(òîêà îí ñòðàííûé êàêîéòî)
 int a[n];
 cout<<"##########VYPALI CHISLA#########"<<endl;
  for (int i=0; i<n; i++)
  {
      a[i]=rand()%9+1;
      cout<< "################################"<<a[i]<<"\n";
  };
//ýòî óñëîâèÿ äëÿ ðàñ÷åòà ðåçóëüòàòà, òàê äî êîíöà òîëêîì è íåïðîðàáîòàë
if (x==a[0]&&y==a[1]&&z==a[2]){rez=50;cout<< "\n!!!NU TIPA BINGO!!!! VSE UGSDAL!!!\n";rezult(); }
else rez=0;
if (x==a[0]||y==a[1]||z==a[2]){rez=5*( (x==a[0]) + (y==a[1]) + (z==a[2]) ); rezult();}
else rez=0;
if (x==a[2]||x==a[1]){x2=2;}
else x2=0;
if (y==a[0]||y==a[2]){y2=2;}
else y2=0;
if (z==a[0]||z==a[1]){z2=2;}
else z2=0;
//êîíåö óñëîâèé íåïðîðàáîòàííûõ äëÿ èñ÷èñëåíèÿ ðåçóëüòàòà
rezult();//ïåðåäàþ óïðàâëåíèå ôóíêöèè äëÿ ðàñ÷åòà ðåçóëüòàòà
}
int rezult()
{
    cout << "TO QUIT PRESS: q  TO PLAY PRESS: p  ";
    cin>> quit;
    if (quit =='q'||quit =='Q') exit(0);
    else
rez2=((rez+x2+y2+z2)*stavka-stavka);
cout <<"\nVuygral stolko: "<<rez2<<"\nStavka byla:  "<<stavka <<"\n";
nal=rez2+nal;
    if (nal<=0)
    {cout <<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n*********GAME OVER***********\n\n\n\n\n\n\n\n\n\n\n\n\n\n";stavka=0;nal=10; system("PAUSE");main();}
    cout << "=================NALICHKA: "<< nal<<"================\n";

    cout <<"VVEDI STAVKU:  ";
    cin>> stavka;
    if (stavka>nal)
    {stavka=0;cout <<"NIFIGA!!!!  U TEBYA STOKA NALICHKI NETU!!!\n<<";
    rezult();}
 man2();
}


от терь с выходом из программы заморочился.... как это реализовать то? smile ...
все привинтил "выход" неполучалось изза того что писал  q вместо 'q' тока он неудобно реализован, но это фигня, главное получилоь, потом можно подумать куда его лучше впихнутьsmile 

Это сообщение отредактировал(а) MegaUser - 22.12.2006, 14:27
PM MAIL   Вверх
Anikmar
Дата 22.12.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Грубо говоря "Те же яйца вид сбоку"

Последовательность вызовов:
main -> man2 -> result ->man2 ...

Нет возвратов.

Я набросал схему вызовов - там без цикла никак не обойтись (goto исключаю - не тот случай)


PM MAIL ICQ   Вверх
MegaUser
Дата 22.12.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



чето я недопонимаю логики для чего нужно do/while , она ведь будет все равно обращатся к функциям main -> man2 -> result ->man2 только внутри будет условие "do  .....  while",
объясни этот момент, если можно, я так чувствую что то важное упускаю.....
еще, я подумал,  может скакать между функциями так?:
    return rezult(),0;
 return man2(),0;


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


Эксперт
****


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

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



Цитата(MegaUser @ 22.12.2006,  15:42)
чето я недопонимаю логики для чего нужно do/while , она ведь будет все равно обращатся к функциям main -> man2 -> result ->man2 только внутри будет условие "do  .....  while",
объясни этот момент, если можно, я так чувствую что то важное упускаю.....
еще, я подумал,  может скакать между функциями так?:
    return rezult(),0;
 return man2(),0;

Нет, это тоже ерунда получается.

Делаем функцию main
В ней цикл. Я не могу набрасывать сразу походу - я не помню синтаксис консольных команд (не разу с ними не работал) - поэтому набрасываю алгоритм:
Код

main()
{
  char Otvet
  do  // Начинаем гонять по кругу игрушку
  {
      // Ведите числа - тут пользователь вводит числа
      Result(); // Тут рассчитываем бабло
      // Тут выводим итоговое количество денег
      // Теперь спрашиваем пользователя: Вы хотите сыграть еще раз?
      // команда типа  с = getche();
  } while (Otvet = 'y'); // Продолжаем цикл пока пользователь радостно жмет y (в смысле YES!!!!)
  // Сюда попадаем, если наглый пользователь отказался играть - просто выходим из программы
}

void Result(void)
{
  // Здесь мы считаем бабло
  // для возврата никаких команд не надо, в крайнем случае return;
}


PM MAIL ICQ   Вверх
MegaUser
Дата 22.12.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ага, кажется дошло, я немного нетак сначала тебя понял  smile , терь уже тока в понедельник попрактикуюсь....
спасибы ... 
осталось только чтобы все заработало что у меня в голове придумалось(только одно нестыкуется "пользователь радостно жмет y" - нехотелось чтобы он постоянно жал "y" чтобы продолжить цикл) , и тема можно считать пройдена...
PM MAIL   Вверх
KelTron
Дата 22.12.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



16 строчка в коде MegaUserа, абсолютно бесполезная 


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Anikmar
Дата 22.12.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MegaUser @  22.12.2006,  17:29 Найти цитируемый пост)
ага, кажется дошло, я немного нетак сначала тебя понял   , терь уже тока в понедельник попрактикуюсь....
спасибы ... 
осталось только чтобы все заработало что у меня в голове придумалось(только одно нестыкуется "пользователь радостно жмет y" - нехотелось чтобы он постоянно жал "y" чтобы продолжить цикл) , и тема можно считать пройдена... 

 Ну тогда - сам Бог велел изучать нормальные виндовые приложения.
Сделать окошки, кнопочки.
Можно звук мерзкий добавить. Можно и не мерзкий. 
PM MAIL ICQ   Вверх
apook
Дата 22.12.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include "iostream.h"
#include "stdlib.h"
#include "conio.h"
//using namespace std;    

int x=0;    
int y=0;    
int z=0;    
int x2=0;    
int y2=0;    
int z2=0;    
int rez=0;    
int rez2=0;    
int nal=10;    
long stavka_=0;

long rezult()    
{
return ((rez +x2 +y2 +z2) *stavka_) -stavka_;    
}


long stavka()
{
long l=0;
cout << "=============NALICHKA: " << nal << "============\n";    
cout <<"VVEDI STAVKU:  ";    
cin >> l;
return l;    
}



void main()    
{
int i=0;
char ch;
start:    
cout << "*********************************************\n";    
cout << "*********************************************\n";    
cout << "***************IGRA TIPA KAZINO**************\n";    
cout << "*********************************************\n";    
cout << "*********************************************\n\n";    

while( (stavka_=(stavka())) >nal )
cout << "NIFIGA!!!!  U TEBYA STOKA NALICHKI NETU!!!\n";


cout << "Vvedi pervoe chislo ot 1 do 9:  ";    
cin >> x;    
cout << "Vvedi vtoroe chislo ot 1 do 9:  ";    
cin >> y;    
cout << "Vvedi trtie chislo  ot 1 do 9:  ";    
cin >> z;
    
const int n =3;    
int a[n]; //генератор случайных чисел(тока он странный какойто)
    
cout << "##########VYPALI CHISLA#########" << endl;    

for( i=0; i <n; i++ )    
{
    a[i] =rand() % 9+1;    
    cout << "################################  ->" << a[i] << "\n";    
    }
    
//это условия для расчета результата    
if( x==a[0] && y==a[1] && z==a[2] )
{
    cout << "\n!!!NU TIPA BINGO!!!! VSE UGADAL!!!\n";
    rez =( (x2=a[0]) +(y2=a[1]) +(z2=a[2]) ) +50;
    rez2 =rezult();
    }
    
else if( x==a[0] || y==a[1] || z==a[2] )
{
    rez =(x2=a[0]) +(y2=a[1]) +(z2=a[2]);
    rez2 =rezult();
    }
    
else
{

cout << x << "-x " << y << "-y " << z << "-z\n";
    
    if( x==a[1] || x==a[2] ) x2=2;
    if( y==a[0] || y==a[2] ) y2=2;
    if( z==a[0] || z==a[1] ) z2=2;
    if( x2!=0 || y2 !=0 || z2 !=0 ) rez2 =rezult();
    }

cout << "\nVuygral stolko: " << rez2 << "\nStavka byla:  " << stavka_ << "\n";

if( rez2 ==0 ) nal=nal-stavka_;
else  nal=nal +rez2;
if( nal <=0 )
{
    cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n*********GAME OVER***********\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
    system("PAUSE");
    }
else
{
  cout << "Ќ «  г ⥡п " << nal << "\n";
    }

cout << "Џа®¤®«¦Ёвм ? Y/N:  ";    
cin >> ch;
if( ch =='y' || ch =='Y' ) goto start; //зҐ в® ­Ґ ў Ї ¤«г    

return;    
}

Только rand че то одно и то-же выдает всегда

Это сообщение отредактировал(а) apook - 22.12.2006, 17:54


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
JackYF
Дата 22.12.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(apook @  22.12.2006,  17:52 Найти цитируемый пост)
Только rand че то одно и то-же выдает всегда


apook, ты
Код

srand(time(NULL));

сделал в начале main() ?




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MegaUser
Дата 25.12.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



to Anikmar , я пока недочитал как виндовские проекты собирать пока чертыхаюсь в досовских окнах....((((
to apook некомпилится у меня код этот.....
генератор да дурацкий, другого пока непридумал(но дело времени), поменять int rezult() на long rezult() , это тоже моя недодумка, long будет правильней....
goto ниразу неприменял, везде пишут что нужно стараться обходится без него, и нигде больше про него нерассказывается, что конкретно делает goto(я понимаю что "идти к" может просто есть какие нить нюансы)?
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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