Guest User

Untitled

a guest
Apr 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.35 KB | None | 0 0
  1. /* Leslie Jo
  2. Assignment 3: Student Database that can Import/Export .txt files and is both searchable & sortable.
  3. 4/12/2018
  4. */
  5.  
  6. #include<iostream>
  7. #include<string>
  8. #include<vector>
  9. #include<iomanip>
  10. #include<cctype>
  11. #include<fstream>
  12. #include<algorithm>
  13. #include<cstdlib>
  14.  
  15. using namespace std;
  16.  
  17. //This function displays the content of the vector.
  18. void displayVector(vector<int>, const vector<string>, const vector<string>);
  19.  
  20. //Validates integer to determine matches for sorting purposes.
  21. int validateInteger(int);
  22.  
  23. //Converts string to all uppercases.
  24. string convertUppercase(string sTemp);
  25.  
  26. void tripleSort(vector<string>&vSClass1, vector<string>&vSClass2, vector<string>&vSClass3);
  27.  
  28. int binarySearch(vector <string> &, string, int, int);
  29.  
  30. int main()
  31. {
  32. int iStudentNumber = 0, i_temp;
  33. string sUserInput, sTemp, sFName, sMName, sLName, sFullName, sID, sClass;
  34. ifstream inputFile;
  35. ofstream outputFile;
  36. vector<string> vName, vFName, vMName, vLName, vID, vClass, vSInput1, vSInput2, vSInput3;
  37.  
  38. //IMPORTING is also READING the file. EXPORTING is also writing the file.
  39. const char
  40. IMPORTING = 'A',
  41. ADDING = 'B',
  42. DISPLAYING = 'C',
  43. SORTING = 'D',
  44. EXPORTING = 'E',
  45. SEARCHING = 'F',
  46. ENDING = 'G';
  47.  
  48. do
  49. {
  50. // Display A-G Menu Options
  51. cout << "\tStudent Enrollment Application" << endl << endl;
  52. cout << "A. Importing the Student List from an external text file" << endl;
  53. cout << "B. Adding Student's Information into the Student List" << endl;
  54. cout << "C. Displaying the Content of the Student List from the Database" << endl;
  55. cout << "D. Sorting the Content of the Student List from a Database" << endl;
  56. cout << "E. Exporting the Student List to an External Text File" << endl;
  57. cout << "F. Searching for a Student's Information from the Student List" << endl;
  58. cout << "G. Ending the Program" << endl << endl;
  59. cout << "What would you like to perform?: ";
  60. getline(cin, sTemp);
  61.  
  62. switch (toupper(sTemp[0]))
  63. {
  64. case IMPORTING:
  65. cout << "Please enter the password: ";
  66. getline(cin, sTemp);
  67. inputFile.open(sTemp.c_str());
  68.  
  69. while (inputFile.fail())
  70. {
  71. inputFile.clear();
  72. cout << "Open file error!Please re-enter: ";
  73. getline(cin, sTemp);
  74. inputFile.open(sTemp.c_str());
  75. }
  76.  
  77. while (inputFile >> sFName >> sMName >> sLName >> sID >> sClass)
  78. { //Performed the .txt reading. Don't open file yet. Remove the sentinel.
  79.  
  80. if (sMName == "|")
  81. sFullName = sFName + " " + sLName;
  82. else
  83. sFullName = sFName + " " + sMName + " " + sLName;
  84.  
  85. //Erases the | in the middle name.
  86. cout << left << setw(30) << sFullName << setw(10) << sID << setw(10) << sClass << endl;
  87.  
  88.  
  89. vName.push_back(convertUppercase(sFullName));
  90. vID.push_back(convertUppercase(sID));
  91. vClass.push_back(convertUppercase(sClass));
  92.  
  93.  
  94. }
  95. cout << "Reading file successfully!";
  96. inputFile.close();
  97.  
  98. break;
  99. case ADDING:
  100.  
  101.  
  102. cout << "\nTheStudent List starts with the size of: " << vName.size();
  103. cout << "\n\nHow many students would you like to add: ";
  104. cin >> iStudentNumber;
  105. iStudentNumber = validateInteger(iStudentNumber);
  106. cin.ignore();
  107.  
  108.  
  109. for (int i = 1; i <= iStudentNumber; i++)
  110. {
  111.  
  112. cout << "\nStudent " << i << ":";
  113. cout << "\n\nEnter the Student's Full Name: \t";
  114. getline(cin, sFullName);
  115. sFullName = convertUppercase(sFullName);
  116. vName.push_back(sFullName);
  117.  
  118. cout << "\nEnter the Student's ID Number: \t";
  119.  
  120. //Always true.
  121. while (getline(cin, sID) && sID.size() != 7)
  122.  
  123. {
  124. cout << "Please enter a valid value" << endl;
  125. }
  126. vID.push_back(sID);
  127.  
  128.  
  129. for (int i = 0; i < sID.size(); ++i) {
  130. sID[i];
  131. }
  132.  
  133. cout << "\nEnter the Student's Class: \t";
  134. getline(cin, sClass);
  135. sClass = convertUppercase(sClass);
  136. vClass.push_back(sClass);
  137.  
  138. }
  139.  
  140.  
  141. break;
  142. case DISPLAYING:
  143. //Use for loop. Know the size of each vector using sizeNumber function.
  144. cout << "The list has the size of: " << vName.size() << endl;
  145. for (int i = 0; i < vName.size(); i++)
  146. cout << left << setw(40) << vName[i] << setw(10) << vID[i] << setw(10) << vClass[i] << endl;
  147.  
  148. break;
  149. case SORTING:
  150. //Study dualsort function. Ch 8 Problem 8-6
  151. cout << "1 for sorting by name, 2 for sorting by ID: ";
  152. getline(cin, sTemp);
  153. if (sTemp == "1")
  154. tripleSort(vName, vID, vClass);
  155. else if (sTemp == "2")
  156. tripleSort(vID, vName, vClass);
  157.  
  158.  
  159. break;
  160. case EXPORTING:
  161. //Write vectors to external file.
  162. cout << "Enter the name for the file to be opened:";
  163. getline(cin, sTemp);
  164. outputFile.open(sTemp.c_str());
  165.  
  166. for (int i = 0; i < vName.size(); i++)
  167. cout << left << setw(40) << vName[i] << setw(10) << vID[i] << setw(10) << vClass[i] << endl;
  168. cout << "Writing to the file " << sTemp << " was successful.";
  169. outputFile.close();
  170.  
  171. break;
  172. case SEARCHING:
  173. //Needs SORTING completed first.
  174.  
  175. cout << "\n1 for searching by name, 2 for searching by ID: ";
  176. getline(cin, sTemp);
  177. if (sTemp == "1")
  178. {
  179. cout << "\nPlease enter name: ";
  180. getline(cin, sTemp);
  181. i_temp = binarySearch(vName, sTemp, 0, vName.size());
  182. if (i_temp!= -1)
  183. {
  184. cout << "\nMatching Data found\n";
  185. cout << left << setw(40) << vName[i_temp] << setw(10) << vID[i_temp] << setw(10) << vClass[i_temp] << endl;
  186. }
  187. else
  188. cout << "\nMatching Data not found\n";
  189. }
  190. else if (sTemp == "2")
  191. {
  192. cout << "\nPlease enter ID: ";
  193. getline(cin, sTemp);
  194. i_temp = binarySearch(vID, sTemp, 0, vID.size());
  195. if (i_temp != -1)
  196. {
  197. cout << "\nMatching Data found";
  198. cout << left << setw(40) << vName[i_temp] << setw(10) << vID[i_temp] << setw(10) << vClass[i_temp] << endl;
  199. }
  200. else
  201. cout << "\nMatching Data not found";
  202. }
  203. break;
  204.  
  205. default:
  206.  
  207.  
  208. cout << " \n Invalid Input!";
  209.  
  210.  
  211. }
  212. } while (toupper(sTemp[0]) != ENDING);
  213.  
  214.  
  215. return 0;
  216. }
  217.  
  218. string convertUppercase(string sInput)
  219. {
  220. for (int i = 0; i < sInput.length(); i++)
  221. sInput[i] = toupper(sInput[i]);
  222. return sInput;
  223. }
  224.  
  225.  
  226.  
  227. int validateInteger(int iInput)
  228. {
  229. while (cin.fail())
  230. {
  231. cin.clear();
  232. cin.ignore(INT_MAX, '\n');
  233. cout << "Invalid input. Please try again: ";
  234. cin >> iInput;
  235. }
  236. return iInput;
  237. }
  238. void displayVector(vector<string> vInput)
  239. {
  240. for (unsigned int i = 0; i < vInput.size(); i++)
  241. cout << vInput[i] << "\t";
  242. }
  243.  
  244.  
  245. void tripleSort(vector<string>&vSClass1, vector<string>&vSClass2, vector<string>& vSClass3)
  246. {
  247. int iTemp;
  248. string sTemp1, sTemp2, sTemp3;
  249.  
  250. for (int i = 0; i < (vSClass1.size() - 1); i++)
  251. {
  252. iTemp = i;
  253. sTemp1 = vSClass1[i];
  254. sTemp2 = vSClass2[i];
  255. sTemp3 = vSClass3[i];
  256.  
  257. for (int j = i + 1; j < vSClass1.size(); j++)
  258. {
  259. if (vSClass1[j] < sTemp1)
  260. {
  261. sTemp1 = vSClass1[j];
  262. sTemp2 = vSClass2[j];
  263. sTemp3 = vSClass3[j];
  264.  
  265. iTemp = j;
  266. }
  267.  
  268. }
  269. vSClass1[iTemp] = vSClass1[i];
  270. vSClass2[iTemp] = vSClass2[i];
  271. vSClass3[iTemp] = vSClass3[i];
  272.  
  273. vSClass1[i] = sTemp1;
  274. vSClass2[i] = sTemp2;
  275. vSClass3[i] = sTemp3;
  276. }
  277. }
  278.  
  279. // Recursive Binary Search Algorithm:
  280. int binarySearch(vector <string> &vName, string sSearch, int min, int max)
  281. {
  282. if (max < min)
  283. return -1;
  284. else
  285. {
  286. // Calculate MidPoint to cut the Array in half
  287. int mid = (min + max) / 2;
  288.  
  289. // Three way comparison
  290. if (vName[mid] > sSearch)
  291. // Search Value is in the Lower Subset
  292. return binarySearch(vName, sSearch, min, mid - 1);
  293. else if (vName[mid] < sSearch)
  294. // Search Value is in the Upper Subset
  295. return binarySearch(vName, sSearch, mid + 1, max);
  296. else
  297. // Search Value has been found
  298. return mid;
  299. }
  300. }
Add Comment
Please, Sign In to add comment