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

4.3.3. Ссылки и структуры в функциях

Следующий листинг демонстрирует применение механизма ссылок при работе со структурами.

Листинг 4.8. Указатели и структуры в функциях.

#include <iostream>

#include <string>

using namespace std;

//запись;

struct Record

{

int number;

string name;

string surname;

};

//функция создания записи;

void MakeRecord (Record& newrec)

{

cin >> newrec.number;

cin >> newrec.name;

cin >> newrec.surname;

}

//функция вывода записи на экран;

void PrintRecord (Record & outrec)

{

cout << outrec.number << ". " << outrec.name << " " << outrec.surname;

}

int main (void)

{

Record rec;

MakeRecord(rec);

PrintRecord(rec);

cout << endl;

return 0;

}

4.3.4. Указатели и массивы в функциях

Следующий листинг демонстрирует применение механизма указателей при работе с динамическими массивами.

Листинг 4.9. Указатели и массивы в функциях.

#include <iostream>

using namespace std;

/* создание массива;

* входные параметры – размеры и значение элемента;

* возвращается указатель на массив указателей;

*/

int ** new_array (int nsize, int msize, int init_val = 0)

{

int **pinta = new int*[nsize];

for (int i = 0; i < nsize; i++) {

pinta[i] = new int[msize];

for (int j = 0; j < msize; j++)

pinta[i][j] = init_val;

}

return pinta;

}

/* вывод массива;

* входные параметры – массив и размеры;

*/

void out_array (int **pinta, int nsize, int msize)

{

for (int i = 0; i < nsize; i++) {

for (int j = 0; j < msize; j++)

cout << pinta[i][j] << " ";

cout << endl;

}

}

/* освобождение памяти;

* параметры – массив и количество подмассивов;

*/

void del_array (int **pinta, int nsize)

{

for (int i = 0; i < nsize; i++)

delete[] pinta[i];

delete[] pinta;

}

int main(void)

{

int n, m;

cin >> n >> m;

int **array = new_array(n, m); //создание массива;

out_array(array, n, m); //вывод массива;

del_array(array, n); //удаление массива;

return 0;

}

4.3.5. Указатели и ссылки на функцию

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

Листинг 4.10. Указатели и ссылки на функции.

#include <iostream>

using namespace std;

typedef int (*cmp) (int &, int &);

//функции сравнения «<», «<=», «>», «>=»;

inline int cmp_small (int & cmpv1, int & cmpv2) { return cmpv1 < cmpv2?1:0;}

inline int cmp_small_eq (int & cmpv1, int & cmpv2) { return cmpv1 <= cmpv2?1:0;}

inline int cmp_great (int & cmpv1, int & cmpv2) { return cmpv1 > cmpv2?1:0;}

inline int cmp_great_eq (int & cmpv1, int & cmpv2) { return cmpv1 >= cmpv2?1:0;}

/* функция сортировки;

* входные параметры – сортируемый массив, его размер и функция сравнения;

*/

void sorts (int ar[], const int size, cmp compare)

{

int tmpv;

for (int j = 0; j < size; j++)

for (int i = 0; i < size-1; i++) {

//сравнение и обмен элементов;

if (compare( ar[i], ar[i+1] )) {

tmpv = ar[i];

ar[i] = ar[i+1];

ar[i+1] = tmpv;

}

}

}

int main (void)

{

//сортируемый массив;

const int iar_size = 15;

int iar[iar_size] = { 44, 12, 35, 13, 44, 95, 17, 58, 76, 60, 29, 41, 48, 76, 67 };

//массив функций сравнения;

const int fiar_size = 4;

cmp fiar[fiar_size] = { cmp_small, cmp_great, cmp_small_eq, cmp_great_eq };

for (int i = 0; i < iar_size; i++)

cout << iar[i] << " ";

cout << endl << endl;

//сортировка и вывод результата сортировки;

for (int j = 0; j < fiar_size; j++)

{

sorts( iar, iar_size, fiar[j] );

for (int i = 0; i < iar_size; i++)

cout << iar[i] << " ";

cout << endl;

}

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]