Files
BasicsOfComputerSoftwareEng…/大作业/Record.cpp

253 lines
11 KiB
C++

#include "Record.hpp"
#include "Tools.hpp"
#include <iomanip>
#include <iostream>
unsigned BaseRecord::nextRecordID = 1;
BaseRecord::BaseRecord(const time_t _date, const std::string _courseName,
const int _studentNumber, const std::string _studentName)
: recordID(nextRecordID++), date(_date), courseName(_courseName),
student(_studentNumber, _studentName){};
BaseRecord::BaseRecord(const unsigned _recordID, const time_t _date,
const std::string _courseName, const int _studentNumber,
const std::string _studentName)
: recordID(_recordID), date(_date), courseName(_courseName),
student(_studentNumber, _studentName){};
BaseRecord::~BaseRecord() {
}
const unsigned BaseRecord::getRecordID() const {
return this->recordID;
}
const Date &BaseRecord::getDate() const {
return this->date;
}
const std::string BaseRecord::getCourseName() const {
return this->courseName;
}
const int BaseRecord::getStudentNumber() const {
return this->student.getNumber();
}
const std::string BaseRecord::getStudentName() const {
return this->student.getName();
}
void BaseRecord::promptForNewDate(bool showOriginal) {
time_t originTime = this->date.getTime();
tm *curDate = localtime(&originTime);
int tempInput;
if (showOriginal) {
char buffer[20];
strftime(buffer, 20, "%F", curDate);
std::cout << setoutputcolor(ConsoleColorTool::green)
<< "Current date: " << buffer
<< ". Enter 0 to retain original value." << resetOutputColor
<< std::endl;
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Year: " << resetOutputColor << std::flush;
std::cin >> tempInput;
curDate->tm_year =
(tempInput == 0 ? curDate->tm_year : tempInput - 1900);
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Month: " << resetOutputColor << std::flush;
std::cin >> tempInput;
curDate->tm_mon = (tempInput == 0 ? curDate->tm_mon : tempInput - 1);
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Day: " << resetOutputColor << std::flush;
std::cin >> tempInput;
curDate->tm_mday = (tempInput == 0 ? curDate->tm_mday : tempInput);
}
else {
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Year: " << resetOutputColor << std::flush;
std::cin >> tempInput;
curDate->tm_year = tempInput - 1900;
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Month: " << resetOutputColor << std::flush;
std::cin >> tempInput;
curDate->tm_mon = tempInput - 1;
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Day: " << resetOutputColor << std::flush;
std::cin >> tempInput;
curDate->tm_mday = tempInput;
}
this->date = mktime(curDate);
}
void BaseRecord::promptForNewCourseName(bool showOriginal) {
if (showOriginal) {
std::cout << setoutputcolor(ConsoleColorTool::green)
<< "Original course name: " << resetOutputColor
<< this->courseName << "\n"
<< setoutputcolor(ConsoleColorTool::green)
<< "Enter 0 to retain original value." << std::endl;
}
std::cout << "Course name: " << std::flush;
std::cin >> this->courseName;
}
void BaseRecord::promptForNewStudentInfo(bool showOriginal) {
int tempStuID;
std::string tempStuName;
if (showOriginal) {
std::cout << setoutputcolor(ConsoleColorTool::green)
<< "Current student info: \n"
<< setoutputcolor(ConsoleColorTool::blue)
<< "Student ID: " << resetOutputColor
<< this->student.getNumber() << "\n"
<< setoutputcolor(ConsoleColorTool::blue)
<< "Student Name: " << resetOutputColor
<< this->student.getName() << "\n"
<< setoutputcolor(ConsoleColorTool::green)
<< "Enter 0 to retain original value." << std::endl;
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Student ID: " << resetOutputColor << std::flush;
std::cin >> tempStuID;
this->student.setNumber(tempStuID == 0 ? this->student.getNumber()
: tempStuID);
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Student Name: " << resetOutputColor << std::flush;
std::cin >> tempStuName;
this->student.setName(tempStuName == "0" ? this->student.getName()
: tempStuName);
}
else {
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Student ID: " << resetOutputColor << std::flush;
std::cin >> tempStuID;
this->student.setNumber(tempStuID);
std::cout << setoutputcolor(ConsoleColorTool::blue)
<< "Student Name: " << resetOutputColor << std::flush;
std::cin >> tempStuName;
this->student.setName(tempStuName);
}
}
void BaseRecord::display() const {
std::cout << "" << std::setfill('0')
<< std::setw(recordDisplayRowSize.recordID - 2) << this->recordID;
std::cout << "";
std::cout << std::setfill(' ') << std::setw(recordDisplayRowSize.date)
<< cutToLength(this->date.toString(), recordDisplayRowSize.date);
std::cout << "";
std::cout << std::setfill(' ') << std::setw(recordDisplayRowSize.courseName)
<< cutToLength(this->courseName, recordDisplayRowSize.courseName);
std::cout << "";
std::cout << std::setfill(' ') << std::setw(recordDisplayRowSize.studentID)
<< this->student.getNumber();
std::cout << "";
std::cout << std::setfill(' ')
<< std::setw(recordDisplayRowSize.studentName)
<< cutToLength(this->student.getName(),
recordDisplayRowSize.studentName);
std::cout << "";
std::cout << std::setfill(' ') << std::setw(recordDisplayRowSize.type)
<< this->getRecordType() << "";
std::cout << std::endl;
}
void BaseRecord::displayComplete() const {
std::cout << setoutputcolor(true) << setbgcolor(ConsoleColorTool::cyan)
<< "Record ID " << this->recordID << resetOutputColor << "\n";
std::cout << setoutputcolor(ConsoleColorTool::green)
<< "Date: " << resetOutputColor << this->date.toString() << "\n";
std::cout << setoutputcolor(ConsoleColorTool::green)
<< "Course name: " << resetOutputColor << this->courseName
<< "\n";
std::cout << setoutputcolor(ConsoleColorTool::green)
<< "Student: " << resetOutputColor << "\n";
std::cout << "├─" << setoutputcolor(ConsoleColorTool::blue)
<< "ID: " << resetOutputColor << this->student.getNumber()
<< "\n";
std::cout << "└─" << setoutputcolor(ConsoleColorTool::blue)
<< "Name: " << resetOutputColor << this->student.getName()
<< "\n";
std::cout << setoutputcolor(ConsoleColorTool::green)
<< "Type: " << resetOutputColor << this->getRecordType()
<< std::endl;
}
LateRecord::LateRecord(const time_t _date, const std::string _courseName,
const int _studentNumber, const std::string _studentName)
: BaseRecord(_date, _courseName, _studentNumber, _studentName){};
LateRecord::LateRecord(const unsigned _recordID, const time_t _date,
const std::string _courseName, const int _studentNumber,
const std::string _studentName)
: BaseRecord(_recordID, _date, _courseName, _studentNumber, _studentName){};
std::string LateRecord::getRecordType() const {
return "Late";
}
LateRecord::operator SaveRecord() const {
return SaveRecord{.recordID = this->recordID,
.date = this->date.getTime(),
.courseNameLength = this->courseName.length(),
.studentNumber = this->student.getNumber(),
.studentNameLength = this->student.getName().length(),
.recordType = StuRecord::Late};
}
LateRecord::~LateRecord(){};
AbsentRecord::AbsentRecord(const time_t _date, const std::string _courseName,
const int _studentNumber,
const std::string _studentName)
: BaseRecord(_date, _courseName, _studentNumber, _studentName){};
AbsentRecord::AbsentRecord(const unsigned _recordID, const time_t _date,
const std::string _courseName,
const int _studentNumber,
const std::string _studentName)
: BaseRecord(_recordID, _date, _courseName, _studentNumber, _studentName){};
std::string AbsentRecord::getRecordType() const {
return "Absent";
}
AbsentRecord::operator SaveRecord() const {
return SaveRecord{.recordID = this->recordID,
.date = this->date.getTime(),
.courseNameLength = this->courseName.length(),
.studentNumber = this->student.getNumber(),
.studentNameLength = this->student.getName().length(),
.recordType = StuRecord::Absent};
}
AbsentRecord::~AbsentRecord(){};
PersonalLeaveRecord::PersonalLeaveRecord(const time_t _date,
const std::string _courseName,
const int _studentNumber,
const std::string _studentName)
: BaseRecord(_date, _courseName, _studentNumber, _studentName){};
PersonalLeaveRecord::PersonalLeaveRecord(const unsigned _recordID,
const time_t _date,
const std::string _courseName,
const int _studentNumber,
const std::string _studentName)
: BaseRecord(_recordID, _date, _courseName, _studentNumber, _studentName){};
std::string PersonalLeaveRecord::getRecordType() const {
return "Personal";
}
PersonalLeaveRecord::operator SaveRecord() const {
return SaveRecord{.recordID = this->recordID,
.date = this->date.getTime(),
.courseNameLength = this->courseName.length(),
.studentNumber = this->student.getNumber(),
.studentNameLength = this->student.getName().length(),
.recordType = StuRecord::PersonalLeave};
}
PersonalLeaveRecord::~PersonalLeaveRecord(){};