Website Summary Files Commits Branches @commit @diff @stats
path: root / Week07 / Exercise01 / main.cpp
diff options
context:
space:
mode:
Commit945f7e67d6ca8047c961457786fac5e2d9a13d82 (patch)
Author
 Syndamia <kamen@syndamia.com>
2026-04-03 18:17:51 +0300
Committer
 Syndamia <kamen@syndamia.com>
2026-04-03 18:17:51 +0300
Files5c6b23aaee4eb653f9c461d7303edcd31d697f10 /Week07/Exercise01/main.cpp
oop-2025-solutions-945f7e67d6ca8047c961457786fac5e2d9a13d82.tar
oop-2025-solutions-945f7e67d6ca8047c961457786fac5e2d9a13d82.tar.gz
oop-2025-solutions-945f7e67d6ca8047c961457786fac5e2d9a13d82.zip
Parent8f162cde46a34d04e3a8a655067ee5174258e249 (diff)
feat(Week07): Add solutions
1 files changed, 382 insertions, 0 deletions
-rw-r--r--Week07/Exercise01/main.cpp382
diff --git a/Week07/Exercise01/main.cpp b/Week07/Exercise01/main.cpp
new file mode 100644
index 0000000..ca97b15
--- /dev/null
+++ b/Week07/Exercise01/main.cpp
@@ -0,0 +1,382 @@
+#include "OnlineLibrary.h"
+#include "LibraryBanking.h"
+#include "Transaction.h"
+#include <iostream>
+
+// Игнорираме всички букви до края на реда вкл.
+void ignoreLine() {
+ while (std::cin.get() != '\n');
+}
+
+// Тази функция ни позволява да приемем от входа низ с неограничена дължина
+String getlineEndless() {
+ String bufferString;
+ for (char buffer = std::cin.get(); buffer != '\n'; buffer = std::cin.get()) {
+ bufferString.AppendChar(buffer);
+ }
+ return bufferString;
+}
+
+void RegisterConsole(OnlineLibrary& lib, LibraryBanking& libBank) {
+ char c;
+ std::cin >> c;
+ switch (c) {
+ case 'u': {
+ User newUser;
+
+ std::cout << "Username: ";
+ ignoreLine();
+ newUser.SetEmail(getlineEndless());
+
+ std::cout << "Password: ";
+ newUser.SetPassword(getlineEndless());
+
+ std::cout << "Bank card: ";
+ unsigned bankCard;
+ std::cin >> bankCard;
+ newUser.SetBankCard(bankCard);
+
+ lib.RegisterUser(newUser);
+ }
+ break;
+ case 'l': {
+ std::cout << "Librarian Number: ";
+ unsigned number;
+ std::cin >> number;
+
+ Librarian newLib(number);
+
+ std::cout << "Password: ";
+ ignoreLine();
+ newLib.SetPassword(getlineEndless());
+
+ lib.RegisterLibrarian(newLib);
+ }
+ break;
+ case 'c': {
+ std::cout << "Clerk Number: ";
+ unsigned number;
+ std::cin >> number;
+
+ BankClerk newClerk(number);
+
+ std::cout << "Static password: ";
+ ignoreLine();
+ newClerk.SetPassword(getlineEndless());
+
+ libBank.RegisterClerk(newClerk);
+ }
+ break;
+ }
+}
+
+void UserConsole(OnlineLibrary& lib, LibraryBanking& libBank) {
+ std::cout << "Username: ";
+ ignoreLine();
+ String bufferUsername = getlineEndless();
+
+ std::cout << "Password: ";
+ String bufferPassword = getlineEndless();
+
+ User* loggedIn = lib.LoginUser(bufferUsername, bufferPassword);
+ if (loggedIn == nullptr) {
+ std::cout << "Invalid username or password!" << std::endl;
+ return;
+ }
+
+ while (true) {
+ char c;
+ std::cin >> c;
+ switch (c) {
+ case 'e':
+ return;
+ case 'l':
+ loggedIn->ListLibrary();
+ break;
+ case 'r': {
+ std::cout << "User library index: ";
+ unsigned i;
+ std::cin >> i;
+ const Book* book = loggedIn->GetBook(i);
+
+ if (book == nullptr) {
+ std::cout << "Invalid index!" << std::endl;
+ }
+ else {
+ std::cout << book->GetText().GetStr() << std::endl;
+ }
+ }
+ break;
+ case 's':
+ lib.ListBooks();
+ break;
+ case 'p': {
+ std::cout << "Book index: ";
+ unsigned i;
+ std::cin >> i;
+ const Book* book = lib.GetBook(i);
+
+ if (book == nullptr) {
+ std::cout << "Invalid index!" << std::endl;
+ }
+ else if (loggedIn->GetBankCard() == 0 && book->GetPrice() != 0.0) {
+ std::cout << "Cannot purchase book with invalid card!" << std::endl;
+ }
+ else {
+ lib.PurchaseBook(*book, *loggedIn, libBank);
+ loggedIn->AddBookToLibrary(book);
+ }
+ }
+ break;
+ case 't':
+ lib.ListTransactions(*loggedIn);
+ break;
+ case 'x': {
+ std::cout << "Output file: ";
+ ignoreLine();
+ String fileName = getlineEndless();
+
+ lib.ExportTransactions(*loggedIn, fileName);
+ }
+ break;
+
+ case 'P': {
+ std::cout << "New password: ";
+ ignoreLine();
+ String newPassword = getlineEndless();
+
+ loggedIn->SetPassword(newPassword);
+ }
+ break;
+ case 'C': {
+ std::cout << "New bank card: ";
+ unsigned newBankCard;
+ std::cin >> newBankCard;
+
+ loggedIn->SetBankCard(newBankCard);
+ }
+ break;
+ }
+ }
+}
+
+void LibrarianConsole(OnlineLibrary& lib) {
+ std::cout << "Librarian number: ";
+ unsigned bufferLibrarianNo;
+ std::cin >> bufferLibrarianNo;
+
+ std::cout << "Password: ";
+ ignoreLine();
+ String bufferPassword = getlineEndless();
+
+ Librarian* loggedIn = lib.LoginLibrarian(bufferLibrarianNo, bufferPassword);
+ if (loggedIn == nullptr) {
+ std::cout << "Invalid librarian number or password!" << std::endl;
+ return;
+ }
+
+ while (true) {
+ char c;
+ std::cin >> c;
+ switch (c) {
+ case 'e':
+ return;
+ // Не се изисква по условие, но е удобно
+ case 's':
+ lib.ListBooks();
+ break;
+ case 'a': {
+ Book newBook;
+ newBook.SetAvailableForPurchase(true);
+
+ std::cout << "Title: ";
+ ignoreLine();
+ newBook.SetTitle(getlineEndless());
+
+ std::cout << "Author: ";
+ newBook.SetAuthor(getlineEndless());
+
+ std::cout << "Year: ";
+ short year;
+ std::cin >> year;
+ newBook.SetYear(year);
+
+ std::cout << "Price: ";
+ double price;
+ std::cin >> price;
+ newBook.SetPrice(price);
+
+ ignoreLine();
+ String text;
+ char prevprev = std::cin.get(), prev = std::cin.get(), curr = std::cin.get();
+ while (prevprev != '\n' || prev != '.' || curr != '\n') {
+ text.AppendChar(prevprev);
+ std::cout << '[' << (int)prevprev << ',' << (int)prev << ',' << (int)curr << ']' << std::endl;
+
+ prevprev = prev;
+ prev = curr;
+ curr = std::cin.get();
+ }
+ text.AppendChar(prevprev);
+ newBook.SetText(text);
+
+ lib.AddBook(newBook);
+ }
+ break;
+ case 'i': {
+ Book newBook;
+ newBook.SetAvailableForPurchase(true);
+
+ std::cout << "File name: ";
+ ignoreLine();
+ if (newBook.Import(getlineEndless())) {
+ double price;
+ std::cout << "Price: ";
+ std::cin >> price;
+ newBook.SetPrice(price);
+
+ lib.AddBook(newBook);
+ }
+ }
+ break;
+ case 'x': {
+ std::cout << "Book index: ";
+ unsigned i;
+ std::cin >> i;
+ Book* book = lib.GetBook(i);
+
+ if (book == nullptr) {
+ std::cout << "Invalid index!" << std::endl;
+ }
+ else {
+ std::cout << "File name: ";
+ ignoreLine();
+ book->Export(getlineEndless());
+ }
+ }
+ break;
+ case 'E': {
+ std::cout << "Book index: ";
+ unsigned i;
+ std::cin >> i;
+ Book* book = lib.GetBook(i);
+
+ if (book == nullptr) {
+ std::cout << "Invalid index!" << std::endl;
+ }
+ else {
+ ignoreLine();
+ std::cout << "Title: ";
+ book->SetTitle(getlineEndless());
+
+ std::cout << "Author: ";
+ book->SetAuthor(getlineEndless());
+
+ std::cout << "Price: ";
+ double price;
+ std::cin >> price;
+ book->SetPrice(price);
+ }
+ }
+ break;
+ case 'A': {
+ std::cout << "Book index: ";
+ unsigned i;
+ std::cin >> i;
+ Book* book = lib.GetBook(i);
+
+ if (book == nullptr) {
+ std::cout << "Invalid index!" << std::endl;
+ }
+ else {
+ book->SetAvailableForPurchase(! book->GetAvailableForPurchase());
+ if (book->GetAvailableForPurchase()) {
+ std::cout << "Book is now available!" << std::endl;
+ }
+ else {
+ std::cout << "Book is now not available!" << std::endl;
+ }
+ }
+ }
+ break;
+ }
+ }
+}
+
+void ClerkConsole(LibraryBanking& libBank) {
+ std::cout << "Clerk number: ";
+ unsigned bufferClerkNo;
+ std::cin >> bufferClerkNo;
+
+ std::cout << "Dynamic password: ";
+ unsigned dynamicPassword;
+ std::cin >> dynamicPassword;
+
+ ignoreLine();
+ std::cout << "Static password: ";
+ String bufferPassword = getlineEndless();
+
+ BankClerk* loggedIn = libBank.LoginClerk(bufferClerkNo, dynamicPassword, bufferPassword);
+ if (loggedIn == nullptr) {
+ std::cout << "Invalid clerk number or password!" << std::endl;
+ return;
+ }
+
+ while (true) {
+ char c;
+ std::cin >> c;
+ switch (c) {
+ case 'e':
+ return;
+ case 'l':
+ libBank.ListPendingTransactions();
+ break;
+ case 'A':
+ case 'R': {
+ std::cout << "Transaction index: ";
+ unsigned i;
+ std::cin >> i;
+ Transaction* transaction = libBank.GetTransaction(i);
+
+ if (transaction == nullptr) {
+ std::cout << "Invalid index!" << std::endl;
+ }
+ else if (transaction->GetStatus() != STATUS_PENDING) {
+ std::cout << "Transaction not pending!" << std::endl;
+ }
+ else {
+ transaction->SetStatus(loggedIn->GetClerkNumber(), c == 'A' ? STATUS_ACCEPTED : STATUS_REJECTED);
+ }
+ }
+ break;
+ case 'x': {
+ std::cout << "File name: ";
+ ignoreLine();
+ libBank.ExportNonPendingTransactions(getlineEndless());
+ }
+ break;
+ }
+ }
+}
+
+// Поискано ни е да имплементираме система,
+// това да направим конзолен интерфейс се подразбира
+int main() {
+ OnlineLibrary lib;
+ LibraryBanking libBank;
+
+ while (true) {
+ char c;
+ std::cin >> c;
+ switch (c) {
+ case 'r': RegisterConsole(lib, libBank); break;
+ case 'u': UserConsole(lib, libBank); break;
+ case 'l': LibrarianConsole(lib); break;
+ case 'c': ClerkConsole(libBank); break;
+ case 'e': return 0;
+ default: std::cout << "Invalid!" << std::endl;
+ }
+ }
+
+ return 0;
+}