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




Приклад розробки програми обчислення математичного виразу з перехопленням можливих виключних ситуацій

У даній темі продемонстровано застосування C++ – підсистеми обробки виключних ситуацій, які можуть виникати при обчисленні виразів. Наведено приклад використання інструкцій try … throw … catch у програмі.

 

Умова задачі

Розробити додаток на мові C++ за шаблоном Windows Forms Application, який розв’язує задачу обчислення виразу.

При обчисленні виразу здійснити перехоплення критичної (виключної) ситуації з допомогою блоку try … catch. Здійснити генерування повідомлення про критичну ситуацію інструкцією throw.

Скласти програму, яка при заданих значеннях х та y знаходить значення виразу:

 

Виконання

1. Створення проекту.

Завантажити MS Visual Studio. Створити проект за шаблоном Windows Forms Application. Більш детально створення нового проекту описується тут.

Створюється додаток за шаблоном Visual C++ – Windows Forms Application.

 

2. Розміщення елементів управління (компонент) на формі

Використовуючи панель Toolbox розмістити на формі такі елементи управління:

  • два елементи управління типу Label для виведення інформаційних повідомлень “x = ” та “y = ” (рисунок 1). Автоматично створюються об’єкти (змінні) з іменами label1 та label2;
  • два елементи управління типу TextBox (рисунок 2). Створюється два об’єкти (змінні) з іменами textBox1, textBox2;
  • один елемент управління типу Button (рисунок 3). Створюється об’єкт з іменем button1;
  • один елемент управління типу Label для виведення результату обчислення. Створюється об’єкт з іменем label3 (рисунок 4).

 

Рисунок 1. Елемент управління типу Label

 

Рисунок 2. Розміщення елементів управління типу TextBox

 

Рисунок 3. Розміщення елементу управління типу Button

 

Рисунок 4. Форма програми після розміщення елементів управління

 

3. Налаштування властивостей елементів управління

Приклад налаштування властивостей елементів управління описується тут. Налаштування властивостей здійснюється у вікні Properties (рисунок 5). У верхній частині вікна вказується об’єкт, який є активним (наприклад label1). Для цього об’єкту можна налаштовувати властивості. Щоб активувати об’єкт є два способи:

  • вибрати об’єкт зі спадного списку у вікні Properties;
  • виділити об’єкт на головній формі програми.

 

Рисунок 5. Вікно Properties

Згідно з умовою задачі потрібно налаштувати такі властивості елементів управління:

  • в елементі управління label1 властивість Text = “x = ” (рисунок 6);
  • в елементі управління label2 властивість Text = “y =“;
  • в елементі управління button1 властивість Text = “Обчислити“;
  • в елементі управління label3 властивість Text = “Результат = “;
  • в елементі управління Form1 (головна форма) властивість Text = “Обчислення виразів”.

 

Рисунок 6. Задавання значення властивості Text в елементі управління label1

Після розміщення та налаштування, форма додатку матиме вигляд як показано на рисунку 7.

Рисунок 7. Форма додатку після обчислення та налаштування

 

4. Програмування обробника події кліку на кнопці “Обчислити

Останнім кроком є виконання обчислень, яке здійснюється кліком на кнопці “Обчислити“. У цьому випадку програмується подія Click елементу управління Button.

Більш детально про програмування події кліку на кнопці описується тут.

Після програмування події буде отримано метод – обробник події button1_Click():

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{

}

У цьому коді між дужками { } потрібно ввести власний код розрахунку.






Після вводу коду розрахунку обробник події button1_Click() матиме наступний вигляд:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    double x, y;
    double res;

    // в блок try поміщається код, який потрібно перехватити
    try
    {
        // перевірка на пустий ввід
        // генерується виключення з текстом типу char *
        if ((textBox1->Text == "")&&(textBox2->Text == ""))
            throw "не введено значень x та y";
        if (textBox1->Text == "") throw "не введено значення x"; // тип char *
        if (textBox2->Text == "") throw "не введено значення y";

        // отримати значення з textBox1 та textBox2
        x = System::Double::Parse(this->textBox1->Text);
        y = y.Parse(this->textBox2->Text);

        if ((x-y)<0) throw 1; // виключення №1 - корінь з від'ємного числа
        if (y == 0) throw 2; // виключення №2 - ділення на нуль
            res = (double)Math::Sqrt(x-y)/(double)y;

        // якщо все добре, то вивід результату
        label3->Text = "Результат: " + res.ToString();
    }
    catch (int t) // обробник виключення типу int
    {
        // перехоплення, якщо виникла виключна ситуація
        if (t==1)
            label3->Text = "Помилка! Корінь з від'ємного числа.";
        if (t==2)
            label3->Text = "Помилка! Ділення на нуль";
    }
    catch (char * s) // обробник виключення типу char *
    {
        // перетворення з типу char * в тип String
        String ^ss = gcnew String(s);
        label3->Text = ss;
    }
}

Пояснимо деякі фрагменти коду.

У блок try поміщається програмний код, який потрібно проконтролювати. У нашому випадку це:

  • ввід пустих значень в елементах управління textBox1 та textBox2;
  • підкореневий вираз який може прийняти від’ємне значення. Оскільки корінь квадратний з від’ємного значення не існує, то може виникнути виключна ситуація;
  • знаменник, який може прийняти нульове значення. Як відомо, ділення на нуль викликає переповнення.

Інструкція throw генерує виключення, яке перехоплюється catch-інструкцією.

Інструкція throw містить інформацію про виключну ситуацію. Ця інформація може бути різних типів і оброблятись в блоках catch, які йдуть після блоку try.

З метою кращої демонстрації, у програмі генеруються чотири виключення з допомогою інструкції throw:

  • два виключення типу char* у вигляді повідомлення про помилку;
  • два виключення типу int у вигляді цілочисельного коду.

Використання системи обробки виключень try … catch дає програмісту компактний код обробки виключних ситуацій.

 

5. Запуск програми на виконання.

Після цього можна запускати програму на виконання та тестувати її роботу.