246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 17
Текст из файла (страница 17)
Сравните прототип сопределением функции, представленным в строке 25. Обратите внимание, что их имена, типывозвращаемыхзначенийитипыпараметровполностьюсовпадают.Еслибыонибылиразличны,то компилятор показал бы сообщение об ошибке. Единственное обязательное различие междунимисостоитвтом,чтопрототипфункцииоканчиваетсяточкойсзапятойинеимееттела.Обратитетакжевниманиенато,чтоименапараметроввпрототипе—lengthиwidth—несовпадают с именами параметров в определении: yardLength и yardWidth.
Как упоминалосьвыше,именавпрототипенеиспользуются;онипростослужатописательнойинформациейдляпрограммиста. Соответствие имен параметров прототипа именам параметров в определениифункциисчитаетсяхорошимстилемпрограммирования;ноэтонеобязательноетребование.Аргументыпередаютсявфункциювпорядкеобъявленияиопределенияпараметров,нобезучетакакогобытонибылосовпаденияимен.ЕсливфункциюArea()первымпередатьаргументwidthOfYard,азаним—аргументlengthOfYard,тоэтафункцияиспользуетзначениеwidthOfYardдля параметра yardLength, а значение lengthOfYard — для параметра yardWidth.
Тело функциивсегда заключается в фигурные скобки, даже если оно состоит только из одной строки, как внашемпримере.ОпределениефункцииОпределение функции состоит из заголовка функции и ее тела. Заголовок подобенпрототипу функции за исключением того, что параметры в данном случае именованные и вконцезаголовкаотсутствуетточкасзапятой.Рис.5.3.ЗаголовокителофункцииТело функции представляет собой набор выражений, заключенных в фигурные скобки.Заголовокителофункциипоказанынарис.5.3.Синтаксиспрототипафункции:тип_возвратаимя_функции([тип[имя_параметра]...]);{выражения;}Прототип функции сообщает компилятору тип возвращаемого значения, имя функции исписок параметров.
Наличие параметров не обязательно, но если они все-таки имеются, впрототипе должны быть объявлены их типы. Имена параметров перечислять необязательно.Строка прототипа всегда оканчивается точкой с запятой (;). Определение функции должносоответствовать своему прототипу по типу возвращаемого значения и списку параметров. Онодолжно содержать имена всех параметров, а тело определения функции должно заключаться вфигурныескобки.Всевыражениявнутрителафункциидолжныоканчиватьсяточкойсзапятой,кромезаголовкафункции.Которыйоканчиваетсязакрывающейкруглойскобкой.Еслифункциявозвращаетзначение,онадолжнасодержатьвыражениесоператоромreturn.Этовыражениеможетнаходитьсявлюбойчастиопределенияфункции,нообычнооканчиваетего.Длякаждойфункциизадаетсятипвозвращаемогозначения.Еслионявнонеопределен.поумолчанию устанавливается тип возврата lnt.
Старайтесь всегда указывать тип возвращаемогозначения в явном виде. Если функция не возвращает никакого значения, то в качестве типавозвращаемогозначенияиспользуйтеvoid.Примерыпрототиповфункций:longFindArea(longlength,longwidth);//возвращаетзначениетипаlong,имеетдвапараметраvoid PrintMessage(int messageNumber); // возвращает значение типа void, имеет одинпараметрintGetChoice();//возвращаетзначениетипаint,неимеетпараметровBadFunction();//возвращаетзначениетипаint,неимеетпараметровПримерыопределенийфункций:longFindArea(longl,iongw){return1*w;}voidPrintMessage(intwhichMsg){if(whichMsg==0)cout<<"Hello.\n";if(whichMsg==1)cout<<"Goodbye.\n";if(whlchMsg>1)cout<<"I'mconfused.\n";}ВыполнениефункцийПривызовефункцииеевыполнениеначинаетсясвыражения,котороестоитпервымпослеоткрывающей фигурной скобки ({).
В теле функции можно реализовать ветвление, используяусловный оператор if (и некоторые другие операторы, которые рассматриваются на занятии 7).Функции могут также вызывать другие функции и даже самих себя (о рекурсии речь пойдетнижевэтойглаве).ЛокальныепеременныеВфункцииможнонетолькопередаватьзначенияпеременных,ноиобъявлятьпеременныевнутрителафункции.Этореализуетсяспомощьюлокальныхпеременных,которыеназываютсятак потому, что существуют только внутри самой функции. Когда выполнение программывозвращаетсяизфункциикосновномукоду,локальныепеременныеудаляютсяизпамяти.Локальные переменные определяются подобно любым другим переменным.
Параметры,переданныефункции,гожесчитаютсялокальнымипеременными,иихможноиспользоватькакопределенные внутри тела функции. В листинге 5.2 представлен пример использованияпараметровфункцииипеременных,локальноопределенныхвнутрифункции.Листинг5.2.Использованиелокальныхпеременныхuпараметровфункции1:#include<iostream.h>2:3:floatConvert(float);4:intmain()5:{6:floatTempFer;7:floatTempCel;8:9:cout<<"PleaseenterthetemperatureinFahrenheit:";10:cin>>TempFer;11:TempCel=Convert(TempFer);12:cout<<"\nHere'sthetemperatureinCelsius:";13:cout<<TempCel<<endl;14:return0;15:}16:17:floatConvert(floatTempFer)18:{19:floatTempCel;20:TempCel=((TempFer-32)*5)/9;21:returnTempCel;22:}Результат:PleaseenterthetemperatureinFahrenheit:212Here'sthetemperatureinCelsius:100PleaseenterthetemperatureinFahrenheit:32Here'sthetemperatureinCelsius:0PleaseenterthetemperatureinFahrenheit:85Here'sthetemperatureinCelsius:25.4444Анализ: В строках 6 и 7 объявляются две переменные типа float: одна (TempFer) дляхранениязначениятемпературывградусахпоФаренгейту,адругая(TempCel)—вградусахпоЦельсию.
В строке 9 пользователю предлагается ввести температуру по Фаренгейту, и этозначениезатемпередаетсяфункцииConvert().ПослевызовафункцииConvert()программапродолжаетвыполнениеспервоговыражениявтелеэтойфункции,представленногострокой19,гдеобъявляетсялокальнаяпеременная,такженазванная TempCel. Обратите внимание, что эта локальная переменная — не та же самаяпеременная TempCel, которая объявлена в строке 7.
Эта переменная существует только внутрифункции Convert(). Значение, переданное в качестве параметра TempFer, также является лишьпереданнойизфункцииmain()локальнойкопиейодноименнойпеременной.В функции Convert() можно было бы задать параметр FerTemp и локальную переменнуюCelTemp, что не повлияло бы на работу программы. Чтобы убедиться в этом, можете ввестиновыеименаиперекомпилироватьпрограмму.Локальной переменной TempCel присваивается значение, которое получается в результатевыполнения следующих действий: вычитания числа 32 из параметра TempFer, умножения этойразности на число 5 с последующим делением на число 9. Результат вычислений затемвозвращается в качестве значения возврата функции, и в строке 11 оно присваиваетсяпеременнойTempCelфункцииmain().Встроке13этозначениевыводитсянаэкран.В нашем примере программа запускалась трижды.
В первый раз вводится значение 212,чтобы убедиться в том, что точка кипения воды по Фаренгейту (212) сгенерирует правильныйответ в градусах Цельсия (100). При втором испытании вводится значение точки замерзанияводы.Втретийраз—случайноечисло,выбранноедляполучениядробногорезультата.В качестве примера попробуйте запустить программу снова с другими именамипеременных,какпоказанониже.Долженполучитьсятотжерезультат.Каждая переменная характеризуется своей областью видимости, определяющей времяжизни и доступность переменной в программе.
Переменные, объявленные внутри некоторогоблока программы, имеют область видимости, ограниченную этим блоком. К ним можнополучить доступ только в пределах этого блока, и после того, как выполнение программывыйдет за пределы, все его локальные переменные автоматически удаляются из памяти.Глобальныежепеременныеимеютглобальнуюобластьвидимостиидоступныизлюбойточкипрограммы.Обычно область видимости переменных очевидна по месту их объявления, но некоторыеисключения все же существуют. Подробнее об этом вы узнаете при рассмотрении циклов взанятии7.1:#include<iostream.h>2:3:floatConvert(float);4:intmain()5:{6:floatTempFer;7:floatTempCel;8:9:cout<<"PleaseenterthetemperatureinFahrenheit:";10:cin>>TempFer;11:TempCel=Convert(TempFer);12:cout<<"\nHere'sthetemperatureinCelsius:";13:cout<<TempCel<<endl;14:return0;15:}16:17:floatConvert(floatFer)18:{19;floatCel;20;Cel=((Fer-32)*5)/9;21:returnCel;22:}Обычно с использованием переменных в функциях не возникает больших проблем, еслиответственноподходитькприсвоениюимениследитьзатем,чтобывпределаходнойфункциинеиспользовалисьодноименныепеременные.ГлобальныепеременныеПеременные, определенные вне тела какой-либо функции, имеют глобальную областьвидимостиидоступныизлюбойфункциивпрограмме,включаяmain().Локальные переменные, имена которых совпадают с именами глобальных переменных, неизменяют значений последних.