Professional Documents
Culture Documents
P
P
Завдання...........................................................................................................................3
Вступ................................................................................................................................4
Діаграми класів...............................................................................................................6
Опис програми................................................................................................................8
Інструкція користувача..................................................................................................9
Контрольний приклад...................................................................................................10
Висновок........................................................................................................................11
Література......................................................................................................................12
Додаток А
2
Завдання
3
Вступ
4
властивостей іншого. При цьому підтримується концепція ієрархічної
класифікації. Без використання успадкування кожний об’єкт повинен явно
визначати всі свої характеристики; використовуючи наслідування, об’єкт повинен
визначати тільки ті якості, які роблять його унікальним в межах свого класу.
Визначення нового класу може базуватись на визначенні вже існуючого. В такому
випадку, новий клас отримає властивості та поведінку базового класу, та
доповнить їх своїми власними. У випадку одиничного успадкування, у кожного
класу може бути лише один безпосередній базовий клас. У випадку множинного
успадкування, дозволяється існування декількох безпосередніх надкласів.
Застосування методів успадкування дозволяє покращити повторне використання
коду шляхом використання вже визначених властивостей та методів (поведінки)
базових класів.
Разом з інкапсуляцією і успадкуванням поліморфізм також являє собою одну
із важливих концепцій ООП. Застосування цієї концепції дозволяє значно
полегшити розробку складних програм.
Термін поліморфізм має грецьке походження і означає «наявність багатьох
форм». З поліморфізмом тісно пов’язані такі поняття, як абстрактні класи,
віртуальні методи, перевантаження методів і властивостей.
5
Діаграми класів
Для даного завдання було створено чотири класи. Даний розділ розглядає
будову кожного класу, а також вказує зв’язки між ними.
6
Array – клас-контейнер, який містить масив об’єктів Number. Він містить два
поля: вказівник на початок масиву і його статичний розмір. Розмір масиву
задається при створенні екземпляру даного класу і не може змінюватись. Для того
щоб запобігти виникненню помилок пов’язаних з виходом за межі масиву,
перевантажений оператор [] перевіряє коректність індекса.
7
Опис програми
8
Інструкція користувача
9
Контрольний приклад
10
Висновок
11
Література
12
Додаток А
String.h
/* Цей клас працює за допомогою вказівника char, створюючи зручний для користувача
тип рядка */
#pragma once
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <iostream>
class String
{
protected:
char* str;
unsigned length;
public:
// конструктори і деструктор
String(void);
String(char*);
String(const String&);
virtual ~String(void);
unsigned getlen(); // отримати довжину рядка
// перевантаження основного оператора
String& operator = (const String&); // призначити об'єкт класу
String& operator = (const char*); // призначити константний
літерал
virtual String operator + (String&); // конкат з об'єктом класу
String operator + (const char*); // конкат з константним
літералом
String operator - (const char*); // видалити підрядок
bool operator * (const char*); // перевірка наявного
підрядка
friend ostream& operator << (ostream&, String&); // вихідний потік
friend istream& operator >> (istream&, String&); // вхідний потік
};
String.cpp
#include "String.h"
String::String(void)
{
str = NULL;
length = 0;
}
String::String(char* str)
{
unsigned size = strlen(str) + 1;
String::~String(void)
{
if (str)
{
delete[] str;
str = NULL;
}
}
unsigned String::getlen()
{
return this->length;
}
return *this;
}
memcpy(this->str, s, size);
this->length = size - 1;
return *this;
}
tmp.length = size - 2;
if (this->str)
{
strcpy(tmp.str, this->str);
strcat(tmp.str, s.str);
}
else
strcpy(tmp.str, s.str);
return tmp;
}
tmp.length = size - 2;
if (this->str)
{
strcpy(tmp.str, this->str);
strcat(tmp.str, s);
}
else
strcpy(tmp.str, s);
return tmp;
}
delete[] this->str;
return *this;
}
stream.getline(buf, sizeof(buf));
return stream;
}
Number.h
/* This class represents a long number which is
represented as a string which gives the ability
to store numbers greater than any built-in type */
#pragma once
#include "String.h"
public:
// constructors and destructor
Number(void);
Number(char*);
Number(const Number&);
~Number(void);
Number.cpp
#include "Number.h"
Number::Number(void){}
Number::~Number(void){}
void Number::balance()
{
// find out if there are insignificant symbols
if ((str[0] <= '0' || str[0] > '9') && length > 1)
{
int i;
for (i = 1; i < length-1; i++) // find where they end
if (str[i] != '0')
break;
char tmp[256];
memcpy(tmp, str+i, length+1-i);
delete[] str;
length = strlen(tmp);
str = new char[length+1];
if (tmp.str[k] > 9)
tmp.str[k] = (tmp.str[k] % 10);
tmp.str[k] = '\0';
tmp.length = k;
// reverse string
for (int q = 0; q < (tmp.length)/2; q++)
{
tmp.str[q] += tmp.str[tmp.length-1-q];
tmp.str[tmp.length-1-q] = tmp.str[q] - tmp.str[tmp.length-1-q];
tmp.str[q] -= tmp.str[tmp.length-1-q];
}
tmp.balance();
return tmp;
}
if (*this < n)
return "0";
else if (j < 0)
{
// check if need to borrow
if (this->str[i] < '0' || this->str[i] < n.str[j])
{
this->str[i] += 10;
this->str[i-1] -= 1;
}
else
{
// check if need to borrow
if (this->str[i] < '0' || this->str[i] < n.str[j])
{
this->str[i] += 10;
this->str[i-1] -= 1;
}
tmp.str[k] = '\0';
tmp.length = k;
// reverse string
for (int q = 0; q < (tmp.length)/2; q++)
{
tmp.str[q] += tmp.str[tmp.length-1-q];
tmp.str[tmp.length-1-q] = tmp.str[q] - tmp.str[tmp.length-1-q];
tmp.str[q] -= tmp.str[tmp.length-1-q];
}
tmp.balance();
return tmp;
}
if (x == 0)
return (*this - *this);
if (x < 0)
return *this;
return tmp;
}
if (x == ZERO)
{
cout << "Error: Division by zero!" << endl;
getchar();
exit(-1);
}
return res;
}
if (n1.length != n2.length)
return false;
return true;
}
return false;
}
return false;
}
stream.getline(buf, sizeof(buf));
n.balance();
return stream;
}
Array.h
/* This class represents an array of objects
of type Number whith a field that holds the
coresponding size of the array */
#pragma once
#include "Number.h"
#include <cstring>
class Array
{
private:
Number* arr; // pointer to array
public:
unsigned size; // array size
Array.cpp
#include "Array.h"
Array::Array(void)
{
this->size = 1;
Array::Array(unsigned size)
{
this->size = size;
Array::~Array(void)
{
if (arr)
{
delete[] arr;
arr = NULL;
}
}
return *this;
}
return arr[i];
}
Iterator.h
/* This class represent an iterator which
will go through the Array container */
#pragma once
#include "Number.h"
#include "Array.h"
#include <iostream>
#include <cstring>
class Iterator
{
//private:
private:
Array* iter; // pointer to container
Number* ptr_begin; // pointer to beginning
Number* ptr_end; // pointer to end
Number* ptr_cur; // pointer to current
public:
Iterator(void);
explicit Iterator(Array&);
Iterator(const Iterator&);
~Iterator(void);
Iterator.cpp
#include "Iterator.h"
Iterator::Iterator(void)
{
this->iter = NULL;
this->ptr_begin = NULL;
this->ptr_end = NULL;
this->ptr_cur = NULL;
}
Iterator::Iterator(Array& a)
{
this->iter = &a;
this->ptr_begin = a.arr;
this->ptr_end = a.arr + a.size - 1;
this->ptr_cur = a.arr;
}
Iterator::~Iterator(void)
{
if (iter)
{
delete iter;
delete ptr_begin;
delete ptr_end;
delete ptr_cur;
iter = NULL;
ptr_begin = NULL;
ptr_end = NULL;
ptr_cur = NULL;
}
}
Number* Iterator::begin()
{
return ptr_begin;
}
Number* Iterator::end()
{
return ptr_end;
}
Number* Iterator::cur()
{
return ptr_cur;
}
this->iter = &a;
this->ptr_begin = a.arr;
this->ptr_end = a.arr + a.size - 1;
this->ptr_cur = a.arr;
return *this;
}
this->iter = i.iter;
this->ptr_begin = i.ptr_begin;
this->ptr_end = i.ptr_end;
this->ptr_cur = i.ptr_cur;
return *this;
}
void Iterator::operator ++ ()
{
if (ptr_cur == ptr_end)
return;
ptr_cur++;
}
void Iterator::operator -- ()
{
if (ptr_cur == ptr_begin)
return;
ptr_cur--;
}
main.cpp
#include <iostream>
#include "Number.h"
#include "Array.h"
#include "Iterator.h"
int main()
{
Array a(5);
Number num;
Iterator iter;
iter = a;