Математика и Информатика

2019/5, стр. 527 - 543

ДЪЛБОКО КОПИЕ В C++ И JAVA

Христина Костадинова
E-mail: hkostadinova@nbu.bg
Department of Computer Science
New Bulgarian University
21, Montevideo Blvd.
1618 Sofia, Bulgaria
Марияна Райкова
E-mail: mraykova@nbu.bg
Department of Computer Science
New Bulgarian University
21, Montevideo Blvd.
1618 Sofia, Bulgaria

Резюме: В статията се разглежда темата за програмната реализация на начините за копиране на обекти при разработване на софтуерни приложения. Акцентът е поставен върху проблема с т.нар. плитко копие (shallow copy) – ситуация, в която оригиналният обект и обектът копие използват общи ресурси, и страничните ефекти, които възникват вследствие на плитко копие. Описани са предимствата и недостатъците на различните подходи за реализиране на дълбоко копие в двата най-често използвани в обучението програмни езика: C++ и Java. Резултатите от прилагане на плитко копие и начините за реализация на дълбоко копие са представени чрез примери на двата езика.

Ключови думи: плитко копие ; дълбоко копие; ООП; C++; Java

1. Какво е плитко и дълбоко копие?

При реализиране на софтуерни проекти, в които се използва обектно ориентирано програмиране (ООП), в много случаи е необходимо да се използват стойностите на член-данните на един обект за създаване на друг обект. Така създаваме т. нар. обект копие, като използваме оригиналния обект. При такава ситуация трябва да се подхожда много внимателно, защото има риск от непредвидени резултати за стойностите на член-данните и на двата обекта.

Обектите могат да се копират чрез реализиране на: плитко копие (shallow copy) или дълбоко копие (deep copy).

Плитко копие се създава, когато обектът копие и оригиналният обект споделят едни и същи ресурси в паметта. Можем да получим плитко копие при използване на оператора за присвояване между обекти, подаване на обект като параметър на функция, присвояване в различни области на видимост и др. В такъв случай се стига до ситуация, в която промяната на обекта копие се отразява и на оригиналния обект. Това е в разрез с добрите принципи на програмиране и застрашава правилното изпълнение на програмата, често води до авариране на програмите по време на изпълнение и е много трудно за проследяване и коригиране. На фигура 1 е показана схемата на достъп до ресурсите на оригиналния обект и обекта копие при плитко и дълбоко копие.

Фигура 1. Плитко и дълбоко копие

Ще покажем проблемите, които възникват при използване на плитко копие, и различните подходи за реализиране на дълбоко копиe. Ще обърнем внимание на предимствата и недостатъците на тези подходи и случаите, в които всеки от тях трябва да се използва. За тази цел ще поставим и решим следната задача.

Задача. Да се напише програма на C++ и Java, която реализира клас училище, характеризиращо се с: име, брой класни стаи и директор. Директорът на училището е клас, който се описва чрез името си.

Ще използваме решението на поставената задача за демонстрация на ситуация, в която обект от клас „Училище“ служи за създаване на нов обект от клас „Училище“ със същите стойности на член-данните. Решенията са само демонстрационни и показват тези части от кода, които се отнасят до копирането на обектите.

2. Реализация на дълбоко копие в С++

Проблемите при плитко и дълбоко копие в езика С++ възникват, когато директно работим в паметта и боравим с нейното заделяне и освобождаване (т. нар. heap памет). Имаме нужда от реализиране на дълбоко копие, когато член-данна на класа е указател, или т.нар. динамична променлива, разположена в heap паметта. Най-често използваният пример за онагледяване на нуждата от дълбоко копие е в случаите, когато член-данна на класа е динамичен масив (Meyers, 2017). Дълбоко копие е необходимо в следните ситуации:

1. създаване на обект чрез друг обект;

2. присвояване на един обект на друг обект;

3. подаване на обект по стойност като параметър на функция;

4. създаване (присвояване) на обект в различни области на видимост от оригиналния обект.

За решение на поставената задача създаваме клас „Училище“ с допълнителна член-данна: динамичен масив от учители, които преподават в училището.

class Teacher{
private:
std::string name;
std::string subject;
public:
//контруктори, деструктор, get и set член-функции
};
class Principal{
private:
std::string name;
public:
//контруктори, деструктор, get и set член-функции
};
class School {
private:
std::string name;
int number Of Teachers;
Principal principal;
Teacher * teachers;
public:
//контруктори, деструктор, get и set член-функции

};
//предефиниране на вмъкване в изходен поток на текстовото
съдържание на обекти от класовете
std::ostream&operator<<(std::ostream&, const Teacher&);
std::ostream&operator<<(std::ostream&, const Principal&);
std::ostream&operator<<(std::ostream&, const School&);

Листинг 1. Реализация на клас „Училище“ в С++

Ще разгледаме реализацията на дълбоко копие в С++, като опишем два основни подхода:

1. конструктор за копиране и предефиниране на оператор за присвояване;

2. клониране на обекти.

Конструктор за копиране и предефиниране на оператор за присвояване в С++

Един от най-разпространените подходи за осигуряване на дълбоко копие в C++ е използване на конструктор за копиране. В източниците за изучаване на езика е посочено, че за осигуряване на дълбоко копие е необходимо да се реализират конструктор за копиране, деструктор и да се предефинира операторът за присвояване (Todorova, 2011), (Meyers, 2017). В листинг 2 е демонстрирана реализацията на копиращ конструктор. Специфичното за езика е, че ако имаме обекти, разположени в heap паметта, е необходимо поелементно копиране на всички данни от тази памет за новия обект с цел избягване на ситуация споделени ресурси (фигура 2).

class School {
public:
// конструктори get и set функции

//копиращ конструктор
School(const School & original){
name = original.name;
numberOfTeachers = original.numberOfTeachers;
principal = original.principal;
teachers = new Teacher[numberOfTeachers];
for (intindex = 0; index<numberOfTeachers; index++) {
teachers[index] = original.teachers[index];
...}
......}
......//деструктор
....~School(){
if(teachers!=nullptr) delete[] teachers;
teachers = nullptr;
....}
private:
....//член-данни на класа
};
int main()
{
Principal principal(„Иванов“);
Teacher * teachers = new Teacher[2];
teachers[0] = Teacher(„Димитрова“);
teachers[1] = Teacher(„Христов“);
School originalSchool(„Георгиев“, principal, 2, teachers);
....//автоматично извикване на копиращ конструктор, ако има
дефиниран такъв
....//или извършване на побитово плитко копие, ако не е
дефиниран копиращ конструктор
School copySchool = originalSchool;
//явно извикване на копиращ конструктор
School secondCopySchool(originalSchool);
if(teachers!=nullptr) delete[] teachers;
teachers = nullptr;

}

Листинг 2. Копиращ конструктор в С++

В класове, които имат член-данни външни ресурси (динамични обекти, масиви и др.), трябва да се извърши копиране на отделните елементи от оригиналния обект в тялото на копиращия конструктор. В листинг 2 е демонстрирано как се копират данни за масива с учители на даденото училище: необходимо е елемент по елемент от единия масив да бъдат копирани стойностите в масива на новия обект.

Фигура 2. Споделени ресурси между различни обекти в С++

Проблем със споделените ресурси настъпва при следните събития.

1. Промяна на данните за учители в някой от двата обекта би довела до промяна на учителите и в двете училища.

2. Излизане от област на видимост на един от обектите и извикване на неговия деструктор ще доведе до изтриване на учителите за двете училища (листинг 3).

3. Подаване на обект по стойност като параметър на функция (void someFunction(School param) в листинг 3) – след изпълнението на функцията нейната стекова рамка се освобождава и от стек паметта се „изтриват“ всички асоциирани с функцията данни заедно с копирания обект.

Фигура 3. Изтриване на споделени ресурси и странични ефекти в С++

За да се избегне копиране на обекти въобще при подаването им като параметри на функции, подаваме обектите не по стойност, а по адрес или като псевдоними. Така спестяваме ресурси (памет), тъй като за обекта в стековата рамка на функцията ще е необходимо само съхранение на адреса му. Вместо да декларираме функцията така: void someFunction(School param);, я декларираме void someFunction(constSchool& param).

