246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 16
Текст из файла (страница 16)
Теперь с помощьюлогических операторов вы можете проверять ряд условий и сравнивать различные значения спомощью операторов отношений. Кроме того, используя оператор присваивания, вы научилисьприсваиватьзначенияпеременным.Вы также познакомились с приоритетами операторов и теперь знаете, как с помощьюкруглых скобок изменить порядок выполнения операторов, обусловленный их приоритетами, иупроститьанализпрограммногокода.ВопросыиответыЗачем нужны круглые скобки, если можно определить последовательность выполненияоператоровпоихприоритетам?Действительно, как программисту, так и компилятору должны быть хорошо известныприоритеты выполнения всех операторов.
Но, несмотря на это, стоит использовать круглыескобки,еслиониоблегчаютпониманиепрограммы,азначит,идальнейшуюработусней.Если операторы отношений всегда возвращают значения true или false, то почему любоененулевоезначениесчитаетсяистинным(true)?Операторыотношенийвсегдавозвращаютзначенияtrueилиfalse,новвыраженияхусловийможноиспользоватьлюбыедругиевыражения,возвращающиечисловыезначения.Например:if((x=а+b)==35)Это вполне подходящее условие для выражения на языке C++. При его выполнении будетвычисленозначениедажевтомслучае,еслисуммапеременныхаиЬнеравначислу35.Крометого, обратите внимание, что переменной x в любом случае будет присвоено значениепеременныхаиb.Какое воздействие оказывают на программу символы табуляции, пробелы и символыпереходанановуюстроку?Символытабуляции,пробелыисимволыразрывовстрок(всеихчастоназываютсимволамипробелов)никакневлияютнапрограмму,хотямогутсделатьееболеечитабельной.Отрицательныечисласчитаютсяистиннымиилиложными?Все числа, не равные нулю (как положительные, так и отрицательные), воспринимаютсякакистинные.КоллоквиумВэтомразделепредлагаютсявопросыдлясамоконтроляиукрепленияполученныхзнанийи приводится несколько упражнений, которые помогут закрепить ваши практические навыки.Попытайтесьсамостоятельноответитьнавопросытестаивыполнитьзадания,апотомсверьтеполученные результаты с ответами в приложении Г.
Не приступайте к изучению материаласледующей главы, если для вас остались неясными хотя бы некоторые из предложенных нижевопросов.Контрольныевопросы1.Чтотакоевыражение?2.Являетсялизаписьx=5+7выражением?Каковоегозначение?3.Каковозначениевыражения201/4?4.Каковозначениевыражения201%4?5. Если переменные myAge, а и b имеют тип int, то каковы будут их значения послевыполнениявыражения:myAge=39;а=myAge++;b=++myAge;6.Каковозначениевыражения8+2*3?7.Какаяразницамеждувыражениямиif(x=3)иif(x==3)?8.Будутлиследующиевыражениявозвращатьtrueилиfalse?а)0б)1в)-1г)x=0д)x==0//предположим,чтоxимеетзначение0Упражнения1.
Напишите один оператор if, который проверяет две целочисленные переменные иприсваивает переменной с большим значением меньшее значение, используя только одиндополнительныйоператорelse.2.Проанализируйтеследующуюпрограмму.Представьте,чтовыввелитризначения.Какойрезультатвыожидаетеполучить?1:#include<iostream.h>2:intmain()3:{4:inta,b,с;5:cout<<"Pleaseenterthreenumbers\n";6:cout<<"a:";7:cin>>a;8:cout<<"\nb:";9:cin>>b;10:cout<<"\nc:";11:cin>>c;12:13:if(c=(a-b))14:{cout<<"a:";15:cout<<a:16:cout<<"minusb:";17:cout<<b;18:cout<<"equalsc:";19:cout<<c<<endl;}20:else21:cout<<"a-bdoesnotequalc:"<<endl;22:return0;23:}3. Введите программу из упражнения 2; скомпилируйте, скомпонуйте и запустите ее навыполнение.
Введите числа 20, 10 и 50. Вы получили результат, который и ожидали? Почемунет?4.Проанализируйтеэтупрограммуиспрогнозируйтерезультат:1:#include<iostream.h>2:intmain()3:{4:intа=1,Ь=1,с;5:if(с=(a-b))6:cout<<"Thevalueofсis:"<<с;7:return0;8:}5. Введите, скомпилируйте, скомпонуйте и запустите на выполнение программу изупражнения4.Каковбылрезультат?Почему?День5-й.ФункцииНесмотря на то что при объектно-ориентированном программировании вниманиеакцентируется не на функциях, а на объектах, функции тем не менее остаются центральнымкомпонентомлюбойпрограммы.Итак,сегоднявыузнаете:•Чтотакоефункцияиизчегоонасостоит•Какобъявлятьиопределятьфункции•Какпередаватьпараметрыфункциям•КаквозвращатьзначениефункцииЧтотакоефункцияФункция по своей сути — это подпрограмма, которая может манипулировать данными ивозвращать некоторое значение.
Каждая программа C++ имеет по крайней мере одну функциюmain(), которая при запуске программы вызывается автоматически. Функция main() можетвызыватьдругиефункции,те,всвоюочередь,могутвызыватьследующиеит.д.Каждая функция обладает собственным именем, и, когда оно встречается в программе,управлениепереходитктелуданнойфункции.Этотпроцессназываетсявызовомфункции(илиобращениемкфункции).Повозвращенииизфункциивыполнениепрограммывозобновляетсясостроки,следующейпослевызовафункции.Такаясхемавыполненияпрограммыпоказананарис.5.1.Хорошоразработанныефункциидолжнывыполнятьконкретнуюивполнепонятуюзадачу.Сложныезадачиследует"разбивать"нанесколькоболеепростых,достаточнолегкореализуемыхспомощьюотдельныхфункций,которыезатеммогутвызыватьсяпоочереди.Различаютдвавидафункций:определяемыепользователем(нестандартные)ивстроенные.Встроенные функции являются составной частью пакета компилятора и предоставляютсяфирмой-изготовителем.Нестандартныефункциисоздаютсясамимпрограммистом.Рис.
5.1. Когда программа вызывает функцию, управление переходит к телу функции, азатемвыполнениепрограммывозобновляетсясостроки,следующейпослевызоваВозвращаемыезначения,параметрыиаргументыФункции могут возвращать значения. После обращения к функции она может выполнитьнекоторые действия, а затем в качестве результата своей работы послать назад некотороезначение. Оно называется возвращаемым значением, причем тип этого значения обязательнодолженбытьобъявлен.Такимобразом,записьintmyFunction();объявляет,чтофункцияmyFunctionвозвращаетцелочисленноезначение.Вфункциюможнотакжеипосылатьнекоторыезначения.Описаниепосылаемыхзначенийназываетсяспискомпараметров.intmyFunction(intsomeValue,floatsomeFloat);Это объявление означает, что функция myFunction не только возвращает целое число, но ипринимаетдвазначениявкачествепараметров:целочисленноеивещественное.Параметр описывает тип значения, которое будет передано функции при ее вызове.Фактическиезначения,передаваемыевфункцию,называютсяаргументами.inttheValueReturned=myFunction(5,6.7);Здесь целая переменная theValueReturned инициализируется значением, возвращаемымфункцией myFunction, и что в качестве аргументов этой функции передаются значения 5 и 6,7.Типаргументовдолженсоответствоватьобъявленнымтипампараметров.ОбъявлениеиопределениефункцийИспользование функций в программе требует, чтобы функция сначала была объявлена, азатем определена.
Посредством объявления функции компилятору сообщается ее имя, типвозвращаемогозначенияипараметры.Благодаряопределениюфункциикомпиляторузнает,какфункция работает. Ни одну функцию нельзя вызвать в программе, если она не былапредварительнообъявлена.Объявлениефункцииназываетсяпрототипом.ОбъявлениефункцииСуществуеттриспособаобъявленияфункции.• Запишите прототип функции в файл, а затем используйте выражение с #include, чтобывключитьеговсвоюпрограмму.•Запишитепрототипфункциивфайл,вкоторомэтафункцияиспользуется.• Определите функцию перед тем, как ее вызовет любая другая функция. В этом случаеопределениефункцииодновременноиобъявляетее.Несмотрянаточтофункциюможноопределитьнепосредственнопередиспользованиемитаким образом избежать необходимости создания прототипа функции, такой стильпрограммированиянесчитаетсяхорошимпотремпричинам.Во-первых, требование располагать функции в файле в определенном порядке затрудняетподдержкупрограммывпроцессеизмененияусловийееиспользования.Во-вторых, вполне возможна ситуация, когда функции A() необходимо вызвать функциюB(), но не исключено также, что при некоторых обстоятельствах и функции B() потребуетсявызвать функцию A().
Однако невозможно определить функцию A() до определения функцииB()ивтожевремяфункциюB()доопределенияфункцииA(),т.е.покрайнеймереоднаизэтихфункцийобязательнодолжнабытьпредварительнообъявлена.В-третьих, прототипы функций — это хорошее и сильное подспорье при отладке.
Еслисогласно прототипу объявлено, что функция принимает определенный набор параметров иличто она возвращает значение определенного типа, а затем в программе делается попыткаиспользовать функцию, не соответствующую объявленному прототипу, то компилятор заметитэтуошибкуещенаэтапекомпиляциипрограммы,чтопозволитизбежатьнеприятныхсюрпризоввпроцессееевыполнения.ПрототипыфункцийПрототипымногихвстроенныхфункцийужезаписанывфайлызаголовков,добавляемыевпрограмму с помощью #include. Для функций, создаваемых пользователями, программистдолженсампозаботитьсяовключениивпрограммусоответствующихпрототипов.Рис.5.2.Составныечастипрототипафункции.Прототип функции представляет собой выражение, оканчивающееся точкой с запятой, исостоит из типа возвращаемого значения функции и сигнатуры.
Под сигнатурой функцииподразумеваетсяееимяисписокформальныхпараметров.Список формальных параметров представляет собой список всех параметров и их типов,разделенныхзапятыми.Составныечастипрототипафункциипоказанынарис.5.2.В прототипе и в определении функции тип возвращаемого значения и сигнатура должнысоответствовать. Если такого соответствия нет, компилятор покажет сообщение об ошибке.Однако прототип функции не обязан содержать имена параметров, он может ограничитьсятолькоуказаниемихтипов.Например,прототип,приведенныйниже,абсолютноправомочен:longArea(int,int);ЭтотпрототипобъявляетфункциюсименемArea(),котораявозвращаетзначениетипаlongи принимает два целочисленных параметра.
И хотя такая запись прототипа вполне допустима,этонесамыйлучшийвариант.Добавлениеименпараметровделаетвашпрототипболееясным.Тажесамаяфункция,ноужесименованнымипараметрами,выглядитгораздопонятнее:longArea(intlength,intwidth);Теперьсразуясно,длячегопредназначенафункцияиеепараметры.Обратитевниманиенато, что для каждой функции всегда известен тип возвращаемого значения. Если он явно необъявлен,топоумолчаниюпринимаетсятипint.Однаковашипрограммыбудутпонятнее,еслидля каждой функции, включая main(), будет явно объявлен тип возвращаемого значения. Влистинге5.1приводитсяпрограмма,котораясодержитпрототипфункцииArea().Листинг5.1.Объявление,определениеииспользованиефункции1://Листинг5.1.Использованиепрототиповфункций2:3:#include<iostream.h>4:intArea(intlength,intwidth);//прототипфункции5:6:intmain()7:{8:intlengthOfYard;9:intwidthOfYard;10:intareaOfYard;11:12:cout<<"\nHowwideisyouryard?";13:cin>>widthOfYard;14:cout<<"\nHowlongisyouryard?";15:cin>>lengthOfYard;16:17:areaOfYard=Area(lengthOfYard,widthOfYard);18:19:cout<<"\nYouryardis";20:cout<<areaOfYard;21:cout<<"squarefeet\n\n";22:return0;23:}24:25:intArea(intyardLength',intyardWidth)26:{27:returnyardLength*yardWidth;28:}Результат:Howwideisyouryard?100Howlongisyouryard?200Youryardis20000squarefeetАнализ: Прототип функции Area() объявляется в строке4.