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

2. Цикли у мові с#

Для реалізації ітерацій деякої інструкції або групи інструкцій в мові С# передбачено 4 види циклів. Зараз познайомимось з трьома з них.

2.1. Цикл for.

Синтаксис цього циклу наступний.

for (<вираз-ініціалізація>;<вираз-умова>;<вираз-ітерація>) <інструкція циклу>;

або

for (<вираз-ініціалізація>;<вираз-умова>;<вираз-ітерація>)

{

<група інструкцій>;

}

Виконання циклу for відбувається наступним чином.

  1. Обчислюється <вираз-ініціалізація> .

  2. Обчислюється <вираз-умова> . Якщо він має значення false , то дія циклу закінчується. Інакше виконується <інструкція циклу>.

  3. Обчислюється <вираз-ітерація> .

  4. Відбувається перехід до кроку 2.

Найчастіше у <виразі-ініціалізації> встановлюється початкове значення деякої змінної, яка відіграє роль змінної циклу. <Вираз-ітерація> змінює значення цієї змінної, а у <виразі-умові> її значення порівнюється з деяким граничним значенням для прийняття рішення щодо продовження чи завершення циклу. Розглянемо приклади.

У першому прикладі обчислюється сума .

using System;

namespace Construct_for_sum

{

class Program

{

static void Main()

{ // Обчислюємо суму

double s = 0;

for (int i = 1; i <= 10; i++)

s += Math.Sin(i) / i;

Console.WriteLine(

"Сума sin(i)/i вiд 1 до 10 рiвна {0}", s);

}

}

}

Можливості мови дозволяють записати цикл, еквівалентний попередньому «порожнім», тобто таким, що містить лише порожню інструкцію ; (зауважимо, що за синтаксисом «тіло» циклу for повинно містити принаймні одну інструкцію, хоч і порожню).

using System;

namespace Construct_for_sum

{

class Program

{

static void Main()

{ // Обчислюємо суму

double s = 0;

// Тіло циклу – порожнє, все «заховано» в ітерації

for (int i = 1; i <= 10; s += Math.Sin(i)/i++) ;

Console.WriteLine(

"Сума sin(i)/i вiд 1 до 10 рiвна {0}", s);

}

}

}

У наступному прикладі розглядається ціле число типу byte (тип byte може бути замінений з відповідними виправленнями у програмі на довільний цілий беззнаковий тип – беззнаковий тому що використовується операція зсуву праворуч, про особливості якої ми говорили раніше). По результату порозрядного множення числа на маску 0X1, яка у внутрішньому поданні є послідовністю нулів з одиницею лише в останньому розряді, встановлюємо зміст останнього розряду числа. А оскільки треба «переглянути» всі розряди, то ми просто по черзі використовуємо порозрядний зсув числа праворуч, починаючи з найстаршого розряду, а отже, з максимального зсуву на sizeof(byte)*8-1 позицій.

using System;

namespace Construct_for_Bits

{

class Program

{

static void Main()

{

// друкуємо біти внутрішнього подання цілого числа

byte ui;

Console.WriteLine("Введiть цiле число");

ui = byte.Parse(Console.ReadLine());

byte size = sizeof(byte) * 8;

for (int i = size - 1; i >= 0; i--)

{ // використовуємо бітові операції; 0X1 = 00000…001

if (((ui >> i) & 0X1) != 0) Console.Write("1");

else Console.Write("0");

// пробіл між четвірками бітів

if (i % 4 == 0) Console.Write(" ");

}

Console.WriteLine();

}

}

}

Зауваження.

  1. Всі вирази у заголовку циклу не є обов’язковим і можуть бути пропущені. В разі відсутності <виразу-умови> його значенням вважається true. Таким чином можна записати «нескінчений» цикл:

for (;;)

{ // інструкції нескінченного циклу

// вихід з циклу має бути передбаченим якимось чином

}

  1. Можливе використання відразу кількох змінних циклу. Тоді вирази, пов’язані з їх ініціалізаціями та ітераціями, відокремлюються комами. Як наприклад у циклі

int i, j;

// тут 2 змінні циклу: i та j

for (i = 0, j = 10; i < j; i++, j--)

Console.WriteLine("i = {0} j = {1}", i, j);