mirror of
https://github.com/didyouexpectthat/cs-300.git
synced 2024-11-21 02:10:07 -08:00
244 lines
5.3 KiB
C++
244 lines
5.3 KiB
C++
/*
|
|
* Vector-based Course Tool
|
|
* Author: Cody Cook
|
|
* Date: 2023/08/10
|
|
* Southern New Hampshire University
|
|
* CS-300-J7303 DSA: Analysis and Design 23EW6
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <vector>
|
|
#include <sstream>
|
|
|
|
using namespace std;
|
|
|
|
// build a Course struct
|
|
struct Course {
|
|
string courseNumber;
|
|
string title;
|
|
vector<string> prerequisites;
|
|
};
|
|
|
|
// global variables
|
|
vector<Course> 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<Course>& 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;
|
|
}
|
|
|