Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка - Основи Програмування C_.doc
Скачиваний:
46
Добавлен:
18.12.2018
Размер:
1.44 Mб
Скачать

3. Керування виходом із циклів с#

Інколи виникає необхідність термінового переривання циклів. Таку логіку програми забезпечує інструкція break;, з якою ми познайомились у конструкції switch. Якщо всередині циклу знаходиться інструкція break;, то відбувається вихід із циклу, а управління передається інструкції, що безпосередньо слідує за даним циклом. Таким чином можна, наприклад перервати виконання «нескінченного» циклу.

bool condition;

for (;;)

{

if (condition) break;

}

Слід зауважити, що у випадку вкладених циклів інструкція break; викликає вихід лише із того циклу, де вона знаходиться, у зовнішній, не впливаючи на останній.

Крім інструкції break; для керування циклами використовується інструкція continue. У циклі for вона викликає перехід до обчислення <виразу-ітерації> (тобто до кроку 3), а у циклах while та do-while – перехід до обчислення <виразу-умови> циклу.

Радикальну дію викликає інструкція безумовного переходу goto. Її вживання у програмах вкрай небажане (тому що воно порушує послідовну логіку виконання програми та ускладнює її налагодження) і може бути зумовлене лише крайньою необхідністю, наприклад, дострокового виходу із кількох вкладених циклів в разі виникнення помилки. Синтаксис цієї інструкції наступний:

goto <мітка>;

Тут <мітка> – це звичайний ідентифікатор, який помічає інструкцію, на яку передбачено передачу управління програмою. Наприклад,

int counter = 10;

label : counter--;

Console.WriteLine("counter = " + counter.ToString());

// Реалізований цикл із 10 кроків

if (counter > 0) goto label;

Масиви в мові с#.

1. Визначення та ініціалізація масиву.

Масив – це тип даних (reference-type) для збереження елементів однакового типу, доступ до яких здійснюється за індексом. Першим значенням індексу є 0. Головна особливість масивів в мові С# полягає у тому, що вони реалізовані як об’єкти, що спадкують свої властивості та методи від класу System.Array.

Синтаксис визначення масиву наступний:

<тип_елементів> [] <ідентифікатор_масиву>;

<ідентифікатор_масиву> = new <тип_елементів> [кількість_елементів];

У першому рядку масив декларується (описується), точніше кажучи, визначається адресна змінна, яка буде вказувати на масив. У другому рядку масив власне створюється (операція new) в динамічній області пам’яті Heap і адреса його місця розташування пов’язується із ідентифікатором масиву. Ті самі дії можна здійснити в одному рядку:

<тип_елементів> [] <ідентифікатор_масиву> =

new <тип_елементів> [кількість_елементів];

Індексами елементів масиву будуть значення 0, 1, …, кількість_елементів-1. (Зверніть особливу увагу на те, що індексація елементів починається з нуля!) Для ініціалізації масиву можна використати фігурні дужки, в яких перелічити значення його елементів. В цьому разі кількість_елементів при визначенні масиву можна не вказувати – компілятор визначить її по кількості ініціалізованих елементів. До елементів масиву звертаються, вказуючи ідентифікатор масиву та індекс потрібного елементу у квадратних дужках. Розглянемо приклади визначення масивів.

using System;

namespace Array_1

{

class Program

{

static void Main()

{ // Робота з масивом

const int SIZE = 10;

int[] iArray = new int[SIZE]; // Визначаємо масив

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

// Елементи масиву ініціалізуються нулями!

Console.WriteLine(

"iArray [{0}] = {1}", i, iArray [i]);

}

}

}

Потрібно зазначити, що в мові C# на відміну від мови C або C++ у якості розміру масиву можна задавати звичайну змінну, проте, в даному випадку використання сталої є ознакою хорошого стилю програмуванням, це полегшує читання та подальше супроводження програми.

В даному прикладі масив був створений, але не проініціалізований. Тим не менше на екрані ми побачимо, що всі елементи масиву мають нульові значення – про це дбає компілятор, створюючи змінну reference-типу. Проте, хорошим стилем у програмуванні вважаються явні ініціалізації. Зробимо це у наступному прикладі.

using System;

namespace Array_2

{

class Program

{

static void Main()

{

// Визначаємо (без new) та ініціалізуємо масив

// його розмір визначаться компілятором

int[] iArray = {1, 2, 3, 4, 5};

Console.WriteLine("Масив цiлий iArray");

for (int i = 0; i < iArray.Length; i++)

Console.WriteLine("iArray [{0}] = {1}",i, iArray[i]);

// Визначаємо та ініціалізуємо масив

double[] dArray = new double[5] {1.1,2.2,3.3,4.4,5.5};

Console.WriteLine("Масив дiйсний dArray");

for (int i = 0; i < dArray.Length; i++)

Console.WriteLine("dArray [{0}] = {1}",i, dArray[i]);

// Інший масив з тим самим ідентифікатором

// попередні значення втрачені

dArray = new double[4] { 1.2, 2.3, 3.4, 4.5 };

Console.WriteLine("Ще один дiйсний масив dArray");

for (int i = 0; i < dArray.Length; i++)

Console.WriteLine("dArray [{0}] = {1}",i, dArray[i]);

double[] dArray_new;

// Той самий масив з іншим ідентифікатором

dArray_new = dArray;

Console.WriteLine(

"Той самий дiйсний масив dArray_new");

for (int i = 0; i < dArray_new.Length; i++)

Console.WriteLine(

"dArray [{0}] = {1}", i, dArray_new[i]);

}

}

}

Зауваження.

  1. В даному прикладі у рядку int[] iArray = {1, 2, 3, 4, 5}; створюється масив цілих чисел iArray, який ініціалізується п’ятьма значеннями. Зверніть увагу, в цьому випадку службове слово new та вказання кількості елементів не потрібно – компілятор автоматично визначає розмір масиву за кількістю ініціалізованих елементів.

  2. У рядку double[] dArray = new double[5] { 1.1, 2.2, 3.3, 4.4, 5.5 }; створюється та ініціалізується дійсний масив із 5 елементів, про що явно повідомляється компілятору. Ця вказівка в принципі є надмірною, хоча й синтаксично правильною. Але в разі явного визначення розміру масиву службове слово new є необхідним.

  3. Інструкцією dArray = new double[4] { 1.2, 2.3, 3.4, 4.5 }; для уже визначеного ідентифікатора dArray створюється та ініціалізується новий масив із чотирьох елементів.

  4. Зручною формою для умови продовження циклу for є використання властивості Length , яка для будь-якого масиву визначає кількість елементі у ньому.

  5. Зверніть увагу на інструкції :

double[] dArray_new;

dArray_new = dArray;

У першій з них описується ідентифікатор dArray_new дійсного масиву. А у другій – цьому ідентифікатору присвоюється значення ідентифікатора уже визначеного масиву dArray . В результаті обидва ідентифікатори вказують на один і той самий масив, точніше на одне й те саме місце у пам’яті, де записані 4 дійсних числа.

Щоб підкреслити «об’’єктну природу» масивів, розглянемо ще один приклад, що стосується зауваження 5. В ньому створюються, ініціалізуються та виводяться на екран 2 різних масиви. Потім ідентифікатору першого масиву присвоюється ідентифікатор другого. Фізично масиви знаходяться на своїх місцях в пам’яті, проте їх ідентифікатори посилаються тепер на одну й ту саму область, що ми і бачимо при виводі першого масиву. Посилання на перший масив тепер втрачене і в певний час він буде знищений з пам’яті спеціальною системою збору «сміття» GCGarbage Collector (детальніше про це див. далі)

using System;

namespace Array_3

{

class Program

{

static void Main(string[] args)

{ // Визначаємо та ініціалізуємо перший масив

int[] iArray1 = {1, 2, 3, 4, 5};

Console.WriteLine("Перший масив");

for (int i = 0; i < iArray1.Length; i++)

Console.WriteLine(

"Елемент масиву [{0}] = {1}", i, iArray1[i]);

Console.WriteLine("Другий масив");

// Визначаємо та ініціалізуємо другий масив

int[] iArray2 = { 6, 7, 8, 9, 10 };

for (int i = 0; i < iArray2.Length; i++)

Console.WriteLine(

"Елемент масиву [{0}] = {1}", i, iArray2[i]);

// Присвоєння ідентифікаторів масиву -

// тепер перший ідентифікатор вказує на другий масив

// посилання на перший масив - втрачене

iArray1 = iArray2;

Console.WriteLine("Ще раз другий масив");

// Друкуємо другий масив ще раз

for (int i = 0; i < iArray2.Length; i++)

Console.WriteLine(

"Елемент масиву [{0}] = {1}", i, iArray2[i]);

}

}

}

Важливо наголосити також, що С# суворо контролює значення індексів елементів масиву. Якщо значення індексу виводить за межі виділеної для масиву області пам’яті – виникає помилка типу «index out of range». Таким чином хорошим стилем програмування є використання конструкцій типу try ... catch для обмеження можливих випадків виходу за межі масиву.