Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
часть4.doc
Скачиваний:
3
Добавлен:
15.04.2019
Размер:
307.71 Кб
Скачать

Принцип модульности в с.

Различают два понятия область существования и область доступа.

Область существования – часть программы, при использовании которой выделена память под переменную («время жизни»).

Область доступа – совокупность строк программы, в которой можно использовать соответствующий объект (например идентификатор типа).

Эти две области обычно совпадают.

Классы памяти в с.

<класс памяти><резервирование памяти>.

<класс памяти> = одно из зарезервированных слов: auto, extern, static, register; используется для описания локальных переменных. Область существования – с момента описания до конца составного оператора, т.е. до конца описания функции.

Для локальных переменных класс памяти auto используется по умолчанию.

register, - рассматривается как рекомендация транслятору выделить память под переменную в регистрах процессора.

extern, - для глобальных переменных; в явном виде не используется, т.к. переменные, память для которых резервируется вне описания функций, автоматически относятся к этому классу. Область существования совпадает с областью доступа. Память под эти переменные выделяется на все время работы программы.

static, - промежуточный вариант. Обычно используется для описания локальных переменных. Область существования - с момента описания и до конца программы. Область доступа – с момента описания и до конца блока.

Передача параметров.

В языке С параметры передаются только значением.

В С++ появляется возможность передачи значений ссылкой.

Для этого нужно перед параметром поставить знак «взятие адреса», который не является операцией, а носит лишь справочный характер.

В примере, указанном выше, для этого нужно вместо первых двух *(звездочек) поставить символы &(а именно: void swap (float &x, float &y)), а затем обращаться к параметрам уже без символа *(звездочка).

При этом значения x и а хранятся в одной области памяти, под x и y память не выделяется, под z – выделяется.

Передача массива в качестве параметра.

Элементы массива простого типа:

1). <идент. типа><идент.>[]; - передача значением; <идент.> имеет смысл «указатель».

Пример: сортировка массива.

void sort(int n, float a[])

{

}

n, - количество элементов массива; a, - сам массив.

2). <идент. типа><идент.>[const].

Элементы массива – массивы:

Необходимо указать количество индексов для элемента массива:

1). … float b[][5];

2). … float b[10][5]

Использование функций.

Имя функции имеет смысл переменной.

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

В С это описание называют прототипом.

Прототип носит справочный характер.

Пример:

float kv (float t)

void swap1 (float &x, float &y, float (*k)(float t))

{

float z;

z=k(x);

x=k(y);

y=z;

}

void main ()

{

swap1(a, b, kv)

}

# include “mod.h”

void main ()

{

swap1(a, b, kv);

}

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

Может быть описано несколько функций с одним идентификатором, но с разным списком параметров.

Пример: Найти площадь треугольника тремя способами.

float strl(float &x, float &y)

{

return x*y/2;

}

float strl(float &x, float &y, int &z)

{

return x*y*atan(1)*z/90;

}

float strl(float &x, float &y, float &z)

{

float p;

p=(x+y+z)/2;

return sqrt(p*(p-x)(p-y)(p-z));

}

void main ()

{

float a, b, c;

int n;

cout<<”Ploshad’ treugol’nika:”<<endl;

cout<<”1. Po osn. I vis.: ”<<endl;

cout<<”2. Po storonam I uglu v gradusah: ”<<endl;

cout<<”3. Po trem storonam: ”<<endl;

cout<<”Nomer puncta ? ”<<endl;

cin>>n;

switch n

{

case 1:

cout<<”Osnovanie I visota ? ”;

cin>>a>>b;

cout<<”Ploshad’ = ”<<strl(a, b)<<endl;

break;

case 2:

cout<<”Smegnie storoni I ugol ? ”;

cin>>a>>b>>n;

cout<<”Ploshad’ = ”<<strl(a, b, n)<<endl;

break;

case 3:

cout<<”Tri storoni ? ”;

cin>>a>>b>>c;

cout<<”Ploshad’ = ”<<strl(a, b, c)<<endl;

break;

default

cout<<”Nepravil’niy nomer punkta. ”;

}

}