Загальні відомості про функцію system () Функція system(char*





![Масиви в С/С++ Синтаксис визначення масиву: <тип> <ідентифікатор_масиву> [кількість_елементів]; Тут <тип> визначає тип елементів Масиви в С/С++ Синтаксис визначення масиву: <тип> <ідентифікатор_масиву> [кількість_елементів]; Тут <тип> визначає тип елементів](https://present5.com/presentacii-2/20171208\21420-lec_3.ppt\21420-lec_3_6.jpg)


![Багатовимірні масиви Синтаксис визначення двовимірного масиву: <тип> <ідентифікатор_масиву> [кількість_елементів1][кількість_елементів2]; Приклади: int arr [2][3]; //визначили Багатовимірні масиви Синтаксис визначення двовимірного масиву: <тип> <ідентифікатор_масиву> [кількість_елементів1][кількість_елементів2]; Приклади: int arr [2][3]; //визначили](https://present5.com/presentacii-2/20171208\21420-lec_3.ppt\21420-lec_3_9.jpg)


21420-lec_3.ppt
- Количество слайдов: 11
Загальні відомості про функцію system () Функція system(char* str) передає рядок, що адресується параметром str, як команду для командного процессора операційної системи. Якщо system() викликається з вказівником NULL, то вона повертає ненульове значення при умові доступності командного процесора та нуль у супротивному випадку. Тобто все, що можна зробити у командному рядку Windows, можна виконати функцією system(). Коди кольорів: 0 = Black 1 = Blue 2 = Green 3 = Aqua 4 = Red 5 = Purple 6 = Yellow 7 = White 8 = Gray 9 = Light Blue A = Light Green B = Light Aqua C = Light Red D = Light Purple E = Light Yellow F = Bright White
Адресація та вказівники в С/С++ Вказівник (або покажчик, інколи – посилання) – це змінна, яка може містити адресу деякого іншого об’єкта. Ним може бути (в найпростішому випадку) інша змінна або масив, структура, функція, клас (в С++) тощо. Синтаксис визначення вказівника: <тип> * <ідентифікатор_вказівника>; Приклади. int* p_i; //p_i – вказівник на тип int, p_i має тип int* char* p_c;//p_c – вказівник на тип char, має тип char* void* p; //p – аморфний («нетиповий»)вказівник, // його тип – void* В цих прикладах вказівники поки що не вказують ні на які об’єкти – вони не проініціалізовані. Проте, якщо p – вказівник на деяку існуючу змінну, то *p – це сама змінна. Тут * – є операцією розадресації вказівника (dereferencing).
Яке значення можна присвоїти вказівнику? Будь-який числовий літерал – це неприпустиме рішення. В мові С для ініціалізації вказівника можна використати один з двох способів: ініціалізація вказівника адресою існуючої змінної; ініціалізація вказівника адресою динамічно виділеної пам’яті (з допомогою функції malloc(), calloc()). В мові С++ для ініціалізації вказівника може використовуватись також операція new, яка динамічно виділяє необхідний об'єм пам'яті під змінну. Приклади. int i; int *p_i = &i; // вказівник p_i вказує на змінну i // унарна операція & - взяття адреси *p_i = 10; // змінній i присвоєно значення 10 ++*p_i; // змінна i збільшена на 1 cout << *p_i; // виводимо значення змінної i Зауваження. У виразі (*pi)++; дужки обов'язкові на відміну від виразу ++*p_i; – із-за порядку виконання операцій. Зауваження. Вказівнику будь-якого типу можна присвоїти значення NULL (такий вказівник не вказує на жодну змінну)
Динамічний розподіл пам'яті. Динамічним розподілом пам'яті керують функції із файлу
Приклад роботи із вказівником. int *p; // визначили вказівник // виділяємо пам’ять – необхідно привести // вказівник до відповідного типу: p = (int*) malloc (sizeof (int)); printf ("\nВведіть ціле число: "); scanf ("%i", p); // ввели ціле значення // вивели його на екран printf ("\nЧисло = %i\n", *p); free (p); // звільнили пам’ять // В стилі С++ p = new int; // робота із вказівником delete p; // звільнення пам’яті
Масиви в С/С++ Синтаксис визначення масиву: <тип> <ідентифікатор_масиву> [кількість_елементів]; Тут <тип> визначає тип елементів масиву, які індексуються від 0 до кількість_елементів-1 . Приклади: int iArray [10]; //визначили масив із 10 елементів for (int i = 0; i < 10; i++) iArray [i] = i*i; //присвоїли значення елементам Увага: ідентифікатор масиву – константний вказівник на його нульовий елемент, таким чином, *(iArray + i)– це елемент масиву iArray [i] , а &iArray [i] – вказівник на елемент з індексом i, тобто те саме, що iArray + i. (адресна арифметика - далі) Компілятор не контролює вихід індексу за межі масиву! Масив можна проініціалізувати в момент визначення: int iArray [5] = {1, 2, 3, 4, 5}; char text [] = {'H','e','l','l','o','\0'};
Адресна арифметика Для будь-яких вказівників на один тип допустимі перевірки на рівність та нерівність їх між собою та присвоєння, а також присвоєння та порівняння з вказівником NULL. Якщо p1 та p2 – вказівники и на один і той самий масив, то допустимими операціями з ними додатково є такі: p1 < p2 перевірка: "p1 вказує на елемент масиву з меншим індексом, ніж той, на який вказує p2"; p1 <= p2 перевірка: "p1 вказує на елемент масиву з індексом не більшим, ніж той, на який вказує p2"; p1 > p2 перевірка: "p1 вказує на елемент масиву з більшим індексом, ніж той, на який вказує p2"; p1 >= p2 перевірка: "p1 вказує на елемент масиву з індексом не меншим, ніж той, на який вказує p2"; p2 – p1 кількість елементів масиву між елементами, що адресуються p2 та p1; p1 + k вказівник на k-ий елемент масиву, рахуючи вперед від елементу, на який вказує p1. p1 – k вказівник на k-ий елемент масиву, рахуючи назад від елементу, на який вказує p1.
Символьні масиви Текстовий масив може бути визначеним і в такий спосіб (підходить лише для текстових масивів): char* ptext = "Приклад визначення тексту "; або char text [20] = "Інший приклад"; (Тут важливо, щоб кількість елементів в масиві не перевищувала кількість символів текстової константи). Перший приклад дозволяє повторне визначення вказівника, наприклад: ptext = text; // так можна text = ptext; // а так – ні!
Багатовимірні масиви Синтаксис визначення двовимірного масиву: <тип> <ідентифікатор_масиву> [кількість_елементів1][кількість_елементів2]; Приклади: int arr [2][3]; //визначили масив із 2*3 елементів Елементи багатовимірних масивів розташовані в пам’яті послідовно таким чином, що найшвидше змінюється останній індекс. Для даного прикладу: arr [0][0] arr [0][1] arr [0][2] arr [1][0] arr [1][1] arr [1][2] Для такого масиву ідентифікатор arr – це вказівник на масив вказівників на його рядки. Тому до окремого елементу можна звертатись або прямою індексацією: arr [i][j] або через вказівники: *(*(arr + i) + j).
Багатовимірні масиви Вище наведений приклад визначення та звертання до елементів статичного масиву, тобто з фіксованими при визначенні розмірностями. А як створити динамічний двовимірний масив? Одна з можливостей – двовимірний масив використовувати як ланцюжок послідовно розташованих рядків (власне, так він і зберігається в пам’яті). Наприклад, виділимо пам’ять під масив розмірностей N*M : int *p =(int*)malloc (sizeof(int)*N*M); Тепер звертання до елементу з індексами [i][j] виглядає так: *(p + i*M + j) На завершення програми необхідно звільнити пам’ять: free (p);
Багатовимірні масиви Інша можливість – двовимірний масив використовувати як масив вказівників на рядки масиву (тобто масив масивів – саме так компілятор інтерпретує багатовимірні масиви). Створимо подібний динамічний масив розмірностей N*M : int **p=(int**)malloc (sizeof(int*)*N); Тут p – вказівник на масив із N елементів, які будуть вказівниками на рядки. Далі необхідно виділити пам’ять під кожний рядок: for (int i = 0; i < N; i++) *(p + i) = (int*) malloc (sizeof (int)*M); Тепер звертатись до елементу з індексами [i][j] можна як до елементу двохіндексного масиву: p[i][j] або *(*(p + i) + j). Звільнення пам'яті теж має відбутись в циклі: for (int i = 0; i < N; i++) free(*(p + i)); free(p);

