Слайд 2Назначение подпрограмм
Экономия кода
Структуризация программы
Слайд 3Два вида подпрограмм
Функция – возвращает значение через свое имя
a=sqrt(x);
Процедура –
выполняет какое-то действие
printf("Hello");
В языке C/C++ нет процедур, но есть функции
типа void.
Слайд 4Пример: возведение в степень
double power(double a, int n)
{ int
i;
double x=1;
for (i=0; i
if (n<0) x=1.0/x;
return x;
}
main()
{ int i;
for (i=-10; i<=10; i++)
printf("%lf\n", power(2,i) );
}
Описание функции
Вызов функции
Заголовок функции
Формальные параметры функции
Фактические параметры
Слайд 5Формальные и фактические параметры
Параметры передаются по значению, т.е. создаются локальные
переменные, соответствующие формальным параметрам, и в них копируются значения фактических
параметров
Типы и число фактических параметров должны соответствовать формальным параметрам
Для проверки этого соответствия функция должна быть либо описана ранее своего использования, либо до использования функции должен быть описан ее заголовок, обычно находящийся во включаемом файле
Слайд 6Заголовок функции
double power(double a, int n);
main()
{ int i;
for (i=-10; i
double power(double a, int n);
{ int i;
double x=1;
for (i=0; i
if (n<0) x=1.0/x;
return x;
}
Слайд 7Создание библиотек функций
Lib1.cpp
Lib2.cpp
main.cpp
Lib1.h
Lib2.h
Lib1.obj
Lib2.obj
main.obj
main.exe
Слайд 8Файл myfunc.c
#include
#include "myfunc.h"
double power(double a, int n)
{
int i;
double x=1;
for (i=0; i
x*=a;
if (n<0) x=1.0/x;
return x;
}
Слайд 9Файл myfunc.h
double power(double, int);
Слайд 10Файл prog.c
#include
#include "myfunc.h"
main()
{ int i;
for
(i=-10; i
Слайд 11Область видимости имен
int m = 10; // Глобальная переменная
int f(int
n)
{ int i; // Локальная переменная
int k=0;
// Инициализация каждый вызов
char m='a';// Перекрытие глобального имени
return n; // Параметр – тоже локальная переменная
}
main()
{ int i; // Локальная переменная
i = m; // Обращение к глобальной переменной
i = f(i); // Вызов функции
}
Слайд 12Область видимости внутри модуля
main()
{ int i;
i=0;
{ int
i,j;
i=5;
}
j=0; // здесь ошибка
i++;
// здесь i станет 1
}
Слайд 13Область видимости внутри модуля
main()
{ int i;
i=0;
for (int
k=0; k
здесь ошибка
i++; // здесь i станет 1
}
Слайд 14void-функции
void prt(int n)
{
printf("%10d\n",n);
return;
}
main()
{ int i;
for (i=0,i
i++) prt(i*i);
}
Слайд 15Встраиваемые функции
inline double sqr(double x)
{ return x*x;
}
Помещать лучше в заголовочный
файл
Слайд 16Классы памяти переменных
auto – локальные переменные создаются при входе и
уничтожаются при выходе из функции
static – переменные создаются при компиляции
программы и «живут» всё время выполнения программы
extern – переменная описана «где-то в другом месте» как глобальная
register – переменную следует хранить в регистре процессора, не может иметь адреса
Слайд 17Область видимости и классы памяти
Слайд 19Передача массивов
f(int a[10]);
f(int a[]);
f(int *a);
Варианты заголовков функций
Слайд 20Передача массивов
#include
#define N 10
int sum(int a[], int n)
{
int b = 0;
for
(int i=0; i return b;
}
int main()
{ int m[N];
for (int i=0; i printf("%d\n",sum(m,N)); // m – уже указатель
}
Слайд 21Функция сортировки массива
#include
#define N 10
void sort(int a[], int
n)
{
for (int i=0; i
(int j=i+1; j if (a[i]>a[j]) { int x=a[j]; a[j]=a[i]; a[i]=x; }
}
int main()
{
int m[N];
for (int i=0; i sort(m,N);
for (int i=0; i}
Слайд 22Задача: бинарный поиск
int findbin(int x, int *a, int n)
{ int
left, right;
left=0; right=n-1;
while (right>left)
{ k=(right+left)/2;
if (a[k]==x) return k;
else if (x>a[k]) left=k+1;
else right=k;
}
return -1;
}
Слайд 23char str[12] = "Borland C++";
Передача строк
int strlen(char *s);
{ int k=0;
while (*s++) k++;
return k;
}
printf("%d\n", strlen("abc"));
Слайд 24Задача: поиск символа в строке
int findc(char c, char *s)
{ int
n=0;
while (*s)
{ if (c==*s++) return n;
else n++;
}
return -1;
}
Слайд 25Передача функций как параметров
double deriv(double f(double), double x, double eps)
{
return (f(x+eps*0.5)-f(x-eps*0.5))/eps;
}
double g(double x)
{
return x*x;
}
int main()
{
printf("%lf",deriv(g,2.0,1E-6));
}
Слайд 26Рекурсивные функции
fact(int n)
{ int a;
if (n
= fact(n-1)*n;
return a;
}
Слайд 27Рекурсивные функции
fib (int n)
{ if (n
return fib(n-1)+fib(n-2);
}
main()
{
printf("%d\n",fib(5));
}
Слайд 28Функции с переменным числом параметров
void f(int a, int b, ...)
Тип va_list
Макрос
va_start(list, last_fixed)
Макрос va_arg(list, arg_type)
Макрос va_end
Слайд 291-й способ: последний параметр – 0
int sum1(int a, ...)
{
va_list args;
int result=a, t;
va_start(args,a);
while(t=va_arg(args,int))
result+=t;
va_end(args);
return result;
}
Слайд 302-й способ: первый параметр – число аргументов
int sum2(int num,
...)
{ va_list args;
int result=0, i;
va_start(args,num);
for (i=0; i
i++)
result+= va_arg(args,int);
va_end(args);
return result;
}
Слайд 313-й способ: первый параметр – строка формата
#include
#include
void
errmsg(char *fmt, ...)
{ va_list args;
printf("Error:");
va_start(args,0);
vprintf(fmt, args);
va_end(args);
return;
}
main()
{ errmsg("%s - (%s)\n","First","Second");
}