|
Программирование >> Процедурные приложения
Обратите внимание на отсутствие операторов взятия адреса при вызове функции и операторов раскрытия указателей в теле функции. В качестве аргументов функции используются ссылки rixи riy. В C++ не допускается использование ссылок на ссылки, ссылок на битовые поля, массивов ссылок и указателей на ссылки. Правила видимости переменных Область видимости переменной может быть ограничена функцией, файлом или классом. Локальные переменные объявляются внутри функции, а значит, их использование ограничено телом функции. О таких переменных говорят, что они доступны, или видны, только внутри функции и имеют локальную область видимости. Переменные, область видимости которых охватывает весь файл, объявляются вне любых функций или классов. Такие переменные называются глобальными, и доступ к ним можно получить из любой точки того же файла. Одно и то же имя переменной может быть сначала описано на глобальном, а затем на локальном уровне. В таком случае локальная переменная закроет собой глобальную переменную в теле функции. Для подобных ситуаций в языке C++ существует оператор расширения области видимости (::). Будучи примененным к переменной в теле функции, он позволяет сослаться на глобальную переменную с указанным именем, даже если в самой функции объявлена одноименная локальная переменная. Синтаксис оператора таков: :: переменная Неправильное понимание правил видимости переменных может привести к возникновению различного рода ошибок, которые будут более подробно проанализированы в конце главы. Рекурсия Рекурсия возникает в том случае, когда функция вызывает саму себя. Рекурсивные алгоритмы можно использовать для элегантного решения некоторых задач, из которых одна из наиболее распространенных - нахожждение факториала числа. Факториалом называется произведение всех целых чисел от единицы до заданного. Например: 81=8*7*6*5*4*3*2*1=40320 Обратите внимание на используемый тип данных - double, который позволяет работать с числами порядка 1Е+308. Особенностью факториала является то, что даже для сравнительно небольшого числа результат может быть огромным. Например, факториал числа 15 равен 1307674368000. * factor. с * Эта программа на языке С демонстрирует применение * рекурсии при вычислении факториала. #include <stdio.h> double dfactorial(int inumber); int main () int Inumber =15; double dresult; dresult = dfactorial(inumber); printf ( Факториал%d равен%15.0f\n ; inumber, dresult) ; return(0); double dfactorial(int inumber) if (inumber <= 1) return(1.0); else return(inumber * dfactorial(inumber-1)); Аргументы функций В настоящем параграфе подробно рассматриваются принципы передачи функциям аргументов различных типов. Некоторые программисты используют вместо термина аргумент термин параметр, хотя правильнее говорить о фактическом аргументе, т.е. значении, передаваемом в функцию в момент вызова, и формальном аргументе (параметре), т.е. идентификаторе, заданном в описании функции. В принципе, функция может вообще не иметь аргументов. Если же они есть, то их может быть сколь угодно много и все они могут иметь различные типы данных. Ниже будут приведены примеры, иллюстрирующие передачу функциям аргументов стандартных типов. Формальные и фактические аргументы Любая функция содержит список формальных аргументов, который может быть и пустым, если функция не принимает аргументов. Когда в программе осуществляется вызов функции, ей передается список значений аргументов, который называется списком фактических аргументов. В соответствии со стандартом ANSI С типы идентификаторов в обоих списках должны совпадать. Но в действительности совпадение может быть нестрогим, и над фактическими аргументами могут выполняться неявные операции преобразования типов данных. Рассмотрим следующий фрагмент программы на языке С: printf( Пример шестнадцатеричного %х и восьмеричного %о значения , ians); Хотя в строке форматирования указано два аргумента, в наличии имеется только один. Когда функции предоставляется меньше аргументов, чем содержится в списке параметров, недостающим присваиваются неопределенные значения. Во избежание ошибок в C++ предусмотрено задание аргументам стандартных значений. Тогда, если при вызове функции соответствующий аргумент не указан, ему автоматически будет присвоено значение по умолчанию. Вот пример прототипа функции на языке C++: int имя функции(int it,float fu = 4.2,int iv = 10) Если в вызове функции не будут указаны аргументы fu и/или iv, то им по умолчанию будут присвоены значения 4,2 и 10 соответственно. Стандарт языка C++ требует, чтобы аргументы, для которых заданы значения по умолчанию, находились в конце списка формальных аргументов. В нашем примере допустимы следующие варианты вызова функции: имя функции(10) имя функции(10,15.2) имя функции(10,15.2,8) Если аргумент fu не будет задан, установка аргумента iv также станет невозможной. Аргументы типа void В соответствии со стандартом ANSI С ключевое слово void применяется для явного указания на отсутствие аргументов функции. В C++ указывать слово void не обязательно, хотя данное соглашение довольно широко используется. В следующем примере создается функция voutput( ) , которая не получает аргументов и не возвращает никаких значений. Это, пожалуй, один из простейших видов функций. * fvoid. с * Эта программа на языке С содержит пример функции, не принимающей * никаких аргументов . #include <stdio.h> #include <math.h> void voutput (void) ; int raain() { printf( Этa программа вгчисляет квадратный корень числа. \n\n ); voutput () ; return (0); void voutput(void) { int it = 12345; double du; du = sqrt(it); printf( Квадратный корень числа %dравен %f \n , it, du); } В функции voutput() вызывается стандартная библиотечная функция sqrt(), объявленная в файле МАТН.Н. Данная функция возвращает квадратный корень своего аргумента в виде значения типа double. Аргументы типа char В следующем примере в функции main() считывается символ, введенный с клавиатуры, и передается в функцию voutput(), которая выводит его на экран. Считывание символа осуществляется функцией getch(). В языке С есть ряд похожих на нее библиотечных функций: getc(), getchar () и getche (). Данные функции можно использовать и в языке C++, хотя всех их инкапсулирует в себе объект cin, управляющий вводом данных. Функция getch() запрашивает символ, поступающий со стандартного устройства ввода (как правило, это клавиатура), и записывает его в переменную типа char без эха на экране. * fchar. с * Эта программа на языке С считывает символ, введенный с клавиатуры, * и передает его в функцию voutput(),осуществляющую вывод нескольких * копий символа на экран. #include <stdio.h> #include <conio.h> void voutput(char c) ; int main() { char cyourchar; printf( Введите символ: ); cyourchar = getch(); voutput(cyourchar); return (0); } void voutput(char c) < int j ; for (j = 0; j < 16; printf( \nБIл введен символ %с , с); ) Спецификатор %с в функции printf() указывает, что выводится единственный символ. Аргументы типа int В следующем примере введенная пользователем длина ребра куба передается в функцию vside(), которая на основании полученного значения вычисляет площадь грани куба, его объем и площадь поверхности. * fint.c * Эта программа на языке С предназначена для вычисления площади грани * и поверхности куба, а также его объема. Функция vside() принимает * целочисленное значение, содержащее длину ребра куба.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |