Advertisement
Zuhairy_Harry

AA Project v3

Jan 10th, 2024
949
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 29.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <iomanip>
  8. #include <chrono>
  9.  
  10. using namespace std;
  11. using namespace chrono;
  12.  
  13. struct Student {
  14.     int  age, roomFloor;
  15.     string id,name, state, department, fees;
  16.  
  17. };
  18.  
  19. // Function prototypes
  20. void customSwap(Student& a, Student& b, int& swapCount);
  21. int partition(vector<Student>& students, int low, int high, int& swapCount);
  22. void quickSort(vector<Student>& students, int low, int high, int& swapCount);
  23. void loadStudents(const string& filename, vector<Student>& students);
  24. int binarySearch(const vector<Student>& students, int l, int r, int x);
  25. int linearSearch(const vector<Student>& students, int x);
  26. void displayStudents(const vector<Student>& students, int displayLimit);
  27. void merge(vector<Student>& students, int low, int mid, int high, int& swapCount);
  28. void mergeSort(vector<Student>& students, int low, int high, int& swapCount);
  29. double calculateAverageAge(const vector<Student>& students);
  30. int calculateTotalDept(const vector<Student>& students);
  31. int calculateTotalState(const vector<Student>& students);
  32.  
  33.  
  34. string trim(const string& str);
  35.  
  36. // Function implementations
  37. string trim(const string& str) {
  38.     size_t first = str.find_first_not_of(" \t\"");
  39.     if (first == string::npos) return "";
  40.     size_t last = str.find_last_not_of(" \t\"");
  41.     return str.substr(first, (last - first + 1));
  42. }
  43.  
  44.  
  45. int partition(vector<Student>& students, int low, int high, int& swapCount) {
  46.     string pivot = students[high].id;
  47.     int i = low - 1;
  48.  
  49.     for (int j = low; j < high; j++) {
  50.         if (students[j].id < pivot) {
  51.             i++;
  52.             customSwap(students[i], students[j], swapCount);
  53.         }
  54.     }
  55.     customSwap(students[i + 1], students[high], swapCount);
  56.     return i + 1;
  57. }
  58.  
  59.  
  60.  
  61.  
  62. /*
  63. -----------------------------------------------------------------------------------
  64.     QUICK SORT FUNCTION
  65. -----------------------------------------------------------------------------------
  66. */
  67. void quickSort(vector<Student>& students, int low, int high, int& swapCount) {
  68.     if (low < high) {
  69.         int pi = partition(students, low, high, swapCount);
  70.         quickSort(students, low, pi - 1, swapCount);
  71.         quickSort(students, pi + 1, high, swapCount);
  72.     }
  73. }
  74.  
  75.  
  76.  
  77.  
  78. /*
  79. -----------------------------------------------------------------------------------
  80.     LOAD FILE FUNCTION
  81. -----------------------------------------------------------------------------------
  82. */
  83. void loadStudents(const string& filename, vector<Student>& students) {
  84.     ifstream ip(filename);
  85.     if (!ip.is_open()) {
  86.         cerr << "Error: File could not be opened" << '\n';
  87.         return;
  88.     }
  89.  
  90.     string line;
  91.     getline(ip, line); // Skip the header if present
  92.  
  93.     while (getline(ip, line)) {
  94.         stringstream ss(line);
  95.         Student tempStudent;
  96.         string tempId, tempAge, tempRoomFloor;
  97.  
  98.         getline(ss, tempId, ',');
  99.         getline(ss, tempStudent.name, ',');
  100.         getline(ss, tempAge, ',');
  101.         getline(ss, tempStudent.state, ',');
  102.         getline(ss, tempStudent.department, ',');
  103.         getline(ss, tempRoomFloor, ',');
  104.         getline(ss, tempStudent.fees, '\n');
  105.        
  106.         tempStudent.id = trim(tempId);
  107.         tempStudent.age = stoi(trim(tempAge));
  108.         tempStudent.roomFloor = stoi(trim(tempRoomFloor));
  109.         tempStudent.name = trim(tempStudent.name);
  110.         tempStudent.state = trim(tempStudent.state);
  111.         tempStudent.department = trim(tempStudent.department);
  112.         tempStudent.fees = trim(tempStudent.fees);
  113.  
  114.         students.push_back(tempStudent); // Add the new student to the vector
  115.     }
  116.  
  117.     ip.close();
  118. }
  119.  
  120.  
  121.  
  122.  
  123. /*
  124. -----------------------------------------------------------------------------------
  125.     MERGE FUNCTION
  126. -----------------------------------------------------------------------------------
  127. */
  128. void merge(vector<Student>& students, int low, int mid, int high, int& swapCount) {
  129.     int n1 = mid - low + 1;
  130.     int n2 = high - mid;
  131.  
  132.     vector<Student> left(n1), right(n2);
  133.  
  134.     for (int i = 0; i < n1; i++)
  135.         left[i] = students[low + i];
  136.     for (int j = 0; j < n2; j++)
  137.         right[j] = students[mid + 1 + j];
  138.  
  139.     int i = 0, j = 0, k = low;
  140.  
  141.     while (i < n1 && j < n2) {
  142.         if (left[i].id <= right[j].id) {
  143.             students[k++] = left[i++];
  144.         }
  145.         else {
  146.             students[k++] = right[j++];
  147.             swapCount += n1 - i; // Counting swaps when elements are moved from left to right
  148.         }
  149.     }
  150.  
  151.     while (i < n1) {
  152.         students[k++] = left[i++];
  153.     }
  154.     while (j < n2) {
  155.         students[k++] = right[j++];
  156.     }
  157.  
  158. }
  159.  
  160.  
  161.  
  162.  
  163. /*
  164. -----------------------------------------------------------------------------------
  165.     MERGE SORT FUNCTION
  166. -----------------------------------------------------------------------------------
  167. */
  168. void mergeSort(vector<Student>& students, int low, int high, int& swapCount) {
  169.     if (low < high) {
  170.         int mid = low + (high - low) / 2;
  171.  
  172.         mergeSort(students, low, mid, swapCount);
  173.         mergeSort(students, mid + 1, high, swapCount);
  174.  
  175.         merge(students, low, mid, high, swapCount);
  176.     }
  177.  
  178.     //cout << "Total Swaps = " << swapCount << endl;
  179. }
  180.  
  181.  
  182.  
  183.  
  184. /*
  185. -----------------------------------------------------------------------------------
  186.     CALCULATE TOTAL STUDENT FROM DEPT FUNCTION
  187. -----------------------------------------------------------------------------------
  188. */
  189. int calculateTotalDept(const vector<Student>& students) {
  190.     if (students.empty()) {
  191.         return 0.0; // Return 0 if there are no students
  192.     }
  193.  
  194.     int ftmkDept = 0;
  195.     int ftkekDept = 0;
  196.     int fpttDept = 0;
  197.     for (const auto& student : students) {
  198.         if (student.department == "FTMK") {
  199.             ftmkDept++;
  200.         }
  201.         else if (student.department == "FTKEK") {
  202.             ftkekDept++;
  203.         }
  204.         else if (student.department == "FPTT") {
  205.             fpttDept++;
  206.         }
  207.     }
  208.  
  209.     cout << "\nTotal student for FTMK department = " << ftmkDept << endl;
  210.     cout << "Total student for FTKEK department = " << ftkekDept << endl;
  211.     cout << "Total student for FPTT department = " << fpttDept << "\n" << endl;
  212.  
  213.     return ftmkDept, ftkekDept, fpttDept;
  214. }
  215.  
  216.  
  217.  
  218.  
  219.  
  220. /*
  221. -----------------------------------------------------------------------------------
  222.     CALCULATE TOTAL STUDENT FROM STATE FUNCTION
  223. -----------------------------------------------------------------------------------
  224. */
  225. int calculateTotalState(const vector<Student>& students) {
  226.     if (students.empty()) {
  227.         return 0.0; // Return 0 if there are no students
  228.     }
  229.  
  230.     int JohorState = 0;
  231.     int KedahState = 0;
  232.     int MalaccaState = 0;
  233.     int SelangorState = 0;
  234.     int TerengganuState = 0;
  235.  
  236.  
  237.     for (const auto& student : students) {
  238.         if (student.state == "Johor") {
  239.             JohorState++;
  240.         }
  241.         else if (student.state == "Kedah") {
  242.             KedahState++;
  243.         }
  244.         else if (student.state == "Malacca") {
  245.             MalaccaState++;
  246.         }
  247.         else if (student.state == "Selangor") {
  248.             SelangorState++;
  249.         }
  250.         else if (student.state == "Terengganu") {
  251.             TerengganuState++;
  252.         }
  253.     }
  254.  
  255.     cout << "\nTotal student for Johor state = " << JohorState << endl;
  256.     cout << "Total student for Kedah State = " << KedahState << endl;
  257.     cout << "Total student for Malacca State = " << MalaccaState << endl;
  258.     cout << "Total student for Selangor State = " << SelangorState << endl;
  259.     cout << "Total student for Teregganu state = " << TerengganuState << "\n" << endl;
  260.  
  261.     return JohorState, KedahState, MalaccaState, SelangorState, TerengganuState;
  262. }
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272. /*
  273. -----------------------------------------------------------------------------------
  274.     CALCULATE AVERAGE AGE FUNCTION
  275. -----------------------------------------------------------------------------------
  276. */
  277. double calculateAverageAge(const vector<Student>& students) {
  278.     if (students.empty()) {
  279.         return 0.0; // Return 0 if there are no students
  280.     }
  281.  
  282.     int totalAge = 0;
  283.     for (const auto& student : students) {
  284.         totalAge += student.age;
  285.     }
  286.  
  287.     return static_cast<double>(totalAge) / students.size();
  288. }
  289.  
  290.  
  291.  
  292.  
  293. /*
  294. -----------------------------------------------------------------------------------
  295.     BINARY SEARCH FUNCTION
  296. -----------------------------------------------------------------------------------
  297. */
  298. int binarySearch(const Student students[], int l, int r, const string& x) {
  299.     if (r >= l) {
  300.         int mid = l + (r - l) / 2;
  301.  
  302.         if (students[mid].id == x)
  303.             return mid;
  304.  
  305.         if (students[mid].id > x)
  306.             return binarySearch(students, l, mid - 1, x);
  307.  
  308.         return binarySearch(students, mid + 1, r, x);
  309.     }
  310.  
  311.     return -1;
  312. }
  313.  
  314.  
  315.  
  316.  
  317. /*
  318. -----------------------------------------------------------------------------------
  319.     LINEAR SEARCH FUNCTION
  320. -----------------------------------------------------------------------------------
  321. */
  322. int linearSearch(const Student students[], int n, const string& x) {
  323.     for (int i = 0; i < n; i++) {
  324.         if (students[i].id == x) {
  325.             return i;
  326.         }
  327.     }
  328.     return -1;
  329. }
  330.  
  331.  
  332.  
  333.  
  334. /*
  335. -----------------------------------------------------------------------------------
  336.     SWAP FUNCTION
  337. -----------------------------------------------------------------------------------
  338. */
  339. void customSwap(Student& a, Student& b, int& swapCount) {
  340.     swap(a, b);  // Swaps the entire Student objects
  341.     swapCount++;
  342. }
  343.  
  344.  
  345.  
  346.  
  347. /*
  348. -----------------------------------------------------------------------------------
  349.     MERGE SWAP FUNCTION
  350. -----------------------------------------------------------------------------------
  351. */
  352. int binarySearch(const vector<Student>& students, int l, int r, const string& x) {
  353.     while (l <= r) {
  354.         int mid = l + (r - l) / 2;
  355.         if (students[mid].id == x) {
  356.             return mid;
  357.         }
  358.         else if (students[mid].id < x) {
  359.             l = mid + 1;
  360.         }
  361.         else {
  362.             r = mid - 1;
  363.         }
  364.     }
  365.     return -1;
  366. }
  367.  
  368.  
  369.  
  370.  
  371. /*
  372. -----------------------------------------------------------------------------------
  373.     LINEAR SEARCH FUNCTION
  374. -----------------------------------------------------------------------------------
  375. */
  376. /*int linearSearch(const vector<Student>& students, int x) {
  377.     for (int i = 0; i < students.size(); ++i) {
  378.         if (students[i].id == x) {
  379.             return i;
  380.         }
  381.     }
  382.     return -1;
  383. }*/
  384.  
  385. int linearSearch(const std::vector<Student>& students, const string& idToSearch) {
  386.     for (size_t i = 0; i < students.size(); ++i) {
  387.         if (students[i].id == idToSearch) {
  388.             return i; // Return the index if ID is found
  389.         }
  390.     }
  391.     return -1; // Return -1 if ID is not found
  392. }
  393.  
  394.  
  395.  
  396.  
  397. /*
  398. -----------------------------------------------------------------------------------
  399.     DISPLAY DATA FUNCTION
  400. -----------------------------------------------------------------------------------
  401. */
  402. void displayStudents(const vector<Student>& students, int displayLimit) {
  403.  
  404.     const int fieldWidth = 20;
  405.     cout << "---------------------------------------------------------------------------------------------------------" << endl;
  406.     cout << "ID\t|Name\t\t\t|Age\t|State\t\t|Department\t|Room Floor\t|Fees\t\t|" << endl;
  407.     /*cout << "ID" << string(fieldWidth - 2, ' ') << "|Name" << string(fieldWidth - 4, ' ')
  408.         << "|Age" << string(fieldWidth - 2, ' ') << "|State" << string(fieldWidth - 6, ' ')
  409.         << "|Department" << string(fieldWidth - 10, ' ') << "|Room Floor" << string(fieldWidth - 10, ' ')
  410.         << "|Fees" << string(fieldWidth - 1, ' ') << "|" << endl;*/
  411.     cout << "---------------------------------------------------------------------------------------------------------" << endl;
  412.     int count = 0;
  413.     for (const auto& student : students) {
  414.  
  415.         if (count >= displayLimit) break;
  416.  
  417.         if (student.name.length() >= 15) {
  418.             if (student.state.length() > 5) {
  419.                 if (student.fees.length() > 5) {
  420.                     cout << student.id << "\t|" << student.name << "\t|" << student.age << "\t|" << student.state << "\t|" << student.department << "\t\t|";
  421.                     cout << student.roomFloor << "\t\t|" << student.fees << "\t|" << endl;
  422.                 }
  423.                 else {
  424.                     cout << student.id << "\t|" << student.name << "\t|" << student.age << "\t|" << student.state << "\t|" << student.department << "\t\t|";
  425.                     cout << student.roomFloor << "\t\t|" << student.fees << "\t\t|" << endl;
  426.                 }
  427.  
  428.             }
  429.             else {
  430.  
  431.                 if (student.fees.length() > 5) {
  432.                     cout << student.id << "\t|" << student.name << "\t|" << student.age << "\t|" << student.state << "\t\t|" << student.department << "\t\t|";
  433.                     cout << student.roomFloor << "\t\t|" << student.fees << "\t|" << endl;
  434.                 }
  435.                 else {
  436.                     cout << student.id << "\t|" << student.name << "\t|" << student.age << "\t|" << student.state << "\t\t|" << student.department << "\t\t|";
  437.                     cout << student.roomFloor << "\t\t|" << student.fees << "\t\t|" << endl;
  438.                 }
  439.             }
  440.         }
  441.         else {
  442.             if (student.state.length() > 5) {
  443.  
  444.                 if (student.fees.length() > 5) {
  445.                     cout << student.id << "\t|" << student.name << "\t\t|" << student.age << "\t|" << student.state << "\t|" << student.department << "\t\t|";
  446.                     cout << student.roomFloor << "\t\t|" << student.fees << "\t|" << endl;
  447.                 }
  448.                 else {
  449.                     cout << student.id << "\t|" << student.name << "\t\t|" << student.age << "\t|" << student.state << "\t|" << student.department << "\t\t|";
  450.                     cout << student.roomFloor << "\t\t|" << student.fees << "\t\t|" << endl;
  451.                 }
  452.             }
  453.             else {
  454.                 if (student.fees.length() > 5) {
  455.                     cout << student.id << "\t|" << student.name << "\t\t|" << student.age << "\t|" << student.state << "\t\t|" << student.department << "\t\t|";
  456.                     cout << student.roomFloor << "\t\t|" << student.fees << "\t|" << endl;
  457.                 }
  458.                 else {
  459.                     cout << student.id << "\t|" << student.name << "\t\t|" << student.age << "\t|" << student.state << "\t\t|" << student.department << "\t\t|";
  460.                     cout << student.roomFloor << "\t\t|" << student.fees << "\t\t|" << endl;
  461.                 }
  462.             }
  463.         }
  464.  
  465.  
  466.         /* cout << student.id << string(fieldWidth - to_string(student.id).length(), ' ')
  467.              << "|" << student.name << string(fieldWidth - student.name.length(), ' ')
  468.              << "|" << student.age << string(fieldWidth - to_string(student.age).length(), ' ')
  469.              << "|" << student.state << string(fieldWidth - student.state.length(), ' ')
  470.              << "|" << student.department << string(fieldWidth - student.department.length(), ' ')
  471.              << "|" << student.roomFloor << string(fieldWidth - to_string(student.roomFloor).length(), ' ')
  472.              << "|" << student.fees << string(fieldWidth - student.fees.length(), ' ') << "|" << endl;*/
  473.  
  474.         count++;
  475.     }
  476.     cout << "---------------------------------------------------------------------------------------------------------" << endl;
  477. }
  478.  
  479.  
  480.  
  481.  
  482. /*
  483. -----------------------------------------------------------------------------------
  484.     MAIN FUNCTION
  485. -----------------------------------------------------------------------------------
  486. */
  487.  
  488. int main() {
  489.     vector<Student> students;
  490.     loadStudents("output3.csv", students);
  491.     int swapCount = 0;
  492.     int numStudents = 0;
  493.  
  494.     int choice;
  495.     do {
  496.         cout << "----------------------------------------------------------------------------------" << endl;
  497.         cout << "SATRIA MANAGEMENT SYSTEM" << endl;
  498.         cout << "1) Unsort Data" << endl;
  499.         cout << "2) Sorting" << endl;
  500.         cout << "3) Search" << endl;
  501.         cout << "4) Additional Features" << endl;
  502.         cout << "5) Exit" << endl;
  503.         cout << "----------------------------------------------------------------------------------" << endl;
  504.         cout << "\nEnter choice: ";
  505.         cin >> choice;
  506.  
  507.         switch (choice) {
  508.         case 1: {
  509.             cout << "Unsorted Data" << endl;
  510.             displayStudents(students, min(100, static_cast<int>(students.size())));
  511.             main();
  512.             break;
  513.         }
  514.         case 2: {
  515.             int sortChoice = 0;
  516.             string sortChoiceWord = "";
  517.             do {
  518.                 cout << "----------------------------------------------------------------------------------" << endl;
  519.                 cout << "Sorting Menu" << endl;
  520.                 cout << "1) Quick Sort" << endl;
  521.                 cout << "2) Merge Sort" << endl;
  522.                 cout << "3) Back" << endl;
  523.                 cout << "----------------------------------------------------------------------------------" << endl;
  524.                 cout << "\nEnter choice: ";
  525.                 cin >> sortChoice;
  526.  
  527.                 swapCount = 0; // Reset swap count before sorting
  528.                 switch (sortChoice) {
  529.                 case 1:{
  530.                     cout << "\nStudents sorted using Quick Sort!" << endl;
  531.                     auto startquick = high_resolution_clock::now();
  532.                     quickSort(students, 0, students.size() - 1, swapCount); // Pass swapCount here
  533.                     displayStudents(students, min(100, static_cast<int>(students.size())));
  534.                     auto stopquick = high_resolution_clock::now();
  535.                     auto durationquick = duration_cast<milliseconds>(stopquick - startquick);
  536.                    
  537.                     cout << "Total swaps: " << swapCount << "\n" << endl;
  538.                     cout << "Total runtime: " << (durationquick.count() * 0.001) << " seconds" << endl;
  539.                     main();
  540.                     break;}
  541.                 case 2:{
  542.                     //sini
  543.                     cout << "\nStudents sorted using Merge Sort!" << endl;
  544.                     auto startmerge = high_resolution_clock::now();
  545.                     mergeSort(students, 0, students.size() - 1, swapCount);
  546.                     displayStudents(students, min(100, static_cast<int>(students.size())));
  547.                     auto stopmerge = high_resolution_clock::now();
  548.                     auto durationmerge = duration_cast<milliseconds>(stopmerge - startmerge);
  549.                    
  550.                     cout << "Total swaps: " << swapCount << "\n" << endl;
  551.                     cout << "Total runtime: " << (durationmerge.count() * 0.001) << " seconds" << endl;
  552.                     main();
  553.                     break;}
  554.                 case 3:{
  555.                     main();
  556.                     break;
  557.                 }
  558.                 default:
  559.                     if (!cin.fail()) {
  560.                         cout << "Please input a valid number!" << "\n" << endl;
  561.                         sortChoiceWord = to_string(sortChoice);
  562.                     }
  563.                     else {
  564.                         cin.clear();
  565.                         cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  566.                         cout << "Invalid input. Please enter an integer!" << "\n" << endl;
  567.                         sortChoiceWord = to_string(sortChoice);
  568.                     }
  569.                 }
  570.  
  571.             } while ((sortChoiceWord != "1") && (sortChoiceWord != "2") && (sortChoiceWord != "3"));
  572.  
  573.  
  574.         }
  575.         case 3: {
  576.             int searchChoice = 0;
  577.             string searchChoiceWord = "";
  578.             do {
  579.                 cout << "----------------------------------------------------------------------------------" << endl;
  580.                 cout << "Search Menu" << endl;
  581.                 cout << "1) Binary Search" << endl;
  582.                 cout << "2) Linear Search" << endl;
  583.                 cout << "3) Search Improvement" << endl;
  584.                 cout << "4) Back" << endl;
  585.                 cout << "----------------------------------------------------------------------------------" << endl;
  586.                 cout << "Enter choice: ";
  587.                 cin >> searchChoice;
  588.  
  589.  
  590.                 int index = -1;
  591.                 if (searchChoice == 1) {
  592.                     cout << "Enter ID to search: ";
  593.                     string idToSearch[100];
  594.                     for(int x=0;x<100;x++){
  595.                         cin >> idToSearch[x];
  596.                     }
  597.  
  598.                     // Make sure students are sorted before binary search
  599.                     quickSort(students, 0, students.size() - 1, swapCount);
  600.                    
  601.                     //sini
  602.                     auto startbinary = high_resolution_clock::now();
  603.                     for(int x=0;x<100;x++){
  604.                         index = binarySearch(students, 0, students.size() - 1, idToSearch[x]);
  605.                         if (index != -1) {
  606.                         cout << "\nStudent found." << endl;
  607.                         /*cout << "ID: " << students[index].id << '\n';
  608.                         cout << "Name: " << students[index].name << '\n';
  609.                         cout << "Age: " << students[index].age << '\n';
  610.                         cout << "Department: " << students[index].department << "\n" << endl;*/
  611.                         // ... Print other details ...
  612.                         }
  613.                         else {
  614.                             cout << "\nStudent not found." << endl;
  615.                         }
  616.                     }
  617.                     auto stopbinary = high_resolution_clock::now();
  618.                     auto durationbinary = duration_cast<milliseconds>(stopbinary - startbinary);
  619.                    
  620.                     //cout << "Total swaps: " << swapCount << "\n" << endl;
  621.                     cout << "Total runtime: " << (durationbinary.count() * 0.001) << " seconds" << endl;
  622.                     //sini end
  623.                     main();
  624.                 }
  625.                 else if (searchChoice == 2) {
  626.                     cout << "Enter ID to search: ";
  627.                     string idToSearch[100];
  628.                     for(int x=0; x < 100; x++){
  629.                         cin >> idToSearch[x];
  630.                     }
  631.                    
  632.                     auto startlinear = high_resolution_clock::now();
  633.                     for(int x=0;x<100;x++){
  634.                         index = linearSearch(students, idToSearch[x]);
  635.                        
  636.                         if (index != -1) {
  637.                         cout << "\nStudent found." << endl;
  638.                         /*cout << "ID: " << students[index].id << '\n';
  639.                         cout << "Name: " << students[index].name << '\n';
  640.                         cout << "Age: " << students[index].age << '\n';
  641.                         cout << "Department: " << students[index].department << "\n" << endl;*/
  642.                         // ... Print other details ...
  643.                         }
  644.                         else {
  645.                             cout << "\nStudent not found." << endl;
  646.                         }
  647.                     }
  648.                    
  649.                     auto stoplinear = high_resolution_clock::now();
  650.                     auto durationlinear = duration_cast<milliseconds>(stoplinear - startlinear);
  651.                    
  652.                     //cout << "Total swaps: " << swapCount << "\n" << endl;
  653.                     cout << "Total runtime: " << (durationlinear.count() * 0.001) << " seconds" << endl;
  654.                    
  655.                     main();
  656.                 }
  657.                 else if (searchChoice == 3) {
  658.                     cout << "Enter ID to search: ";
  659.                     string idToSearch[100];
  660.                     for (int x = 0; x < 100; x++) {
  661.                         cin >> idToSearch[x];
  662.                     }
  663.            
  664.                     auto start = high_resolution_clock::now();
  665.            
  666.                         // Binary Search
  667.                         quickSort(students, 0, students.size() - 1, swapCount);
  668.                        
  669.                         cout << "\nResults:\n";
  670.                         cout << "-------------------------------------------------------------------------\n";
  671.                         cout << "| ID         | Name\t\t\t| Age\t\t| Department\t|\n";
  672.                         cout << "-------------------------------------------------------------------------\n";
  673.                         for (int x = 0; x < 100; x++) {
  674.                             index = binarySearch(students, 0, students.size() - 1, idToSearch[x]);
  675.                             cout << "| " << idToSearch[x] << " | ";
  676.                             if (index != -1) {
  677.                                 //Student found
  678.                                 if ((students[index].name.length() > 10) && (students[index].name.length() <= 15)){
  679.                                  cout << students[index].name << "       \t| " << students[index].age << " \t\t| " << students[index].department << " \t\t|\n";
  680.                                 } else if (students[index].name.length() > 15) {
  681.                                     cout << students[index].name << " \t| " << students[index].age << " \t\t| " << students[index].department << " \t\t|\n";
  682.                                 } else {
  683.                                  cout << students[index].name << " \t\t\t| " << students[index].age << " \t\t| " << students[index].department << " \t\t|\n";
  684.                                 }
  685.                    
  686.                
  687.  
  688.                             } else {
  689.                                 // Student not found
  690.                                 cout << "Not Found\t\t| Not Found\t| Not Found\t|\n";
  691.                             }
  692.                            
  693.                         }
  694.                         cout << "-------------------------------------------------------------------------" << endl ;
  695.                         cout << "\n";
  696.                     main();
  697.                 }
  698.                 else if (searchChoice == 4) {
  699.                     main();
  700.                 }
  701.                 else {
  702.                     if (!cin.fail()) {
  703.                         cout << "Please input a valid number!" << "\n" << endl;
  704.                         searchChoiceWord = to_string(searchChoice);
  705.                     }
  706.                     else {
  707.                         cin.clear();
  708.                         cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  709.                         cout << "Invalid input. Please enter an integer!" << "\n" << endl;
  710.                         searchChoiceWord = to_string(searchChoice);
  711.                     }
  712.                 }
  713.             } while ((searchChoiceWord != "1") && (searchChoiceWord != "2") && (searchChoiceWord != "3"));
  714.  
  715.  
  716.         }
  717.         case 4: {
  718.             int searchChoice = 0;
  719.             string searchChoiceWord = "";
  720.  
  721.             do {
  722.                 cout << "\n----------------------------------------------------------------------------------" << endl;
  723.                 cout << "Additional Features Menu" << endl;
  724.                 cout << "1) Calculate Age" << endl;
  725.                 cout << "2) Total Student" << endl;
  726.                 cout << "3) Back" << endl;
  727.                 cout << "----------------------------------------------------------------------------------" << endl;
  728.                 cout << "Enter choice: ";
  729.                 cin >> searchChoice;
  730.  
  731.                 switch (searchChoice)
  732.                 {
  733.                 case 1: {
  734.                     // Inside your main function, possibly at the end or wherever you find appropriate
  735.                     double averageAge = calculateAverageAge(students);
  736.                     cout << "\nAverage age of students: " << averageAge << "\n" << endl;
  737.                     main();
  738.                     break;
  739.                 }
  740.                 case 2: {
  741.                     int totalChoice;
  742.                     cout << "\nChoose total you want to show" << endl;
  743.                     cout << "1) Total by Department" << endl;
  744.                     cout << "2) Total by State" << endl;
  745.                     cout << "Enter choice: ";
  746.                     cin >> totalChoice;
  747.                    
  748.                     if (totalChoice == 1) {
  749.                         calculateTotalDept(students);
  750.                     }
  751.                     else if (totalChoice == 2) {
  752.                         calculateTotalState(students);
  753.                     }
  754.                     else {
  755.                         cout << "Invalid input!" << endl;
  756.                     }
  757.                    
  758.                     main();
  759.                     break;
  760.                 }
  761.                 case 3: {
  762.                     main();
  763.                 }
  764.                 default:
  765.                     if (!cin.fail()) {
  766.                         cout << "Please input a valid number!" << "\n" << endl;
  767.                         searchChoiceWord = to_string(searchChoice);
  768.                     }
  769.                     else {
  770.                         cin.clear();
  771.                         cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  772.                         cout << "Invalid input. Please enter an integer!" << "\n" << endl;
  773.                         searchChoiceWord = to_string(searchChoice);
  774.                     }
  775.                 }
  776.             } while ((searchChoiceWord != "1") && (searchChoiceWord != "2") && (searchChoiceWord != "3"));
  777.  
  778.  
  779.         }
  780.         case 5: {
  781.             exit(0);
  782.             break;
  783.         }
  784.         default:
  785.             if (!cin.fail()) {
  786.                 cout << "Please input a valid number!" << "\n" << endl;
  787.                 main();
  788.             }
  789.             else {
  790.                 cin.clear();
  791.                 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  792.                 cout << "Invalid input. Please enter an integer!" << "\n" << endl;
  793.                 main();
  794.             }
  795.  
  796.         }
  797.     } while (choice == 1 || choice == 2);
  798.  
  799. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement