From 414aec98b546d11698af7fdcb441e8080da6e46a Mon Sep 17 00:00:00 2001 From: Stoycho Kyosev <68247567+stoychoX@users.noreply.github.com> Date: Thu, 12 May 2022 22:21:57 +0300 Subject: Add files via upload --- Utills/Kindle/readme.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Utills/Kindle/readme.md (limited to 'Utills/Kindle/readme.md') diff --git a/Utills/Kindle/readme.md b/Utills/Kindle/readme.md new file mode 100644 index 0000000..d31119a --- /dev/null +++ b/Utills/Kindle/readme.md @@ -0,0 +1,66 @@ +# Kindle + +## Помощни средства които използвахме +За решението на тази задача използваме клас string, клас vector и клас pair. String е взет директно от семинарите на първа група, с добавена функция getLine(), която използваме подобно на std::getline(); +Вектора е взет от семинарите на втора група. +Класът Pair е единствено с цел улеснение. Той представлява наредена двойка от два темплейтни типа. +Всяко едно нещо което сме направили с тези помощни средства може да се направи и без тях - просто кодът става по - дълъг. + +## Използване на командите +### Команди, които поддържаме преди да се логне потребител: +* login - влизаме в системата +* signup - регистрираме се в системата +* view - преглеждаме какви книги имаме +* save - запазваме текущия Kindle във файл +* load - зареждаме Kindle от файл +* exit - излизаме от системата +### Команди, които има потребител: +* read - прочита книга +* write - пише книга +* rate - оценява книга +* comment - коментира под книга +* rates - проверява рейтинга на книгата +* comments - проверява коментарите под книгата +* view - преглежда какви книги има +* exit - излиза от профила си +### Команди които имаме докато четем книга: +* n - следваща страница +* p - предишна страница +* @ + [number] - отива на страница, която е подадена +* h - показва/скрива help меню +* q - излиза от режим на четене + +Въвеждаме команда и натискаме Enter. След това програмата ни пита ако има нужда от допълнителна информация. Пример +``` +> login +> Enter user name: [Name] +> Enter user password: [Password] +> Success! +> +``` + +## Накратко за запазването във файлове +Имаме да запазваме сложна структура във файл. Това което можем да направим е да я разбием на по - прости. В Kindle имаме два вектора, които представляват книгите и потребителите. Ако измислим метод да запазим книга и потребител другото е лесно. Можете да видите, че в класовете представляващи книга и потребител имаме отделни функции, които се грижат за работата със запазването. +Логиката за тях е аналогична - разбиваме структурата на по - малки структурки, които стават все по - лесни и по - лесни за запазване. + +## Допълнителни бележки +В решението сме използвали friend класове. Това не винаги е лоша идея, но внимавайте с тях - възможно е да доведат до логически грешки, тоест на един клас да се дадат твърде много права над друг. + +При запазването на класа ще видите следния код +```cpp +outFile.write("#Ty", 4); +``` +При четенето на класа ще видите следния код +```cpp +char typeChecker[4]; +inFile.read(typeChecker, 4); +if (strcmp(typeChecker, "#Ty") != 0) { + std::cout << "Invalid file type" << std::endl; + return; +} +``` +Реално, няма как да гарантираме, че подадения файл ни е коректен. Потребителя винаги може да подаде некоректен файл, което може да счупи нашата система. За това правим следното: в началото на файла, който запазваме, записваме някаква последователност от n символа. Когато четем, прочитаме първите n (в случая 4) байта от файла и казваме - ако това е "тайният" низ, то значи този файл е писан от системата, тоест се очаква да е коректен. В противен случай приключваме изпълнението и не четем излишни данни, които могат да счупят системата ни. + +Също така, функционалността за промяна на книга оставяме на Вас. Чувствайте се свободни да експериментирате и pull-request вате. + +При каквито и да е въпроси екипът по ООП е на линия. \ No newline at end of file -- cgit v1.3.1-23-gd82d