Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / LECS5

.DOC
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
37.89 Кб
Скачать

Программа на языке СИ++ представляет собой набор функций. Всегда есть по крайней мере одна функция main ().

Пример 7.1.

Строки 3 и 4 объявляют прототипы функций. Обе функции возвращают пустоту (не возвращают значения). В прототипе также перечисляются параметры функций через запятую. У каждого параметра должен быть тип. Имя параметра в прототипе необязательно. Слово void в качестве параметра внутри круглых скобок говорит о том, что функция не имеет параметров. (Слово void означает - пустой).

Функция main возвращает значение 0 (строка 10).

Определение функции

Заголовок функции

{ // тело

Инструкции // функции

} //

Заголовок функции

Тип Имя (Список_объявлений_параметров)

Тип - тип значения, возвращаемого функцией (если оно вообще возвращается)

Имя (Список_ объявлений_параметров) формальные параметры.

Формальные параметры – это то, вместо чего будут подставлены фактические параметры, передаваемые функции в момент ее вызова. После вызова функции значение аргумента используется в теле выполняемой функции. Значения аргументов копируются в соответствующие параметры функции, а сами переменные не изменяются в вызывающем окружении. в сущности, вызываемые по значению параметры являются локальными в своей процедуре.

Например,

// Несколько звонков

# include < iostream.h >

const char BELL = ‘ \ a ‘; // звуковой сигнал

void ring (int k)

{ int i; // область действия

for (i=0; i<k;++i) // переменный – ф.п.

cout << BELL; // k

}

int main ( )

{int n;

cout << “\n Введите положительное целое: “;

cin>>n;

ring (n); // n не изменяется после выполнения функции.

}

Инструкция return

используется для возвращения управления и значения (если оно указано).

return; передает управление обратно вызывающее окружение.

return выражение управления и значение выражения передается в вызывающее окружение. Значение выражения должно допускать неявное преобразование к типу, указанному в заголовке определения функции.

Например, return;

return 25;

return (a+b);

Еще один пример.

// Найти наименьшее из двух целых

# include < iostream.h >

int min (int x, int y)

{ if (x<y)

return x;

else

return y;

}

int main( )

{ int j, k, m;

cout << “ Введите два целых числа: “;

cin >> j >> k;

m = min (j, k);

cout << “ \ n << m << ”наименьшее из “<< j << ” u ”<< k << end l;

}

Рассмотрим следующую программу и определим, что она делает.

Пример 7.2.(стр.2)

Прототипы функций

Прототипы функции – это ее объявление но не определение.

Прототип функции имеет следующую форму записи:

Тип Имя (список_объявлений_аргументов);

Список_объявлений_аргументов может быть пустым, содержать единственное объявление или несколько объявлений, разделенных запятыми. Если функция не имеет параметров допускается использование ключевого слова void. В СИ++ функция с пустым списком параметров выглядит как: Имя_функции ( ).

Параметры прототипов:

int min (int, int); //имена параметров можно не указывать

int min (int k, int y);

Пример.

//Сложение трех целых

# include < iostream.h >

int add3 (int, int, int); // прототип add3

double average (int); // прототип

int main( )

{ int score_1, score_2, score_3, sum;

cout << “ \ n Введите три оценки: “;

cin >> score_1>> score_2>> score_3;

sum=add3 (score_1, score_2, score_3);

cout << “ \ n Их сумма равна “ << sum;

cout << “ \ n Среднее значение “ << average (sum);

}

int add3 (int a , int b, int c);

{

return (a+b+c);

}

double average (int s)

{

return(s/3.0)

}

Обычно прототипы функций выносят в отдельный заголовочный файл. Рассмотрим следующую программу.

Листинг 7.3. (стр.2)

Листинг 7.4.

7.5.(что будет делать программа)

Аргументы по умолчанию.

Формальному параметру может быть задан аргумент по умолчанию. Использование аргумента по умолчанию позволяет не писать его при каждом вызове.

Например,

int sqr_or_power (int n, int k=2) // возведение в степень

{ if ( k= =2 )

return ( n*n );

else

return (sqr_or_power (n, k-1)*n);

}

Чаще всего эта функция используется для вычисления n в квадрате.

Только несколько последних параметров функции могут иметь значения по умолчанию.

void foo (int i, int j=7 ); // допустимо

void foo (int i=3, int j ); // недопустимо

void foo (int i, int j=3, int k=7 ); // допустимо

void foo (int i=1, int j=2, int k=3 ); // допустимо

void foo (int i, int j=2, int k ); // недопустимо

Перегрузка функций

Перегрузка использует одно и то же имя для нескольких вариантов оператора или функций.

Выбор конкретного варианта зависит от типа аргументов, используемых оператором или в вызове функции.

Например,

// нахождение среднего значения элементов массива

double avg_arr (const int a[ ], int size)

{ int sum=0;

for (int i=0; i < size; i++)

sum + = a [i]; // выполняется сложение целых

return (static_east_<double>(sum)/size);

}

double avg_arr (const int a[ ], int size)

{ double sum = 0.0;

for (int i=0; i<size; i++)

sum + = a[i]; // сложение double

return (sum/size);

}

int main ( )

{int w[s]={1, 2, 3, 4, 5};

double x[s] ={1.1, 2.2, 3.3, 4.4, 5.5};

cout << avg_arr (w, 5) << ” – среднее значение для целых” << end l;

cout << avg_arr (x, 5)<< ” – среднее значение для double” << end l;

}

Компилятор выбирает функции в соответствии с типами аргументов и их количеством.

Встраиваемые функции

Для их объявления используется ключевое слово inline.

inline double cube (double x)

{

return (x * x * x);

}

Компилятор анализирует эту функцию, точно также, как и ее невстраиваемую версию. Обычно компилятор не позволяет встраивать сложные функции. Обычно для размещения встроенного кода используется вызов функции.

double y = 0.5;

cube (y);

Существует еще одна схема встраивания кода с помощью define.

# define SQR(x) ((x)*(x))

# define cube(x) (SQR(x)*(x))

# define ABS(x) (((x)<0)?-(x):x)

. . .

y = SQR(t+8)- cube (t-8);

cout << sqrt (ABS(y));

Препроцессор раскрывает макросы следующим образом

y = SQR(t+8)-cube(t-8);

y = ((t+8)*(t+8))-(SQR(t-8)*(t-8));

y = ((t+8)*(t+8))-(((t-8)*(t-8))*(t-8));

и последняя строка передается на компиляцию. Встраивание по месту вызова происходит в момент компиляции. Последнее предпочтительнее, поскольку при этом производится проверка типов параметров.

Область видимости и класс памяти.

В базовом языке существуют два основных вида области видимости (области действия):

  • локальная область видимости;

  • область видимости файла.

Локальная область видимости относится к блоку. Тело функции – пример блока с объявлениями и параметрами функции. В область видимости файла входят имена объявленные вне блоков в данном файле. Эти имена являются внешними (глобальными) и доступными из фрагментов программ других файлов.

Соседние файлы в папке Лекции