«ТЕХНОЛОГІЯ ПРОЕКТУВАННЯ ПРОГРАМНИХ СИСТЕМ »


![Ініціалізація масиву int A[5] = { 25, 12, 6, 14, 8 }; Ініціалізація масиву int A[5] = { 25, 12, 6, 14, 8 };](https://present5.com/presentation/3/18644725_132925764.pdf-img/18644725_132925764.pdf-3.jpg)
![Оголошення та ініціалізація нулями int A[15] = {0}; double X[10][16] = {0. Оголошення та ініціалізація нулями int A[15] = {0}; double X[10][16] = {0.](https://present5.com/presentation/3/18644725_132925764.pdf-img/18644725_132925764.pdf-4.jpg)











![void main() { clrscr(); const N=10; int A[N], B[N][N]; int void main() { clrscr(); const N=10; int A[N], B[N][N]; int](https://present5.com/presentation/3/18644725_132925764.pdf-img/18644725_132925764.pdf-16.jpg)



![Динамічні масиви n тип * p = new тип[N]; n delete[ ] адреса; Динамічні масиви n тип * p = new тип[N]; n delete[ ] адреса;](https://present5.com/presentation/3/18644725_132925764.pdf-img/18644725_132925764.pdf-20.jpg)

![Двомірні динамічні масиви (матриці) int** R = new int*[n]; for (i=0; i<n; Двомірні динамічні масиви (матриці) int** R = new int*[n]; for (i=0; i<n;](https://present5.com/presentation/3/18644725_132925764.pdf-img/18644725_132925764.pdf-22.jpg)






![Рядки символів Символьний рядок - це масив типу char T[ ] = Рядки символів Символьний рядок - це масив типу char T[ ] =](https://present5.com/presentation/3/18644725_132925764.pdf-img/18644725_132925764.pdf-29.jpg)








«ТЕХНОЛОГІЯ ПРОЕКТУВАННЯ ПРОГРАМНИХ СИСТЕМ » Лозовська Людмила Іванівна
1. Масиви Масив являє собою набір пронумерованих об'єктів якогось певного типу. Номер елемента масиву називається його індексом. int A[100]; // одновимірний масив float B[10][8]; // двохвимірний масив
Ініціалізація масиву int A[5] = { 25, 12, 6, 14, 8 }; int B[] = { 0, 1, 2, 3, 4, 5 }; int M[3][4] = { { 0 , 1 , 2 , 3 }, { 4 , 5 , 6 , 7 }, { 8 , 9 , 0 , 1 } }; int С[][4] = { { 0 , 1 , 2 , 3 }, { 4 , 5 , 6 , 7 }, { 8 , 9 , 0 , 1 } };
Оголошення та ініціалізація нулями int A[15] = {0}; double X[10][16] = {0. 0}; Операція sizeof(. . . ) для простого масиву дає розмір масиву у цілому. int A[10]; cout << "Розмір масиву = "<< sizeof(A); на екран виводиться: Розмір масиву = 400.
Максимальний розмір масиву n Максимальний розмір глобального масиву визначається розміром наявної пам'яті, локального масиву - встановленим розміром сегмента стека (як правило не більше 1 Мб).
2. Покажчики Покажчиком (pointer) називають змінну, яка приймає значення, що є адресою деякого об'єкта. float* pf; float *pf;
Унарна операція * , що діє на покажчик, повертає посилання на об'єкт, адреса якого відповідає значенню покажчика. float a = 5; float* p = &a; *p = *p/2; a = a/2;
n Значення 0 або NULL для покажчика є спеціальною ознакою, воно означає, що покажчик не вказує ні на жоден об'єкт. float* p = NULL;
Арифметика покажчиків Нехай p - типізований покажчик, k - змінна цілого типу. Тоді значенням виразу p+k є значення адреси, збільшеної на розмір k об'єктів того типу, який відповідає покажчику p. Тобто така операція повертає адресу, зсунуту на k об'єктів уперед відносно значення p.
Арифметика покажчиків double *p, *q = &x; p= q+5; значенням покажчика p буде значення покажчика q, збільшене на 5*8=40 байтів.
Арифметика покажчиків Операція виду p+1 повертає адресу того об'єкта, що є наступним після об'єкта з адресою p. Операція виду p++ збільшує значення покажчика p на розмір об'єкта відповідного типу, тобто вона діє також, як оператор p = p+1.
3. Посилання Для створення іменованого посилання необхідно записати відповідне оголошення. Формат такого оголошення має вигляд: тип& ім'я = Lvalue; посилання R на змінну A типу float: float A; float& R=A; Іменоване посилання являє собою ім'я деякого об'єкта. Не іменовані посилання застосовуються для тимчасового посилання на об’єкт : float* p = new float[100]; *(p+2) = a+b+c; Ліворуч в останньому рядку записане неявне посилання на третій елемент динамічного масиву, адреса якого надана покажчиком p.
правила використання посилань 1. Оголошення змінної-посилання повинне включати її ініціалізацію, крім випадків, коли вона є параметром функції, описана як extern або є компонентом класу. 2. Значення посилання після ініціалізації не може бути змінено. 3. Посилання завжди має певний тип. 4. Посилання на покажчик об’являти можна, але покажчик на посилання - ні. 5. Не можна створювати масив посилань. 6. Посилання не є об'єктом, воно не займає місце у пам'яті.
Масиви і покажчики Ім'я одновимірного масиву є одночасно і покажчиком, значенням якого є адреса першого елемента масиву. Наприклад, ім'я масиву А int A[100]; є покажчиком на елемент масиву A[0]. A[i] або *(A+i).
Зауваження Операція додавання значення покажчика і цілого числа реалізовано комутативною, тобто значення виразу A+i , де A - ім'я масиву, а i - ціле число, співпадає зі значенням i+A. A[i] ~ *(A+i) ~ *(i+A) ~ i[A]. A[i] ~ i[A]
void main() { clrscr(); const N=10; int A[N], B[N][N]; int i, k; for (i=0; i
. Динамічні об'єкти й масиви n Динамічними називаються об'єкти, які створюються й знищуються в області пам'яті, яка розподіляється динамічно (її називають купою або heap-областю оперативної пам'яті) за допомогою операцій new і delete.
double p = new double; // об'єкт створений, // покажчик p зберігає адресу об'єкта *p = 3. 333; // ініціалізація об'єкта . . // інші операції з об'єктом delete p; // об'єкт знищено Відзначимо, що операція delete не встановлює в нуль покажчик p.
Приклад створення динамічного об'єкта з контролем успішності виділення пам'яті: void main() { set_new_handler(0); . . p= new double; if (p==NULL) { cout << "Немає пам'яті!"; exit(0); } . . n }
Динамічні масиви n тип * p = new тип[N]; n delete[ ] адреса; int N = 100; long* P= new long[N]; // тут N - не константа . . delete[ ] P;
#include
Двомірні динамічні масиви (матриці) int** R = new int*[n]; for (i=0; i
особливості двохвимірних динамічних масивів 1. для роботи з динамічною матрицею R, крім набору одновимірних масивів - рядків матриці, створюється ще й додатковий одновимірний масив покажчиків на рядки. У ньому зберігаються адреси рядків. У наведеному прикладі значенням R є адреса першого елемента масиву покажчиків на рядки, а значенням R[i] - адреса першого елемента i-того рядка. Сам елемент матриці, що займає j-е місце в i-рядку, записується звичайним чином: R[i][j].
особливості двохвимірних динамічних масивів 2. Кожний рядок такої матриці може мати незалежний розмір. int** A = new int*[n]; for (i=0; i
особливості двохвимірних динамічних масивів 3. При створенні матриці пам'ять для кожного рядка виділяється незалежно, як для самостійного одновимірного масиву.
особливості двохвимірних динамічних масивів 4. якщо потрібно поміняти місцями рядки з номерами i, j у матриці R, замість того, щоб виконувати цикл: for (k=0; k
Матриці з фіксованою довжиною рядка, але зі змінною кількістю рядків const int M = 80; int n; cin >> n; float (*B)[M] = new float[n][M]; //B- покажчик // на об'єкт типу float[M] (рядок матриці) . . . delete[ ] B;
Матриця з фіксованим числом рядків, але зі змінною довжиною рядка const int N=200; int m; float* C[N]; for (int i=0; i
Рядки символів Символьний рядок - це масив типу char T[ ] = "Ukraine Technology"; char* T = "Ukraine Technology"; char* A[20] = { "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота", "Неділя" };
Основні операції для рядків - операції введення/виведення; - визначення кількості символів у рядку; - копіювання символів з одного рядка в інший; - конкатенація, тобто об’єднання двох рядків в один; - пошук заданого символу в рядку; - пошук входження рядка в рядок; - лексикографічне порівняння рядків.
int strlen(char* s); Повертає довжину рядка s. Довжина рядка визначається як кількість його символів, завершальний нуль-байт не враховується.
char* strcpy(char* dest, char* src); Виконується копіювання символів з рядка src у рядок dest. Масив символів з адресою dest повинен бути досить великим, щоб вмістити символи з масиву src. Функція повертає адресу завершального нуль-байту в масиві dest після копіювання.
char* strcat(char* dest, char* src); Функція виконує конкатенацію рядків: до рядка dest приєднується рядок src. Повертається покажчик на масив- результат dest. Розмір масиву символів з адресою dest повинен бути достатнім для виконання цієї операції.
char* strchr(char* s, int x); Виконується пошук першого входження символу x у рядок s. Вертається адреса знайденого входження. Якщо символ x не знайдений, вертається значення null.
char* strstr(char* s 1, char* s 2); Виконується пошук першого входження рядка символів s 2 у рядок s 1. Повертається адреса першого символу для знайденого входження або null , якщо входження не виявлене.
int strcmp(char* s 1, char* s 2); Виконується лексикографічне порівняння рядків. Функція повертає значення: n -1, якщо s 1 < s 2 , n 0, якщо s 1 == s 2 , n 1, якщо s 1 > s 2.
// Приклад 1 char* scopy(char* D, char* S) { while (*D++ = *S++); return D-1; } // Приклад 2 int len(char *s) { int L=0; while (*s++) L++; return L; }

