Форум за въпроси

Въпроси по домашната работа

Re: Въпроси по домашната работа

от Трифон Трифонов -
Number of replies: 0

Отговорите на въпросите са по-долу:

  • В класа Dictionary стойността на изтритите вече контакти с NULL ли трябва да се замества, или е по-добре да се реализира метод за изтриване на елемент (двойка ключ-стойност) от речника?
    • В задачата не е указано, следователно имате избор да го реализирате както намерите за добре.
  • Не е ли по-смислено Contact да е структура вместо клас? Така няма да има нужда да се реализират селектори и мутатори за него.
    • Така е, но пък няма да може да се прави проверка за коректност, която би се правила със мутаторите, например. По-добре като клас.
  • Кой е по-добрият вариант: класът ContactBook да е приятелски спрямо Dictionary с цел да може да му се достъпват член-данните (например за да се обходят ключовете и/или стойностите му), или да се реализират подходящи селектори за достъп до началото и края на масивите с ключове и стойности?
    • Не е добре ContactBook да е приятел на Dictionary. Има някакъв смисъл Dictionary да е приятел на ContactBook, но по-добре да се избегне, ако е възможно.
  • Нали не е задължително имената на контактите да са уникални? Т. е. да е възможно няколко души да са с едни и същи имена, като номерата и идентификаторите им са различни? В такъв случай чрез речника за достъп по име ще може да се достъпи само един от контактите с еднакви имена (реших, че е най-смислено да е този с най-малкия идентификатор по лексикографска наредба).
    • Да, възможно е да има съвпадение на имената. Макар че не е указано какво се прави в случай на конфликт, варианти са: избиране на някой от тях (напр. най-малък по идентификатор) или връщане на всички по някакъв начин. Отново, реализирайте както намерите за добре.
  • Грешка ли е, ако в класа ContactBook използвам претоварвания (overload-вания) на методите за намиране и премахване на контакт, приемащи като аргументи класовете Name, PhoneNumber и Id, наследяващи класа std::string, и едно претоварване, приемащо като аргументи std::string и параметър от изброен тип CONTACT_FIELD_TYPE, указващ дали въпросният std::string представлява име, телефонен номер или идентификатор?
    • Не е грешка, по-скоро ми се струва като интересно решение, макар и малко усложнено.
  • При добавяне на нов контакт в книгата трябва ли да се прави проверка дали той вече съществува (и ако съществува, да не се прави нищо), или, ако съществува, направо да се замества с новия контакт? Все пак е възможно контактът да съвпада само по някои свои полета, а не по всички, например да се различава само по телефонен номер (въпросният човек си е сменил номера) или по име (номерът вече принадлежи на друг човек), така че е смислено да има начин контактите в книгата да може да се променят.
    • Не е изрично указано какво трябва да се прави в този случай, така че можете сами да изберете поведението, което ви се струва най-смислено.
  • Щом методът за намиране на контакт не трябва да позволява промяната му, по-смислено ли е самият контакт да се връща като резултат (тип Contact), а не псевдоним към него (тип Contact&)?
    • Това не са единствените варианти за връщан резултат, така че да не се позволява промяна, има и по-добри решения. Със сигурност, връщането на Contact& е грешка, понеже позволява промяна.

По втората задача:

  • Имаме ли право да ползваме стандартните библиотеки на C++ при парсването (десериализацията) (конкретно имам предвид <string> и <sstream> и класовете std::string и std::istringstream), или за токенизация да ползвам функцията strtok, а за преобразуване на низ към double - atof?
    • Да
  • При обработката (десериализацията) на формулите взима ли се предвид приоритетът на операциите? В примерите, дадени в условието, всяка двуместна операция е оградена със скоби. Това винаги ли трябва да е така и трябва ли да се задължава потребителят да въвежда формулите по този начин?
    • Да, винаги двуместните операции са оградени със скоби, т.е. няма приоритет на операциите.
  • Трябва ли да се грижа по някакъв начин за динамично заделената памет в рамките на функцията readFormula() (например да я сложа в клас, в който деструкторът да освобождава заделената памет, към която са запазени указатели, които са член-данни на класа)?
    • Добре е да се грижите за правилното управление на паметта за десериализацията.

Освен това, дали е възможно да добавяме допълнителна функционалност (методи, класове и т. н.), различни от указаните в условието (с цел улеснение)?

Разбира се, че е възможно :)