Программирование >>  Процедурные приложения 

1 ... 36 37 38 [ 39 ] 40 41 42 ... 150


Обратите внимание на отсутствие операторов взятия адреса при вызове функции и операторов раскрытия указателей в теле функции. В качестве аргументов функции используются ссылки 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() принимает

* целочисленное значение, содержащее длину ребра куба.



1 ... 36 37 38 [ 39 ] 40 41 42 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика