Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
62
Добавлен:
30.05.2015
Размер:
3.61 Mб
Скачать

С использованием ссылочных переменных:

Ccылка – это другое имя переменной (объекта)

Оператор объявления ссылочной переменной:

тип данных &имя ссылки = имя объекта;

Пример: int x = 20; float y;

int &n = x; float &m = y;

22

void swap(int *a, int *b)

void swap(int &a, int &b)

{

{

int temp;

int temp;

temp = *a;

temp = a;

*a = *b;

a = b;

*b = temp;

b = temp;

}

}

main()

main()

 

{

{

 

int a, b;

int a, b;

 

a = 2; b = 3;

a = 2;

b = 3;

swap(&a, &b);

swap(a,

b);

}

}

 

23

Пример:

void mass ( int n, float A[ ] )

{

int i;

 

for( i = 0; i < n;

i++)

scanf( “ %f ”,

&A[ i ] );

}

 

main()

{

float B[3]; int a;

a = 2; mass(a, B);

}

Оперативная память

(возможное расположение (схематичное))

сегмент данных main()

сегмент данных mass ()

24

Рекурсивный вызов функции – это когда функция вызывает саму себя

Пример рекурсивной функции, вычисляющей значение факториала для n > 0 (n! = 1*2*3…*n):

fact (int n)

{

int a;

if (n = = 1) return 1; a = fact (n – 1)*n; return a;

}

25

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

тип_данных имя_функции (описания формальных параметров, …)

Пример:

long summa (int k, …)

{

int *p = &k; long t = 0;

for (; k; k--) t += *(++p); return t;

}

Подходы определения количества и типов параметров функции при ее вызове:

1-ый подход:

2-ой подход:

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

по специальному параметру-индикатору уникальное значение, которого будет сигнализировать об окончании списка фактических параметров

26

1-ый подход

#include <stdio.h> long summa (int k, …)

{

int *p = &k; long t = 0;

for (; k; k--) t + = *(++p); return t;

}

void main()

{

long r, p;

r = summa(2, 6, 4);

P = summa(6, 1, 2, 3, 4, 5, 6); printf (“r=%d\n”, r);

printf (“p=%d\n”, p);

}

Результат выполнения программы: r = 10

p = 21

2-ой подход

#include <stdio.h>

double prod (double arg, …)

{

double aa = 1.0; double *p = &arg;

if (*p == 0.0) return 0.0; for (; *p; p++) aa* = *p; return aa;

}

void main()

{

double r, p;

r = prod(2.0, 4.0, 3.0, 0.0); p = prod(1.4, 3.0, 0.0, 16.0); printf (“r=%d\n”,r);

printf (“p=%d\n”,p);

}

Результат выполнения программы: r = 9.0

p = 4.4

27

#include <stdio.h>

long minimum (char z, int k, …)

{

if(z == ’i’)

{

int *pi = &k + 1; int min = *pi;

for (; k; k--, pi++)

min = min >*pi ? *pi : min; return (long) min;

}

if(z == ’l’)

{

long *pl = (long*)(&k + 1); long min = *pl;

for (; k; k--, pl++)

min = min >*pl ? *pl : min; return (long)min;

}

printf(“неверно задан 1-й параметр”); return 2222L;

}

void main()

{

long p,p1; p=minimum(‘l’,2,10L,20L); p1=minimum(‘i’, 3,11,2,3);

}

28

возможность функции по-разному выполняться

Цель перегрузки функции -

и возвращать разные значения при обращении к ней с разными по типам и количеству фактическими параметрами, но с одним именем

для обеспечения

перегрузки функции

необходимо

для каждого имени определить, сколько

разных функций связано с ним

Пример:

long max (int n, int mas[10])

{

int maxN = mas[0]; for(int i = 0; i < n; i++)

if(mas[i] > maxN) maxn = mas[i]; return maxN;

}

long max (int n, long mas[10])

{

long maxN = mas[0]; for(int i = 0; i < n; i++)

if(mas[i] > maxN) maxn = mas[i]; return maxN;

}

void main ()

{

int i, n, m, A[10] = {1, 2, 3}; long B[10] = {4, 5, 6, 7}; max1, max2;

n = 3; m = 4; max1 = max(n, A); max2 = max(m, B);

}

29

Определение указателя на функцию:

тип_функции (*имя_указателя ) (описания формальных параметров); Оператор записи адреса функции в указатель:

имя указателя = имя функции; Оператор вызова функции через указатель:

(*имя_указателя) (список фактических параметров);

Пример:

 

void f1(void)

void f3(void (*p)())

{

{

(*p)();

print(“Выполняется f1”);

}

}

 

void f2(void)

void main()

{

{

void (*p)();

print(“Выполняется f2”);

p = f1;

}

f3(p);

 

 

}

30

это составной объект, в котором под одним именем Структура – объединяются элементы одного или разных типов

Определение структуры:

struct

{

список описаний элементов;

};

ИЛИ

struct метка

{

список описаний элементов;

};

метка – это имя структуры

Пример 1

struct

{

int a; float b; };

Пример 2

struct student

{

char name[25]; int id, age; char sex;

};

31