void someFunction(School param){
cout << param;
}
int main()
{
Principal principal(„Иванов“);

Teacher * teachers = new Teacher[2];

teachers[0] = Teacher(„Димитрова“);
teachers[1] = Teacher(„Христов“);
School originalSchool(„Георгиев“, principal, 2, teachers);
{
School copySchool = originalSchool;
cout << copySchool;
//деструктуриране на обект copySchool и освобождаване
на паметта за неговия масив teachers
}
//при опит да се достъпи обекта, ако не сме имали
копиращ конструктор, програмата
//ще аварира по време на изпълнение, тъй като целостта
на обекта е нарушена
//при наличие на коректен копиращ конструктор, този
проблем не съществува
cout <<originalSchool;
some Function(originalSchool);
if(teachers!=nullptr) delete[] teachers;
teachers = nullptr;
}

Листинг 3. Напускане област на видимост след копиране на обект в С++ Предефиниране на оператор за присвояване в С++

Копиращият конструктор и операторът за присвояване се прилагат в различни ситуации. Ако при декларирането на обект използваме оператора равно, то ще се приложи по-горе разгледаният копиращ конструктор, а не присвояване. Например:

Stchool copySchool= originalSchool;

Операторът за присвояване се прилага, когато са декларирани два обекта и се извършва присвояване между тях. Например:

Stchool originalSchool;
Stchool copySchool;
copySchool= originalSchool;

Предефинираме оператора за присвояване, за да задължим компилатора да извършва дълбоко копиране на обекта. В С++ е позволено предефиниране на оператори, включително = и << ( в листинг 1 е показано предефинирането на оператор <<).

School & operator =(const School & original){
if(this!=&original){
name = original.name;
numberOfTeachers = original.numberOfTeachers;
principal = original.principal;
if(teachers!=nullptr) delete[] teachers;
teachers = new Teacher[numberOfTeachers];
for (int index = 0; index<numberOfTeachers; index++) {
teachers[index] = original.teachers[index];
}
}
return *this;
}

Листинг 4. Предефиниране на оператор = в С++

Клониране на обекти в С++

Клонирането на обекти в С++ се извършва при използване на наследяване, при което в дадена член-функция, която се предефинира (override) в наследяващия клас, се създава копие на обекта чрез указател към неговия базов тип. Клониращата членфункция се използва, когато не е предварително ясно от какъв тип ще бъде обектът, който ще се създава. Поради спецификата на езика С++ тук трябва изрично да се декларират член-функциите като виртуални, за да се реализира полиморфизъм. Клонирането на обектите се извършва от специално създадена член-функция, която се обръща към конструктора (Meyers, 2017). Разширяваме още веднъж примера за клас „Училище“, като създаваме един нов базов клас BaseSchool, в който са декларирани член-функция за клониране и виртуален деструктор (задължителен при реализиране на полиморфно поведение и йерархии от класове).

class BaseSchool {
public:
virtual BaseSchool* clone() const = 0;
virtual ~BaseSchool() = default;
};
class School : public BaseSchool {
School* clone() const {
return new School(*this);
}
}
int main() {

School* school = new School(„Христо Ботев“, 2, principal,
teachers);
School* schoolCopy = school->clone();

}

Листинг 5. Клониране на обекти в С++

Удачно е класът „Училище“ да съдържа реализация на член-функцията за клониране, което означава, че той извършва процеса на създаване на дълбокото копие на обекта.

3. Реализация на дълбоко копие в Java

Обикновено обектът-копие в Java се създава чрез използване на конструктора на класа и предаване на стойностите на член-данните на оригиналния обект. Това означава, че ако в нашия клас „Училище“ има членданни, които са изменяеми (обект от клас „Директор“ (Principal)), те ще се използват едновременно от обекта копие и от оригиналния обект. Както се вижда от примера по-долу (листинг 6), при промяна на името на директора на обекта копие (school Copy) се променя и името на директора на оригиналния обект (school). Броят на класните стаи на оригиналния обект училище не се променя, защото е от примитивен тип int, а името на оригиналния обект училище не се променя, защото клас String е неизменяем. Ще имаме предвид, че при копирането на обекти в Java съществено значение има типът на всяка от член-данните на обекта, който се копира. Ако класът се състои от обекти от неизменяеми (immutable) класове, няма риск от ситуация с плитко копие. Ако класът се състои от обекти от изменяем тип (mutable), трябва да се реализират копия на всички обекти, от които се състои тази изменяема член-данна.

Особено внимание трябва да се обърне и на класове, които имат член-данни от тип „Колекция“ (Collection – съвкупност от елементи). Ако колекциите са изградени от изменяеми обекти, трябва да се осигури създаване на дълбоко копие на всички обекти и изграждащите ги обекти, както споменахме и в описанието на примера с клас „Училище“. Ако осигурим дълбоко копие само на колекцията, а не на всеки изменяем обект, който е член-данна на елемент от колекцията, ще се стигне до ситуация, в която колекцията на оригинала не се променя от обекта копие, но стойностите на член-данните на елементите в колекцията на оригинала се изменят от копието.

Ще продължим описанието на подходите за дълбоко копие с примера за клас „Училище“, който разгледахме по-горе.

Съществуват три основни подхода при имплементация на дълбоко копие в Java:

1. имплементиране на интерфейс Cloneable и предефиниране на метод clone();

2. създаване и използване на конструктор за копиране (Copy Constructor);

3. използване на сериализация (процес на запазване на състоянието на обекта) и десериализация (процес на възстановяване на състоянието на обекта) на данните.

public class Principal {
private String name;
// Конструктори, get и set методи
}
public class School {
private String name;
private int classrooms;
private Principal principal;
// Конструктори, get и set методи
}
public static void main (String[] args) {
Principal principal Ivanov = new Principal(„Иванов“);
School school = new School(„Христо Ботев“, 30, principal
Ivanov);
System. out. println(„Оригиналният обект училище преди
промяната на копието: „);
System. out. println(school);
School school Copy = new School(school.getName(),
school.get Classrooms(), school.get Principal());
school Copy.setName(„Пенчо Славейков“);
schoolCopy.setClassrooms(20);
schoolCopy.getPrincipal().setName(„Петров“);
System.out.println(„Оригиналният обект училище след
промяната на копието: „);
System.out.println(school);
}
Резултат:
Оригиналният обект училище преди промяната на копието:
School{name=‘Христо Ботев’, classrooms=30, principal=Prin
cipal{name=‘Иванов‘}}
Оригиналният обект училище след промяната на копието:
School {name=‘Христо Ботев’, classrooms=30, princi
pal=Principal{name=‘Петров‘}}

Листинг 6. Плитко копие в Java

Интерфейс Cloneable и предефиниране на метод clone() в Java

Първият подход за реализиране на дълбоко копие, който разглеждаме, е с използване на метод clone() и имплементиране на интерфейс Cloneable. Необходимо е да декларираме, че класът „Училище“ ще може да използва метод clone(), като използваме маркиращия интерфейс Cloneable. За тази цел клас „Училище“ имплементира интерфейс Cloneable и предефинира метод clone(), който е деклариран в базовия за всички класове в Java – клас Object. Всеки метод, който предефинира метод clone(), трябва да изхвърля изключение от тип CloneNotSupportedException и да реализира клонирането на всеки изменяем обект поотделно.

В нашия пример клас „Директор“ имплементира интерфейс Cloneable и предефинира метод clone(), за да може в метод clone() на клас „Училище“ да се използва principal.clone(). Ако клас „Директор“ имаше член-данна от изменяем тип, трябваше да изпълним същите стъпки и за нея. Това е така, защото метод clone() всъщност реализира плитко копие.

В листинг 7 се виждат промените, които е необходимо да се направят в клас „Училище“ и клас „Директор“, за да се реализира дълбоко копие чрез клониране.

В обобщение на описаното по-горе, ако се използва подходът на клониране на обекти, трябва да се извършат три основни стъпки.

1. Имплементиране на маркиращ интерфейс Cloneable от всички изменяеми класове: класът, който ще се копира, и всички негови изменяеми член-данни.

2. Предефиниране на метод clone() с изрично клониране на всеки изменяем обект, който е член-данна на класа, в който е методът.

3. Деклариране или прихващане на изключението CloneNotSupportedException при декларация на всеки метод clone()

public class Principal imp lements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public class School implements Cloneable{...
@Override
public Object clone() throws CloneNotSupportedException {
School school = (School) super. clone();
school. principal= (Principal) this.principal.clone(); //
Cloning Principal, becauseitismutableobject
return school;
}
}
public static void main(String[] args) {…
School school Copy = (School) school.clone();
}
Резултат:
Оригиналният обект училище преди промяната на копието:
School{name=‘Христо Ботев’, classrooms=30, principal=Prin
cipal{name=‘Иванов‘}}
Оригиналният обект училище след промяната на копието:
School{name=‘Христо Ботев’, classrooms=30, principal=Prin
cipal{name=‘Иванов‘}}

Листинг 7. Дълбоко копие в Java – интерфейс Cloneable иметод clone()

Конструктор за копиране в Java

Аналогично на копиращия конструктор в С++ и в Java той има един аргумент от типа на класа, в който е реализиран и връща нов обект от същия тип със стойности на член-данните като тези на аргумента. При неговата реализация трябва да създадем конструктор за копиране във всеки изменяем клас, от който има член-данна в класа, от който ще създаваме копие. В примера това са класовете „Училище“ и „Директор“. В листинг 8 се виждат имплементацията на конструкторите за копиране на двата класа и начинът за използването им при създаване на копието.

public class Principal {…
public Principal(Principal principal) {
this.name = pricipal.name;
}
}
public class School {…
public School(Schoolschool) {
this.name = school. name;
this. classrooms= school. classrooms;
this.principal= new Principal(school. principal);
}
}
public static void main(String[] args) {…
School school Copy = new School(school);
}
Резултат:
Оригиналният обект училище преди промяната на копието:
School{name=‘Христо Ботев’, classrooms=30, principal=Prin
cipal{name=‘Иванов‘}}
Оригиналният обект училище след промяната на копието:
School{name=‘Христо Ботев’, classrooms=30, principal=Prin
cipal{name=‘Иванов‘}}

Листинг 8. Дълбоко копие в Java чрез копиращ конструктор

Кодът, който е описан в листинг 8, работи коректно, ако не се използва наследяване на обектите, които са член-данни на класа „Училище“. В следващата реализация ще включим клас „Заместник-директор“ (Assistant Principal), който наследява клас „Директор“. „Заместник-директор“ освен име има още една булева член-данна, която служи, за да покаже дали заместникдиректорът отговаря за учебната дейност.

public class AssistantPrincipal extends Principal {
private booleanresponsible For LearningActivities;
// Copy constructor
public AssistantPrincipal(AssistantPrincipal principal,
booleanresponsibleForLearningActivities) {
super(principal);
this.responsible For Learning Activities= responsible
ForLearningActivities;
}
}
public static void main(String[] args) {
School school = new School(„Христо Ботев“, 30, new As
sistantPrincipal(„Иванов“, true));
School schoolCopy = new School(school);
System.out.println(school);
System.out.println(schoolCopy);
}
Резултат:
School{name=‘Христо Ботев, classrooms=30, princi
pal=‘Иванов‘ AssistantPrincipal{responsibleForLearningAc
tivities=true}
School{name=‘Христо Ботев’, classrooms=30, principal=Prin
cipal{name=‘Иванов‘}}

Листинг 9. Наследяване в Java и копиране на обекти чрез конструктор за копиране

В резултат на изпълнение на кода (листинг 9) се вижда, че обектът копие няма „Заместник-директор“, а само „Директор“. Конструкторът за копиране в клас „Училище“ не знае за съществуването на обект от клас „Заместникдиректор“. Проблемът се решава, ако в клас „Директор“ и в неговите наследници се реализира метод за създаване на копие на обект „Директор“ и този метод се извика в конструктора за копиране на клас „Училище“, вместо да се използва директно копиращият конструктор на клас „Директор“ (Bloch, 2017). Проблемът с копиращия конструктор в ситуация на йерархии от класове се идентифицира лесно поради факта, че кодът е в разрез с принципа „Отворен/ Затворен“ (Open/Closed Principle), който гласи, че всеки клас трябва да е затворен за модифициране и отворен за разширяване (Shvets, 2019) (Martin, 2018).

Извод (за С++ и Java): при йерархии от класове и полиморфизъм е по-удачно да се използва допълнителен метод за клониране (раздел Клониране на обекти в С++), който да извиква конструктора за копиране вместо директно да се извиква конструктор за копиране.

Използване на сериализация и десериализация на данните в Java

Третият подход за копиране на обекти в Java, който ще разгледаме, използва сериализация и десериализация на данните. Сериализация е процес на запазване на състоянието на обект (стойностите на член-данните му) в двоична форма. Десериализацията е обратният процес: възстановяване на обект, като се използват сериализираните данни. Процесът на запазване и възстановяване на данните се осъществява с използване на два допълнителни метода към клас „Училище“. Практически е по-удачно те да се реализират в отделен клас, но за целите на демонстрацията ще бъдат създадени в класа.

Необходимо е класът „Училище“ да бъде обозначен с маркиращия интерфейс Serializable, за да можем да запазим състоянието му. При наследяване трябва маркиращият интерфейс Serializable да бъде имплементиран на най-високо ниво в йерархията, за да може всички данни във всичките му наследници да се запазят. Всички класове, чиито обекти са член-данни на класа „Училище“, също трябва да имплементират Serializable.

Сериализацията на данните може да бъде осъществена и чрез използване на външни библиотеки, например Jackson и Apache Commons (SerializationUtils). Тук трябва да се отбележи, че процесът на сериализиране и десериализиране е бавен.

public class School implements Serializable {
public void serializeSchool(StringfilePath) {
try(File Output Streamfos = new FileOutputStream(filePath);
ObjectOutputStreamoutputStream = new ObjectOutputStream(
fos);) {
outputStream.writeObject(this);
} catch(IOExceptionex) {
System. err. println(ex);
}
}
public School deserializeSchool(StringfilePath) {
School school = new School();
try(FileInputStreamfis = new FileInputStream(filePath);
ObjectInputStreaminputStream = new ObjectInputStream(fis);)
{
return (School) inputStream.readObject();
} catch (ClassNotFoundExceptionex) {
System.err.println („Class not found: „ + ex);
} catch( IOExceptionex) {
System.err.println(„IO error: „ + ex);
}
return school;
}
public School deepCopyBySerialization(StringfilePath) {
serialize School(filePath);
return deserializeSchool(filePath);
}
public static void main(String[] args) {
StringfilePath = „school.ser“;
School school = new School(„Христо Ботев“, 30, newPrinci
pal(„Иванов“));
School schoolCopy = new School(school.deepCopyBySerializa
tion(filePath));
}

Листинг 10. Сериализация и десериализация на данни в Java

Предимства и недостатъци на подходите за реализиране на дълбоко копие в Java

Трите основни подхода за реализиране на дълбоко копие в Java, които са описани в предходните раздели, имат своите специфики и се използват в различни ситуации. Техните предимства и недостатъци са обобщени в таблица 1.

Таблица 1. Предимства и недостатъци на подходите за дълбоко копие в Java

Дълбоко копиев JavaПредимстваНедостатъциКлониране: интерфейсCloaneable и метод clone()1. Не се налага да се копи-рат примитивните данни.2. Кодът за реализиранена метода за клониранее компактен.3. Използва се при клони-ране на масиви.1. Трябва да се имплементира интер-фейс Cloneable.2. Трябва да се предефинира методclone() в цялата йерархия на наследя-ването.3. Нямаме контрол върху конструира-не на обекта, защото не се извикваконструктор.4. Полета, дефинирани като nal, немогат да се манипулират, защото те сепроменят само през конструктор.5. Трябва да се прихване изключениетоCloneNotSupportedException.
Конструктор за копиране1. Не се налага да се им-плементира интерфейс.2. Кодът не зависиот непознат механизъмза създаване на обекта.3. Могат да се модифици-рат полета, декларираниnal.1. В ситуация на наследяване кон-структорът за копиране на класанаследник не се извиква, т.е. копиетоне получава обект от класа наследник,а обект от базовия клас. Необходимо еда се реализира метод за клониране,който да извиква конструктора за копи-ране. Трябва отговорността за копира-нето на обекта да се делегира на неговсобствен метод.2. Когато нямаме достъп до класове-те, в които трябва да се реализираконструкторът за копиране, не можемда го създадем.Сериализиранена данните1. Може да се използвапри наследяване.2. Може да се използватвъншни библиотеки, коитореализират дълбоко копие,без да имаме достъп докласовете,чиито обекти ще копираме.1. Трябва да се предефинира интер-фейс Serializable.2. Механизмът е бавен. Не се използ-ва, ако се цели бързина при изпълне-ние.3. Трябва да се внимава в ситуация напромяна на полетата на класа и десе-риализация на обекта.

Заключение – реализиране на дълбоко копие в Java и C++

В настоящата статия са представени различните начини за осигуряване на дълбоко копие в Java и C++. Основните методи, които се използват и в двете технологии, са: конструктор за копиране, клониране на обекти и използване на сериализация на данните. С един и същ пример са представени специфичните реализации на дълбокото копие в двата езика за програмиране и са описани основните предимства и недостатъци на трите метода. Решението за това кой от подходите трябва да се избере, зависи от редица фактори:

– дали имаме достъп до кода, който трябва да се използва за копиране на обектите;

– дали бързодействието е много важно за реализацията на проекта;

– използва ли се йерархия от класове и полиморфизъм.

Освен посочените по-горе фактори роля играе и специфичната реализация на подходите в двата езика, както и различните ситуации, при които се извършва и неявно копиране на обекти или тяхното деструктуриране. След анализиране на всички предпоставки се избира един от посочените начини за реализиране на дълбоко копие, като се стремим да спазваме принципите на изграждане на лесен за разширяване и сигурен код (Martin, 2018) (Shvets, 2019).

ЛИТЕРАТУРА

Тодорова, М. (2011). Обектно ориентирано програмиране на базата на езика С++. Ciela.

REFERENCES

Bloch, J. (2017). Effective Java. Pearson Education, Inc.

Martin, R. (2018). Clean Architecture. A Craftman’s Guide to Software Structure and Design. Pearson Education, Inc.

Meyers, S. (2017). Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition). Pearson Education, Inc.

Shvets, A. (2019). Dive Into Design Patterns.

2025 година
Книжка 6
ENHANCING STUDENT MOTIVATION AND ACHIEVEMENT THROUGH DIGITAL MIND MAPPING

Mikloš Kovač, Mirjana Brdar, Goran Radojev, Radivoje Stojković

OPTIMIZATION VS BOOSTING: COMPARISON OF STRATEGIES ON EDUCATIONAL DATASETS TO EXPLORE LOW-PERFORMING AT-RISK AND DROPOUT STUDENTS

Ranjit Paul, Asmaa Mohamed, Peren Jerfi Canatalay, Ashima Kukkar, Sadiq Hussain, Arun K. Baruah, Jiten Hazarika, Silvia Gaftandzhieva, Esraa A. Mahareek, Abeer S. Desuky, Rositsa Doneva

ARTIFICIAL INTELLIGENCE AS A TOOL FOR PEDAGOGICAL INNOVATIONS IN MATHEMATICS EDUCATION

Stanka Hadzhikoleva, Maria Borisova, , Borislava Kirilova

Книжка 4
Книжка 3
МОДЕЛИ НА ВЕРОЯТНОСТНИ ПРОСТРАНСТВА В ОЛИМПИАДНИ ЗАДАЧИ

Драгомир Грозев, Станислав Харизанов

Книжка 1
A NOTE ON A GENERALIZED DYNAMICAL SYSTEM OCCURS IN MODELLING “THE BATTLE OF THE SEXES”: CHAOS IN SOCIOBIOLOGY

Nikolay Kyurkchiev, Anton Iliev, Vesselin Kyurkchiev, Angel Golev, Todorka Terzieva, Asen Rahnev

EDUCATIONAL RESOURCES FOR STUDYING MIDSEGMENTS OF TRIANGLE AND TRAPEZOID

Toni Chehlarova1), Neda Chehlarova2), Georgi Gachev

