# Задачи - ООП, Седмица 13, 20.05.2026 'define expected-reading 3 min 'define created 20 May 2026 'define edited 20 May 2026 [$pagenav] ## За решаване ### Задача 1 Реализирайте абстрактен клас [`Numeric`], който съдържа чисто виртуални функции: .bulleted - [`operator+`] - унарен [`operator-`] - бинарен [`operator-`] - [`operator+=`] - [`operator-=`] Реализирайте негови наследници [`Integer`] и [`Float`], които съответно имплементират операции върху [`int`] и [`float`] стойности. ### Задача 2 Реализирайте клас [`User`], който съхранява идентификационен номер и входен ПИН код. Имплементирайте (виртуална) член-функция [`LogIn`], която връща дали подадения ѝ ПИН код съответства на запазения. Реализирайте наследник [`Citizen`], който разширява функцията [`LogIn`], така че винаги да отказва числа, които имат повече от 4 цифри. Реализирайте наследник (на [`User`]) [`Clerk`], който допълнително съхранява статичен код. [`LogIn`] в този случай е успешен, когато [`((ВХОДЕН_ПИН + СЪХРАНЕН_ПИН) * СТАТИЧЕН_КОД) % 115249 = 347`]. Пример за валидни стойности са 700 за съхранен пин, 3141 за входен пин и 47978 за статичен код. Реализирайте наследник (на [`User`]) [`System`], при който [`LogIn`] е валидно, когато подадения пин е точен квадрат на съхранения пин. От входа получавате неотрицателно цяло число [`N`] и след това данни за [`N`] на брой потребителя. При всеки потребител се поисква буква, определяща неговия тип: [`c`] за [`Citizen`], [`l`] за [`Clerk`] и [`s`] за [`System`]. Трябва да съхраните всички потребители в [=полиморфен=] масив с елементи от тип [`User*`]. След това от входа ще получавате идентификационен номер и пин код, и трябва да върнете дали подадените данни са валидни за влизане в акаунта. ### Задача 3 Реализирайте клас [`String`], който съхранява динамично-задлен низ. Освен голяма петица, имплементирайте виртуален мутатор и константен селектор към низа. Реализирайте клас [`Username`], наследник на [`String`], чиито мутатор приема единствено низове, които съдържат само главни и малки латински букви. Реализирайте клас [`Match`], наследник на [`String`], който съхранява допълнителен динамично-заделен низ [`pattern`] и бройка [`matches`]. За [`pattern`] има друг селектор и мутатор. При всяка промяна на [`pattern`] и оригиналния низ, [`matches`] се обновява с бройката (потенциално препокриващи се) срещания на [`pattern`] в низа. ### Задача 4 Реализирайте шаблонен клас [`Indexable`], който съхранява чисто-виртуален не-константен [`operator[]`], и имплементира константен [`operator[]`], базиран на не-константния. Реализирайте клас [`Compareable`], който съхранява чисто-виртуални [`operator<`] и [`operator==`], и имплементира останалите оператори за сравнение ([`<=`], [`>`], [`>=`], [`!=`]), използвайки чисто-виртуалните. Реализирайте клас [`Dynamic`], който въхранява чисто-виртуални не-публични методи [`free`], [`copyFrom`] и [`init`], и имплементира компонентите от голямата петица, използвайки тези методи. Реализирайте клас [`Vector`], който съхранява динамично-заделен масив от елементи и е наследник и на трите класа. Сравненията между вектори са спрямо бройката елементи. Реализирайте клас [`Integer`], който съхранява динамично-заделен [`int`] и наследява [`Compareable`] и [`Dynamic`]. Реализирайте шаблонен клас [`Array`], който съхранява статично-заделен масив, чиито елементи и тяхна бройка се подават като част от типа, и който наследява [`Indexable`] и [`Compareable`]. Сравненията между масиви са спрямо бройката елементи.