середа, 19 квітня 2017 р.

Урок 1. Ввідний урок. Частина 3

Отже, ми продовжуємо наш урок і зараз ми додамо до нашої програми новий елемент - цикл while. Як і у випадку з if, while також має умови при яких його код буде виконуватися. Вони також вписуються в дужках. Винятком являється те, що цикл виконується повторно до тих пір поки умова буде відповідати істинні, тому він перевіряє умову кожного разу коли починається новий​ повтор і припиняється тільки якщо умова не вірна.

У цьому оновленні ми додамо перемінну стан, яка буде відображати нашу позицію в діалозі. Звичайно додамо сам цикл і всі перевірки на відображення тексту перенесемо в середину циклу.  Розглянемо наскільки змінилася наша програма в блок-схемі.


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

Розглянемо це в коді програми:

using System;
class Example {

static void Main() {

Console.OutputEncoding = System.Text.Encoding.GetEncoding (1251);

string baseText = "Привіт, як справи?";
string menu = "Введіть номер відповіді: ";

string choise1 = " - Добре. ";
string choise2 = " - Погано. ";
string choise3 = " - Пішов ти! ";
string choise4 = " - До побачення. ";

string answer1 = "Це прекрасно! ";
string answer2 = "Співчуваю. ";
string answer3 = "Сам пішов! ";
string answer4 = "Папа. ";

int state = 0;

while (state!=-1) {
Console.Clear ();
if (state == 0) {
Console.WriteLine (baseText);
Console.WriteLine (menu +"1"+ choise1 +"2"+ choise2 +"3"+ choise3 +"4"+ choise4);
string choose = Console.ReadLine ();
int temp=Int32.Parse(choose);
state = temp;
}
else if (state == 1) {
Console.WriteLine (answer1);
Console.WriteLine (menu +"1"+ choise1 +"2"+ choise3 +"3"+ choise4);
string choose = Console.ReadLine ();
int temp=Int32.Parse(choose);
if (temp == 1)
state = 0;
if (temp == 2)
state = 3;
if (temp == 3)
state = 4;
}
else if (state == 2) {
Console.WriteLine (answer2);
Console.WriteLine (menu +"1"+ choise1 +"2"+ choise3 +"3"+ choise4);
string choose = Console.ReadLine ();
int temp=Int32.Parse(choose);
if (temp == 1)
state = 0;
if (temp == 2)
state = 3;
if (temp == 3)
state = 4;
}
else if (state == 3) {
Console.WriteLine (answer3);
state = -1;
}
else if (state == 4) {
Console.WriteLine (answer4);
state = -1;
}

}
}
}


Розглянемо код програми детальніше:
 Як можна побачити, ми додали декілька нових стрічок, які допоможуть нам реалізувати елемент прощання з користувачем. Також одним із нововведень в даному уроці став метод Clear(); який дозволяє очистити вікно консолі від попередніх виводів даних. Ми визиваємо цей метод на початку кожного циклу, що дозволяє нам виводити тільки поточний текст стану не замусорюючи екран консолі.
Наступне на що хочеться звернути вашу увагу, це те яким чином ми  цього разу виводимо меню. Ми вручну номеруємо кожен варіант вибору, так як кожного разу наше меню міняється і відповідно міняється номер конкретного варіанту.
Далі ми очікуємо вводу даних, але особливу увагу хочеться звернути на те, як ми конвертуємо веденні дані в значення перемінної стан. Ми об'явили нову, тимчасову, перемінну в яку одразу ж присвоємо означення, яке повертає метод  Parse();.
ПРИМІТКА: метод Parse(); конвертує текстові дані в цілочисельні. Проте текстові дані повинні містити тільки число у вигляді тексту. У випадку, якщо в стрічці тексту будуть інші дані, метод згенерує помилку і програма призупинити.
Як ви напевно замітили, у цьому блоці, номера варіантів вибору збігаються з номерами станів нашого діалогу, тому ми просто присвоємо значення нашої тимчасової перемінної перемінній стан.
В наступному блоці if, номера варіантів відповідей не збігаються з номерами станів, тому ми перевіряємо, кожне потрібне нам значення, нашої тимчасової перемінної і присвоюємо відповідний до відповіді стан.
При реалізації стану 3 і 4, ми не очікуємо вводу даних, а просто визиваємо стан завершення програми.
Також важливим елементом в реалізації даного алгоритму дій являється конструкція if - else if. В даній конструкції, перевірка умови, кожного наступного блоку if, відбувається тільки у випадку якщо жодна з попередніх умов не являється істиною. Тобто, у нашому випадку нашому випадку, перевірка else if (state == 3), відбудеться тільки у випадку, якщо попередні три перевірки проваляться.
Навіщо нам саме така конструкція? Відповідь проста. На початку програми ми присвоюємо перемінній стан значення 0 і відповідно у циклі заходимо в першу перевірку( if (state == 0)). В цьому блоці користувач робить вибір і ми призначаємо перемінні стан нове значення. Після цього ми одразу ж робимо інші перевірки і у разі якщо значення перемінної стан відповідає одній із умов, а саме так і буде, ми виводимо текст іншого стану вдруге, при цьому не очистивши екран консолі. Таким чином ми виводимо текст двох станів за одне коло циклу, в той час як допоміжний функціонал циклу (у нашому випадку це метод Clear()) виконується тільки раз. Коли ми розробляли алгоритм програми ми очікували, що процес виводу тексту стану і подальшої обробки введених даних, буде відбуватися тільки раз і хоч у нашому випадку це не призвело до великих проблем проте у більш серйозних алгоритмах це могло призвести до набагато серйозніших проблем. Тому ми, ще на етапі проектування алгоритму програми, в блок-схемі, чітко вказали, що нам потрібно, щоб перевірка відбувалася тільки у випадку, якщо попередні перевірки провалились. Це було зображено у вигляді червоних стрілок з підписом "ні".

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

Висловлюйте свою думку щодо даної статті в коментарях, задавайте запитання, діліться ідеями. Також дивіться урок в YouTube і одразу ж підписуйтесь на канал. Діліться моїм блогом зі своїми друзями. Підписуйтесь на мій Твіттер, щоб не пропустити нові уроки та статті. Всім удачі!!!

Немає коментарів:

Дописати коментар