2024 година
Книжка 6
ВЪЗМОЖНОСТИ ЗА ИЗГРАЖДАНЕ НА МЕЖДУПРЕДМЕТНИ ВРЪЗКИ МАТЕМАТИКА – ИНФОРМАТИКА

Елена Каращранова, Ирена Атанасова, Надежда Борисова

Книжка 5
FRAMEWORK FOR DESIGNING VISUALLY ORIENTATED TOOLS TO SUPPORT PROJECT MANAGEMENT

Dalibor Milev, Nadezhda Borisova, Elena Karashtranova

3D ОБРАЗОВАТЕЛЕН ПОДХОД В ОБУЧЕНИЕТО ПО СТЕРЕОМЕТРИЯ

Пеньо Лебамовски, Марияна Николова

Книжка 4
DYNAMICS OF A NEW CLASS OF OSCILLATORS: MELNIKOV’S APPROACH, POSSIBLE APPLICATION TO ANTENNA ARRAY THEORY

Nikolay Kyurkchiev, Tsvetelin Zaevski, Anton Iliev, Vesselin Kyurkchiev, Asen Rahnev

Книжка 3
РАЗСТОЯНИЯ МЕЖДУ ЗАБЕЛЕЖИТЕЛНИ ТОЧКИ И НЕРАВЕНСТВА В ИЗПЪКНАЛ ЧЕТИРИЪГЪЛНИК

Йордан Табов, Станислав Стефанов, Красимир Кънчев, Хаим Хаимов

USING AI TO IMPROVE ANSWER EVALUATION IN AUTOMATED EXAMS

Georgi Cholakov, Asya Stoyanova-Doycheva

Книжка 2
ON INTEGRATION OF STEM MODULES IN MATHEMATICS EDUCATION

Elena Karashtranova, Aharon Goldreich, Nadezhda Borisova

Книжка 1
STUDENT SATISFACTION WITH THE QUALITY OF A BLENDED LEARNING COURSE

Silvia Gaftandzhieva, Rositsa Doneva, Sadiq Hussain, Ashis Talukder, Gunadeep Chetia, Nisha Gohain

MODERN ROAD SAFETY TRAINING USING GAME-BASED TOOLS

Stefan Stavrev, Ivelina Velcheva

ARTIFICIAL INTELLIGENCE FOR GOOD AND BAD IN CYBER AND INFORMATION SECURITY

Nikolay Kasakliev, Elena Somova, Margarita Gocheva

2023 година
Книжка 6
QUALITY OF BLENDED LEARNING COURSES: STUDENTS’ PERSPECTIVE

Silvia Gaftandzhieva, Rositsa Doneva, Sadiq Hussain, Ashis Talukder, Gunadeep Chetia, Nisha Gohain

МОДЕЛ НА ЛЕОНТИЕВ С MS EXCEL

Велика Кунева, Мариян Милев

Книжка 5
AREAS ASSOCIATED TO A QUADRILATERAL

Oleg Mushkarov, Nikolai Nikolov

ON THE DYNAMICS OF A ClASS OF THIRD-ORDER POLYNOMIAL DIFFERENCE EQUATIONS WITH INFINITE NUMBER OF PERIOD-THREE SOLUTIONS

Jasmin Bektešević, Vahidin Hadžiabdić, Midhat Mehuljić, Sadjit Metović, Haris Lulić

СИСТЕМА ЗА ИЗВЛИЧАНЕ И ВИЗУАЛИЗАЦИЯ НА ДАННИ ОТ ИНТЕРНЕТ

Георги Чолаков, Емил Дойчев, Светла Коева

Книжка 4
MULTIPLE REPRESENTATIONS OF FUNCTIONS IN THE FRAME OF DISTANCE LEARNING

Radoslav Božić, Hajnalka Peics, Aleksandar Milenković

INTEGRATED LESSONS IN CALCULUS USING SOFTWARE

Pohoriliak Oleksandr, Olga Syniavska, Anna Slyvka-Tylyshchak, Antonina Tegza, Alexander Tylyshchak

