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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция if неодолеть никак ее логику, вопрос от новичка по поводу if 
:(
    Опции темы
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   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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