Лабораторна робота № 19. Сортування масивів та масив показників на функції

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися з новим алгоритмом сортування масивів та з масивом показників на функції, здобути навички написання програм.

Короткі теоретичні відомості до роботи.

Розглянемо новий алгоритм сортування масиву. Розроблений раніше алгоритм оформимо у вигляді підпрограми sort. Аргументами функції є: масив array, що обробляється, його розмір K і показник на деяку функцію var, яка здійснює вибір типу сортування.

var – це не ім’я функції, а тільки її позначення. Вираз int (*var)(int, int) є показник на деяку функцію, з двома цілими аргументами, що повертають ціле число. Дужки навколо (*var) потрібні тому, що операція * має пріоритет нижчий, чим дужки, що оточують аргументи функції. У прототипі ідентифікатор var опущений. Без дужок вираз int *var(int, int) об’являє функцію з двома цілими аргументами, які повертають показник на ціле. Виклик функції var має вигляд:

var(m, n); або (* var)(m, n);

Для підстановки у sort пропонуються дві функції: up і down. Функція up задає сортування від min до max, функція down – від max до min. Вибір здійснюється перемикачем з символьною міткою ch, котра викликає sort з тією або іншою функцією. Такий вибір функції-варіанту зазвичай використовується для складення меню.

Відзначимо, що up і down повертають не значення змінної, а вираз, котрий формально має тип int. Для обміну значеннями між елементами масиву застосовують функцію swap.

//файл PART3\3_06.ccp – передача функції у функцію

#include “c:\cpp\subprog\\roll.h”

#include “c:\cpp\subprog\\roll_txt.h”

#define N 9

void sort(int [], const unsigned, int (*)(int, int));

//сортування масиву

int up(int, int); // від min до max

int down(int, int); // від max до min

main() {

int array[N], max = 87, min = 12;

cout<<” вхідний масив \n”;

for (i=0; i<N; i++)(array[i]=ch (max, min);

//вхідний масив

cout<< array[i]<<’ ‘; };

cout<<” сортування від Max до Min: ввести d(down) ”

<<”\n сортування від Min до Max: ввести u(up) \n”;

char ch; cin>>ch;

swich ch { //вибір типу сортування

case ‘u’;

cout<<”\n сортування від Min до Max: ввести u(up) \n”;

sort (array, N, up);

for (i=0; i<N; i++)

cout<< array[i]<<’ ‘;

break;

case ‘d’;

cout<<”\n сортування від Max до Min\n”;

sort (array, N, down);

for (i=0; i<N; i++)

cout<< array[i]<<’ ‘;

break;

default;

cout<<”\nвведена помилкова мітка”; };

pause (0); return 0;

void sort(int array[], const unsigned K, int (*var)(int, int));

/* у функцію передається масив по імені, розмір масиву і показник на функцію */

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

for (int k=i+1; k<K; k++)

if ((var)(array[k], array[i]))

swap (array[i], array[k]); }

int up (int i, int j) //від міn до max

{return (i<j); }

int down (int i, int j) //від max до міn

{return (i<j); }

 
 

Результат сортування від max до min

 
 

Результат сортування від min до max

Показники на функцію можна не тільки передавати у функції, але і повертати із функції, Зберігати у масивах, присвоювати іншім показникам на функції. При об’яві показника на перевантажену функцію потрібно застосовувати її варіант, що вибраний.

У наступній програмі об’явлений ініціалізовний масив fP показників на функції, що мають заданий для усіх однаковий прототип. Кожна функція (fig0, fig1, fig2, fig3) малює на екрані визначену фігуру. При ініціалізації масиву використовується та обставина, що ім’я функції є показник на неї.

//файл PART3\3_07.ccp

/* Масив показників на функції, повернення функцією показника,

присвоєння одного показника іншому */

#include “c:\cpp\subprog\\roll.h”

#include “c:\cpp\subprog\\roll_gr.h”

#define N 4

void fig0 (int, int, int, int); //слимак

void fig1 (int, int, int, int); //спіраль

void fig2 (int, int, int, int); //хрест

void fig3 (int, int, int, int); //двокольорове коло

void (*choice()) (int, int, int, int); //вибір

main () {

void (*fP[]) (int, int, int, int) = { fig0, fig1, fig2, fig3}

/*об’ява масиву показників на функції типу void з чотирма аргументами

типу int кожна */

Initialize(); Sc r(15);

int x=0, r=40, y=40+r*2, dx= r*3, col=0;

for (i=0; i<N; i++) {x+=dx; fP[i](x, y, r, col); col++;};

/*послідовний виклик функцій через показники*/

y += r * 2;

fig1 (x, y, r, col); // безпосередній виклик функції

void (*fP[]) (int, int, int, int); /*об’ява показника на функцію типу void */

pP=choice (); /*виклик функції choice, присвоєння результату показнику pP */

y += r * 2;

pP(x, y, r, col); //виклик функції через показник

pause (0); closegraph (); return 0; }

void fig0 (int x, int y, int r, int col); // слимак

{Helix(x, y, r, col); }

void fig1 (int x, int y, int r, int col); // спіраль

{Spring(x, y, r, col); }

void fig2 (int x, int y, int r, int col); // хрест

{r*=0.2; Cruciform(x, y, r, col); }

void fig3 (int x, int y, int r, int col); //двокольорове коло

{Sphere(x, y, r, col); } /*Тому що Sphere потребує 4 аргументи, який з котрих

довелося ініціалізувати раніш */

void (*choice ()) (int x, int y, int r, int col); /*вибір, функція choice без аргументів

повертає показник на функцію типу void, яка має 4 аргументи типу int */

{void (*pP) (int, int, int, int)=fig2; /*об’ява показника на функцію з ініціалізацією */

return (pP); /*повернення показника */

Звернення до всіх функцій через показники-елементи масиву організовано у циклі. Далі для прикладу реалізується безпосередньо звернення до однієї із функцій за ім’ям.

Функція choice демонструє повернення показника на функцію, котра при зверненні до choice присвоюється іншому показнику pP, через котрий у свою чергу викликається функція, що визначена у choice.


РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ

Оглядові запитання

  1. Як виконується алгоритм сортування елементів масиву?
  2. Як працює підпрограма sort?
  3. Що відображає вираз: int (*var)(int, int)?
  4. Для чого потрібні дужки у виразу (*var)?
  5. Який вигляд має виклик функції var?
  6. Яке сортування задає функція up?
  7. Яке сортування задає функція down?
  8. Що повертають функції up і down?
  9. Що виконує функція swap?


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: