Глава 4. Возвращаемые значения
В детстве, когда я только начал изучать программирование, самой первой
непонятной вещью для меня были "Return Values" - значения, возвращаемые
вызванной функцией.
Сейчас попробую Вам рассказать так, чтобы было понятно. Есть функция
- например, "синус". Мы вызываем эту функцию, написав, обычно, в программе
y = sin(x) ;
Надеюсь, вы догадываетесь, что в тексте программы такая
строка означает не уравнение, которое нужно решить. Если не догадываетесь,
объясняю: мы вызываем функцию "синус", подсунув ей какое-то число "х".
Функция вычисляется и результат вычисления синуса присваивается переменной
"у". Так вот это вычисленное функцией значение и называется "возвращаемым
значением". Любая функция всегда возвращает какое-либо значение в то "место",
откуда она была вызвана. Причем, мы можем написать в программе просто
sin(x) ;
При этом функция "синус" вычислит значение синуса "х", и обязательно
вернет это значение. Вот только в этом случае оно ничему не присвоится
и пропадет.
А теперь вернемся в главу 2 - где мы создавали сообщения
с помощью команды MessageBox. MessageBox - это тоже функция. Мы ее вызываем,
подсовывая (передавая) ей некоторые значения (тексты) и параметры-флаги.
Эта функция рисует на экране окно сообщения. Когда мы нажимаем на кнопку
в этом сообщении - именно в этот момент функция считается полностью выполненной
- и ВОЗВРАЩАЕТ вызвавшей ее программе какое-то значение. Что она может
возвращать? Вспомним,что мы рассматривали возможные варианты сообщений
- с тремя кнопками. Так вот, значение, которое вернет функция MessageBox,
будет зависеть от того, на какую кнопку мы (пользователь программы) нажмем.
Давайте научим нашу программу понимать, на какую кнопку
в сообщении мы нажали. Заодно и познакомимся с оператором "если" - "if".
Введем в наше обычное место в файле "2000dlgc.cpp" следующие строки:
void T2000DlgClient::BNClickedOne()
{
// INSERT>> Your code here.
if ( (MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!",
"Наше сообщение", MB_YESNO | MB_ICONINFORMATION) ) == IDYES)
{
MessageBox("А теперь Вы нажали\nна кнопку YES/ДА",
"Наше второе сообщение", MB_ОК | MB_ICONWARNING);
}
else
{
MessageBox("А теперь Вы нажали\nна кнопку NO/НЕТ",
"Наше второе сообщение", MB_ОК | MB_ICONSTOP);
}
}
Обратите внимание, что в нашем первом сообщении мы указали
флаг MB_YESNO вместо MB_ОК - в результате мы получим окно сообщения с
двумя кнопками - "ДА" и "НЕТ". Далее - в принципе, мы могли бы добавить
в программу новую переменную, потом присваивать ей значение, возвращаемое
функцией MessageBox - точно так же, как мы действуем с функцией "синус";
а потом мы сравнили бы эту переменную с IDYES и т.д. Но зачем нам лишние
переменные? Мы сразу сравниваем функцию MessageBox (а точнее - значение,
ею возвращаемое) с интересующим нас значением, а именно IDYES. Вот в этой
части -
if ( (MessageBox(...) ) == IDYES)
и происходит сравнение. Знак "==" - это логический оператор
"равно". Я сам до сих пор, когда пишу программы, путаю его с оператором
присвоения - одиночным знаком "=". Ошибка страшная - поскольку с точки
зрения языка это все допустимо - и компилляция не выдает ошибки - а программа
работает не так, как задумано.
Но вернемся к нашей программе. Уточним теперь синтаксис оператора "если":
if ( условие )
{
действие, выполняемое, если условие истинно
}
else
{
действие, выполняемое, если условие ложно
}
Второй части может и не быть, т.е. оператор может выглядеть следующим
образом:
if ( условие )
{
действие, выполняемое, если условие истинно
}
Это пишется в случае, когда мы делаем что-то лишь в случае истинности
условия, а в случае невыполнения условия мы не делаем никаких действий.
В нашем примере программа будет работать следующим образом:
Дойдя до строки с оператором "если", она полезет внутрь - к условию сравнения.
Там она выяснит, что в одной из частей, подлежащих сравнению, должно стоять
значение, возвращаемое функцией MessageBox. Программе "придется" вызвать
эту функцию, в результате чего мы увидим на экране наше сообщение с двумя
кнопками - см.рис.4.1.
Рис. 4.1. Сообщение с двумя кнопками.
Затем программа будет ждать, пока мы не нажмем одну из
кнопок. Как только мы это сделаем, функция MessageBox вернет программе
одно из двух значений - IDYES, если мы нажали кнопку YES, или IDNO, если
мы нажали кнопку NO. Программа возьмет это значение и проверит, не равно
ли оно второй части условия - а там мы записали IDYES. Если равно - значит,
условие истинно - и программа выполнит то, что написано в первых фигурных
скобках - т.е. снова вызовет функцию MessageBox, но уже с другими параметрами
- и появится сообщение о том, что мы нажали кнопку ДА. Если же условие
окажется ложным, то программа выполнит то, что написано в фигурных скобках
после слова "иначе" ("else") - и появится сообщение о нажатии нами кнопки
НЕТ.
|