Примерни задачи за изпит

Задача 1.

Да се дефинират:

- базов клас  Person с два членове-данни: име и фамилия,  член-функции за достъп до данните, член-функции read и write за четене от файл и писане на файл на данните с параметър файлова променлива.

- производен  клас Student с член променлива факултетен номер, член-функция за достъп до данните и член-функции read и write (с параметър файлова променлива) за четене от файл и писане на файл на данните на обект от този клас.

Да се напише програма, която да чете файл с имена на хора (Person) и друг файл с имена на студенти (Student) и да създаде полиморфна колекция (вектор или масив) с тези данни. Накрая да изведе файл с всички хора и студенти, сортирани лексикографски по пълно име (първо по малко име, след това по фамилия).

Програмата трябва да се извиква от командния ред с три аргумента (на командния ред): име на входен файл с хора, име на входен файл със студенти и име на изходен файл.

Да се спазва формата за вход и изход, даден в примерните файлове:

Файл person.txt
John Doe
Adam Smith
Jane Black
Bob Robinson

Файл student.txt
Ivan Iliev F45353
Teodor Mitov P45235
Kaloian Stoianov F55325

Файл output.txt
Adam         Smith      
Bob          Robinson   
Ivan         Iliev        F55325
Jane         Black      
John         Doe        
Kaloian      Stoianov     F49115
Teodor       Mitov        P45235


Задача 2.

Да се дефинира клас-шаблон Triangle за модел на триъгълник със зададени дължини на трите му страни. Параметър на шаблона да бъде числов тип (int, long, double) за дължините на страните. Да се използва динамичен масив за съхраняване на тези дължини.

Да се напишат член-функции за пресмятане на обиколката и лицето на триъгълника.

Да се предефинират (поне 4) от следните операции:
1- Префиксна операция ++, която добавя по 1 към дължините на трите стр>ани.
2- Постфиксна операция ++, която добавя по 1 към дължините на трите страни.
3- Префиксна операция --, която изважда по 1 от дължините на трите страни.
4- Постфиксна операция --, която изважда по 1 от дължините на трите страни.
5- Операция >, за сравняване на два триъгълника според техните лица.
6- Операция <, за сравняване на два триъгълника според техните лица.
7- Операция изходен поток <<
8- Операция входен поток >>
9- Бинарна операция +, която създава нов триъгълник с дължини на страните - сума от дължините на страните на аргументите (събират се дължините на най-големите страни, на средните и на най-малките страни).
 10- Бинарна операция +, която създава нов триъгълник с дължина на страна - сума от дължината на страна първия аргумент и втория аргумент (число от типа на параметъра на шаблона).
11- Бинарна операция -, която създава нов триъгълник с дължина на страна - разлика от дължината на страна първия аргумент и втория аргумент.
12- Операция ==, която връща true когато триъгълниците за еднакви (подобни).
13- Операция !=, която връща true когато триъгълниците не са еднакви (подобни).
14- Операция !, която връща true само когато триъгълникът е правоъгълен.
15- Операция !, която връща true само когато триъгълникът е остроъгълен.
16- Операция !, която връща true само когато триъгълникът е тъпоъгълен.
17- Операция &&, която връща true когато триъгълниците имат еднакви дължини на поне една страна.
18- Операция ||, която връща true когато триъгълниците имат различни дължини на трите страни.
19- Унарна операция *, която връща дължината на най-голямата страна на триъгълника.
20- Бинарна операция *, с първи аргумент триъгълник с дължини на страните a, b, c и втори аргумент x - положително число от същия тип както страните на триъгълника, която конструира нов триъгълник с дължини на страните xa, xb,xc.
21- Бинарна операция , / с първи аргумент триъгълник с дължини на страните a, b, c и втори аргумент x - положително число от същия тип както страните на триъгълника, която конструира нов триъгълник с дължини на страните a/x, b/x, c/x (за целочислен тип на параметъра на шаблона делението е целочислено).

Когато трите числа, които трябва да бъдат страни на триъгълник, не могат да формират триъгълник, да се използват числата 1, 1, 1, т.е. да се конструира равностранен триъгълник с дължина на страната 1.

Да се дефинират "големите три" за управление на паметта. Да се демонстрира:

(a) разликата между инициализация и присвояване

Triangle<int> s;

Triangle<int> t = s;

и присвояване

Triangle<int> s(3, 4, 5);

Triangle<int> t;

s = t;

(b) Фактът, че конструираните обекти се унищожават автоматично.

(c) Фактът, че конструкторът за копиране се вика когато обект се предава на функция по стойност.
(d) Фактът, че конструкторът за копиране не се вика когато обект се предава на функция чрез псевдоним.
(e) Фактът, че конструкторът за копиране се вика при връщане на стойност на функция

Демонстрирайте всички написани член-функции и предефинирате операции.

Примерно решение ва задачата - triangle.cpp