Лекция 4 - Подпрограммы

Содержание

Слайд 2

Назначение подпрограмм

Экономия кода
Структуризация программы

Назначение подпрограмм Экономия кода Структуризация программы

Слайд 3

Два вида подпрограмм

Функция – возвращает значение через свое имя
a=sqrt(x);
Процедура – выполняет какое-то

Два вида подпрограмм Функция – возвращает значение через свое имя a=sqrt(x); Процедура
действие
printf("Hello");

В языке C/C++ нет процедур, но есть функции типа void.

Слайд 4

Пример: возведение в степень

double power(double a, int n)
{ int i;
double

Пример: возведение в степень double power(double a, int n) { int i;
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;

Заголовок функции double power(double a, int n); main() { int i; for
i<=10; i++)
printf("%lf\n", power(2,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

Создание библиотек функций 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

Файл myfunc.c #include #include "myfunc.h" double power(double a, int n) { int
x=1;
for (i=0; i if (n<0) x=1.0/x;
return x;
}

Слайд 9

Файл myfunc.h
double power(double, int);

Файл myfunc.h double power(double, int);

Слайд 10

Файл prog.c

#include
#include "myfunc.h"
main()
{ int i;
for (i=-10; i<=10; i++)

Файл prog.c #include #include "myfunc.h" main() { int i; for (i=-10; i printf("%lf\n", power(2,i) ); }
printf("%lf\n", power(2,i) );
}

Слайд 11

Область видимости имен

int m = 10; // Глобальная переменная
int f(int n)
{ int

Область видимости имен int m = 10; // Глобальная переменная int f(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;

Область видимости внутри модуля 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<10;

Область видимости внутри модуля main() { int i; i=0; for (int k=0;
k++)
{
printf(“%d\n”,k);
}
k=0; // здесь ошибка
i++; // здесь i станет 1
}

Слайд 14

void-функции

void prt(int n)
{
printf("%10d\n",n);
return;
}
main()
{ int i;
for (i=0,i<10; i++) prt(i*i);
}

void-функции void prt(int n) { printf("%10d\n",n); return; } main() { int i; for (i=0,i }

Слайд 15

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

inline double sqr(double x)
{ return x*x;
}
Помещать лучше в заголовочный файл

Встраиваемые функции inline double sqr(double x) { return x*x; } Помещать лучше в заголовочный файл

Слайд 16

Классы памяти переменных

auto – локальные переменные создаются при входе и уничтожаются при

Классы памяти переменных auto – локальные переменные создаются при входе и уничтожаются
выходе из функции
static – переменные создаются при компиляции программы и «живут» всё время выполнения программы
extern – переменная описана «где-то в другом месте» как глобальная
register – переменную следует хранить в регистре процессора, не может иметь адреса

Слайд 17

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

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

Слайд 18

Способы передачи аргументов в С

Способы передачи аргументов в С

Слайд 19

Передача массивов

f(int a[10]);
f(int a[]);
f(int *a);

Варианты заголовков функций

Передача массивов f(int a[10]); f(int a[]); f(int *a); Варианты заголовков функций

Слайд 20

Передача массивов

#include
#define N 10
int sum(int a[], int n)
{
int

Передача массивов #include #define N 10 int sum(int a[], int n) {
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)
{

Функция сортировки массива #include #define N 10 void sort(int a[], int n)
for (int i=0; i for (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;

Задача: бинарный поиск int findbin(int x, int *a, int n) { int
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;
}

Слайд 23

char str[12] = "Borland C++";

Передача строк

int strlen(char *s);
{ int k=0;
while (*s++)

char str[12] = "Borland C++"; Передача строк int strlen(char *s); { int
k++;
return k;
}

printf("%d\n", strlen("abc"));

Слайд 24

Задача: поиск символа в строке

int findc(char c, char *s)
{ int n=0;
while

Задача: поиск символа в строке int findc(char c, char *s) { int
(*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

Передача функций как параметров double deriv(double f(double), double x, double eps) {
g(double x)
{
return x*x;
}
int main()
{
printf("%lf",deriv(g,2.0,1E-6));
}

Слайд 26

Рекурсивные функции

fact(int n)
{ int a;
if (n<=1) return 1;
a = fact(n-1)*n;

Рекурсивные функции fact(int n) { int a; if (n a = fact(n-1)*n; return a; }
return a;
}

Слайд 27

Рекурсивные функции

fib (int n)
{ if (n<=2) return 1;
else return fib(n-1)+fib(n-2);
}
main()
{

Рекурсивные функции fib (int n) { if (n else return fib(n-1)+fib(n-2); } main() { printf("%d\n",fib(5)); }
printf("%d\n",fib(5));
}

Слайд 28

Функции с переменным числом параметров

void f(int a, int b, ...)
Тип va_list
Макрос va_start(list, last_fixed)
Макрос

Функции с переменным числом параметров void f(int a, int b, ...) Тип
va_arg(list, arg_type)
Макрос va_end

Слайд 29

1-й способ: последний параметр – 0

int sum1(int a, ...)
{ va_list args;

1-й способ: последний параметр – 0 int sum1(int a, ...) { va_list
int result=a, t;
va_start(args,a);
while(t=va_arg(args,int))
result+=t;
va_end(args);
return result;
}

Слайд 30

2-й способ: первый параметр – число аргументов

int sum2(int num, ...)
{ va_list

2-й способ: первый параметр – число аргументов int sum2(int num, ...) {
args;
int result=0, i;
va_start(args,num);
for (i=0; i result+= va_arg(args,int);
va_end(args);
return result;
}