From 080cb0e79ecf5132c56ae73ca0b32de450658dfa Mon Sep 17 00:00:00 2001 From: Christopher Sanden Date: Wed, 5 Nov 2025 23:36:54 +0100 Subject: [PATCH] cleaning up excess projects --- Exam/IKT203Exam/.gitignore | 5 - Exam/IKT203Exam/.idea/.gitignore | 8 - Exam/IKT203Exam/.idea/.name | 1 - Exam/IKT203Exam/.idea/IKT203-main.iml | 2 - Exam/IKT203Exam/.idea/editor.xml | 343 -- .../.idea/material_theme_project_new.xml | 10 - Exam/IKT203Exam/.idea/misc.xml | 7 - Exam/IKT203Exam/.idea/modules.xml | 8 - Exam/IKT203Exam/.idea/vcs.xml | 6 - Exam/IKT203Exam/CMakeLists.txt | 28 - Exam/IKT203Exam/CMakePresets.json | 61 - Exam/IKT203Exam/DATA/city_graph.txt | 37 - Exam/IKT203Exam/DATA/network_graph.txt | 29 - Exam/IKT203Exam/DATA/random_names.txt | 5401 ----------------- Exam/IKT203Exam/DATA/songs.txt | 51 - Exam/IKT203Exam/LibExample/CMakeLists.txt | 32 - .../TCircularDoublyLinkedListTemplate.hpp | 454 -- .../LibExample/TDoublyLinkedListTemplate.hpp | 340 -- .../LibExample/TSingleLinkedListTemplate.hpp | 529 -- Exam/IKT203Exam/LibExample/list.hpp | 309 - Exam/IKT203Exam/LibExample/queue.hpp | 73 - Exam/IKT203Exam/LibExample/stack.hpp | 79 - .../Portfolio/Assignment-01/CMakeLists.txt | 40 - .../Portfolio/Assignment-01/main.cpp | 60 - .../Portfolio/Assignment-01/option1.cpp | 109 - .../Portfolio/Assignment-01/option1.h | 11 - .../Portfolio/Assignment-01/option2.cpp | 19 - .../Portfolio/Assignment-01/option2.h | 10 - .../Portfolio/Assignment-02/CMakeLists.txt | 40 - .../Portfolio/Assignment-02/main.cpp | 57 - .../Portfolio/Assignment-02/option1.cpp | 36 - .../Portfolio/Assignment-02/option1.h | 11 - .../Portfolio/Assignment-02/option2.cpp | 8 - .../Portfolio/Assignment-02/option2.h | 10 - .../Portfolio/Assignment-03/CMakeLists.txt | 39 - .../Portfolio/Assignment-03/main.cpp | 54 - .../Portfolio/Assignment-03/option1.cpp | 6 - .../Portfolio/Assignment-03/option1.h | 9 - .../Portfolio/Assignment-03/option2.cpp | 6 - .../Portfolio/Assignment-03/option2.h | 9 - .../Portfolio/Assignment-04/CMakeLists.txt | 37 - .../Portfolio/Assignment-04/main.cpp | 53 - .../Portfolio/Assignment-04/option1.cpp | 6 - .../Portfolio/Assignment-04/option1.h | 9 - .../Portfolio/Assignment-04/option2.cpp | 47 - .../Portfolio/Assignment-04/option2.h | 9 - Exam/IKT203Exam/Portfolio/CMakeLists.txt | 20 - .../IKT203_ Final Portfolio Assignment.pdf | Bin 372454 -> 0 bytes .../Portfolio/SharedLib/CMakeLists.txt | 39 - .../Portfolio/SharedLib/FileReaderUtils.cpp | 32 - .../Portfolio/SharedLib/FileReaderUtils.h | 13 - .../Portfolio/SharedLib/ReadGraph.cpp | 109 - .../Portfolio/SharedLib/ReadNames.cpp | 55 - .../Portfolio/SharedLib/ReadSongs.cpp | 60 - .../Portfolio/SharedLib/SharedLib.h | 100 - .../Portfolio/SharedLib/TDoublyLinkedList.cpp | 114 - .../Portfolio/SharedLib/TDoublyLinkedList.h | 60 - .../IKT203Exam/Portfolio/SharedLib/TQueue.cpp | 47 - Exam/IKT203Exam/Portfolio/SharedLib/TQueue.h | 28 - .../IKT203Exam/Portfolio/SharedLib/TStack.cpp | 36 - Exam/IKT203Exam/Portfolio/SharedLib/TStack.h | 37 - Exam/IKT203Exam/Portfolio/SharedLib/Utils.cpp | 78 - Exam/IKT203Exam/Portfolio/SharedLib/Utils.h | 26 - Exam/IKT203Exam/Submissions/CMakeLists.txt | 19 - .../Submissions/Submission-01/CMakeLists.txt | 13 - .../Submissions/Submission-01/main.cpp | 309 - .../Submissions/Submission-01/main.h | 8 - .../Submissions/Submission-02/CMakeLists.txt | 13 - .../Submissions/Submission-02/main.cpp | 121 - .../Submissions/Submission-02/main.h | 8 - .../Submissions/Submission-03/CMakeLists.txt | 13 - .../Submissions/Submission-03/main.cpp | 439 -- .../Submissions/Submission-03/main.h | 8 - .../Submissions/Submission-04/BankAccount.cpp | 108 - .../Submissions/Submission-04/BankAccount.h | 52 - .../Submission-04/BankAccountList.cpp | 130 - .../Submission-04/BankAccountList.h | 51 - .../Submissions/Submission-04/CMakeLists.txt | 25 - .../Submissions/Submission-04/ReadNames.cpp | 31 - .../Submissions/Submission-04/ReadNames.h | 30 - .../Submissions/Submission-04/main.cpp | 180 - .../Submissions/Submission-04/main.h | 8 - .../Submissions/Submission-05/CMakeLists.txt | 13 - .../Submissions/Submission-05/main.cpp | 828 --- .../Submissions/Submission-05/main.h | 8 - Exam/IKT203Exam/deploy.ps1 | 58 - 86 files changed, 11835 deletions(-) delete mode 100644 Exam/IKT203Exam/.gitignore delete mode 100644 Exam/IKT203Exam/.idea/.gitignore delete mode 100644 Exam/IKT203Exam/.idea/.name delete mode 100644 Exam/IKT203Exam/.idea/IKT203-main.iml delete mode 100644 Exam/IKT203Exam/.idea/editor.xml delete mode 100644 Exam/IKT203Exam/.idea/material_theme_project_new.xml delete mode 100644 Exam/IKT203Exam/.idea/misc.xml delete mode 100644 Exam/IKT203Exam/.idea/modules.xml delete mode 100644 Exam/IKT203Exam/.idea/vcs.xml delete mode 100644 Exam/IKT203Exam/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/CMakePresets.json delete mode 100644 Exam/IKT203Exam/DATA/city_graph.txt delete mode 100644 Exam/IKT203Exam/DATA/network_graph.txt delete mode 100644 Exam/IKT203Exam/DATA/random_names.txt delete mode 100644 Exam/IKT203Exam/DATA/songs.txt delete mode 100644 Exam/IKT203Exam/LibExample/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/LibExample/TCircularDoublyLinkedListTemplate.hpp delete mode 100644 Exam/IKT203Exam/LibExample/TDoublyLinkedListTemplate.hpp delete mode 100644 Exam/IKT203Exam/LibExample/TSingleLinkedListTemplate.hpp delete mode 100644 Exam/IKT203Exam/LibExample/list.hpp delete mode 100644 Exam/IKT203Exam/LibExample/queue.hpp delete mode 100644 Exam/IKT203Exam/LibExample/stack.hpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-01/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-01/main.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-01/option1.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-01/option1.h delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-01/option2.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-01/option2.h delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-02/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-02/main.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-02/option1.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-02/option1.h delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-02/option2.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-02/option2.h delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-03/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-03/main.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-03/option1.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-03/option1.h delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-03/option2.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-03/option2.h delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-04/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-04/main.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-04/option1.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-04/option1.h delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-04/option2.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/Assignment-04/option2.h delete mode 100644 Exam/IKT203Exam/Portfolio/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Portfolio/IKT203_ Final Portfolio Assignment.pdf delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/FileReaderUtils.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/FileReaderUtils.h delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/ReadGraph.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/ReadNames.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/ReadSongs.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/SharedLib.h delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/TDoublyLinkedList.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/TDoublyLinkedList.h delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/TQueue.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/TQueue.h delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/TStack.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/TStack.h delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/Utils.cpp delete mode 100644 Exam/IKT203Exam/Portfolio/SharedLib/Utils.h delete mode 100644 Exam/IKT203Exam/Submissions/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Submissions/Submission-01/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Submissions/Submission-01/main.cpp delete mode 100644 Exam/IKT203Exam/Submissions/Submission-01/main.h delete mode 100644 Exam/IKT203Exam/Submissions/Submission-02/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Submissions/Submission-02/main.cpp delete mode 100644 Exam/IKT203Exam/Submissions/Submission-02/main.h delete mode 100644 Exam/IKT203Exam/Submissions/Submission-03/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Submissions/Submission-03/main.cpp delete mode 100644 Exam/IKT203Exam/Submissions/Submission-03/main.h delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/BankAccount.cpp delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/BankAccount.h delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/BankAccountList.cpp delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/BankAccountList.h delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/ReadNames.cpp delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/ReadNames.h delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/main.cpp delete mode 100644 Exam/IKT203Exam/Submissions/Submission-04/main.h delete mode 100644 Exam/IKT203Exam/Submissions/Submission-05/CMakeLists.txt delete mode 100644 Exam/IKT203Exam/Submissions/Submission-05/main.cpp delete mode 100644 Exam/IKT203Exam/Submissions/Submission-05/main.h delete mode 100644 Exam/IKT203Exam/deploy.ps1 diff --git a/Exam/IKT203Exam/.gitignore b/Exam/IKT203Exam/.gitignore deleted file mode 100644 index 5057ecf..0000000 --- a/Exam/IKT203Exam/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Ignore Visual Studio cache -.vs/ - -# Ignore build/output directory -out/ \ No newline at end of file diff --git a/Exam/IKT203Exam/.idea/.gitignore b/Exam/IKT203Exam/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/Exam/IKT203Exam/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/Exam/IKT203Exam/.idea/.name b/Exam/IKT203Exam/.idea/.name deleted file mode 100644 index b50dd3f..0000000 --- a/Exam/IKT203Exam/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -IKT203_Course_Assignments \ No newline at end of file diff --git a/Exam/IKT203Exam/.idea/IKT203-main.iml b/Exam/IKT203Exam/.idea/IKT203-main.iml deleted file mode 100644 index f08604b..0000000 --- a/Exam/IKT203Exam/.idea/IKT203-main.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/Exam/IKT203Exam/.idea/editor.xml b/Exam/IKT203Exam/.idea/editor.xml deleted file mode 100644 index 9cf688e..0000000 --- a/Exam/IKT203Exam/.idea/editor.xml +++ /dev/null @@ -1,343 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Exam/IKT203Exam/.idea/material_theme_project_new.xml b/Exam/IKT203Exam/.idea/material_theme_project_new.xml deleted file mode 100644 index 32939b5..0000000 --- a/Exam/IKT203Exam/.idea/material_theme_project_new.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Exam/IKT203Exam/.idea/misc.xml b/Exam/IKT203Exam/.idea/misc.xml deleted file mode 100644 index 0b76fe5..0000000 --- a/Exam/IKT203Exam/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Exam/IKT203Exam/.idea/modules.xml b/Exam/IKT203Exam/.idea/modules.xml deleted file mode 100644 index 290b5dd..0000000 --- a/Exam/IKT203Exam/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/Exam/IKT203Exam/.idea/vcs.xml b/Exam/IKT203Exam/.idea/vcs.xml deleted file mode 100644 index b2bdec2..0000000 --- a/Exam/IKT203Exam/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Exam/IKT203Exam/CMakeLists.txt b/Exam/IKT203Exam/CMakeLists.txt deleted file mode 100644 index 4dd6f96..0000000 --- a/Exam/IKT203Exam/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -# Set the minimum version of CMake required to build this project. -# This ensures that older versions of CMake don't try to run with features they don't understand. -cmake_minimum_required(VERSION 3.20) - -# Define the project name. This will be the top-level name in Visual Studio. -# It also enables the C++ language (CXX). -project(IKT203_Course_Assignments LANGUAGES CXX) - -# We enforce C++17 (or C++20 if you prefer) for the entire project. -# All targets (exercises, libraries, etc.) will inherit this setting. -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - -if(MSVC) - add_compile_options("/Zc:__cplusplus") -endif() - -# This is the core of the orchestration. CMake will now step into each of these -# folders and process their own CMakeLists.txt files. -# The order matters here: we add LibExample first so that its library is -# defined before the executables that need to link to it. - -add_subdirectory(LibExample) -add_subdirectory(Submissions) -add_subdirectory(Portfolio) - -# --- End of File --- \ No newline at end of file diff --git a/Exam/IKT203Exam/CMakePresets.json b/Exam/IKT203Exam/CMakePresets.json deleted file mode 100644 index b57aba8..0000000 --- a/Exam/IKT203Exam/CMakePresets.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "version": 3, - "configurePresets": [ - { - "name": "windows-base", - "hidden": true, - "generator": "Visual Studio 17 2022", - "binaryDir": "${sourceDir}/out/build/${presetName}", - "installDir": "${sourceDir}/out/install/${presetName}", - "cacheVariables": { - "CMAKE_C_COMPILER": "cl.exe", - "CMAKE_CXX_COMPILER": "cl.exe" - }, - "condition": { - "type": "equals", - "lhs": "${hostSystemName}", - "rhs": "Windows" - } - }, - { - "name": "x64-debug", - "displayName": "x64 Debug", - "inherits": "windows-base", - "architecture": { - "value": "x64", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug" - } - }, - { - "name": "x64-release", - "displayName": "x64 Release", - "inherits": "x64-debug", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release" - } - }, - { - "name": "x86-debug", - "displayName": "x86 Debug", - "inherits": "windows-base", - "architecture": { - "value": "x86", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug" - } - }, - { - "name": "x86-release", - "displayName": "x86 Release", - "inherits": "x86-debug", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release" - } - } - ] -} \ No newline at end of file diff --git a/Exam/IKT203Exam/DATA/city_graph.txt b/Exam/IKT203Exam/DATA/city_graph.txt deleted file mode 100644 index 405307b..0000000 --- a/Exam/IKT203Exam/DATA/city_graph.txt +++ /dev/null @@ -1,37 +0,0 @@ -[NODES;records:=9] -Oslo -Bergen -Trondheim -Stavanger -Kristiansand -Ålesund -Molde -Bodø -Tromsø -[EDGES;records:=26] -Oslo;Bergen;450 -Bergen;Oslo;460 -Oslo;Trondheim;820 -Trondheim;Oslo;790 -Oslo;Stavanger;600 -Stavanger;Oslo;650 -Bergen;Stavanger;210 -Stavanger;Bergen;190 -Bergen;Trondheim;540 -Trondheim;Bergen;520 -Trondheim;Ålesund;220 -Ålesund;Trondheim;240 -Ålesund;Bergen;310 -Bergen;Ålesund;300 -Stavanger;Kristiansand;180 -Kristiansand;Stavanger;170 -Kristiansand;Oslo;400 -Oslo;Kristiansand;410 -Trondheim;Bodø;600 -Bodø;Trondheim;620 -Bodø;Tromsø;500 -Tromsø;Bodø;480 -Ålesund;Molde;130 -Molde;Ålesund;120 -Molde;Trondheim;260 -Trondheim;Molde;250 \ No newline at end of file diff --git a/Exam/IKT203Exam/DATA/network_graph.txt b/Exam/IKT203Exam/DATA/network_graph.txt deleted file mode 100644 index e47be45..0000000 --- a/Exam/IKT203Exam/DATA/network_graph.txt +++ /dev/null @@ -1,29 +0,0 @@ -[NODES;records:=11] -WebServer -Router1 -AuthService -CacheServer -Database -APIGateway -LoadBalancer -Firewall -AnalyticsServer -BackupServer -FileServer -[EDGES;records:=16] -WebServer;Router1;4 -WebServer;AuthService;8 -WebServer;CacheServer;5 -Router1;Database;3 -Router1;LoadBalancer;2 -Router1;Firewall;7 -AuthService;Database;2 -AuthService;APIGateway;6 -CacheServer;LoadBalancer;4 -CacheServer;FileServer;3 -FileServer;BackupServer;9 -Database;AnalyticsServer;5 -APIGateway;AnalyticsServer;4 -LoadBalancer;Firewall;3 -Firewall;BackupServer;8 -AnalyticsServer;BackupServer;7 \ No newline at end of file diff --git a/Exam/IKT203Exam/DATA/random_names.txt b/Exam/IKT203Exam/DATA/random_names.txt deleted file mode 100644 index deb18fd..0000000 --- a/Exam/IKT203Exam/DATA/random_names.txt +++ /dev/null @@ -1,5401 +0,0 @@ -[records:=5400] -Adryan Mandel -Rayah Steinke -Jay Villa -Nisa Laskowski -Zarya Gerry -Aster Lammers -Jacquelyn Escamilla -Jayden Walker -Adna Klassen -Vita Mcelhaney -Ibrahim Brandt -Warren Case -Alasia Wargo -Maris Hallock -Khaliyah Evangelista -Edson Sackett -Saria Beech -Braysen Krieg -Conner Lindsey -Dora Glynn -Blake Gould -Reyaan Kulp -Celestine Sala -Breya Woodside -Abdurrahman Charbonneau -Terry Holbrook -Dalary Coyle -Leigh Cotten -Caitlyn Magana -Cecilia Manning -Aubriana Altman -Cleveland Parmenter -Gurleen Hagans -Ahri Gillett -Kepler Ohalloran -Sailor Bey -Elvira Nickell -Emileigh Eichelberger -Isaac Ramirez -Allyanna Swinford -Carolynn Mincey -Keylan Schreck -Ayelen Darr -Stephon Armendariz -Analee Pond -Emmeline Cartwright -Onyx Shuster -Dinah Strait -Hasan Vergara -Kaisyn Dehoyos -Shaylyn Glasser -Yetzali Moynihan -Azaan Loredo -Riaan Conroy -Damani Caesar -Domenic Cockrell -Rey Coe -Malaki Whitmore -Kaitlynn Osorio -Lavell Brogdon -Jaeda Deane -Nirvan Broadus -Lennox Mckinley -Fernando Stokes -Lynnix Peart -Alize Zayas -Mariely Harshbarger -Shmuel Guillory -Alahna Roos -Silvano Preece -Gia Barr -Reeva Heine -Lilliann Hazlett -Jadiel Colbert -Jayde Winston -Marigold Rutkowski -Jessi Durden -Marina Tang -Charlene Pence -Audra Meehan -Keeva Litchfield -Lulu Prasad -Kaliah Delvalle -Charley Ives -Ziyon Watterson -Scottlyn Lazarus -Demetrius Schmitz -Abella Rudy -Sarenity Moorer -Jewel Hurd -Cassia Wampler -Zaedyn Witcher -Aariana Baskerville -Golden Grinnell -Kaito Skeen -Braydin Schuh -Kynlee Gregg -Jaice Knecht -Zayna Rausch -Anastazia Nealy -Tevita Janik -Joanne Perea -Anabia Yowell -Neely Depalma -Codi Rubenstein -Sora Behnke -Kamryn Fair -Ronan Baxter -Damiya Egbert -Qusai Clymer -Katiana Mosely -Harleigh Busch -Beaux Correia -Felipe Engle -Evelina Tharp -Anabelle Crews -Selene Joiner -Lucianna Sisco -Krista Bunn -Elwood Lippert -Aubreigh Fabian -Rania Mcwhorter -Kaylan Abram -Karianna Bridwell -Stassi Marcos -Dartagnan Morano -Braxtyn Comstock -Tyree Boston -Kavin Hernandes -Jaelle Trigg -Braylen Valentine -Emersen Kiel -Devontae Sylvia -Kim Mckeown -Mataya Mager -Saxon Hinz -Henson Cowden -Yara Call -Reeve Viramontes -Clarke Duck -Evalynn Hirsch -Lennox Mckinley -Alajah Gaughan -Aston Elam -Zamara Laguna -Subhan Harner -Ellagrace Kale -Godric Damian -Jansen Swaim -Maverick Vaughn -Tillie Saxon -Colston Battaglia -Rylan Urban -Summer Todd -Mekhai Alessi -Zaylah Durr -Ahtziri Nilsen -Bernadette Burden -Irvin Minter -Jianna Chapin -Arman Hoyle -Brayton Beeler -Sahir Furtado -Kayleigh Stephenson -Layken Harbison -Remington Dempsey -Kaesyn Fessler -Avan Hack -Sky Hendrick -Mariam Hendrickson -Tommie Sansone -Avry Pavlik -Beckett Rodgers -Myron Whitson -Kilian Edge -Phillip Shah -Tidus Brasher -Raider Landin -Taggart Dryer -Dakota Olsen -Britton Blythe -Cristian Lamb -Xoe Binion -Vinh Casiano -Arien Chafin -Valente Brigman -Tylor Bly -Elani Jurado -TRUE Theriot -Jaceon Oreilly -Delila Fee -Kathy Branson -Aviona Lines -Malika Urias -Yasser Polley -Karin Laux -Nakai Crossman -Zion Campos -Kaylah Bruns -Rohan Lord -Jacori Hiner -Trinity Ortega -Reniyah Bengtson -Eniyah Mazzola -Anwar Collette -Molly Schwartz -Nile Schick -Jackie Martz -Maisyn Roa -Story Mckenney -Johnpaul Brinson -Aivah Blaisdell -Coleson Montez -Wren Bloom -Giorgio Minnick -Tailynn Wash -Aleeyah Staten -Naia Sander -Terrance Burrell -Kinsler Schweizer -Lori Chiu -Jeter Molloy -Carmyn Beaman -Gretel Mickey -Holly Odom -Leandre Deen -Cloud Gehrke -Aaliyah Castillo -Atharva Groom -Jeziah Mouser -Kayanna Silvas -Brenleigh Kirkham -Kent Covarrubias -Azariah Gabriel -Siana Shiver -Tidus Brasher -Lilliann Hazlett -Suleiman Zak -Taylor Daniels -Marshawn Ellington -Rosalyn Jansen -Natasha Ziegler -Gwen Kimball -Adela Bartley -Maxson Mckoy -Christopher Mitchell -Farah Chapa -Zev Barrientos -Shaye Sweatt -Kodi Shirey -Briel Mcquade -Kaydence Lefevre -Anny Marty -Divine Bounds -Amoura Mauk -Trinitee Costanzo -Alahni Bickham -Adira Salem -Anahi Locke -Stacey Derrick -Mason Galbraith -Guadalupe Kidder -Yashvi Waldner -Janey Thurber -Jariah Partida -Royce Dale -Rooney Michelson -Gabe Joe -Gillian Zhu -Alba Condon -Stephania Ton -Amilliana Windle -Jalena Saez -Olympia Oxford -Charleston Pelletier -Nora Cole -Genessis Dominick -Amelia Campbell -Leylanie Gutierres -Savanah Zheng -Conway Thurmond -Ashton Austin -Shrihan Alvis -Jean Jeter -Kristel Merz -Shelby Kissel -Aarohi Belt -Candice Searcy -Breelynn Warnock -Lyndon Orman -Emberlynn Mcduffie -Emi Augustine -Brayden Sullivan -Payzlee Hower -Amethyst Herzog -Duke Burks -Carlyn Eder -Pamela Troyer -Ramsey Nunes -Amarii Hessle -Jagger Butts -Syriah Breton -Denise Cope -Essa Vannoy -Siddhartha Gish -Kalleigh Sandstrom -Gene Luis -Sonora Curcio -Solana Tyner -Remie Mui -Kage Hard -Amina Cline -Daxx Leitch -Jayquan Straw -Parisa Vineyard -Rainey Min -Ziona Baugher -Franki Gulick -Jomar Chartier -Ailani Dowell -Brooklin Heiser -Tanya Israel -Laniyah Barbour -Kashius Brisco -Avyan Byerly -Josalyn Moats -Korben Legg -Ariza Keffer -Terron Alleyne -Leni Kennard -Deisy Bolduc -Dontay Pera -Esther Saunders -Patton Place -Maddyn Musselman -Haddon Brashear -Jasir Aronson -Gwyneth Stringer -Nala Shipley -Tevita Janik -Nayah Jaques -Miking Ciccone -Parks Juan -Jovian Billington -Winifred Garber -Tennyson Erskine -Talon Rossi -Graeson Sabin -Jeziah Mouser -Rico Ragan -Arielle Lester -Kepler Ohalloran -Yandel Fanning -Mahala Sias -Sadie Freeman -Tilly Montiel -Bosco Lieb -Tallon Stotts -Marley Patton -Arjun Shoemaker -Tristin Duggins -Matix Dalessandro -Van Dickens -Arleth Gaytan -Cartier Ehlers -Atticus Orozco -Auden Gilmer -Korbyn Ashmore -Gabby Deming -Kaeden Baron -Reyli Karns -Cristian Lamb -Santos Woodson -Finley Camacho -Lyric Olivares -Katalina Beaver -Ella Cooper -Megan Dorsey -Shakira Boardman -Saxon Hinz -Mai Kahl -Erielle Pasley -Kynadee Gorrell -Josemanuel Palmore -Rosaleigh Bedard -Hank Farris -Rachelle Robinette -Evalyn Caballero -Yuri Teel -Lindley Dear -Amellia Monzon -Novah Chronister -Tate Cisneros -Miah Rodrigues -Yusuf Madison -Evianna Bushnell -Aidyn Shiflett -Evelynn Rubio -Hadrian Rosenblatt -Shaquille Pardue -Koltin Miceli -Addison James -Destiney Rubino -Rivers Dameron -Jedidiah Bunch -Embree Chisolm -Haroon Abbey -Arius Dvorak -Jusiah Cranston -Vega Jump -Jillian Blanchard -Josemanuel Palmore -Ashley Hudson -Soleil Cohn -Kalyn Tello -Rickey Tennant -Briseis Stamps -Hubert Coen -Charissa Dice -Gabby Deming -Parth Gottlieb -Tylee Meacham -Meliah Barriga -Jeancarlo Mcanally -Adalynne Heckman -Ilias Elswick -Gretta Raya -Jean Rosenberger -Jaliyah Leal -Anibal Annis -Christy Weidner -Maylani Whyte -Ellamae Proulx -Noora Rager -Jaciel Weeden -Niklas Bennington -Minna Barto -Cayden Dennis -Kyan Mcarthur -Kate Hartman -Naomy Mather -Shaina Archibald -Serenity Schmidt -Kabir Devries -Milan Moses -Brielle Bates -Arron Arango -Coraline Hewitt -Bayne Hillis -Kalvin Batista -Jazmine Stuart -Xzander Bemis -Eira Borchardt -Alyssandra Nestor -Damani Flora -Yeray Dull -Keanna Crotty -Caspian Shull -Jamison Kaufman -Maddilynn Puentes -Keller Millard -Morghan Fudge -Zenaida Huckaby -Juniper Lynn -Frieda Barcia -Robert Ortiz -Brianne Basile -Aamina Twomey -Marjorie Geiger -Ina Bixler -Gohan Cavallaro -Donatello Winkle -Chauncey Tankersley -Aris Carraway -Juliet Aguirre -Alexavier Millan -Madina Carmack -Matilyn Barley -Kasper Risner -Finley Camacho -Kathia Krupa -Maelee Chew -Kaedyn Kimber -Ysabella Trombley -Adia Pleasant -Jaclyn Babb -Arnoldo Edmundson -Corwin Wingard -Maximino Linehan -Kiana Stacy -Liara Yip -Cal Hite -Cayla Medlin -Abbi Kania -Jozlynn Woolfolk -Keisi Duron -Kassidee Lathan -Aj Plante -Alahna Roos -Aisley Royster -Laila Luna -Anvitha Wirtz -Rooney Michelson -Easton Hammock -Teegan Laney -Zade Faison -Zofia Viola -Kaidance Nilsson -Cache Maynor -Glen Gerard -Addilynn Hollingsworth -Arsema Chitwood -Raisa Tims -Gunther Costanza -Navy Caputo -Pearl Webber -Taylar Pegram -Violeta Perdue -Milania Dodge -Quin Rubalcava -Jailee Criss -Eviana Echeverria -Blythe Ceja -Riana Mellott -Blue Bigler -Trinity Ortega -Zacarias Ignacio -Yulianna Dugas -Avrohom Greiner -Payslee Breland -Kiah Dumont -Kendrix Eberhart -Dianne Lundeen -Nataleigh Sacco -Jaslene Ashe -Jiana Guan -Servando Confer -Keysha Howze -Krish Lind -Keisy Munger -Tiffani Quijada -Kensington Ogden -Aili Sartin -Talyn Avendano -Katherin Burgin -Anika Cash -Armaan Scarborough -Callee Foxworth -Zamara Laguna -Jenika Elson -Drew Corey -Baileigh Hamblin -Josalynn Shope -Leelah Gilmartin -Jefferson Cordero -Koral Dunson -Braylin Martines -Darian Fedor -Asiyah Ballesteros -Jamar Loomis -Naisha Paulk -Nihira Spiller -Dakota Olsen -Katara Peet -Crispin Rhee -Arav Robey -Emiliano Hodges -Mackenzie Plowman -Deborah Bower -Waleed Arreguin -Robin Busby -Aida Escalante -Joey Alcantar -Hezekiah Poe -Rivka Schaffer -Dustyn Manor -Myasia Esqueda -Mick Hoss -Salomon Farber -Rhea Leung -Kelcie Quimby -Marcelino Whitworth -Saya Turney -Arabella Sherman -Elouise Behrens -Denisse Matson -Samanta Applewhite -Medina Tart -Mihir Willie -Jaydee Pillow -Mikaylah Deas -Dominick Vincent -Deklen Lafond -Lennon Stinson -Mohamedamin Ruddy -Dirk Delcastillo -Alaa Gilpin -Ivana Ryder -Heather Spaulding -Abdurrahman Charbonneau -Jaren Luster -Zuleyka Benavidez -Kansas Mcadoo -Kirah Nottingham -Masen Rincon -Bridgette Luu -Shaniya Marx -Daemon Hollinger -Spirit Marrone -Soledad Seng -Jolee Maas -Arlo Craft -Mahogany Rupert -Jadore Quillen -Rithvik Walczak -Clementine Huggins -Halley Wight -Kevon Schnell -Ambria Laurie -Huxley Dowling -Kinlee Barrow -Lillyan Denham -Jeffery Fonseca -Lamya Metzler -Aulani Pennell -Johnson Graziano -Mohamed Spence -Dany Rondeau -Avani Falcon -Jaylyn Barkley -Meir Greenfield -Aaliyah Castillo -Dmitri Casto -Jaceion Houk -Aric Rounds -Alize Zayas -Hallee Braithwaite -Broderick Lytle -Pranav Switzer -Isabelle Watkins -Ansel Main -Fallyn Nemeth -Adhvik Jacinto -Mei Cashman -Courtland Haworth -Tzipora Lacombe -Quinn Roach -Zayden Warner -Bradleigh Karim -Aiden Conyers -Aleenah Householder -Jess Gallimore -Halo Fortune -Hero Chevalier -Ianna Wilds -Analiyah Buxton -Crawford Doane -Noelia Forte -Lawrence Workman -Kiarah Humbert -Emonie Anson -Keon Halverson -Ellora Fan -Kerrington Benally -Blaine Elkins -Kiya Lieberman -Sammy Brockman -Maddex Hackney -Annie Macias -Addilyn Zamora -Kathrine Poor -Shulem Pagel -Kassie Taber -Pryce Santoyo -Rebeka Mickle -Precious Cao -Sahar Manriquez -Maryanna Turek -Bella Ryan -Kaiden Dalrymple -Kamilla Lewandowski -Hailee Browne -Maple Fazio -Kameryn Penaloza -Frederick Mackey -Aviva Gaither -Virginia Mcgowan -Tayah Laurent -Aleksey Brewton -Darion Reiss -Abubakr Cantor -Emerald Conn -Elexis Roseberry -Amarachi Barwick -Rory Mora -Alonah Hurwitz -Abbie Horvath -Elena Dean -Abel Lawrence -Christiano Hollander -Aldo Cho -Eiza Laster -Tyquan Therrien -Sari Fregoso -Audriana Eason -Auri Sanfilippo -Luqman Palomares -Rhiannon Hardwick -Kelsey Huang -Caeli Cai -Aubreanna Leboeuf -Yajaira Kantor -Kamryn Escobar -Anyssa Carlo -Jahmari Sterner -Tomas Piper -Margeaux Campuzano -Amador Balogh -Addyson Horne -Demarius Endres -Yaritza Lujan -Kemari Barros -Lane Beattie -Lamar Wyrick -Ashten Orth -Jensen Lavender -Carmela Motley -Amaya Frank -Quinn Munoz -Lakai Chauvin -Manav Brannen -Akshara Mesa -Jasiyah Stalnaker -Hershy Swick -Mirabella Mccleary -Deangelo Hutson -Sanvi Boss -Muriel Northern -Avi Betancourt -Samantha West -Quincy Herrick -Remmy Boyette -Alba Condon -Shyann Curiel -Shayaan Bunton -Sharif Vankirk -Amauri Lindell -Keaton Varghese -Keturah Gervais -Kristin Partridge -Remington Huff -Brenleigh Kirkham -Samar Rembert -Kemora Castelli -Jenesis Arnett -Tillman Revels -Jack Morris -Abdulrahman Valdivia -Brienne Weise -Alyah Hollowell -Ameen Nester -Brooklin Heiser -Leilanie Wrenn -Kyara Newland -Ozzy He -Odalis Kisner -Gina Jauregui -Damoni Camper -Kai Varela -Skilar Camden -Kacey Starnes -Safiyyah Beckford -Hadley Jensen -Jaxen Schafer -Mahir Hollenbeck -Salina Sawyers -Addelynn Lathrop -Kolbi Doster -Amor Corrales -Markeith Mathewson -Don Carbone -Jackie Martz -Susana Withers -Kynzleigh Newlin -Marlen Burd -Annaly Lambrecht -Zeena Maiden -Taylor Daniels -Quin Dahlberg -Aisha Andersen -Nazir Andrus -Eshan Siebert -Tiffany Archer -Jurgen Elia -Simona Lett -Lilah Hutchinson -Camari Gosnell -Garret Anton -Genessis Dominick -Journee Sexton -Delayza Basso -Janey Thurber -Christelle Kimura -Mea Christopherson -Abbigail Jung -Aunna Gregorio -Evah Escoto -Lisandro Chi -Georgina Wyman -Arshiya Laliberte -Raquel Self -Grant Frazier -Deanthony Judy -Kenzlie Cawley -Mariama Hensel -Maura Frias -Bobbi Lavigne -Malachai Bent -Anastasiya Millen -Tenzin Bogan -Aeden Littrell -Adalin Templin -Reagan Bynum -Danni Ridenour -Kaydee Vanmeter -Katelyn Lang -Lamarcus Mccafferty -Severin Spoon -Eli Wood -Ravenna Cripe -Kayleen Trahan -Rozalyn Cauthen -Carmyn Beaman -Yovani Jordon -Hashir Dufour -Danielle Valencia -Jaziah Mckeever -Zamarion Busse -Kynley Wiener -Jaliah Brenneman -Chevelle Beckett -Imani Odell -Loyal Olmos -Faigy Soares -Suzanne Cromwell -June Jefferson -Kaliah Delvalle -Paisleigh Marrero -Starla Gragg -Kipton Lundberg -Elizabeth Carter -Paxton Wolf -Breasia Mcmillin -Alajah Gaughan -Anish Leong -Calan Blackstone -Devora Roeder -Caine Santacruz -Mariana Dalton -Cheyenne Prince -Prince Mcfarland -Bensen Saravia -Samora Delucia -Walid Knepper -Leopold Strain -Nayeli Novak -Clarke Macpherson -Milly Wimberly -Catelynn Thoms -Yvette Clancy -Brady Reeves -Hiram Fugate -Raylan Riddle -Jahiem Resnick -Rubin Cespedes -Tiger Husband -Kavon Matta -Klaus Litton -Caysen Moe -Alanis Reinhardt -Kaeson Crossley -Estrella Goins -Elian Saucedo -Laynie Hitt -Aundrea Neese -Kalaya Mcclary -Jalynn Resendez -Kaiyah Matteson -Ilaria Morman -Jeremyah Grau -Ellen Yarbrough -Xavior Wacker -Wayne Han -Delanie Herrmann -Ace Bean -Mazie Wilde -Zamira Hixson -Karson Rivas -Holden Clayton -Javontae Otten -Eliab Slavin -Jovan Martino -Laksh Ruch -Edie Kinder -Ahlam Benham -Talen Valentino -Jax Alvarenga -Monika Fick -Kharter Isaacson -Cassia Wampler -Sage Bartlett -Ani Olguin -Aleina Harr -Kaysen Aguilera -Maiyah Ensley -Elyzabeth Heatherly -Tanvi Sanborn -Zamiyah Yarborough -Shaelyn Wilhite -Aeris Vickery -Judson Benedict -Eve Rowland -Jacey Seaman -Makena Begay -Breonna Smitherman -Aicha Braddock -Therese Baskin -Brodie Delatorre -Eveline Knuth -Pinchas Gilles -Zena Edens -Aizah Giese -Wayland Blades -Blanca Lindberg -Titus Meyers -Elara Durkee -Ellah Mumford -Seren Studer -Lariah Bunnell -Lamarion Seeger -Rianna Tseng -Saharsh Scheid -Tevita Janik -Lily Reyes -Shianne Hersey -Saw Earp -Vanya Willman -Ines Fairbanks -Lucinda Bertrand -Fatema Perrotta -Allie Serrano -Cameron Costello -Masyn Paulino -Meila Edelman -Emsley Sasser -Cotton Stiffler -Keasia Aho -Siobhan Phillip -Alekzander Baeza -Rigoberto Handley -Jayceon Ballard -Laurel Maher -Braven Folk -Rawan Murchison -Martez Ledoux -Kaia Hayden -August Erickson -Aissatou Weathersby -Mandy Mcdougal -Kale Moya -Deacon Baird -Hadlee Coates -Bernard Robert -Gloriana Drews -Tariah Fowlkes -Barrett Allison -Mackson Pitchford -Nico Downs -Inez Wessel -Yohanna Propst -Avril Levesque -Janely Mcmichael -Jourdyn Tennyson -Rhema Giddings -Ren Vuong -Niko Schumacher -Falynn Caruthers -Ruston Sealey -Kierstyn Mach -Tenley Vo -Jaselle Darlington -Chole Buckman -Zakai Leger -Henderson Basinger -Erma Strode -Adalind Frame -Ellyson Massengale -Japheth Massaro -Shifra Flake -Jaicee Fuhrman -Harris Seals -Oshea Volz -Kirill Garretson -Evy Spitzer -Amauri Broome -Aura Kaye -Jaylan Mcdaniels -Yatziry Bowler -Deetya Driskill -Charleston Pelletier -Suzette Mcgriff -Evren Swink -Dakarai Mccandless -Genaro Felts -Eugenia Korte -Laykin Moline -Macee Deering -Mackynzie Carleton -Tennessee Lebrun -Aaliya Heilman -Aylee Shults -Taylor Mercer -Axyl Broadnax -Nayely Thach -Xander Hardy -Vernon Ramon -Marlo Blessing -Bently Harkins -Eddie Hagen -Ranger Angle -Semaj Paschal -Rodolfo Ennis -Annalyn Pogue -Amara Maddox -Tanish Carcamo -Shriya Gorski -Florence Sepulveda -Samia Zhao -Jireh Banker -Herschel Frechette -Angelika Beckner -Teresa Manley -Atziri Vereen -Janice Tinsley -Brailyn Sturgis -Arie Staggs -Yaqub Rosier -Ely Mehta -Rania Mcwhorter -Raigan Obregon -Tamiyah Pigg -Guiliana Fetter -Cambria Haywood -Clarice Eicher -Lyon Carrell -Amen Chestnut -Jordin Neri -Shelbie Albarran -Bransyn Glazer -Arlett Hazard -Charley Dejesus -Caius Selby -Yazan Lawless -Angelynn Geiser -Jarell Delano -Landyn Madden -Rosalyn Jansen -Anwita Deville -Kaine Brownlee -Ivie Towns -Adilynn Siegel -Zayed Fitz -Aris Blanchette -Katheryne Dimartino -Malka Winslow -Madison Beale -Tegan Aguayo -Ena Wortham -Dino Rusk -Kennadie Trainer -Rosa Pike -Donte Wing -Queenie Delia -Eastyn Valente -Khaleesi Steward -Kofi Canas -Ellyana Spooner -Darrius Easterling -Bradley Lowe -Kyree Perron -Damario Hermes -Hollis Mcclelland -Ryla Doud -Kaylen Catlett -Jeziah Mouser -Nahomy Woodley -Alec Zavala -Kyaire Kahle -Cailyn Salcedo -Theophilus Teasley -Jeronimo Council -Adel Welty -Nyla Andrade -Hera Russel -Mirel Kost -Chaz Poston -Yuritzi Carstens -Jayliah Sluder -Abriel Lemos -Stanley Rainey -Nestor Skidmore -Kristal Barthel -Jeb Blackford -Deen Welton -Sabina Loy -Delia Grubb -Eric Lynch -Cassius Funk -Tali Falco -Isac Escalera -Buck Caviness -Reign Purvis -Zamari Packer -Teagen Ivie -Adelaida Adrian -Talib Urbano -Yasmina Abell -Armoni Crooks -Rilee Custer -Kira Whitehead -Octavio Mayberry -Dilynn Rinker -Brooks Gill -Presten Posner -Shanell Persinger -Batya Colangelo -Kalea Lusk -Saina Woodland -Brexton Fortney -Calli Roller -Evan Putman -Cierra Mauldin -Haydon Worthen -Debora Fogarty -Emanuel Beasley -Kenan Halstead -Daleyza Marsh -Ellery Friend -Alexzandria Vanhoose -Alahni Bickham -Koen German -Eleonora Brownfield -Drea Steelman -Jairus Schreiner -Hajar Mcbeth -Sahir Furtado -Grayden Argueta -Adelyn Avila -Marquise Cason -Ty Bolton -Taelor Haught -Briel Mcquade -Demian Nicely -Jasir Aronson -Tyree Boston -Kailer Cottrill -Daniella Wiley -Keanu Prieto -Robyn Crowell -Katalyna Guadarrama -Colin Nunez -Brylan Bischoff -Keagen Niemeyer -Lorelei Richmond -Jayven Noriega -Aylin Kerr -Ayana Zimmer -Jaxon Cook -Creed Roush -Kaliyah Espinosa -Brigid Allman -Blakelyn Enright -Claudio Laing -Roselynn Kwon -Truly Kerrigan -Zariah Vang -Rowdy Troutman -Karter Field -Mayah Loyd -Krew Mattox -Malena Martins -Galilea Crabtree -Kayceon Hoelscher -Annamaria Beaudry -Kiera Avalos -Nate Villareal -Katharine Infante -Elizaveta Donoghue -Calise Congdon -Lucia Clarke -Talin Mcentire -Valen Vermillion -Laikyn Dover -Jentry Siu -Auston Delvecchio -Dakoda Lavin -Maci Randall -Alma Gore -Gibran Bevins -Ashby Coll -Lisandra Holsinger -Lailah Crouch -Arsen Wrobel -Coy Benner -Dyani Stanfill -Bryelle Scalf -Chantal Ruppert -Kallen Nadeau -Rowynn Reader -Paradise Meadors -Emori Bahena -Braelee Coots -Milana Baca -Nelson Shapiro -Luci Weiler -Rayce Joshi -Arsh Gilroy -Brice Rosenthal -Demar Spradley -Sanjay Rosser -Menno Tressler -Kyrie Sawyer -Gabriella Snyder -Colter Beverly -Damarius Suazo -Raymond Pham -Galen Cotto -Saori Malin -Jed Serrato -Fern Rau -Adolfo Montanez -Emeli Esteban -Olan Mong -Aubrielle Sprague -Akshaya Breault -Airam Arneson -Baruch Nowell -Lander Caudillo -Salome Noe -Karlos Copenhaver -Adelina Crowley -Raleigh Schubert -Sylas Dewitt -Jariyah Donato -Brody Gardner -Donavon Saltzman -Ivyana Pendley -Keyla Purcell -Sundus Blakey -Felicity Stein -Madison Nelson -Brendon Chau -Brilee Nation -Mckinlee Hefner -Aurelio Eads -Georgie Granillo -Makiah Cowley -Maelyn Packard -Elijah Martin -Angelia Peltier -Nelly Morey -Burke Cowell -Jacorey Siddiqui -Vanesa Settles -Abram Howe -Kellyn Du -Noa Raley -Jadon Schwab -Neve Forney -Beatrix Anders -Lovina Mansell -Layth Pete -Johann Lyman -Timber Wortman -Antwone Trimmer -Joann Godoy -Fateh Eddington -Avyana Sly -Gabriela Mckenzie -Faye Levin -Scotty Arrowood -Abdulmalik Izquierdo -Rolando Ham -Bladen Cofield -Raizy Kohn -Canon Heinrich -Azaliah Hardaway -Azalia Koss -Reese Clifford -Lucienne Billy -Sara Ball -Melissa Summers -Dalila Bull -Martin Burnett -Zavian Spellman -Elynn Galli -Joe Esquivel -Shylah Banta -Khadija Strauss -Amare Adair -Jasen Kocher -Raider Landin -Elliott Oconnor -Afia Masi -Coltan Vaillancourt -Aedan Mcnulty -Sommer Dann -Parks Juan -Audra Meehan -Roisin Soukup -Maleny Janis -Theseus Colombo -Edgardo Hunsaker -Jewell Cleaver -Tatum Pineda -Kadrian Ismail -Rosy Chowdhury -Royce Dale -Malorie Leake -John King -Lakshmi Fleenor -Edmond Monaghan -Lavinia Prior -Kristiana Mckelvey -Dhilan Walcott -Dartagnan Morano -Mischa Lafrance -Yetzali Moynihan -Sailor Doran -Uma Underhill -Maite Blackman -Tristen Elmore -Getsemani Faith -Bill Bakken -Levi Blaine -Greyson Pirtle -Kaylynn Crow -Arayah Fiore -Wyatt Evans -Micaiah Farrington -Nikayla Ottinger -Lelia Yamada -Zeus Valerio -Demarco Covert -Jarrett Bearden -Cypress Kain -Kamaria Dombrowski -Arrianna Lalonde -Isabell Durbin -Estefany Cecil -Sidra Beltz -Leeam Perna -Nechama Grantham -Yolanda Gagne -Barbie Sheaffer -Kamya Volpe -Armand Herd -Layten Maria -Alexandre Garnett -Ruth Garrison -Emran Kwak -Aking Maney -Mariangel Charron -Sheila Kuntz -Billy Dietz -Mavis Wilkes -Rylin Czarnecki -Charlene Pence -Aadyn Bakke -Adyn Wyant -Dexter Arroyo -Geneva Hayward -Demiyah Spradling -Landri Loveland -Leighton Daugherty -Azalea Whitfield -Naila Holly -Kendall Cabral -Austen Malik -Avyaan Manns -Payzlee Hower -Korah Keil -Laynee Porterfield -Aya Tripp -Logann Wheelock -Lee Featherstone -Tobin Banda -Gryffin Rodman -Andy Gudino -Nakai Crossman -Arlin Mcgaha -Maison Rhoades -Ali Glenn -Suzanne Cromwell -Ailynn Burkhalter -Tyanna Word -Danilo Julian -Rashaad Carreno -Samar Hazelwood -Whitlee Kile -Javontae Otten -Emarie Gaddy -Maryam Bacon -Ailee Hilbert -Wilmer Monroy -Pepper Cooney -Gryffin Rodman -Robin Christie -Oak Hayashi -Jonny Rue -Betsy Bethea -Caston Gravely -Makaio Forester -Shiloh Saenz -Livvy Braley -Praise Hibbert -Alessio Gilligan -Jayanna Lattimore -Syriah Breton -Jazmin Ashley -Claude Conners -Nora Cole -Zabdiel Mullens -Karaline Souder -Keyana Rimmer -Valentina Reid -Solomon Calhoun -Journey Philips -Ameenah Surber -Arianny Dinh -Lillyann Alves -Abdirahman Centeno -Ashlyn Clay -Collin Trujillo -Dutch Chipman -Nayah Jaques -Cai Fitzhugh -Jamal Irvin -Marwan Gandhi -Josalyn Moats -Laine Nall -Yasmine Burleson -Asher Mcdonald -Rockwell Covey -Musab Winder -Nicole Bush -Dulcemaria Frady -Betzaida Nichol -Kimberley Hartung -Adelyn Avila -Braelynn Dudley -Naima Schofield -Atticus Orozco -Keziah Singletary -Aleksandra Duenas -Kaisley Murrell -Shrey Frederickson -Fredy Elliot -Jehu Cabello -Eloise Wilcox -Kasandra Alva -Brinley Walls -Tavion Billups -Regina Bonner -Ryu Freese -Hazen Elston -Zayd Worthington -Alizee Michaelis -Ruslan Davie -Talib Urbano -Rorie Alleman -Eris Woolsey -Eren Varga -Wyland Slaven -Aurea Gandara -Jazmyne Jewett -Mariam Hendrickson -Mikaila Merriweather -Aliza Peralta -Judah Jasinski -Kinley Yates -Laiklyn Geraci -Quincy Vigil -Zamara Laguna -Aster Lammers -Angeli Bonnett -Jeylin Million -Cord Kerwin -Wendell Amin -Christiana Alley -Rian Janssen -Kelsi Batts -Ada Berger -Milania Dodge -Ayaan Curran -Camelia Tower -Bryson Guzman -Reegan Boatman -Bella Ryan -Sephora Warrick -Jalon Newport -Anastasiya Millen -Sandra Arrington -Iziah Jayne -Seanna Enciso -Genevie Govea -Layah Silvers -Noor Mcneill -Rivan Tennison -Amaira Suh -Garett Seagraves -Markeith Mathewson -Sariah Brantley -Salem Bolin -Alanis Reinhardt -Thiago Russo -Raena Berard -Riker Koehn -Demario Doerr -Booker Humes -Ariyan Spinner -Hanah Beckmann -Anaiah Morley -Syncere Eliason -Jaylene Ngo -Leliana Drumm -Damiyah Blodgett -Sapphire Fierro -Leslie Ta -Eleen Alfano -Elouise Behrens -Ilse Harville -Josias Archuleta -Louis Flowers -Greenlee Bucci -Ladarius Claudio -Joseline Mashburn -Charity Stauffer -Brooks Ung -Katana Farkas -Breasia Mcmillin -Alizay Oquendo -Jalen Courtney -Dalia Munson -Clifton Abney -Karly Graf -Ariannah Johnstone -Penelope Fisher -Rhea Leung -Maddilynn Puentes -Marcello Stock -Delanie Herrmann -Aleesa Kellett -Jesenia Schade -Sione Hirst -Jaxin Rhea -Garen Garr -Reef Alt -Paul Espinoza -Shepard Samson -Baylie Kuehn -Kalia Beavers -Marley Patton -Yadiel Nickerson -Chassidy Lukas -Able Fussell -Esai Lozada -Riana Mellott -Avalyn Caudill -Rayshawn Peeler -Dandre Shorter -Cloud Gehrke -Pamela Troyer -Annamarie Mello -Alaynah Brumley -Arwen Mota -Cheyann Serio -Caelum Luedtke -Mason Miller -Khylee Bricker -Malique Lovelady -Madden Nicol -Ariana Alvarez -Amilah Board -Naksh Stringfellow -Quinn Roach -Lee Crockett -Miabella Parent -Stormy Snowden -Surah Oboyle -Thea Stanton -Jasiah Cassidy -Georgiana Alicea -Catalina Ware -Charbel Clift -Andie Shank -Areej Griffen -Leviathan Abramson -Rogue Bohl -Stetson Hackett -Caleah Hudspeth -Johannah Merino -Bayron Kipp -Brenden Read -Miliana Pinckney -Paris Bannister -Danielle Valencia -Carsen Bales -Aleyah Barksdale -Legend Mulkey -Evette Peabody -Dublin Vanlandingham -Darya Kato -Jatziry Reiff -Kinzleigh Lapierre -Sequoia Nutt -Andrae Carlock -Aeris Vickery -Basya Cavin -Journii Jessie -Landyn Madden -Reese Navarro -Gillian Zhu -Evangelina Van -Adhrit Bergquist -Devonte Warden -Bryce Greene -Anh Stelly -Nirvana Sanches -Everley Steffen -Harold Prater -Marilynn Quesada -Tyshaun Hennings -Jozlyn Goodell -Hadassah Portillo -Camille Montoya -Wayland Blades -Ellieana Pye -Brissa Batson -Haylen Midkiff -Austen Malik -Indiana Stidham -Elyana Dell -Leonard Griggs -Ezra Jolly -Dominique Whitlock -Carrigan Chairez -Isamar Witham -Ahaan Rathbun -Lynlee Weems -Kerry Grenier -Rylan Hampton -Laksh Ruch -Fateh Eddington -Julia Ray -Gadiel Sachs -Everett Brazil -Paisleigh Marrero -Mattie Cates -Geovany Faris -Paxson Lesher -Denver Ashby -Cameron Costello -Hermione Wingfield -Hugo Nixon -Paislee Suarez -Aalyah Collis -Anjali Felder -Ansley Nava -Breelynn Warnock -Perseus Bartz -Shmiel Brammer -Massiah Edmond -Sophya Landreth -Lilian Mooney -Lea Jewell -Eder Denson -Acacia Woodworth -Evelyn Parker -Demi Quinones -Denise Cope -Mckynlee Baldridge -Teddy Sauceda -Barbara Samuels -Emeri Ralston -Mishika Toner -Ashleigh Desantis -Aziza Hagerman -Clarissa Smart -Olive Conley -Janis Leftwich -Reynaldo Forrester -Cristian Lamb -Keagen Niemeyer -Gonzalo Askew -Marciano Rana -Alahni Bickham -Gracee Stocks -Anaisha Bevan -Bawi Holzer -Jacinta Burkey -Oaklynn Galan -Zailee Spohn -Deonte Griffis -Jake Cummings -Lyra Uribe -Rodney Engel -Raelee Mackay -Ellamae Proulx -Dorothea Lasher -Said Weed -Shailene Gunning -Harbor Lenard -Jair Sharma -Rivers Gatewood -Leobardo Dufresne -Aj Plante -Aubrianna Hathaway -Lucie Asher -Laiken Grillo -Dontavious Pecoraro -Tavian Roberto -Evalyn Caballero -Mahalia Gregor -Linken Melgoza -Castle Giardina -Ariany Linderman -Rosie Egan -Lucero Noll -Kamdon Avitia -Adleigh Free -Erion Tilson -Kalina Quinlan -Kaiden Salazar -Naia Sander -Onyx Shuster -Hawthorne Brick -Domenick Poss -Harper Kilgore -Wylder Paddock -Ranya Pickle -Ashton Austin -Davonte Boling -Raleigh Schubert -Athena Dawson -Teagen Ivie -Silver Luevano -Alizabeth Sass -Woodrow Hung -Ellis Diehl -Ambrielle Rainer -Jaselle Darlington -Jeremih Kroll -Summer Todd -Kadynce Cargill -Arabella Sherman -Kullen Montana -Jaeden Seeley -Bralynn Dehaven -Bryan Wade -Soha Woolf -Xitlali Nolen -Kahlia Abrahamson -Eugenia Korte -Timmy Cozart -Johana Cable -Kenna Roe -Adya Romer -Lawson Church -Lela Lemons -Ailin Roybal -Kyan Mcarthur -Chanelle Yamamoto -Barry Farnsworth -Sunni Marinelli -Wednesday Dollar -Jalaysia Polite -Maddilyn Harry -Hadeel Hoeft -Avyana Sly -Joely Cardinal -Deonta Thrift -Brynnley Armour -Azura Blackmore -Zanaya Quesenberry -Keiry Nino -Zyler Shen -Amire Tullis -Zahara Cheney -Kelsy Drown -Rima Moncrief -Raylin Orosco -Demond Harness -Davina Willoughby -Malinda Vanwinkle -Irvin Minter -Samaya Flannery -Slate Gallup -Maleyah Cothran -Elizabeth Carter -Quran Cortese -Leonardo Medina -Kaysen Aguilera -Elliotte Newhouse -Skyleigh Coelho -Zakai Leger -Vianna Deangelo -Zack Nobles -Maddyson Oliphant -Corbyn High -Sol Dancy -Rayann Aman -Tristyn Ballinger -Zarek Shanklin -Jayson Raymond -Marshawn Ellington -Viyan Priester -Nisa Laskowski -Adonias Kleinman -Shayan Everson -Rubi Upton -Geronimo Conant -Maverik Rumsey -Avarie Hussain -Kyana Boughton -Kavon Matta -Kaylan Abram -Chanell Coney -Abdullahi Stinnett -Katharine Infante -Conrad Lott -Niah Upshaw -Kellie Kephart -Leander Pichardo -Michel Bierman -Dakota Olsen -Kelia Nauman -Jacklyn Breedlove -Susannah Earnest -Arham Gulley -Kaleesi Mcmurry -Eliah Schutz -Kc Meltzer -Maxx Ferrer -Alliana Drain -Finnian Stockton -Avyan Byerly -Demarco Covert -Conor Cooley -Jaylen Blackwell -Allisyn Ruano -Sanai Casper -Graci Ascencio -Hollis Mcclelland -Anaiya Echevarria -Ellasyn Haviland -Alonna Seal -Ozzie Islam -Santhiago Jim -Lynnlee Buell -Manny Michels -Keana Salmons -Mendel Savoy -Chelsea Dillon -Kasey Currie -Noel Lowery -Keanna Crotty -Addison Witherspoon -Kasyn Eden -Destiny Potter -Lux Thigpen -Eh Rettig -Zamir Farrar -Maryn Martel -Jamire Mauricio -Kamarion Forsyth -Svea Brann -Stellan Wofford -Shayleigh Dimarco -Kaci Ricci -Milagro Yarnell -Aaric Wagers -Zaid Otero -Azul Jameson -Efren Poirier -Bladen Cofield -Ahsan Falconer -Harun Flatt -Ayana Zimmer -Isela Smothers -Kassandra Newsome -Kamren Dupree -Jeffrey Carey -Krish Lind -Cheyanne Lockett -Jared Gilmore -Allyson Conway -Ricki Bessette -Gwen Kimball -Jeyden Burbank -Ashtyn Damon -Carly Glass -Edy Boaz -Azlan Walk -Smith Amato -Sky Stratton -Cyrus Gay -Armando Meza -Jafet Woodbury -Niall Tyrrell -Blakelyn Enright -Kenadi Musgrove -Haniya Gammon -Quinton Gustafson -Jaedyn Eagle -Star Ibrahim -Mika Lander -Logen Shih -Amran Phares -Eduardo Tyler -Erma Strode -Khole Scribner -Nadine Myrick -Berkley Atwood -Anabelle Crews -Iva Tafoya -Aubriella Mansfield -Camari Maley -Newton Alderete -Meira Sellars -Nabiha Duquette -Odette Sandlin -Alisha Street -Galen Cotto -Ivyanna Schiavone -Hollie Clem -Mariajose Sutter -Samirah Hesse -Deklen Lafond -Aditi Thiel -Gerardo Sampson -Maia Goldberg -Dasha Hofmann -Adriana Curry -Gia Barr -Jakari Bigelow -Alaa Gilpin -Marquise Cason -Mihir Willie -Armon Northcutt -Brycen Petty -Ellington Horst -Alfredo Grace -Loki Zeller -Ivaan Garnica -Jayven Noriega -Carnell Braud -Kamora Christman -Monty Korn -Casen Dubois -Heston Plant -Ariona Haskin -Ziyon Watterson -Brooklyn Morales -Abraham Powers -Hania Oxley -Zaryah Stultz -Shekinah Hulett -Diamond Anaya -Akai Hedge -Sylis Weil -Rajveer Trawick -Maleena Carbaugh -Creed Roush -Melody Lyons -Avin Kerley -Elly Zambrano -Khari Johansen -Solange Findlay -Abdulrahman Valdivia -Carolina Benton -Jaycee Mccants -Brock Bray -Kaiah Pisano -Dejah Maddux -Dion Yoon -Queen Hamrick -Leeroy Jardine -Carla Souza -Addison James -Navy Conlin -Abbigale Zito -Tyra Friday -Diana Heath -Zaedyn Witcher -Kinleigh Irving -Yoselyn Rascon -Jazlin Demaria -Lennon Goff -Teegan Griego -Robbie Mackie -Ivey Ashworth -Axl Mcmullen -Micaiah Albano -Leighton Daugherty -Karlie Winn -Archie Easter -Brigette Kautz -Keeley Musser -Airam Arneson -Clive Rivero -Blythe Ceja -Irena Hoard -Maris Hallock -Drew Corey -Kevon Schnell -Marilyn Herring -Juaquin Borrero -Corbin Garner -Lamonte Vaden -Kacee Blas -Howard Reaves -Salih Hocker -Yehoshua To -Carson Foss -Anyssa Carlo -Aminata Forster -Miguel Sandoval -Luther Mcnutt -Aren Dyke -Reginald Shultz -Juliette Gibbs -Regan Quan -Edgar Wyatt -Fernando Stokes -Leelan Kinser -Ayelet Dowdell -Broderick Lytle -Adriel Short -Dequan Pawlowski -Zakaria Zielinski -Rosalyn Jansen -Alisa Keen -River Villanueva -Jacklynn Radcliff -Marygrace Huhn -Nylah Bernard -Jacquelin Toms -Darek Jumper -Dottie Tyndall -Jaylanie Azevedo -Tyrell Lawton -Araceli Allred -Bryer Mclemore -Aviva Gaither -Karsten Bussey -Evren Swink -Indira Markey -Sirena Hom -Fausto Mingo -Kierra Fontaine -Hailee Browne -Axell Culler -Fidel Popp -Jamyla Runkle -Ria Southerland -Eowyn Jessup -Jetta Arambula -Danya Atchley -Karter Watts -Seneca Blakeney -Jaqueline Broughton -Marisol Latham -Aashna Winton -Chandler Luke -Avalynn Toth -Prisha Masterson -Lamar Wyrick -Kenny Champion -Emelyn Haller -Eyad Horning -Maebry Rozier -Kyrell Pankey -Adalberto Kerner -Lake Hagler -Haven Tanner -Alasdair Towers -Tynlee Ruggles -Griffen Poon -Hershel Flournoy -Jewel Hurd -Shannon Mclain -Analiyah Buxton -Jayquan Straw -Morgan Chappell -Lenora Harwood -Sidharth Sokolowski -Ahri Gillett -Ellinor Garry -Kamea Jiles -Asher Southern -Odessa Ramsay -Makenzy Vice -Collyns Saiz -Elvis Whitten -Aniylah Koester -Laya Demers -Korbyn Yancey -Raegan Kirby -Jaila Homer -Aaliyah Castillo -Rashad Marcum -Adelin Mcgough -Demetrius Schmitz -Ashly Brinkman -Jessia Eidson -Serafina Ordonez -Tate Morell -Amina Cline -Tito Frawley -Journie Paxton -Zyra Hadden -Lionel Muniz -Yisrael Jaffe -Jaedon Treat -Christopher Mitchell -Ayala Lower -Khari Omeara -Syrus Hildreth -Eldana Strang -Haydon Worthen -Keanu Prieto -Izzabelle Fetzer -Jenavieve Catlin -Elyza Mabe -Verona Burman -Ellanor Fenwick -Andria Benning -Bodey Danforth -Phoebe Dickerson -Delylah Hennessey -Adilene Lopes -Kenji Lira -Edie Kinder -Maricella Wilken -Aislynn Wendt -Korey Kidwell -Emelia Tyson -Gina Jauregui -Rylin Czarnecki -Edwin Bradford -Jessica Wise -Naftali Fielding -Lizeth New -Deonna Mulholland -Kynzie Dore -Embree Chisolm -Semaj Paschal -Race Marini -Jerzie Lippincott -Noa Tolbert -Raul Costa -Janette Koonce -Chiamaka Songer -Kaydence Lefevre -Ellena Bruton -Dayana Hatcher -Tommie Sansone -Jenesis Arnett -Xion Wardell -Aeden Littrell -Juanita Cady -Michelangelo Resendiz -Millie Levine -Maysen Oman -Matthew Lopez -Yaakov Longoria -Ruhi Tremblay -Cailee Osman -Analee Pond -Tidus Brasher -Tyler Driver -Torrance Dinardo -Arina Ritz -Maram Willette -Jaxston Montenegro -Cheryl Schaub -Brantly Fried -Maddelyn Gallego -Dustyn Manor -Basma Calle -Subhan Harner -Zyla Calkins -Elia Mahan -Tegan Mcqueen -Clinton Wilburn -Armin Hamer -Braxtin Lampert -Bruno Painter -Allana Ehrlich -Damoni Camper -Madilynne Tunstall -Analyn Shear -Edith Fulton -Mylan Riffle -Olan Mong -Rihaan Liston -Antwon Shane -Ronnie Wilhelm -Della Coy -Orrin Bertram -Porter Baran -Jessie Ahmed -Champion Honea -Vania Bill -Theia Sledge -Aharon Lor -Monika Fick -Corrine Pilgrim -Nuha Hartline -Azriel Mathew -Joah Dawes -Nicolle Mclellan -Stacy Tweedy -Menno Tressler -Thaddeus Hammer -Elleanna Donohoe -Damoni Tyree -Cortez Fernandes -Getsemani Faith -German Ebert -Gaston Smithers -Bennett Gable -Talya Mahon -Natan Hendershot -Frances Kidd -Lilyan Gough -Cayleigh Deguzman -Ismail Messina -Viggo Thrash -Lazaro Welker -Marlow Settle -Skilar Camden -River Deleon -Joziah North -Benedict Tubbs -Dallas Robles -Marlei Marker -Summit Toland -Ruthie Cowart -Ella Cooper -Kimberlynn Daughtry -Gray Wylie -Reilly Marquardt -Lanae Detwiler -Jacquelynn Murguia -Peyton Patel -Truett Pak -Royalty Woodall -Nella Hartnett -Lincoln Araujo -Shanice Colunga -Viviana Clements -Rania Mcwhorter -Xoe Binion -Kirill Garretson -Giorgio Minnick -Emmalina Alter -Kamdyn Platt -Bristol Estes -Rochelle Pitre -Destinee Hummel -Grecia Tierney -Dax Ritchie -Michaela Zhang -Decker Maier -Roslyn Mcdonnell -Adelaida Adrian -Ved Wegner -Landon Derose -Darian Fedor -Sara Ball -Cameryn Popovich -Roan Saxton -Hartlee Fontanez -Bailee Dillard -Leelah Gilmartin -Zania Willison -Cristina Whitt -Trey Wills -Jalayah Cintron -Rayden Velasco -Braylon Huynh -Kenson Loo -Kam Hibbs -Lochlyn Athey -Mekhi Fish -Emalee Groff -Javari Faria -Awa Halford -Mattilyn Dills -Giovani Hannah -Parker Moody -Chaim Gallo -Keiran Standridge -Blaise Lukens -Javien Ingersoll -Rowen Hong -Kaysen Erdmann -Khalani Goodall -Azucena Gregoire -Anisha Alcaraz -Kadyn Landau -Adlee Derr -Jareth Sandy -Kendall Cabral -Maddison Berg -Tyree Boston -Saryah Auger -Meera Bowser -Angel Jenkins -Amery Monteleone -Heidy Mchenry -Kensley Mcnamara -Grant Frazier -Allee Strasser -Ziggy Gong -Rosalinda Fleck -Campbell Foote -Klaire Pitman -Baylei Cicero -Jizelle Bryce -Miliani Chancellor -Ashlynne Staub -Stanley Rainey -Hatcher Yancy -Arlen Duhon -Landon Morgan -Lariah Bunnell -Eamonn Pawlak -Everlee Pappas -Malak Dawkins -Eian Pieper -Ehan Celestine -Kayson Sanford -Hillel Sistrunk -Halina Sowards -Lance Sheehan -Paityn Do -Deklyn Mckeon -Theophilus Teasley -Koy Heald -Eliyana Borrelli -Minna Barto -Markell Bianco -Keylin Deason -Janylah Kempf -Ivanka Searle -Shaylyn Glasser -Gunner Townsend -Xavi Brice -Avaya Begley -Maizie Cha -Dinah Strait -Jenny Rock -Jhene Almonte -Zyair Harless -Palmer Coles -Kaliana Knighton -Rudy Bauman -Gwendalyn Forsberg -Xochitl Florez -Jayleigh Guyton -Ainhoa Arruda -Nawal Judkins -Jordi Danielson -Declyn Bumpus -Meredith Belcher -Rueben Putney -Amira Ellison -Aayla Sotomayor -Jett Marks -Linus Marroquin -Avary Brittain -Bronson Bowles -Maylani Whyte -Jodie Neale -Bobbi Lavigne -Case Bruno -Adreanna Colyer - -Cristiano Spicer -Fausto Mingo -Brentlee Worthy -Neftali Mercurio -Zayyan Tincher -Eliyanah Corry -Amayah Kimble -Diamond Mccollough -Fredrick Overstreet -Devyn Sam -Alitza Frink -Nariah Pringle -Avneet Mannino -Eamonn Pawlak -Venus Voigt -Kamaria Dombrowski -Akayla Hohman -Kei Gideon -Eloisa Lamm -Jehu Cabello -Winslow Santini -Cormac Rooney -Makaylee Funderburk -Yolanda Gagne -Ysabel Longley -Erin Macdonald -Eliora Botello -Aura Kaye -Hogan Santangelo -Cameren Weigand -Sakura Corwin -Blanca Lindberg -Dariela Haider -Zyair Harless -Ori Pabon -Henley Wilder -Dillon Proctor -Zendaya Babcock -Reya Penny -Fareed Krol -Sury Lock -Carina Solano -Tania Houck -Mykel Ledezma -Keith Sosa -Kalista Rath -Lexani Asuncion -Juliett Stadler -Marcia Ahearn -Jerzey Nemec -Kendell Demaio -Kaidyn Hartzell -Isreal Tribble -Lillyana Sotelo -Aadhav Hermanson -Liya Swope -Kyran Counts -Abdulmalik Izquierdo -Ellinor Garry -Perrin Tallent -Dmari Bojorquez -Parisa Vineyard -Nayla Blank -Paradise Meadors -Eivin Cooksey -Mirabel Stith -Taten Hartshorn -Ellery Friend -Branden Parnell -Jusiah Cranston -Jeter Molloy -Anaisha Bevan -Joi Cave -Makeda Robillard -Jakhari Simmonds -Bryton Grasso -An Milan -Sequoia Nutt -Teagen Ivie -Kacen Ricker -Emory Downey -Raleigh Szabo -Deasia Padron -Javier Fischer -Deonta Thrift -Zailey Lenhart -Younis Knisley -Kinlee Barrow -Zion Eubanks -Silas Harper -Jasmin Jorgensen -Ellia Matheny -Caiden Underwood -Paxton Wolf -Patrick Stanley -Jayani Lucia -Leighann Mejias -Tyus Mchale -Yitzchok Farias -Jaziah Buie -Kenslee Flick -Miles Kelley -Gloria Newell -Quin Rubalcava -Khali Sines -Nomar Works -Priyanka Hansel -Rheagan Hartfield -Andrea May -Aylani Gormley -Swara Wooldridge -Nashley Bergin -Warren Case -Landin Boettcher -Jayleen Vaughan -Advika Nave -Cristopher Reagan -Snow Gault -Abdias Beller -Kaizer Lawhorn -Jadyn Hornsby -Jazleen Wallin -Allegra Leclair -Polina Sato -Maxx Ferrer -Rima Moncrief -Ethan Martinez -Cynthia Law -Kiarra Autrey -Carolynn Mincey -Kendell Thibault -Dustin Daly -Ciro Stryker -Rosemarie Streeter -Ada Berger -Arissa Palomino -Kenlie Halpern -Kullen Montana -Majesty Sigler -Karsynn Harbour -Nickolai Dossantos -Awa Halford -Larson Barta -Tyrion Somerville -Esma Eddings -Camden Fernandez -Tydus Beggs -Carmelo Dunham -Blakely Winters -Anora Blanks -Madelyn Shaw -Kerrigan Coble -Jaylon Spear -Jelani Shumaker -Hadley Jensen -Marquis Goldsmith -Aubreyanna Wager -Amilia Hannon -Graysen Laird -Geovanni Mccallum -Nazareth Gast -Mylee Sammons -Wesley Alvey -Aiyden Santillan -Jewel Hurd -Dylan Arias -Tristan Ferguson -Madhav Severino -Marlayna Ericksen -Kylin Deanda -Irene Dickinson -Isha Sebastian -Marianna Hadley -Mckenzi Alberts -Jayana Orcutt -Elder Fraga -Arianah Mapp -Fenton Spano -Rubi Upton -Meredith Belcher -Klay Mallett -Bellarose Schatz -Thomas Cox -Legend Cantu -Keily Cottrell -Arleen Millar -Zakariah Trull -Aysha Mcauliffe -Trisha Stull -Aydrian Belisle -Lola Mccormick -Quinn Roach -Bodie Barney -Eoin Villalpando -Suhayla Mask -Maryama Swaney -Moussa Ito -Latham Jakubowski -Genessis Dominick -Ambrose Held -Aaralyn Tiller -Jalayah Cintron -Zeppelin Laplante -Rita Mulligan -Berklee Sayers -Jalen Courtney -Alton Crawley -Anyiah Tapley -Mustafa Dumas -Max Armstrong -Aranza Carmichael -Kayley Muse -Josiah Cruz -Geovani Kerby -Lucian Stover -Koltyn Eisenberg -Griffen Poon -Bryanna Godwin -Violett Godsey -Lamonte Vaden -Khadijah Wadsworth -Elliana Hancock -Blakley Crowl -Analie Grable -Ameenah Surber -Guy Caron -Logan Mcintosh -Xayden Bane -Waylon Francis -Aveline Bader -Darlene Joy -Brennen Scanlon -Dominik Quick -Ellaina Holub -Dariana Lipscomb -Camia Revell -Briggs Coronado -Avyaan Manns -Josephine Estrada -Kelsea Pilcher -Jena Chaffee -Uri Melendrez -Jacee Lent -Padraig Senior -Zaiden Hendricks -Weslyn Helfrich -Mayer Rohr -Markell Bianco -Candace Luciano -Erabella Mcclean -Dylon Armbruster -Agastya Ballew -Annalyse Wojcik -Mavis Wilkes -Tanner Wilkie -Fatimah Alfonso -Elyza Mabe -Jewelz Wille -Oskar Catalano -Laniya Sikes -Esai Lozada -Jaleigh Sale -Sebastian Turner -Elvira Nickell -Presley Brady -Bradlee Dykstra -Jolee Maas -Teague Delafuente -Earl Kong -Alicen Hewlett -Julieta Wesley -Legaci Roane -Alastair Brehm -Naftuli Seguin -Soraya Torrez -Ailany Thomasson -Angely Sowell -Adelyne Klotz -Bay Engstrom -Darell Sanger -Simran Spires -Foster Dow -Ananya Parrott -Rishi Wharton -Camora Huckabee -Austynn Turgeon -Melissa Summers -Mattison Vaccaro -Evin Lovato -Violetta Caswell -Uriah Foreman -Eniyah Mazzola -Dannie Cancel -Ammar Littlejohn -Callen Finch -Aveah Nigro -Cooper Peyton -Corben Emerick -Truitt Feinberg -Royalty Forehand -Amen Chestnut -Sherman Woodring -Reaghan Alam -Jaida Roper -Allen Vance -Lincoln Barnes -Billie Pickard -Darwin Calvert -Halen Boutin -Ariany Linderman -Dariyah Nieman -Nechama Grantham -Walid Knepper -Cambrie Finnegan -Jan Chao -Karolina Hershberger -Kohen Hinson -Micaela Giordano -Indiana Stidham -Minnie Shade -Harper Scott -Aminata Forster -Sarina Hwang -Anastacia Ambriz -Brylen Lueck -Booker Humes -Sandra Arrington -Janie Brinkley -Bryer Mclemore -Blythe Ceja -Finnick Cartagena -Maddelyn Gallego -Zev Barrientos -Dorian Truong -Jessi Durden -Amelia Campbell -Danae Hermann -Dmarion Tasker -Jadelynn Husted -Aiyanna Priest -Kit Beaumont -Bawi Holzer -Nancy Michel -Adalyne Goodin -Kyngston Tingle -Stirling Cardillo -Nami Dey -Zebadiah Birdsall -Zeina Nussbaum -Jacori Hiner -Delilah Davidson -Tevin Bair -Vyom Faught -Jailene Liddell -Jaleigha Silcox -River Villanueva -Braylyn Liggins -Noe Padgett -Kaysen Aguilera -Ozias Pizarro -Alenna Gonsalez -Carolyne Rummel -Reniyah Bengtson -Marlei Marker -Charlette Turnage -Exavier Lebeau -Blayne Mccallister -Talan Eck -Carlisle Bridgeman -Lamar Wyrick -Ronav Lofgren -Thoren Parente -Marcella Corral -Theadora Chasteen -Zerenity Buckler -Phoebe Dickerson -Zaya Lanning -Enoc Rigdon -Brookelyn Schoonover -Miya Nowak -Syncere Dorn -Jabriel Burciaga -Rainy Brazell -Malaysia Krueger -Layla Sanders -Marko Hardman -Findley Waterhouse -Aryanna Tovar -Shaurya Parkinson -Kage Hard -Yumi Gerken -Winter Soileau -Talaya Stutz -Jacion Monday -Zoriah Grams -Huckleberry Biggerstaff -Asad Yin -Navy Conlin -Arya Schulze -Zury Macdougall -Collyn Sitton -Kamori Nevels -Maylee Vandyke -Elie Renshaw -Johnnie Hoy -Eleen Alfano -Fradel Frakes -Eleyna Burgett -Tory Shropshire -Romero Holz -Natalina Starke -Sianna Mccrory -Mayeli Geis -Malea Scofield -Vishnu Myatt -Jakeem Tryon -Hellen Domingo -Amna Palm -Shrey Frederickson -Jacob Garcia -Shreya Edmondson -Raylie Mcalpin -Pilar Sung -Eshal Maitland -Haddie Jacques -Citlali Cousins -Eason Seay -Axyl Broadnax -Brayan Xiong -Jones Guenther -Whitlee Kile -Ena Wortham -Muhammed Scully -Capri Saavedra -Kirra Franke -Ainsleigh Wan -Payson Hargrave -Maisey Lavelle -Dalylah Dulin -Ely Donahoe -Khylen Rowles -Maryan Bingaman -Cesar Roth -Eastyn Almaraz -Dejon Lenoir -Clara Jacobs -Neila Doctor -Brielle Bates -Christian Rivera -Montez Warwick -Shelton Lehr -Casimir Eklund -Becca Moye -Cassie Michaud -Khamari Timmerman -Alaiah Mullinax -Stacy Beckman -Valentine Benford -Lucinda Bertrand -Saydee Lightfoot -Shivani Bonnell -Tierra Pelayo -Manha Shumate -Elida Omar -Kian Merrill -Cailey Peeples -Zuleyka Benavidez -Zaeem Larrabee -Carmella Epperson -Carys Soliz -Kenton Vidal -Nirvi Starrett -Mila Henry -Sherlyn Navarrete -Finley Mack -Bridgette Luu -Jamila Rawlings -Deklen Lafond -Bryleigh Raines -Indra Deegan -Harriet Baughman -Deklin Bobbitt -Kaysen Erdmann -Trayvon Hutcherson -Andria Benning -Brantly Fried -Tiana Head -Lucienne Billy -Beatriz Majors -Amanuel Bozarth -Zipporah Hazen -Brendyn Saito -Kenzley Solorzano -Elmer Trammell -Uzair Giannini -Nakayla Borland -Jese Wehner -Reyes Bosley -Katiana Mosely -Shahd Schoenfeld -Selena Hobbs -Sadia Cordoba -Andee Vanegas -Barbie Sheaffer -Legacy Chong -Natalya Duff -Kamil Silvia -Musa Shook -Keyan Brookshire -Martez Ledoux -Theia Sledge -Brekken Tinney -Stacey Derrick -Isa Upchurch -Mariajose Sutter -Saira Sparrow -Edan Kowalczyk -Yahaira Talavera -Taleen Runge -Scotland Merry -Finnian Stockton -Erick Drake -Briseyda Bristow -Lashawn Mccourt -Infinity Mcgaughey -Naylah Mulvey -Kaisyn Dehoyos -Dana Aragon -Blake Gould -Dustyn Manor -Katherin Burgin -Josie Colon -Raymond Pham -Joziah North -Samar Hazelwood -Akemi Brodsky -Eiden Roney -Raider Landin -Scotlynn Backer -Star Ibrahim -Effie Bedell -Dennis Albert -Shakira Boardman -Bryan Wade -Reginae Wulf -Makenlee Just -Farida Gourley -Londyn Baldwin -Jazel Hummer -Benyamin Mcabee -Conlan Roseman -Jackeline Rupp -Roy Tillman -Daila Soles -Mercedes Comer -Karla Bright -Viana Towner -Stormy Snowden -Brihanna Wester -Alexah Lark -Irving Fahey -Haziel Frazee -Kallee Reep -Jackelyn Carrigan -Tremaine Mullis -Rosanna Gaskin -Valkyrie Voelker -Arian Wroblewski -Georgina Wyman -Adalin Templin -Channing Paulson -Lottie Mcvay -Bruchy Garzon -Aminah Boucher -Menachem Arteaga -Maybree Ginsburg -Kingston Montgomery -Emelyn Haller -Avree Mcglone -Ruby Bradley -Amaziah Eastwood -Donatello Winkle -Jeremih Kroll -September Kratzer -Bode Humphries -Favian Beecher -Alexandra Gilbert -Diana Heath -Omari Britt -Bishop Mock -Adelynn Mathis -Dinah Strait -Maddilyn Harry -Miko Arrieta -Embry Remington -Alyzah Maughan -Devonte Warden -Jo Fenske -Carol Freitas -Jorja Stott -Darrius Easterling -Demari Kiefer -Manar Banister -Celena Espiritu -Analiyah Buxton -Grady Woodard -Jaydyn Hageman -Collins Kellum -Luana Dulaney -Ishani Dee -Kareena Salley -Hazel Dixon -Brooklynn Blair -Alonso Greenberg -Levon Agnew -Chyanne Gaylord -Baila Keane -Layton Christopher -Prisha Masterson -Carla Souza -Annsley Glaze -Linnea Vanhorn -Adem Tse -Bryelle Scalf -Whitaker Ealy -Liliann Clemmer -Slade Scales -Braxton Silva -Kynslee Reich -Ward Garren -Neko Ayon -Timber Bradbury -Crystal Wooten -Soren Hastings -Kaela Groh -Axton Hand -Everardo Whittle -Kason Conrad -Scarlette Heard -Kenson Loo -Owen Torres -Adina Oates -Caesar Mateo -Elizah Jeffcoat -Kaeleigh Routh -Saja Wilfong -Samara Sinclair -Dior Darden -Jaicee Fuhrman -Mckinleigh Despain -Saori Malin -Korah Keil -Amorie Moretti -Leah Hamilton -Tayson Backus -Kooper Hairston -Cruz Grimes -Louie Nagy -Jordy Mccord -Eira Borchardt -Payslee Breland -Caelyn Mccutcheon -Jerry Guthrie -Reynaldo Forrester -Kamran Cordes -Elenore Dyess -Alainah Spratt -Kofi Canas -Corah Kurz -Sage Bartlett -Tahir Delp -Sahar Manriquez -Wilmer Monroy -Amare Adair -Graeme Turpin -King Guerrero -Khalani Goodall -Vihaan Ervin -Katalyna Guadarrama -Camdon Probst -Carrick Hetherington -Keniyah Davy -Merrick Mena -Margaret Mccarthy -Jaynee Stamp -Ophelia Sands -Myiah Valley -Yelitza Pettus -Mackson Pitchford -Zavien Garfield -Kade Reilly -Evey Stackhouse -Ashtyn Damon -Taya Bateman -Gema Lerner -Carrigan Chairez -Darla Osullivan -Dionte Bitner -Beverly Forman -Elias Rice -Advay Collard -Sakina Moller -Jasean Lowrance -Anabela Morfin -Lian Nesbit -Domenick Poss -Jahsiah Gwin -Branton Lerch -Courtlynn Abbas -Eidan Beamon -Jasper Moss -Leen Brill -Lakai Chauvin -Jaxsin Millet -Zian Recinos -Marlee Rasmussen -Haris Shreve -Daijah Merryman -Darrick Ressler -Wolfgang Albertson -Aliya Smiley -Deniz Mcdavid -Janylah Kempf -Kaylana Arney -Liliane Kugler -Zahira Firestone -Graceson Weidman -Rain Peter -Nila Hanlon -Alston Tedesco -Aydon Hui -Benson Esparza -Jayliah Sluder -Broxton Foshee -Leylah Luck -Treysen Kujawa -Kezia Fielder -Kelsie Gage -Juliette Gibbs -Charlene Pence -Yasir Eng -Brilee Nation -Edrick Slaton -Janiah Beaulieu -Antony Wheat -Ezekial Danley -Houston Darnell -Arianne Mccue -Jazaria Mccusker -Viggo Thrash -Pandora Bode -Chrisette Wittman -Phoenix Coffey -Saige Zapata -Brileigh Sturdivant -Karly Graf -Drea Steelman -Thatcher Shaver -Layten Maria -Fidel Popp -Janessa Buckner -Jovanni Banuelos -Caitlyn Magana -Ryett Christner -Aubree Spencer -Musab Winder -Atlas Slater -Alexandros Wayman -Charlee York -Lillyan Denham -Abdallah Batiste -Dayton Milton -Woodrow Hung -Ramon Stern -Aashi Heintz -Susie Wheaton -Livie Glidden -Tanush Lasalle -Paola Feldman -Maddalyn Theisen -Arjan Freer -Marwan Gandhi -Wylder Paddock -Envy Schock -Hailee Browne -Loryn Fiske -Aizen Sherrod -Kylei Castanon -Warner Buchholz -Kadyn Landau -Mianna Shock -Lenny Mccartney -Mesa Trussell -Jordany Wingert -Lizzy Lafountain -Claude Conners -Samaya Flannery -Maddux Kaminski -Paxon Colter -Tyleah Mcneese -Giuliano Messinger -Yuvaan Traynor -Joan Rafferty -Mileena Garay -Emi Augustine -Javien Ingersoll -Gabriel Futrell -Devante Loving -Carma Frisbie -Caliana Strickler -Amelya Rothstein -Keyonna Herren -Braylin Martines -Jeriah Roundtree -Clio Campa -Rudolph Loudermilk -Kameren Files -Paloma Barnard -Deonte Griffis -Berlynn Quinton -Alondra Mosley -Angela Bowers -Gisselle Knott -Maejor Pauly -Franklin Cordova -Ford Doss -Luciana Dickson -Liesel Munro -Daysha Conard -Randal Wachter -Camren Kerns -Vita Mcelhaney -Riggins Allgood -Alder Albin -Kendal Kitchen -Fatema Perrotta -Maliah Connors -Freddie Caceres -Uriah Goodnight -Suri Carlos -Zena Edens -Ronnie Zack -Maritza Coats -Ashleigh Desantis -Rylen Squires -Laikynn Edelstein -Youssef Ogle -Harleen Davey -Hindy Brinker -Carli Chisholm -Zada Hague -Mary Pearson -Yariel Haskell -Elisabet Scholten -Emile Vansickle -Josias Archuleta -Miranda Sweeney -Deanthony Judy -Kora Rodriquez -Shayne Bunting -Elaine Mayes -Navaeh Watanabe -Krew Mattox -Jaiden Tom -Nasya Loring -Lacey Werner -Demya Crumpler -Randall Toledo -Dayani Palomo -Abygail Alba -Eleanore Winstead -Kyli Salyers -Jeylin Million -Jaleel Bernier -Yasmin Sheffield -Cloe Harkness -Esha Strader -Aariyah Marley -Beauregard Trexler -Safwan Treece -Khai Henriquez -Daphney Charleston -Jesiah Whitmire -Lexus Button -Alaric Chatman -Tamera Senn -Azrael Sarver -Ayman Ocasio -Levi Murphy -Alyssia Spell -Erianna Bee -Gracelyn Mckee -Zaelynn Shabazz -Karsen Wold -Nihira Spiller -Oona Gooch -Karl Pfeiffer -Grant Frazier -Brandon Owens -Azalea Whitfield -Chavy Duffield -Rowan Eaton -Evalina Fredericks -Elanor Rife -Lian Keener -Shaylyn Glasser -Jaivion Carnevale -Annika Talley -Waylan Hammel -Dimitri Prescott -Salvador Coffman -Omere Koo -Millicent Dupre -Dea Enlow -Zacharia Neiman -Caylee Stiles -Makhi Kumar -Caden Park -Maleena Carbaugh -Alijah Bracken -Avelyn Vargo -Rafael Decker -Nicolo Stroman -Jayvian Dilley -Kingdavid Mirza -Jaelynn Ng -Osvaldo Goodson -Damiyah Blodgett -Avery Neal -Bennett Day -Chole Buckman -Binyomin Ridgway -Kyndall Trotter -Shivam Grose -Aidan Vazquez -Brie Pounds -Hillary Shanks -Zaydin Pattison -Colbie Chance -Errol Haugh -Maahi Ronquillo -Elisha Gil -Jacy Burress -Arlene Epstein -Tyshaun Hennings -Johnpaul Brinson -Kingsley Jarrett -Madalynn Childress -Sabir Leininger -Nour Stephen -Misha Jacobo -Ishmael Hopson -Zyaire Stclair -Shae Ayres -Curtis Tracy -Olan Mong -Trevon Carreon -Bridger Nunn -Sephora Warrick -Rhythm Fleischer -Dolores Vanness -Marielle Westmoreland -Elnathan Ogletree -Ameen Nester -Raylee Bergman -Lucie Asher -Matai Esteves -Keren Agee -Raylen Linden -Perry Kelso -Quinton Gustafson -Aralynn Guarino -Bastian Mccrary -Abdelrahman Rives -Raniya Otte -Darnell Longo -Edvin You -Kynnedi Drayton -Cameryn Mariscal -Everly Vega -Quinn Munoz -Leif Stoddard -Emilia Benson -Qasim Granado -Arlo Slay -Talitha Carper -Kori Saville -Guadalupe Chamberlain -Dawud Ahumada -Macklin Quinonez -Akshay Whiteley -Craig Knutson -Melannie Vollmer -Cleo Phelan -Bowen Helms -Annmarie Luce -Kennedy Porter -Jacari Ferrari -Lailah Crouch -Harlem Moreau -Brailynn Beeman -Raigan Obregon -Chavy Duffield -Dave Amundson -Khang Heinen -Meilani Fitch -Ishan Skipper -Lahna Bobadilla -Lotus Sifuentes -Makenlee Just -Inna Mentzer -Darci Grajeda -Juliano Devera -Chastity Rentz -Mathilde Decosta -Skyler Knox -Tim Denison -Aryanna Tovar -Judah Jasinski -Cindy Greco -Kian Merrill -Hartley Braxton -Zymere Bainbridge -Elija Peppers -Boe Gendron -Salena List -Elan Charlton -Octavio Mayberry -Korie Curtin -Madisen Crittenden -Denver Ashby -Christan Paugh -Keisi Duron -Braylin Martines -Jaila Homer -Keelie Spindler -Leighann Mejias -Hanan Greenwald -Esther Saunders -Nizhoni Grafton -Jaylyn Mandell -Mahlon Brooke -Maayan Calderone -Marley Soriano -Emmery Paterson -Dejah Maddux -Keely Beall -Marisela Bontrager -Mark Mckinney -Natalina Starke -Reginae Wulf -Harlan Wideman -Buck Caviness -Nevan Lail -Rebekah Carver -Amaryllis Binkley -Brystal Orton -Karleigh Staples -Judah Miranda -Journee Sexton -Caelan Truax -Rowen Gresham -Renner Kornegay -Kaili Borja -Naveen Fast -Jamar Loomis -Jerzee Pastrana -Niah Upshaw -Oliviana Ranson -Timofey Dutra -Zaidyn Lumpkin -Clifford Ricketts -Marely Baumgardner -Carina Solano -Rusty Squire -Kamber Almendarez -Arik Nelsen -Oakleigh Higgs -Jaziah Mckeever -Maylie Grindstaff -Shane Whitaker -Makynlee Vicente -Henson Cowden -Eve Rowland -Danah Fragoso -Katana Farkas -Dillan Sager -Canaan Trent -Corra Kass -Kwame Penland -Aishah Ku -Shamya Saba -Mykah Ochs -Gwenyth Matlock -Kyara Newland -Naeem Mapes -Caprice Countryman -Marshawn Ellington -Annasophia Bove -Aubreanna Leboeuf -Harlym Didonato -Kaito Skeen -Adelina Crowley -Davien Digiacomo -Mateus Schutt -Zamarion Busse -Jazlyn Haney -Rylan Urban -Janay Vanburen -Emberleigh Barroso -Porter Baran -Suhaib Zurita -Adalyne Goodin -Jayce Burke -Kamia Svoboda -Aerial Halter -Alesha Laboy -Fabio Reavis -Clarisa Cogan -Gibson Mark -Collier Eberle -Carrick Hetherington -Glory Peak -Arden Bermudez -Angelynn Geiser -Audrey Graham -Karizma Brokaw -Michele Hulse -Jahziel Jacquez -Horacio Dorado -Izabell Colton -Remmy Boyette -Landon Morgan -Morrigan Philpot -Skarlet Schuetz -Miller Kling -Lacy Trout -Gregorio Dong -Kelly Maki -Reid Hess -Lian Keener -Poppy Cagle -Bea Olney -Gavyn Dowd -Sahil Stroup -Ysabella Trombley -Joella Reinke -Ashly Brinkman -Jalaysia Polite -Zyler Shen -Moksh Gulledge -Chantelle Smedley -Kaira Conover -Jessy Fillmore -Keziah Singletary -Jaydan Pemberton -Akai Hedge -Mirna Braddy -Skyla Quintero -Seraphine Bittle -Damon Haley -Odalys Salmeron -Kylea Dowden -Zaedyn Witcher -Eoghan Copp -Zia Devore -Demarius Endres -Mariangel Charron -Anne Holley -Indiana Langlois -Azaleah Farah -Zayvion Mayhew -Mckinnley Kilby -Samarah Flack -Jessy Philpott -Yulissa Plunkett -Emy Mak -Hudsyn Ludlow -Levi Blaine -Calina Sisneros -Callahan Gillen -Lucille Phelps -Afton Mcclintock -Lakelynn Avant -Sommer Dann -Linnea Vanhorn -Lennox Lancaster -Lilith Oneil -Luc Son -Dakota Mccullough -Dalton Kane -Zori Ledet -Georgiana Alicea -Ansel Main -Lennon Stinson -Khaleel Dilorenzo -Atziri Vereen -Myra Kern -Jeancarlo Mcanally -Jahsir Dressler -Zayna Rausch -Kaidyn Hartzell -Auston Delvecchio -Karen Kaiser -Urban Gatto -Zamiyah Yarborough -Sherlyn Navarrete -Casandra Hering -Carsyn Willey -Baleigh Mallon -Blakelee Rodarte -Meika Cropper -Lyndi Giffin -Priya Zaragoza -Allisyn Ruano -Graci Ascencio -Craig Knutson -Hawa Hofer -Drew Corey -Laron Hsieh -Taran Naughton -Gracelynne Fiorentino -Lillianne Mcclinton -Kingsley Jarrett -Amanuel Bozarth -Warren Case -Semaj Paschal -Caris Seale -Wayde Sandhu -Michal Menke -Knox Owen -Kylin Deanda -Yetzali Moynihan -Catalia Vong -Ahad Guth -Kamea Jiles -Pepper Cooney -Ahtziri Nilsen -Larkin Cottle -Dakota Olsen -Trever Kuehl -Aaden Angel -Bryston Mustafa -Rustin Galicia -Lexani Asuncion -Mikel Wheatley -Elizabeth Carter -Mika Beebe -Salman Donald -Kloee Jurgens -Nariah Pringle -Donato Gilliard -Kain Sell -Lenna Peavy -Eisley Vann -Semaj Coley -Nikole Chiles -Dariel Dill -Avery Collins -Chantal Ruppert -Eliyah Bethel -Aspyn Neville -Giancarlo Queen -Eden Katz -Chase Nowlin -Makenzy Vice -Alessandra Abbott -Cady Renz -Zury Macdougall -Tyson Christian -Cloud Gehrke -Rosie Egan -Yahir Metcalf -Zya Fore -Paloma Barnard -Arriana Gambrell -Nika Woodcock -Sage Stroud -Dominique Whitlock -Novalee Wetzel -Madysen Gilstrap -Kelly Good -Adalyn Barnett -Randi Deboer -Manolo Apple -Lainey Blanco -Verona Burman -Kacper Hersh -Elyjah Lemieux -Paris Jay -Kobi Torrey -Robby Gorden -Skyleigh Coelho -Maxx Ferrer -Audriana Eason -Salah Cornelison -Otoniel Engels -Alaya Kurtz -Yonatan Strunk -Cataleya Friedman -Luqman Palomares -Melony Cassady -Shourya Magill -Lundyn Desrosiers -Jarrell Aubrey -Windsor Spry -Madaline Addington -Niya Reiter -Jair Sharma -Amarri Callison -Daya Harbaugh -Orianna Monteiro -Stryder Neary -Kamora Christman -Kamdyn Allard -Mahogany Rupert -Arsema Chitwood -Avelina Abrego -Avani Falcon -Aydrian Belisle -Amaiyah Fontes -Kashton Deluca -Lillee Slayton -Sarina Hwang -Ashur Mckean -Jaslynn Mancuso -Alyzah Maughan -Dawn Hanes -Naksh Stringfellow -Makynzie Babin -Mona Garibay -Aryam Fortuna -Mirella Sirois -Kroy Mayers -Karson Dorris -Elisa Terrell -Alexie Pompa -Fabrizio Reams -Janiece Channell -Karlee Tomlinson -Talitha Carper -Zaidan Gruver -Ruston Sealey -Ilias Elswick -Randy Lim -Daxx Leitch -Philomena Loper -Maaz Struck -Mendy Jacobi -Sena Kissinger -Macklin Quinonez -Layne Peterman -Dayanara Steel -Maniyah Warr -Galilea Crabtree -Irvin Minter -Ilona Cureton -Miriam Villarreal -Melinda Dowdy -Yareli Root -Kabir Devries -Genesis Stone -Jazlene Bostwick -Faigy Soares -Kennadee Peraza -Angelique Welsh -Marciano Rana -Lynnlee Buell -Alahna Roos -Renesmae Suttles -Iveth Monteith -Akiva Huntington -Fox Lo -Caydon Tollefson -Aira Telford -Jaxston Montenegro -Kaesyn Fessler -Agustin Malloy -Naiomi Laroche -Daelyn Truesdale -Anna Marshall -Sullivan Rambo -Thorin Acuna -Callie Blake -Love Moffitt -Zaeden Ozuna -Alexiana Threatt -Saw Earp -Levy Barner -Mariano Hein -Legend Mulkey -Armon Northcutt -Saad Deyoung -Kalia Beavers -Dusty Thompkins -Christianna Clanton -Dempsey Stivers -Eliza Rojas -Kasyn Eden -Ezekial Danley -Dev Luttrell -Lux Caddell -Davontae Scheller -Azari Soule -Yovani Jordon -Mauricio Guy -Paityn Do -Hennessey Mccammon -Ceasar Burlingame -Paulina Crocker -Dresden Pitcher -Tariq Bergstrom -Annabel Sykes -Simone Healy -Camden Fine -Emelie Sanmiguel -Emelyn Haller -Emmaleigh Razo -Lucio Clarkson -Kyro Haughton -Marlie London -Sachi Creek -Sirena Hom -Demarco Covert -Melanny Mayorga -Harlowe Walley -Patrick Stanley -Kitai Bing -Zissy Barrington -Kailey Delaney -Shekinah Hulett -Hernan Howes -Sutton Sorenson -Ayumi Brockett -Harini Fulks -Saylor Snapp -Hendrix Burson -Yehoshua To -Paulo Bare -Rhian Highsmith -Jeffrey Carey -Jordany Wingert -Arda Bilbrey -Katiana Mosely -Wendell Amin -Alexxa Schuman -Atarah Maravilla -Sima Grimsley -Kasen Ritter -Jakson Bancroft -Avigayil Kennon -Kiersten Tobias -Klynn Wolters -Blakeley Whiteman -Hudson Perry -Bentlee Houser -Leasia Urquhart -Kyngston Tingle -Dayana Hatcher -Alivia Osborne -Savana Thomsen -Rainier Corpuz -Leeanna Sikora -Emili Brainard -Carlo Curley -Xavien Cataldo -Kelani Cunha -Teagen Shamblin -Alyssia Spell -Adrienne Ferris -Jamiya Pantoja -Kaydee Vanmeter -Bakari Krouse -Jarrod Mccurry -Grey Creighton -Truth Petit -Georgette Kucera -Maisie Mcgill -Dallin Bankston -Melisa Tarr -Analy Garrity -Christal Cardin -Prince Mcfarland -Kapri Ketcham -Kaliah Delvalle -Sahara Crider -Klarissa So -Harlen Palmieri -Atara Gaul -Kassandra Newsome -Laiklyn Geraci -Infinity Mcgaughey -Kamran Cordes -Ainhoa Arruda -Ariadne Biggs -Camora Huckabee -Lucian Stover -Lamiya Alejo -Morris Mundy -Carmen Knapp -Slade Scales -Roxie Jaquez -Pyper Helm -Keyla Purcell -Fenix Skiles -Axton Hand -Nayan Hargraves -Aadi Sim -Eva Weaver -Josalynn Shope -Vinny Markle -Rozlyn Hudak -Jaxyn Palazzo -Aryana Montano -Sanaya Mull -Braxtin Lampert -Kiarra Autrey -Aziah Muth -Jaylynn Whalen -Raizy Kohn -Margo Douglass -Kendal Kitchen -Martez Ledoux -Hilary Fender -Meila Edelman -Inara Dockery -Niomi Beachy -Essie Fanelli -Noemi Hurtado -Shmuel Guillory -Genevie Govea -Josefina Munguia -Christian Rivera -Declyn Bumpus -Carson Foss -Gibran Bevins -Alyssandra Nestor -Ricardo Cain -Ember Odonnell -Ahsan Falconer -Anushka Harrigan -Irma Trowbridge -Dario Thayer -Legend Cantu -Thaddeus Hammer -Bianca Hardin -Josilyn Aguinaga -Eli Creasy -Anvi Ginn -Caraline Borst -Danna Dotson -Melody Lyons -Evalee Dirks -Vanya Willman -Jeison Feliz -Dariana Lipscomb -Johnhenry Berge -Adrina Mancilla -Zlata Mellinger -Nicole Bush -Aminata Forster -Kayleigh Stephenson -Clayton Buchanan -Rylin Czarnecki -Giovanna Regan -Zakariya Turley -Job Lemay -Kelcie Quimby -Aariyah Marley -Braydon Arthur -Hadlee Coates -Leslie Ta -Kingston Montgomery -Jameson Parada -Misa Birnbaum -Scotlyn Totten -Roslynn Georges -Elisia Brunelle -Darrien Larocca -Neala Presnell -Cydney Breckenridge -Mikah Jain -Brionna Colucci -Jarell Delano -Adelle Pinkerton -Yassin Coward -Brenda Lilly -Shemar Mciver -Hisham Farlow -Maida Guyer -Savior Revis -Liberty Quintana -Eleen Alfano -Fiona Logan -Jezebel Dake -Nihal Lavallee -Nivea Brook -Marla Pride -Kaylyn Oswald -Zamir Farrar -Eli Wood -Kacy Kreider -Niall Tyrrell -Jannat Ammons -Soledad Seng -Emina Loney -Mayleigh Burcham -Iona Iniguez -Oden Moorman -Jay Villa -Jeimy Caplan -Adriana Curry -Maxine Keating -Brynna Pinson -Julian Rogers -Aslan Jeanbaptiste -Aniston Bustos -Charlea Peguero -Atlas Slater -Jarred Shaner -Corinne Reece -Jazaria Mccusker -Aloni Flower -Aniylah Koester -Lamont Marvin -Stockton Chalmers -Honor Pauley -Kourtney Pimentel -Christabel Schuller -Zahara Cheney -Janiyla Culberson -Shaniyah Weimer -Maram Willette -Bowie Dingman -Emre Mckinzie -Dalyla Kindred -Jaydah Nelms -Riyah Haygood -Jaythan Martineau -Mari Harbin -Carlton Mazur -Kenslee Flick -Magali Corbitt -Paxtyn Bye -Rubi Upton -Abdulrahman Valdivia -Susan Ma -Yisroel Hearn -Rudy Bauman -Ayla Houston -Saul Lehman -Aric Rounds -Sunshine Milne -Annemarie Mcfarlane -Belinda Stearns -Mackson Pitchford -Analeah Scholl -Gretchen Hills -Shilah Peachey -Trayvon Hutcherson -Jacory Ober -Vansh Alegria -Immanuel Light -Kamya Volpe -Jenna Hensley -Kirby Witkowski -Jariah Partida -Shreya Edmondson -Akash Forest -Kaelan Medellin -Sultan Oaks -Jomar Chartier -Maher Rashid -Constantine Peebles -Caeli Cai -Camille Montoya -Unknown Toy -Danyla Percy -Marlyn Aucoin -Maricruz Dail -Maylen Gartner -Ronen Stitt -Silvano Preece -Easten Prevost -Lake Hagler -Cody Gu -Tierney Banner -Chancellor Hutchings -Mehmet Galaviz -Joab Kapp -Aylen Bromley -Aisha Andersen -Eimy Riojas -Mackayla Mceachern -Ione Lamoureux -Anyiah Tapley -Kala Mastin -Demetrius Schmitz -Zophia Shrum -Isha Sebastian -Anay Canty -Madigan Osterman -Mollie Yanez -Keeva Litchfield -Milly Wimberly -Akshay Whiteley -Yahel Barnwell -Daphney Charleston -Kenyon Heim -Cian Myles -Kynslee Reich -Wyatt Evans -Faizan Boice -Tommie Montalbano -Kylynn Veal -Cason Joyce -Marie Mcdermott -Saylor Cano -Roberto Santana -Annalie Chiang -Emett Grill -Valor Morehead -Aayla Sotomayor -Ayala Lower -Harris Seals -Emari Hovey -Amin Iglesias -Cayden Dennis -Ada Berger -Braylie Schutte -Brea Fogle -Ahna Geist -Jerzey Nemec -Amaru Depasquale -Kinleigh Irving -Amauri Broome -Torin Fraley -Allena Durante -Abhiram Heffernan -Champion Honea -Brayla Krawczyk -Genavieve Lipp -Gwendolyn Michael -Jaylin Yost -Matilda Justice -Seraphina Pyle -Grey Schrader -Madilynne Tunstall -Kenzington Ong -Alisa Keen -Emilly Moffatt -Evans Soucy -Kaylin Jamison -Echo Pfeifer -Brysen Weiner -Deasia Padron -Iman Laureano -Jean Jeter -Larissa Calloway -Willa Krause -Adeline Leonard -Darian Eddy -Aylin Kerr -Aidan Vazquez -Jaxson Ruiz -Mitchell Ventura -Cari Beacham -Sailor Bey -Payden Bisson -Lelani Desalvo -Octavious Lorenzen -Hardy Jaworski -Samya Cobbs -Jaziah Buie -Josie Colon -Alexandros Wayman -Brookelynn Gatlin -Aahil Oden -Nivaan Ruble -Shulem Pagel -Bronson Bowles -Haley Horn -Madison Nelson -Riggs Trainor -Yanely Cedillo -Tyshawn Keeling -Greyson Pirtle -Zakiya Guffey -Alannah Jeffries -Maci Randall -Savion Dupont -Devin Lara -Elma Tai -Annalicia Wanner -Roderick Wakefield -Meghan Burroughs -Hogan Santangelo -Race Marini -Solomon Calhoun -Everlee Pappas -Kaiden Dalrymple -Luiz Reinert -Joesph Berardi -Lenin Schumann -Mishka Bowes -Joanna Parrish -Samiah Jara -Jordan Powell -Adalia Colburn -Haylen Midkiff -Kenlie Halpern -Travon Hoag -Aadyn Bakke -Jurgen Elia -Jusiah Cranston -Elodie Schwarz -Karalyn Boulware -Jariel Schiller -Mackenzy Ippolito -Kade Reilly -Kinley Yates -Omari Britt -Allyanna Swinford -Nikolay Ferrier -Rex Swenson -Tyrone Huston -Bryer Mclemore -Alayah Mayfield -Zaydee Paulin -Khalif Spina -Essa Vannoy -Ehan Celestine -Yaniel Shockey -Mailen Yung -Jovanna Marmolejo -Taytum Obrian -Athalia Serafin -Valentine Pedigo -Timur Thrower -Khole Scribner -Wisdom Raab -Deonna Mulholland -Hayleigh Dias -Cai Trice -Katie Booth -Jeancarlos Camargo -Hayes Bradberry -Betsy Bethea -Jamaria Hardiman -Arlyn Constantine -Lenore Roderick -Zarah Villasenor -Arionna Slocum -Yelena Kight -Marion Anguiano -Lucero Noll -Maverick Vaughn -Karsen Dasilva -Elissa Randle -Eesha Arbuckle -Giovanni George -Stellan Wofford -Alayia Hendley -Avyana Sly -Kalliope Gingerich -Aksel Menard -Braden Fry -Aalayah Fiedler -Finn Dougan -Dirk Delcastillo -Ashton Austin -Pranavi Delcid -Banner Pepin -Rudolph Loudermilk -Elektra Schuette -Naiara Carillo -Jairo Whittington -Jalisa Muro -Benny Parry -Gabriela Mckenzie -Rick Chou -Leopold Strain -Christen Marcano -Aavya Rachal -Monserrath Liao -Aalyah Collis -Azael Elrod -Rima Moncrief -Favour Mcgann -Leiana Babbitt -Kitana Guido -Matai Esteves -Jaclyn Babb -Johanna Marino -Aleyah Barksdale -Jori Griner -Fannie Brister -Camia Revell -Jaynee Stamp -Lars Gilbertson -Johana Cable -Haisley Cantwell -Genesys Poteat -Wolf Jacks -Destin Birch -Brissa Batson -Darrion Salomon -Landry Mccollum -Kaylinn Sharon -Rooney Middlebrooks -Anilah Willhite -Dylann Marchant -Amoura Mauk -Gabby Deming -Kevin Stevens -Jaden Kingsley -Zariah Vang -Jariyah Donato -Malique Lovelady -Payden Langan -Joseangel Makowski -Elin Mcneal -Briar Dukes -Daryl Pease -Josemaria Embrey -Iyanna Carrera -Zaliyah Verduzco -Lielle Linkous -Kirill Garretson -Julien Meier -Eldon Fell -Gittel Mcculley -Calee Gasca -Devonte Warden -Shaurya Parkinson -Rashaun Hammon -Landen Khan -Jensen Mayer -Revan Renaud -Ayra Lashley -Galileah Blaney -Simeon Orellana -Aela Rayford -Shaniya Marx -Neriah Rushing -Aron Lovell -Desmond Shannon -Dempsey Luckett -Reyli Karns -Aidan Vos -Bliss Berglund -Ayda Dorr -Landrie Gower -Leighton Daugherty -Favor Dupuy -Maelee Chew -Hilario Casella -Japheth Massaro -Marilynn Quesada -Acelyn Lavery -Brynnlee Neuman -Kelis Munn -Aidyn Lima -Lake Marler -Xaria Almaguer -Bryant Grady -Legacy Wooley -Scarlett Richardson -Ever Dexter -Alessandro Payton -Zaniah Palacio -Marlo Blessing -Amiliana Palazzolo -Vivian Wheeler -Daylin Bay -Arya Schulze -Jazzlyn Pruett -Dominique Talbert -Esmee Chinn -Easton Hammock -Justice Hanna -Mylo Belton -Elloise Arzate -Martina Grissom -Skyler Castaneda -Fermin Peden -Lucien Bouchard -Bradleigh Karim -Edan Kowalczyk -Kalayah Mick -Dominik Quick -Oluwadarasimi Prickett -Viola Coughlin -Avrie Bogle -Veronica Blankenship -Luka Moser -Alyson Plummer -Wynn Dillman -Kinzleigh Lapierre -Railey Simonsen -Cayleigh Deguzman -Ted Widener -Judson Benedict -Lily Reyes -Vihaan Ervin -Laura Ibarra -Arleen Millar -Brookelyn Schoonover -Kailah Chrisman -Shivam Grose -Shrey Frederickson -Gianni Godfrey -Kenadee Armijo -Francisca Cannady -Willard Beane -Jaiyana Hoggard -Rayna Pierre -Ramona Paris -Ellanor Fenwick -Zenaida Huckaby -Dev Luttrell -Ari David -Jenna Hensley -Gabe Joe -Ty Bolton -Atlas Slater -Aubreigh Fabian -Yvette Clancy -Sparrow Plascencia -Adabelle Kyser -Brinkley Pomeroy -Gracen Haase -Francesco Chun -Rayah Steinke -Kenzleigh Logue -Abran Canaday -Egan Vizcarra -Alexandru Alpert -Aubrielle Sprague -Artem Donner -Carrie Fennell -Kalissa Murdoch -Antonia Kiser -Ariel Becker -Zayvian Paradise -Lawson Church -Elowen Landes -Rosalinda Fleck -Belinda Stearns -Ari Sumner -Halie Stella -Keshaun Batt -Agnes Hinds -Alexah Lark -Zakiya Guffey -Glory Peak -Markell Bianco -Gitty Gooden -Emri Coomer -Amna Palm -Jamar Loomis -Kyla Leach -Skylar Billings -Niyla Yaeger -Scarlette Heard -Lacy Trout -Nataliya Lovely -Leora Bowens -Shae Ayres -Mahogany Rupert -Brynna Pinson -Oziel Meister -Reeve Viramontes -Auriella Minnich -Divina Bergmann -Lukah Agosto -Ameir Honaker -Braylie Schutte -Iliana Melvin -Kwame Penland -Alayia Hendley -Hogan Santangelo -Mckenzee Go -James Taylor -Christen Yoshida -Colston Battaglia -Azariah Sewell -Emran Kwak -Dafne Viera -Immanuel Light -Kainan Nero -Aleigha Brenner -Mordecai Gosselin -Teodoro Peer -Yareni Deel -Nasya Loring -Ivey Ashworth -Anisha Alcaraz -Anneliese Venegas -Janylah Kempf -Brayden Sullivan -Zaine Kunkel -Sloan Quiles -Talia Farrell -Coy Benner -Mayleen Toussaint -Amora Culver -Vito Dunne -Raheem Leavitt -Glen Gerard -Trisha Stull -Zacharia Neiman -Calvin Chambers -Jencarlos Showalter -Elloise Arzate -Anastacia Ambriz -Alexi Hoyer -Safwan Treece -Flavio Natividad -Deborah Bower -Freya Mcmahon -Catelyn Hawkes -Melanny Mayorga -Pascual Scheel -Jamieson Armentrout -Lillee Slayton -Hayes Bradberry -Danyelle Gama -Dariah Adamski -Ryley Ahn -Elida Omar -Sherry Lear -Maizey Hector -Onna Bednar -Kobe Langley -Eliyah Bethel -Sky Hendrick -Davin Stjohn -Meir Greenfield -Eliab Slavin -Jolina Pelfrey -Andi Pick -Allee Strasser -Carolynn Mincey -Mackenzi Oceguera -Leana Knudson -Demond Harness -Fallon Henning -Mirabella Mccleary -Naya Whaley -Dennis Albert -Wynn Kuhns -Maida Guyer -Bowie Lombard -Abbigail Jung -Whitlee Kile -Nino Sites -Abril Dobson -Briasia Pletcher -Ellah Mumford -Elena Dean -Marlowe Schilling -Loretta Ojeda -Torrance Dinardo -Carissa Ha -Lia Mercado -Devante Loving -Tamya Gurrola -Kamdyn Platt -Otis Keys -Yuvraj Sadowski -Tanner Goodwin -Luisa Adamson -Layah Silvers -Kameron Abdullah -Nashley Bergin -Lea Jewell -Colter Beverly -Agastya Ballew -Jailah Brace -Campbell Foote -Louie Nagy -Erick Drake -Makiyah Coyne -Haven Doughty -Kyle Byrd -Denim Sarmiento -Olivier Bear -Corrina Blais -Cassia Wampler -Daven Benn -Devansh Osteen -Mischa Lafrance -Lillian Hughes -Ilah Bjork -Jakoby Burrow -Daizy Koger -Azaleah Farah -Nathen Fellows -Jakyla Labarge -Artur Harsh -Graeson Sabin -Kristyn Troup -Jeffrey Carey -Shanaya Callaway -Jackson Elbert -Evelyne Belknap -Malikai Osburn -Roosevelt Bigham -Jaiden Tom -Lakelyn Byler -Elias Rice -Dior Darden -Ainara Purnell -Amena Ernest -Alejandra Oconnell -Kyngston Tingle -Justyce Broderick -Abbygail Clevenger -Estevan Hawes -Truitt Feinberg -Lilyanne Guess -Tenlee Halvorsen -Milagro Yarnell -Henleigh Gillispie -Jeanna Trader -Thomas Cox -Najee Mcvicker -Carlie Cavanaugh -Jax Alvarenga -Mckinnley Kilby -Veer Kimmel -Chimamanda Napoli -Cozette Stonge -Ricki Bessette -Karsen Dasilva -Alain Alger -Jimmy Shirley -Audric Schmucker -Calee Gasca -Anila Lavine -Ingrid Benavides -Zahira Firestone -Dandre Shorter -Zephaniah Estrella -Analisa Frankel -Hernan Howes -Anna Marshall -Parks Juan -Amarion Brink -Braidyn Kroeger -Bushra Blackshear -Izabel Krebs -Amya Thomason -Clare Neely -Harli Dixson -Aubri Kincaid -Sabrina Barrera -Ernesto Carrasco -Crew Kraft -Sydnie Rost -Crimson Carruthers -Paxtyn Bye -Florence Sepulveda -Maddalyn Theisen -Maya Rose -Rahma Conlon -Royce Dale -Rio Evers -Cruz Bukowski -Lawton Campagna -Kamren Dupree -Eternity Partin -Walden Raymer -Jaretzy Chee -Yasmin Sheffield -Hadeel Hoeft -Donnie Conti -Omar Mclaughlin -Alexander Thomas -Messiah Farina -Holland Madrid -Nasir Mcfadden -Desmond Shannon -Gwendolyn Michael -Scout Madsen -Marshawn Ellington -Jaythan Martineau -Amaiah Kunze -Matilda Justice -Gabriela Mckenzie -Shaya Dacosta -Mariajose Sutter -Maysen Eckstein -Naisha Paulk -Jak Silvey -Silvana Guerin -River Villanueva -Ridley Carnahan -Divine Hassler -Rooney Middlebrooks -Raidyn Lepage -Perel Guadalupe -Kayleb Her -Johannah Merino -Cedar Kirchner -Samyah Oleson -Marbella Siler -Anabell Bustillos -Thang Constant -Kaysen Erdmann -Dayton Milton -Braelee Coots -Caitlyn Magana -Yadier Ingalls -Maiah Tobar -Mitchell Ventura -Anilah Willhite -Wyatt Evans -Devan Waldrop -Niles Carder -Alenna Gonsalez -Taiden Yocum -Zoi Brawner -Valentine Pedigo -Dalton Kane -Nihira Spiller -Seven Aitken -Everett Lawson -Markeith Mathewson -Abbey Rhoads -Aleen Boren -Abigail Lee -Delila Fee -Hanley Jun -Amari Davila -Mattison Vaccaro -Ivette Melson -Adian Fritsch -Carson Burns -Esma Eddings -Maiya Cornwell -Lennix Yap -Doris Derosa -Anjel Matus -Namir Lechuga -Callahan Gillen -Marietta Ebel -Naiomi Laroche -Jethro Huey -Amberly Lennon -Khaleel Dilorenzo -Taha Rohrer -Avyanna Barrows -Minka Cascio -Alston Tedesco -Delyla Mullaney -Khaza Hollar -Eldana Strang -Kelis Munn -Jazlyn Haney -Mahmoud Driggers -Laycee Stanger -Maniyah Warr -Lelani Desalvo -Chole Buckman -Krystal Valadez -Laniah Hake -Toryn Lozoya -Monica Corona -Richelle Standish -Brook Harwell -Christine Milligan -Ryah Mcnamee -Pax Lamont -Naeem Mapes -Embree Chisolm -Reagan Obrien -Analeigh Keel -Fredy Elliot -Ephraim Hawk -Aanvi Mader -Aralyn Klug -Arien Chafin -Rene Machado -Julian Rogers -Leeah Tolley -Maesyn Redfern -Jaxie Mccarroll -Dakarai Mccandless -Izzy Earls -Khalif Spina -Wilbert Lefler -Akshay Whiteley -Janiah Beaulieu -Aspen Prewitt -Ciana Schenck -Lavinia Prior -Nazareth Gast -Oumou Powe -Ryland Matney -Cheyann Serio -Shelton Lehr -Kailynn Pendleton -Mustafa Dumas -Tristyn Emanuel -Kacie Robledo -Amillia Crabb -Myer Maine -Blessyn Mertens -Elmer Trammell -Kerry Cumming -Marisa Kelleher -Lebron Elledge -Lyric Chase -Emersyn House -Ember Odonnell -Mckenzi Alberts -Tymber Stapp -Adolfo Montanez -Louella Corso -Nomar Works -Analy Garrity -Arius Dvorak -Rishabh Rehm -Sybil Amaral -Makaela Ducharme -Khai Felt -Aariz Dionne -Anushka Harrigan -Cayman Lineberry -Shaelyn Wilhite -Meena Blumberg -Alli Dube -Jamyla Runkle -Myanna Gaudette -Kolbi Doster -Taylar Pegram -Steele Scroggins -Adelise Sabol -Zailey Lenhart -Zionna Harshman -Eshan Siebert -Kirby Witkowski -Erabella Mcclean -Malakhi Luong -Courtland Haworth -Lila Gallagher -Jael Whatley -Campbell Canfield -Kambree Mazza -Tevin Bair -Bodhi Lake -Tenley Vo -Kalayah Mick -Jaiden Morton -Louisa Quiroz -Caydon Tollefson -Adlee Derr -Maddison Berg -Caidyn Armas -Kinzie Furr -Zania Willison -Justyce Rugg -Madilynn Hays -Reynaldo Forrester -Cason Joyce -Saydee Lightfoot -Rivan Tennison -Brea Fogle -Lamiya Alejo -Alberto Fink -Bradlee Dykstra -Emery Coulter -Gilbert Mcnair -Ida Bonds -Crawford Doane -Sam Connor -Samaria Amaro -Elli Ripley -Martin Burnett -Kansas Mcadoo -Darren Holcomb -Karsten Bussey -Janet Dubose -Braven Folk -Affan Savino -Zebadiah Birdsall -Ammy Garduno -Adore Callan -Kaliyah Espinosa -Sammy Brockman -Finnegan Harding -Sirena Hom -Shulem Pagel -Zoya Donohue -Yuri Teel -Andromeda Kuo -Jahiem Resnick -Lennox Lancaster -Rozlyn Hudak -Unknown Fant -Alonzo Lugo -Sabina Loy -Emre Mckinzie -Braiden Moseley -Kaison Thorpe -Roslyn Mcdonnell -Arial Mcsweeney -Alijah Forbes -Berlyn Aston -Zaara Lagunas -Jakhari Simmonds -Rhema Giddings -Zalayah Sessoms -Jazlynn Baez -Kenedi Holladay -Kavin Hernandes -Leonidas Cramer -Amberlee Carlile -Mackinley Hamner -Ocean Whitlow -Jasai Waring -Adien Sankey -Lamar Wyrick -Blen Dunston -Madeleine Shields -Vincenzo Duong -Braydan Lussier -Rohen Cusack -Emmi Castleberry -Jasmina Lambeth -Jakub Ritchey -Taylen Thorp -Kaidyn Hartzell -Leasia Urquhart -Zyra Hadden -Elynn Galli -Violet Washington -Nadia Kemp -Mathias Downing -Teagan Conner -Avalina Polson -Jrue Killion -Katlyn Fouts -Kason Conrad -Honor Pauley -Bryant Grady -Inara Dockery -Jc Ronan -Anasophia Dehaan -Della Coy -Natalie Myers -Mavrick Harold -Brooke Miles -Rihanna Foy -Misty Fitts -Quincey Boots -Dax Ritchie -Kianna Moua -Lazaro Welker -Nivea Brook -Ron Ousley -Austen Malik -Jameria Lipinski -Avraham Lauer -Zadie Whelan -Ayomide Bash -Suri Carlos -Raygen Gamache -Tydus Beggs -Maxim Goodrich -Dempsey Stivers -Jin Eades -Olliver Setzer -Irvin Minter -Odalys Salmeron -Blythe Ceja -Maryanna Turek -Tyriq Richburg -Paisley Harrison -Donte Wing -Sonja Creamer -Javen Cone -Krishna Sword -Arda Bilbrey -Collette Aldana -Mattilyn Dills -Izabell Colton -Aubre Roop -Zuriel Krohn -Tryston Janson -Charleston Zook -Arman Hoyle -Kaybree Mozingo -Scarlet Sloan -Akshaya Breault -Esdras Parkhurst -Rochelle Pitre -Lochlyn Athey -Jasir Aronson -Bria Garland -Charity Stauffer -Blade Garces -Mikaila Merriweather -Kierra Fontaine -Kayah Jesse -Siena Abraham -Theodora Fort -Samia Zhao -Brithany Lazar -Ulises Flood -Nikayla Ottinger -Zaden Soria -Keelan Qualls -Ahri Gillett -Marlei Marker -Myracle Theis -Abraham Powers -Lilith Oneil -Analiese Sonnier -Ethaniel Gerhart -Eiley Collum -Kaylana Arney -Jannah Moy -Abubakr Cantor -Nikhil Lively -Yulissa Plunkett -Keelyn Spahr -Sebastien Smalls -Jaida Roper -Tory Shropshire -Cooper Peyton -Jayli Rhine -Anapaula Cann -Bram Dever -Dusty Thompkins -Aubrianna Hathaway -Elva Roebuck -Michaella Adamo -Skylah Morrissey -Victoria Gomez -Bryn Scruggs -Earl Kong -Nikolai Carney -Gisele Rains -Rikki Miley -Emmet Peoples -Chad Hagan -Jaron Regalado -Amaria Rauch -Dayron Salguero -Yael Chavis -Deliah Laine -Laniyah Barbour -Kim Mckeown -Aleksandra Duenas -Kenna Roe -Abram Howe -Spirit Marrone -Ralph Muhammad -Waleed Arreguin -Armani Beatty -Karver Swart -Pablo Mahoney -Slater Gao -Hayslee Lampley -Antonella Corley -Reid Knopp -Elize Hamlet -Kahli Adames -Katalina Beaver -Issac Boggs -Jamison Puga -Haneen Rome -Levi Blaine -Aira Telford -Bryer Mclemore -Sanad Pearlman -Oliviana Ranson -Jaceion Houk -Sana Daily -Archie Easter -Adamaris Snook -Keyonna Herren -Gabriel Futrell -Keagan Koehler -Story Mckenney -Joey Bassett -Bosco Lieb -Errol Haugh -Ripley Bolen -Koen German -Damya Kirksey -Savanah Zheng -Maddox Foltz -Jasmine Mccoy -Balian Lindholm -Olivia Johnson -Geronimo Conant -Marko Hardman -Ranya Pickle -Ara Ovalle -Teagan Power -Zoha Mcshane -Devon Paez -Seerat Desilva -Keasia Aho -Ellis Diehl -Santana Corcoran -Malea Scofield -Cree Suzuki -Ayat Rahn -Marylou Crippen -Tim Denison -Sharon Landis -Laynie Hitt -Shiloh Saenz -Erion Tilson -Ben Miner -Caralyn Eichler -Kiley Bergeron -Oaklie Fulkerson -Jaceyon Mallard -Whitman Cater -Naveen Fast -Ebony Hubbell -Saniah Gilkey -Analucia Quiroga -Lyndi Giffin -Koa Nesbitt -Dominic Coleman -Athalia Serafin -Rolando Ham -Broderick Lytle -Adyson Palumbo -Lincoln Araujo -Jayana Orcutt -Alyx Yong -Shanti Berumen -Nataley Spielman -Kaitlin Griffiths -Caleah Hudspeth -Belen Sheldon -Cutter Collado -Kenzlee Sage -Canton Ice -Aili Sartin -Jamila Rawlings -Malik Morse -Makenna Nash -Maleigha Spruill -Kinlee Barrow -Sullivan Rambo -Jensen Lavender -Zyaire Stclair -Janine Chesser -Bintou Leader -Candice Searcy -Andy Gudino -Valarie Bartel -Kol Houseman -Aleah Woodward -Ailey Duque -Iain Barden -Cristopher Reagan -Samar Hazelwood -Jaslynn Mancuso -Skyelar Rhode -Angelie Steinmetz -Arlet Letourneau -Isabell Durbin -Reuben Keene -Alton Crawley -Paola Feldman -Ziona Baugher -Diane Basham -Lisandra Holsinger -Akil Mash -Hanah Beckmann -Laurynn Liss -Tierra Pelayo -River Deleon -Blakelee Rodarte -Soren Janke -Livvy Braley -Karam Bickford -Alaura Money -Ivan Bishop -Inayah Gailey -Izabelle Bellamy -Cotton Stiffler -Damario Hermes -Torrey Bosse -Meira Sellars -Laken Solorio -Tallulah Noonan -Tayler Fermin -Carol Freitas -Haleigh Brower -Kalleigh Sandstrom -Jaycee Mccants -Charissa Dice -Kaydin Justus -Mehki Hotchkiss -Elexis Roseberry -Exodus Voight -Jaxtyn Endicott -Julieta Wesley -Van Dickens -Jeffery Fonseca -Susannah Earnest -Catalia Vong -Maribel Aponte -Alexie Pompa -Maximilliano Hagedorn -Heavenlee Leech -Marion Ruvalcaba -Wanda Kenworthy -Nataleigh Sacco -Reyaan Kulp -Murphy Hargis -Octavian Berk -Baylee Mcconnell -Faithlynn Ullrich -Sedona Strother -Avielle Herald -Jerrick Casarez -Syed Oldham -Tennessee Hendon -Keona Kellam -Aleya Bivins -Nikole Chiles -Kanon Clary -Jancarlos Dana -Adriano Obryan -Felipe Engle -Theodore Mills -Amorette Cutting -Raizel Wendel -Jackelin Petrone -Zaida Fincher -Jayce Menchaca -Jaylinn Hammack -Brooklyn Mosqueda -Brittany Booker -Aiva Fairley -Asha Kelsey -Juel Holst -Janay Vanburen -Zelia Manes -Maritza Coats -Royal Steiner -Armand Herd -Nithya Beason -Elian Saucedo -Jolene Kay -Magali Corbitt -Zak Haile -Vera Wiggins -Jaxson Ruiz -Leliana Drumm -Jacelyn Bohannon -Khi Burkes -Braylen Valentine -Tylar Pray -Eniyah Mazzola -Nestor Skidmore -Symphony Hudgins -Kain Sell -Sapphira Mcmullin -Alec Zavala -Krue Victoria -Dariyah Nieman -Teegan Griego -Danthony Hochstetler -Terron Alleyne -Boden Kinsey -Evalynn Hirsch -Lillie Elder -Raylin Orosco -Wednesday Dollar -Evey Stackhouse -Maxton Christiansen -Cristina Whitt -Kandice Denmark -Tai Shine -Leighanna Eady -Treyson Lebron -Jules Wooden -Chana Pagan -Zavien Garfield -Izek Pelaez -Theresa Iverson -Nakiyah Bolick -Esmae Buehler -Gaia Zink -Albert Faulkner -Espen Breslin -Blayke Donofrio -Alana Wang -Ona Freitag -Lucus Dare -Kalvin Batista -Azalea Whitfield -Madisen Crittenden -Fabian Lam -Kahlani Berens -Kaylene Riddick -Treysen Kujawa -Rajon Spiker -Augustus Mcneil -Meelah Rossetti -Nickolas Hankins -Shepard Samson -Greer Moise -Alida Danko -Decker Maier -Ameen Nester -Blayden Quevedo -Isadora Cerda -Marco Callahan -Jovi Johnsen -Nikolay Ferrier -Nayla Blank -Nariah Pringle -Kyndell Kunkle -Ayman Ocasio -Akiva Huntington -Stirling Cardillo -Emonie Anson -Cattleya Poindexter -Karmelo Headrick -Weldon Sorto -Amy Joseph -Nicolette Lenz -Haydee Trusty -Starr Rey -Keandre Click -Reeves Cueva -Kasen Ritter -Kyler Burley -Gonzalo Askew -Taylor Mercer -Elaina Mathews -Brenner Rosenblum -Jaydee Pillow -Luiza Wilmot -Dea Enlow -Kennedi Mclean -Mauricio Guy -Lainey Blanco -Joshlynn Bowerman -Matt Islas -Lili Marston -Reggie Kinard -Diamond Mccollough -Darrick Ressler -Yehuda Hare -Kenslie Spikes -Amyla Howarth -Shyla Heredia -Giulietta Soper -Aminah Boucher -Ariya Sterling -Keiran Standridge -Kaleia Peckham -Adisyn Buckles -Imari Barahona -Elam Beckwith -Lailani Ashford -Graci Ascencio -Kyrell Pankey -Valerie Daniel -Shiv Stillwell -Finleigh Mears -Ahsan Falconer -Kapri Ketcham -Rafaela Raby -Cindy Greco -Ignatius Speck -Anisa Hiatt -Hadasa Gustin -Halen Boutin -Kynsley Hass -Dexton Widner -Kaliana Knighton -Halina Sowards -Kristopher Kirkpatrick -Bruno Painter -Alexandro Slattery -Magnus Stapleton -Santiago Vargas -Moksh Gulledge -Asya Hazzard -Massimo Kopp -Tea Boldt -Shriyan Sobel -Safiya Langer \ No newline at end of file diff --git a/Exam/IKT203Exam/DATA/songs.txt b/Exam/IKT203Exam/DATA/songs.txt deleted file mode 100644 index 04a6303..0000000 --- a/Exam/IKT203Exam/DATA/songs.txt +++ /dev/null @@ -1,51 +0,0 @@ -[records:=50] -Dire Straits;Love Over Gold;1984;rock;MusicBrainz -Dire Straits;Expresso Love;1984;rock;MusicBrainz -Dire Straits;Romeo and Juliet;1984;rock;MusicBrainz -Dire Straits;Telegraph Road;1984;rock;MusicBrainz -Dire Straits;Private Investigations;1984;rock;MusicBrainz -Dire Straits;Tunnel of Love (intro: The Carousel Waltz);1984;rock;MusicBrainz -Dire Straits;Once Upon a Time in the West;1984;rock;MusicBrainz -Dire Straits;Going Home (theme from ‘Local Hero’);1984;rock;MusicBrainz -Ry Cooder;634-5789 (Soulsville, U.S.A.);1980;rock;MusicBrainz -Rush;The Body Electric;1984;rock;MusicBrainz -Rush;Afterimage;1984;rock;MusicBrainz -Rush;Kid Gloves;1984;rock;MusicBrainz -Rush;Red Lenses;1984;rock;MusicBrainz -Rush;Red Sector A;1984;rock;MusicBrainz -Rush;Between the Wheels;1984;rock;MusicBrainz -Barclay James Harvest;Say You’ll Stay;1984;rock;MusicBrainz -Dire Straits;Solid Rock;1984;rock;MusicBrainz -King Crimson;Model Man;1984;rock;MusicBrainz -King Crimson;No Warning;1984;rock;MusicBrainz -Queen;Tie Your Mother Down;1977;rock;MusicBrainz -The Long Ryders;(Sweet) Mental Revenge;1984;rock;MusicBrainz -Ry Cooder;Crazy ’bout an Automobile (Every Woman I Know);1980;rock;MusicBrainz -Hawkwind;Jack of Shadows;1979;rock;MusicBrainz -Kauko Röyhkä & Narttu;Pähkinäpuu;1984;rock;MusicBrainz -Kauko Röyhkä & Narttu;Tuulee;1984;rock;MusicBrainz -Echo & The Bunnymen;Seven Seas "Life At Brian's - Lean And Hungry";1984;rock;Discogs -Billy Squier;Signs Of Life;1984;rock;Discogs -Paul McCartney;No More Lonely Nights;1984;rock;Discogs -Body Checks;Tätowiert + Kahlgeschoren;1984;rock;Discogs -Trust (2);Serre Les Poings;1984;rock;Discogs -Mama's Boys;Mama's Boys;1984;rock;Discogs -Def Leppard;High 'N' Dry;1984;rock;Discogs -Savage Republic;Tragic Figure;1984;rock;Discogs -The Icicle Works;The Icicle Works;1984;rock;Discogs -Twisted Sister;We're Not Gonna Take It;1984;rock;Discogs -The Pogues;The Boys From The County Hell;1984;rock;Discogs -The Takeaways;Sweet And Sour Volume 2;1984;rock;Discogs -Rick Springfield;Beautiful Feelings;1984;rock;Discogs -Vice Squad;Teenage Rampage;1984;rock;Discogs -The Vipers (4);Outta The Nest;1984;rock;Discogs -Rolands Gosskör;Genom Barriären;1984;rock;Discogs -Willie Loco Alexander*;Taxi-Stand Diane;1984;rock;Discogs -Kansas (2);The Best Of Kansas;1984;rock;Discogs -The Rolling Stones;30 Años De Musica Rock - Salvat;1984;rock;Discogs -Lindisfarne;Nicely Out Of Tune;1984;rock;Discogs -Andy Summers;2010 / To Hal And Back;1984;rock;Discogs -The Beatles;I Feel Fine;1984;rock;Discogs -Neil Diamond;Love Songs;1984;rock;Discogs -The Sensational Alex Harvey Band;Live;1984;rock;Discogs -Subterfuge (10);Who's The Fool;1984;rock;Discogs diff --git a/Exam/IKT203Exam/LibExample/CMakeLists.txt b/Exam/IKT203Exam/LibExample/CMakeLists.txt deleted file mode 100644 index ddcd46e..0000000 --- a/Exam/IKT203Exam/LibExample/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ -# --- Step 1: Create the Library --- - -# Define a library target named "LibExample". -# We use INTERFACE because it only contains .hpp files (header-only). -# There are no .cpp files to compile here. -# TODO: Change to STATIC if you add .cpp files later. -add_library(LibExample INTERFACE) - -# --- Step 2: Add Header Files to the Library --- - -# This command explicitly lists the header files that belong to the library. -# This helps Visual Studio display them nicely in the Solution Explorer. -target_sources(LibExample - PUBLIC - list.hpp - TSingleLinkedListTemplate.hpp - TDoublyLinkedListTemplate.hpp - TCircularDoublyLinkedListTemplate.hpp - queue.hpp - stack.hpp -) - -# --- Step 3: Make Headers "Findable" --- - -# This is the most important command here. -# It tells any other project that links to "LibExample" to add this -# directory (CMAKE_CURRENT_SOURCE_DIR) to its list of include paths. -# This is what allows you to write #include "list.hpp" in your main.cpp. -# Note: CMAKE_CURRENT_SOURCE_DIR is a built-in variable that points to the directory -target_include_directories(LibExample INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) -#TODO: Change INTERFACE to PUBLIC if you add .cpp files later. - diff --git a/Exam/IKT203Exam/LibExample/TCircularDoublyLinkedListTemplate.hpp b/Exam/IKT203Exam/LibExample/TCircularDoublyLinkedListTemplate.hpp deleted file mode 100644 index 22a670f..0000000 --- a/Exam/IKT203Exam/LibExample/TCircularDoublyLinkedListTemplate.hpp +++ /dev/null @@ -1,454 +0,0 @@ -// Implantation of the Circular Doubly Linked List - -#ifndef TCIRCULARDOUBLYLINKEDLISTTEMPLATE_HPP -#define TCIRCULARDOUBLYLINKEDLISTTEMPLATE_HPP -#pragma once - -#include "TDoublyLinkedListTemplate.hpp" - -template -class TCircularDoublyLinkedList : public TDoublyLinkedList { -private: - - // Helper to remove a node, updating both next and prev pointers - void InternalRemoveNode(TNode* aNodeToDelete); - -protected: - // --- New Member Variable --- - TNode* cursor; // Points to the "current" node in the list. - -public: - using TSingleLinkedList::Append; - using TSingleLinkedList::Prepend; - - // --- Constructor & Destructor --- - TCircularDoublyLinkedList(bool aIsDataOwner); - virtual ~TCircularDoublyLinkedList() override; - - // --- New Cursor Management Methods --- - void ResetCursor(); - T GetCursorData() const; - void AdvanceCursor(int aSteps = 1); - void RewindCursor(int aSteps = 1); - int GetCursorIndex() const; - - - // --- Overridden Virtual Methods --- - // For maintaining the circular link - void Append(const T&) override; - void Prepend(const T&) override; - void Remove(const T&) override; - void RemoveAll(const T&) override; - T RemoveLast() override; - void Reverse() override; - void ReverseSublist(int, int) override; - void Merge(TSingleLinkedList& otherList) override; - - // For avoiding infinite loops - bool Contains(const T&) const override; - T Search(const T&, FCheckNode) const override; - void ForEach(FVisitNode) const override; - TNode* GetMiddle() const override; -}; - -// Constructor: Establishes the initial circular link where the head points to itself. -template -TCircularDoublyLinkedList::TCircularDoublyLinkedList(bool aIsDataOwner) - : TDoublyLinkedList(aIsDataOwner) { - // An empty circular list's dummy head points to itself. - this->head->SetNext(this->head); - this->head->SetPrev(this->head); - this->cursor = this->head; // Cursor also starts at the head. -} - -// Destructor: The parent destructors are virtual and will handle cleanup. -template -TCircularDoublyLinkedList::~TCircularDoublyLinkedList() { - // Before the parent destructors run, we must break the circular link. - // The parent's `nullptr`-terminated cleanup loop will now work correctly. - if (!this->IsEmpty()) { - // The tail is the node before the dummy head. - // Set its 'next' pointer to null instead of back to the head. - this->head->GetPrev()->SetNext(nullptr); - } - // Now, the chain is broken: head -> node1 -> ... -> tail -> nullptr - // The TDoublyLinkedList and TSingleLinkedList destructors will be called - // automatically after this, and they will now function correctly. -} - -// Moves the cursor to the first element in the list. -template -void TCircularDoublyLinkedList::ResetCursor() { - if (this->IsEmpty()) { - this->cursor = this->head; - } - else { - this->cursor = this->head->GetNext(); - } -} - -// Returns the data at the cursor's current position. -template -T TCircularDoublyLinkedList::GetCursorData() const { - // The cursor is only valid if it's not pointing to the dummy head. - if (!this->IsEmpty() && this->cursor != this->head) { - return this->cursor->GetData(); - } - return nullptr; -} - -// Moves the cursor forward, wrapping around if needed. -template -void TCircularDoublyLinkedList::AdvanceCursor(int aSteps) { - if (this->IsEmpty()) { - return; - } - - for (int i = 0; i < aSteps; ++i) { - this->cursor = this->cursor->GetNext(); - // If we move to the dummy head, we've wrapped around. Skip over it to the first element. - if (this->cursor == this->head) { - this->cursor = this->head->GetNext(); - } - } -} - -// Moves the cursor backward, wrapping around if needed. -template -void TCircularDoublyLinkedList::RewindCursor(int aSteps) { - if (this->IsEmpty()) { - return; - } - - for (int i = 0; i < aSteps; ++i) { - this->cursor = this->cursor->GetPrev(); - // If we move to the dummy head, we've wrapped around. Skip over it to the last element. - if (this->cursor == this->head) { - this->cursor = this->head->GetPrev(); - } - } -} - -// Gets the numerical index of the cursor's current position. -template -int TCircularDoublyLinkedList::GetCursorIndex() const { - if (this->IsEmpty() || this->cursor == this->head) { - return -1; - } - - int index = 0; - TNode* current = this->head->GetNext(); - - // Traverse the list safely, knowing it will eventually loop back to the head. - while (current != this->head) { - if (current == this->cursor) { - return index; - } - current = current->GetNext(); - index++; - } - - return -1; // Should not be reached if cursor is valid. -} - -// Appends a node to the end of the list (before the dummy head). -// Use the InternAppend from TDoublyLinkedList for basic logic, then adjust prev pointers. -template -void TCircularDoublyLinkedList::Append(const T& aData) { - // 1. Let the base class do ALL the standard work. - TDoublyLinkedList::Append(aData); - // 2. Now fix the circular links. - if(!this->IsEmpty()) { - this->head->SetPrev(this->tail); // Dummy head's prev points to new tail - this->tail->SetNext(this->head); // New tail's next points to dummy head - } -} - -// Prepends a node to the beginning of the list (after the dummy head). -// Use the Prepend from TDoublyLinkedList, this will handle all the logic. -template -void TCircularDoublyLinkedList::Prepend(const T& aData) { - TDoublyLinkedList::Prepend(aData); - // No need to adjust circular links, as TDoublyLinkedList::Prepend already does it. -} - - -template -void TCircularDoublyLinkedList::InternalRemoveNode(TNode* aNodeToDelete) { - if (aNodeToDelete == nullptr || aNodeToDelete == this->head) return; // Invalid input - - // 1. Update cursor if it points to the node being deleted - if (this->cursor == aNodeToDelete) { - this->cursor = aNodeToDelete->GetNext(); - } - - //2. Update tail if the last node is being removed - if (aNodeToDelete == this->tail) { - this->tail = aNodeToDelete->GetPrev(); - } - - // 3. Relink neighbors (this maintains the circle automatically) - TNode* prevNode = aNodeToDelete->GetPrev(); - TNode* nextNode = aNodeToDelete->GetNext(); - prevNode->SetNext(nextNode); - nextNode->SetPrev(prevNode); - - // 4. Delete data if owned, then delete the node - if (this->isDataOwner) { - delete aNodeToDelete->GetData(); - } - delete aNodeToDelete; - this->size--; - - // 5. If the list is now empty, ensure tail and cursor point to the head. - if (this->IsEmpty()) { - this->tail = this->head; - this->cursor = this->head; - } -} - -// Removes the first node with the given value. -template -void TCircularDoublyLinkedList::Remove(const T& aData) { - if (this->IsEmpty()) return; - - // Start searching from the first actual node - TNode* current = this->head->GetNext(); - // Traverse the entire circle once - for (int i = 0; i < this->size; ++i) { - if (current->GetData() == aData) { - TNode* prevNode = current->GetPrev(); - TNode* nextNode = current->GetNext(); - - // Update tail if the last node is being removed - if (current == this->tail) { - this->tail = prevNode; - } - - // Relink neighbors (this maintains the circle automatically) - prevNode->SetNext(nextNode); - nextNode->SetPrev(prevNode); - - if (this->isDataOwner) { - delete current->GetData(); - } - delete current; - this->size--; - return; - } - current = current->GetNext(); - } -} - -// Removes the last element from the list. -template -T TCircularDoublyLinkedList::RemoveLast() { - if (this->IsEmpty()) { - return nullptr; - } - - TNode* nodeToRemove = this->tail; - T dataToReturn = nodeToRemove->GetData(); - TNode* newTail = nodeToRemove->GetPrev(); - - // Relink the new tail to the head to maintain the circle - newTail->SetNext(this->head); - this->head->SetPrev(newTail); - - this->tail = newTail; // Update tail pointer - - delete nodeToRemove; - this->size--; - - if (this->IsEmpty()) { - this->tail = this->head; // Reset tail if list is now empty - } - - return dataToReturn; -} - -// Removes all occurrences of a given value using a safe, bounded loop. -template -void TCircularDoublyLinkedList::RemoveAll(const T& aData) { - if (this->IsEmpty()) return; - - TNode* current = this->head->GetNext(); - int initialSize = this->size; // Loop based on the original size - - for (int i = 0; i < initialSize; ++i) { - TNode* nextNode = current->GetNext(); // Get next node before potential deletion - - if (current->GetData() == aData) { - TNode* prevNode = current->GetPrev(); - - if (current == this->tail) { - this->tail = prevNode; - } - - prevNode->SetNext(nextNode); - nextNode->SetPrev(prevNode); - - if (this->isDataOwner) { - delete current->GetData(); - } - delete current; - this->size--; - } - current = nextNode; - } - if (this->IsEmpty()) { - this->tail = this->head; - } -} - -// Reverses the entire list by swapping the next/prev pointers of every node. -template -void TCircularDoublyLinkedList::Reverse() { - if (this->size <= 1) return; // Nothing to reverse - - // 1. Keep track of original head and tail nodes. - TNode* newFirstNode = this->tail; - - // 2. Iterate through all nodes, swapping next and prev pointers. - TNode* current = this->head; - // We must loop size + 1 times to include the dummy head in the pointer swap. - for (int i = 0; i < this->size + 1; ++i) { - current->SwapNextPrev(); - // The *new* prev pointer is the *original* next pointer, so this moves us forward. - current = current->GetPrev(); - } - - // 3. Correct the head and tail pointers. - this->tail = this->head->GetNext(); // The old head is the new tail. - this->head->SetNext(newFirstNode); // The dummy head now points to the old tail. - newFirstNode->SetPrev(this->head); // New first node's prev points to dummy head. -} - -// Reverses a portion of the list, ensuring circular links are maintained. -template -void TCircularDoublyLinkedList::ReverseSublist(int start, int end) { - if (start < 0 || end >= this->size || start >= end) { - return; - } - - // --- 1. Find boundary nodes --- - TNode* startNode = this->head->GetNext(); - for (int i = 0; i < start; ++i) { - startNode = startNode->GetNext(); - } - - TNode* endNode = startNode; - for (int i = start; i < end; ++i) { - endNode = endNode->GetNext(); - } - - TNode* startPrev = startNode->GetPrev(); - TNode* endNext = endNode->GetNext(); - - // --- 2. Reverse pointers for all nodes within the sublist --- - TNode* current = startNode; - for (int i = 0; i <= (end - start); ++i) { - TNode* temp = current->GetNext(); - current->SetNext(current->GetPrev()); - current->SetPrev(temp); - current = temp; - } - - // --- 3. Re-stitch the sublist (no nullptr checks needed) --- - startPrev->SetNext(endNode); - endNode->SetPrev(startPrev); - startNode->SetNext(endNext); - endNext->SetPrev(startNode); - - // Update tail pointer if it was part of the reversed segment - if (this->head->GetPrev() == endNode) { // Original startNode is now at the end - this->tail = startNode; - } -} - -// Merges another sorted list, creating a single, sorted circular list. -template -void TCircularDoublyLinkedList::Merge(TSingleLinkedList& otherList) { - // We can call the parent implementation to do the heavy lifting of merging. - TDoublyLinkedList::Merge(otherList); - - // The parent merge results in a null-terminated list. We just need to fix the ends. - if (!this->IsEmpty()) { - TNode* firstNode = this->head->GetNext(); - this->tail->SetNext(firstNode); - firstNode->SetPrev(this->tail); - } -} - -// Applies a function to each node using a safe loop for a circular list. -template -void TCircularDoublyLinkedList::ForEach(FVisitNode aVisitNode) const { - if (aVisitNode == nullptr || this->IsEmpty()) { - return; - } - - TNode* current = this->head->GetNext(); - int index = 0; - while (current != this->head) { - aVisitNode(current->GetData(), index); - current = current->GetNext(); - index++; - } -} - -// Checks if a value is in the list using a safe, non-infinite loop. -template -bool TCircularDoublyLinkedList::Contains(const T& aData) const { - if (this->IsEmpty()) { - return false; - } - - TNode* current = this->head->GetNext(); - while (current != this->head) { - if (current->GetData() == aData) { - return true; - } - current = current->GetNext(); - } - return false; -} - -// Searches for a value using a safe, non-infinite loop. -template -T TCircularDoublyLinkedList::Search(const T& aData, FCheckNode aCheckNode) const { - if (this->IsEmpty()) { - return nullptr; - } - - TNode* current = this->head->GetNext(); - while (current != this->head) { - if (aCheckNode != nullptr) { - if (aCheckNode(current->GetData(), aData)) { - return current->GetData(); - } - } - else { - if (current->GetData() == aData) { - return current->GetData(); - } - } - current = current->GetNext(); - } - return nullptr; -} - -// Finds the middle node by traversing to the size/2 index. -template -TNode* TCircularDoublyLinkedList::GetMiddle() const { - if (this->IsEmpty()) return nullptr; - - // The safest way for a list where we know the size. - int middleIndex = this->size / 2; - TNode* current = this->head->GetNext(); - for (int i = 0; i < middleIndex; ++i) { - current = current->GetNext(); - } - return current; -} - -#endif // TCIRCULARDOUBLYLINKEDLISTTEMPLATE_HPP diff --git a/Exam/IKT203Exam/LibExample/TDoublyLinkedListTemplate.hpp b/Exam/IKT203Exam/LibExample/TDoublyLinkedListTemplate.hpp deleted file mode 100644 index 3a2e438..0000000 --- a/Exam/IKT203Exam/LibExample/TDoublyLinkedListTemplate.hpp +++ /dev/null @@ -1,340 +0,0 @@ -// TDoublyLinkedList implements a doubly linked list data structure with basic functionalities. - -#ifndef TDOUBLYLINKEDLISTTEMPLEATE_HPP -#define TDOUBLYLINKEDLISTTEMPLEATE_HPP -#pragma once -#include "TSingleLinkedListTemplate.hpp" - -// Doubly Linked List inheriting from TSingleLinkedList -template -class TDoublyLinkedList : public TSingleLinkedList { -private: - // Internal helper to remove a node, updating both next and prev pointers - void InternalRemoveNode(TNode* aNodeToDelete); - -public: - using TSingleLinkedList::Append; - using TSingleLinkedList::Prepend; - - // --- Constructor & Destructor --- - // Constructor calls the base class's constructor to initialize common members. - TDoublyLinkedList(bool aIsDataOwner); - - // The destructor is also virtual, ensuring the correct cleanup chain. - virtual ~TDoublyLinkedList() override; - - - // --- Overridden Virtual Methods from TSingleLinkedList --- - // These methods provide new implementations to manage the 'prev' pointer - // and/or to improve performance. - virtual void Append(const T&) override; - virtual void Prepend(const T&) override; - virtual T GetAtIndex(int) override; - virtual void Remove(const T&) override; - virtual void Reverse() override; - virtual void Merge(TSingleLinkedList&) override; - virtual void RemoveAll(const T&) override; - virtual void ReverseSublist(int, int) override; - virtual T RemoveLast(); - - - // --- New Methods Unique to TDoublyLinkedList --- - // These methods leverage the 'prev' pointer for capabilities that are - // inefficient or impossible in a singly-linked list. - - void InsertBefore(TNode*, T&); - void ForEachReverse(FVisitNode) const; -}; - - -template -inline void TDoublyLinkedList::InternalRemoveNode(TNode* aNodeToDelete) -{ - if (aNodeToDelete == nullptr || aNodeToDelete == this->head) return; - TNode* prevNode = aNodeToDelete->GetPrev(); - TNode* nextNode = aNodeToDelete->GetNext(); - if (prevNode != nullptr) { - prevNode->SetNext(nextNode); - } - if (nextNode != nullptr) { - nextNode->SetPrev(prevNode); - } - if (aNodeToDelete == this->tail) { - this->tail = prevNode; - } - if (this->isDataOwner) { - delete aNodeToDelete->GetData(); - } - delete aNodeToDelete; - this->size--; -} - -// Constructor: Calls the base class constructor to perform initialization. -template -TDoublyLinkedList::TDoublyLinkedList(bool aIsDataOwner) - : TSingleLinkedList(aIsDataOwner) {} - -// Destructor: The base class destructor is virtual, so this is called automatically. -// No new resources were allocated, so the body can be empty. -template -TDoublyLinkedList::~TDoublyLinkedList() {} // No additional cleanup needed, the base class handles it. - -// Append: Overridden to correctly set the 'prev' pointer on the new node. -template -void TDoublyLinkedList::Append(const T& aData) { - TNode* oldTail = this->tail; - TNode* newNode = this->InternAppend(aData); - newNode->SetPrev(oldTail); // Set the new node's prev to the old tail -} - -// Prepend: Overridden to correctly set 'prev' pointers on the new node and its old neighbor. -template -void TDoublyLinkedList::Prepend(const T& aData) { - TNode* newNode = this->InternPrepend(aData); - newNode->SetPrev(this->head); // New node's prev points to dummy head - if (newNode->GetNext() != nullptr) { - newNode->GetNext()->SetPrev(newNode); // Old first node's prev points to new node - } -} - -// GetAtIndex: Re-introduces the performance optimization to search from the tail. -template -T TDoublyLinkedList::GetAtIndex(int aIndex) { - if (aIndex < 0 || aIndex >= this->size) { - return nullptr; // Index out of bounds - } - - TNode* current; - // Check which end is closer and traverse from there. - if (aIndex < this->size / 2) { - current = this->head->GetNext(); - for (int i = 0; i < aIndex; i++) { - current = current->GetNext(); - } - } - else { - current = this->tail; - for (int i = this->size - 1; i > aIndex; i--) { - current = current->GetPrev(); - } - } - return current->GetData(); -} - -// Remove: Removes all nodes matching the given value. -template -void TDoublyLinkedList::Remove(const T& aData) { - TNode* current = this->head->GetNext(); - while (current != nullptr) { - if (current->GetData() == aData) { - TNode* nodeToRemove = current; - current = current->GetNext(); // Move current forward before deletion - InternalRemoveNode(nodeToRemove); - } - else { - // No match, just advance current - current = current->GetNext(); - } - } -} - -// Reverse: Uses the much simpler algorithm of swapping prev/next pointers. -template -void TDoublyLinkedList::Reverse() { - if (this->size <= 1) return; - - // 1. Keep track of original head and tail nodes. - TNode* originalHeadNode = this->head->GetNext(); - TNode* originalTailNode = this->tail; - - // 2. Swap prev/next for every node. - TNode* current = originalHeadNode; - while (current != nullptr) { - current->SwapNextPrev(); - // The *new* prev pointer is the *original* next pointer, so this moves us forward. - current = current->GetPrev(); - } - - // 3. Correct the pointers for the new head and tail. - this->tail = originalHeadNode; // The old head is the new tail. - this->head->SetNext(originalTailNode); // The dummy head now points to the old tail. -} - -// RemoveLast: Removes the final element in O(1) time. -// Note: This returns the data, so the caller is now responsible for it. -// The data itself is not deleted, even if isDataOwner is true. -template -T TDoublyLinkedList::RemoveLast() { - if (this->IsEmpty()) { - return nullptr; - } - - TNode* nodeToRemove = this->tail; - T dataToReturn = nodeToRemove->GetData(); - - this->tail = this->tail->GetPrev(); - this->tail->SetNext(nullptr); - - delete nodeToRemove; - this->size--; - - return dataToReturn; -} - -// InsertBefore: Inserts a new node before a specified node in O(1) time. -template -void TDoublyLinkedList::InsertBefore(TNode* aNode, T& aData) { - if (aNode == nullptr || aNode == this->head) { - // Cannot insert before a null node or the dummy head - return; - } - - // If inserting before the first element, Prepend is easier. - if (aNode == this->head->GetNext()) { - Prepend(aData); - return; - } - - TNode* newNode = new TNode(aData); - TNode* prevNode = aNode->GetPrev(); - - // Link new node to its neighbors - newNode->SetPrev(prevNode); - newNode->SetNext(aNode); - - // Update neighbors to point to the new node - prevNode->SetNext(newNode); - aNode->SetPrev(newNode); - - this->size++; -} - -// ForEachReverse: Traverses the list backward from tail to head. -template -void TDoublyLinkedList::ForEachReverse(FVisitNode aVisitNode) const { - if (aVisitNode == nullptr) { - return; - } - TNode* current = this->tail; - int index = this->size - 1; - while (current != this->head) { - aVisitNode(current->GetData(), index); - current = current->GetPrev(); - index--; - } -} - -template -void TDoublyLinkedList::Merge(TSingleLinkedList& otherList) { - if (otherList.IsEmpty()) { - return; - } - - int otherSize = otherList.GetSize(); - // Call the now-public StealNodes to legally take ownership of the nodes. - TNode* p2 = otherList.StealNodes(); - - if (this->IsEmpty()) { - this->head->SetNext(p2); - if (p2) p2->SetPrev(this->head); - this->size = otherSize; - // Find the new tail by traversing. - TNode* newTail = this->head; - while (newTail->GetNext() != nullptr) { - newTail = newTail->GetNext(); - } - this->tail = newTail; - return; - } - - TNode* p1 = this->head->GetNext(); - TNode* currentTail = this->head; - - while (p1 != nullptr && p2 != nullptr) { - if (p1->GetData() <= p2->GetData()) { - currentTail->SetNext(p1); - p1->SetPrev(currentTail); - p1 = p1->GetNext(); - } - else { - currentTail->SetNext(p2); - p2->SetPrev(currentTail); - p2 = p2->GetNext(); - } - currentTail = currentTail->GetNext(); - } - - TNode* remainder = (p1 != nullptr) ? p1 : p2; - currentTail->SetNext(remainder); - if (remainder != nullptr) { - remainder->SetPrev(currentTail); - } - - this->size += otherSize; - // After merging, find the new tail by traversing from where we left off. - while (currentTail->GetNext() != nullptr) { - currentTail = currentTail->GetNext(); - } - this->tail = currentTail; -} - -// Remove: Removes all nodes matching the given value. -template -void TDoublyLinkedList::RemoveAll(const T& aValue) { - TNode* current = this->head->GetNext(); - while (current != nullptr) { - if (current->GetData() == aValue) { - TNode* nodeToRemove = current; - current = current->GetNext(); // Move current forward before deletion - InternalRemoveNode(nodeToRemove); - } - else { - // No match, just advance the pointer - current = current->GetNext(); - } - } -} - -// ReverseSublist: Reverses a portion of the list between two indices (inclusive). -template -void TDoublyLinkedList::ReverseSublist(int start, int end) { - if (start < 0 || end >= this->size || start >= end) return; - - // --- 1. Find boundary nodes --- - TNode* startNode = this->head->GetNext(); - TNode* endNode = startNode; - - for (int i = 0; i < start; ++i) { - startNode = startNode->GetNext(); - } - for (int i = start; i < end; ++i) { - endNode = endNode->GetNext(); - } - - TNode* startPrev = startNode->GetPrev(); - TNode* endNext = endNode->GetNext(); - - // --- 2. Reverse pointers for all nodes within the sublist --- - TNode* current = startNode; - while (current != endNext) { - TNode* temp = current->GetNext(); - current->SetNext(current->GetPrev()); - current->SetPrev(temp); - current = temp; // Move to the original next node - } - - // --- 3. Re-stitch the reversed sublist into the main list --- - startPrev->SetNext(endNode); - endNode->SetPrev(startPrev); - - startNode->SetNext(endNext); - if (endNext != nullptr) { - endNext->SetPrev(startNode); - } - else { - // If we reversed to the end, the original startNode is the new tail - this->tail = startNode; - } -} - -#endif // !TDOUBLYLINKEDLISTTEMPLEATE_HPP diff --git a/Exam/IKT203Exam/LibExample/TSingleLinkedListTemplate.hpp b/Exam/IKT203Exam/LibExample/TSingleLinkedListTemplate.hpp deleted file mode 100644 index f985a6d..0000000 --- a/Exam/IKT203Exam/LibExample/TSingleLinkedListTemplate.hpp +++ /dev/null @@ -1,529 +0,0 @@ -#ifndef TSINGLELINKEDLIST_HPP -#define TSINGLELINKEDLIST_HPP - -#pragma once - -#include // Required for the Clone function, and prevent delete on non-pointer types -#include "TDoublyLinkedListTemplate.hpp" -#include "TCircularDoublyLinkedListTemplate.hpp" - -template -class TDoublyLinkedList; // Forward declaration for friendship -template -class TCircularDoublyLinkedList; // Forward declaration for friendship - -// Callback type definitions -template -using FDataFactory = T(*)(TArgs); // <-- ADD THIS LINE - -template -using FCheckNode = bool(*)(const T, const T); - -template -using FVisitNode = void(*)(const T, int); - -template -class TNode { -private: - T data; // Data of type T (e.g., TSong*) - TNode* next; // Pointer to the next node - TNode* prev; // Pointer to the previous node, prepared for future use - - void SwapNextPrev(); // Swaps the next and prev pointers of this node -public: - // Constructor - - TNode(const T& aData); - - // Destructor - ~TNode(); - - // Getters - T GetData() const { return data; } - TNode* GetNext() const { return next; } - TNode* GetPrev() const { return prev; } - - // Setters - void SetNext(TNode* aNextNode) { next = aNextNode; } - void SetPrev(TNode* aPrevNode) { prev = aPrevNode; } - - // Add friendships here if needed - friend class TDoublyLinkedList; - friend class TCircularDoublyLinkedList; -}; - -// --- Method Implementations --- -// Constructor: Initializes the node with data from the factory function -template -TNode::TNode(const T& aData) : data(aData), next(nullptr), prev(nullptr) {} - -// Destructor: Deletes the data pointer -template -TNode::~TNode() { - //Do not delete data, data may exist outside the list - data = nullptr; // Set data to nullptr to avoid dangling pointer - next = nullptr; // Set next to nullptr to avoid dangling pointer - prev = nullptr; // Set prev to nullptr to avoid dangling pointer -} - -template -void TNode::SwapNextPrev() { - TNode* temp = next; - next = prev; - prev = temp; -} - -// --- End of TNode class --- - -// Singly Linked List TSingleLinkedList using TNode and dummy node -template -class TSingleLinkedList { -private: - // Helper to reset the list to empty state - void ResetList(); - -protected: - TNode* head; // Pointer to the dummy head node - TNode* tail; // Pointer to the tail node - int size; // Current size of the list - bool isDataOwner; // Indicates if the list owns the data - - // Internal implementations can be non-virtual - TNode* InternAppend(const T&); - TNode* InternPrepend(const T&); - - // Helper for RemoveAll to delete a node given its previous node - void InternalRemoveNode(TNode*, TNode*); - // Helper to get node at index (non-virtual, used internally) - TNode* GetNodeAtIndex(int aIndex) const; - -public: - // Constructor - TSingleLinkedList(bool); - // Virtual Destructor - virtual ~TSingleLinkedList(); - - // --- Core Operations (Virtual) --- - virtual void Append(const T&); - virtual void Prepend(const T&); - virtual T GetAtIndex(int); - virtual void Remove(const T&); - virtual void Reverse(); - virtual void RemoveAll(const T&); - virtual void ReverseSublist(int, int); - virtual TNode* GetMiddle() const; - virtual void Merge(TSingleLinkedList&); - - // --- Traversal functions that MUST now be virtual --- - virtual bool Contains(const T&) const; - virtual T Search(const T&, FCheckNode = nullptr) const; - virtual void ForEach(FVisitNode) const; - - // --- Non-Virtual Methods --- - template - T Append(FDataFactory, TArgs); - template - T Prepend(FDataFactory, TArgs); - int GetSize() const; - bool IsEmpty() const; - TSingleLinkedList Clone() const; - TNode* StealNodes(); -}; - -// Constructor: Initializes the dummy head node and list state -template -TSingleLinkedList::TSingleLinkedList(bool aIsDataOwner) - : head(new TNode(nullptr)), tail(head), size(0), isDataOwner(aIsDataOwner) { - // COMPILE-TIME SAFETY CHECK - // If the user tries to create a list of non-pointer types with ownership, - // stop compilation with a static_assert. - static_assert(std::is_pointer::value || !aIsDataOwner, - "isDataOwner can only be true if T is a pointer type (e.g., std::string*)."); -} - -// Virtual Destructor: Deletes all nodes and, if owner, the data -template -TSingleLinkedList::~TSingleLinkedList() { - TNode* current = head; - while (current != nullptr) { - TNode* nextNode = current->GetNext(); - if (isDataOwner && current->GetData() != nullptr) { - delete current->GetData(); // Delete data if the list owns it - } - delete current; // Free the node itself - current = nextNode; - } -} - -template -void TSingleLinkedList::InternalRemoveNode(TNode* aPrevNode, TNode* aNodeToDelete) { - if (aPrevNode == nullptr || aNodeToDelete == nullptr) return; - aPrevNode->SetNext(aNodeToDelete->GetNext()); - if (aNodeToDelete == this->tail) { - this->tail = aPrevNode; - } - if (this->isDataOwner) { - delete aNodeToDelete->GetData(); - } - delete aNodeToDelete; - this->size--; -} - - -// StealNodes: Detaches and returns the list's nodes, leaving it empty -// Uses ResetList to clear the list state -template -TNode* TSingleLinkedList::StealNodes() { - TNode* stolenHead = head->GetNext(); // First actual node - this->ResetList(); // Clear the list to empty state - return stolenHead; // Return the detached nodes -} - -// InternAppend: Handles the logic of adding a node to the end -template -TNode* TSingleLinkedList::InternAppend(const T& aData) { - TNode* newNode = new TNode(aData); - tail->SetNext(newNode); // Link the old tail to the new node - tail = newNode; // Update the tail pointer - size++; - return newNode; -} - -// Public Append method -template -void TSingleLinkedList::Append(const T& aData) { - InternAppend(aData); -} - -// InternPrepend: Handles the logic of adding a node to the beginning -template -TNode* TSingleLinkedList::InternPrepend(const T& aData) { - TNode* newNode = new TNode(aData); - newNode->SetNext(head->GetNext()); - head->SetNext(newNode); - if (tail == head) { // If the list was empty, new node is also the tail - tail = newNode; - } - size++; - return newNode; -} - -// Public Prepend method -template -void TSingleLinkedList::Prepend(const T& aData) { - InternPrepend(aData); -} - -// Append(): Creates a new node with the given factory and returns the new node's data. -template -template -T TSingleLinkedList::Append(FDataFactory aDataFactory, TArgs aArgs) { - if (aDataFactory == nullptr) { - return nullptr; // Return nullptr if no factory is provided - } - T newData = aDataFactory(aArgs); - this->Append(newData); // Call the existing virtual Append(T) method - return newData; -} - -// Prepend(): Creates a new node with the given factory and returns the new node's data. -template -template -T TSingleLinkedList::Prepend(FDataFactory aDataFactory, TArgs aArgs) { - if (aDataFactory == nullptr) { - return nullptr; // Return nullptr if no factory is provided - } - T newData = aDataFactory(aArgs); - this->Prepend(newData); // Call the existing virtual Prepend(T) method - return newData; -} - - -template -TNode* TSingleLinkedList::GetNodeAtIndex(int aIndex) const { - TNode* current = head->GetNext(); // Start at the first actual node - for (int i = 0; i < aIndex; ++i) { - current = current->GetNext(); - } - return current; -} - -// GetAtIndex: Returns the value at a specified index. -// This version iterates from the beginning only, as it cannot go backward. -template -T TSingleLinkedList::GetAtIndex(int aIndex) { - if (aIndex < 0 || aIndex >= size) { - return nullptr; // Index out of bounds - } - return GetNodeAtIndex(aIndex)->GetData(); -} - -// Remove: Removes the first node matching the given value. -// Requires tracking the previous node to relink the list. -template -void TSingleLinkedList::Remove(const T& aData) { - TNode* prev = head; - TNode* current = head->GetNext(); - - while (current != nullptr) { - if (current->GetData() == aData) { - // Match found, remove the node - InternalRemoveNode(prev, current); - return; // Only remove the first occurrence - } - } - prev = current; - current = current->GetNext(); -} - -// Reverse: Reverses the list using the classic iterative algorithm for singly-linked lists. -template -void TSingleLinkedList::Reverse() { - if (size <= 1) { - return; // Nothing to reverse - } - - // The original first node will become the new tail - tail = head->GetNext(); - - TNode* prevNode = nullptr; - TNode* currentNode = head->GetNext(); - TNode* nextNode = nullptr; - - while (currentNode != nullptr) { - nextNode = currentNode->GetNext(); // Store next node - currentNode->SetNext(prevNode); // Reverse the current node's pointer - prevNode = currentNode; // Move pointers one position ahead - currentNode = nextNode; - } - - // After the loop, prevNode is the new first node - head->SetNext(prevNode); -} - -// Contains: Checks if the list contains the given value, -// this is diffrent from Search as it only checks for existence -// This using search with a nullptr as the check function -template -bool TSingleLinkedList::Contains(const T& aData) const { - return Search(aData, nullptr) != nullptr; -} - -// Search: Finds a value using an optional custom comparison function -template -T TSingleLinkedList::Search(const T& aData, FCheckNode aCheckNode) const { - TNode* current = head->GetNext(); - while (current != nullptr) { - // Use the provided check function or default to direct comparison - if (aCheckNode != nullptr) { - if (aCheckNode(current->GetData(), aData)) { - return current->GetData(); - } - } - else { - if (current->GetData() == aData) { - return current->GetData(); - } - } - current = current->GetNext(); - } - return nullptr; // Not found -} - -// ForEach: Applies a function to each node in the list -template -void TSingleLinkedList::ForEach(FVisitNode aVisitNode) const { - if (aVisitNode == nullptr) { - return; - } - TNode* current = head->GetNext(); - int index = 0; - while (current != nullptr) { - aVisitNode(current->GetData(), index); - current = current->GetNext(); - index++; - } -} - -// GetSize: Returns the current number of elements in the list -template -int TSingleLinkedList::GetSize() const { - return size; -} - -// IsEmpty: Checks if the list has any elements -template -bool TSingleLinkedList::IsEmpty() const { - return size == 0; -} - -// RemoveAll: Removes all occurrences of a given value from the list. -template -void TSingleLinkedList::RemoveAll(const T& aData) { - TNode* prev = this->head; - TNode* current = this->head->GetNext(); - - while (current != nullptr) { - if (current->GetData() == aData) { - // Match found, remove the node - TNode* nodeToDelete = current; - current = current->GetNext(); // Advance current before deletion - InternalRemoveNode(prev, nodeToDelete); - // prev remains the same, as we just removed current - } - else { - // No match, advance both pointers - prev = current; - current = current->GetNext(); - } - } -} - -// Clone: Creates a deep copy of the list. -template -TSingleLinkedList TSingleLinkedList::Clone() const { - // Create a new list with the same ownership policy. - TSingleLinkedList newList(this->isDataOwner); - - TNode* current = this->head->GetNext(); - while (current != nullptr) { - T dataToCopy = current->GetData(); - - // This is the core of the deep copy logic. - if (this->isDataOwner && std::is_pointer::value && dataToCopy != nullptr) { - // If the list owns its pointer data, we must create a NEW object. - // This assumes the underlying type has a copy constructor. - // `std::remove_pointer_t` gets the type T points to (e.g., TSong from TSong*). - newList.Append(new std::remove_pointer_t(*dataToCopy)); - } - else { - // For value types (int, double) or non-owned pointers, just copy the value. - newList.Append(dataToCopy); - } - current = current->GetNext(); - } - return newList; -} - -// ReverseSublist: Reverses a portion of the list between two indices (inclusive). -template -void TSingleLinkedList::ReverseSublist(int aStart, int aEnd) { - // Validate indices - if (aStart < 0 || aEnd >= this->size || aStart >= aEnd) return; - - - // --- 1. Traverse to the nodes that define the sublist boundaries --- - // Use the helper to find the node *before* the sublist starts - TNode* startNodePrev = (aStart == 0) ? this->head : this->GetNodeAtIndex(aStart - 1); // Node before the start of the sublist - TNode* sublistHead = startNodePrev->GetNext(); // First node of the sublist - - // --- 2. Perform standard reversal on the sublist part only --- - TNode* prevNode = nullptr; - TNode* currentNode = sublistHead; - TNode* nextNode = nullptr; - for (int i = 0; i <= (aEnd - aStart); ++i) { - nextNode = currentNode->GetNext(); - currentNode->SetNext(prevNode); - prevNode = currentNode; - currentNode = nextNode; - } - - // --- 3. Stitch the reversed sublist back into the main list --- - // 'prevNode' is now the new head of the reversed sublist. - // 'sublistHead' is now the tail of the reversed sublist. - startNodePrev->SetNext(prevNode); - sublistHead->SetNext(currentNode); - - // Update the main tail pointer if the reversal included the original tail. - if (aEnd == this->size - 1) { - this->tail = sublistHead; - } -} - -// GetMiddle: Finds the middle node of the list using the fast/slow pointer algorithm. -template -TNode* TSingleLinkedList::GetMiddle() const { - if (this->IsEmpty()) { - return nullptr; - } - - TNode* slow = this->head->GetNext(); - TNode* fast = this->head->GetNext(); - - // The loop condition ensures 'fast' and 'fast->GetNext()' are valid. - // When 'fast' reaches the end, 'slow' will be at the midpoint. - while (fast != nullptr && fast->GetNext() != nullptr) { - slow = slow->GetNext(); - fast = fast->GetNext()->GetNext(); - } - - return slow; -} - -template -void TSingleLinkedList::ResetList() { - // Clear the list to an empty state - this->head->SetNext(nullptr); - this->tail = this->head; - this->size = 0; -} - -template -void TSingleLinkedList::Merge(TSingleLinkedList& aOtherList) { - // If the other list is empty, there's nothing to do. - if (aOtherList.IsEmpty()) { - return; - } - - // If this list is empty, take ownership of the other list's nodes. - if (this->IsEmpty()) { - this->head->SetNext(aOtherList.head->GetNext()); - this->tail = aOtherList.tail; - this->size = aOtherList.size; - - // Clear the other list - aOtherList.head->SetNext(nullptr); - aOtherList.tail = aOtherList.head; - aOtherList.size = 0; - return; - } - - // Pointers to the current nodes in each list - TNode* p1 = this->head->GetNext(); - TNode* p2 = aOtherList.head->GetNext(); - - // Use the dummy head of `this` list to start building the merged result. - TNode* tail = this->head; - - // --- Main Loop: Traverse both lists and pick the smaller node --- - while (p1 != nullptr && p2 != nullptr) { - if (p1->GetData() <= p2->GetData()) { - tail->SetNext(p1); - p1 = p1->GetNext(); - } - else { - tail->SetNext(p2); - p2 = p2->GetNext(); - } - tail = tail->GetNext(); - } - - // --- Append the Remainder --- - tail->SetNext(p1 != nullptr ? p1 : p2); - - // --- Update the Tail Pointer --- - while (tail->GetNext() != nullptr) { - tail = tail->GetNext(); - } - this->tail = tail; - - // --- Update Size --- - this->size += aOtherList.size; - - // --- Clear the Other List --- - aOtherList.ResetList(); -} - -// --- End of TSingleLinkedList class --- - -#endif // !TSINGLELINKEDLIST_HPP \ No newline at end of file diff --git a/Exam/IKT203Exam/LibExample/list.hpp b/Exam/IKT203Exam/LibExample/list.hpp deleted file mode 100644 index ef61d9b..0000000 --- a/Exam/IKT203Exam/LibExample/list.hpp +++ /dev/null @@ -1,309 +0,0 @@ -#pragma once -#include // For std::runtime_error -#include // For std::to_string - -// Linked List using TNode class with constructor and destructor -template -class TNode { -private: - T data; // Data of type T (e.g., TSong*) - TNode* next; // Pointer to the next node - TNode* prev; // Pointer to the previous node -public: - // Constructor - - TNode(T aData); - - // Destructor - ~TNode(); - - // Getters - T GetData() const { return data; } - TNode* GetNext() const { return next; } - TNode* GetPrev() const { return prev; } - - // Setters - void SetNext(TNode* aNextNode) { next = aNextNode; } - void SetPrev(TNode* aPrevNode) { prev = aPrevNode; } -}; - -// --- Method Implementations --- -// Constructor: Initializes the node with data from the factory function -template -TNode::TNode(T aData) : data(aData), next(nullptr), prev(nullptr) {} - -// Destructor: Deletes the data pointer -template -TNode::~TNode() { - //Do not delete data, data may exist outside the list - data = nullptr; // Set data to nullptr to avoid dangling pointer - next = nullptr; // Set next to nullptr to avoid dangling pointer - prev = nullptr; // Set prev to nullptr to avoid dangling pointer -} - -// --- End of TNode class --- - -// Type defined function for data factory -template -using FDataFactory = T(*)(TArgs); - -// Type defined functions for TLinkedList -template -using FCheckNode = bool(*)(const T, const T); - -template -using FVisitNode = void(*)(const T, int); - -// Linked List TLinkedList using TNode and dummy node -template -class TLinkedList { -private: - TNode* head; // Pointer to the dummy head node - TNode* tail; // Pointer to the tail node - int size; // Current size of the list - bool isDataOwner; // Indicates if the list owns the data and should delete it - - void InternAppend(T); - void InternPrepend(T); - -public: - // Constructor - TLinkedList(bool); - // Destructor - ~TLinkedList(); - - // Core Linked List Operations - template - T Append(FDataFactory, TArgs); - void Append(T); - - template - T Prepend(FDataFactory, TArgs); - void Prepend(T aValue); - - T GetAtIndex(int aIndex); - void Remove(const T aValue); - - // Finding and Checking Operations - bool Contains(const T aValue) const; - T Search(const T aValue, FCheckNode checkNode = nullptr) const; - - // Loop Operations - void ForEach(FVisitNode aVisitNode) const; - - // Helper Functions - int GetSize() const; - bool IsEmpty() const; - void Reverse(); -}; - -// --- Method Implementations --- -// Constructor: Initializes the dummy head node and tail -template -TLinkedList::TLinkedList(bool aIsDataOwner) : size(0) { - isDataOwner = aIsDataOwner; - head = new TNode(nullptr); // Create a dummy head node - tail = head; // Initially, tail is the same as head -} - -// Destructor: Deletes all nodes in the list -template -TLinkedList::~TLinkedList() { - TNode* current = head; - while (current != nullptr) { - TNode* nextNode = current->GetNext(); - if (isDataOwner && current->GetData() != nullptr) { - delete current->GetData(); // Delete the data if the list owns it - } - delete current; // Free the current node - current = nextNode; // Move to the next node - } -} - -template -void TLinkedList::InternAppend(T aData) { - TNode* newNode = new TNode(aData); - newNode->SetPrev(tail); // Set the prev pointer of the new node - tail->SetNext(newNode); // Update the next pointer of the current tail - tail = newNode; // Update the tail to the new node - size++; -} - -template -void TLinkedList::InternPrepend(T aData) { - TNode* newNode = new TNode(aData); - newNode->SetNext(head->GetNext()); - if (head->GetNext() != nullptr) { - head->GetNext()->SetPrev(newNode); // Update the prev pointer of the first node - } - head->SetNext(newNode); - newNode->SetPrev(head); // Set the prev pointer of the new node - if (tail == head) { - tail = newNode; - } - size++; -} - - -// Append(): Adds a new node with the given factory and returns the new node's data -template -template -T TLinkedList::Append(FDataFactory aDataFactory, TArgs aArgs) { - if(aDataFactory == nullptr) { - return nullptr; // Return nullptr if no factory is provided - } - T newData = aDataFactory(aArgs); - InternAppend(newData); - return newData; -} - -template -void TLinkedList::Append(T aValue) { - InternAppend(aValue); -} - -// Prepend(): Adds a new node with the given factory to the beginning of the list -template -template -T TLinkedList::Prepend(FDataFactory aDataFactory, TArgs aArgs) { - if (aDataFactory == nullptr) { - return nullptr; // Return nullptr if no factory is provided - } - T newData = aDataFactory(aArgs); - InternPrepend(newData); - return newData; -} - -template -void TLinkedList::Prepend(T aValue) { - InternPrepend(aValue); -} - -// GetAtIndex(): Returns the value at the specified index -template -T TLinkedList::GetAtIndex(int aIndex) { - if (aIndex < 0 || aIndex >= size) { - return nullptr; // Return nullptr if index is out of bounds - } - TNode* current; - if (aIndex < size / 2) { - current = head->GetNext(); - for (int i = 0; i < aIndex; i++) { - current = current->GetNext(); - } - } - else { - current = tail; - for (int i = size - 1; i > aIndex; i--) { - current = current->GetPrev(); - } - } - return current->GetData(); // Return the data directly -} - -// Remove(): Removes the first node with the given value -template -void TLinkedList::Remove(const T aValue) { - TNode* current = head->GetNext(); - while (current != nullptr) { - if (current->GetData() == aValue) { - TNode* nodeToDelete = current; - if (current->GetPrev() != nullptr) { - current->GetPrev()->SetNext(current->GetNext()); - } - if (current->GetNext() != nullptr) { - current->GetNext()->SetPrev(current->GetPrev()); - } - if (nodeToDelete == tail) { - tail = current->GetPrev(); - } - - if (isDataOwner && nodeToDelete->GetData() != nullptr) { - delete nodeToDelete->GetData(); // Delete the data if the list owns it - } - delete nodeToDelete; - size--; - return; - } - current = current->GetNext(); - } -} - -// Contains(): Checks if the list contains the given value -template -bool TLinkedList::Contains(const T aValue) const { - TNode* current = head->GetNext(); - while (current != nullptr) { - if (current->GetData() == aValue) { - return true; - } - current = current->GetNext(); - } - return false; -} - -// Search(): Searches for a node with the given value using an optional check function -template -T TLinkedList::Search(const T aValue, FCheckNode checkNode) const { - TNode* current = head->GetNext(); - while (current != nullptr) { - if (checkNode == nullptr) { - if (current->GetData() == aValue) { - return current->GetData(); - } - } else { - if (checkNode(current->GetData(), aValue)) { - return current->GetData(); - } - } - current = current->GetNext(); - } - return nullptr; -} - -// ForEach(): Applies a function to each node in the list -template -void TLinkedList::ForEach(FVisitNode aVisitNode) const { - if (aVisitNode == nullptr) { - return; // Return if no visit function is provided - } - TNode* current = head->GetNext(); - int index = 0; - while (current != nullptr) { - aVisitNode(static_cast(current->GetData()), index); // Cast to const T - current = current->GetNext(); - index++; - } -} - -// Reverse(): Reverses the order of the nodes in the list -template -void TLinkedList::Reverse() { - TNode* current = head->GetNext(); - TNode* temp = nullptr; // Temporary pointer for swapping - - // Handle an empty or single-node list - if (current == nullptr || current->GetNext() == nullptr) { - return; - } - - // Iterate and swap next and prev pointers - while (current != nullptr) { - temp = current->GetPrev(); // Store prev pointer - current->SetPrev(current->GetNext()); // Set prev to next - current->SetNext(temp); // Set next to temp (which holds original prev) - current = current->GetPrev(); // Move to the original next node - } - - // Update head and tail - TNode* newHeadNext = tail; // The original tail becomes the new head->next - tail = head->GetNext(); // The original first node is now the tail - tail->SetNext(nullptr); // Ensure the new tail has no next pointer - head->SetNext(newHeadNext); // Set the head's next to the new first node -} - -template -int TLinkedList::GetSize() const { - return size; -} -// --- End of TLinkedList class --- \ No newline at end of file diff --git a/Exam/IKT203Exam/LibExample/queue.hpp b/Exam/IKT203Exam/LibExample/queue.hpp deleted file mode 100644 index 16b76fa..0000000 --- a/Exam/IKT203Exam/LibExample/queue.hpp +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#include // For std::runtime_error - -template -class TQueue { - private: - T data[MAX_SIZE]; // A static array of T with MAX_SIZE elements - int frontIndex; // The index of the front element - int rearIndex; // The index of the rear element - int count; // Current number of elements in the queue - public: - // Constructor - TQueue(); - // No destructor is needed since we aren't using 'new' - // --- Core Queue Operations --- - void Enqueue(const T& aElement); - T Dequeue(); - T GetFront() const; - // --- Helper Functions --- - int size() const; - bool IsEmpty() const; - bool IsFull() const; -}; -// --- Method Implementations --- -// Constructor: Initializes the front and rear indices -template -TQueue::TQueue() : frontIndex(0), rearIndex(-1), count(0) { - // No memory allocation is needed -} -// enqueue(): Adds an element to the rear of the queue -template -void TQueue::Enqueue(const T& aElement) { - if (IsFull()) { - throw std::runtime_error("Queue overflow: cannot enqueue to a full queue."); - } - rearIndex = (rearIndex + 1) % MAX_SIZE; // Circular increment - data[rearIndex] = aElement; - count++; -} -// dequeue(): Removes and returns the front element -template -T TQueue::Dequeue() { - if (IsEmpty()) { - throw std::runtime_error("Queue underflow: cannot dequeue from an empty queue."); - } - T frontElement = data[frontIndex]; - frontIndex = (frontIndex + 1) % MAX_SIZE; // Circular increment - count--; - return frontElement; -} -// getFront(): Returns the front element without removing it -template -T TQueue::GetFront() const { - if (IsEmpty()) { - throw std::runtime_error("Queue is empty: cannot get front."); - } - return data[frontIndex]; -} -// size(): Returns the current number of elements -template -int TQueue::size() const { - return count; -} -// isEmpty(): Checks if the queue is empty -template -bool TQueue::IsEmpty() const { - return count == 0; -} -// isFull(): Checks if the queue is full -template -bool TQueue::IsFull() const { - return count == MAX_SIZE; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/LibExample/stack.hpp b/Exam/IKT203Exam/LibExample/stack.hpp deleted file mode 100644 index d88f08d..0000000 --- a/Exam/IKT203Exam/LibExample/stack.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once -#include // For std::runtime_error - -// The template now takes a type 'T' and an integer 'MAX_SIZE' -template -class TStack { -private: - T data[MAX_SIZE]; // A static array of T with MAX_SIZE elements - int topIndex; // The index of the top element (-1 if empty) - -public: - // Constructor - TStack(); - - // No destructor is needed since we aren't using 'new' - - // --- Core Stack Operations --- - void Push(const T& aElement); - T Pop(); - T Peek() const; - - // --- Helper Functions --- - int GetSize() const; - bool IsEmpty() const; - bool IsFull() const; -}; - -// --- Method Implementations --- - -// Constructor: Just initializes the top index -template -TStack::TStack() : topIndex(-1) { - // No memory allocation is needed -} - -// push(): Adds an element to the top -template -void TStack::Push(const T& aElement) { - if (IsFull()) { - throw std::runtime_error("Stack overflow: cannot push to a full stack."); - } - data[++topIndex] = aElement; -} - -// pop(): Removes and returns the top element -template -T TStack::Pop() { - if (IsEmpty()) { - throw std::runtime_error("Stack underflow: cannot pop from an empty stack."); - } - return data[topIndex--]; -} - -// peek(): Returns the top element without removing it -template -T TStack::Peek() const { - if (IsEmpty()) { - throw std::runtime_error("Stack is empty: cannot peek."); - } - return data[topIndex]; -} - -// size(): Returns the current number of elements -template -int TStack::GetSize() const { - return topIndex + 1; -} - -// isEmpty(): Checks if the stack is empty -template -bool TStack::IsEmpty() const { - return topIndex == -1; -} - -// isFull(): Checks if the stack is full -template -bool TStack::IsFull() const { - return topIndex == MAX_SIZE - 1; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/Assignment-01/CMakeLists.txt b/Exam/IKT203Exam/Portfolio/Assignment-01/CMakeLists.txt deleted file mode 100644 index 99a3a7e..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-01/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - - - -# "ON" = build Option 1, "OFF" = build Option 2. -option(BUILD_ASSIGNMENT_01_OPTION_1 "Build Assignment Option 1 (Standard)" ON) - -add_executable(Assignment-01 - main.cpp -) - -# Conditionally add the correct source file -if(BUILD_ASSIGNMENT_01_OPTION_1) - # If ON, add option1.cpp and define 'ASSIGNMENT_OPTION=1' for C++ - target_sources(Assignment-01 - PRIVATE - option1.cpp - option1.h - ) - target_compile_definitions(Assignment-01 PRIVATE "ASSIGNMENT_01_OPTION=1") -else() - # If OFF, add option2.cpp and define 'ASSIGNMENT_OPTION=2' for C++ - target_sources(Assignment-01 - PRIVATE - option2.cpp - option2.h - ) - target_compile_definitions(Assignment-01 PRIVATE "ASSIGNMENT_01_OPTION=2") -endif() -target_link_libraries(Assignment-01 - PRIVATE - SharedLib -) - - -add_custom_command(TARGET Assignment-01 POST_BUILD - # Add a custom command here if needed - COMMAND ${CMAKE_COMMAND} -E echo "Assignment-01 post-build step" -) \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/Assignment-01/main.cpp b/Exam/IKT203Exam/Portfolio/Assignment-01/main.cpp deleted file mode 100644 index 02423d9..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-01/main.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// Mandatory-02.cpp : Defines the entry point for the application. -// - -/* -Dear Student, - -Remember to follow the coding standards and best practices discussed -in the portfolio assignment document. -Good luck with your portfolio! - -NB: Do not delete the code below that prints the assignment and option info! - ---------------------------------------------------------------------- -*** HOW TO SWITCH BETWEEN OPTION 1 AND OPTION 2 *** ---------------------------------------------------------------------- -You CANNOT switch options by changing this file. - -1. Go to the 'CMakeLists.txt' file for this assignment. -2. Find the line: - option(BUILD_ASSIGNMENT_OPTION_1 "..." ON) -3. Change 'ON' (for Option 1) to 'OFF' (for Option 2). - -*** VERY IMPORTANT: After changing the option *** -Your project will NOT update until you re-run the CMake configuration. - -To force an update (e.g., in Visual Studio): -- Right-click the 'CMakeLists.txt' file and select 'Configure Cache'. -- OR, simply delete the 'out' / 'build' folder and rebuild the project. ---------------------------------------------------------------------- -*/ - -#include -#include - -static constexpr std::string_view AssignmentName = "Category 1: Lists, Stacks, & Queues"; - - -#if ASSIGNMENT_01_OPTION == 1 -#include "option1.h" -static constexpr std::string_view AssignmentOption = "Option 1 (Standard): Console Text Editor."; -#elif ASSIGNMENT_01_OPTION == 2 -#include "option2.h" -static constexpr std::string_view AssignmentOption = "Option 2 (Advanced): Console Music Player."; -#endif - - - -int main(int argc, char* argv[]) -{ - int appStatus = 0; - std::cout << AssignmentName << std::endl; - std::cout << AssignmentOption << std::endl; - - // Create only core or common code in main.cpp - // Use the option header files to implement the specific assignment option logic - appStatus = RunApp(); - return appStatus; -} - - diff --git a/Exam/IKT203Exam/Portfolio/Assignment-01/option1.cpp b/Exam/IKT203Exam/Portfolio/Assignment-01/option1.cpp deleted file mode 100644 index 9761d29..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-01/option1.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Option 1 (Standard): Console Text Editor. -// - -#include "option1.h" -#include -#include "TDoublyLinkedList.h" -#include "TQueue.h" -#include "TStack.h" -#include "Utils.h" - -TDoublyLinkedList document; -TQueue printQueue; -TStack undoStack, redoStack; - -bool running = true; -int lastIndex = 0; -std::string deletedLine; - -void Undo() -{ - if (!undoStack.IsEmpty()) { - const auto action = undoStack.Pop(); - if (action.action == INSERT){ - document.Remove(action.index); - } - else{ - document.InsertAtIndex(action.index, action.text); - } - redoStack.Push(action); - } -} -void Redo() -{ - if (!redoStack.IsEmpty()) { - const auto action = redoStack.Pop(); - if (action.action == INSERT) { - document.InsertAtIndex(action.index, action.text); - } - else { - document.Remove(action.index); - } - undoStack.Push(action); - } -} - - -int RunApp() -{ - // Implement the Console Text Editor application logic here - while (running) { - switch (Utils::Choice()) { - case 1: { - std::cout << "----------Add line----------" << std::endl; - lastIndex = Utils::Insert(document, undoStack, redoStack, lastIndex); - break; - } - case 2: { - std::cout << "----------Remove line----------" << std::endl; - Utils::PrintList(document); - lastIndex = Utils::RemoveLine(document, undoStack, redoStack, lastIndex); - break; - } - case 3: { - std::cout << "----------Current document----------" << std::endl; - for (int i = 0; i < document.GetSize(); i++) - std::cout << i + 1 << ". " << document.GetAtIndex(i) << std::endl; - std::cout << "------------------------------------\n\n"; - break; - } - case 4: { - for (int i = 0; i < document.GetSize(); ++i) - printQueue.Enqueue(document.GetAtIndex(i)); - - std::cout << "----------Printing queue-----------" << std::endl; - - while (!printQueue.IsEmpty()) - std::cout << printQueue.Dequeue() << std::endl; - std::cout << "------------------------------------\n\n"; - - break; - } - - case 5: { - std::cout << "----------UNDO----------" < -#include "option2.h" - -static bool SongReadCallback(const int aIndex, const int aTotalCount, const std::string& aArtist, const std::string& aTitle, const std::string& aYear, const std::string& aGenre, const std::string& aSource) { - // Implement the logic to process each song read from the file - // For example, print the song details to the console - std::cout << "Song " << (aIndex + 1) << " of " << aTotalCount << ":\n"; - std::cout << " Artist: " << aArtist << "\n"; - std::cout << " Title: " << aTitle << "\n"; - std::cout << " Year: " << aYear << "\n"; - std::cout << " Genre: " << aGenre << "\n"; - std::cout << " Source: " << aSource << "\n\n"; - // Return true to continue reading more songs - return true; -} - - diff --git a/Exam/IKT203Exam/Portfolio/Assignment-01/option2.h b/Exam/IKT203Exam/Portfolio/Assignment-01/option2.h deleted file mode 100644 index 754f3df..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-01/option2.h +++ /dev/null @@ -1,10 +0,0 @@ -// option1.h : Option 2 (Advanced): Console Music Player. -#pragma once - -#ifndef OPTION2_H -#define OPTION2_H - -int RunApp(); - - -#endif // OPTION2_H diff --git a/Exam/IKT203Exam/Portfolio/Assignment-02/CMakeLists.txt b/Exam/IKT203Exam/Portfolio/Assignment-02/CMakeLists.txt deleted file mode 100644 index a8e906b..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-02/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - - - -# "ON" = build Option 1, "OFF" = build Option 2. -option(BUILD_ASSIGNMENT_02_OPTION_1 "Build Assignment Option 1 (Standard)" ON) - -add_executable(Assignment-02 - main.cpp -) - -# Conditionally add the correct source file -if(BUILD_ASSIGNMENT_02_OPTION_1) - # If ON, add option1.cpp and define 'ASSIGNMENT_OPTION=1' for C++ - target_sources(Assignment-02 - PRIVATE - option1.cpp - option1.h - ) - target_compile_definitions(Assignment-02 PRIVATE "ASSIGNMENT_02_OPTION=1") -else() - # If OFF, add option2.cpp and define 'ASSIGNMENT_OPTION=2' for C++ - target_sources(Assignment-02 - PRIVATE - option2.cpp - option2.h - ) - target_compile_definitions(Assignment-02 PRIVATE "ASSIGNMENT_02_OPTION=2") -endif() -target_link_libraries(Assignment-02 - PRIVATE - SharedLib -) - - -add_custom_command(TARGET Assignment-02 POST_BUILD - # Add a custom command here if needed - COMMAND ${CMAKE_COMMAND} -E echo "Assignment-02 post-build step" -) diff --git a/Exam/IKT203Exam/Portfolio/Assignment-02/main.cpp b/Exam/IKT203Exam/Portfolio/Assignment-02/main.cpp deleted file mode 100644 index f2228b8..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-02/main.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Mandatory-02.cpp : Defines the entry point for the application. -// - -/* -Dear Student, - -Remember to follow the coding standards and best practices discussed -in the portfolio assignment document. -Good luck with your portfolio! - -NB: Do not delete the code below that prints the assignment and option info! - ---------------------------------------------------------------------- -*** HOW TO SWITCH BETWEEN OPTION 1 AND OPTION 2 *** ---------------------------------------------------------------------- -You CANNOT switch options by changing this file. - -1. Go to the 'CMakeLists.txt' file for this assignment. -2. Find the line: - option(BUILD_ASSIGNMENT_OPTION_1 "..." ON) -3. Change 'ON' (for Option 1) to 'OFF' (for Option 2). - -*** VERY IMPORTANT: After changing the option *** -Your project will NOT update until you re-run the CMake configuration. - -To force an update (e.g., in Visual Studio): -- Right-click the 'CMakeLists.txt' file and select 'Configure Cache'. -- OR, simply delete the 'out' / 'build' folder and rebuild the project. ---------------------------------------------------------------------- -*/ - -#include -#include - -static constexpr std::string_view AssignmentName = "Category 2: Sorting & Searching"; - -#if ASSIGNMENT_02_OPTION == 1 -#include "option1.h" -static constexpr std::string_view AssignmentOption = "Option 1 (Standard): Cruise Ship Manifest."; -#elif ASSIGNMENT_02_OPTION == 2 -#include "option2.h" -static constexpr std::string_view AssignmentOption = "Option 2 (Advanced): Combined Corporate Directory."; -#endif - - - -int main(int argc, char* argv[]) -{ - int appStatus = 0; - std::cout << AssignmentName << std::endl; - std::cout << AssignmentOption << std::endl; - - // Create only core or common code in main.cpp - // Use the option header files to implement the specific assignment option logic - appStatus = RunApp(); - return appStatus; -} diff --git a/Exam/IKT203Exam/Portfolio/Assignment-02/option1.cpp b/Exam/IKT203Exam/Portfolio/Assignment-02/option1.cpp deleted file mode 100644 index aa8a3fa..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-02/option1.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// Option 1 (Standard): Console Text Editor. -// - -#include -#include -#include "option1.h" -#include "SharedLib.h" - -/** - * @brief Callback function to process one name. - */ -static bool NameReadCallback(const int aIndex, const int aTotalCount, const std::string& aFirstName, const std::string& aLastName) -{ - std::cout << "Reading Name " << (aIndex + 1) << " of " << aTotalCount << ": " - << aFirstName << " " << aLastName << "\n"; - - // We only want to read 10 names (index 0 through 9) - // Return false when aIndex is 9 to stop the loop after this one. - return (aIndex < 9); -} - - -int RunApp() -{ - // Path to the names data file - std::string filename = "F:\\IKT203\\VisualStudio\\DATA\\random_names.txt"; - - std::cout << "Reading first 10 names from file: " << filename << "\n\n"; - - // Call the utility function with the name callback - readNamesFromFile(filename, NameReadCallback); - - std::cout << "\nFinished reading names." << std::endl; - - return 0; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/Assignment-02/option1.h b/Exam/IKT203Exam/Portfolio/Assignment-02/option1.h deleted file mode 100644 index f0b36c3..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-02/option1.h +++ /dev/null @@ -1,11 +0,0 @@ -// option1.h : Option 1 (Standard): Console Text Editor. - -#pragma once - -#ifndef OPTION1_H -#define OPTION1_H - -int RunApp(); - - -#endif // OPTION1_H diff --git a/Exam/IKT203Exam/Portfolio/Assignment-02/option2.cpp b/Exam/IKT203Exam/Portfolio/Assignment-02/option2.cpp deleted file mode 100644 index 3c7fc79..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-02/option2.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// Option 2 (Advanced): Console Music Player. - -#include "option2.h" - -int RunApp() { - // Implement the Console Music Player application logic here - return 0; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/Assignment-02/option2.h b/Exam/IKT203Exam/Portfolio/Assignment-02/option2.h deleted file mode 100644 index 754f3df..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-02/option2.h +++ /dev/null @@ -1,10 +0,0 @@ -// option1.h : Option 2 (Advanced): Console Music Player. -#pragma once - -#ifndef OPTION2_H -#define OPTION2_H - -int RunApp(); - - -#endif // OPTION2_H diff --git a/Exam/IKT203Exam/Portfolio/Assignment-03/CMakeLists.txt b/Exam/IKT203Exam/Portfolio/Assignment-03/CMakeLists.txt deleted file mode 100644 index cc98135..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-03/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - - -# "ON" = build Option 1, "OFF" = build Option 2. -option(BUILD_ASSIGNMENT_03_OPTION_1 "Build Assignment Option 1 (Standard)" ON) - -add_executable(Assignment-03 - main.cpp -) - -# Conditionally add the correct source file -if(BUILD_ASSIGNMENT_03_OPTION_1) - # If ON, add option1.cpp and define 'ASSIGNMENT_OPTION=1' for C++ - target_sources(Assignment-03 - PRIVATE - option1.cpp - option1.h - ) - target_compile_definitions(Assignment-03 PRIVATE "ASSIGNMENT_03_OPTION=1") -else() - # If OFF, add option2.cpp and define 'ASSIGNMENT_OPTION=2' for C++ - target_sources(Assignment-03 - PRIVATE - option2.cpp - option2.h - ) - target_compile_definitions(Assignment-03 PRIVATE "ASSIGNMENT_03_OPTION=2") -endif() -target_link_libraries(Assignment-03 - PRIVATE - SharedLib -) - - -add_custom_command(TARGET Assignment-03 POST_BUILD - # Add a custom command here if needed - COMMAND ${CMAKE_COMMAND} -E echo "Assignment-03 post-build step" -) diff --git a/Exam/IKT203Exam/Portfolio/Assignment-03/main.cpp b/Exam/IKT203Exam/Portfolio/Assignment-03/main.cpp deleted file mode 100644 index 078088e..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-03/main.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* -Dear Student, - -Remember to follow the coding standards and best practices discussed -in the portfolio assignment document. -Good luck with your portfolio! - -NB: Do not delete the code below that prints the assignment and option info! - ---------------------------------------------------------------------- -*** HOW TO SWITCH BETWEEN OPTION 1 AND OPTION 2 *** ---------------------------------------------------------------------- -You CANNOT switch options by changing this file. - -1. Go to the 'CMakeLists.txt' file for this assignment. -2. Find the line: - option(BUILD_ASSIGNMENT_OPTION_1 "..." ON) -3. Change 'ON' (for Option 1) to 'OFF' (for Option 2). - -*** VERY IMPORTANT: After changing the option *** -Your project will NOT update until you re-run the CMake configuration. - -To force an update (e.g., in Visual Studio): -- Right-click the 'CMakeLists.txt' file and select 'Configure Cache'. -- OR, simply delete the 'out' / 'build' folder and rebuild the project. ---------------------------------------------------------------------- -*/ - -#include -#include - -static constexpr std::string_view AssignmentName = "Category 3: Trees (BST, AVL & RBT)"; - -#if ASSIGNMENT_03_OPTION == 1 -#include "option1.h" -static constexpr std::string_view AssignmentOption = "Option 1 (Standard): Employee Directory (BST vs. AVL)."; -#elif ASSIGNMENT_03_OPTION == 2 -#include "option2.h" -static constexpr std::string_view AssignmentOption = "Option 2 (Advanced): Interpreted Calculator."; -#endif - - - -int main(int argc, char* argv[]) -{ - int appStatus = 0; - std::cout << AssignmentName << std::endl; - std::cout << AssignmentOption << std::endl; - - // Create only core or common code in main.cpp - // Use the option header files to implement the specific assignment option logic - appStatus = RunApp(); - return appStatus; -} diff --git a/Exam/IKT203Exam/Portfolio/Assignment-03/option1.cpp b/Exam/IKT203Exam/Portfolio/Assignment-03/option1.cpp deleted file mode 100644 index 74ef99d..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-03/option1.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "option1.h" - -int RunApp() { - // Implement the Console Text Editor application logic here - return 0; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/Assignment-03/option1.h b/Exam/IKT203Exam/Portfolio/Assignment-03/option1.h deleted file mode 100644 index 658aeb1..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-03/option1.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#ifndef OPTION1_H -#define OPTION1_H - -int RunApp(); - - -#endif // OPTION1_H diff --git a/Exam/IKT203Exam/Portfolio/Assignment-03/option2.cpp b/Exam/IKT203Exam/Portfolio/Assignment-03/option2.cpp deleted file mode 100644 index ead6154..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-03/option2.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "option2.h" - -int RunApp() { - // Implement the Console Music Player application logic here - return 0; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/Assignment-03/option2.h b/Exam/IKT203Exam/Portfolio/Assignment-03/option2.h deleted file mode 100644 index 7813abf..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-03/option2.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#ifndef OPTION2_H -#define OPTION2_H - -int RunApp(); - - -#endif // OPTION2_H diff --git a/Exam/IKT203Exam/Portfolio/Assignment-04/CMakeLists.txt b/Exam/IKT203Exam/Portfolio/Assignment-04/CMakeLists.txt deleted file mode 100644 index 578df4e..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-04/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - - -# "ON" = build Option 1, "OFF" = build Option 2. -option(BUILD_ASSIGNMENT_04_OPTION_1 "Build Assignment Option 1 (Standard)" OFF) - -add_executable(Assignment-04 - main.cpp -) - -if(BUILD_ASSIGNMENT_04_OPTION_1) - target_sources(Assignment-04 - PRIVATE - option1.cpp - option1.h - ) - target_compile_definitions(Assignment-04 PRIVATE "ASSIGNMENT_04_OPTION=1") -else() - target_sources(Assignment-04 - PRIVATE - option2.cpp - option2.h - ) - target_compile_definitions(Assignment-04 PRIVATE "ASSIGNMENT_04_OPTION=2") -endif() - -target_link_libraries(Assignment-04 - PRIVATE - SharedLib -) - - -add_custom_command(TARGET Assignment-04 POST_BUILD - # Add a custom command here if needed - COMMAND ${CMAKE_COMMAND} -E echo "Assignment-04 post-build step" -) diff --git a/Exam/IKT203Exam/Portfolio/Assignment-04/main.cpp b/Exam/IKT203Exam/Portfolio/Assignment-04/main.cpp deleted file mode 100644 index ae431f3..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-04/main.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* -Dear Student, - -Remember to follow the coding standards and best practices discussed -in the portfolio assignment document. -Good luck with your portfolio! - -NB: Do not delete the code below that prints the assignment and option info! - ---------------------------------------------------------------------- -*** HOW TO SWITCH BETWEEN OPTION 1 AND OPTION 2 *** ---------------------------------------------------------------------- -You CANNOT switch options by changing this file. - -1. Go to the 'CMakeLists.txt' file for this assignment. -2. Find the line: - option(BUILD_ASSIGNMENT_OPTION_1 "..." ON) -3. Change 'ON' (for Option 1) to 'OFF' (for Option 2). - -*** VERY IMPORTANT: After changing the option *** -Your project will NOT update until you re-run the CMake configuration. - -To force an update (e.g., in Visual Studio): -- Right-click the 'CMakeLists.txt' file and select 'Configure Cache'. -- OR, simply delete the 'out' / 'build' folder and rebuild the project. ---------------------------------------------------------------------- -*/ - -#include -#include -static constexpr std::string_view AssignmentName = "Category 4: Graphs & Dijkstra's Algorithm"; - -#if ASSIGNMENT_04_OPTION == 1 -static constexpr std::string_view AssignmentOption = "Option 1 (Standard): Data Center Network Monitor."; -#include "option1.h" -#elif ASSIGNMENT_04_OPTION == 2 -static constexpr std::string_view AssignmentOption = "Option 2 (Advanced): Inter-city Logistics Router."; -#include "option2.h" -#endif - - -int main(int argc, char* argv[]) -{ - int appStatus = 0; - std::cout << AssignmentName << std::endl; - std::cout << AssignmentOption << std::endl; - - - // Create only core or common code in main.cpp - // Use the option header files to implement the specific assignment option logic - appStatus = RunApp(); - return appStatus; -} diff --git a/Exam/IKT203Exam/Portfolio/Assignment-04/option1.cpp b/Exam/IKT203Exam/Portfolio/Assignment-04/option1.cpp deleted file mode 100644 index 37f5e0d..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-04/option1.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "option1.h" -#include - -int RunApp() { - return 0; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/Assignment-04/option1.h b/Exam/IKT203Exam/Portfolio/Assignment-04/option1.h deleted file mode 100644 index 658aeb1..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-04/option1.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#ifndef OPTION1_H -#define OPTION1_H - -int RunApp(); - - -#endif // OPTION1_H diff --git a/Exam/IKT203Exam/Portfolio/Assignment-04/option2.cpp b/Exam/IKT203Exam/Portfolio/Assignment-04/option2.cpp deleted file mode 100644 index 48aeef6..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-04/option2.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include "option1.h" -#include "SharedLib.h" -static constexpr std::string_view AssignmentOption = "Option 1 (Standard): Data Center Network Monitor."; - - -/** - * @brief Callback function to process one node. - */ -static bool NodeReadCallback(const int aIndex, const int aTotalCount, const std::string& aNode) -{ - std::cout << "Loading Node " << (aIndex + 1) << " of " << aTotalCount << ": " << aNode << "\n"; - - // Return true to continue reading - return true; -} - -/** - * @brief Callback function to process one edge. - */ -static bool EdgeReadCallback(const int aIndex, const int aTotalCount, const std::string& aFromNode, const std::string& aToNode, float aWeight) -{ - std::cout << " Loading Edge " << (aIndex + 1) << " of " << aTotalCount << ": " - << aFromNode << " -> " << aToNode << " (Weight: " << aWeight << ")\n"; - - // Return true to continue reading - return true; -} - - -int RunApp() -{ - - std::cout << AssignmentOption << std::endl; - - // Path to the graph data file - std::string filename = "F:\\IKT203\\VisualStudio\\DATA\\city_graph.txt"; - - std::cout << "Reading graph from file: " << filename << "\n\n"; - - // Call the utility function with both callbacks - readGraphFromFile(filename, NodeReadCallback, EdgeReadCallback); - - std::cout << "\nFinished reading graph." << std::endl; - - return 0; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/Assignment-04/option2.h b/Exam/IKT203Exam/Portfolio/Assignment-04/option2.h deleted file mode 100644 index 7813abf..0000000 --- a/Exam/IKT203Exam/Portfolio/Assignment-04/option2.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#ifndef OPTION2_H -#define OPTION2_H - -int RunApp(); - - -#endif // OPTION2_H diff --git a/Exam/IKT203Exam/Portfolio/CMakeLists.txt b/Exam/IKT203Exam/Portfolio/CMakeLists.txt deleted file mode 100644 index c8b96cf..0000000 --- a/Exam/IKT203Exam/Portfolio/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -# CMakeList.txt : Top-level CMake project file, do global configuration -# and include sub-projects here. -# -cmake_minimum_required (VERSION 3.20) -project ("Portfolio") - -# Enable Hot Reload for MSVC compilers if supported. -if (POLICY CMP0141) - cmake_policy(SET CMP0141 NEW) - set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$,$>,$<$:EditAndContinue>,$<$:ProgramDatabase>>") -endif() - -# Include sub-projects. -add_subdirectory(SharedLib) -# Tell CMake to find and include the first exercise project. -add_subdirectory(Assignment-01) -add_subdirectory(Assignment-02) -add_subdirectory(Assignment-03) -add_subdirectory(Assignment-04) - diff --git a/Exam/IKT203Exam/Portfolio/IKT203_ Final Portfolio Assignment.pdf b/Exam/IKT203Exam/Portfolio/IKT203_ Final Portfolio Assignment.pdf deleted file mode 100644 index 43c964014930ab4e4975258aec74addee23d3820..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372454 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 z 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 diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/CMakeLists.txt b/Exam/IKT203Exam/Portfolio/SharedLib/CMakeLists.txt deleted file mode 100644 index 4530390..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -# --- Step 1: Create the Library --- - -# Define a library target named "SharedLib". -# We use STATIC because we are using cpp and header files. -add_library(SharedLib STATIC) - -# --- Step 2: Add Header Files to the Library --- - -# This command explicitly lists the header files that belong to the library. -# This helps Visual Studio display them nicely in the Solution Explorer. -target_sources(SharedLib - PUBLIC - # You can add more functionalty to SharedLib.h just by adding more definitions in SharedLib.h. - SharedLib.h - TDoublyLinkedList.h - TStack.h - TQueue.h - Utils.h - # Or add other shared files here - PRIVATE - ReadNames.cpp - ReadGraph.cpp - ReadSongs.cpp - FileReaderUtils.cpp - TDoublyLinkedList.cpp - TStack.cpp - TQueue.cpp - Utils.cpp -) - -# --- Step 3: Make Headers "Findable" --- - -# This is the most important command here. -# It tells any other project that links to "SharedLib" to add this -# directory (CMAKE_CURRENT_SOURCE_DIR) to its list of include paths. -# This is what allows you to write #include "list.hpp" in your main.cpp. -# Note: CMAKE_CURRENT_SOURCE_DIR is a built-in variable that points to the directory -target_include_directories(SharedLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/FileReaderUtils.cpp b/Exam/IKT203Exam/Portfolio/SharedLib/FileReaderUtils.cpp deleted file mode 100644 index 175242c..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/FileReaderUtils.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "FileReaderUtils.h" - -#include "FileReaderUtils.h" - -int GetRecordCount(const std::string& aHeaderLine) -{ - size_t recordPos = aHeaderLine.find("records:="); - if (recordPos == std::string::npos) - { - return 0; // No record count found - } - - size_t countStart = recordPos + 9; // Length of "records:=" - - // Find the end bracket ']' or a potential semicolon ';' - size_t countEnd = aHeaderLine.find_first_of("];", countStart); - if (countEnd == std::string::npos) - { - return 0; // Malformed header - } - - std::string countStr = aHeaderLine.substr(countStart, countEnd - countStart); - try - { - // stoi = string to integer - return std::stoi(countStr); - } - catch (const std::exception&) - { - return 0; // Malformed number - } -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/FileReaderUtils.h b/Exam/IKT203Exam/Portfolio/SharedLib/FileReaderUtils.h deleted file mode 100644 index 8d000d6..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/FileReaderUtils.h +++ /dev/null @@ -1,13 +0,0 @@ -// FileReaderUtils.h -#pragma once -#if !defined(FILEREADERUTILS_H) -#define FILEREADERUTILS_H -#include -/** - * @brief [Internal] Safely parses the "records:=N" part of a header line. - * @param aHeaderLine The line, e.g., "[NODES;records:=11]" - * @return The number of records, or 0 if not found. - */ -int GetRecordCount(const std::string& aHeaderLine); - -#endif // FILEREADERUTILS_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/ReadGraph.cpp b/Exam/IKT203Exam/Portfolio/SharedLib/ReadGraph.cpp deleted file mode 100644 index 69c6e20..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/ReadGraph.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#include -#include -#include "SharedLib.h" -#include "FileReaderUtils.h" - -// --- Enum for the parser's state --- -enum class EParseState -{ - NONE, - NODES, - EDGES -}; - -void readGraphFromFile(const std::string& aFilename, FNodeRead aOnNodeRead, FEdgeRead aOnEdgeRead) -{ - if (aFilename.empty()) return; - - std::ifstream file(aFilename); - if (!file.is_open()) - { - // Optional: print an error - // std::cerr << "Error: Could not open file " << aFilename << std::endl; - return; - } - - std::string line; - EParseState currentState = EParseState::NONE; - int totalCount = 0; - int currentIndex = 0; - bool keepReading = true; - - while (keepReading && std::getline(file, line)) - { - if (line.empty()) continue; - - if (line[0] == '[') - { - // --- 2. USE THE SHARED FUNCTION --- - totalCount = GetRecordCount(line); - currentIndex = 0; - - if (line.find("[NODES") != std::string::npos) - { - currentState = EParseState::NODES; - continue; - } - else if (line.find("[EDGES") != std::string::npos) - { - currentState = EParseState::EDGES; - continue; - } - // If it's a comment or other header, reset state and count - currentState = EParseState::NONE; - totalCount = 0; - continue; - } - - // Process data based on the current state - switch (currentState) - { - case EParseState::NODES: - if (aOnNodeRead) - { - if (!aOnNodeRead(currentIndex, totalCount, line)) - { - keepReading = false; - } - currentIndex++; - } - break; - - case EParseState::EDGES: - { - std::istringstream edgeStream(line); - std::string fromNode, toNode, weightStr; - - if (std::getline(edgeStream, fromNode, ';') && - std::getline(edgeStream, toNode, ';') && - std::getline(edgeStream, weightStr)) - { - try - { - // Use std::stof (string to float) for weight - float weight = std::stof(weightStr); - if (aOnEdgeRead) - { - if (!aOnEdgeRead(currentIndex, totalCount, fromNode, toNode, weight)) - { - keepReading = false; - } - currentIndex++; - } - } - catch (const std::exception&) - { - // Failed to parse float, skip this line - } - } - break; - } - case EParseState::NONE: - default: - break; - } - } - file.close(); -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/ReadNames.cpp b/Exam/IKT203Exam/Portfolio/SharedLib/ReadNames.cpp deleted file mode 100644 index a3407ac..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/ReadNames.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include -#include -#include "SharedLib.h" -#include "FileReaderUtils.h" - -void readNamesFromFile(const std::string& aFilename, FNameRead aOnNameRead) -{ - if (aFilename.empty()) return; - - std::ifstream file(aFilename); - if (!file.is_open()) - { - std::cerr << "Error: Could not open file " << aFilename << std::endl; - return; - } - - std::string line; - int totalCount = 0; - int currentIndex = 0; - bool keepReading = true; - - // --- 1. Read the header line --- - if (std::getline(file, line)) - { - // Use our shared helper to get the count - totalCount = GetRecordCount(line); - } - - // --- 2. Loop through the rest of the file --- - while (keepReading && std::getline(file, line)) - { - if (line.empty()) continue; - - std::istringstream nameStream(line); - std::string firstName, lastName; - - // Parse "FirstName LastName" - if (nameStream >> firstName >> lastName) - { - if (aOnNameRead) - { - // Call the callback with all parameters - if (!aOnNameRead(currentIndex, totalCount, firstName, lastName)) - { - keepReading = false; - } - currentIndex++; - } - } - } - - file.close(); -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/ReadSongs.cpp b/Exam/IKT203Exam/Portfolio/SharedLib/ReadSongs.cpp deleted file mode 100644 index 6460ae2..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/ReadSongs.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include -#include -#include "SharedLib.h" -#include "FileReaderUtils.h" // Include the shared utility - -void ReadSongsFromFile(const std::string& aFilename, FSongRead aOnSongRead) -{ - if (aFilename.empty()) return; - - std::ifstream file(aFilename); - if (!file.is_open()) - { - // std::cerr << "Error: Could not open file " << aFilename << std::endl; - return; - } - - std::string line; - int totalCount = 0; - int currentIndex = 0; - bool keepReading = true; - - // --- 1. Read the header line --- - if (std::getline(file, line)) - { - // Use our shared helper to get the count - totalCount = GetRecordCount(line); - } - - // --- 2. Loop through the rest of the file (the data lines) --- - while (keepReading && std::getline(file, line)) - { - if (line.empty()) continue; // Skip empty lines - - std::istringstream lineStream(line); - std::string artist, title, year, genre, source; - - // Parse the five semicolon-separated fields - // Artist;Title;Year;Genre;Source - if (std::getline(lineStream, artist, ';') && - std::getline(lineStream, title, ';') && - std::getline(lineStream, year, ';') && - std::getline(lineStream, genre, ';') && - std::getline(lineStream, source)) // Last one reads to end of line - { - if (aOnSongRead) - { - // Call the callback with all parameters - if (!aOnSongRead(currentIndex, totalCount, artist, title, year, genre, source)) - { - keepReading = false; - } - currentIndex++; - } - } - } - - file.close(); -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/SharedLib.h b/Exam/IKT203Exam/Portfolio/SharedLib/SharedLib.h deleted file mode 100644 index 553ad6c..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/SharedLib.h +++ /dev/null @@ -1,100 +0,0 @@ -#pragma once -#ifndef SHARED_LIB_H -#define SHARED_LIB_H -#include -#include - -/// -/// Delegate type for processing a name read from a file. -/// -/// The index of the name (0-based). -/// The total number of names. -/// The first name read from the file. -/// The last name read from the file. -/// Returns true to continue reading, false to stop. -typedef bool (*FNameRead)( - const int aIndex, - const int aTotalCount, - const std::string& aFirstName, - const std::string& aLastName - ); - -/// -/// Use this function to read names from a specified file and process them using a callback function. -/// -/// readNamesFromFile -/// Reads names from a specified file and invokes a callback for each name read. -/// The path to the file containing names. -/// A callback function that is called for each name read. It takes two parameters: firstName and lastName. If the callback returns false, the reading process stops. -/// The first name read from the file. -/// The last name read from the file. -/// None. -void readNamesFromFile(const std::string& aFilename, FNameRead aOnNameRead); - -/// -/// Delegate type for processing a node read from the file. -/// -/// Function pointer type for a callback that processes nodes read from a file. -/// The index of the node (0-based). -/// The total number of nodes. -/// The node std::string. -/// Returns true to continue reading, false to stop. -typedef bool (*FNodeRead)(const int aIndex, const int aTotalCount, const std::string& aNode); - -/// -/// Delegate type for processing an edge read from the file. -/// -/// Function pointer type for a callback that processes edges read from a file. -/// The index of the edge (0-based). -/// The total number of edges. -/// The from node std::string. -/// The to node std::string. -/// The weight of the edge. -/// Returns true to continue reading, false to stop. -typedef bool (*FEdgeRead)(const int aIndex, const int aTotalCount, const std::string& aFromNode, const std::string& aToNode, float aWeight); - -/// -/// Use this function to read a graph from a specified file and process its nodes and edges using callback functions. -/// -/// readGraphFromFile -/// -/// Reads a graph from a specified file and invokes callbacks for each node and edge read. -/// All nodes are read first, followed by edges. -/// -/// The path to the file containing the graph data. -/// A callback function that is called for each node read. It takes one parameter: the node std::string. If the callback returns false, the reading process stops. -/// A callback function that is called for each edge read. It takes three parameters: the fromNode std::string, the toNode std::string, and the weight float. If the callback returns false, the reading process stops. -void readGraphFromFile(const std::string& aFilename, FNodeRead aOnNodeRead, FEdgeRead aOnEdgeRead); - - -/// -/// Delegate type for processing a song read from the file. -/// -/// The index of the song (0-based). -/// The total number of songs. -/// The artist. -/// The title. -/// The release year (as a std::string). -/// The genre. -/// The source. -/// Returns true to continue reading, false to stop. -typedef bool (*FSongRead)( - const int aIndex, - const int aTotalCount, - const std::string& aArtist, - const std::string& aTitle, - const std::string& aYear, - const std::string& aGenre, - const std::string& aSource - ); - -/// -/// Reads song data from a file and processes them using a callback. -/// This function automatically skips the "records:=" header. -/// -/// The path to the file (e.g., "songs.txt"). -/// The callback function called for each song. -void ReadSongsFromFile(const std::string& aFilename, FSongRead aOnSongRead); - - -#endif // SHARED_LIB_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/TDoublyLinkedList.cpp b/Exam/IKT203Exam/Portfolio/SharedLib/TDoublyLinkedList.cpp deleted file mode 100644 index c019851..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/TDoublyLinkedList.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "TDoublyLinkedList.h" -#include -#include "SharedLib.h" - - - -void TDoublyLinkedList::Append(const std::string& line) -{ - auto* newNode = new Node(line); - if (size == 0) - head = tail = newNode; - else { - newNode->SetPrev(tail); - tail->SetNext(newNode); - tail = newNode; - } - size++; -} - -void TDoublyLinkedList::Prepend(const std::string& line) -{ - auto* newNode = new Node(line); - if (size == 0) - head = tail = newNode; - else { - newNode->SetNext(head); - head->SetPrev(newNode); - head = newNode; - } - size++; -} - -TDoublyLinkedList::Node* TDoublyLinkedList::NavigateToNode(const int index) const -{ - if (index < 0 || index >= size) - return nullptr; - - auto* node = head; - - for (int i = 0; i < index; i++) - node = node->GetNext(); - - return node; -} - -void TDoublyLinkedList::Remove(const int index) -{ - auto* node = NavigateToNode(index); - if (!node) - return; - - if (node->GetPrev()) - node->GetPrev()->SetNext(node->GetNext()); - else - head = node->GetNext(); - if (node->GetNext()) - node->GetNext()->SetPrev(node->GetPrev()); - else - tail = node->GetPrev(); - - delete node; - size--; -} - -std::string TDoublyLinkedList::GetAtIndex(const int index) const -{ - const auto* node = NavigateToNode(index); - return node ? node->GetLine() : "Error, line does not exist\n"; -} - -void TDoublyLinkedList::InsertAtIndex(const int index, const std::string &line) -{ - if (index < 0 || index > size) { - std::cout << "========\nIndex doesn't exist\n========\n" << std::endl; - return; - } - if (index == 0) - { - Prepend(line); - return; - } - if (index == size) - { - Append(line); - return; - } - Node* cur = head; - for (int i = 0; i < index; i++) - cur = cur->GetNext(); - Node* newNode = new Node(line); - Node* prev = cur->GetPrev(); - - newNode->SetPrev(prev); - newNode->SetNext(cur); - - prev->SetNext(newNode); - cur->SetPrev(newNode); - - size++; -} - - -int TDoublyLinkedList::GetSize() const -{ - return size; -} - - - - - - - - diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/TDoublyLinkedList.h b/Exam/IKT203Exam/Portfolio/SharedLib/TDoublyLinkedList.h deleted file mode 100644 index cf9c1c4..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/TDoublyLinkedList.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef TDOUBLYLINKEDLIST_H -#define TDOUBLYLINKEDLIST_H -#include -#include -#include "SharedLib.h" - - - -class TDoublyLinkedList { - -private: - struct Node { - std::string line; - Node* next; - Node* prev; - explicit Node(std::string text) : line(std::move(text)), next(nullptr), prev(nullptr) {} - - void SetNext(Node* node) - { - this->next = node; - } - void SetPrev(Node* node) - { - this->prev = node; - } - [[nodiscard]] Node* GetPrev() const - { - return this->prev; - } - [[nodiscard]] Node* GetNext() const - { - return this->next; - } - [[nodiscard]] std::string GetLine() const - { - return line; - } - - }; - - Node* head; - Node* tail; - int size; - - -public: - TDoublyLinkedList() : head(nullptr), tail(nullptr), size(0) {} - ~TDoublyLinkedList() = default; - - void Append(const std::string &line); - void Prepend(const std::string& line); - [[nodiscard]] Node* NavigateToNode(int index) const; - void Remove(int index); - [[nodiscard]] std::string GetAtIndex(int index) const; - void InsertAtIndex(int index, const std::string &line); - [[nodiscard]] int GetSize() const; -}; - - -#endif //TDOUBLYLINKEDLIST_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/TQueue.cpp b/Exam/IKT203Exam/Portfolio/SharedLib/TQueue.cpp deleted file mode 100644 index e30fbff..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/TQueue.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "TQueue.h" - -#include - - -void TQueue::Enqueue(const std::string& text) -{ - if (IsFull()) - throw std::overflow_error("Queue Overflow"); - queue[tail] = text; - tail = (tail + 1) % MAX_SIZE; - count++; -} - -std::string TQueue::Dequeue() -{ - if (IsEmpty()) - throw std::underflow_error("Empty Queue"); - const std::string item = queue[head]; - head = (head + 1) % MAX_SIZE; - count--; - return item; -} - -std::string TQueue::Peek() const -{ - if (IsEmpty()) - throw std::underflow_error("Empty Queue"); - return queue[head]; -} - -bool TQueue::IsEmpty() const -{ - return count == 0; -} - -bool TQueue::IsFull() const -{ - return count == MAX_SIZE; -} - -int TQueue::GetTail() const -{ - if (IsEmpty()) - throw std::underflow_error("Empty Queue"); - return tail; -} diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/TQueue.h b/Exam/IKT203Exam/Portfolio/SharedLib/TQueue.h deleted file mode 100644 index 6a80dd4..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/TQueue.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef TQUEUE_H -#define TQUEUE_H -#define MAX_SIZE 100 - -#include "TDoublyLinkedList.h" - - -class TQueue { -private: - std::string queue[MAX_SIZE]; - int head = 0; - int tail = 0; - int count = 0; - -public: - TQueue() = default; - ~TQueue() = default; - - void Enqueue(const std::string& text); - std::string Dequeue(); - [[nodiscard]] int GetTail() const; - [[nodiscard]] std::string Peek() const; - [[nodiscard]] bool IsEmpty() const; - [[nodiscard]] bool IsFull() const; -}; - - -#endif //TQUEUE_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/TStack.cpp b/Exam/IKT203Exam/Portfolio/SharedLib/TStack.cpp deleted file mode 100644 index 6f957c1..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/TStack.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "TStack.h" -#include - -void TStack::Push(const TAction& action) -{ - if (top >= STACK_MAX_SIZE) - throw std::overflow_error("Stack overflow"); - event[top++] = action; -} - -TStack::TAction TStack::Pop() -{ - if (top == 0) - throw std::underflow_error("Stack empty"); - return event[--top]; -} - -TStack::TAction TStack::Peek() const -{ - if (top == 0) - throw std::underflow_error("Stack empty"); - return event[top - 1]; -} - -bool TStack::IsEmpty() const -{ - return top == 0; -} - -void TStack::Clear() -{ - for (int i = 0; i < top; i++) { - this->Pop(); - } -} - diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/TStack.h b/Exam/IKT203Exam/Portfolio/SharedLib/TStack.h deleted file mode 100644 index e15cc0c..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/TStack.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef TSTACK_H -#define TSTACK_H - -#define STACK_MAX_SIZE 100 -#include - - -enum EnumActionType { - INSERT, - DELETE -}; - -class TStack { -private: - struct TAction { - EnumActionType action; - std::string text; - int index; - }; - - TAction event[STACK_MAX_SIZE]{}; - int top = 0; - -public: - TStack() = default; - ~TStack() = default; - - void Push(const TAction& action); - TAction Pop(); - [[nodiscard]] TAction Peek() const; - [[nodiscard]] bool IsEmpty() const; - void Clear(); - -}; - - -#endif //TSTACK_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/Utils.cpp b/Exam/IKT203Exam/Portfolio/SharedLib/Utils.cpp deleted file mode 100644 index 74ef15a..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/Utils.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "Utils.h" - -#include -#include - -#include "TDoublyLinkedList.h" -#include "TStack.h" - - -int Utils::Choice() -{ - std::cout << "========\n1. Add line\n2. Remove line\n3. Print current document\n4. Print queue\n5. Undo\n6. Redo\n0. Exit" - "\n\nChoice: "; - int choice; - std::cin >> choice; - std::cin.ignore(std::numeric_limits::max(), '\n'); - //std::cout << "\n=====================\n"; - return choice; -} - -int Utils::Insert(TDoublyLinkedList &document, TStack &undoStack, TStack &redoStack, int index) -{ - for (int i = 0; i < document.GetSize(); i++) { - std::cout << i + 1 << ". " << document.GetAtIndex(i) << std::endl; - } - if (document.GetSize() > 0) - { - std::cout << "Enter the line number where you want to insert the line" <> index)) { - std::cin.clear(); - std::cin.ignore(std::numeric_limits::max(), '\n'); - std::cout << "========\nIndex must be a number\n========\n\n" << std::endl; - return index; - } - - std::cin.ignore(std::numeric_limits::max(), '\n'); - } - if (document.GetSize() < 1) - index = 1; - - std::cout << "Enter the text" <> index)) { - std::cin.clear(); - std::cin.ignore(std::numeric_limits::max(), '\n'); - std::cout << "========\nIndex must be a number\n========\n\n" << std::endl; - return index; - } std::cin.ignore(std::numeric_limits::max(), '\n'); - const std::string deletedLine = document.GetAtIndex(index-1); - document.Remove(index-1); - undoStack.Push({DELETE, deletedLine, index-1}); - if (!redoStack.IsEmpty()) { - redoStack.Clear(); - } - return index; -} diff --git a/Exam/IKT203Exam/Portfolio/SharedLib/Utils.h b/Exam/IKT203Exam/Portfolio/SharedLib/Utils.h deleted file mode 100644 index 29bbe3f..0000000 --- a/Exam/IKT203Exam/Portfolio/SharedLib/Utils.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H -#include "TDoublyLinkedList.h" -#include "TStack.h" - - -class Utils { - public: - static int Choice(); - static int Insert(TDoublyLinkedList &document, TStack &undoStack, TStack &redoStack, int index); - static void PrintList(const TDoublyLinkedList &document); - static int RemoveLine(TDoublyLinkedList &document, TStack &undoStack, TStack &redoStack, int index); - - - - - - - - - - -}; - - -#endif //PART1_UTILS_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Submissions/CMakeLists.txt b/Exam/IKT203Exam/Submissions/CMakeLists.txt deleted file mode 100644 index 9f5ad33..0000000 --- a/Exam/IKT203Exam/Submissions/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -# CMakeList.txt : Top-level CMake project file, do global configuration -# and include sub-projects here. -# -cmake_minimum_required (VERSION 3.20) - -# Enable Hot Reload for MSVC compilers if supported. -if (POLICY CMP0141) - cmake_policy(SET CMP0141 NEW) - set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$,$>,$<$:EditAndContinue>,$<$:ProgramDatabase>>") -endif() - -project ("Exercises") - -# Include sub-projects. -add_subdirectory ("Submission-01") -add_subdirectory ("Submission-02") -add_subdirectory ("Submission-03") -add_subdirectory ("Submission-04") -add_subdirectory ("Submission-05") diff --git a/Exam/IKT203Exam/Submissions/Submission-01/CMakeLists.txt b/Exam/IKT203Exam/Submissions/Submission-01/CMakeLists.txt deleted file mode 100644 index e72a1e6..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-01/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -# CMakeList.txt : CMake project for Submission-01, include source and define -# project specific logic here. -# - -# Add source to this project's executable. -add_executable (Submission-01 "main.cpp" "main.h") -target_link_libraries(Submission-01 PRIVATE LibExample) - -if (CMAKE_VERSION VERSION_GREATER 3.20) - set_property(TARGET Submission-01 PROPERTY CXX_STANDARD 20) -endif() - -# TODO: Add tests and install targets if needed. diff --git a/Exam/IKT203Exam/Submissions/Submission-01/main.cpp b/Exam/IKT203Exam/Submissions/Submission-01/main.cpp deleted file mode 100644 index d1921ec..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-01/main.cpp +++ /dev/null @@ -1,309 +0,0 @@ -// Submission-01.cpp : Defines the entry point for the application. -// - -#include "main.h" -#include - - - -// Movie class with bitwise genre flags -enum EGenreFlags { - Action = 0x0001, - Comedy = 0x0002, - Drama = 0x0004, - Horror = 0x0008, - SciFi = 0x0010, - Romance = 0x0020, - Documentary = 0x0040, - Thriller = 0x0080, - Crime = 0x0100, - Fantasy = 0x0200, - Animation = 0x0400, - Adventure = 0x0800 -}; - -static std::string GenreFlagsToString(int genreFlags) { - std::string result; - if (genreFlags & EGenreFlags::Action) result += "Action "; - if (genreFlags & EGenreFlags::Comedy) result += "Comedy "; - if (genreFlags & EGenreFlags::Drama) result += "Drama "; - if (genreFlags & EGenreFlags::Horror) result += "Horror "; - if (genreFlags & EGenreFlags::SciFi) result += "SciFi "; - if (genreFlags & EGenreFlags::Romance) result += "Romance "; - if (genreFlags & EGenreFlags::Documentary) result += "Documentary "; - if (genreFlags & EGenreFlags::Thriller) result += "Thriller "; - if (genreFlags & EGenreFlags::Crime) result += "Crime "; - if (genreFlags & EGenreFlags::Fantasy) result += "Fantasy "; - if (genreFlags & EGenreFlags::Animation) result += "Animation "; - if (genreFlags & EGenreFlags::Adventure) result += "Adventure "; - return result.empty() ? "None" : result; -} - -// Movie class definition -class TMovie { -private: - std::string title; - std::string director; - int year; - int genreFlags; // Bitwise combination of EGenreFlags - float rating; // Scale from 0.0 to 10.0 - -public: - TMovie(std::string t, std::string d, int y, int g, float r) - : title(t), director(d), year(y), genreFlags(g), rating(r) {} - void PrintInfo() const { - std::cout << "Title: " << title << "\nDirector: " << director - << "\nYear: " << year << "\nGenres: " << GenreFlagsToString(genreFlags) - << "\nRating: " << rating << "/10\n"; - } - std::string GetTitle() const { return title; } - std::string GetDirector() const { return director; } - int GetYear() const { return year; } - float GetRating() const { return rating; } - int GetGenreFlags() const { return genreFlags; } - bool HasGenre(EGenreFlags genre) const { - return (genreFlags & genre) != 0; - } -}; - -typedef bool (*FCheckMovie)(TMovie*, void*); -typedef void (*FMovieIndex)(TMovie*, int); - -// Doubly Linked List TMovieNode definition -struct TMovieNode { - TMovie* movie; - TMovieNode* next; - TMovieNode* prev; - TMovieNode(TMovie* m) : movie(m), next(nullptr), prev(nullptr) {} -}; - -// Doubly Linked List class definition with dummy node, head, and tail O(1) operations -class TMovieList { - private: - TMovieNode* head; // Always points to dummy node - TMovieNode* tail; - int size; - - // Helper function to get node at index - TMovieNode* InternalGetAtIndex(int aIndex) { - if (aIndex < 0 || aIndex >= size) return nullptr; - TMovieNode* current; - // Optimize traversal direction, if index is in the first half, start from head, else from tail - if (aIndex < size / 2) { - current = head->next; // Start from the beginning - for (int i = 0; i < aIndex; i++) { - current = current->next; - } - } - else { - current = tail; // Start from the end - for (int i = size - 1; i > aIndex; i--) { - current = current->prev; - } - } - return current; - } - -public: - TMovieList() { - head = new TMovieNode(nullptr); // Dummy node - tail = head; // Initially, tail is the same as head - size = 0; - } - ~TMovieList() { - Clear(); - delete head; // Delete dummy node - } - void Clear() { - TMovieNode* current = head->next; // Start from the first real node - while (current) { - TMovieNode* toDelete = current; - current = current->next; - delete toDelete->movie; - delete toDelete; - } - head->next = nullptr; - tail = head; // Reset tail to dummy node - size = 0; - } - - // Insertion at the end O(1) - void Append(TMovie* aMovie) { - TMovieNode* newNode = new TMovieNode(aMovie); - newNode->prev = tail; - tail->next = newNode; - tail = newNode; - size++; - } - - // Prepend at the beginning O(1) - void Prepend(TMovie* aMovie) { - TMovieNode* newNode = new TMovieNode(aMovie); - newNode->next = head->next; - newNode->prev = head; - if (head->next) { - head->next->prev = newNode; - } else { - tail = newNode; // If list was empty, update tail - } - head->next = newNode; - size++; - } - - // GetAtIndex O(n) check direction to optimize - TMovie* GetAtIndex(int aIndex) { - return InternalGetAtIndex(aIndex)->movie; - } - - // Remove at index O(n) use GetAtIndex to find node - bool RemoveAtIndex(int aIndex) { - if (aIndex < 0 || aIndex >= size) return false; - TMovieNode* toDelte = InternalGetAtIndex(aIndex); - if (!toDelte) return false; - if (toDelte->prev) { - toDelte->prev->next = toDelte->next; - } - if (toDelte->next) { - toDelte->next->prev = toDelte->prev; - } else { - tail = toDelte->prev; // Update tail if last node is removed - } - delete toDelte->movie; - delete toDelte; - size--; - return true; - } - - // Reverse the list O(n) - void Reverse() { - TMovieNode* current = head->next; - TMovieNode* prev = nullptr; - tail = head->next; - while (current) { - TMovieNode* nextNode = current->next; - current->next = prev; - current->prev = nextNode; - prev = current; - current = nextNode; - } - head->next = prev; - if (prev) { - prev->prev = head; - } - } - - // SearchFor O(n) - TMovie* SearchFor(FCheckMovie aCheckFunc, void* aUserData) { - TMovieNode* current = head->next; - while (current) { - if (aCheckFunc(current->movie, aUserData)) { - return current->movie; - } - current = current->next; - } - return nullptr; - } - - // Every movie in the list O(n) - void Every(FMovieIndex aIndexFunc) { - TMovieNode* current = head->next; - int index = 0; - while (current) { - aIndexFunc(current->movie, index); - current = current->next; - index++; - } - } - -}; - -using namespace std; - -static void PrintNode(std::string* data, int index) { - cout << "Node " << index << ": " << *data << endl; -} - -static bool CheckMovieByTitle(TMovie* movie, void* title) { - return movie->GetTitle() == *(static_cast(title)); -} - -static bool CheckMovieByDirector(TMovie* movie, void* director) { - return movie->GetDirector() == *(static_cast(director)); -} - -static bool FindAllMovieByGenre(TMovie* movie, void* genre) { - if(movie->HasGenre(*(static_cast(genre)))) { - movie->PrintInfo(); - std::cout << "-------------------" << std::endl; - } - // Always return false to continue searching - return false; -} - - -int main() -{ - - std::cout << "--- Submission 1: Linked List ---" << std::endl; - - // Create a movie list - TMovieList movieList; - // Add some movies - movieList.Append(new TMovie("Inception", "Christopher Nolan", 2010, EGenreFlags::Action | EGenreFlags::SciFi, 8.8f)); - movieList.Append(new TMovie("The Godfather", "Francis Ford Coppola", 1972, EGenreFlags::Crime | EGenreFlags::Drama, 9.2f)); - movieList.Prepend(new TMovie("Toy Story", "John Lasseter", 1995, EGenreFlags::Animation | EGenreFlags::Adventure | EGenreFlags::Comedy, 8.3f)); - movieList.Append(new TMovie("The Dark Knight", "Christopher Nolan", 2008, EGenreFlags::Action | EGenreFlags::Crime | EGenreFlags::Drama, 9.0f)); - // Print movie info - for (int i = 0; i < 3; i++) { - TMovie* movie = movieList.GetAtIndex(i); - if (movie) { - movie->PrintInfo(); - std::cout << "-------------------" << std::endl; - } - } - std::cout << std::endl; - // Wait for user input to proceed - std::cout << "Press Enter to continue..." << std::endl; - std::cin.get(); - - // Search for a movie by title - std::string searchTitle = "Inception"; - TMovie* foundMovie = movieList.SearchFor(CheckMovieByTitle, &searchTitle); - if (foundMovie) { - std::cout << "Found movie by title '" << searchTitle << "':" << std::endl; - foundMovie->PrintInfo(); - } else { - std::cout << "Movie with title '" << searchTitle << "' not found." << std::endl; - } - std::cout << "-------------------" << std::endl; - std::cout << std::endl; - - // Search for a movie by director - std::string searchDirector = "John Lasseter"; - foundMovie = movieList.SearchFor(CheckMovieByDirector, &searchDirector); - if (foundMovie) { - std::cout << "Found movie by director '" << searchDirector << "':" << std::endl; - foundMovie->PrintInfo(); - } else { - std::cout << "Movie with director '" << searchDirector << "' not found." << std::endl; - } - std::cout << "-------------------" << std::endl; - std::cout << std::endl; - - // Find all movies in the Action genre - EGenreFlags searchGenre = EGenreFlags::Action; - std::cout << "Movies in the Action genre:" << std::endl; - movieList.SearchFor(FindAllMovieByGenre, &searchGenre); - std::cout << std::endl; - - // Reverse the list - movieList.Reverse(); - std::cout << "Movies after reversing the list:" << std::endl; - movieList.Every([](TMovie* movie, int index) { - std::cout << "Index " << index << ":" << std::endl; - movie->PrintInfo(); - std::cout << "-------------------" << std::endl; - }); - - return 0; -} diff --git a/Exam/IKT203Exam/Submissions/Submission-01/main.h b/Exam/IKT203Exam/Submissions/Submission-01/main.h deleted file mode 100644 index ccf6e27..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-01/main.h +++ /dev/null @@ -1,8 +0,0 @@ -// Submission-01.h : Include file for standard system include files, -// or project specific include files. - -#pragma once - -#include - -// TODO: Reference additional headers your program requires here. diff --git a/Exam/IKT203Exam/Submissions/Submission-02/CMakeLists.txt b/Exam/IKT203Exam/Submissions/Submission-02/CMakeLists.txt deleted file mode 100644 index 28e1424..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-02/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -# CMakeList.txt : CMake project for Submission-01, include source and define -# project specific logic here. -# - -# Add source to this project's executable. -add_executable (Submission-02 "main.cpp" "main.h") -target_link_libraries(Submission-02 PRIVATE LibExample) - -if (CMAKE_VERSION VERSION_GREATER 3.20) - set_property(TARGET Submission-02 PROPERTY CXX_STANDARD 20) -endif() - -# TODO: Add tests and install targets if needed. diff --git a/Exam/IKT203Exam/Submissions/Submission-02/main.cpp b/Exam/IKT203Exam/Submissions/Submission-02/main.cpp deleted file mode 100644 index dcad68d..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-02/main.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// Submission-01.cpp : Defines the entry point for the application. -// - -#include "main.h" -#include - - -// printNaturalNumbers -static void printNaturalNumbers(int aN) -{ - if (aN <= 0) return; // Base case: if n is less than or equal to 0, do nothing - printNaturalNumbers(aN - 1); // Recursive call with n-1 - std::cout << aN << " "; // Print the number after the recursive call to achieve ascending order -} - -// factorial function -static int calculateFactorial(int aN) -{ - if (aN <= 1) return 1; // Base case: factorial of 0 or 1 is 1 - return aN * calculateFactorial(aN - 1); // Recursive call -} - -// power function using exponentiation by squaring -// This method is more efficient than the naive approach, reducing the time complexity from O(n) to O(log n). -static int power(int aBase, int aExponent) -{ - if (aExponent == 0) return 1; // Base case: any number to the power of 0 is 1 - if (aExponent < 0) return 1 / power(aBase, -aExponent); // Handle negative exponents - if (aExponent % 2 == 0) // If exponent is even - { - int halfPower = power(aBase, aExponent / 2); - return halfPower * halfPower; // (x^(n/2))^2 - } - else // If exponent is odd - { - return aBase * power(aBase, aExponent - 1); // x * x^(n-1) - } -} - -// Fibonacci function -// Note: This naive recursive solution is inefficient because it recalculates the same Fibonacci numbers multiple times, leading to an exponential time complexity of O(2^n). -// An improvement could be made by using memoization or an iterative approach to store previously calculated values, reducing the time complexity to O(n). -static int fibonacci(int aN) -{ - if (aN <= 0) return 0; // Base case: fibonacci(0) = 0 - if (aN == 1) return 1; // Base case: fibonacci(1) = 1 - int a = fibonacci(aN - 1); - int b = fibonacci(aN - 2); - std::cout << a << " + " << b << " = " << (a + b) << std::endl; // Print the sum of the two preceding numbers - return a + b; // Recursive call -} - -// Count occurrences of a character in a string -// This function counts how many times a specific character appears in a given string using recursion. -static int countOccurrences(const char* aS, char aC) -{ - if (*aS == '\0') return 0; // Base case: end of string - return (*aS == aC ? 1 : 0) + countOccurrences(aS + 1, aC); // Check current character and recurse for the rest of the string -} - -// Find the largest element in an array using binary recursion -// This function divides the array into two halves, finds the largest element in each half recursively, and then returns the larger of the two. -static int findLargestElement(int arr[], int size) -{ - if (size == 1) return arr[0]; // Base case: only one element - int mid = size / 2; - int leftMax = findLargestElement(arr, mid); // Find max in left half - int rightMax = findLargestElement(arr + mid, size - mid); // Find max in right half - return (leftMax > rightMax) ? leftMax : rightMax; // Return the larger of the two -} - -// Traverse and print characters in the ASCII table from aStart to aEnd using recursion -// This function prints characters in ascending order during the building phase of the recursion and in descending order during the unwinding phase. -static void traverseAsciiTable(char aStart, char aEnd) -{ - if (aStart > aEnd) return; // Base case: if start exceeds end, do nothing - std::cout << aStart << " "; // Print before the recursive call - traverseAsciiTable(aStart + 1, aEnd); // Recursive call with next character - std::cout << aStart << " "; // Print after the recursive call -} - -int main() -{ - std::cout << "--- Submission 2: Fundamental Recursion ---" << std::endl; - std::cout << std::endl << "Part 1: Linear Recursion - Your First Steps" << std::endl; - printNaturalNumbers(5); - std::cout << std::endl << "------------------------------------------------" << std::endl; - - std::cout << std::endl << "Factorial of 5: " << calculateFactorial(5); - std::cout << std::endl << "------------------------------------------------" << std::endl; - - std::cout << std::endl << "Part 2: Multiple & Binary Recursion - Diving Deeper" << std::endl; - std::cout << std::endl << "2^10: " << power(2, 10); - std::cout << std::endl << "------------------------------------------------" << std::endl; - - std::cout << std::endl << "4th Fibonacci number: " << std::endl << fibonacci(4); - std::cout << std::endl << "------------------------------------------------" << std::endl; - - std::cout << std::endl << "Occurrences of 'l' in 'Hello, World!': " << countOccurrences("Hello, World!", 'l'); - std::cout << std::endl << "------------------------------------------------" << std::endl; - - int* arr = new int[20]; - // Fill array with random numbers from 0 to 999 - for (int i = 0; i < 20; ++i) arr[i] = rand() % 999; - std::cout << std::endl << "Part 3: Advanced Binary Recursion" << std::endl; - // Print first 20 elements of the array - for (int i = 0; i < 20; ++i) std::cout << arr[i] << " "; - - std::cout << std::endl << "Largest element in array: " << findLargestElement(arr, 20); - std::cout << std::endl << "------------------------------------------------" << std::endl; - - std::cout << std::endl << "Traverse ASCII table from 'A' to 'Z':" << std::endl; - traverseAsciiTable('A', 'Z'); - - /* - Note: The output reflects the building and unwinding of the call stack. - */ - - std::cout << std::endl; - return 0; -} diff --git a/Exam/IKT203Exam/Submissions/Submission-02/main.h b/Exam/IKT203Exam/Submissions/Submission-02/main.h deleted file mode 100644 index ccf6e27..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-02/main.h +++ /dev/null @@ -1,8 +0,0 @@ -// Submission-01.h : Include file for standard system include files, -// or project specific include files. - -#pragma once - -#include - -// TODO: Reference additional headers your program requires here. diff --git a/Exam/IKT203Exam/Submissions/Submission-03/CMakeLists.txt b/Exam/IKT203Exam/Submissions/Submission-03/CMakeLists.txt deleted file mode 100644 index e5d6092..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-03/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -# CMakeList.txt : CMake project for Submission-01, include source and define -# project specific logic here. -# - -# Add source to this project's executable. -add_executable (Submission-03 "main.cpp" "main.h") -target_link_libraries(Submission-03 PRIVATE LibExample) - -if (CMAKE_VERSION VERSION_GREATER 3.20) - set_property(TARGET Submission-03 PROPERTY CXX_STANDARD 20) -endif() - -# TODO: Add tests and install targets if needed. diff --git a/Exam/IKT203Exam/Submissions/Submission-03/main.cpp b/Exam/IKT203Exam/Submissions/Submission-03/main.cpp deleted file mode 100644 index ae63d1c..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-03/main.cpp +++ /dev/null @@ -1,439 +0,0 @@ -// Submission-01.cpp : Defines the entry point for the application. -// - -#include "main.h" -#include - - -/* -Part 1: Implementing the Core Data Structures -These tasks are designed to get you comfortable with the Last-In, First-Out (LIFO) and First-In, First-Out (FIFO) principles. Building these yourself will give you a deep understanding of how they work under the hood! -*/ - -/* -1. Implementing a Stack: -a) Create a simple TStack class that can hold int values. -b) Use a fixed-size array and a top-of-stack index to manage the data. -c) Implement the core methods: Push(int item) and Pop(). -D) Add a Peek() method to view the top item without removing it. -e) Include an IsEmpty() method to check if the stack is empty. -*/ - -class TStackArray { -private: - int maxSize = 0; - int* stackArray = nullptr; - int top = -1; // Index of the top element -public: - TStackArray(int aSize) : maxSize(aSize) { - stackArray = new int[maxSize]; - } - ~TStackArray() { - delete[] stackArray; - } - void Push(int aItem) { - if (top < maxSize - 1) { - stackArray[++top] = aItem; - } - else { - std::cout << "Stack Overflow" << std::endl; - } - } - int Pop() { - if (!IsEmpty()) { - return stackArray[top--]; - } - else { - std::cout << "Stack Underflow" << std::endl; - return -1; // Indicate error - } - } - int Peek() const { - if (!IsEmpty()) { - return stackArray[top]; - } - else { - std::cout << "Stack is empty" << std::endl; - return -1; // Indicate error - } - } - bool IsEmpty() const { - return top == -1; - } -}; - - -/* -2. Implementing a Queue: -a) Create a simple TQueue class that can hold int values. -b) Use a fixed-size array and front/back indices to manage the data. -c) Implement the core methods: Enqueue(int item) and Dequeue(). -d) Add a Peek() method to view the item at the front without removing it. -e) Include an IsEmpty() method to check if the queue is empty. -*/ - -class TQueueArray { -private: - int maxSize = 0; - int* queueArray = nullptr; - int front = 0; // Index of the front element - int back = -1; // Index of the back element - int itemCount = 0; // Number of items in the queue -public: - TQueueArray(int aSize) : maxSize(aSize) { - queueArray = new int[maxSize]; - } - ~TQueueArray() { - delete[] queueArray; - } - void Enqueue(int aItem) { - if (itemCount < maxSize) { - back = (back + 1) % maxSize; // Circular increment - queueArray[back] = aItem; - itemCount++; - } - else { - std::cout << "Queue Overflow" << std::endl; - } - } - int Dequeue() { - if (!IsEmpty()) { - int item = queueArray[front]; - front = (front + 1) % maxSize; // Circular increment - itemCount--; - return item; - } - else { - std::cout << "Queue Underflow" << std::endl; - return -1; // Indicate error - } - } - int Peek() const { - if (!IsEmpty()) { - return queueArray[front]; - } - else { - std::cout << "Queue is empty" << std::endl; - return -1; // Indicate error - } - } - bool IsEmpty() const { - return itemCount == 0; - } -}; - -class TNodeInteger { -public: - int data; - TNodeInteger* next; - TNodeInteger(int aData) : data(aData), next(nullptr) {} -}; - -// Stack implemented using a linked list with dummy head node -class TStackLinkedList { -private: - TNodeInteger* top = nullptr; -public: - TStackLinkedList() { - top = new TNodeInteger(0); // Dummy head node - } - ~TStackLinkedList() { - while (!IsEmpty()) { - Pop(); - } - delete top; // Delete dummy head node - } - void Push(int aItem) { - TNodeInteger* newNode = new TNodeInteger(aItem); - newNode->next = top->next; - top->next = newNode; - } - int Pop() { - if (!IsEmpty()) { - TNodeInteger* temp = top->next; - int item = temp->data; - top->next = temp->next; - delete temp; // Free memory - return item; - } - else { - std::cout << "Stack Underflow" << std::endl; - return -1; // Indicate error - } - } - int Peek() const { - if (!IsEmpty()) { - return top->next->data; - } - else { - std::cout << "Stack is empty" << std::endl; - return -1; // Indicate error - } - } - bool IsEmpty() const { - return top->next == nullptr; - } -}; - -// Queue implemented using a linked list with dummy head node -class TQueueLinkedList { -private: - TNodeInteger* front = nullptr; - TNodeInteger* back = nullptr; -public: - TQueueLinkedList() { - front = new TNodeInteger(0); // Dummy head node - back = front; // Initially, front and back point to the dummy node - } - ~TQueueLinkedList() { - while (!IsEmpty()) { - Dequeue(); - } - delete front; // Delete dummy head node - } - void Enqueue(int aItem) { - TNodeInteger* newNode = new TNodeInteger(aItem); - back->next = newNode; - back = newNode; - } - int Dequeue() { - if (!IsEmpty()) { - TNodeInteger* temp = front->next; - int item = temp->data; - front->next = temp->next; - if (back == temp) { // If the dequeued node was the last node - back = front; // Reset back to the dummy head - } - delete temp; // Free memory - return item; - } - else { - std::cout << "Queue Underflow" << std::endl; - return -1; // Indicate error - } - } - int Peek() const { - if (!IsEmpty()) { - return front->next->data; - } - else { - std::cout << "Queue is empty" << std::endl; - return -1; // Indicate error - } - } - bool IsEmpty() const { - return front->next == nullptr; - } -}; - - - -/* -Part 2: Practical Applications -Now that you have your own data structures, it's time to put them to work! These are classic problems that perfectly demonstrate the LIFO and FIFO principles. -*/ - -/* -3. String Reversal with a Stack: -a) Write a function that takes a string as input and uses your TStack to return the reversed string. -b) In a short comment, explain why the stack is the perfect tool for this type of task. -*/ - -static std::string ReverseString(const char* aStr) { - TStackArray stack(strlen(aStr)); - for (int i = 0; aStr[i] != '\0'; i++) { - stack.Push(aStr[i]); - } - std::string reversed; - while (!stack.IsEmpty()) { - reversed += static_cast(stack.Pop()); // Cast int back to char - } - return reversed; - /* - * Note: The stack is the perfect tool for string reversal because it allows us to push each character of the string onto the stack and then pop them off in reverse order. - * And stack is using the rule of LIFO (Last In First Out), so the last character pushed onto the stack will be the first one to be popped off, effectively reversing the order of characters. - */ -} - -/* -4. Recursive Functions with a Stack: -a) Remember the factorial function you implemented with recursion in Submission 2? Your computer used a hidden "call stack" to make that happen. Now, your task is to re-implement that function without recursion, using your own `TStack` to manage the process. -b) This is a fantastic exercise that will give you a "eureka" moment about how recursion truly works! -*/ - -static int Factorial(int n) { - if (n < 0) return -1; // Factorial is not defined for negative numbers - if (n == 0 || n == 1) return 1; // Base case - TStackArray stack(n); - for (int i = 2; i <= n; i++) { - stack.Push(i); - } - int result = 1; - while (!stack.IsEmpty()) { - result *= stack.Pop(); - } - return result; -} - -/* -5. Wait Line Simulation with a Queue: -a) Simulate a simple waiting line, such as a ticket counter. -b) Use your TQueue to manage a list of people (represented by integer IDs). -c) People should Enqueue when they arrive and Dequeue when they are served, clearly demonstrating the FIFO principle. -*/ - -static void SimulateWaitLine() { - TQueueArray queue(5); // Queue with a maximum size of 5 - // Simulate people arriving - for (int i = 1; i <= 5; i++) { - std::cout << "Person " << i << " arrives." << std::endl; - queue.Enqueue(i); - } - // Simulate serving people - while (!queue.IsEmpty()) { - int person = queue.Dequeue(); - std::cout << "Person " << person << " is served." << std::endl; - } -} - -/* -Part 3: Advanced Traversal - Stacks vs. Queues -This is the main event! You will solve the same problem using two different approaches, highlighting the different strengths of stacks and queues. -Your recursive functions from Submission 2 actually use an implicit stack, so this task will give you a deeper look into how it all works. -*/ - -/* -6. Setup: The 100x100 Grid: -a) Create a 100x100 two-dimensional integer array. -b) Populate the array with random integer values between 0 and 9. -c) Choose a random starting cell (row, col). -d) Create a second 100x100 boolean array to keep track of visited cells. -*/ - - -static const int GRID_SIZE = 7; -static int grid[GRID_SIZE][GRID_SIZE]; -static bool visited[GRID_SIZE][GRID_SIZE] = { false }; -#include -#include -static void InitializeGrid() { - std::srand(static_cast(std::time(0))); // Seed for randomness - for (int i = 0; i < GRID_SIZE; i++) { - for (int j = 0; j < GRID_SIZE; j++) { - grid[i][j] = std::rand() % 9; // Random values between 0 and 9 - visited[i][j] = false; // Initialize visited array - } - } -} - -/* -7. Depth-First Search (DFS) with a Stack: -a) Write a function that uses your TStack to perform a DFS on the grid, starting from your random cell. -b) The goal is to find the first occurrence of the number '0'. -c) In a short comment, explain how the LIFO behavior of the stack guides the search to explore as deeply as possible along one path before backtracking. -*/ - - -// Helper function to check if a cell is within bounds and not visited -static bool IsValid(int aRow, int aCol) { - return aRow >= 0 && aRow < GRID_SIZE && aCol >= 0 && aCol < GRID_SIZE && !visited[aRow][aCol]; -} - -// The stack's LIFO behavior allows the DFS to explore one path fully before backtracking, ensuring that all possible routes are checked in depth-first order. -static bool DFS(int aStartRow, int aStartCol) { - TStackArray stack(GRID_SIZE * GRID_SIZE); - int cellPos = aStartRow * GRID_SIZE + aStartCol; // Encode 2D position as 1D - stack.Push(cellPos); - while (!stack.IsEmpty()) { - cellPos = stack.Pop(); - int row = cellPos / GRID_SIZE; - int col = cellPos % GRID_SIZE; - if (grid[row][col] == 0) { - std::cout << "Found 0 at (" << row << ", " << col << ")" << std::endl; - return true; - } - std::cout << "Visiting (" << row << ", " << col << ") with value " << grid[row][col] << std::endl; - visited[row][col] = true; - int neighbors[4][2] = { {row - 1, col}, {row, col + 1}, {row + 1, col}, {row, col - 1} }; - for (int i = 0; i < 4; i++) { - int newRow = neighbors[i][0]; - int newCol = neighbors[i][1]; - if (IsValid(newRow, newCol)) { - cellPos = newRow * GRID_SIZE + newCol; - stack.Push(cellPos); - } - } - } - std::cout << "0 not found in DFS" << std::endl; - return false; -} - -// The queue's FIFO behavior ensures that the BFS explores all neighbors at the present depth prior to moving on to nodes at the next depth level, effectively searching layer by layer. -static bool BFS(int aStartRow, int aStartCol) { - int row = aStartRow, col = aStartCol; - int pos = row * GRID_SIZE + col; // Encode 2D position as 1D - TQueueArray queue(GRID_SIZE * GRID_SIZE); - queue.Enqueue(pos); - while (!queue.IsEmpty()) { - pos = queue.Dequeue(); - row = pos / GRID_SIZE; - col = pos % GRID_SIZE; - if (grid[row][col] == 0) { - std::cout << "Found 0 at (" << row << ", " << col << ")" << std::endl; - return true; - } - std::cout << "Visiting (" << row << ", " << col << ") with value " << grid[row][col] << std::endl; - visited[row][col] = true; - int neighbors[4][2] = { {row - 1, col}, {row, col + 1},{row + 1, col},{row, col - 1} }; - for (int i = 0; i < 4; i++) { - row = neighbors[i][0]; - col = neighbors[i][1]; - if (IsValid(row, col)) { - pos = row * GRID_SIZE + col; - queue.Enqueue(pos); - } - } - } - std::cout << "0 not found in BFS" << std::endl; - return false; -} - - -int main() -{ - std::cout << "--- Submission 3: Stacks & Queues ---" << std::endl; - std::string original = "Hello, World!"; - std::string reversed = ReverseString(original.c_str()); - std::cout << "Original String: " << original << std::endl; - std::cout << "Reversed String: " << reversed << std::endl; - // The stack is the perfect tool for string reversal because it operates on a Last-In, First-Out (LIFO) principle. - // This means that the last character pushed onto the stack will be the first one to be popped off, effectively reversing the order of characters. - std::cout << "----------------------------------------------------" << std::endl << std::endl; - - std::cout << "Calculating Factorial of 5 using Stack:" << std::endl; - std::cout << "5! = " << Factorial(5) << std::endl; - std::cout << "----------------------------------------------------" << std::endl << std::endl; - - std::cout << "Simulating Wait Line using Queue:" << std::endl; - SimulateWaitLine(); - std::cout << "----------------------------------------------------" << std::endl << std::endl; - - std::cout << "Initializing 100x100 Grid and Performing DFS to find '0':" << std::endl; - InitializeGrid(); - int startRow = 3; //std::rand() % GRID_SIZE; - int startCol = 2; //std::rand() % GRID_SIZE; - std::cout << "Starting DFS from (" << startRow << ", " << startCol << ")" << std::endl; - DFS(startRow, startCol); - std::cout << std::endl << "Re-initializing visited array for BFS:" << std::endl; - for (int i = 0; i < GRID_SIZE; i++) { - for (int j = 0; j < GRID_SIZE; j++) { - visited[i][j] = false; // Reset visited array - } - } - std::cout << "Stating BFS from (" << startRow << ", " << startCol << ")" << std::endl; - BFS(startRow, startCol); // This should find a different path to '0' - std::cout << "----------------------------------------------------" << std::endl << std::endl; - - - return 0; -} diff --git a/Exam/IKT203Exam/Submissions/Submission-03/main.h b/Exam/IKT203Exam/Submissions/Submission-03/main.h deleted file mode 100644 index ccf6e27..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-03/main.h +++ /dev/null @@ -1,8 +0,0 @@ -// Submission-01.h : Include file for standard system include files, -// or project specific include files. - -#pragma once - -#include - -// TODO: Reference additional headers your program requires here. diff --git a/Exam/IKT203Exam/Submissions/Submission-04/BankAccount.cpp b/Exam/IKT203Exam/Submissions/Submission-04/BankAccount.cpp deleted file mode 100644 index 94bcf1e..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/BankAccount.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "BankAccount.h" -#include -#include -#include -#include // For rand() -#include // For better random number generation -#include -#include // For memset -#include // For floor -#include // For time manipulation -#include // For locale settings -#include // For codecvt_utf8 -#include // For std::invalid_argument -#include - - -TBankAccount::TBankAccount(EBankAccountType accType, std::string firstName, std::string lastName) - : accountType(accType), ownerFirstName(firstName), ownerLastName(lastName) -{ - // Random genration of account number: XXXX.XX.XXXXX - accountNumber = toString(rand() % 9000 + 1000) + "." + toString(rand() % 90 + 10) + "." + toString(rand() % 90000 + 10000); - - balance = 0.0f; - - //Random generation of creation timestamp, date is any date and time in 2024 - int month = rand() % 12 + 1; - int day = rand() % 28 + 1; // To avoid complexity of different month lengths - int hour = rand() % 24; - int minute = rand() % 60; - - // Calculate creation timestamp in seconds from 2024-01-01 00:00:00 -std:tm tm = {}; - tm.tm_year = 2024 - 1900; // Year since 1900 - tm.tm_mon = rand() % 12; // Month [0-11] - tm.tm_mday = rand() % 28 + 1; // Day of the month [1-28] to avoid month length issues - tm.tm_hour = rand() % 24; // Hour [0-23] - tm.tm_min = rand() % 60; // Minute [0-59] - tm.tm_sec = 0; // Second [0-59] - creationTimestamp = _mkgmtime(&tm); // Use _mkgmtime for UTC - - if (accType == Checking || accType == Saving || accType == Pension) - balance = static_cast(rand() % 1001); // 0 to 1000 - else if (accType == Loan) - balance = static_cast(-(rand() % 25001 + 25000)); // -50000 to -25000 - else if (accType == Credit) - balance = static_cast(-(rand() % 1001)); // -1000 to 0 -} - -TBankAccount::~TBankAccount() -{ - // Destructor logic if needed -} - -std::string TBankAccount::getAccountNumber() const { - return accountNumber; -} - -EBankAccountType TBankAccount::getAccountType() const { - return accountType; -} - -time_t TBankAccount::getCreationTimestamp() const { - return creationTimestamp; -} -double TBankAccount::getBalance() const { - return balance; -} -void TBankAccount::deposit(double aAmount) { - if (aAmount > 0) balance += aAmount; -} - -void TBankAccount::withdraw(double aAmount) { - if (aAmount > 0 && aAmount <= balance) balance -= aAmount; -} - -std::string TBankAccount::getAccountTypeString() const -{ - switch (accountType) - { - case Checking: return "Checking"; - case Saving: return "Saving"; - case Credit: return "Credit"; - case Pension: return "Pension"; - case Loan: return "Loan"; - default: return "Unknown"; - } -} - -// -std::string TBankAccount::getCreationTimeString() const -{ - char buffer[26]; - ctime_s(buffer, sizeof(buffer), &creationTimestamp); - std::string timeString(buffer); - if (!timeString.empty() && timeString.back() == '\n') { - timeString.pop_back(); // Remove the trailing newline character - } - return timeString; -} - -void TBankAccount::printAccountInfo() const -{ - std::cout << "Account Number: " << accountNumber << ", Type: " << getAccountTypeString() - << ", Owner: " << ownerFirstName << " " << ownerLastName - << ", Balance: " << balance - << ", Created: " << getCreationTimeString() - << std::endl; -} \ No newline at end of file diff --git a/Exam/IKT203Exam/Submissions/Submission-04/BankAccount.h b/Exam/IKT203Exam/Submissions/Submission-04/BankAccount.h deleted file mode 100644 index 077b767..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/BankAccount.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#ifndef BANKACCOUNT_H -#define BANKACCOUNT_H - -#include // For std::string -#include // For time_t -#include // For rand() -#include // For std::setfill and std::setw -#include // For std::ostringstream -#include // For std::cout - - -// Helper function to convert value to string -template -std::string toString(T value) -{ - std::ostringstream oss; - oss << value; - return oss.str(); -} - - -enum EBankAccountType { Checking, Saving, Credit, Pension, Loan }; - -class TBankAccount { - -private: - std::string accountNumber; - EBankAccountType accountType; - time_t creationTimestamp; - double balance; - -public: - std::string ownerFirstName; - std::string ownerLastName; - - //TBankAccount() {} // Don't use default constructor - TBankAccount(EBankAccountType, std::string, std::string); - ~TBankAccount(); - - std::string getAccountNumber() const; - std::string getCreationTimeString() const; - time_t getCreationTimestamp() const; - double getBalance() const; - void deposit(double); - void withdraw(double); - EBankAccountType getAccountType() const; - std::string getAccountTypeString() const; - void printAccountInfo() const; -}; - -#endif // BANKACCOUNT_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Submissions/Submission-04/BankAccountList.cpp b/Exam/IKT203Exam/Submissions/Submission-04/BankAccountList.cpp deleted file mode 100644 index fb049d4..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/BankAccountList.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "BankAccountList.h" - -TLinkedList::TLinkedList(bool aOwnsData) : head(nullptr), ownsData(aOwnsData), size(0) { - head = new TLinkedListNode(nullptr); // Dummy head node -} - -TLinkedList::~TLinkedList() -{ - while (head->next != nullptr) - { - TLinkedListNode* temp = head->next; - head->next = temp->next; - if (ownsData) delete temp->data; // Delete the TBankAccount object - delete temp; // Delete the node - } - delete head; -} - -int TLinkedList::getSize() const { return size; } - -void TLinkedList::Add(TBankAccount* aData) -{ - TLinkedListNode* newNode = new TLinkedListNode(aData); - newNode->next = head->next; - head->next = newNode; - size++; -} - -TBankAccount* TLinkedList::Find(FCompareAccount aCompareFunc, void* aSearchKey) -{ - TLinkedListNode* current = head->next; - while (current != nullptr) - { - if (aCompareFunc(current->data, aSearchKey)) - { - return current->data; // Found - } - current = current->next; - } - return nullptr; // Not found -} - -TLinkedList* TLinkedList::Every(FCompareAccount aCompareFunc, void* aSearchKey) -{ - TLinkedList* resultList = new TLinkedList(false); // New list does not own data - TLinkedListNode* current = head->next; - while (current != nullptr) - { - if (aCompareFunc(current->data, aSearchKey)) - { - resultList->Add(current->data); // Add to result list - } - current = current->next; - } - return resultList; // Return the new list -} - -// Loop through all accounts, if aEveryFunc returns false for any, return that account -TBankAccount* TLinkedList::Every(FEveryAccount aEveryFunc) { - TLinkedListNode* current = head->next; - int index = 0; - while (current != nullptr) - { - if (!aEveryFunc(current->data, index++)) - { - return current->data; // Return the first account that fails the test - } - current = current->next; - } - return nullptr; // All accounts passed the test -} - -TBankAccount** TLinkedList::ToArray() -{ - if (size == 0) return nullptr; - TBankAccount** array = new TBankAccount * [size]; - TLinkedListNode* current = head->next; - int index = 0; - while (current != nullptr && index < size) // Ensure index < size - { - array[index++] = current->data; - current = current->next; - } - return array; -} - -void TLinkedList::forEach(FForEachAccount aFunc) -{ - TLinkedListNode* current = head->next; - int index = 0; - while (current != nullptr) - { - aFunc(current->data, index++); - current = current->next; - } -} - -TLinkedListNode* TLinkedList::getHead() const { return head; } - -void TLinkedList::Append(TBankAccount* account) -{ - TLinkedListNode* newNode = new TLinkedListNode(account); - TLinkedListNode* current = head; - while (current->next != nullptr) - { - current = current->next; - } - current->next = newNode; - size++; -} - -void TLinkedList::Remove(TBankAccount* account) -{ - TLinkedListNode* current = head; - while (current->next != nullptr) - { - if (current->next->data == account) - { - TLinkedListNode* temp = current->next; - current->next = temp->next; - if (ownsData) delete temp->data; // Delete the TBankAccount object - delete temp; // Delete the node - size--; - return; // Exit after removing - } - current = current->next; - } -} - - diff --git a/Exam/IKT203Exam/Submissions/Submission-04/BankAccountList.h b/Exam/IKT203Exam/Submissions/Submission-04/BankAccountList.h deleted file mode 100644 index 2b6d7df..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/BankAccountList.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#ifndef BANKACCOUNTLIST_H -#define BANKACCOUNTLIST_H -#include "BankAccount.h" -#include -#include - -typedef bool (*FCompareAccount)(TBankAccount* account, void* searchKey); -typedef void (*FForEachAccount)(TBankAccount* account, int index); -typedef bool (*FEveryAccount)(TBankAccount*, int); - -// Node class for linked list -class TLinkedListNode -{ -public: - TBankAccount* data; - TLinkedListNode* next; - TLinkedListNode(TBankAccount* aData) : data(aData), next(nullptr) {} - ~TLinkedListNode() - { - // Destructor logic if needed - } -}; - -// Use dummy head node for simplicity -class TLinkedList -{ -private: - TLinkedListNode* head; - bool ownsData; - int size; -public: - TLinkedList(bool); - ~TLinkedList(); - int getSize() const; - TLinkedListNode* getHead() const; - - void Add(TBankAccount*); - - TBankAccount* Find(FCompareAccount, void*); - - TLinkedList* Every(FCompareAccount, void*); - TBankAccount* Every(FEveryAccount aEveryFunc); - TBankAccount** ToArray(); - void forEach(FForEachAccount); - - void Append(TBankAccount* account); - void Remove(TBankAccount* account); -}; - -#endif// BANKACCOUNTLIST_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Submissions/Submission-04/CMakeLists.txt b/Exam/IKT203Exam/Submissions/Submission-04/CMakeLists.txt deleted file mode 100644 index 01fc28e..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -# CMakeList.txt : CMake project for Submission-01, include source and define -# project specific logic here. -# - -# Add source to this project's executable. -add_executable (Submission-04 "main.cpp" "main.h" "BankAccount.h" "ReadNames.cpp" "ReadNames.h" "BankAccount.cpp" "BankAccount.h" "BankAccountList.cpp" "BankAccountList.h") -target_link_libraries(Submission-04 PRIVATE LibExample) - -# Add source files to a Submission04Lib library -add_library(Submission04Lib - BankAccount.cpp - BankAccount.h - ReadNames.cpp - ReadNames.h - BankAccountList.cpp - BankAccountList.h -) - -target_include_directories(Submission04Lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -if (CMAKE_VERSION VERSION_GREATER 3.20) - set_property(TARGET Submission-03 PROPERTY CXX_STANDARD 20) -endif() - -# TODO: Add tests and install targets if needed. diff --git a/Exam/IKT203Exam/Submissions/Submission-04/ReadNames.cpp b/Exam/IKT203Exam/Submissions/Submission-04/ReadNames.cpp deleted file mode 100644 index 0b6d01f..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/ReadNames.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include -#include -#include "ReadNames.h" - -void readNamesFromFile(const std::string& aFilename, FNameRead aOnNameRead) -{ - if (aFilename.empty()) return; - std::ifstream file(aFilename); - if (!file.is_open()) - { - std::cerr << "Error opening file: " << aFilename << std::endl; - return; - } - std::string line; - while (std::getline(file, line)) - { - std::istringstream iss(line); - std::string firstName, lastName; - if (iss >> firstName >> lastName) - { - if (aOnNameRead) // If the callback is set, call it - { - //If the function returns false, stop reading further - if (!aOnNameRead(firstName, lastName)) break; - } - } - } - file.close(); -} diff --git a/Exam/IKT203Exam/Submissions/Submission-04/ReadNames.h b/Exam/IKT203Exam/Submissions/Submission-04/ReadNames.h deleted file mode 100644 index b1428b5..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/ReadNames.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once -#ifndef READNAMES_H -#define SHARED_LIB_H -#include -#include - -/// -/// Use this delegate type to define a callback function for processing names read from a file. -/// -/// FNameRead -/// A function pointer type for a callback that processes names read from a file. -/// The first name read from the file. -/// The last name read from the file. -/// Returns true to continue reading names, or false to stop. -typedef bool (*FNameRead)(const std::string& firstName, const std::string& lastName); - -/// -/// Use this function to read names from a specified file and process them using a callback function. -/// -/// readNamesFromFile -/// Reads names from a specified file and invokes a callback for each name read. -/// The path to the file containing names. -/// A callback function that is called for each name read. It takes two parameters: firstName and lastName. If the callback returns false, the reading process stops. -/// The first name read from the file. -/// The last name read from the file. -/// None. -void readNamesFromFile(const std::string& aFilename, FNameRead aOnNameRead); - - -#endif // READNAMES_H \ No newline at end of file diff --git a/Exam/IKT203Exam/Submissions/Submission-04/main.cpp b/Exam/IKT203Exam/Submissions/Submission-04/main.cpp deleted file mode 100644 index 71f0f90..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/main.cpp +++ /dev/null @@ -1,180 +0,0 @@ -// Submission-01.cpp : Defines the entry point for the application. -// - -#include "main.h" -#include "ReadNames.h" // For reading names from file -#include "BankAccount.h" // For TBankAccount and EBankAccountType -#include "BankAccountList.h" // For TLinkedList -#include // For std::getline and std::string -#include // For std::cout -#include // For std::istringstream - - - -// For statistics -typedef struct _TSummary { - long comparisonCount = 0; - double timeTaken = 0.0; -}TSummary; -static TSummary statistics; - - - -static EBankAccountType getRandomAccountType() -{ - return static_cast(rand() % 5); // Randomly returns one of the 5 account types -} - -TLinkedList* bankAccounts = new TLinkedList(true); // List owns the TBankAccount objects -TBankAccount** bankAccountArray = nullptr; - - -static bool OnNameRead(const std::string& firstName, const std::string& lastName) -{ - //For each name read, create from 5 to 10 random bank accounts - int accountCount = rand() % 6 + 5; // Random number between 5 and 10 - for (int i = 0; i < accountCount; i++) - { - EBankAccountType accType = getRandomAccountType(); - TBankAccount* newAccount = new TBankAccount(accType, firstName, lastName); - bankAccounts->Add(newAccount); - } - return true; //bankAccounts->getSize() < 100; // For demo purposes -} - -static void resetStatistics() -{ - statistics.comparisonCount = 0; - statistics.timeTaken = (static_cast(clock())) / CLOCKS_PER_SEC; -} - -static void printStastics() { - statistics.timeTaken = (static_cast(clock())) / CLOCKS_PER_SEC - statistics.timeTaken; - std::cout << "Comparisons: " << statistics.comparisonCount << ", Time taken: " << statistics.timeTaken << " seconds." << std::endl; -} - -/* -Part 3: Standalone Search Functions (The External Analyst) -To simulate working with data from different perspectives, you will also implement search functions that are not part of the list class. These functions will operate on a simple array of pointers. -*/ - -static TBankAccount* FindAccountByNumber(TBankAccount** accountArray, int arraySize, const std::string& accountNumber) { - if (accountArray == nullptr || arraySize <= 0) return nullptr; - for (int i = 0; i < arraySize; i++) { - statistics.comparisonCount++; - if (accountArray[i]->getAccountNumber() == accountNumber) { - return accountArray[i]; // Found - } - } - return nullptr; // Not found -} - -static void PrintEveryAccountInDateRange(TBankAccount** accountArray, int arraySize, time_t from, time_t to) { - if (accountArray == nullptr || arraySize <= 0) return; - std::cout << "------------------------------" << std::endl; - resetStatistics(); - int foundCount = 0; - for (int i = 0; i < arraySize; i++) { - statistics.comparisonCount++; - time_t ts = accountArray[i]->getCreationTimestamp(); - if (ts >= from && ts < to) { - std::cout << i + 1 << ". "; - accountArray[i]->printAccountInfo(); - foundCount++; - } - } - printStastics(); - std::cout << "Total accounts found in date range: " << foundCount << std::endl; -} - - -int main() -{ - std::cout << "--- Submission 4: Sosrt & Search ---" << std::endl; - - // Test TBankAccount - //Gen random account type - //Change this name for you own names file - std::string namesFile = "F:\\IKT203\\VisualStudio\\DATA\\Random_Name.txt"; - std::cout << "Reading names from file: " << namesFile << std::endl; - readNamesFromFile(namesFile, OnNameRead); - std::cout << "Total Bank Accounts Created: " << bankAccounts->getSize() << std::endl; - std::cout << "Converting linked list to array..." << std::endl; - bankAccountArray = bankAccounts->ToArray(); - std::cout << "Array created with " << bankAccounts->getSize() << " accounts." << std::endl; - - - resetStatistics(); - int getRandomIndex = rand() % bankAccounts->getSize(); - TBankAccount* foundAccount = FindAccountByNumber(bankAccountArray, bankAccounts->getSize(), bankAccountArray[getRandomIndex]->getAccountNumber()); - if (foundAccount) - { - std::cout << "Found Account: " << std::endl; - foundAccount->printAccountInfo(); - } - else - { - std::cout << "Account not found." << std::endl; - } - printStastics(); - - resetStatistics(); - foundAccount = FindAccountByNumber(bankAccountArray, bankAccounts->getSize(), "1234.56.78901"); - if (foundAccount) - { - std::cout << "Found Account: " << std::endl; - foundAccount->printAccountInfo(); - } - else - { - std::cout << "Account not found." << std::endl; - } - printStastics(); - - // Find All (Integrated): Use your Every() method to find all accounts created in June 2024 and print their details. - resetStatistics(); - struct June2024Key { - time_t start; - time_t end; - }; - June2024Key juneKey{}; - std::tm fromToTm = {}; - fromToTm.tm_year = 2024 - 1900; // Year since 1900 - fromToTm.tm_mon = 5; // June (0-based) - fromToTm.tm_mday = 1; // 1st - fromToTm.tm_hour = 0; - fromToTm.tm_min = 0; - fromToTm.tm_sec = 0; - juneKey.start = _mkgmtime(&fromToTm); // Use _mkgmtime for UTC - fromToTm.tm_mday = 30; // 30th - fromToTm.tm_hour = 23; - fromToTm.tm_min = 59; - fromToTm.tm_sec = 59; - juneKey.end = _mkgmtime(&fromToTm); // Use _mkgmtime for UTC - - TLinkedList* juneAccounts = bankAccounts->Every( - [](TBankAccount* account, void* searchKey) -> bool { - June2024Key* key = static_cast(searchKey); - time_t ts = account->getCreationTimestamp(); - return ts >= key->start && ts < key->end; - }, &juneKey); - - std::cout << "Accounts created in June 2024: " << juneAccounts->getSize() << std::endl; - printStastics(); - - juneAccounts->forEach( - [](TBankAccount* aAccount, int aIndex) { - std::cout << aIndex + 1 << ". "; - aAccount->printAccountInfo(); - }); - - PrintEveryAccountInDateRange(bankAccountArray, bankAccounts->getSize(), juneKey.start, juneKey.end); - - - // Cleanup - // First delete the array, then the linked list - delete[] bankAccountArray; - delete bankAccounts; - - return 0; -} diff --git a/Exam/IKT203Exam/Submissions/Submission-04/main.h b/Exam/IKT203Exam/Submissions/Submission-04/main.h deleted file mode 100644 index ccf6e27..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-04/main.h +++ /dev/null @@ -1,8 +0,0 @@ -// Submission-01.h : Include file for standard system include files, -// or project specific include files. - -#pragma once - -#include - -// TODO: Reference additional headers your program requires here. diff --git a/Exam/IKT203Exam/Submissions/Submission-05/CMakeLists.txt b/Exam/IKT203Exam/Submissions/Submission-05/CMakeLists.txt deleted file mode 100644 index ba0a700..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-05/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -# CMakeList.txt : CMake project for Submission-01, include source and define -# project specific logic here. -# - -# Add source to this project's executable. -add_executable (Submission-05 "main.cpp" "main.h") -target_link_libraries(Submission-05 PRIVATE Submission04Lib LibExample) - -if (CMAKE_VERSION VERSION_GREATER 3.20) - set_property(TARGET Submission-05 PROPERTY CXX_STANDARD 20) -endif() - -# TODO: Add tests and install targets if needed. diff --git a/Exam/IKT203Exam/Submissions/Submission-05/main.cpp b/Exam/IKT203Exam/Submissions/Submission-05/main.cpp deleted file mode 100644 index 56cd8c2..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-05/main.cpp +++ /dev/null @@ -1,828 +0,0 @@ -// Submission-01.cpp : Defines the entry point for the application. -// - -#include "ReadNames.h" // For reading names from file -#include "BankAccount.h" // For TBankAccount and EBankAccountType -#include "BankAccountList.h" // For TLinkedList -#include // For std::getline and std::string -#include // For std::cout -#include // For std::istringstream - - - -// For statistics -typedef struct _TSummary { - long long comparisonCount = 0; - long long swaps = 0; - double timeTaken = 0.0; -}TSummary; -static TSummary statistics; - - -static void resetStatistics() -{ - statistics.comparisonCount = 0; - statistics.swaps = 0; - statistics.timeTaken = (static_cast(clock())) / CLOCKS_PER_SEC; -} - -static void printStastics() { - statistics.timeTaken = (static_cast(clock())) / CLOCKS_PER_SEC - statistics.timeTaken; - std::cout << "Comparisons: " << statistics.comparisonCount << ", Swaps: " << statistics.swaps << ", Time taken : " << statistics.timeTaken << " seconds." << std::endl; -} - - -static EBankAccountType getRandomAccountType() -{ - return static_cast(rand() % 5); // Randomly returns one of the 5 account types -} - -TLinkedList* bankAccounts = new TLinkedList(true); // List owns the TBankAccount objects -TBankAccount** bankAccountArray = nullptr; - - -static bool OnNameRead(const std::string& firstName, const std::string& lastName) -{ - //For each name read, create from 5 to 10 random bank accounts - int accountCount = rand() % 6 + 5; // Random number between 5 and 10 - for (int i = 0; i < accountCount; i++) - { - EBankAccountType accType = getRandomAccountType(); - TBankAccount* newAccount = new TBankAccount(accType, firstName, lastName); - bankAccounts->Add(newAccount); - } - return bankAccounts->getSize() < 2500; // For demo purposes -} - -/* -Part 1: The Sorting Toolkit -Before we can sort, we need the right tools. In this part, you'll set up a flexible, powerful sorting "engine" that can handle any sorting criteria we give it. - -1. The FCompareAccounts Callback: - a) Create a typedef for a function pointer named FCompareAccounts. - b) The signature must be: int (*FCompareAccounts)(TBankAccount* a, TBankAccount* b);. - c) This function should return a negative value if a comes before b, zero if they are equal, and a positive value if a comes after b. -2. The OperationSummary Struct: - a) Create a struct named OperationSummary to track performance metrics: long long comparisons, long long swaps, and double timeSpentMs. -3. The TSort Class: - a) Create a class called TSort. This will be your dedicated sorting engine. - b) The constructor should take pointers to the original data sources (the list and the array). - c) The sorting methods should create and return a new, sorted array or list, not modify the original. -*/ - -/* -Part 2: The Simple Sorts (O(n²)) - Foundational, but Slow -These algorithms are your first step. They are conceptually simpler but do not perform well on large datasets. Implementing them is essential for understanding the fundamentals. - -4. Selection Sort: - a) The Challenge: You must implement this algorithm twice in your TSort class: - 1. A version that sorts the pointer array. - 2. A version that sorts the linked list. - b) Pay close attention to the pointer manipulation required for the linked list version—it's a fantastic challenge! -5. Bubble Sort: - a) Implement a method in TSort that performs a Bubble Sort on the pointer array. - - -Part 3: The Advanced Sorts (O(n log n)) - Divide and Conquer -Now for the heavy hitters. These recursive, "Divide and Conquer" algorithms are far more efficient and are staples of modern software engineering. - -6. Quick Sort (on the Array): - a) Implement Quick Sort to sort the pointer array. - b) Your implementation must use the public/private recursion pattern. A public QuickSort() method calls a private QuickSortRecursive(...). - c) The heart of this algorithm is the Partition() helper function. Getting this right is the key to success! - -7. Merge Sort (on the Linked List): - a) Implement Merge Sort to sort the linked list. This algorithm is a natural fit for list structures. - b) This implementation must also use the public/private recursion pattern. - c) Hint: For splitting the linked list, research the "fast and slow pointer" technique. - -Part 4: The Great Sort-Off -It's time for a performance battle! You will use your TSort engine to sort the same large dataset with all your implemented algorithms and analyze the results. - -8. Callback Implementations: - a) Write at least two different FCompareAccounts callback functions: one to sort by last name, and one to sort by balance. - -9. The Performance Battle: - a) Using your dataset of 5,000+ accounts, run all four of your sorting algorithms using the same callback function for a fair comparison. - b) For each run, capture the OperationSummary (comparisons, swaps, time). - -10. Analysis in Your Report: - a) Present your performance data in a clear table. - b) Write a paragraph answering: How do the results illustrate the difference between O(n²) and O(n log n) complexity? Why was Selection Sort harder on a list versus an array? - -Part 5: The Payoff - Integrated Binary Search - -11. The Integrated BinarySearch() Method: - a) Add a BinarySearch() method to your TSort class. This method will operate on a sorted array. - b) The TSort class must now manage an internal state (e.g., a private pointer to a sorted array and a boolean flag). A sorting method like SortArrayByLastName() will now create the sorted array, store it internally, and set the flag. - c) The BinarySearch() method must first check this internal flag to ensure the data is sorted before proceeding. - d) It must use the public/private recursion pattern and accept an FCompareAccounts callback to guide the search. - -12. Final Demonstration & Comparison: - a) In main(), first call one of your array sorting methods on your TSort instance. Then, use its new BinarySearch() method to find an item. - b) In your report, create a small final table comparing the number of comparisons to find the same item using: - 1. The Linear Search from Submission 4. - 2. The Binary Search from this submission. - c) This result is the ultimate conclusion to your work on searching and sorting! -*/ - - -typedef int (*FCompareAccounts)(TBankAccount*, TBankAccount*); - -class TSort -{ -private: - TLinkedList* list; - TBankAccount** array; - int size; - - TBankAccount** sortedArray; // Internal pointer to the sorted array - bool isSorted; // Flag to check if sorting has been done - - void swap(TBankAccount* a, TBankAccount* b) { - TBankAccount* temp = a; - a = b; - b = temp; - statistics.swaps++; - } - - int Partition(TBankAccount** aArray, int aLow, int aHigh, FCompareAccounts aCompareFunc) { - TBankAccount* pivot = aArray[aHigh]; - int i = (aLow - 1); - for (int j = aLow; j <= aHigh - 1; j++) { - statistics.comparisonCount++; - if (aCompareFunc(aArray[j], pivot) < 0) { - i++; - swap(aArray[i], aArray[j]); - TBankAccount* temp = aArray[i]; - aArray[i] = aArray[j]; - aArray[j] = temp; - } - } - swap(aArray[i + 1], aArray[aHigh]); - TBankAccount* temp = aArray[i + 1]; - aArray[i + 1] = aArray[aHigh]; - aArray[aHigh] = temp; - return (i + 1); - } - - void QuickSortRecursive(TBankAccount** aArray, int aLow, int aHigh, FCompareAccounts aCompareFunc) { - if (aLow < aHigh) { - int pi = Partition(aArray, aLow, aHigh, aCompareFunc); - QuickSortRecursive(aArray, aLow, pi - 1, aCompareFunc); - QuickSortRecursive(aArray, pi + 1, aHigh, aCompareFunc); - } - } - - // Private helper for MergeSortList: Merges two already sorted lists - TLinkedListNode* MergeSortedLists(TLinkedListNode* a, TLinkedListNode* b, FCompareAccounts aCompareFunc) { - // Base cases - if (a == nullptr) return b; - if (b == nullptr) return a; - - TLinkedListNode* resultHead = nullptr; - TLinkedListNode* resultTail = nullptr; - - // Set the head of the result list - statistics.comparisonCount++; - if (aCompareFunc(a->data, b->data) <= 0) { - resultHead = a; - a = a->next; - } - else { - resultHead = b; - b = b->next; - } - resultTail = resultHead; // The tail is currently the head - - // Loop through the rest of the lists - while (a != nullptr && b != nullptr) { - statistics.comparisonCount++; - if (aCompareFunc(a->data, b->data) <= 0) { - resultTail->next = a; - resultTail = a; - a = a->next; - } - else { - resultTail->next = b; - resultTail = b; - b = b->next; - } - } - - // Attach the remaining list (if any) - if (a != nullptr) { - resultTail->next = a; - } - else if (b != nullptr) { - resultTail->next = b; - } - - return resultHead; - } - - // Private helper for MergeSortList: Splits a list into two halves - // Uses the "fast and slow pointer" technique. - // 'source' is the head of the list to split. - // Returns the head of the second half. 'source' is modified to be the first half. - TLinkedListNode* SplitList(TLinkedListNode* source) { - TLinkedListNode* fast; - TLinkedListNode* slow; - TLinkedListNode* slowPrev = nullptr; // Need this to break the list - slow = source; - fast = source; - - // Advance 'fast' two steps and 'slow' one step - while (fast != nullptr && fast->next != nullptr) { - fast = fast->next->next; - slowPrev = slow; - slow = slow->next; - } - - // 'slow' is now at or near the middle. - // Split the list in two by setting the end of the first list to null. - if (slowPrev != nullptr) { - slowPrev->next = nullptr; - } - - // 'slow' is the head of the second list - return slow; - } - - void MergeSortRecursive(TLinkedListNode** aHeadRef, FCompareAccounts aCompareFunc) { - TLinkedListNode* head = *aHeadRef; - TLinkedListNode* left; - TLinkedListNode* right; - - // Base case: 0 or 1 element list is already sorted - if (head == nullptr || head->next == nullptr) { - return; - } - - // 1. Split the list into 'left' and 'right' halves - left = head; - right = SplitList(head); // 'head' (now 'left') is modified to be the first half - - // 2. Recursively sort the two halves - MergeSortRecursive(&left, aCompareFunc); - MergeSortRecursive(&right, aCompareFunc); - - // 3. Merge the two sorted halves back together - // Update the head pointer to point to the new sorted list - *aHeadRef = MergeSortedLists(left, right, aCompareFunc); - } - - TBankAccount* BinarySearchRecursive(TBankAccount* aKey, FCompareAccounts aCompareFunc, int aLow, int aHigh) - { - // Base case: Not found - if (aLow > aHigh) { - return nullptr; - } - - int mid = aLow + (aHigh - aLow) / 2; - - // Use the callback to compare the array element with the key - // We assume the callback knows what field to compare (e.g., lastName) - statistics.comparisonCount++; // Track comparisons - int comparisonResult = aCompareFunc(sortedArray[mid], aKey); - - if (comparisonResult == 0) { - return sortedArray[mid]; // Found - } - else if (comparisonResult < 0) { - // sortedArray[mid] is *before* aKey, so search the right half - return BinarySearchRecursive(aKey, aCompareFunc, mid + 1, aHigh); - } - else { - // sortedArray[mid] is *after* aKey, so search the left half - return BinarySearchRecursive(aKey, aCompareFunc, aLow, mid - 1); - } - } - - -public: - TSort(TLinkedList* aList, TBankAccount** aArray) : list(aList), array(aArray) { - size = list->getSize(); - sortedArray = nullptr; - isSorted = false; - } - ~TSort() {} - - TBankAccount** SelectionSortArray(FCompareAccounts compare) { - std::cout << "Starting Selection Sort on Array..." << std::endl; - resetStatistics(); - sortedArray = new TBankAccount * [size]; - for (int i = 0; i < size; i++) { - sortedArray[i] = array[i]; - } - for (int i = 0; i < size - 1; i++) { - int minIndex = i; - for (int j = i + 1; j < size; j++) { - statistics.comparisonCount++; - if (compare(sortedArray[j], sortedArray[minIndex]) < 0) { - minIndex = j; - } - } - if (minIndex != i) { - swap(sortedArray[i], sortedArray[minIndex]); - TBankAccount* temp = sortedArray[i]; - sortedArray[i] = sortedArray[minIndex]; - sortedArray[minIndex] = temp; - } - } - printStastics(); - isSorted = true; // Mark as sorted - return sortedArray; - } - - TLinkedList* SelectionSortList(FCompareAccounts aCompareFunc) { - std::cout << "Starting Selection Sort on Linked List..." << std::endl; - resetStatistics(); - TLinkedList* sortedList = new TLinkedList(false); // New list does not own data - TLinkedList* tempList = new TLinkedList(false); // Temporary list to hold unsorted data - for (int i = 0; i < size; i++) { - tempList->Add(array[i]); - } - - // Start at the first real node (head->next) - TLinkedListNode* current = tempList->getHead() ? tempList->getHead()->next : nullptr; - while (current) { - // find minimum starting from 'current' - TLinkedListNode* minNode = current; - TLinkedListNode* iter = current; - while (iter) { - statistics.comparisonCount++; - // guard against null data pointers - if (iter->data && minNode->data && aCompareFunc(iter->data, minNode->data) < 0) { - minNode = iter; - } - iter = iter->next; - } - - if (minNode && minNode->data) { - // Append to keep ascending order (Add prepends and would reverse) - sortedList->Append(minNode->data); - tempList->Remove(minNode->data); - statistics.swaps++; - } - - // restart search from first real node again - current = tempList->getHead() ? tempList->getHead()->next : nullptr; - } - printStastics(); - delete tempList; - return sortedList; - } - // Bubble Sort for array, Time Complexity O(n^2), space O(1) - TBankAccount** BubbleSortArray(FCompareAccounts compare) { - std::cout << "Starting Bubble Sort on Array..." << std::endl; - resetStatistics(); - sortedArray = new TBankAccount * [size]; - for (int i = 0; i < size; i++) { - sortedArray[i] = array[i]; - } - for (int i = 0; i < size - 1; i++) { - for (int j = 0; j < size - i - 1; j++) { - statistics.comparisonCount++; - if (compare(sortedArray[j], sortedArray[j + 1]) > 0) { - swap(sortedArray[j], sortedArray[j + 1]); - TBankAccount* temp = sortedArray[j]; - sortedArray[j] = sortedArray[j + 1]; - sortedArray[j + 1] = temp; - } - } - } - printStastics(); - isSorted = true; // Mark as sorted - return sortedArray; - } - - // Bubble Sort for linked list, Time Complexity O(n^2), space O(1) - TLinkedList* BubbleSortList(FCompareAccounts aCompareFunc) { - std::cout << "Starting Bubble Sort on Linked List..." << std::endl; - resetStatistics(); - TLinkedList* sortedList = new TLinkedList(false); // New list does not own data - TLinkedList* tempList = new TLinkedList(false); // Temporary list to hold unsorted data - for (int i = 0; i < size; i++) { - tempList->Add(array[i]); - } - int n = tempList->getSize(); - - // Start at first real node (skip dummy head) - TLinkedListNode* current; - TLinkedListNode* nextNode; - for (int i = 0; i < n - 1; i++) { - // Reset current to the start of the list for each outer loop - current = tempList->getHead() ? tempList->getHead()->next : nullptr; - nextNode = current ? current->next : nullptr; - for (int j = 0; j < n - i - 1; j++) { - if (!current || !nextNode) break; - statistics.comparisonCount++; - // Defensive: guard against null node->data - if (current->data && nextNode->data && aCompareFunc(current->data, nextNode->data) > 0) { - // Single correct swap of pointers - std::swap(current->data, nextNode->data); - statistics.swaps++; - } - current = nextNode; - nextNode = nextNode->next; - } - } - - // Transfer sorted data (append to preserve order) - current = tempList->getHead() ? tempList->getHead()->next : nullptr; - while (current) { - sortedList->Append(current->data); - current = current->next; - } - - delete tempList; - printStastics(); - return sortedList; - } - - TBankAccount** QuickSortArray(FCompareAccounts aCompare) { - std::cout << "Starting Quick Sort on Array..." << std::endl; - sortedArray = new TBankAccount * [size]; - for (int i = 0; i < size; i++) { - sortedArray[i] = array[i]; - } - resetStatistics(); - // Call the recursive QuickSort function - QuickSortRecursive(sortedArray, 0, size - 1, aCompare); - printStastics(); - isSorted = true; // Mark as sorted - return sortedArray; - } - - TLinkedList* MergeSortList(FCompareAccounts aCompareFunc) { - std::cout << "Starting Merge Sort on Linked List..." << std::endl; - resetStatistics(); // Resets comparisons, swaps, and starts timer - - // 1. Create the new list that we will sort and return. - // It does not own the TBankAccount data. - TLinkedList* sortedList = new TLinkedList(false); - if (size == 0) { - printStastics(); - return sortedList; // Return empty list if source is empty - } - - // 2. Populate 'sortedList' with the data from the array. - // We use 'Add' (prepend) for consistency with your other list sort methods. - // The initial order doesn't matter, as we're sorting the whole set. - for (int i = 0; i < size; i++) { - sortedList->Add(array[i]); - } - - // 3. Get the address of the *real* head pointer (head->next). - // The list uses a dummy head, so sorting starts at 'head->next'. - // The recursive function needs a pointer-to-a-pointer - // so it can modify which node is the *new* first node. - TLinkedListNode** realHeadPtr = &(sortedList->getHead()->next); - - // 4. Call the recursive sort. - // This will sort the list 'in-place' by rearranging node pointers. - MergeSortRecursive(realHeadPtr, aCompareFunc); - - // 5. Print statistics and return the now-sorted list - // Note: MergeSort by node-relinking doesn't use "swaps" - // in the traditional sense, so statistics.swaps should be 0. - printStastics(); - return sortedList; - } - - // Public method to start the Binary Search - TBankAccount* BinarySearch(TBankAccount* aKey, FCompareAccounts aCompareFunc) - { - // Check the flag as required by the prompt - if (!isSorted || sortedArray == nullptr) { - std::cout << "Error: Cannot binary search. Array is not sorted." << std::endl; - std::cout << "Please call an array-sorting method (e.g., QuickSortArray) first." << std::endl; - return nullptr; - } - - std::cout << "Starting Binary Search..." << std::endl; - // We reset statistics *only* for the search operation - resetStatistics(); - - TBankAccount* foundAccount = BinarySearchRecursive(aKey, aCompareFunc, 0, size - 1); - - printStastics(); // Print search performance - return foundAccount; - } - -}; - -// Comparison functions -// Comapre based on account number -static int CompareByAccountNumber(TBankAccount* a, TBankAccount* b) { - return a->getAccountNumber().compare(b->getAccountNumber()); -} - -//Cmpare based on creation timestamp -static int CompareByCreationTimestamp(TBankAccount* a, TBankAccount* b) { - if (a->getCreationTimestamp() < b->getCreationTimestamp()) return -1; - if (a->getCreationTimestamp() > b->getCreationTimestamp()) return 1; - return 0; -} - -// Compare by last name (alphabetical) -static int CompareByLastName(TBankAccount* a, TBankAccount* b) { - return a->ownerLastName.compare(b->ownerLastName); -} - -// Compare by balance (lowest to highest) -static int CompareByBalance(TBankAccount* a, TBankAccount* b) { - if (a->getBalance() < b->getBalance()) return -1; - if (a->getBalance() > b->getBalance()) return 1; - return 0; -} - -static bool Print15Accounts(TBankAccount* account, int index) { - if (index < 15) { - std::cout << account->getAccountNumber() << std::endl; - return true; // Continue - } - return false; // Stop -} - - - -int main() -{ - std::cout << "--- Submission 5: The Algorithmic Organizer ---" << std::endl; - std::string namesFile = "F:\\IKT203\\VisualStudio\\DATA\\Random_Name.txt"; - std::cout << "Reading names from file: " << namesFile << std::endl; - readNamesFromFile(namesFile, OnNameRead); - std::cout << "Total Bank Accounts Created: " << bankAccounts->getSize() << std::endl; - std::cout << "Converting linked list to array..." << std::endl; - bankAccountArray = bankAccounts->ToArray(); - std::cout << "Array created with " << bankAccounts->getSize() << " accounts." << std::endl; - - TSort sorter(bankAccounts, bankAccountArray); - TBankAccount** sortedArray = nullptr; - TLinkedList* sortedList = nullptr; - sortedArray = sorter.SelectionSortArray(CompareByAccountNumber); - //Print th first 15 sorted account numbers - std::cout << "First 15 sorted account numbers (Selection Sort on Array):" << std::endl; - for (int i = 0; i < 15; i++) { - std::cout << sortedArray[i]->getAccountNumber() << std::endl; - } - //Free sorted array - delete[] sortedArray; - - sortedList = sorter.SelectionSortList(CompareByAccountNumber); - //Print th first 15 sorted account numbers - std::cout << "First 15 sorted account numbers (Selection Sort on Linked List):" << std::endl; - sortedList->Every(Print15Accounts); - //Free sorted list - delete sortedList; - - sortedArray = sorter.BubbleSortArray(CompareByAccountNumber); - //Print th first 15 sorted account numbers - std::cout << "First 15 sorted account numbers (Bubble Sort on Array):" << std::endl; - for (int i = 0; i < 15; i++) { - std::cout << sortedArray[i]->getAccountNumber() << std::endl; - } - //Free sorted array - delete[] sortedArray; - - sortedList = sorter.BubbleSortList(CompareByAccountNumber); - //Print th first 15 sorted account numbers - std::cout << "First 15 sorted account numbers (Bubble Sort on Linked List):" << std::endl; - sortedList->Every(Print15Accounts); - //Free sorted list - delete sortedList; - - sortedArray = sorter.QuickSortArray(CompareByAccountNumber); - //Print th first 15 sorted account numbers - std::cout << "First 15 sorted account numbers (Quick Sort on Array):" << std::endl; - for (int i = 0; i < 15; i++) { - std::cout << sortedArray[i]->getAccountNumber() << std::endl; - } - //Free sorted array - delete[] sortedArray; - - sortedList = sorter.MergeSortList(CompareByAccountNumber); - //Print th first 15 sorted account numbers - std::cout << "First 15 sorted account numbers (Merge Sort on Linked List):" << std::endl; - sortedList->Every(Print15Accounts); - //Free sorted list - delete sortedList; - - // --- Part 5: The Payoff (Binary Search) --- - std::cout << "\n--- Part 5: The Payoff (Binary Search) ---" << std::endl; - // We will search for the person from the 100th account in the *original* array - // This gives us a random target to find. - std::string targetLastName = bankAccountArray[100]->ownerLastName; - std::string targetFirstName = bankAccountArray[100]->ownerFirstName; - std::cout << "Attempting to find account for: " << targetFirstName << " " << targetLastName << std::endl; - - // 1. Create a "dummy" key object. - // We only need to fill in the field we are comparing against (lastName). - // We pass 0 (Checking) as a placeholder. - TBankAccount* searchKey = new TBankAccount(Checking, "", targetLastName); - - // 2. First, we must sort the array by last name to prepare for binary search. - sortedArray = sorter.QuickSortArray(CompareByLastName); - - // 2. Perform the Binary Search - // We MUST use the *same comparison function* that the array was sorted with. - TBankAccount* foundAccount = sorter.BinarySearch(searchKey, CompareByLastName); - - if (foundAccount != nullptr) { - std::cout << "Success! Found account: " << std::endl; - foundAccount->printAccountInfo(); - } - else { - std::cout << "Failure: Account not found." << std::endl; - } - - // 3. Clean up the dummy key - delete searchKey; - // Clean up the sorted array - delete[] sortedArray; - - - // Cleanup - // First delete the array, then the linked list - delete[] bankAccountArray; - delete bankAccounts; - - return 0; -} - -/* -Report Analysis Text (Part 4) - -Here is a sample table and analysis paragraph as required by the assignment prompt. - -Performance Battle: Sorting 2500 Accounts by Last Name - -Algorithm Data Structure Comparisons Swaps Time -Selection Sort Array ~3,123,750 ~2,499 ~2.8 s -Bubble Sort Array ~3,123,750 ~1,500,000 ~2.5 s -Quick Sort Array ~32,000 ~15,000 ~0.02 s -Merge Sort Linked List ~25,000 0 ~0.02 s - -(Note: Actual numbers will vary slightly, but the magnitude will be the same.) - -Analysis of O(n²) vs. O(n log n): - -The performance data clearly illustrates the massive theoretical difference between O(n²) and O(n log n) complexity. -The O(n²) algorithms (Selection, Bubble) both required over 3.1 million comparisons, which is consistent with the (n * (n-1)) / 2 formula. -In contrast, the O(n log n) algorithms (Quick, Merge) required only ~25-30,000 comparisons. This huge reduction in operations resulted in a runtime improvement of over 100x (from ~2.6 seconds to ~0.02 seconds). -This demonstrates that for a dataset of just 2500 items, the choice of a "Divide and Conquer" algorithm is not a minor optimization but a fundamental requirement for acceptable performance. - -Why was Selection Sort harder on a list versus an array? - -(This question is in your prompt, but your log shows the list version was faster! This is likely due to your specific Remove implementation. The classic answer is below, which you can adapt.) - -Classic Answer: Implementing Selection Sort on a linked list is conceptually harder and often slower than on an array. -In an array, "swapping" elements is a trivial O(1) operation (std::swap(arr[i], arr[min])). In a linked list, a "swap" is complex. -To move a node, you must find the node before it and meticulously relink four pointers (e.g., prevMin->next, minNode->next, etc.) without losing any part of the list. -This pointer manipulation is far more complex and error-prone than a simple array index swap. (In our implementation, we "swapped" by removing the node and appending it, which still involves list traversal and is less efficient than an array swap.) - -Report Analysis Text (Part 5) - -Search Performance Comparison: Finding One Account in 2500 -Search Algorithm Data Structure Comparisons (Approx.) -Linear Search Unsorted Array/List ~1250 (Average Case) -Binary Search Sorted Array ~11-12 - -Analysis: - -This result is the ultimate payoff for sorting. -A linear search on our 2500-item unsorted list would, on average, require checking half the items (n/2, or ~1250 comparisons) and in the worst case 2500 (n). -After sorting the data just once (an O(n log n) cost), we can now find any item using Binary Search. This O(log n) algorithm reduced the search comparisons from ~1250 to just 12 (log₂(2500) ≈ 11.3). -This is an exponential speedup, making data retrieval virtually instantaneous, and it proves why sorting is a foundational prerequisite for efficient data processing. -*/ - -/* -Logg from running the program: - ---- Submission 5: The Algorithmic Organizer --- -Reading names from file: F:\IKT203\VisualStudio\DATA\Random_Name.txt -Total Bank Accounts Created: 2500 -Converting linked list to array... -Array created with 2500 accounts. -Starting Selection Sort on Array... -Comparisons: 3123750, Swaps: 2494, Time taken : 2.927 seconds. -First 15 sorted account numbers (Selection Sort on Array): -1006.19.41937 -1009.29.37840 -1026.96.17049 -1033.96.20263 -1035.79.40057 -1037.13.26840 -1037.49.34641 -1038.73.38621 -1042.95.36093 -1043.63.17037 -1044.55.24939 -1049.32.31466 -1050.25.30388 -1060.62.29640 -1064.57.36126 -Starting Selection Sort on Linked List... -Comparisons: 3126250, Swaps: 2500, Time taken : 2.685 seconds. -First 15 sorted account numbers (Selection Sort on Linked List): -1006.19.41937 -1009.29.37840 -1026.96.17049 -1033.96.20263 -1035.79.40057 -1037.13.26840 -1037.49.34641 -1038.73.38621 -1042.95.36093 -1043.63.17037 -1044.55.24939 -1049.32.31466 -1050.25.30388 -1060.62.29640 -1064.57.36126 -Starting Bubble Sort on Array... -Comparisons: 3123750, Swaps: 1579132, Time taken : 2.501 seconds. -First 15 sorted account numbers (Bubble Sort on Array): -1006.19.41937 -1009.29.37840 -1026.96.17049 -1033.96.20263 -1035.79.40057 -1037.13.26840 -1037.49.34641 -1038.73.38621 -1042.95.36093 -1043.63.17037 -1044.55.24939 -1049.32.31466 -1050.25.30388 -1060.62.29640 -1064.57.36126 -Starting Bubble Sort on Linked List... -Comparisons: 3123750, Swaps: 1544618, Time taken : 2.536 seconds. -First 15 sorted account numbers (Bubble Sort on Linked List): -1006.19.41937 -1009.29.37840 -1026.96.17049 -1033.96.20263 -1035.79.40057 -1037.13.26840 -1037.49.34641 -1038.73.38621 -1042.95.36093 -1043.63.17037 -1044.55.24939 -1049.32.31466 -1050.25.30388 -1060.62.29640 -1064.57.36126 -Starting Quick Sort on Array... -Comparisons: 32501, Swaps: 15752, Time taken : 0.023 seconds. -First 15 sorted account numbers (Quick Sort on Array): -1006.19.41937 -1009.29.37840 -1026.96.17049 -1033.96.20263 -1035.79.40057 -1037.13.26840 -1037.49.34641 -1038.73.38621 -1042.95.36093 -1043.63.17037 -1044.55.24939 -1049.32.31466 -1050.25.30388 -1060.62.29640 -1064.57.36126 -Starting Merge Sort on Linked List... -Comparisons: 25093, Swaps: 0, Time taken : 0.018 seconds. -First 15 sorted account numbers (Merge Sort on Linked List): -1006.19.41937 -1009.29.37840 -1026.96.17049 -1033.96.20263 -1035.79.40057 -1037.13.26840 -1037.49.34641 -1038.73.38621 -1042.95.36093 -1043.63.17037 -1044.55.24939 -1049.32.31466 -1050.25.30388 -1060.62.29640 -1064.57.36126 - ---- Part 5: The Payoff (Binary Search) --- -Attempting to find account for: Avyan Byerly -Starting Quick Sort on Array... -Comparisons: 38457, Swaps: 15141, Time taken : 0.001 seconds. -Starting Binary Search... -Comparisons: 8, Swaps: 0, Time taken : 0 seconds. -Success! Found account: -Account Number: 1978.66.25918, Type: Checking, Owner: Avyan Byerly, Balance: 507, Created: Sun Oct 27 18:56:00 2024 - - -*/ \ No newline at end of file diff --git a/Exam/IKT203Exam/Submissions/Submission-05/main.h b/Exam/IKT203Exam/Submissions/Submission-05/main.h deleted file mode 100644 index ccf6e27..0000000 --- a/Exam/IKT203Exam/Submissions/Submission-05/main.h +++ /dev/null @@ -1,8 +0,0 @@ -// Submission-01.h : Include file for standard system include files, -// or project specific include files. - -#pragma once - -#include - -// TODO: Reference additional headers your program requires here. diff --git a/Exam/IKT203Exam/deploy.ps1 b/Exam/IKT203Exam/deploy.ps1 deleted file mode 100644 index f7bc35f..0000000 --- a/Exam/IKT203Exam/deploy.ps1 +++ /dev/null @@ -1,58 +0,0 @@ -# This block defines the parameters the script can accept from the command line. -param ( - # The full path to the build directory where the .exe is located - # Example: F:/IKT203/VisualStudio/Exercises/out/build/x64-debug/Submission-01 - [string]$BuildDir, - - # The path to your vcpkg installation - [string]$VcpkgRoot = "D:/dev/vcpkg", - - # The vcpkg triplet name (e.g., x64-windows) - [string]$Triplet = "x64-windows" -) - -# --- Script Body --- -Write-Host "Starting deployment for project in $BuildDir..." -ForegroundColor Green - -# Define the source paths using the parameters. -# Path to the main Qt DLLs (e.g., .../debug/bin) -$vcpkgBinPath = Join-Path $VcpkgRoot "installed/$Triplet/debug/bin" - -# CORRECTED: Path to the platform plugins (e.g., .../debug/Qt6/plugins/platforms) -$vcpkgPluginsPath = Join-Path $VcpkgRoot "installed/$Triplet/debug/Qt6/plugins/platforms" - -# The destination path is the build directory's main folder. -$destinationPath = $BuildDir - -# Check if the destination directory exists. -if (-not (Test-Path $destinationPath)) { - Write-Host "Error: Build directory not found at $destinationPath" -ForegroundColor Red - exit 1 -} - -# --- Copy Main DLLs --- -# List the essential DLLs your project needs. -$qtDlls = @( - "Qt6Cored.dll", - "Qt6Guid.dll", - "Qt6Widgetsd.dll" -) - -Write-Host "Copying main Qt DLLs to $destinationPath" -foreach ($dll in $qtDlls) { - $sourceDll = Join-Path $vcpkgBinPath $dll - Copy-Item -Path $sourceDll -Destination $destinationPath -Force -} - -# --- Copy Platform Plugin --- -# Create the "platforms" subdirectory if it doesn't exist. -$pluginDestPath = Join-Path $destinationPath "platforms" -if (-not (Test-Path $pluginDestPath)) { - New-Item -ItemType Directory -Path $pluginDestPath -} - -Write-Host "Copying platform plugin to $pluginDestPath" -$sourcePlugin = Join-Path $vcpkgPluginsPath "qwindowsd.dll" -Copy-Item -Path $sourcePlugin -Destination $pluginDestPath -Force - -Write-Host "Deployment complete!" -ForegroundColor Green