Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод указ к лабораторным работам ООП 3 семест...doc
Скачиваний:
5
Добавлен:
13.11.2019
Размер:
22.34 Mб
Скачать

9.2. Приклад програми Умова задачі 9

Піднести будь-яке число до будь-якого степеня. Передбачити аналіз таких виключних ситуацій: від’ємне число у дробовому степені, нуль у від’ємному степені. При виникненні виключення програма повторює запит на введення даних і продовжує роботу. Програма закінчує роботу, якщо не виникає виключення.

Алгоритм задачі 9

  1. Повторювати дії, доки не отримано правильного результату

    1. Увести число і його степінь.

    2. Якщо число >0, то піднести число до введеного степеня.

    3. Якщо число <0, то виконати такі дії:

      1. Виділити цілу і дробову частини степеня.

      2. Якщо дробова частина степеня дорівнює 0 і його ціла частина непарна, тоді піднести число до степеня та отримати від’ємний результат;

      3. Інакше отримати додатний результат піднесення числа до степеня;

      4. Якщо степінь дробовий і число від’ємне, то формувати виключення;

      5. Якщо число і степінь дорівнюють 0, тоді результат дорівнює 1;

      6. Якщо степінь <1, то формувати виключення:

  • опрацювати виключення заданого типу:

  • відобразити повідомлення про помилку;

  • передати виключення його обробнику в точку виклику виключення;

  • якщо виключення нетипізоване, то вивести повідомлення про повторення обчислень;

  1. Кінець циклу.

Текст програми 9

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ інтерфейсу класу /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

/////////////////////////////////файл lab12.h – заголовний файл ///////////////////////////////////////////////

class Error // клас генерування виключень

{ double b; //число, яке підноситься до степеня

double e; //степінь public :

//конструктор ініціалізації об’єкта виключення

Error(double bb, double ee) : b(bb), e(ee) { }

void Report(); // звіт про виключні ситуації

};

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ реалізація класу та тестова програма \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

///////////////////////////////////////файл lаb12.cpp – вихідний файл /////////////////////////////////////////

#include <iostream.h>

#include <math.h>

#include “lab12.h”

////////////////////////////////// реалізація класу виключення /////////////////////////////////////////////////////

void Error::Report() //виведення повідомлень про причину виключення

{ cout << "Domain error:"

<< " base:" << b << " exponent:" << e << endl

<< "Press Enter to continue...";

char c; cin.get(c); //чекання натиску клавіші

}

//////////////// піднесення числа до степеня, генерація виключних ситуацій //////////////////////

double Power(double b, double e) throw(Error)

{ if (b > 0.0) return exp(e * log(b));

if (b < 0.0) //число від’ємне

{ double ipart; //ціла частина степеня

double fpart = modf(e, &ipart); //виділення цілої і дробової частин степеня

if (fpart == 0) //якщо дробової частини немає

{ if (fmod(ipart, 2) != 0) // перевірка на парність цілої частини

return -exp(e * log(b)); //число від’ємне, степінь цілий непарний

else return exp(e * log(b)); } //число від’ємне степінь цілий парний

else //число від’ємне, степінь дробовий

throw Error(b, e);//формування виключення: будується об’єкт класу error

}

else //об’єкт ініціалізується значенням b, e

{

if (e == 0.0) return 1.0; //степінь=0, результат=1

if (e < 1.0) throw Error(b, e); //степінь дробовий, число=0: виключення

return 0.0; //число = 0, результат = 0

}

}

//////////////////////////////////////////////////// тестова програма /////////////////////////////////////////////////////

int main(){

for( ; ; ) // нескінченний цикл переривається по return 0

{ try

{

try

{ double base, exponent, result;

cout << "base? "; cin >> base;

cout << "exponent? "; cin >> exponent;

result = Power(base, exponent); //генерація виключної ситуації

cout << "result == " << result << endl;

} // try

catch (Error& e) //обробка виключення

{

e.Report(); //виведення повідомлення про помилку

throw e;

} //передати ситуацію в точку виклику

return 0; //якщо не було виключень

} //end of try

catch(...) //обробка нетипізованого виключення

{

cout<<"error, try again"<<endl; }

} // end of for

}