
Принцип модульности в с.
Различают два понятия область существования и область доступа.
Область существования – часть программы, при использовании которой выделена память под переменную («время жизни»).
Область доступа – совокупность строк программы, в которой можно использовать соответствующий объект (например идентификатор типа).
Эти две области обычно совпадают.
Классы памяти в с.
<класс памяти><резервирование памяти>.
<класс памяти> = одно из зарезервированных слов: 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. ”;
}
}