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

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

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. ”;

}

}

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

При описании функции можно инициализировать некоторые параметры функции. Формальные параметры инициализируются значениями или глобальными константами, которые определены с помощью директивы define.

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

Правила:

1. Формальные инициализированные параметры должны располагаться подряд после неинициализированных, т.е. секция инициализированных параметров должна быть последней в списке формальных параметров.

2. При вызове функции фактические параметры, соответствующие инициализированным формальным, должны располагаться подряд с начала секции инициализации.

Пример:

Нахождение длины отрезка

<тип значения><идент.>(<тип пар.>[=<знач.>]{, <тип пар.>[=<знач.>]})

float par (float, float = 1, float = 1);

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

{

return x*y*z;

}

void main ()

{

float a, b, c;

int n;

cout<<”1. Dlina otrezka ”<<endl;

cout<<”2. Ploshad’ pryamougol’nika ”<<endl;

cout<<”3. Obyom pryamougol’nogo parallelipipeda ”<<endl;

cout<<”Nomer punkta ? ”;

cin>>n;

switch (n)

{

case 1:

cout<<”Dlina ? ”;

cin>>a;

cout<<”Dlina otrezka = “<<par(a);

break;

case 2:

cout<<”Dlina I shirina ? ”;

cin>>a>>b;

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

break;

case 3:

cout<<”Dlina, shirina i visota ? ”;

cin>>a>>b>>c;

cout<<”Obyom = ”<<par(a,b,c);

break

default

cout<<”Nepravil’niy nomer punkta”;

}

}

Тип структура в Си.

Этот тип является аналогом типа “запись” в Turbo Pascal. Позволяет объединить данные различных типов.

<тип структура> ≡ struct

{

<резерв. пам.>;

{<резерв. пам.>;}

}

Компоненты этого типа называются членами структуры.

Описание переменной с типом <структура>:

Сначала определяется идентификатор типа <структура>, затем описываются переменные с использованием этого идентификатора.

<определение типа> ≡ typedef <тип><идент. типа>

Пример:

typedef struct

{

char F[15], I[15], O[15];

int B[4];

float SB;

}

rez;

rez GR [25];

GR[5].F //Фамилия 6-го студента группы//

GR[5].B[1] //Оценка этого студента на втором экзамене//

Ввод фамилии, имени и отчества можно организовать с помощью оператора cin, т.к. эти переменные не будут содержать пробелов.

Тип указатель.

Программные объекты, которые порождаются с помощью соответствующих описаний называются статическими. Память за ними закрепляется на все время работы программы.

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

При объявлении данных динамической структуры в разделе описания указывается не сама переменная, а только ссылка на нее. Такая организация данных позволяет динамически занимать и освобождать память в процессе работы блока программы.

Это осуществляется с помощью типа указателя.

Синтаксис:

typedef <тип >* <тип указатель>;
<тип указатель> <идентификатор>;

Или

<тип> *<идентификатор>;

Над указателями выполняются следующие простейшие действия:

Объявление переменной

int *p;

char *s;

Выделение области памяти

Это осуществляется с помощью процедуры new, она выделяет область памяти из области «куча» соответствующий тому типу, который описан для указателя и записывает ее адрес в указатель.

p=new float;

Операция взятия указателя

Для этого служит унарная операция ”&”.

int *p;

int n;

p=&n;

Операция &n даст адрес величины n и в программе его значение будет присвоено указателю p.

Занесение информации

*p:=1;

*n:=2;

Операция сравнения

if (p!=NULL)

Копирование информации

*p=*n;

В область памяти одной переменной заносится значение, хранившееся в другой.

Копирование адреса

p=n;

Обе ссылочные переменные ссылаются на одну и ту же область памяти.

Освобождение памяти

<освобождение памяти>≡delete <выр.>.

Процедура освобождает область памяти на которую указывает ссылочная переменная, после чего эта область становится доступной для распределения под другие динамические переменные.

Наши рекомендации