Книжка 3
ПРИЛОЖЕНИЕ НА ЕЛЕМЕНТИ ОТ ГЕОМЕТРИЯТА НА ЧЕТИРИЪГЪЛНИКА ЗА РЕШАВАНЕ НА НЕСТАНДАРТНИ ЗАДАЧИ

Йордан Табов, Веселин Ненков, Асен Велчев, Станислав Стефанов

Книжка 2
Книжка 1
НОВА ФОРМУЛА ЗА ЛИЦЕ НА ЧЕТИРИЪГЪЛНИК (ЧЕТИВО ЗА VII КЛАС)

Йордан Табов, Асен Велчев, Станислав Стефанов, Хаим Хаимов

2022 година
Книжка 6
MOBILE GAME-BASED MATH LEARNING FOR PRIMARY SCHOOL

Margarita Gocheva, Nikolay Kasakliev, Elena Somova

Книжка 5
SECURITY ANALYSIS ON CONTENT MANAGEMENT SYSTEMS

Lilyana Petkova, Vasilisa Pavlova

MONITORING OF STUDENT ENROLMENT CAMPAIGN THROUGH DATA ANALYTICS TOOLS

Silvia Gaftandzhieva, Rositsa Doneva, Milen Bliznakov

TYPES OF SOLUTIONS IN THE DIDACTIC GAME “LOGIC MONSTERS”

Nataliya Hristova Pavlova, Michaela Savova Toncheva

Книжка 4
PERSONAL DATA PROCESSING IN A DIGITAL EDUCATIONAL ENVIRONMENT

Evgeniya Nikolova, Mariya Monova-Zheleva, Yanislav Zhelev

Книжка 3
Книжка 2
STEM ROBOTICS IN PRIMARY SCHOOL

Tsanko Mihov, Gencho Stoitsov, Ivan Dimitrov

A METAGRAPH MODEL OF CYBER PROTECTION OF AN INFORMATION SYSTEM

Emiliya Koleva, Evgeni Andreev, Mariya Nikolova

Книжка 1
CONVOLUTIONAL NEURAL NETWORKS IN THE TASK OF IMAGE CLASSIFICATION

Larisa Zelenina, Liudmila Khaimina, Evgenii Khaimin, D. Khripunov, Inga Zashikhina

INNOVATIVE PROPOSALS FOR DATABASE STORAGE AND MANAGEMENT

Yulian Ivanov Petkov, Alexandre Ivanov Chikalanov

APPLICATION OF MATHEMATICAL MODELS IN GRAPHIC DESIGN

Ivaylo Staribratov, Nikol Manolova

РЕШЕНИЯ НА КОНКУРСНИ ЗАДАЧИ БРОЙ 6, 2021 Г.

Задача 1. Дадени са различни естествени числа, всяко от които има прос- ти делители, не по-големи от . Докажете, че произведението на някои три от тези числа е точен куб. Решение: числата са представим във вида . Нека разгледаме квадрат

2021 година
Книжка 6
E-LEARNING DURING COVID-19 PANDEMIC: AN EMPIRICAL RESEARCH

Margarita Gocheva, Nikolay Kasakliev, Elena Somova

Книжка 5
ПОДГОТОВКА ЗА XXV МЛАДЕЖКА БАЛКАНИАДА ПО МАТЕМАТИКА 2021

Ивайло Кортезов, Емил Карлов, Мирослав Маринов

EXCEL’S CALCULATION OF BASIC ASSETS AMORTISATION VALUES

Vehbi Ramaj, Sead Rešić, Anes Z. Hadžiomerović

EDUCATIONAL ENVIRONMENT AS A FORM FOR DEVELOPMENT OF MATH TEACHERS METHODOLOGICAL COMPETENCE

Olha Matiash, Liubov Mykhailenko, Vasyl Shvets, Oleksandr Shkolnyi

Книжка 4
LEARNING ANALYTICS TOOL FOR BULGARIAN SCHOOL EDUCATION

Silvia Gaftandzhieva, Rositsa Doneva, George Pashev, Mariya Docheva

Книжка 3
THE PROBLEM OF IMAGES’ CLASSIFICATION: NEURAL NETWORKS

Larisa Zelenina, Liudmila Khaimina, Evgenii Khaimin, D. Khripunov, Inga Zashikhina

MIDLINES OF QUADRILATERAL

Sead Rešić, Maid Omerović, Anes Z. Hadžiomerović, Ahmed Palić

ВИРТУАЛЕН ЧАС ПО МАТЕМАТИКА

Севдалина Георгиева

Книжка 2
MOBILE MATH GAME PROTOTYPE ON THE BASE OF TEMPLATES FOR PRIMARY SCHOOL

Margarita Gocheva, Elena Somova, Nikolay Kasakliev, Vladimira Angelova

КОНКУРСНИ ЗАДАЧИ БРОЙ 2/2021 Г.

Краен срок за изпращане на решения: 0 юни 0 г.

РЕШЕНИЯ НА ЗАДАЧИТЕ ОТ БРОЙ 1, 2021

Краен срок за изпращане на решения: 0 юни 0 г.

Книжка 1
СЕДЕМНАДЕСЕТА ЖАУТИКОВСКА ОЛИМПИАДА ПО МАТЕМАТИКА, ИНФОРМАТИКА И ФИЗИКА АЛМАТИ, 7-12 ЯНУАРИ 2021

Диян Димитров, Светлин Лалов, Стефан Хаджистойков, Елена Киселова

ОНЛАЙН СЪСТЕЗАНИЕ „VIVA МАТЕМАТИКА С КОМПЮТЪР“

Петър Кендеров, Тони Чехларова, Георги Гачев

2020 година
Книжка 6
ABSTRACT DATA TYPES

Lasko M. Laskov

Книжка 5
GAMIFICATION IN CLOUD-BASED COLLABORATIVE LEARNING

Denitza Charkova, Elena Somova, Maria Gachkova

NEURAL NETWORKS IN A CHARACTER RECOGNITION MOBILE APPLICATION

L.I. Zelenina, L.E. Khaimina, E.S. Khaimin, D.I. Antufiev, I.M. Zashikhina

APPLICATIONS OF ANAGLIFIC IMAGES IN MATHEMATICAL TRAINING

Krasimir Harizanov, Stanislava Ivanova

МЕТОД НА ДЕЦАТА В БЛОКА

Ивайло Кортезов

Книжка 4
TECHNOLOGIES AND TOOLS FOR CREATING ADAPTIVE E-LEARNING CONTENT

Todorka Terzieva, Valya Arnaudova, Asen Rahnev, Vanya Ivanova

Книжка 3
MATHEMATICAL MODELLING IN LEARNING OUTCOMES ASSESSMENT (BINARY MODEL FOR THE ASSESSMMENT OF STUDENT’S COMPETENCES FORMATION)

L. E. Khaimina, E. A. Demenkova, M. E. Demenkov, E. S. Khaimin, L. I. Zelenina, I. M. Zashikhina

PROBLEMS 2 AND 5 ON THE IMO’2019 PAPER

Sava Grozdev, Veselin Nenkov

Книжка 2
ЗА ВЕКТОРНОТО ПРОСТРАНСТВО НА МАГИЧЕСКИТЕ КВАДРАТИ ОТ ТРЕТИ РЕД (В ЗАНИМАТЕЛНАТА МАТЕМАТИКА)

Здравко Лалчев, Маргарита Върбанова, Мирослав Стоимиров, Ирина Вутова

КОНКУРЕНТНИ ПЕРПЕНДИКУЛЯРИ, ОПРЕДЕЛЕНИ ОТ ПРАВИЛНИ МНОГОЪГЪЛНИЦИ

Йоана Христова, Геновева Маринова, Никола Кушев, Светослав Апостолов, Цветомир Иванов

A NEW PROOF OF THE FEUERBACH THEOREM

Sava Grozdev, Hiroshi Okumura, Deko Dekov

PROBLEM 3 ON THE IMO’2019 PAPER

Sava Grozdev, Veselin Nenkov

Книжка 1
GENDER ISSUES IN VIRTUAL TRAINING FOR MATHEMATICAL KANGAROO CONTEST

Mark Applebaum, Erga Heller, Lior Solomovich, Judith Zamir

KLAMKIN’S INEQUALITY AND ITS APPLICATION

