/* * Vector-based Course Tool * Author: Cody Cook * Date: 2023/08/10 * Southern New Hampshire University * CS-300-J7303 DSA: Analysis and Design 23EW6 */ #include #include #include #include using namespace std; // build a Course struct struct Course { string courseNumber; string title; vector prerequisites; }; // global variables vector courses; // functions // function to display a course void displayCourse(const Course& c) { // if courseNumber is empty, let's just skip it if (c.courseNumber.empty()) { return; } // display the course number and course title cout << "Course Number: " << c.courseNumber << endl; cout << "Course Title: " << c.title << endl; // display prereqs cout << "Course Prerequisites: "; // if there are no prerequisites, print "None" if (c.prerequisites.size() == 0) { cout << "None"; } else { for (const auto& prereq : c.prerequisites) { // if this is the last prerequisite, don't print the comma if (prereq != c.prerequisites.back()) { cout << prereq << ", "; } else { cout << prereq; } } } cout << endl << endl; } // Function to get course info from the user Course getCourse() { string getCourseNumber; // Default "empty" course to return in case of an error or if not found Course emptyCourse; if (courses.size() == 0) { cout << "\nCourses are not currently loaded. Please load courses.\n\n"; return emptyCourse; } else { cout << "Enter course number: "; cin >> getCourseNumber; cout << endl; for (unsigned int i = 0; i < courses.size(); i++) { if (courses[i].courseNumber == getCourseNumber) { return courses[i]; } } // if we didn't return already, then // the course wasn't found cout << "Course not found."; cout << "\n\n"; } return emptyCourse; } // Selection sort function for the vector sorting void selectionSortCourses(vector& courses) { // Get the total number of courses int n = courses.size(); // Traverse through all courses in the vector for (int i = 0; i < n - 1; i++) { // Assume the current index holds the smallest courseNumber int min_idx = i; // Traverse the vector from the element next to i up to the end for (int j = i + 1; j < n; j++) { // If a smaller courseNumber is found, update min_idx if (courses[j].courseNumber < courses[min_idx].courseNumber) { min_idx = j; } } // Swap the found minimum course with the course at current index 'i' swap(courses[i], courses[min_idx]); } } // Function to load courses from a CSV file void loadCourses() { string filePath; string line; // empty courses for a fresh import courses.clear(); // prompt user for the path cout << "\nEnter the Courses csv file (Default: courses.csv): "; // clear the newline left in the buffer from previous inputs // we will get the whole link for an absolute path; relative works, too. cin.ignore(); getline(cin, filePath); cout << endl; if (filePath.front() == '\"' && filePath.back() == '\"') { filePath = filePath.substr(1, filePath.length() - 2); } // open the file for reading ifstream file(filePath); // if we didn't open the file if (!file.is_open()) { cout << "Error opening file: " << filePath << endl << endl; // error return; } // while we go through each line while (getline(file, line)) { stringstream ss(line); Course c; getline(ss, c.courseNumber, ','); getline(ss, c.title, ','); string prereq; while (getline(ss, prereq, ',')) { c.prerequisites.push_back(prereq); } courses.push_back(c); } // sort the courses selectionSortCourses(courses); } void menu() { int menuOption = 0; while (menuOption != 9) { // display the menu options cout << "1. Load Data Structure\n"; cout << "2. Print Course List\n"; cout << "3. Print Course\n"; cout << "9. Exit\n\n"; // ask the user to select an option cout << "What would you like to do? "; cin >> menuOption; // check if cin failed if (cin.fail()) { // clear the error state cin.clear(); // remove the erroneous input from the stream cin.ignore(INT_MAX, '\n'); cout << "Please enter a valid number." << endl << endl; // skip the rest of the loop iteration continue; } // process the user's input switch (menuOption) { case 1: // load data structure loadCourses(); break; case 2: // print course list if (courses.size() == 0) { cout << "\nCourses are not currently loaded. Please load courses.\n\n"; } else { for (unsigned int i = 0; i < courses.size(); i++) { // show each course displayCourse(courses[i]); } } break; case 3: { // get the course Course c = getCourse(); // show the course details displayCourse(c); } break; case 9: // we're just going to edit next loop break; default: // no valid options cout << "Invalid option. Please try again." << endl; break; } } } int main() { // greet the user cout << "Welcome to the course planner.\n\n"; // display the menu menu(); // salutate the user cout << "Thank you for using the course planner!\n\n"; // exit the program return 0; }