#include #include #include #include using namespace std; const int NUM_STUDENTS = 25; const int NUM_ANSWERS = 30; const char EOLN = '\n'; const string LINE = "========================="; const int OPTION_MIN = 0; const int OPTION_MAX = 3; typedef char AnsList [NUM_ANSWERS]; struct StudentInfo { string name; AnsList ans_list; int grade; bool invalid; }; typedef StudentInfo StudentInfoList [NUM_STUDENTS]; int read_data(AnsList, StudentInfoList); void print_data(const StudentInfoList); void printf_keys(const AnsList); void sort_data_by_grade(StudentInfoList); void sort_data_by_name(StudentInfoList); int manu(); int main() { StudentInfoList stud_info_list; AnsList keys; int read_file_status; int option; read_file_status = read_data(keys, stud_info_list); do{ option = manu(); switch (option) { case 1: sort_data_by_grade(stud_info_list); print_data(stud_info_list); break; case 2: sort_data_by_name(stud_info_list); print_data(stud_info_list); break; case 3: printf_keys(keys); break; } } while (option != 0); cout << endl << "Exit the program ..." << endl << endl; return read_file_status; } ////////////////////////////////////////////////////////////////////////// int read_data(AnsList keys, StudentInfoList stud_info_list) { const string fname = "xfile.txt"; ifstream inFile; int ii, jj; inFile.open(fname); if (!inFile) { cout << "Error: file open fails!" << endl; return (EXIT_FAILURE); } else cout << "Loading data ..."; for (ii=0; ii> keys[ii]; inFile.ignore(100, EOLN); for (jj=0; jj> stud_info_list[jj].ans_list[ii]; if ((stud_info_list[jj].ans_list[ii] != 'T') && (stud_info_list[jj].ans_list[ii] != 'F')) stud_info_list[jj].invalid = true; else if (stud_info_list[jj].ans_list[ii] == keys[ii]) stud_info_list[jj].grade++; } inFile.ignore(100, EOLN); } cout << "Done!" << endl << endl; inFile.close(); return 0; } ////////////////////////////////////////////////////////////////////////// void print_data(const StudentInfoList stud_info_list) { int ii, jj; cout << left; cout << setw(20) << "NAME"; cout << setw(35) << "ANSWERS"; cout << setw(10) << "GRADES"; cout << setw(20) << "INVALID ANSWER?" << endl; cout << LINE << LINE << LINE << endl; for (jj=0; jj stud_info_list[i_compare].name) i_lowest = i_compare; } // switch the entry containing the lowest name in the unsorted // list with the first entry of the unsorted part if (i_lowest != i_current) { tmp_student = stud_info_list[i_current]; stud_info_list[i_current] = stud_info_list[i_lowest]; stud_info_list[i_lowest] = tmp_student; } } } ////////////////////////////////////////////////////////////////////////// int manu() { int option; cout << "====================" << endl; cout << "Menu" << endl; cout << "====================" << endl; cout << "[1] Sort by grade" << endl; cout << "[2] Sort by name" << endl; cout << "[3] Print out keys" << endl; cout << "[0] Quit" << endl; cout << "--------------------" << endl; cout << "Your option is -> "; cin >> option; while(option < OPTION_MIN || option > OPTION_MAX) { cout << "Invalid option! Please re-enter your option -> "; cin.clear(); cin.ignore(100, '\n'); cin >> option; } return option; } ////////////////////////////////////////////////////////////////////////// void printf_keys(const AnsList keys) { cout << "KEYS: " << endl; for (int ii = 0; ii < NUM_ANSWERS; ii++) cout << keys[ii]; cout << endl; }