
- •Глава 3.
- •3.1 Описание функции
- •Параметры функции
- •3.2 Классы памяти
- •Классы памяти (2)
- •3.3 Параметры-массивы
- •3.4 Параметры-строки
- •3.5 Параметры-структуры
- •Параметры-структуры (2)
- •Параметры-структуры (3)
- •3.6 Параметры-функции
- •3.7 Рекурсия
- •3.9 Пространство имен
- •Доступ к элементам пространства имен
- •Непоименованное пространство имен
- •Глобальное пространство имен
- •3.10 Аргументы командной строки int main( int argc,char *argv[ ]) { ... }

Глава 3.
Функции. Модульное программирование
МГТУ им. Н.Э. Баумана Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети Лектор: д.т.н., проф.
Иванова Галина Сергеевна
1

3.1 Описание функции
<Тип результата> <Имя > ([<Список параметров>])
{ [< Объявление локальных переменных и констант >] <Операторы>
}
Пример:
int max(int a, int b);
int max(int a, int b)
{ if (a>b) return a; else return b;
}
Объявление функции- прототип
Описание
функции
2


Параметры функции
1.Все параметры передаются по значению!
2.Если надо вернуть значение, то передают указатель или ссылку:
а) указатель
void prog(int a, int *b) { *b=a; } вызов: prog(c,&d);
б) ссылка
void prog(int a, int &b) { b=a; } вызов: prog(c, d);
3.Если надо запретить изменение параметра, переданного адресом, то его описывают const
int prog2(const int *a) { …}
3

3.2 Классы памяти
1. Автоматические переменные (auto) main()
{auto int a;…}
Две разные abc() переменные
{auto int a;…}
2. Внешние переменные (extern) |
||
extern int a; |
|
|
main() |
Одна и та же |
|
{extern int a;…} |
||
переменная |
||
abc() |
|
|
{extern int a;…} |
Автоматическая |
|
bcd() |
переменная, которая |
|
{int a;…} |
внутри функции |
|
перекрывает внешнюю |

Классы памяти (2)
3. Статические переменные (static) |
||
abc() |
В отличие от автоматической |
|
{ int a=1; static int b=1; |
||
статическая переменная |
… a++; b++; …} |
увеличивается с каждым |
|
вызовом |
||
|
4. Внешние статические переменные (extern static) int a;
extern static int b;
Файл
5. Регистровые переменные (register)
register int a;
По доступу аналогична автоматической, но по возможности размещается в регистрах

3.3 Параметры-массивы
ВС++ отсутствует контроль размерности массива по первому индексу!
а) int x[5] int *x int x[ ] б) int y[ ][8] int y[4][8]
Пример:
void summa(const float x[ ][3], float *y)
{int i,j; for(i=0;i<5;i++)
for(y[i]=0,j=0;j<3;j++) y[i]+=x[i][j];
}
Вызов: summa(a,b);
6

3.4 Параметры-строки
Функции типа «строка» целесообразно писать как процедуры-функции.
Пример. Функция удаления «лишних» пробелов между словами.
char *strdel(const char *source,char *result)
{char *ptr;
strcpy (result, source);
while ((ptr=strstr(result, " "))!=NULL) strcpy(ptr,ptr+1);
return result;
}
Вызовы: puts(strdel(str,strres)); или strdel(str,strres);
7

3.5 Параметры-структуры
Имя структуры не является указателем на нее.
Пример 1. Сумма элементов массива (указатель).
struct mas{int n; int a[10]; int s;} massiv;
int summa(struct mas *x)
{int i,s=0;
for(i=0;i<x->n;i++) s+=x->a[i]; x->s=s;
return s; |
x |
|||||||||
} |
|
|
massiv |
|||||||
|
|
|||||||||
Вызов: |
|
|
n |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
summa(&massiv); |
|
|
s |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8

Параметры-структуры (2)
Пример 2. Сумма элементов массива (ссылка).
struct mas{int n; int a[10]; int sum;} massiv;
int summa(struct mas &x)
{int i,s=0; for(i=0;i<x.n;i++) s+=x.a[i]; x.s=s;
return s;
}
Вызов:
summa(massiv);
x=massiv
n a s
9

Параметры-структуры (3)
Пример 3. Сумма элементов массива (массив).
struct mas{int n;int a[10];int sum;} massiv[3];
int summa(struct mas *x)
{int i,k,s,ss=0; for(k=0;k<3;k++,x++)
{for(s=0,i=0;i<x->n;i++) s+=x->a[i]; x->s=s;
ss+=s; |
x |
massiv[3] |
|
|||||||||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ss; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
} |
|
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
Вызов: summa(massiv); |
|
|
s |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
||
|
10 |
|
|
|
|