Šefket Arslanagić, Daniela Zubović

НЯКОЛКО ПРИЛОЖЕНИЯ НА ВЪРТЯЩАТА ХОМОТЕТИЯ

Сава Гроздев, Веселин Ненков

2019 година
Книжка 6
DISCRETE MATHEMATICS AND PROGRAMMING – TEACHING AND LEARNING APPROACHES

Mariyana Raykova, Hristina Kostadinova, Stoyan Boev

CONVERTER FROM MOODLE LESSONS TO INTERACTIVE EPUB EBOOKS

Martin Takev, Elena Somova, Miguel Rodríguez-Artacho

ЦИКЛОИДА

Аяпбергенов Азамат, Бокаева Молдир, Чурымбаев Бекнур, Калдыбек Жансуйген

КАРДИОИДА

Евгений Воронцов, Никита Платонов

БОЛГАРСКАЯ ОЛИМПИАДА ПО ФИНАНСОВОЙ И АКТУАРНОЙ МАТЕМАТИКЕ В РОССИИ

Росен Николаев, Сава Гроздев, Богдана Конева, Нина Патронова, Мария Шабанова

КОНКУРСНИ ЗАДАЧИ НА БРОЯ

Задача 1. Да се намерят всички полиноми, които за всяка реална стойност на удовлетворяват равенството Татяна Маджарова, Варна Задача 2. Правоъгълният триъгълник има остри ъгли и , а центърът на вписаната му окръжност е . Точката , лежаща в , е такава, че и . Симетралите

РЕШЕНИЯ НА ЗАДАЧИТЕ ОТ БРОЙ 1, 2019

Задача 1. Да се намерят всички цели числа , за които

Книжка 5
ДЪЛБОКО КОПИЕ В C++ И JAVA

Христина Костадинова, Марияна Райкова

КОНКУРСНИ ЗАДАЧИ НА БРОЯ

Задача 1. Да се намери безкрайно множество от двойки положителни ра- ционални числа Милен Найденов, Варна

РЕШЕНИЯ НА ЗАДАЧИТЕ ОТ БРОЙ 6, 2018

Задача 1. Точката е левият долен връх на безкрайна шахматна дъска. Една муха тръгва от и се движи само по страните на квадратчетата. Нека е общ връх на някои квадратчета. Казва- ме, че мухата изминава пътя между и , ако се движи само надясно и нагоре. Ако точките и са противоположни върхове на правоъгълник , да се намери броят на пътищата, свърз- ващи точките и , по които мухата може да мине, когато: а) и ; б) и ; в) и

Книжка 4
THE REARRANGEMENT INEQUALITY

Šefket Arslanagić

АСТРОИДА

Борислав Борисов, Деян Димитров, Николай Нинов, Теодор Христов

COMPUTER PROGRAMMING IN MATHEMATICS EDUCATION

Marin Marinov, Lasko Laskov

CREATING INTERACTIVE AND TRACEABLE EPUB LEARNING CONTENT FROM MOODLE COURSES

Martin Takev, Miguel Rodríguez-Artacho, Elena Somova

КОНКУРСНИ ЗАДАЧИ НА БРОЯ

Задача 1. Да се реши уравнението . Христо Лесов, Казанлък Задача 2. Да се докаже, че в четириъгълник с перпендикулярни диагонали съществува точка , за която са изпълнени равенствата , , , . Хаим Хаимов, Варна Задача 3. В правилен 13-ъгълник по произволен начин са избрани два диа- гонала. Каква е вероятността избраните диагонали да не се пресичат? Сава Гроздев, София, и Веселин Ненков, Бели Осъм

РЕШЕНИЯ НА ЗАДАЧИТЕ ОТ БРОЙ 5, 2018

Задача 1. Ако и са съвършени числа, за които целите части на числата и са равни и различни от нула, да се намери .

Книжка 3
RESULTS OF THE FIRST WEEK OF CYBERSECURITY IN ARKHANGELSK REGION

Olga Troitskaya, Olga Bezumova, Elena Lytkina, Tatyana Shirikova

DIDACTIC POTENTIAL OF REMOTE CONTESTS IN COMPUTER SCIENCE

Natalia Sofronova, Anatoliy Belchusov

КОНКУРСНИ ЗАДАЧИ НА БРОЯ

Краен срок за изпращане на решения 30 ноември 2019 г.

РЕШЕНИЯ НА ЗАДАЧИТЕ ОТ БРОЙ 4, 2018

Задача 1. Да се намерят всички тройки естествени числа е изпълнено равенството: а)

Книжка 2
ЕЛЕКТРОНЕН УЧЕБНИК ПО ОБЗОРНИ ЛЕКЦИИ ЗА ДЪРЖАВЕН ИЗПИТ В СРЕДАТА DISPEL

Асен Рахнев, Боян Златанов, Евгения Ангелова, Ивайло Старибратов, Валя Арнаудова, Слав Чолаков

ГЕОМЕТРИЧНИ МЕСТА, ПОРОДЕНИ ОТ РАВНОСТРАННИ ТРИЪГЪЛНИЦИ С ВЪРХОВЕ ВЪРХУ ОКРЪЖНОСТ

Борислав Борисов, Деян Димитров, Николай Нинов, Теодор Христов

ЕКСТРЕМАЛНИ СВОЙСТВА НА ТОЧКАТА НА ЛЕМОАН В ЧЕТИРИЪГЪЛНИК

Веселин Ненков, Станислав Стефанов, Хаим Хаимов

A TRIANGLE AND A TRAPEZOID WITH A COMMON CONIC

Sava Grozdev, Veselin Nenkov

КОНКУРСНИ ЗАДАЧИ НА БРОЯ

Христо Лесов, Казанлък Задача 2. Окръжност с диаметър и правоъгълник с диагонал имат общ център. Да се докаже, че за произволна точка M от е изпълне- но равенството . Милен Найденов, Варна Задача 3. В изпъкналия четириъгълник са изпълнени равенства- та и . Точката е средата на диагонала , а , , и са ортоганалните проекции на съответно върху правите , , и . Ако и са средите съответно на отсечките и , да се докаже, че точките , и лежат на една права.

РЕШЕНИЯ НА ЗАДАЧИТЕ ОТ БРОЙ 3, 2018

Задача 1. Да се реши уравнението . Росен Николаев, Дико Суружон, Варна Решение. Въвеждаме означението , където . Съгласно това означение разлежданото уравнение придобива вида не е решение на уравнението. Затова са възможни само случаите 1) и 2) . Разглеж- даме двата случая поотделно. Случай 1): при е изпълнено равенството . Тогава имаме:

Книжка 1
PROBLEM 6. FROM IMO’2018

Sava Grozdev, Veselin Nenkov

РЕШЕНИЯ НА ЗАДАЧИТЕ ОТ БРОЙ 2, 2018

Задача 1. Да се намери най-малкото естествено число , при което куба с целочислени дължини на ръбовете в сантиметри имат сума на обемите, рав- на на Христо Лесов, Казанлък Решение: тъй като , то не е куб на ес- тествено число и затова . Разглеждаме последователно случаите за . 1) При разглеждаме естествени числа и , за които са изпълнени релациите и . Тогава то , т.е. . Освен това откъдето , т.е. .Така получихме, че . Лесно се проверява, че при и няма естествен

КОНКУРСНИ ЗАДАЧИ НА БРОЯ

Задача 1. Да се намерят всички цели числа , за които

2018 година
Книжка 6
„ЭНЦИКЛОПЕДИЯ ЗАМЕЧАТЕЛЬНЫХ ПЛОСКИХ КРИВЫХ“ – МЕЖДУНАРОДНЫЙ СЕТЕВОЙ ИССЛЕДОВАТЕЛЬСКИЙ ПРОЕКТ В РАМКАХ MITE

Роза Атамуратова, Михаил Алфёров, Марина Белорукова, Веселин Ненков, Валерий Майер, Генадий Клековкин, Раиса Овчинникова, Мария Шабанова, Александр Ястребов

A NEW MEANING OF THE NOTION “EXPANSION OF A NUMBER”

Rosen Nikolaev, Tanka Milkova, Radan Miryanov

