Void main()
{ 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]; // глобальна об’ява
Yandex.RTB R-A-252273-3- Запоріжжя знту 2008
- Глава 1
- 1.1. Історія та сучасність
- 1.2. Загальна структура програми. Два простих приклади
- Void main()
- Void main()
- Глава 2 Об’єкти та ідентифікатори
- 2.1. Об'єкти та їхні атрибути
- 2.2. Алфавіт мови та лексеми
- 2.3. Ідентифікатори
- Void main() // (рівень 0)
- 2.4. Вправи
- Глава 3
- 3.1. Поняття виразу. Вирази Lvalue та Rvalue
- 3.2. Операції. Пріоритети та асоціативність
- Void main()
- Void main()
- Void main()
- 3.3. Вправи
- Глава 4
- 4.1. Види операторів
- 4.2. Стандартні оператори
- If (лв) опер_1; [ else опер_2; ]
- Void main()
- If (лв1) опер_1;
- Void main()
- Void main()
- Void main()
- Void main()
- Void main()
- 4.3. Оголошення змінних та ініціалізація
- Int number(125);
- Int number(125);
- 4.4. Константи і константні об'єкти
- Void main()
- 4.5. Вправи
- Глава 5
- 5.1. Типи та їхні різновиди
- 5.2. Службове слово void
- Int a[small], a[large];
- 5.4. Перетворення типів
- 5.5. Вправи
- Void main()
- Глава 6 покажчики і посилання
- 6.1. Покажчики
- Void main()
- Void strcpy(char* s1, char* s2)
- Void* pv;
- 6.2. Посилання
- 6.3 Вправи
- Void main()
- Глава 7 масиви і динамічні об'єкти
- 7.1. Масиви
- Void main()
- 7.2. Рядки символів
- Int strlen(char* s);
- Int strcmp(char* s1, char* s2);
- Int len(char *s)
- 7.3. Динамічні об'єкти й масиви
- Void main()
- Void main()
- Void main()
- Void main()
- 7.4. Вправи
- Глава 8 функції та процедури
- 8.1. Загальні відомості
- Void main()
- Void c_mul(double a_re, double a_im,
- Void swap1(long *px, long *py)
- Void swap2(long &X, long &y)
- Void main()
- Int fun(int, float*, double&);
- Void fun(int n)
- Void main()
- Void swap(int& a, int& b)
- 8.2. Функція main
- Void або int main(int n, char** p, char** q);
- Void main(int n, char** p, char** q)
- 8.3. Функції зі змінною кількістю параметрів
- Void main()
- 8.4. Покажчики на функції
- Int (*pf[3])(float X, float y);
- Void main()
- 8.5. Функції з шаблонами
- Void swap(string& s1, string& s2)
- Void main()
- Inline t abs(t X)
- Void create(type* &a, int n)
- Void del(type* &a)
- 8.6. Вправи
- Глава 9 консольне вВедення / вИведення
- 9.1. Засоби бібліотеки с
- Void main()
- Void main()
- Void main()
- 9.2. Використання потоків
- Void main()
- Void main()
- 9.3. Вправи
- Глава 10 операції з файлами
- 10.1. Види файлів і режими роботи з ними
- 10.2. Бібліотека с
- Void fprint(file* f, &X)
- Void rewind(file* f);
- Void main()
- Void main(int n, char** f)
- Void main(int n, char** fnam)
- 10.3. Застосування потоків
- Ifstream fin;
- Void open(char* filename, int mode, int access);
- Ifstream fin("a.Dat");
- Void main()
- Ifstream fa("a.Dat");
- If (fa.Eof()) break;
- Void main(int n, char** fnam)
- Void main(int n, char** f)
- Ifstream fa(f[1]);
- Void main(int n, char** fnam)
- Void main()
- Ifstream in("example.Cpp");
- Void main()
- Ifstream in("name.Dat",ios::binary);
- Void main()
- Ifstream fa("a.Dat");
- Int descr(fstr& f)
- Void main()
- Ifstream ina(infa);
- Ifstream inb(infb);
- 10.4. Вправи
- Глава 11 компіляція програми. Директиви і макроси
- 11.1. Фази компіляції
- 11.2. Директиви режиму компіляції
- 11.3. Директиви препроцесора
- 11.4. Вправи
- Глава 12 змішане програмування. Використання ассемблерного коду
- 12.1. Засоби використання асемблера
- Void main()
- 12.2. Вправи
- Глава 13 програмна реалізація алгоритмів
- 13.1. Алгоритм Евкліда пошуку найбільшого загального дільника двох цілих чисел
- 13.2. Обчислення факторіала
- 13.3. Пошук простих чисел. Решето Ератосфена
- Void main()
- 13.4. Генерація підмножин
- Void main()
- 13.5. Сортування масивів
- Void main()
- Void main()
- Int flag;
- 13.6. Пошук у масиві
- Void main()
- Void main()
- 13.7. Операції з матрицями
- Void ObrMatr (double** a, double** b, unsigned n )
- Void Minv(double** a, double** b, unsigned n )
- Void Gauss(double** a, double* b, double* X, unsigned n)
- 13.8. Лінійна інтерполяція даних
- 13.9. Лінійна апроксимація
- Void linappr(int n, double* X, double* y, double& a0, double& a1)
- 13.10. Розв’язування нелінійних рівнянь
- Void Bisec(funx f, double a, double b, double eps, double& X)
- Void Bisec(funx f, double a, double b,
- Void main()
- 13.11. Пошук заданої послідовності символів у файлі
- Void push(char* s, int n, char X)
- Void main()
- 13.12. Вправи
- Глава 14 створення й використання бібліотечних модулів. Модуль syst.H
- 14.1. Створення бібліотечних модулів
- 14.2. Модуль syst.H
- 14.3. Системні функції та макрооперації
- Void runtimer();
- Void main()
- Void runstimer();
- Void main()
- Void swp(Type& a, Type& b);
- Void main()
- Int cmp(int nx, int ny, Type* X, Type* y);
- Void errhalt(bool ex, char* mes);
- Void errhalt(bool ex, char* mes, file* f);
- 14.4. Операції введення/виведення
- Void flushkey();
- Void main()
- Int getyes();
- Void main()
- Void main()
- Int weight(type X);
- Void main()
- Int hamdist(Type a, Type b)
- 14.6. Спеціальні класи. Клас Spline для інтерполяції даних сплайнами
- Void main()
- 14.7. Вправи
- Глава 15 графІчне виведення. Модуль rgraph.H
- 15.1. Модуль rgraph.H. Загальні відомості
- 15.2. Глобальні змінні й константи
- 15.3. Класи й покажчики на функції
- 15.4. Функції й процедури класів
- Void main()
- Void main()
- Void main()
- Void main()
- 15.7. Вправи
- Глава 16 Життєвий цикл програмного продукту. Питання стилю запису програм
- 16.1. Життєвий цикл програми
- Int n, alfa, col;
- Void draw();
- Void rotate(int delta);
- 16.3. Вправи
- Література