3.5. Перші програми
Тепер, коли ми навчилися оголошувати числові змінні, можемо скласти програму для роботи з такими числами. Раніше ми домовилися, що доки створюватимемо консольні застосування, т. т. застосування без графічного інтерфейсу між користувачем додатка і самим застосуванням. Шаблон такого застосування ми вже створили раніше, і використали його (див. рис. 3.1.). Тепер наповнимо цей шаблон іншим змістом. Розглянемо програму виводу на екран таблиці температур за Фаренгейтом і Цельсієм. Формула переведення температур така:
С = (5/9)*(F-32)
де С - це температура за шкалою Цельсія, а F - за шкалою Фаренгейта. Задається таблиця температур за Фаренгейтом: 0, 20, 40, ..., 300. Вимагається обчислити таблицю за шкалою Цельсія і вивести на екран обидві таблиці. У наведеній вище формулі символ * - знак операції множення. Для цього виконаєте наступні дії:
Створюємо шаблон консольного застосування. Це ви вмієте. Введіть код нової програми у тіло головної функції(лістинг 3.2).
Залишилося тільки модуль запустити "гарячою" клавішею <F5> та отримати результат (рис. 3.2). Але можна і через головне меню викликати додаток на виконання: Debug | Run.
Рис. 3.1. Результат оголошення decimal-змінної без її ініціалізації
Лістинг 3.2.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CelFar
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Таблиця температур за Фаренгейтом і Цельсієм:");
Console.WriteLine("За Фаренгейтом За Цельсієм");
int lower, upper, step;
double fahr, cels;
lower=0;
upper=300;
step=20;
fahr=lower;
while(fahr <= upper)
{
cels=(5.0/9.0)*(fahr-32.0);
Console.WriteLine(" {0:f} {1:f}", fahr, cels);
fahr=fahr+step;
}
Console.Write("Для продовження натисніть будь-яку клавішу>");
Console.Read();
}
}
}
Debug - це відлагоджувач середовища. Без відлагоджувача взагалі дуже важко досягти працездатності програми. Відлагоджувач дозволяє виконувати програму по кроках і дивитися кожного разу вміст потрібних вам змінних. Тобто ви бачите, у змінній те значення, яке повинно бути за вашими розрахунками, або ні. Якщо не те, починаєте знову проходити рядок за рядком і дивитися, як що формується. Коли ви натиснули клавішу <F5>, то запустили додаток на виконання в режимі відлагодження. Щоб змусити додаток зупинитися в потрібній вам точці, ви повинні цю точку позначити: потрібно клацнути мишею в самому лівому стовпчику тексту програми (лівіше номерів рядків програми). При цьому в місці клацання з'явиться темно-червоний кружок, а весь позначений рядок теж підфарбується тим же кольором. Коли ви запустите застосування, воно зупиниться на поміченому рядку. Вам залишається навести курсор миші на потрібну змінну, трохи почекати, поки спливе її значення. Щоб просунутися у виконанні на наступний рядок натисніть клавішу <F10>. Якщо ви стоїте на виклику деякої функції (про що ми поговоримо пізніше), те, натиснувши клавішу <F10>, ви повністю виконаєте функцію. А раптом помилка знаходиться саме в тілі цієї функції? Як заглянути в режимі відлагодження в тіло функції? Для цього потрібно знаходячись на заголовку функції, натиснути не <F10>, а <F11>. Потрапите всередину функції. А усередині вже можна рухатися по рядках, натискаючи клавішу <F10>. Усі ці маніпуляції з "гарячими" клавішами відображені в меню Debug середовища розробки.
Але, зазвичай, успішно компіляція з першого разу проходить рідко. Тому у вікні Errors виводяться видаються помилки компіляції. У рядку вікна вказується номер рядка тексту програми, в якому (у рядку) виявлена помилка. Кожна помилка має свій номер. Перелік помилок компілятора і пояснення до них можна знайти в Інтернеті за адресою http://msdn.microsoft.com/ru-ru/library/ms228296.aspx.
Приступимо до розбору нашої першої програми(див. лістинг 3.2).
Перші два рядки головної функції - це системна консольна функція WriteLine(), про яку ми говорили раніше. Вона виводить повідомлення на консольний пристрій виведення, переводячи курсор консольного вікна на наступний рядок у першу позицію. Чому сказано "виводить повідомлення на консольний пристрій виведення", а не просто виводить на екран? Справа у тому, що виконуване середовище за замовчуванням призначає клавіатуру та екран як стандартні (консольні) пристрої вводу-виводу. Коли ви виконуєте функцію Console.Read(), наприклад, то в середовищі закладено вже що читання піде саме з клавіатури. А коли виконуєте, наприклад, Console.WriteLine(), то в середовищі закладено вже, що виведення піде саме на екран, на стандартний пристрій виведення.
Продовжимо вивчення програми. Рядки
int lower, upper, step;
double fahr, cels;
оголошують змінні, з якими належить працювати програмі. Іменувати змінні потрібно так, щоб було (і не лише вам одному, але і, можливому, супроводжуючому в майбутньому вашу програму) зрозуміло, які дані міститимуться в цих змінних. У програмі задані типом int нижня і верхня межі зміни температури за Фаренгейтом і крок зміни температури. Зверніть увагу, що одним типом оголошені декілька змінних через кому. Оголошення повинно обов'язково завершуватися крапкою з комою (і не лише оголошення, якщо уважно подивитесь на програму). По крапці з комою компілятор знаходить кінець мовного речення і починає його розшифровувати. Якщо ви поставите крапку з комою не в тому місці або взагалі не поставите, компілятор все одно стане її шукати та об'єднувати в одне мовне речення все, що зустрічає по дорозі. Потім візьметься за розшифрування і побачить, що перед ним повна абракадабра. Видасть вам кучу помилок.
У змінних fahr, cels знаходитимуться поточні (отримувані під час розрахунку) значення температури за Фаренгейтом і за Цельсієм. Відмітимо, що вони задані одним із типів з плаваючою точкою. Чому не float? Якби ми їх оголосили як float, то ось що б вийшло при компіляції: нижче, на ділянці розрахунку температури за Цельсієм в розрахунку беруть участь дві константи(5 і 9 з нульовою дробовою частиною). Ці числа спеціально узяті у вигляді запису з нульовою дробовою частиною, тому що вони беруть участь в операції ділення /. А ця операція має свою специфіку: якщо її операнди оголошені як цілий тип, то ділення цілих чисел вважається операцією без залишку. Тому в цьому випадку ділення 5:9 дасть в результаті нуль, бо ціла частина цієї частки дорівнює нулю (а вона і вважається результатом операції над цілими числами), а дробова частина буде відкинута. А нам-то треба правильне значення. Тому ми як би обманюємо компілятор: робимо у кожного числа нульову дробову частину, не змінюючи тим самим значення числа а компілятор, коли побачить точку, порахує це число за число з плаваючою крапкою. Але тип він присвоїть константам не float, а double. Так у ньому закладено. Але за формулою розрахунку (пам'ятаємо, що ми припустили, що змінні fahr і cels оголошені типом float) із fahr (типу float) віднімається константа 32.0 (типу double - раніше вже відмічалося, що компілятор константам з плаваючою крапкою за замовчуванням присвоює тип double). Виходить, що компілятор повинен побудувати блок перетворення результату типу float в результат типу double. Він цього робити не уміє і виводить помилку компіляції.
Далі призначаються початкові значення нижніми і верхніми межам діапазону температур за Фаренгейтом і кроку зміни цієї температури у заданому інтервалі. За цим всім йде так званий оператор циклу з ім'ям while і тілом, обмеженим фігурними дужками. У самому тілі знаходяться оператори розрахунку, які повинні виконуватися стільки разів, скільки їм задасть оператор while. А ми вже самі повинні задати операторові while, скільки разів йому прокручувати своє тіло. Прокручувати він буде до тих пір, поки в його заголовку (вираз у дужках, що йдуть за словом while) виконуватиметься задана там умова. Умова має вигляд: fahr <= upper. Тобто, поки значення температури за Фаренгейтом не перевершить верхньої межі інтервалу своєї зміни, while виконуватиме оператори у своєму тілі. Який висновок? Напевно, потрібно постійно міняти вміст змінної fahr на заданий крок, щоб переходити до нових точок інтервалу. Тому перед while стоїть оператор fahr = lower;. Він пересилає (= - це не знак рівності, а знак присвоєння) значення нижньої межі зміни температури за Фаренгейтом у змінну fahr. Вже потім починає крутитися цикл while: обчислюється значення змінної cels за заданою формулою, значення за Фаренгейтом і за Цельсієм виводяться у плаваючому форматі (т. т. з крапкою) на екран, береться наступна точка інтервалу зміни температур шляхом додавання до значення fahr величини кроку згідно таблиці температур, і управління передається в заголовок оператора while. У заголовку перевіряється, чи не перевершило поточне значення fahr верхньої межі upper. Якщо не перевершило, управління передається знову на виконання тіла while. Якщо верхня межа перевершена (до речі, fahr називається змінною циклу. кажуть, що цикл організований по змінній fahr), управління виконанням програми передається на рядок, що слідує за тіла while. А цей рядок містить оператор виведення повідомлення, щоб натиснули будь-яку клавішу, тому що наступний оператор - оператор затримки екрану: оператор чекає, поки не буде введений будь-який символ з клавіатури. Це питання ми вже обговорювали. Як тільки ви натиснете будь-яку клавішу, оператор завершить виконання, а далі 0 - кінець програми.
Залишилося звернути увагу на засіб виведення рядка на екран. Ось такий запис цього засобу
Console.WriteLine("{0: f} {1: f}",fahr, cels);
означає так зване форматне виведення рядка. Функція WriteLine(), яка береться із середовища Console, видає на екран вміст змінних fahr і cels не просто так, як вони знаходяться в пам’яті, а перетворюючи (форматуючи) їх в певний вигляд.
При цьому вираз
"{0: f} {1: f}"
- це рядок форматування, значення якого поміщене в лапки. Елементи у фігурних дужках, в яких ми бачимо 0 та 1, означають порядкові номери змінних, що виводяться на екран, які розташовані слідом за рядком форматування після коми. Тобто в даному випадку (рахунок змінних йде від нуля) першою стане виводитися значення змінної fahr, за нею - значення cels. Можна було б вивести спочатку cels, а за нею fahr, помінявши 0 на 1, а 1 на 0. Після покажчиків порядку виведення вмісту змінних через двокрапку вказаний формат значень, що виводяться. У даному випадку це f - формат виведення числа з плаваючою крапкою. Усі символи, які знаходяться в рядку форматування і не поміщені у фігурні дужки, виводяться без форматування. Тому в програмі простір між форматами заповнено пропусками з метою рознести при виведенні на екран результати: щоб вони потрапили у свої колонки. Результат роботи додатка показаний на рис. 3.2.
Рис. 3.2. Результат розрахунку температур за Фаренгейтом і Цельсієм