Professional Documents
Culture Documents
Lab 5 Prog Done
Lab 5 Prog Done
Вико
нав студент групи ІР-22
Музика Марк Сергійович
Викладач : к.ф.-м.н., ас. Пономарнеко Роман
Миколайович
Київ – 2021
ЗМІСТ
1. Постановка завдання 3
2. Аналітичні викладки 3
3. UML діаграма класу 4
4. Код програми 5
5. Тестування програми 13
6. Висновок 13
Лабораторна робота №5
Тема: Виняткові ситуації С++.
Мета: вивчити особливості генерації і обробки виняткових ситуацій в С ++.
Етапи виконання завдання:
Розробити покроковий алгоритм вирішення розрахункової частини завдання
і підзадач (при необхідності). Розробити UML діаграму класів. Виконати
програмну реалізацію завдання відповідно до варіанту. Прототипи класів
повинні містяться в окремому * .h- файлі. У програмі обов'язково передбачити
висновок інформації про виконавця роботи (ПІБ), номер варіанта, обраному
рівні складності і завданні. Передбачити можливість повторного запуску
програми (запит про бажання вийти з програми, або продовжити роботу).
Ключові моменти програми обов'язково повинні містити коментарі.
Завдання 1
Аналітичні викладки:
Виняткова ситуація – це незвичайні або несподівані обставини, що
виникають в роботі програми: збої апаратури, помилки введення-
виведення, програмні помилки. Виняткові ситуації призводять до переривання
програми, після чого слід необхідно виявити виняток і обробити його таким
чином, щоб виключити переривання при виконанні програми.
Для обробки виключень використовуються так звані блоки try-catch.
У разі, якщо «викидаються» нетипізовані дані(екземпляри класів, структур і
т.д.), краще «ловити» їх за посиланням. Якщо викидаються дані декількох
типів, то можна використовувати кілька блоків catch, що ловлять кожен
свій тип даних.
Коли порушується виняткова ситуація, програма переглядає стек функцій до
тих пір, поки не знайде відповідний catch. Якщо такий оператор не
знайдений, то виключення обробляється в стандартному обробнику, показуючи
незрозумілі повідомлення та аварійно завершуючипрограму.Блокиtry-
catchможутьміститивкладеніблокиtry-catch, та якщо не буде визначено
відповідного оператора catch на поточному рівні вкладення, виняток буде
спіймано на більш високому рівні. Оператори, що слідують за оператором
throw, ніколи не виконуються.
Будь-яке виключення, що виникло в процесі роботи програми, обов'язково
обробляється, якщо для нього є оператор catch(); якщо ж виняток не знаходить
відповідний catch(), то такий необроблений виняток передається по ланцюжку
виклику функції до тих пір, поки не залишиться нерозглянутих винятків. Якщо
catch() не буде знайдений, то виключення обробляється стандартними
функціями unexpected(), terminate(), abort().
Основне призначення unexpected() – підготувати програму до переривання,
далі викликається функція terminate(), що викликає abort() - ненормальне
завершення програми. Якщо необхідно обробити не специфіковане виключення
без використання стандартної unexpected(), що не допускає втручання, то
виконується перевизначення функцій unexpected() та terminate()за допомогою
функцій set_unexpected() та set_terminate().
UML діаграма класів:
Код програми:
Lab5.cpp:
#include "pch.h"
#include "Fraction.h"
#include "ExceptionHandler.h"
#include <iostream>
#include <string>
#include <ctime>
switch (k) {
case '+': cout << "Бажаєте додати число чи об'єкт типу Fraction: введiть n або f
вiдповiдно" << endl;
break;
case '-': cout << "Бажаєте вiдняти число чи об'єкт типу Fraction: введiть n або f
вiдповiдно" << endl;
break;
case '*': cout << "Бажаєте помножити на число чи на об'єкт типу Fraction: введiть n
або f вiдповiдно" << endl;
break;
case '/': cout << "Бажаєте подiлити на число чи на об'єкт типу Fraction: введiть n
або f вiдповiдно" << endl;
break;
}
cin >> flag;
if (flag == 'n')
{
cout << "Введiть число: ";
cin >> M;
switch (k) {
case '+': fraction = *fraction + M;
break;
case '-': fraction = *fraction - M;
break;
case '*': fraction = *fraction * M;
break;
case '/': fraction = *fraction / M;
break;
}
fraction->print();
}
else
{
cout << "Введiть чисельник: ";
cin >> M;
switch (k) {
case '+': fraction = *fraction + fraction_temp;
break;
case '-': fraction = *fraction - fraction_temp;
break;
case '*': fraction = *fraction * fraction_temp;
break;
case '/': fraction = *fraction / fraction_temp;
break;
}
fraction->print();
delete fraction_temp;
}
}
int main()
{
setlocale(0, "rus");
char p = 'y';
bool key_ex;
int N, M;
int temp_x, temp_y;
int array_size = 4;
while (p == 'y')
{
key_ex = true;
delete fraction;
delete[] fraction_array;
}
return 0;
}
Fraction.h:
#pragma once
class Fraction {
private:
int up; //in instruction it is m
int down; //in instruction it is n
int gcd(int M, int N); //greatest common divisor of fraction up and down
public:
Fraction(void);
Fraction(int M, int N);
Fraction.cpp:
#include "pch.h"
#include "Fraction.h"
#include "ExceptionHandler.h"
#include <iostream>
Fraction* Fraction::operator+(int X)
{
Fraction* temp = new Fraction(this->up, this->down);
temp->up = temp->up + (temp->down * X);
return temp;
}
Fraction* Fraction::operator+(Fraction* X)
{
Fraction* temp = new Fraction(this->up, this->down);
temp->up = (temp->up * X->down) + (X->up * temp->down);
temp->down = temp->down * X->down;
Fraction * Fraction::operator-(int X)
{
Fraction* temp = new Fraction(this->up, this->down);
temp->up = temp->up - (temp->down * X);
return temp;
}
Fraction * Fraction::operator-(Fraction* X)
{
Fraction* temp = new Fraction(this->up, this->down);
temp->up = (temp->up * X->down) - (X->up * temp->down);
temp->down = temp->down * X->down;
return temp;
}
Fraction * Fraction::operator*(int X)
{
Fraction* temp = new Fraction(this->up, this->down);
temp->up = temp->up * X;
return temp;
}
Fraction * Fraction::operator*(Fraction* X)
{
Fraction* temp = new Fraction(this->up, this->down);
temp->up = temp->up * X->up;
temp->down = temp->down * X->down;
return temp;
}
Fraction * Fraction::operator/(int X)
{
Fraction* temp = new Fraction(this->up, this->down);
if (X == 0)
throw ExceptionHandler(X, '/');
else
{
temp->down = temp->down * X;
return temp;
}
}
Fraction * Fraction::operator/(Fraction* X)
{
Fraction* temp = new Fraction(this->up, this->down);
if (X->up == 0)
throw ExceptionHandler(X->up, X->down, '/', 'f');
else
{
temp->up = temp->up * X->down;
temp->down = temp->down * X->up;
void Fraction::setUp(int X)
{
up = X;
}
void Fraction::setDown(int X)
{
if (X == 0)
throw ExceptionHandler(up, X, 'c', 'c');
else
down = X;
}
ExceptionHandler.h:
#pragma once
class ExceptionHandler {
private:
int up;
int down;
char symbol;
char type;
ExceptionHandler.cpp:
#include "pch.h"
#include "ExceptionHandler.h"
#include <iostream>
using namespace std;