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

Скачать презентацию «ТЕХНОЛОГІЯ ПРОЕКТУВАННЯ ПРОГРАМНИХ СИСТЕМ   » Скачать презентацию «ТЕХНОЛОГІЯ ПРОЕКТУВАННЯ ПРОГРАМНИХ СИСТЕМ »

массив.ppt

  • Количество слайдов: 37

> «ТЕХНОЛОГІЯ ПРОЕКТУВАННЯ ПРОГРАМНИХ СИСТЕМ   »  Лозовська Людмила Іванівна «ТЕХНОЛОГІЯ ПРОЕКТУВАННЯ ПРОГРАМНИХ СИСТЕМ » Лозовська Людмила Іванівна

>1. Масиви  Масив являє собою набір пронумерованих об'єктів якогось певного типу. Номер елемента 1. Масиви Масив являє собою набір пронумерованих об'єктів якогось певного типу. Номер елемента масиву називається його індексом. int A[100]; // одновимірний масив float B[10][8]; // двохвимірний масив

>Ініціалізація масиву  int A[5] = { 25, 12, 6, 14, 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. Оголошення та ініціалізація нулями int A[15] = {0}; double X[10][16] = {0. 0}; Операція sizeof(. . . ) для простого масиву дає розмір масиву у цілому. int A[10]; cout << "Розмір масиву = "<< sizeof(A); на екран виводиться: Розмір масиву = 400.

>Максимальний розмір масиву n  Максимальний розмір глобального масиву визначається розміром наявної пам'яті, локального Максимальний розмір масиву n Максимальний розмір глобального масиву визначається розміром наявної пам'яті, локального масиву - встановленим розміром сегмента стека (як правило не більше 1 Мб).

>2. Покажчики  Покажчиком (pointer) називають змінну,  яка приймає значення, що є адресою 2. Покажчики Покажчиком (pointer) називають змінну, яка приймає значення, що є адресою деякого об'єкта. float* pf; float *pf;

> Унарна операція * , що діє на покажчик,  повертає посилання на об'єкт, Унарна операція * , що діє на покажчик, повертає посилання на об'єкт, адреса якого відповідає значенню покажчика. float a = 5; float* p = &a; *p = *p/2; a = a/2;

>n  Значення 0 або NULL для покажчика є спеціальною ознакою, воно означає, що n Значення 0 або NULL для покажчика є спеціальною ознакою, воно означає, що покажчик не вказує ні на жоден об'єкт. float* p = NULL;

>Арифметика покажчиків Нехай p - типізований покажчик, k - змінна цілого типу. Тоді значенням Арифметика покажчиків Нехай p - типізований покажчик, k - змінна цілого типу. Тоді значенням виразу p+k є значення адреси, збільшеної на розмір k об'єктів того типу, який відповідає покажчику p. Тобто така операція повертає адресу, зсунуту на k об'єктів уперед відносно значення p.

>Арифметика покажчиків double *p, *q = &x;  p= q+5;  значенням покажчика p Арифметика покажчиків double *p, *q = &x; p= q+5; значенням покажчика p буде значення покажчика q, збільшене на 5*8=40 байтів.

>Арифметика покажчиків Операція виду p+1 повертає адресу того об'єкта, що є наступним після об'єкта Арифметика покажчиків Операція виду p+1 повертає адресу того об'єкта, що є наступним після об'єкта з адресою p. Операція виду p++ збільшує значення покажчика p на розмір об'єкта відповідного типу, тобто вона діє також, як оператор p = p+1.

>3. Посилання  Для створення іменованого посилання необхідно записати  відповідне оголошення. Формат такого 3. Посилання Для створення іменованого посилання необхідно записати відповідне оголошення. Формат такого оголошення має вигляд: тип& ім'я = Lvalue; посилання R на змінну A типу float: float A; float& R=A; Іменоване посилання являє собою ім'я деякого об'єкта. Не іменовані посилання застосовуються для тимчасового посилання на об’єкт : float* p = new float[100]; *(p+2) = a+b+c; Ліворуч в останньому рядку записане неявне посилання на третій елемент динамічного масиву, адреса якого надана покажчиком p.

>правила використання посилань 1. Оголошення змінної-посилання повинне включати її ініціалізацію, крім випадків, коли вона правила використання посилань 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 void main() { clrscr(); const N=10; int A[N], B[N][N]; int i, k; for (i=0; i

>. Динамічні об'єкти й масиви n  Динамічними називаються об'єкти, які створюються й знищуються . Динамічні об'єкти й масиви n Динамічними називаються об'єкти, які створюються й знищуються в області пам'яті, яка розподіляється динамічно (її називають купою або heap-областю оперативної пам'яті) за допомогою операцій new і delete.

>double p = new double;   // об'єкт створений, //  покажчик p double p = new double; // об'єкт створений, // покажчик p зберігає адресу об'єкта *p = 3. 333; // ініціалізація об'єкта . . // інші операції з об'єктом delete p; // об'єкт знищено Відзначимо, що операція delete не встановлює в нуль покажчик p.

>Приклад створення динамічного об'єкта з контролем успішності виділення пам'яті:  void main() { set_new_handler(0); Приклад створення динамічного об'єкта з контролем успішності виділення пам'яті: void main() { set_new_handler(0); . . p= new double; if (p==NULL) { cout << "Немає пам'яті!"; exit(0); } . . n }

>Динамічні масиви n тип * p = new тип[N]; n  delete[ ] адреса; Динамічні масиви n тип * p = new тип[N]; n delete[ ] адреса; int N = 100; long* P= new long[N]; // тут N - не константа . . delete[ ] P;

>#include <new. h> void main() { set_new_handler(0);  // обробка виключення для new // #include void main() { set_new_handler(0); // обробка виключення для new // виконується програмою char* p; int i, N=1024*1024 L; for (i=0; ; i++) { p= new char[N]; // запит на виділення Мб пам'яті if (p==NULL) { cout<< "Size of virtual memory= " << i << " Mb" ; exit(0); } } }

>Двомірні динамічні масиви (матриці)  int** R = new int*[n];  for (i=0; i<n; Двомірні динамічні масиви (матриці) int** R = new int*[n]; for (i=0; i

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

>особливості двохвимірних динамічних масивів 2. Кожний рядок такої матриці може мати  незалежний розмір. особливості двохвимірних динамічних масивів 2. Кожний рядок такої матриці може мати незалежний розмір. int** A = new int*[n]; for (i=0; i

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

>особливості двохвимірних динамічних масивів 4. якщо потрібно поміняти місцями рядки з номерами i, j особливості двохвимірних динамічних масивів 4. якщо потрібно поміняти місцями рядки з номерами i, j у матриці R, замість того, щоб виконувати цикл: for (k=0; k

>Матриці з фіксованою довжиною рядка, але зі змінною кількістю рядків const int M = Матриці з фіксованою довжиною рядка, але зі змінною кількістю рядків 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 Матриця з фіксованим числом рядків, але зі змінною довжиною рядка const int N=200; int m; float* C[N]; for (int i=0; i> m; C[i]= new float[m]; // m- змінна }. . . . . // виконання операцій з матрицею for (i=0; i

>Рядки символів  Символьний рядок - це масив типу char T[ ] = Рядки символів Символьний рядок - це масив типу char T[ ] = "Ukraine Technology"; char* T = "Ukraine Technology"; char* A[20] = { "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота", "Неділя" };

>Основні операції для рядків - операції введення/виведення; - визначення кількості символів у рядку; Основні операції для рядків - операції введення/виведення; - визначення кількості символів у рядку; - копіювання символів з одного рядка в інший; - конкатенація, тобто об’єднання двох рядків в один; - пошук заданого символу в рядку; - пошук входження рядка в рядок; - лексикографічне порівняння рядків.

>int strlen(char* s);  Повертає довжину рядка s.  Довжина рядка визначається як кількість int strlen(char* s); Повертає довжину рядка s. Довжина рядка визначається як кількість його символів, завершальний нуль-байт не враховується.

>char* strcpy(char* dest, char* src); Виконується копіювання символів з рядка  src у рядок char* strcpy(char* dest, char* src); Виконується копіювання символів з рядка src у рядок dest. Масив символів з адресою dest повинен бути досить великим, щоб вмістити символи з масиву src. Функція повертає адресу завершального нуль-байту в масиві dest після копіювання.

>char* strcat(char* dest, char* src); Функція виконує конкатенацію рядків: до  рядка dest приєднується char* strcat(char* dest, char* src); Функція виконує конкатенацію рядків: до рядка dest приєднується рядок src. Повертається покажчик на масив- результат dest. Розмір масиву символів з адресою dest повинен бути достатнім для виконання цієї операції.

>char* strchr(char* s, int x);  Виконується пошук першого входження символу x у рядок char* strchr(char* s, int x); Виконується пошук першого входження символу x у рядок s. Вертається адреса знайденого входження. Якщо символ x не знайдений, вертається значення null.

>char* strstr(char* s 1, char* s 2);  Виконується пошук першого входження рядка символів char* strstr(char* s 1, char* s 2); Виконується пошук першого входження рядка символів s 2 у рядок s 1. Повертається адреса першого символу для знайденого входження або null , якщо входження не виявлене.

>int strcmp(char* s 1, char* s 2);  Виконується лексикографічне порівняння  рядків. Функція 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++); // Приклад 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; }