Книжка 5
ИТОГИ ПРОВЕДЕНИЯ ВТОРОЙ МЕЖДУНАРОДНОЙ ОЛИМПИАДЬI ПО ФИНАНСОВОЙ И АКТУАРНОЙ МАТЕМАТИКЕ СРЕДИ ШКОЛЬНИКОВ И СТУДЕНТОВ

Сава Гроздев, Росен Николаев, Мария Шабанова, Лариса Форкунова, Нина Патронова

LEARNING AND ASSESSMENT BASED ON GAMIFIED E-COURSE IN MOODLE

Mariya Gachkova, Martin Takev, Elena Somova

УЛИТКА ПАСКАЛЯ

Дарья Коптева, Ксения Горская

КОМБИНАТОРНИ ЗАДАЧИ, СВЪРЗАНИ С ТРИЪГЪЛНИК

Росен Николаев, Танка Милкова, Катя Чалъкова

Книжка 4
ЗА ПРОСТИТЕ ЧИСЛА

Сава Гроздев, Веселин Ненков

ИНЦЕНТЪР НА ЧЕТИРИЪГЪЛНИК

Станислав Стефанов

ЭПИЦИКЛОИДА

Инкар Аскар, Камила Сарсембаева

ГИПОЦИКЛОИДА

Борислав Борисов, Деян Димитров, Иван Стефанов, Николай Нинов, Теодор Христов

Книжка 3
ПОЛИНОМИ ОТ ТРЕТА СТЕПЕН С КОЛИНЕАРНИ КОРЕНИ

Сава Гроздев, Веселин Ненков

ЧЕТИРИДЕСЕТ И ПЕТА НАЦИОНАЛНА СТУДЕНТСКА ОЛИМПИАДА ПО МАТЕМАТИКА

Сава Гроздев, Росен Николаев, Станислава Стоилова, Веселин Ненков

Книжка 2
TWO INTERESTING INEQUALITIES FOR ACUTE TRIANGLES

Šefket Arslanagić, Amar Bašić

ПЕРФЕКТНА ИЗОГОНАЛНОСТ В ЧЕТИРИЪГЪЛНИК

Веселин Ненков, Станислав Стефанов, Хаим Хаимов

НЯКОИ ТИПОВЕ ЗАДАЧИ СЪС СИМЕТРИЧНИ ЧИСЛА

Росен Николаев, Танка Милкова, Радан Мирянов

Книжка 1
Драги читатели,

където тези проценти са наполовина, в Източна Европа те са около 25%, в

COMPUTER DISCOVERED MATHEMATICS: CONSTRUCTIONS OF MALFATTI SQUARES

Sava Grozdev, Hiroshi Okumura, Deko Dekov

ВРЪЗКИ МЕЖДУ ЗАБЕЛЕЖИТЕЛНИ ТОЧКИ В ЧЕТИРИЪГЪЛНИКА

Станислав Стефанов, Веселин Ненков

КОНКУРСНИ ЗАДАЧИ НА БРОЯ

Задача 2. Да се докаже, че всяка от симедианите в триъгълник с лице разделя триъгълника на два триъгълника, лицата на които са корени на урав- нението където и са дължините на прилежащите на симедианата страни на три- ъгълника. Милен Найденов, Варна Задача 3. Четириъгълникът е описан около окръжност с център , като продълженията на страните му и се пресичат в точка . Ако е втората пресечна точка на описаните окръжности на триъгълниците и , да се докаже, че Хаим Х

РЕШЕНИЯ НА ЗАДАЧИТЕ ОТ БРОЙ 2, 2017

Задача 1. Да се определи дали съществуват естествени числа и , при които стойността на израза е: а) куб на естествено число; б) сбор от кубовете на две естествени числа; в) сбор от кубовете на три естествени числа. Христо Лесов, Казанлък Решение: при и имаме . Следова- телно случай а) има положителен отговор. Тъй като при число- то се дели на , то при и имаме е естестве- но число. Следователно всяко число от разглеждания вид при деление на дава ос

2017 година
Книжка 6
A SURVEY OF MATHEMATICS DISCOVERED BY COMPUTERS. PART 2

Sava Grozdev, Hiroshi Okumura, Deko Dekov

ТРИ ИНВАРИАНТЫ В ОДНУ ЗАДА

Ксения Горская, Дарья Коптева, Асхат Ермекбаев, Арман Жетиру, Азат Бермухамедов, Салтанат Кошер, Лили Стефанова, Ирина Христова, Александра Йовкова

GAMES WITH

Aldiyar Zhumashov

SOME NUMERICAL SQUARE ROOTS (PART TWO)

Rosen Nikolaev, Tanka Milkova, Yordan Petkov

ЗАНИМАТЕЛНИ ЗАДАЧИ ПО ТЕМАТА „КАРТИННА ГАЛЕРИЯ“

Мирослав Стоимиров, Ирина Вутова

Книжка 5
ВТОРОЙ МЕЖДУНАРОДНЫЙ СЕТЕВОЙ ИССЛЕДОВАТЕЛЬСКИЙ ПРОЕКТ УЧАЩИХСЯ В РАМКАХ MITE

Мария Шабанова, Марина Белорукова, Роза Атамуратова, Веселин Ненков

SOME NUMERICAL SEQUENCES CONCERNING SQUARE ROOTS (PART ONE)

Rosen Nikolaev, Tanka Milkova, Yordan Petkov

Книжка 4
ГЕНЕРАТОР НА ТЕСТОВЕ

Ангел Ангелов, Веселин Дзивев

INTERESTING PROOFS OF SOME ALGEBRAIC INEQUALITIES

Šefket Arslanagić, Faruk Zejnulahi

PROBLEMS ON THE BROCARD CIRCLE

Sava Grozdev, Hiroshi Okumura, Deko Dekov

ПРИЛОЖЕНИЕ НА ЛИНЕЙНАТА АЛГЕБРА В ИКОНОМИКАТА

Велика Кунева, Захаринка Ангелова

СКОРОСТТА НА СВЕТЛИНАТА

Сава Гроздев, Веселин Ненков

Книжка 3
НЯКОЛКО ПРИЛОЖЕНИЯ НА ТЕОРЕМАТА НА МЕНЕЛАЙ ЗА ВПИСАНИ ОКРЪЖНОСТИ

Александра Йовкова, Ирина Христова, Лили Стефанова

НАЦИОНАЛНА СТУДЕНТСКА ОЛИМПИАДА ПО МАТЕМАТИКА

Сава Гроздев, Росен Николаев, Веселин Ненков

СПОМЕН ЗА ПРОФЕСОР АНТОН ШОУРЕК

Александра Трифонова

Книжка 2
ИЗКУСТВЕНА ИМУННА СИСТЕМА

Йоанна Илиева, Селин Шемсиева, Светлана Вълчева, Сюзан Феимова

ВТОРИ КОЛЕДЕН ЛИНГВИСТИЧЕН ТУРНИР

Иван Держански, Веселин Златилов

Книжка 1
ГЕОМЕТРИЯ НА ЧЕТИРИЪГЪЛНИКА, ТОЧКА НА МИКЕЛ, ИНВЕРСНА ИЗОГОНАЛНОСТ

Веселин Ненков, Станислав Стефанов, Хаим Хаимов

2016 година
Книжка 6
ПЕРВЫЙ МЕЖДУНАРОДНЫЙ СЕТЕВОЙ ИССЛЕДОВАТЕЛЬСКИЙ ПРОЕКТ УЧАЩИХСЯ В РАМКАХ MITE

Мария Шабанова, Марина Белорукова, Роза Атамуратова, Веселин Ненков

НЕКОТОРЫЕ ТРАЕКТОРИИ, КОТОРЫЕ ОПРЕДЕЛЕНЫ РАВНОБЕДРЕННЫМИ ТРЕУГОЛЬНИКАМИ

Ксения Горская, Дарья Коптева, Даниил Микуров, Еркен Мудебаев, Казбек Мухамбетов, Адилбек Темирханов, Лили Стефанова, Ирина Христова, Радина Иванова

ПСЕВДОЦЕНТЪР И ОРТОЦЕНТЪР – ЗАБЕЛЕЖИТЕЛНИ ТОЧКИ В ЧЕТИРИЪГЪЛНИКА

