rendered paste body///* ========================================================================== */
///* */
///* exams.cpp */
///* Isidoros Passadis // Comp Sci 11 // Lab F */ */
///* */
///* Description: */
///* a program that checks if a students final exams schedule is valid. */
///* ========================================================================== */
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
// examInfo structure
struct examInfo {
string name;
int month;
int day;
int hour;
int min;
string ampm;
int duration;
};
// Functions Declarations
void readFile(string, examInfo&, examInfo& , examInfo&, string&); // reads and fills out structs
void outputInfo(examInfo); // outputs struct info
void isConflict(examInfo, examInfo, examInfo); // exam conflict?
string month(int); // determines alphabetical (vs numerical) month
int main () {
// Variable Declarations
string fileName, userName;
examInfo exam1, exam2, exam3;
// Output Header
cout << "\n*********************************"
<< "\n student: Isidoros Passadis"
<< "\n lab section F, Wed. 1.30pm"
<< "\n*********************************\n";
// Filename Input
cout << "\nEnter the name of the file: ";
getline(cin, fileName);
// Populate the structures
readFile(fileName, exam1, exam2, exam3, userName);
// Student's name
cout << "\nExams schedule for: " << userName << endl;
// Output the info in the structures
// |- Broke this function down to parse each exam separately as per the
// \- wording in the assignment: "display information about *each* exam".
outputInfo(exam1);
outputInfo(exam2);
outputInfo(exam3);
// Output of exam conflicts
isConflict(exam1, exam2, exam3);
return 0;
}
void readFile(string dataFile, examInfo& exam1, examInfo& exam2, examInfo& exam3, string &stuName) {
// Open the file and make sure it actually exists
ifstream examFile;
examFile.open( dataFile.c_str() ); // Opening the file
while (!examFile) // Loop in case the user messes up the name
{
examFile.clear();
cout << "ERROR: File does not exist.\n"
<< "Please re-enter the name of the file: ";
getline(cin, dataFile);
examFile.open(dataFile.c_str());
}
// Go through the file and populate the exams
getline(examFile, stuName); // Get the student's name
// Get the info for exam1 (had we been able to use arrays (next chapter,
// grrrr) i could have made an array of examFile structs and used a for
// loop instead of this hard-coded method.
examFile >> exam1.name >> exam1.month >> exam1.day >> exam1.hour
>> exam1.min >> exam1.ampm >> exam1.duration;
examFile >> exam2.name >> exam2.month >> exam2.day >> exam2.hour
>> exam2.min >> exam2.ampm >> exam2.duration;
examFile >> exam3.name >> exam3.month >> exam3.day >> exam3.hour
>> exam3.min >> exam3.ampm >> exam3.duration;
examFile.close();
}
void outputInfo(examInfo exam) {
cout << left << setw(9) << exam.name; // Exam name
cout << month(exam.month) << " " << exam.day << "," << endl; // Exam date
cout << left << setw(9) << "" << "Exam starts at: " << exam.hour << ":"; // time (hours)
if (exam.min < 10)
cout << "0";
cout << exam.min << " " << exam.ampm // time (minutes and am/pm)
<< " and lasts " << exam.duration << " minutes." << endl;
}
string month(int wMonth) {
string rMonth;
// Test to see which month it is
switch (wMonth) {
case 1:
rMonth = "January";
break;
case 2:
rMonth = "February";
break;
case 3:
rMonth = "March";
break;
case 4:
rMonth = "April";
break;
case 5:
rMonth = "May";
break;
case 6:
rMonth = "June";
break;
case 7:
rMonth = "July";
break;
case 8:
rMonth = "August";
break;
case 9:
rMonth = "September";
break;
case 10:
rMonth = "October";
break;
case 11:
rMonth = "November";
break;
case 12:
rMonth = "December";
break;
default: rMonth = "error";
}
return rMonth;
}
void isConflict(examInfo exam1, examInfo exam2, examInfo exam3) {
int e1minutes = 0, e2minutes = 0, e3minutes = 0; // total minute variables
if (exam1.month == exam2.month || exam1.month == exam3.month || exam2.month == exam3.month) {
// month is the same
if (exam1.day == exam2.day || exam1.day == exam3.day || exam2.day == exam3.day) {
// day is the same
// i will make comparisons on times based on total minutes
if (exam1.ampm == "pm") // anything after 12 gets bumped up
e1minutes = (12*60);
e1minutes += (exam1.hour*60) + exam1.min;
if (exam2.ampm == "pm")
e2minutes = (12*60);
e2minutes += (exam2.hour*60) + exam2.min;
if (exam3.ampm == "pm")
e3minutes = (12*60);
e3minutes += (exam3.hour*60) + exam3.min;
// -- 1st group of possible overlaps
// Conflict between 1 and 2
if ( (e1minutes + exam1.duration) > (e2minutes - 15) &&
(e1minutes + exam1.duration) < (e2minutes + exam2.duration) )
cout << "\nThere is conflict between " << exam1.name << " exam and " << exam2.name
<< " exam.";
// Conflict between 2 and 1
if ( (e2minutes + exam2.duration) > (e1minutes - 15) &&
(e2minutes + exam2.duration) < (e1minutes + exam1.duration) )
cout << "\nThere is conflict between " << exam2.name << " exam and " << exam1.name
<< " exam.";
// --- 2nd group of possible overlaps
// Conflict between 2 and 3
if ( (e2minutes + exam2.duration) > (e3minutes - 15) &&
(e2minutes + exam2.duration) < (e3minutes + exam3.duration) )
cout << "\nThere is conflict between " << exam2.name << " exam and " << exam3.name
<< " exam.";
// Conlflict between 3 and 2
if ( (e3minutes + exam3.duration) > (e2minutes - 15) &&
(e3minutes + exam3.duration) < (e2minutes + exam2.duration) )
cout << "\nThere is conflict between " << exam3.name << " exam and " << exam2.name
<< " exam.";
// --- 3rd group of possible overlaps
// Conflict between 1 and 3
if ( (e1minutes + exam1.duration) > (e3minutes - 15) &&
(e1minutes + exam1.duration) < (e3minutes + exam3.duration) )
cout << "\nThere is conflict between " << exam1.name << " exam and " << exam3.name
<< " exam.";
// Conflict between 3 and 1
if ( (e3minutes + exam3.duration) > (e1minutes - 15) &&
(e3minutes + exam3.duration) < (e1minutes + exam1.duration) )
cout << "\nThere is conflict between " << exam3.name << " exam and " << exam1.name
<< " exam.";
}
}
else
cout << "\nThere are no exam conflicts.\n";
}