русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Void main()


Дата додавання: 2014-11-28; переглядів: 837.


{ set_new_handler(0);// обробка виключення для new // виконується програмою

char* p; int i, N=1024*1024L;

for (i=0;;i++)

{ p= new char[N];// запит на виділення ще одного Мб // пам'яті

if (p==NULL)

{ printf("Size of virtual memory = %d Mb\n",i);

exit(0);

}

}

}

 

Двомірні динамічні масиви (матриці)

Існує три види двохвимірного динамічного масиву:

- масив зі змінним числом рядків і змінною довжиною рядка;

- масив з фіксованою довжиною рядка, але зі змінною кількістю рядків;

- масив з фіксованою кількістю рядків, але зі змінною довжиною рядка.

Операції створення та знищення двомірного масиву R типу int із змінною кількістю рядків, рівним n, і зі зміною довжиною кожного рядка, рівною m, записуються у такий спосіб:

 

int** R = new int*[n];

for (i=0; i<n; i++) R[i] = new int[m];

......................................

for (i=0; i<n; i++) delete[] R[i];

delete[] R;

 

Такі двохвимірні динамічні масиви мають ряд особливостей.

1. Як видно з останнього прикладу, для роботи з динамічною матрицею R, крім набору одновимірних масивів - рядків матриці, створюється ще й додатковий одновимірний масив покажчиків на рядки. У ньому зберігаються адреси рядків. У наведеному прикладі значенням R є адреса першого елемента масиву покажчиків на рядки, а значенням R[i] - адреса першого елемента i-того рядка. Сам елемент матриці, що займає j-е місце в i-рядку, записується звичайним чином: R[i][j].

2. Кожний рядок такої матриці може мати незалежний розмір. Це дає можливість створювати масиви, що відповідають деякій частині матриці. Наприклад, створення й знищення масиву, що включає тільки ті елементи квадратної матриці, які належать головній діагоналі або розміщені нижче неї, описується наступними рядками:

 

int** A = new int*[n];

for (i=0; i<n; i++) A[i] = new int[i+1];

......................................

for (i=0; i<n; i++) delete[] A[i];

delete[] A;

 

3. При створенні матриці пам'ять для кожного рядка виділяється незалежно, як для самостійного одновимірного масиву.

4. Для того, щоб поміняти місцями два рядки динамічної матриці, немає необхідності виконувати операцію обміну значеннями для кожної пари відповідних елементів рядків матриці. Досить виконати парний обмін для покажчиків на рядки. Так, якщо потрібно поміняти місцями рядки з номерами i, j у матриці R, замість того, щоб виконувати цикл:

for (k=0;k<m;k++) swp(R[i][k],R[j][k]);

досить виконати одну операцію:

swp(R[i],R[j]);

Тут swp(x,y) - процедура парного обміну, яка визначається у модулі syst.h .

 

Матриці з фіксованою довжиною рядка, але зі змінною кількістю рядків

Розглянемо приклад створення й видалення матриці B типу float з фіксованою довжиною рядка, рівної M і з змінною кількістю рядків n. Такого роду матриця створюється й знищується в такий спосіб:

 

const int M = 80;

int n; cin >> n;

float (*B)[M] = new float[n][M];

// тут B - покажчик на об'єкт типу float[M]

// (рядок матриці)

..........................

delete[] B;

Тут float (*B)[M] оголошує покажчик B на об'єкт типу float[M], це простий масив - рядок матриці, а new float[n][M] створює масив таких об'єктів із числом елементів n.

 

Матриця з фіксованим числом рядків, але зі змінною довжиною рядка

Приклад виконання операцій створення й видалення для таких матриць:

 

const int N=200;

int m;

float* C[N];

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

{ cin >> m;

C[i]= new float[m]; // тут m - змінна

}

............................// виконання операцій з матрицею

for (i=0;i<N;i++) delete С[i];// знищення матриці

 

Трьохвимірні масиви зі змінними розмірами

 

У наступному прикладі показано, як створюється і знищується трьохвимірний масив, усі розміри якого є змінними m,n,p, значення їх вводяться з клавіатури.

int m,n,p;

scanf("%d %d %d", &m,&n,&p); // введення розмірів масиву

int*** R = new int**[m]; // створення

for (i=0; i<m; i++) // трьохвимірного

{ R[i] = new int*[n]; // динамічного

for (j=0;j<n;j++) R[i][j]= new int[p]; // масиву R

} //

......................................

......................................

for (i=0; i<m; i++)// знищення масиву

{ for (j=0;j<n;j++) delete[] R[i][j];

delete[] R[i]

}

delete[] R;

 

Трьохвимірні масиви з фіксованими розмірами

Якщо розміри трьохвимірного масиву R є фіксованими, операції його створення та знищення програмуються простіше:

 

const N=20, M=30, P=40;

int (*R)[M][P]= new int[N][M][P]; // створення масиву

................................

delete[] R; // знищення масиву

 

У бібліотеках функцій, що поставляють для програмування на С/С++ усе ще зберігаються функції виділення й звільнення пам'яті типу malloc і free. Їхнє існування пояснюється прагненням підтримки сумісності зі старими системами програмування на С. По цілому ряду причин використання цих функцій при створенні нових програм настійно не рекомендується. Особливо відчутними є втрати від їхнього використання в тому випадку, коли програма будується на основі принципів об’єктно-орієнтованої технології.

 

Зауваження

Динамічний об’єкт може бути глобальним. У наступному фрагменту програми створюється динамічний одновимірний масив з глобальним покажчиком A :

 

#include <syst.h>

int n= 1000;

int* A= new int[n]; // глобальна об’ява


<== попередня лекція | наступна лекція ==>
Void main() | Void main()


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн