246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 14
Текст из файла (страница 14)
Оператор if позволяетпроверить условие (например, равны ли две переменные) и изменить ход выполненияпрограммы, направив ее в другое русло, которое будет зависеть от результата сравнения.Простейшаяформаоператораifимеетследующийвид:if(условие)выражение;Условие в круглых скобках может быть любым выражением, но обычно оно содержитоператоры отношений. Если это выражение возвращает false, то последующий операторпропускается. Если же оно возвращает значение true, то оператор выполняется. Рассмотримследующийпример:if(bigNumber>smallNumber)bigNumber=smallNumber;Здесь сравниваются значения переменных bigNumber и smallNumber. Если значениепеременнойbigNumberбольше,тововторойстрокеэтогопрограммногофрагментаеезначениеустанавливаетсяравнымзначениюпеременнойsmallNumber.Поскольку блок выражений, заключенных в фигурные скобки, эквивалентен одномувыражению, то это свойство позволяет за строкой с оператором if использовать целые блоки,которыемогутбытьдовольнообширными:if(условие){выражение1;выражение2;выражениеЗ;}Вотпростойпримерпримененияблокавыражений:if(bigNumber>smallNumber){bigNumber=smallNumber;cout<<"bigNumber:"<<bigNumber<<"\n";cout<<"smallNumber:"<<smallNumber<<"\n";}На этот раз, если значение переменной bigNumber больше значения переменнойsmallNumber, то большая переменная не только устанавливается равной значению меньшейпеременной,нонаэкранвыводятсятакжеинформационныесообщения.Влистинге4.5показанещеодинпримерветвленияпрограммы,основанныйнаиспользованииоператоровотношений.Листинг4.5.Примерветвлениясиспользованиемоператоровотношений1://Листинг4.5.Демонстрируетиспользование2://инструкцииifсовместносоператорамиотношений3:#include<iostream.h>4:intmain()5:{6:intRedSoxScore,YankeesScore;7:cout<<"EnterthescorefortheRedSox:";8:cin>>RedSoxScore;9:10:cout<<"\nEnterthescorefortheYankees:";11:cin>>YankeesScore;12:13:cout<<"\n";14:15:if(RedSoxScore>YankeesScore)16:cout<<"GoSox!\n";17:18:if(RedSoxScore<YankeesScore)19:{20:cout<<"GoYankees!\n";21:cout<<"HappydaysinNewYork!\n";22:}23:24:if(RedSoxScore==YankeesScore)25:{26:cout<<"Atie?Naah,can'tbe.\n";27:cout<<"GivemetherealscorefortheYanks:";28:cin>>YankeesScore;29:30:if(RedSoxScore>YankeesScore)31:cout<<"Knewit!GoSox!";32:33:if(YankeesScore>RedSoxScore)34:cout<<"Knewit!GoYanks!";35:36:if(YankeesScore==RedSoxScore)37:cout<<"Wow,itreallywasatie!";38:39:}40:cout<<"\nThanksfortellingme.\n";41:return0;42:}Результат:EnterthescorefortheRedSox:10EnterthescorefortheYankees:10Atie?Naah,can'tbeGivemetherealscorefortheYanks:8Knewit!GoSox!Thanksfortellingme..Анализ: В этой программе пользователю предлагается ввести счет очков для двухбейсбольныхкоманд.Введенныеочкисохраняютсявцелочисленныхпеременных.Значенияэтихпеременныхсравниваютсяоператоромifвстроках15,18и24.Предупреждение:Многие начинающие программисты по невнимательности ставятточкусзапятойпослевыражениясоператоромif:if(SomeValue<10);SomeValue=10;ВэтомпрограммномфрагментебылозадуманосравнитьзначениепеременнойSomeValueс числом 10 и, если окажется, что оно меньше десяти, установить его равным этому числу,т.е.зафиксироватьминимальноезначениепеременнойSomeValueнауровне10.Привыполненииэтогопрограммногофрагментаобнаруживается,чтопеременнаяSomeValue(внезависимостиотееисходногозначения)всегдаустанавливаетсяравной10.Вчемжедело?Аделовтом,чтооператор if, вернее, связанное с ним выражение сравнения, оканчивается точкой с запятой,создаваятемсамымбездействующуюинструкцию.Помните,чтодлякомпилятораотступнеиграет никакой роли.
Приведенный выше программный фрагмент можно переписать подругому:if(SomeValue<10)//проверка;//пустоевыражение,контролируемоеоператоромifSomeValue=10;//присваиваниеПри удалении ненужной точки с запятой последняя строка этого фрагмента станетчастью конструкции с оператором if и программа заработает в соответствии с намерениемпрограммиста.Если очки одной команды больше очков другой, на экран выводится соответствующеесообщение. Если сравниваемые очки равны, программа выполняет блок выражений, которыйначинаетсявстроке25иоканчиваетсявстроке38.ВэтомблокесновазапрашиваетсясчеточковдлякомандыизНью-Йорка,послечеговновьвыполняетсясравнениерезультатовигрыкоманд.Обратите внимание: если начальный счет команды Yankees превышает счет команды RedSox, то оператор if в строке 15 возвратит значение false и строка 16 не будет выполняться.Проверкажевстроке18дастистинныйрезультат(true)ибудутвыполненывыражениявстроках20 и 21.
Затем с помощью оператора if в строке 24 будет проверено равенство очков; результатэтоготестированиядолженбытьложным(false)(иначеибытьнеможет,еслипроверкавстроке18далаврезультатезначениеtrue).Вэтомслучаепрограммапропуститцелыйблокиперейдетсразуквыполнениюстроки39.В данном примере получение истинного результата одним оператором if не избавляет отвыполненияпроверокдругимиоператорамиif.ИспользованиеотступоввпрограммныхкодыхОбратитевнимание,каквлистинге4.4используютсяотступывконструкциисоператоромif. Наверное, фанаты программирования могли бы развязать войну по поводу того, какой стильвыделения программных блоков лучше использовать. И хотя возможны десятки различныхстилей,чащедругихиспользуютсятриперечисленныхниже.• Начальная открывающая скобка располагается после условия, а закрывающая фигурнаяскобка,котораязавершаетблокоператоров,выравниваетсяпооднойлиниисоператоромif:If(условие){выражение}•Фигурныескобкирасполагаютсяподсловомif,выравниваясьпооднойлинии,аоператорыблоказаписываютсясотступом:if(условие){выражение}•Отступиспользуетсякакдляобеихфигурныхскобок,такидлявыраженийблока:if(условие){выражение}Вариант,используемыйвэтойкниге,отражаетлишьпристрастиеавтораиникчемуваснеобязывает.КлючевоесловоelseДовольно часто в программах требуется, чтобы при выполнении некоторого условия (т.е.когда это условие возвратит значение true) программа выполняла один блок команд, а при егоневыполнении(т.е.когдаэтоусловиевозвратитзначениеfalse)—другойблок.Влистинге4.4программистнамеревалсявыводитьнаэкранодносообщение,если первая проверка (RedSoxScore > Yankees) возвращает значение true, и другое сообщение,еслиэтапроверкавозвращаетзначениеfalse.Показанный выше способ последовательного использования нескольких операторов if дляпроверки ряда условий прекрасно работает, но слишком громоздкий.
Улучшить читабельностьпрограммывподобныхслучаяхможноспомощьюключевогословаelse(листинг4.6):if(условие)выражение;elseвыражение;Листинг4.6.Примериспользованияключевогословаelse1://Листинг4.6.Примерконструкциисключевыми2://словамиifиelse3:#include<iostream.h>4:intmain()5:{6:intfirstNumber,secondNumber;7:cout<<"Pleaseenterabignumber:";8:cin>>firstNumber;9:cout<<"\nPleaseenterasmallernumber:";10:cin>>secondNumber;11:if(firstNumber>secondNumber)12:cout<<"\nThanks!\n";13:else14:cout<<"\nOops.Thesecondisbigger!";15:16:return0;17:}Результат:Pleaseenterabignumber:10Pleaseenterasmallernumber:12Oops.Thesecondisbigger!Анализ: В строке 11 проверяется условие, заданное в операторе if.
Если это условиеистинно,будетвыполненастрока12,послечегоработапрограммызавершитсявстроке16.Еслиже это условие возвратит false, программа продолжит работу со строки 14. Если в строке 13удалить ключевое слово else, строка 14 будет выполнена в любом случае, вне зависимости отвыполнения условия.
Но в данной конструкции if-else будет выполняться либо блок после if,либоблокпослеelse.Помните,чтовконструкцииif-elseможноиспользоватьнетолькоотдельныевыражения,ноицелыеблокивыражений,заключенныхвфигурныескобки.ОператорСложныеконструкциисifНет никаких ограничений на использование любых операторов в блоках выражений вконструкцииif-else,втомчисленаиспользованиедополнительныхоператоровifиelse.Вэтомслучаебудетполученавложеннаяконструкцияизнесколькихоператоровif:if(условие1){if(условие2)выражение1;else{if(условиеЗ)выражение2;elseвыражениеЗ;}}elseвыражение4;Смысл этой конструкции из нескольких операторов if можно расшифровать так: еслиусловие1 истинно и условие2 истинно, выполните выражение1.
Если условие1 истинно, аусловие2 — нет, тогда проверьте условиеЗ и, если оно истинно, выполните выражение2. Еслиусловие1 истинно, а условие2 и условиеЗ — нет, тогда выполните выражениеЗ. Наконец, еслиусловие1 ложно, выполните выражение4. Да, вложенные операторы if могут кого угоднозапутать!Примериспользованиятакойсложнойконструкцииснесколькимиоператорамиifпоказанвлистинге4.7.Листинг4.7.Сложныеконструкциисвложеннымиоператорамиif1://Листинг4.7.Примерсложнойконструкциис2://вложеннымиоператорамиif3:#include<iostream.h>4:intmain()5:{6://Запрашиваемдвачисла7://ПрисваиваемчислапеременнымbigNumberиlittleNumber8://ЕслизначениеbigNumberбольшезначенияlittleNumber,9://проверяем,делитсялибольшеечислонаменьшеебезостатка10://Еслида,проверяем,неравнылионидругдругу11:12:intfirstNumber,secondNumber;13:cout<<"Entertwonumbers.\nFirst:";14:cin>>firstNumber;15:cout<<"\nSecond:";16:cin>>secondNumber;17:cout<<"\n\n";18:19:if(firstNumber>=secondNumber)20:{21:if((firstNumber%secondNumber)==0)//evenlydivisible?22:{23:if(firstNumber==secondNumber)24:cout<<"Theyarethesame!\n";25:else26:cout<<"Theyareevenlydivisible!\n";27:}28:else29:cout<<"Theyarenotevenlydivisible!\n";30:}31:else32:cout<<"Hey!Thesecondoneislarger!\n";33:return0;34:}Результат:Eritertwonumbers.First:10Second:2Theyareevenlydivisible!Анализ:Сначалапользователюпредлагаетсяввестидвачисла(поочереди),затемэтичисласравниваются.
С помощью первого оператора if (в строке 19) мы хотим убедиться в том, чтопервое число больше или равно второму. Если мы убеждаемся в обратном, то выполняетсявыражениепослеоператораelse,представленноговстроке31.Еслипервоесравнениевозвращаетtrue,товыполняетсяблокинструкций,начинающийсявстроке 20, где с помощью второго оператора if в строке 21 проверяется предположение, чтопервое число делится на второе без остатка (т.е. с остатком, равным нулю).
Если этопредположениеподтверждается,топервоечислолибократновторому,либоонивообщеравныдруг другу. Оператор if в строке 23 проверяет версию о равенстве чисел, а затем на экранвыводитсясообщение,уведомляющееовыявленномсоотношении.Если оператор if в строке 21 возвращает значение false, то выполняется оператор else встроке28.ИспользованиефигурныхскобокдлявложенныхоператоровifФигурные скобки можно не использовать в конструкциях с оператором if, если этаконструкция состоит только из одного выполняемого выражения. Это справедливо и в случаевложениянесколькихоператоровif,какпоказанониже:if(x>у)//еслиxбольшеуif(x<z)//иеслиxменьшеz,x=у;//тогдаприсваиваемxзначениеуОднако при создании сложных вложенных конструкций без использования фигурныхскобокбываеттрудноразобраться,какоевыражениекакомуоператоруifпринадлежит.Не забывайте, что пробелы и отступы делают программу понятнее для программиста, ноникак не влияют на работу компилятора.
Даже если вы покажете с помощью отступа, чтоданныйоператорelseотноситсякконструкцииэтогооператораif,компиляторможетсваминесогласиться.Даннаяпроблемаиллюстрируетсявлистинге4.8.Листинг 4.8. Пример использования фигурных скобок для правильногосопоставленияоператоровelseиif1://Листинг4.8.Примериспользованияфигурныхскобок2://вконструкцияхсвложеннымиоператорамиif3:#include<iostream.h>4:intmain()5:{6:intx;7:cout<<"Enterаnumberlessthan10orgreaterthan100:";8:cin>>x;9:cout<<"\n";10:11:if(x>=10)12:if(x>100)13:cout<<"Morethan100,Thanks!\n";14:else//ккакомуоператоруifотноситсяэтотоператор15:cout<<"Lessthan10,Thanks!\n";16:17:return0;18:}Результат:Enteranumberlessthan10orgreaterthan100Lessthan10,Thanks!Анализ:Программазапрашиваетвводчисламеньше10илибольше100идолжнапроверитьвведенноезначениенасоответствиевыдвинутомутребованию,азатемвывестисообщение.Если оператор if, расположенный в строке 11, возвращает true, то выполняется следующеевыражение(строка12).Внашемпримерестрока12выполняетсявслучае,есливведенноечислобольше 10.