3.7. Оператор for
Окрім оператора while, організувати цикл дозволяє і оператор for. Перепишемо вже розглянуту програму розрахунку температур в дещо іншому вигляді (лістинг 3.3).
Лістинг 3.3.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CelsFahr_For
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Таблиця температур за Фаренгейтом і Цельсієм:");
Console.WriteLine("За Фаренгейтом За Цельсієм");
int fahr;
for (fahr = 0; fahr <= 300; fahr=fahr+20)
Console.WriteLine(" {0:f} {1:f}", fahr, (5.0/9.0)*(fahr-32.0));
Console.Write("Для продовження натисніть будь-яку клавішу>");
Console.Read();
}
}
}
Тут для отримання того ж результату, що і у попередньому випадку застосований оператор циклу for. Тіло цього оператора, як і тіло оператора while, циклічно виконується (прокручується). У нашому випадку тіло for складається всього з одного оператора - Console.WriteLine(...), тому таке тіло не береться у фігурні дужки (якби тіло оператора while складалося тільки з одного оператора, воно теж не бралося би в дужки).
Видно, що запис програми набув компактнішого вигляду. У заголовковій частині оператора for розташовано три вирази, з яких перші два закінчуються крапкою з комою, третій - круглою дужкою, яка позначає межу заголовної частини for (компілятор розуміє що третій вираз завершився). Кажуть, що в даному випадку "цикл йде по змінній fahr": в першому виразі вона отримує початкове значення, другий вираз - це умова закінчення циклу (цикл закінчиться тоді, коли fahr набуде значення, більшого 300), а третій вираз змінює параметр циклу на величину кроку циклу.
Робота відбувається так: ініціалізувалася змінна циклу (т. т. отримує початкове значення), потім перевіряється умова продовження циклу. Якщо вона істинна, то спочатку виконується тіло оператора (в даному випадку функція Console.WriteLine(...)), потім управління передається у заголовкову частину оператора for. Після цього обчислюється третій вираз (змінюється параметр циклу) і перевіряється значення другого виразу. Якщо воно істинне, то виконується тіло, потім управління знову передається на обчислення третьому виразу і т. д. Якщо ж другий вираз стає неправдивим, то виконання оператора for завершується і починає виконуватися оператор, наступний безпосередньо за ним, т. т. за його тілом (а це - завершальна фігурна дужка Main(), що означає припинення роботи функції Main()).
У цьому прикладі треба звернути увагу на аргумент функції Console.WriteLine(...). Замість звичайної змінної там стоїть цілий вираз, який спочатку буде обчислено, а потім його значення виведеться на пристрій виведення. Вираз можна вказувати як аргумент функції, виходячи з правила мови: "У будь-якому контексті, в якому допускається використання змінної деякого типу, можна використати і вираз цього ж типу".
Змінимо програму лістингу 3.3 так, як показано в лістингу 3.4.
Лістинг 3.4.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CelsFahr_For
{
class Program
{
const int upper = 300;
const int lower = 0;
const int step = 20;
public static void Main(string[] args)
{
Console.WriteLine("Таблиця температур за Фаренгейтом і Цельсієм:");
Console.WriteLine("За Фаренгейтом За Цельсієм");
int fahr;
for (fahr = lower; fahr <= upper; fahr = fahr + step)
Console.WriteLine(" {0:f} {1:f}", fahr, (5.0 / 9.0) * (fahr - 32.0));
Console.Write("Для продовження натисніть будь-яку клавішу>");
Console.Read();
}
}
}
Що нового отримали? В операторі for були замінені конкретні числа на значення змінних, а самі змінні отримали початкові константні значення перед визначенням функції Main(). Результат розрахунку не змінився. Для чого усе це? Ми підвищили гнучкість програми в сенсі її супроводу. Уявіть собі, що ви супроводжуєте досить велику програму, та ще й чужу. Тобто ви в ній, так би мовити, плаваєте. У неї розробник понапихав (інакше не скажеш) масу конкретних цифр. Приходить до вас той, для кого ви супроводжуєте цю програму (т. т. програма працює на цю людину або організацію), і говорить вам, що такі-то числа, закладені раніше в програму, потрібно замінити іншими. Що ви станете робити? Ви візьмете текст програми і почнете в ньому довго і наполегливо шукати числа, які потрібно замінити. При цьому згадуватимете розробника не дуже утішними словами. Ось щоб цього не траплялося, краще усі константи, що беруть участь в розрахунках, виносити в одну область програми (бажано, в початок), щоб можна було надалі без особливих зусиль змінювати їх значення. Форма запису таких величин у вигляді const int upper = 300; і місце їх запису - це вимоги класів, які ми розглядатимемо надалі. Через те, що наша програма оформлена як клас з ім'ям Program, то константи в цьому класі описані як константні згідно потрібного формату.
На завершення відмітимо, що разом з оператором циклу while є оператор циклу do while. Він працює практично так само як і while за одним лише виключенням: while може відразу закінчуватися, не виконуючи жодного разу свого тіла, якщо первинна умова в його заголовку неправдива. Робота оператора розпочинається з перевірки умови в його заголовку: якщо воно неправдиве, оператор не виконується. Але зустрічаються завдання у яких потрібно застосувати while, але щоб і при неправдивій початковій умові тіло виконалося хоч би один раз. Ось це і робить оператор do while.
Вигляд такого оператора наступний:
do
{
// тіло
}
while(умова);
Зверніть увагу, що після заголовка, який розташований вже у кінці оператора, знаходиться крапка з комою, чого в звичайному while не було.