Веселин Ненков, Станислав Стефанов, Хаим Хаимов

FUZZY LOGIC

Reinhard Magenreuter

GENETIC ALGORITHM

Reinhard Magenreuter

Книжка 5
NEURAL NETWORKS

Reinhard Magenreuter

Книжка 4
АКТИВНО, УЧАСТВАЩО НАБЛЮДЕНИЕ – ТИП ИНТЕРВЮ

Христо Христов, Христо Крушков

ХИПОТЕЗАТА В ОБУЧЕНИЕТО ПО МАТЕМАТИКА

Румяна Маврова, Пенка Рангелова, Елена Тодорова

Книжка 3
ОБОБЩЕНИЕ НА ТЕОРЕМАТА НА ЧЕЗАР КОШНИЦА

Сава Гроздев, Веселин Ненков

Книжка 2
ОЙЛЕР-ВЕН ДИАГРАМИ ИЛИ MZ-КАРТИ В НАЧАЛНАТА УЧИЛИЩНА МАТЕМАТИКА

Здравко Лалчев, Маргарита Върбанова, Ирина Вутова, Иван Душков

ОБВЪРЗВАНЕ НА ОБУЧЕНИЕТО ПО АЛГЕБРА И ГЕОМЕТРИЯ

Румяна Маврова, Пенка Рангелова

Книжка 1
STATIONARY NUMBERS

Smaiyl Makyshov

МЕЖДУНАРОДНА ЖАУТИКОВСКА ОЛИМПИАДА

Сава Гроздев, Веселин Ненков

2015 година
Книжка 6
Книжка 5
Книжка 4
Книжка 3
МОТИВАЦИОННИТЕ ЗАДАЧИ В ОБУЧЕНИЕТО ПО МАТЕМАТИКА

Румяна Маврова, Пенка Рангелова, Зара Данаилова-Стойнова

Книжка 2
САМОСТОЯТЕЛНО РЕШАВАНЕ НА ЗАДАЧИ С EXCEL

Пламен Пенев, Диана Стефанова

Книжка 1
ГЕОМЕТРИЧНА КОНСТРУКЦИЯ НА КРИВА НА ЧЕВА

Сава Гроздев, Веселин Ненков

2014 година
Книжка 6
КОНКУРЕНТНОСТ, ПОРОДЕНА ОТ ТАНГЕНТИ

Сава Гроздев, Веселин Ненков

Книжка 5
ИНФОРМАТИКА В ШКОЛАХ РОССИИ

С. А. Бешенков, Э. В. Миндзаева

ОЩЕ ЕВРИСТИКИ С EXCEL

Пламен Пенев

ДВА ПОДХОДА ЗА ИЗУЧАВАНЕ НА УРАВНЕНИЯ В НАЧАЛНАТА УЧИЛИЩНА МАТЕМАТИКА

Здравко Лалчев, Маргарита Върбанова, Ирина Вутова

Книжка 4
ОБУЧЕНИЕ В СТИЛ EDUTAINMENT С ИЗПОЛЗВАНЕ НА КОМПЮТЪРНА ГРАФИКА

Христо Крушков, Асен Рахнев, Мариана Крушкова

Книжка 3
ИНВЕРСИЯТА – МЕТОД В НАЧАЛНАТА УЧИЛИЩНА МАТЕМАТИКА

Здравко Лалчев, Маргарита Върбанова

СТИМУЛИРАНЕ НА ТВОРЧЕСКА АКТИВНОСТ ПРИ БИЛИНГВИ ЧРЕЗ ДИНАМИЧЕН СОФТУЕР

Сава Гроздев, Диана Стефанова, Калина Василева, Станислава Колева, Радка Тодорова

ПРОГРАМИРАНЕ НА ЧИСЛОВИ РЕДИЦИ

Ивайло Старибратов, Цветана Димитрова

Книжка 2
ФРАКТАЛЬНЫЕ МЕТО

Валерий Секованов, Елена Селезнева, Светлана Шляхтина

Книжка 1
ЕВРИСТИКА С EXCEL

Пламен Пенев

SOME INEQUALITIES IN THE TRIANGLE

Šefket Arslanagić

2013 година
Книжка 6
Книжка 5
МАТЕМАТИЧЕСКИЕ РЕГАТЬI

Александр Блинков

Книжка 4
Книжка 3
АКАДЕМИК ПЕТЪР КЕНДЕРОВ НА 70 ГОДИНИ

чл. кор. Юлиан Ревалски

ОБЛАЧНИ ТЕХНОЛОГИИ И ВЪЗМОЖНОСТИ ЗА ПРИЛОЖЕНИЕ В ОБРАЗОВАНИЕТО

Сава Гроздев, Иванка Марашева, Емил Делинов

СЪСТЕЗАТЕЛНИ ЗАДАЧИ ПО ИНФОРМАТИКА ЗА ГРУПА Е

Ивайло Старибратов, Цветана Димитрова

Книжка 2
ЕКСПЕРИМЕНТАЛНАТА МАТЕМАТИКА В УЧИЛИЩЕ

Сава Гроздев, Борислав Лазаров

МАТЕМАТИКА С КОМПЮТЪР

Сава Гроздев, Деко Деков

ЕЛИПТИЧЕН АРБЕЛОС

Пролет Лазарова

Книжка 1
ФРАГМЕНТИ ОТ ПАМЕТТА

Генчо Скордев

2012 година
Книжка 6
ДВЕ ДИДАКТИЧЕСКИ СТЪЛБИ

Сава Гроздев, Светлозар Дойчев

ТЕОРЕМА НА ПОНСЕЛЕ ЗА ЧЕТИРИЪГЪЛНИЦИ

Сава Гроздев, Веселин Ненков

ИЗЛИЧАНЕ НА ОБЕКТИВНИ ЗНАНИЯ ОТ ИНТЕРНЕТ

Ивайло Пенев, Пламен Пенев

Книжка 5
ДЕСЕТА МЕЖДУНАРОДНА ОЛИМПИАДА ПО ЛИНГВИСТИКА

д–р Иван А. Держански (ИМИ–БАН)

ТЕОРЕМА НА ВАН ОБЕЛ И ПРИЛОЖЕНИЯ

Тодорка Глушкова, Боян Златанов

МАТЕМАТИЧЕСКИ КЛУБ „СИГМА” В СВЕТЛИНАТА НА ПРОЕКТ УСПЕХ

Сава Гроздев, Иванка Марашева, Емил Делинов

I N M E M O R I A M

На 26 септември 2012 г. след продължително боледуване ни напусна проф. дпн Иван Ганчев Донев. Той е първият професор и първият доктор на науките в България по методика на обучението по математика. Роден е на 6 май 1935 г. в с. Страхилово, В. Търновско. След завършване на СУ “Св. Кл. Охридски” става учител по математика в гр. Свищов. Тук той организира първите кръжоци и със- тезания по математика. През 1960 г. Иван Ганчев печели конкурс за асистент в СУ и още през следващата година започ

Книжка 4
Книжка 3
СЛУЧАЙНО СЪРФИРАНЕ В ИНТЕРНЕТ

Евгения Стоименова

Книжка 2
SEEMOUS OLYMPIAD FOR UNIVERSITY STUDENTS

Sava Grozdev, Veselin Nenkov

EUROMATH SCIENTIFIC CONFERENCE

Sava Grozdev, Veselin Nenkov

FIVE WAYS TO SOLVE A PROBLEM FOR A TRIANGLE

Šefket Arslanagić, Dragoljub Milošević

ПРОПОРЦИИ

Валя Георгиева

ПЪТЕШЕСТВИЕ В СВЕТА НА КОМБИНАТОРИКАТА

Росица Керчева, Румяна Иванова

ПОЛЗОТВОРНА ПРОМЯНА

Ивайло Старибратов

Книжка 1
ЗА ЕЛЕКТРОННОТО ОБУЧЕНИЕ

Даниела Дурева (Тупарова)

МАТЕМАТИКАТА E ЗАБАВНА

Веселина Вълканова

СРАВНЯВАНЕ НА ИЗРАЗИ С КВАДРАТНИ КОРЕНИ

Гинка Бизова, Ваня Лалева