Първо домашно
Моля, изпращайте решенията си като ZIP файл, в който има три директории с имена prog1, prog2 и prog3, по една за всяка задача. Във всяка директория поставете изходните и заглавните файлове за всяка задача. Моля, в архива поставяйте само изходни и заглавни файлове, не поставяйте проектни, обектни и изпълними файлове!
Задачите са за самостоятелна работа, при установено взаимстване между колеги и от Интернет домашното се анулира.
Моля, преди да изпратите решението си, уверете се, че файловете ви се компилират, в противен случай на съответната задача ще получите 0 точки!
Задача 1. (6 т.)
-
Да се реализира клас Song, който описва музикално изпълнение със следните свойства:
-
заглавие (низ до 100 символа)
-
изпълнител (низ до 100 символа)
-
година на издаване (цяло число)
-
дължина на песента (цяло число секунди)
-
оригинал (ако изпълнението е “кавър”, указател към оригиналната песен)
-
За класа Song да се реализират:
-
подходящи конструктори, селектори и мутатори
-
голяма четворка, ако е нужна
-
операция за извеждане на информация за песен на стандартния изход
-
Клас Album, който описва албум със следните полета:
-
списък от песни с произволна дължина
-
име на албума (низ до 100 символа)
-
За класа Album да се реализират
-
подходящи конструктори, селектори и мутатори
-
голяма четворка, ако е нужна
-
операция за извеждане на информация за албум на стандартния изход
-
операция getLength, която намира дължината на албума в секунди
-
операция getArtist, която връща името на изпълнителя на албума, ако всички песни са на един и същ изпълнител, или “Various Artists”, ако албумът се състои от песни на повече от един изпълнител
-
операция findSong, която връща указател към първата песен в албума с дадено име, или NULL, ако такава не е намерена
-
операция deleteDuplicates, която изтрива от албума всички дублиращи се песни. Две песни се считат за дублиращи се, ако за тях съвпадат заглавието, изпълнителя, годината на издаване и дължината
-
операция detectCovers, която засича “кавърите” в албума и насочва техните указатели към съответните оригиналните песни. Считаме, че една песен A е “кавър” на друга песен B, ако:
-
A и B имат едно и също заглавие, но различен изпълнител
-
A е издадена след B и в албума няма песен, която да отговаря на предното условие и е по-рано издадена от B
-
Да се реализира примерна програма, която демонстрира всички гореизброени операции
Задача 2. (7 т.) Да се реализира клас Course, който описва разписанието на лекциите на курс във ФМИ през даден семестър със следните полета:
-
име на курса (низ с произволна дължина)
-
специалност (низ до 30 символа, като празен низ означава, че курсът е избираем)
-
година (число от 0 до 4, като 0 означава избираем курс)
-
поток (число от 0 до 2, като 0 означава избираем курс)
-
ден от седмицата (число от 1 до 6)
-
начален час (число от 7 до 20) и продължителност (число от 1 до 6), като курсът не може да завършва по-късно от 21 часа
-
аудитория (число от 1 до 599)
За класа да се реализират подходящи конструктори, селектори и мутатори и операции за вход (>>) и изход (<<).
Да се реализира клас SemesterSchedule, който представя програмата за даден семестър във ФМИ като съдържа:
-
масив с произволна дължина от обекти от клас Course,
-
масив от числа, описващ наличните във ФМИ аудиторни зали.
За класа да се реализират следните операции:
-
операция addCourse за добавяне на нов курс към програмата. Операцията е успешна само ако:
-
курсът задава коректна аудиторна зала,
И -
в програмата няма друг курс, който е:
-
по същото време в същата зала,
ИЛИ -
по същото време и е обявен за същия поток, курс и специалност, като изключение правят избираемите курсове.
-
в случай на конфликт, на стандартния изход за грешка (cerr) да се извежда информация за курса, с който се получава конфликт
-
операция printAuditoriumSchedule, която извежда програмата по дни за дадена аудитория
-
операция printClassSchedule, която извежда програмата по дни за даден поток на даден курс на дадена специалност. При подходящи стойности на параметрите да се извежда програмата на избираемите курсове.
-
операция findFreeSlot, която добавя в програмата даден курс, като автоматично намира време и зала, в която може да се проведе курса. Операцията да се съобразява с това да не се получава конфликт с вече съществуващ курс. Операцията е неуспешна, ако не могат да се намерят подходящи време и зала за дадения курс.
Задача 3. (7 т.) Да се реализира клас String, който представя низ (поредица от символи) чрез верига от двойни кутии. Например, низът “Hello” да се представя по следния начин:
За класа да се реализират подходящи функции, така че да са допустими следните операции:
-
String eps; // дефинира празен низ
-
String s = “Hello”; // дефинира низ със стойност “Hello”
-
String s2 = s; // дефинира s2 като копие на s
-
String s3; s3 = s; // дефинира празен s3 и копира s в него
-
cin >> s; // въвежда низа s от стандартния вход
-
cout << s; // извежда низа s на стандартния изход
-
s = “Hello”; // s получава стойност “Hello”
-
s[4] // връща символа на 4-а позиция, ‘o’
-
s[1] = ‘a’; // променя втората буква на s, така че
// s става “Hallo”, връща резултат s[1] -
s + s2 // конкатенира s и s2, резултат “HalloHello”
-
s + “, world!” // резултат “Hallo, world!
-
“Friend, “ + s // резултат “Friend, Hallo”
-
‘#’ + s // резултат “#Hallo”
-
s + ‘!’ // резултат “Hallo!”
-
s += ‘!’ // s става “Hallo!”, връща резултат s
-
s += “?!” // s става “Hallo!?!”, връща резултат s
-
s * 3 // връща “Hallo!?!Hallo!?!Hallo!?!”
-
s *= 3 // s става “Hallo!?!Hallo!?!Hallo!?!”
-
s2 == s3 // проверява дали s2 и s3 са равни (true)
-
s != s2 // проверява дали s и s2 са различни (true)
-
s < s2 // проверява дали s е преди s2 (true)
-
s2 < s3 // проверява дали s2 е преди s3 (false)
-
s + ‘a’ >= s // проверява дали s + ‘a’ не е преди s (true)
-
s <= s + ‘b’ // проверява дали s не е след s + ‘b’ (true)
-
s[‘?’] // намира първото срещане на ‘?’ в s (6)
-
s[‘*’] // ако няма такъв символ, връща -1
-
s[“llo”] // намира първото срещане на “llo” в s (2)
-
s[“ell”] // ако няма такъв подниз, връща -1
-
s() // връща дължината на s (24)
-
s(18) // връща подниз на s от 18-тата позиция до края
// резултат “llo!?!” -
s(4,8) // връща подниз на s от 4-а до 8-а позиция
// включително, резултат “o!?!H”